vibe64 0.1.52 → 0.1.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/upgrade-state.js +975 -974
- package/dist/assets/{GithubBrowserTabs-D7DveB8M.js → GithubBrowserTabs-DG2nCSNW.js} +1 -1
- package/dist/assets/{Vibe64AuthSettingsButton-DDArM5uw.js → Vibe64AuthSettingsButton-9OLqOZao.js} +1 -1
- package/dist/assets/{Vibe64DashboardShell-Ab65VYSS.js → Vibe64DashboardShell-hWNziCur.js} +1 -1
- package/dist/assets/{Vibe64DatabaseWorkspace-DHLt5bST.js → Vibe64DatabaseWorkspace-TqXOZJpI.js} +1 -1
- package/dist/assets/{Vibe64FileArea-DCqpclYH.js → Vibe64FileArea-BljhpApn.js} +1 -1
- package/dist/assets/{Vibe64OutputControls-BPDF1XfG.js → Vibe64OutputControls-Dk_DWuFb.js} +1 -1
- package/dist/assets/{Vibe64RepositoryWorkspace-C107tX19.js → Vibe64RepositoryWorkspace-CDnsAlIz.js} +1 -1
- package/dist/assets/{Vibe64SessionFiles-BKJ1Qem_.js → Vibe64SessionFiles-DjeEvtpc.js} +1 -1
- package/dist/assets/{Vibe64UiStoryboardView-CJajdYSt.js → Vibe64UiStoryboardView-idZz86bx.js} +1 -1
- package/dist/assets/{_sessionId_-BaNhTTVN.js → _sessionId_-DLLJsju9.js} +1 -1
- package/dist/assets/{_slug_-D7mzZsk3.css → _slug_-BRPxP_Yn.css} +1 -1
- package/dist/assets/{_slug_-nHO3Bg-f.js → _slug_-JgF_FQ6F.js} +7 -7
- package/dist/assets/{app-DbGzTUVN.js → app-Cuw9E-ru.js} +1 -1
- package/dist/assets/{changes-D7NjgKWf.js → changes-CoR0-8EL.js} +1 -1
- package/dist/assets/{conversation-DV8qCsqw.js → conversation-B1UoWMaA.js} +1 -1
- package/dist/assets/{dashboard-DL95BPsz.js → dashboard-DnuIxR1s.js} +1 -1
- package/dist/assets/{english-definitions-ChTTs3cC.js → english-definitions-By4b_Yl2.js} +1 -1
- package/dist/assets/{env-BdJvhqF-.js → env-KUPen-sS.js} +1 -1
- package/dist/assets/{history-DmGNxMVh.js → history-S_cJLehJ.js} +1 -1
- package/dist/assets/{index-BXZp5ztx.js → index-CNkd6O5t.js} +3 -3
- package/dist/assets/{integrations-DAYe7RkJ.js → integrations-Dmbbbs_A.js} +1 -1
- package/dist/assets/{issues-D_zOo2IW.js → issues-EeBajY3I.js} +1 -1
- package/dist/assets/{learning-ilyEoffw.js → learning-DDRM-FoP.js} +1 -1
- package/dist/assets/{project-files-CJWdFXh4.js → project-files-CQ1BLaaP.js} +1 -1
- package/dist/assets/{publish-D728amkk.js → publish-bvwc-KoQ.js} +1 -1
- package/dist/assets/{pull-requests-BsbM-5MA.js → pull-requests-Ce1ECyuL.js} +1 -1
- package/dist/assets/{repository-C8NwO4bj.js → repository-CK3osHmp.js} +1 -1
- package/dist/assets/{settings-DTLY7ZT5.js → settings-PQGw4vfn.js} +1 -1
- package/dist/assets/{useArchivedVibe64Sessions-Cc9GdKlD.js → useArchivedVibe64Sessions-BAQjW01a.js} +1 -1
- package/dist/assets/{useAssistantAttachments-DJKqt1hL.js → useAssistantAttachments-DJWb1KdF.js} +1 -1
- package/dist/assets/{useVibe64ConversationLog-Co0DhC3R.js → useVibe64ConversationLog-CjUZuvV7.js} +1 -1
- package/dist/assets/{useVibe64SessionData-D7fBm9xf.js → useVibe64SessionData-CbY_B5mC.js} +1 -1
- package/dist/assets/{vibe64SessionFocus-8fHAeoyU.js → vibe64SessionFocus-Bd3JuuZe.js} +1 -1
- package/dist/index.html +4 -4
- package/docs/colleague-usage/conversation-context.md +3 -1
- package/docs/colleague-usage/temporary-chats.md +26 -1
- package/docs/colleague-usage/workspace-preparation.md +17 -0
- package/node_modules/@jskit-ai/assistant-core/locales/en.json +1 -0
- package/node_modules/@jskit-ai/assistant-core/package.json +1 -1
- package/node_modules/@jskit-ai/assistant-runtime/package.json +1 -1
- package/node_modules/@jskit-ai/assistant-voice/package.json +1 -1
- package/node_modules/@jskit-ai/connector-google-calendar/package.json +1 -1
- package/node_modules/@jskit-ai/connectors-catalog/package.json +1 -1
- package/node_modules/@jskit-ai/connectors-core/locales/en.json +1 -0
- package/node_modules/@jskit-ai/connectors-core/package.json +1 -1
- package/node_modules/@local/vibe64-genesis/bin/vibe64-genesis-host-context +43 -43
- package/node_modules/@local/vibe64-genesis/src/server/index.js +189 -182
- package/node_modules/@local/vibe64-genesis/src/server/promptContext.js +68 -61
- package/node_modules/@local/vibe64-terminals/src/server/sessionWorkOperationCommand.js +532 -532
- package/package.json +7 -7
- package/server.bundle.mjs +28835 -28791
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{dr as vModelText,mr as withModifiers,pr as withKeys,t as VChip,x as VIcon}from"./VChip-BRhZ1px1.js";import{$n as normalizeProps,D as createVNode,E as createTextVNode,En as toValue,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{t as useEndpointResource}from"./useEndpointResource-BaT7yEQ5.js";import{l as normalizeObject,r as isRecord}from"./normalize-Cecw_kDB.js";import{r as getHttpWebClient}from"./httpClient-Dj5wBWSr.js";import{n as VList,s as VListItem,t as VMenu}from"./VMenu-BaCC4Of9.js";import{t as VTextField}from"./VTextField-Dmm1M-tz.js";import{c as vibe64ProjectScopedStorageKey,t as currentProjectSlugFromLocation}from"./vibe64ProjectScope.local-BbrorE15.js";import{s as ROUTE_VISIBILITY_PUBLIC}from"./errorMessageHelpers-KoewcxJa.js";import{$n as mdiOpenInNew,C as mdiArrowLeft,Cr as mdiRoutes,G as mdiChevronRight,K as mdiChevronUp,Tt as mdiDotsHorizontal,Ur as mdiStopCircleOutline,W as mdiChevronLeft,cr as mdiPlayCircleOutline,di as mdiWebClock,f as mdiAlertCircleOutline,ft as mdiContentCopy,gr as mdiRefresh,kt as mdiDownloadOutline,n as mdiAccountCircleOutline,nr as mdiPause,ot as mdiCogOutline,s as mdiAccountOffOutline,sr as mdiPlay,u as mdiAccountSwitchOutline,ut as mdiConsoleLine,vr as mdiRestart,xt as mdiCursorDefaultClickOutline}from"./mdi-DwGK7nOu.js";import{t as VBtn}from"./VBtn-B6ryRXW-.js";import{t as VAlert}from"./VAlert-CBpSKTfy.js";import{t as VCheckbox}from"./VCheckbox-Bybg_FNE.js";import{t as VDivider}from"./VDivider-DY2s_j83.js";import{t as VDialog}from"./VDialog-CYfdjZRu.js";import{a as VCardSubtitle,i as VCardTitle,n as VCardText,o as VCardActions,r as VCardItem,t as VCard}from"./VCard-BzaViLPx.js";import{t as VSpacer}from"./VSpacer-B5ip6FSG.js";import{t as VSnackbar}from"./VSnackbar-B38PV3iX.js";import{t as _plugin_vue_export_helper_default}from"./_plugin-vue_export-helper-DNW4j-dv.js";import{n as useRealtimeEvent}from"./useRealtimeEvent-DbrYLgvU.js";import{t as usePaths}from"./usePaths-DaWJ_Tvi.js";import{a as VIBE64_RESOURCE_RECOVERY_KEY,i as vibe64OutputTerminalWebSocketUrl,r as terminalSessionMissingError}from"./_slug_-nHO3Bg-f.js";import{m as sourceEditorLinkTarget}from"./Vibe64SessionFiles-BKJ1Qem_.js";import{t as useCommand}from"./useCommand-DGM7l3ja.js";import{a as Vibe64Terminal_default,i as createWebSocketTerminalDriver,t as useVibe64Terminal}from"./useVibe64Terminal-B8qevIXQ.js";import{n as stableLocalStorageKeyPart,r as writeLocalStorageJson,t as readLocalStorageJson}from"./browserLocalStorage-B4C7rHrs.js";import{n as useVibe64ProjectSlug}from"./useVibe64ProjectScope-C4-hpbwc.js";import{i as vibe64RealtimePayloadFromCurrentTab,r as vibe64RealtimeOriginPayload}from"./vibe64BrowserTabOrigin-D6Mxx-QS.js";import{C as vibe64OutputRunPath,D as vibe64PreviewIdentityPath,E as vibe64OutputsQueryKey,I as vibe64SessionPath,L as vibe64SessionPreviewStatePath,S as vibe64OutputResultPath,T as vibe64OutputsPath,o as VIBE64_SESSIONS_API_SUFFIX,s as VIBE64_SESSION_CHANGED_EVENT,w as vibe64OutputRunStopPath}from"./vibe64SessionRequestConfig-DvrfyP8A.js";import{t as SYSTEM_GRAPH_API_SUFFIX}from"./useVibe64SystemGraph-BdvumnPL.js";import{A as readRefOrGetterValue,O as useVibe64Learning,at as usePageActivity,d as USAGE_RECORDING_LIMITS,l as useVibe64UsageRecording,u as USAGE_INTERACTION_ID_PATTERN}from"./index-BXZp5ztx.js";import{t as Vibe64TemporaryAiFixAction_default}from"./Vibe64TemporaryAiFixAction-DT62W459.js";import{o as vibe64SessionRevision,t as isArchivedVibe64Session}from"./vibe64SessionViewModel-B0cCumM8.js";import{n as vibe64SessionDebugError,r as vibe64SessionDebugLog}from"./vibe64SessionDebugLog-D6ibBX8L.js";var _sfc_main$9={__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 _sfc_main$8={__name:`Vibe64OutputOptionsDialog`,props:{surface:{required:true,type:Object}},setup(__props){const{operationBusy,outputOptionsAction,outputOptionsError,outputOptionsErrors,outputOptionsRemember,outputOptionsSelection,outputOptionsValues,outputOptionsVisible,resetOutputOptions,submitOutputOptions}=__props.surface;return(_ctx,_cache)=>{return openBlock(),createBlock(VDialog,{modelValue:unref(outputOptionsVisible),"onUpdate:modelValue":_cache[2]||(_cache[2]=$event=>isRef(outputOptionsVisible)?outputOptionsVisible.value=$event:null),"aria-label":`Preview options`,"max-width":`520`,persistent:unref(operationBusy),scrollable:``},{default:withCtx(()=>[createVNode(VCard,null,{default:withCtx(()=>[createVNode(VCardTitle,null,{default:withCtx(()=>[..._cache[3]||(_cache[3]=[createTextVNode(`Preview options`,-1)])]),_:1}),createVNode(VCardSubtitle,null,{default:withCtx(()=>[createTextVNode(toDisplayString(unref(outputOptionsSelection)?.label),1)]),_:1}),createVNode(VCardText,null,{default:withCtx(()=>[(openBlock(true),createElementBlock(Fragment,null,renderList(unref(outputOptionsSelection)?.parameters||[],parameter=>{return openBlock(),createBlock(VTextField,{key:parameter.id,modelValue:unref(outputOptionsValues)[parameter.id],"onUpdate:modelValue":$event=>unref(outputOptionsValues)[parameter.id]=$event,class:`mb-3`,disabled:unref(operationBusy),"error-messages":unref(outputOptionsErrors)[parameter.id],hint:parameter.description,label:parameter.label,maxlength:4096,"persistent-hint":Boolean(parameter.description),required:parameter.required,variant:`outlined`,onKeydown:withKeys(withModifiers(unref(submitOutputOptions),[`prevent`]),[`enter`])},null,8,[`modelValue`,`onUpdate:modelValue`,`disabled`,`error-messages`,`hint`,`label`,`persistent-hint`,`required`,`onKeydown`])}),128)),createVNode(VCheckbox,{modelValue:unref(outputOptionsRemember),"onUpdate:modelValue":_cache[0]||(_cache[0]=$event=>isRef(outputOptionsRemember)?outputOptionsRemember.value=$event:null),disabled:unref(operationBusy),hint:`Use these values for new sessions in this browser.`,label:`Remember for this project`,"persistent-hint":``},null,8,[`modelValue`,`disabled`]),createVNode(VBtn,{disabled:unref(operationBusy),variant:`text`,onClick:unref(resetOutputOptions)},{default:withCtx(()=>[..._cache[4]||(_cache[4]=[createTextVNode(`Use defaults`,-1)])]),_:1},8,[`disabled`,`onClick`]),unref(outputOptionsError)?(openBlock(),createBlock(VAlert,{key:0,class:`mt-3`,type:`error`,variant:`tonal`},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(outputOptionsError)),1)]),_:1})):createCommentVNode(``,true)]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{disabled:unref(operationBusy),variant:`text`,onClick:_cache[1]||(_cache[1]=$event=>outputOptionsVisible.value=false)},{default:withCtx(()=>[..._cache[5]||(_cache[5]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{disabled:unref(operationBusy),color:`primary`,variant:`flat`,onClick:unref(submitOutputOptions)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(outputOptionsAction)),1)]),_:1},8,[`disabled`,`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`,`persistent`])}}};var Vibe64OutputOptionsDialog_default=_plugin_vue_export_helper_default(_sfc_main$8,[[`__scopeId`,`data-v-8fb19d1b`]]);var _sfc_main$7={__name:`Vibe64OutputResultsMenu`,props:{surface:{required:true,type:Object}},setup(__props){const{outputExecution,outputResults,outputTargets}=__props.surface;const resultsButtonVisible=computed(()=>Boolean(outputResults.value.length>0||outputExecution.value.error||outputTargets.value.some(target=>Array.isArray(target?.downloads)&&target.downloads.length>0)));const outputResultsLabel=computed(()=>{const count=outputResults.value.length;if(count>0)return`${count} downloadable ${count===1?`result`:`results`}`;return outputExecution.value.error?`Build results need attention`:`No build results yet`});function outputResultSubtitle(result={}){const bytes=Number(result.size||0);return`${bytes>=1048576?`${(bytes/1048576).toFixed(1)} MB`:bytes>=1024?`${(bytes/1024).toFixed(1)} KB`:`${bytes} B`} · SHA-256 ${String(result.sha256||``).slice(0,12)}…`}return(_ctx,_cache)=>{return resultsButtonVisible.value?(openBlock(),createBlock(VMenu,{key:0,"close-on-content-click":false,location:`bottom end`},{activator:withCtx(({props:menuProps})=>[createVNode(VBtn,mergeProps(menuProps,{"aria-label":outputResultsLabel.value,disabled:unref(outputResults).length<1&&!unref(outputExecution).error,icon:unref(mdiDownloadOutline),size:`small`,title:outputResultsLabel.value,variant:`text`}),null,16,[`aria-label`,`disabled`,`icon`,`title`])]),default:withCtx(()=>[createVNode(VCard,{class:`vibe64-launch-controls__results-card`},{default:withCtx(()=>[createVNode(VCardItem,{"prepend-icon":unref(mdiDownloadOutline),subtitle:`Immutable snapshots from this session`,title:`Build results`},null,8,[`prepend-icon`]),unref(outputExecution).error?(openBlock(),createBlock(VAlert,{key:0,class:`vibe64-launch-controls__results-error`,density:`compact`,type:`error`,variant:`tonal`},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(outputExecution).error.message),1)]),_:1})):createCommentVNode(``,true),unref(outputResults).length?(openBlock(),createBlock(VList,{key:1,density:`comfortable`},{default:withCtx(()=>[(openBlock(true),createElementBlock(Fragment,null,renderList(unref(outputResults),result=>{return openBlock(),createBlock(VListItem,{key:result.id,href:result.href,"prepend-icon":unref(mdiDownloadOutline),subtitle:outputResultSubtitle(result),title:result.name},null,8,[`href`,`prepend-icon`,`subtitle`,`title`])}),128))]),_:1})):createCommentVNode(``,true)]),_:1})]),_:1})):createCommentVNode(``,true)}}};var Vibe64OutputResultsMenu_default=_plugin_vue_export_helper_default(_sfc_main$7,[[`__scopeId`,`data-v-5ae8ab6b`]]);var _hoisted_1$4=[`title`];var _hoisted_2$3=[`aria-invalid`,`disabled`,`placeholder`];var _sfc_main$6={__name:`Vibe64PreviewAddressBar`,props:{surface:{required:true,type:Object}},setup(__props){const{copyPreviewUrl,goPreviewBack,launchActions,openAction,openPreviewRoute,previewAddressBlur,previewAddressDraft,previewAddressError,previewAddressFocus,previewBackAvailable,previewBaseUrl,previewDisplayedAddress,previewPickAvailable,previewPickBusy,previewPicking,previewRoutes,previewRoutesAvailable,previewSuspended,reloadPreview,resetPreviewAddressDraft,resumePreview,submitPreviewAddress,suspendPreview,togglePreviewPick}=__props.surface;return(_ctx,_cache)=>{return openBlock(),createElementBlock(`form`,{"aria-label":`Preview page`,class:normalizeClass([`vibe64-launch-controls__preview-nav`,{"vibe64-launch-controls__preview-nav--invalid":unref(previewAddressError)}]),title:unref(previewAddressError)||`Preview URL`,onSubmit:_cache[5]||(_cache[5]=withModifiers((...args)=>unref(submitPreviewAddress)&&unref(submitPreviewAddress)(...args),[`prevent`]))},[createVNode(VBtn,{"aria-label":`Go back in preview`,disabled:!unref(previewBackAvailable),icon:unref(mdiArrowLeft),size:`small`,title:`Go back in preview`,type:`button`,variant:`text`,onClick:unref(goPreviewBack)},null,8,[`disabled`,`icon`,`onClick`]),unref(previewRoutesAvailable)?(openBlock(),createBlock(VMenu,{key:0,location:`bottom start`},{activator:withCtx(({props:menuProps})=>[createVNode(VBtn,mergeProps(menuProps,{"aria-label":`Preview pages`,icon:unref(mdiRoutes),size:`small`,title:`Preview pages`,type:`button`,variant:`text`}),null,16,[`icon`])]),default:withCtx(()=>[createVNode(VList,{class:`vibe64-launch-controls__route-menu`,density:`compact`},{default:withCtx(()=>[(openBlock(true),createElementBlock(Fragment,null,renderList(unref(previewRoutes),route=>{return openBlock(),createBlock(VListItem,{key:route.id,subtitle:route.pathTemplate,title:route.label,onClick:$event=>unref(openPreviewRoute)(route)},null,8,[`subtitle`,`title`,`onClick`])}),128))]),_:1})]),_:1})):createCommentVNode(``,true),withDirectives(createBaseVNode(`input`,{"onUpdate:modelValue":_cache[0]||(_cache[0]=$event=>isRef(previewAddressDraft)?previewAddressDraft.value=$event:null),"aria-label":`Preview URL`,"aria-invalid":unref(previewAddressError)?`true`:`false`,autocapitalize:`off`,autocomplete:`off`,class:`vibe64-launch-controls__preview-address`,disabled:!unref(previewBaseUrl),placeholder:unref(previewDisplayedAddress)?``:`Preview URL unavailable`,spellcheck:`false`,type:`text`,onBlur:_cache[1]||(_cache[1]=(...args)=>unref(previewAddressBlur)&&unref(previewAddressBlur)(...args)),onFocus:_cache[2]||(_cache[2]=(...args)=>unref(previewAddressFocus)&&unref(previewAddressFocus)(...args)),onKeydown:_cache[3]||(_cache[3]=withKeys(withModifiers((...args)=>unref(resetPreviewAddressDraft)&&unref(resetPreviewAddressDraft)(...args),[`prevent`]),[`esc`]))},null,40,_hoisted_2$3),[[vModelText,unref(previewAddressDraft)]]),createVNode(VBtn,{icon:unref(mdiRefresh),size:`small`,disabled:unref(previewSuspended),title:`Reload preview`,"data-vibe64-guide":`reload-preview`,type:`button`,variant:`text`,onClick:unref(reloadPreview)},null,8,[`icon`,`disabled`,`onClick`]),createVNode(VBtn,{"aria-pressed":unref(previewPicking)?`true`:`false`,"aria-label":`Pick element`,color:unref(previewPicking)?`primary`:void 0,disabled:unref(previewPickBusy)||!unref(previewPicking)&&!unref(previewPickAvailable),icon:unref(mdiCursorDefaultClickOutline),loading:unref(previewPickBusy),size:`small`,title:`Show what this element uses`,type:`button`,variant:unref(previewPicking)?`tonal`:`text`,onClick:unref(togglePreviewPick)},null,8,[`aria-pressed`,`color`,`disabled`,`icon`,`loading`,`variant`,`onClick`]),createVNode(VBtn,{"aria-label":unref(previewSuspended)?`Resume preview`:`Suspend preview`,icon:unref(previewSuspended)?unref(mdiPlay):unref(mdiPause),size:`small`,title:unref(previewSuspended)?`Resume preview`:`Suspend preview — unload this page; unsaved page changes may be lost`,type:`button`,variant:`text`,onClick:_cache[4]||(_cache[4]=$event=>unref(previewSuspended)?unref(resumePreview)():unref(suspendPreview)())},null,8,[`aria-label`,`icon`,`title`]),createVNode(VBtn,{disabled:!unref(previewDisplayedAddress),icon:unref(mdiContentCopy),size:`small`,title:`Copy preview URL`,type:`button`,variant:`text`,onClick:withModifiers(unref(copyPreviewUrl),[`prevent`])},null,8,[`disabled`,`icon`,`onClick`]),(openBlock(true),createElementBlock(Fragment,null,renderList(unref(launchActions),action=>{return openBlock(),createBlock(VBtn,{key:action.id||action.href,"aria-label":action.label||`Open in new tab`,icon:unref(mdiOpenInNew),size:`small`,title:action.label||action.href,type:`button`,variant:`text`,onClick:$event=>unref(openAction)(action)},null,8,[`aria-label`,`icon`,`title`,`onClick`])}),128))],42,_hoisted_1$4)}}};var Vibe64PreviewAddressBar_default=_plugin_vue_export_helper_default(_sfc_main$6,[[`__scopeId`,`data-v-18d2e0f4`]]);var _hoisted_1$3={key:1,class:`vibe64-launch-controls__identity-recovery`};var _sfc_main$5={__name:`Vibe64PreviewIdentityMenu`,props:{fixPreviewIdentityWithTemporaryAi:{default:null,type:Function},surface:{required:true,type:Object}},setup(__props){const props=__props;const{previewIdentityAvailable,previewIdentityBusy,previewIdentityConfigured,previewIdentityCurrent,previewIdentityError,previewIdentityLabel,previewIdentitySelectionDisabled,previewIdentityTitle,previewIdentityTypeLabel,selectPreviewConfiguredIdentity,selectPreviewGuest}=props.surface;const previewIdentityFailedSelection=ref(null);const previewIdentityFixSending=ref(false);const previewIdentityFixAvailable=computed(()=>Boolean(previewIdentityError.value&&previewIdentityFailedSelection.value&&typeof props.fixPreviewIdentityWithTemporaryAi===`function`));async function selectPreviewIdentityFromMenu(identity={}){previewIdentityFailedSelection.value=identity;const selected=await selectPreviewConfiguredIdentity(identity);if(selected)previewIdentityFailedSelection.value=null;return selected}async function requestCodexPreviewIdentityFix(){if(!previewIdentityFixAvailable.value||previewIdentityFixSending.value)return false;previewIdentityFixSending.value=true;try{return await props.fixPreviewIdentityWithTemporaryAi({error:previewIdentityError.value,identity:previewIdentityFailedSelection.value})}finally{previewIdentityFixSending.value=false}}watch(previewIdentityError,error=>{if(!error)previewIdentityFailedSelection.value=null});return(_ctx,_cache)=>{return unref(previewIdentityAvailable)?(openBlock(),createBlock(VMenu,{key:0,location:`bottom end`},{activator:withCtx(({props:menuProps})=>[createVNode(VBtn,mergeProps(menuProps,{"aria-label":unref(previewIdentityTitle),color:unref(previewIdentityError)?`error`:void 0,disabled:unref(previewIdentityBusy),icon:unref(mdiAccountSwitchOutline),size:`small`,title:unref(previewIdentityTitle),variant:`text`}),null,16,[`aria-label`,`color`,`disabled`,`icon`,`title`])]),default:withCtx(()=>[createVNode(VCard,{class:`vibe64-launch-controls__identity-menu`},{default:withCtx(()=>[createVNode(VCardItem,{"prepend-icon":unref(mdiAccountCircleOutline),subtitle:`Application preview identity`,title:unref(previewIdentityLabel)},null,8,[`prepend-icon`,`title`]),createVNode(VDivider),createVNode(VList,{density:`compact`},{default:withCtx(()=>[(openBlock(true),createElementBlock(Fragment,null,renderList(unref(previewIdentityConfigured),identity=>{return openBlock(),createBlock(VListItem,{key:identity.name,active:unref(previewIdentityCurrent)?.mode===`identity`&&unref(previewIdentityCurrent)?.name===identity.name,disabled:unref(previewIdentitySelectionDisabled),"prepend-icon":unref(mdiAccountCircleOutline),subtitle:`${unref(previewIdentityTypeLabel)(identity.type)}: ${identity.value}`,title:identity.name,onClick:$event=>selectPreviewIdentityFromMenu(identity)},null,8,[`active`,`disabled`,`prepend-icon`,`subtitle`,`title`,`onClick`])}),128)),createVNode(VListItem,{active:unref(previewIdentityCurrent)?.mode===`guest`,disabled:unref(previewIdentitySelectionDisabled),"prepend-icon":unref(mdiAccountOffOutline),subtitle:`Use the app signed out`,title:`Guest`,onClick:unref(selectPreviewGuest)},null,8,[`active`,`disabled`,`prepend-icon`,`onClick`])]),_:1}),unref(previewIdentityError)?(openBlock(),createBlock(VAlert,{key:0,class:`vibe64-launch-controls__identity-error`,density:`compact`,type:`error`,variant:`tonal`},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(previewIdentityError)),1)]),_:1})):createCommentVNode(``,true),previewIdentityFixAvailable.value?(openBlock(),createElementBlock(`div`,_hoisted_1$3,[createVNode(Vibe64TemporaryAiFixAction_default,{disabled:previewIdentityFixSending.value,pending:previewIdentityFixSending.value,title:`Open Temporary AI to resolve preview identity`,onClick:requestCodexPreviewIdentityFix},null,8,[`disabled`,`pending`])])):createCommentVNode(``,true)]),_:1})]),_:1})):createCommentVNode(``,true)}}};var Vibe64PreviewIdentityMenu_default=_plugin_vue_export_helper_default(_sfc_main$5,[[`__scopeId`,`data-v-24f77058`]]);var _sfc_main$4={__name:`Vibe64PreviewIssueMenu`,props:{surface:{required:true,type:Object}},setup(__props){const{embeddedStartTarget,operationBusy,previewCanRestart,previewCanShowLog,previewIssue,previewIssueVisible,recoverEmbeddedPreview,retryTerminal,showLaunchLog,terminalCanRetry}=__props.surface;return(_ctx,_cache)=>{return unref(previewIssueVisible)?(openBlock(),createBlock(VMenu,{key:0,"close-on-content-click":false,location:`bottom end`},{activator:withCtx(({props:menuProps})=>[createVNode(VBtn,mergeProps(menuProps,{class:`vibe64-launch-controls__attention-button`,color:`warning`,icon:unref(mdiAlertCircleOutline),size:`small`,title:unref(previewIssue).title,variant:`text`}),null,16,[`icon`,`title`])]),default:withCtx(()=>[createVNode(VCard,{class:`vibe64-launch-controls__attention-menu`},{default:withCtx(()=>[createVNode(VCardText,{class:`vibe64-launch-controls__attention-body`},{default:withCtx(()=>[createVNode(VIcon,{class:`vibe64-launch-controls__attention-icon`,icon:unref(mdiAlertCircleOutline),size:`28`},null,8,[`icon`]),createBaseVNode(`div`,null,[createBaseVNode(`strong`,null,toDisplayString(unref(previewIssue).title),1),createBaseVNode(`p`,null,toDisplayString(unref(previewIssue).message),1)])]),_:1}),createVNode(VCardActions,{class:`vibe64-launch-controls__attention-actions`},{default:withCtx(()=>[unref(previewCanShowLog)?(openBlock(),createBlock(VBtn,{key:0,"prepend-icon":unref(mdiConsoleLine),size:`small`,variant:`tonal`,onClick:unref(showLaunchLog)},{default:withCtx(()=>[..._cache[0]||(_cache[0]=[createTextVNode(` Show log `,-1)])]),_:1},8,[`prepend-icon`,`onClick`])):createCommentVNode(``,true),unref(previewCanRestart)&&unref(embeddedStartTarget)?(openBlock(),createBlock(VBtn,{key:1,disabled:unref(operationBusy),"prepend-icon":unref(mdiRefresh),size:`small`,variant:`tonal`,onClick:unref(recoverEmbeddedPreview)},{default:withCtx(()=>[..._cache[1]||(_cache[1]=[createTextVNode(` Restart preview `,-1)])]),_:1},8,[`disabled`,`prepend-icon`,`onClick`])):createCommentVNode(``,true),unref(terminalCanRetry)&&!(unref(previewCanRestart)&&unref(embeddedStartTarget))?(openBlock(),createBlock(VBtn,{key:2,disabled:unref(operationBusy),icon:unref(mdiRefresh),size:`small`,title:`Retry preview`,variant:`text`,onClick:unref(retryTerminal)},null,8,[`disabled`,`icon`,`onClick`])):createCommentVNode(``,true)]),_:1})]),_:1})]),_:1})):createCommentVNode(``,true)}}};var Vibe64PreviewIssueMenu_default=_plugin_vue_export_helper_default(_sfc_main$4,[[`__scopeId`,`data-v-0b52895a`]]);var _hoisted_1$2={key:0,class:`vibe64-launch-controls__mobile-collapsed`};var _hoisted_2$2=[`aria-label`,`title`];var _hoisted_3$2={class:`vibe64-launch-controls__toolbar-main`};var _hoisted_4$2={class:`vibe64-launch-controls__secondary-actions`};var _hoisted_5$1=[`title`];var _hoisted_6$1=[`aria-label`,`title`];var _hoisted_7$1={key:1,class:`vibe64-launch-controls__auto-start-actions`};var _sfc_main$3={__name:`Vibe64OutputToolbar`,props:{buttonLabel:{default:`Run`,type:String},buttonSize:{default:`small`,type:String},buttonVariant:{default:`tonal`,type:String},embeddedPreview:{default:false,type:Boolean},fixPreviewIdentityWithTemporaryAi:{default:null,type:Function},surface:{required:true,type:Object}},setup(__props){const props=__props;const{collapsePreviewToolbar,embeddedManualStartButtonDisabled,embeddedManualStartButtonVisible,expandPreviewToolbar,forceStartEmbeddedPreview,launchActions,launchButtonsDisabled,launchStatusChipText,launchStatusChipTitle,launchStatusChipVisible,launchStatusRetryVisible,launchToolbarDockVisible,loading,manualLaunchMenuVisible,movePreviewToolbar,openAction,openOutputOptions,operationBusy,outputOptionsAvailable,outputTargets,previewBrowserControlsVisible,previewToolbarExpanded,previewToolbarPosition,previewToolbarRecoveryVisible,recoverEmbeddedPreview,restartTerminal,retryLaunchStatus,retryTerminal,runMenuDisabled,runWithOptions,showLaunchLog,stopTerminal,terminalCanRestart,terminalCanRetry,terminalCanStop,terminalIndicatorLabel,terminalIndicatorState,terminalTitle,terminalVisible,toolbarTeleportTarget}=props.surface;const previewNavVisible=computed(()=>Boolean(props.embeddedPreview&&previewBrowserControlsVisible.value));return(_ctx,_cache)=>{return openBlock(),createElementBlock(`div`,{class:normalizeClass([`vibe64-launch-controls__toolbar`,[{"vibe64-launch-controls__toolbar--mobile-collapsed":__props.embeddedPreview&&!unref(previewToolbarExpanded),"vibe64-launch-controls__toolbar--mobile-expanded":__props.embeddedPreview&&unref(previewToolbarExpanded),"vibe64-launch-controls__toolbar--teleported":unref(toolbarTeleportTarget)},__props.embeddedPreview?`vibe64-launch-controls__toolbar--${unref(previewToolbarPosition)}`:``]])},[__props.embeddedPreview?(openBlock(),createElementBlock(`div`,_hoisted_1$2,[createVNode(VBtn,{class:`vibe64-launch-controls__position-button`,disabled:unref(previewToolbarPosition)===`left`,icon:unref(mdiChevronLeft),size:`small`,title:`Move controls left`,variant:`text`,onClick:_cache[0]||(_cache[0]=$event=>unref(movePreviewToolbar)(-1))},null,8,[`disabled`,`icon`]),createBaseVNode(`button`,{"aria-label":`Show preview controls`,class:`vibe64-launch-controls__mobile-expand`,type:`button`,title:`Show preview controls`,onClick:_cache[1]||(_cache[1]=(...args)=>unref(expandPreviewToolbar)&&unref(expandPreviewToolbar)(...args))},[createBaseVNode(`span`,{class:normalizeClass([`vibe64-launch-controls__status-dot`,`vibe64-launch-controls__status-dot--${unref(terminalIndicatorState)}`]),"aria-label":unref(terminalIndicatorLabel),title:unref(terminalIndicatorLabel)},null,10,_hoisted_2$2),createVNode(VIcon,{icon:unref(mdiDotsHorizontal),size:`18`},null,8,[`icon`])]),createVNode(VBtn,{class:`vibe64-launch-controls__position-button`,disabled:unref(previewToolbarPosition)===`right`,icon:unref(mdiChevronRight),size:`small`,title:`Move controls right`,variant:`text`,onClick:_cache[2]||(_cache[2]=$event=>unref(movePreviewToolbar)(1))},null,8,[`disabled`,`icon`])])):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_3$2,[__props.embeddedPreview?(openBlock(),createBlock(VBtn,{key:0,class:`vibe64-launch-controls__position-button`,disabled:unref(previewToolbarPosition)===`left`,icon:unref(mdiChevronLeft),size:`small`,title:`Move controls left`,variant:`text`,onClick:_cache[3]||(_cache[3]=$event=>unref(movePreviewToolbar)(-1))},null,8,[`disabled`,`icon`])):createCommentVNode(``,true),__props.embeddedPreview?(openBlock(),createBlock(VBtn,{key:1,class:`vibe64-launch-controls__mobile-collapse-button`,icon:unref(mdiChevronUp),size:`small`,title:`Collapse preview controls`,variant:`text`,onClick:unref(collapsePreviewToolbar)},null,8,[`icon`,`onClick`])):createCommentVNode(``,true),previewNavVisible.value?(openBlock(),createBlock(Vibe64PreviewAddressBar_default,{key:2,surface:__props.surface},null,8,[`surface`])):__props.embeddedPreview?(openBlock(),createBlock(VBtn,{key:3,disabled:unref(loading),icon:unref(mdiRefresh),"aria-label":`Refresh output status`,title:`Refresh output status`,variant:`text`,onClick:unref(retryLaunchStatus)},null,8,[`disabled`,`icon`,`onClick`])):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_4$2,[createVNode(Vibe64PreviewIdentityMenu_default,{"fix-preview-identity-with-temporary-ai":__props.fixPreviewIdentityWithTemporaryAi,surface:__props.surface},null,8,[`fix-preview-identity-with-temporary-ai`,`surface`]),unref(launchToolbarDockVisible)?(openBlock(),createElementBlock(`div`,{key:0,"aria-label":`Preview server`,class:`vibe64-launch-controls__dock`,role:`group`,title:unref(terminalTitle)},[createBaseVNode(`span`,{class:normalizeClass([`vibe64-launch-controls__status-dot`,`vibe64-launch-controls__status-dot--${unref(terminalIndicatorState)}`]),"aria-label":unref(terminalIndicatorLabel),role:`img`,title:unref(terminalIndicatorLabel)},null,10,_hoisted_6$1),(openBlock(true),createElementBlock(Fragment,null,renderList(previewNavVisible.value?[]:unref(launchActions),action=>{return openBlock(),createBlock(VBtn,{key:action.id||action.href,icon:unref(mdiOpenInNew),size:`small`,title:action.label||action.href,variant:`text`,onClick:$event=>unref(openAction)(action)},null,8,[`icon`,`title`,`onClick`])}),128)),unref(terminalVisible)?(openBlock(),createBlock(VBtn,{key:0,"aria-label":`Show run output`,icon:unref(mdiConsoleLine),size:`small`,title:`Show run output`,variant:`text`,onClick:unref(showLaunchLog)},null,8,[`icon`,`onClick`])):createCommentVNode(``,true),unref(terminalCanStop)?(openBlock(),createBlock(VBtn,{key:1,"aria-label":`Stop preview`,disabled:unref(operationBusy),icon:unref(mdiStopCircleOutline),size:`small`,title:`Stop preview`,variant:`text`,onClick:unref(stopTerminal)},null,8,[`disabled`,`icon`,`onClick`])):createCommentVNode(``,true),unref(previewToolbarRecoveryVisible)?(openBlock(),createBlock(VBtn,{key:2,"aria-label":`Restart preview`,disabled:unref(operationBusy),icon:unref(mdiRestart),size:`small`,title:`Restart preview`,variant:`text`,onClick:unref(recoverEmbeddedPreview)},null,8,[`disabled`,`icon`,`onClick`])):createCommentVNode(``,true),unref(terminalCanRetry)&&!unref(previewToolbarRecoveryVisible)?(openBlock(),createBlock(VBtn,{key:3,"aria-label":`Retry preview`,disabled:unref(operationBusy),icon:unref(mdiRestart),size:`small`,title:`Retry`,variant:`text`,onClick:unref(retryTerminal)},null,8,[`disabled`,`icon`,`onClick`])):createCommentVNode(``,true),unref(terminalCanRestart)&&!unref(previewToolbarRecoveryVisible)?(openBlock(),createBlock(VBtn,{key:4,"aria-label":`Restart preview server`,disabled:unref(operationBusy),icon:unref(mdiRestart),size:`small`,title:`Restart`,variant:`text`,onClick:unref(restartTerminal)},null,8,[`disabled`,`icon`,`onClick`])):createCommentVNode(``,true)],8,_hoisted_5$1)):unref(embeddedManualStartButtonVisible)?(openBlock(),createElementBlock(`div`,_hoisted_7$1,[createVNode(VBtn,{"aria-label":`Start preview`,class:`vibe64-launch-controls__auto-start-button`,disabled:unref(embeddedManualStartButtonDisabled),icon:unref(mdiPlayCircleOutline),size:`small`,title:`Start preview`,variant:`text`,onClick:unref(forceStartEmbeddedPreview)},null,8,[`disabled`,`icon`,`onClick`])])):createCommentVNode(``,true),unref(outputOptionsAvailable)?(openBlock(),createBlock(VBtn,{key:2,"aria-label":`Preview options`,disabled:unref(operationBusy),icon:unref(mdiCogOutline),size:`small`,title:`Preview options`,variant:`text`,onClick:_cache[4]||(_cache[4]=$event=>unref(openOutputOptions)())},null,8,[`disabled`,`icon`])):createCommentVNode(``,true),createVNode(Vibe64OutputResultsMenu_default,{surface:__props.surface},null,8,[`surface`]),unref(manualLaunchMenuVisible)?(openBlock(),createBlock(VMenu,{key:3,location:`bottom end`},{activator:withCtx(({props:menuProps})=>[createVNode(VBtn,mergeProps(menuProps,{class:`vibe64-launch-controls__run-button`,color:`primary`,disabled:unref(runMenuDisabled),"prepend-icon":unref(mdiPlayCircleOutline),size:__props.buttonSize,title:`Run target`,variant:__props.buttonVariant}),{default:withCtx(()=>[createTextVNode(toDisplayString(__props.buttonLabel),1)]),_:1},16,[`disabled`,`prepend-icon`,`size`,`variant`])]),default:withCtx(()=>[createVNode(VList,{class:`vibe64-launch-controls__menu`,density:`compact`},{default:withCtx(()=>[(openBlock(true),createElementBlock(Fragment,null,renderList(unref(outputTargets),outputTarget=>{return openBlock(),createBlock(VListItem,{key:outputTarget.id,disabled:unref(launchButtonsDisabled)||outputTarget.available===false,"prepend-icon":unref(mdiPlayCircleOutline),subtitle:outputTarget.disabledReason||``,title:outputTarget.label,onClick:$event=>unref(runWithOptions)(outputTarget)},null,8,[`disabled`,`prepend-icon`,`subtitle`,`title`,`onClick`])}),128))]),_:1})]),_:1})):createCommentVNode(``,true),unref(launchStatusChipVisible)?(openBlock(),createBlock(VChip,{key:4,color:`warning`,size:`small`,variant:`tonal`,title:unref(launchStatusChipTitle)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(launchStatusChipText)),1)]),_:1},8,[`title`])):createCommentVNode(``,true),unref(launchStatusRetryVisible)?(openBlock(),createBlock(VBtn,{key:5,disabled:unref(loading),icon:unref(mdiRefresh),size:`small`,title:`Retry preview status`,variant:`text`,onClick:unref(retryLaunchStatus)},null,8,[`disabled`,`icon`,`onClick`])):createCommentVNode(``,true),__props.embeddedPreview?(openBlock(),createBlock(VBtn,{key:6,class:`vibe64-launch-controls__position-button`,disabled:unref(previewToolbarPosition)===`right`,icon:unref(mdiChevronRight),size:`small`,title:`Move controls right`,variant:`text`,onClick:_cache[5]||(_cache[5]=$event=>unref(movePreviewToolbar)(1))},null,8,[`disabled`,`icon`])):createCommentVNode(``,true),createVNode(Vibe64PreviewIssueMenu_default,{surface:__props.surface},null,8,[`surface`])])])],2)}}};var Vibe64OutputToolbar_default=_plugin_vue_export_helper_default(_sfc_main$3,[[`__scopeId`,`data-v-11bdc41d`]]);var _sfc_main$2={__name:`Vibe64PreviewRouteDialog`,props:{surface:{required:true,type:Object}},setup(__props){const{previewRouteDialogError,previewRouteDialogParams,previewRouteDialogPath,previewRouteDialogVisible,previewRouteFormValues,previewRouteSelection,submitPreviewRouteDialog}=__props.surface;return(_ctx,_cache)=>{return openBlock(),createBlock(VDialog,{modelValue:unref(previewRouteDialogVisible),"onUpdate:modelValue":_cache[1]||(_cache[1]=$event=>isRef(previewRouteDialogVisible)?previewRouteDialogVisible.value=$event:null),"max-width":`520`},{default:withCtx(()=>[createVNode(VCard,{class:`vibe64-launch-controls__route-card`},{default:withCtx(()=>[createVNode(VCardTitle,null,{default:withCtx(()=>[createTextVNode(toDisplayString(unref(previewRouteSelection)?.label||`Preview page`),1)]),_:1}),createVNode(VCardText,null,{default:withCtx(()=>[createVNode(VTextField,{density:`compact`,label:`URL`,"model-value":unref(previewRouteDialogPath),readonly:``,variant:`outlined`},null,8,[`model-value`]),(openBlock(true),createElementBlock(Fragment,null,renderList(unref(previewRouteDialogParams),param=>{return openBlock(),createBlock(VTextField,{key:param.name,modelValue:unref(previewRouteFormValues)[param.name],"onUpdate:modelValue":$event=>unref(previewRouteFormValues)[param.name]=$event,density:`comfortable`,hint:param.description,label:param.label,placeholder:param.placeholder,"persistent-hint":Boolean(param.description),variant:`outlined`,onKeydown:withKeys(withModifiers(unref(submitPreviewRouteDialog),[`prevent`]),[`enter`])},null,8,[`modelValue`,`onUpdate:modelValue`,`hint`,`label`,`placeholder`,`persistent-hint`,`onKeydown`])}),128)),unref(previewRouteDialogError)?(openBlock(),createBlock(VAlert,{key:0,density:`compact`,type:`warning`,variant:`tonal`},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(previewRouteDialogError)),1)]),_:1})):createCommentVNode(``,true)]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{variant:`text`,onClick:_cache[0]||(_cache[0]=$event=>previewRouteDialogVisible.value=false)},{default:withCtx(()=>[..._cache[2]||(_cache[2]=[createTextVNode(` Cancel `,-1)])]),_:1}),createVNode(VBtn,{color:`primary`,variant:`flat`,onClick:unref(submitPreviewRouteDialog)},{default:withCtx(()=>[..._cache[3]||(_cache[3]=[createTextVNode(` Open `,-1)])]),_:1},8,[`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`])}}};var Vibe64PreviewRouteDialog_default=_plugin_vue_export_helper_default(_sfc_main$2,[[`__scopeId`,`data-v-506152e8`]]);var _hoisted_1$1={key:0,class:`vibe64-launch-controls__preview-empty vibe64-launch-controls__preview-overlay`};var _hoisted_2$1={class:`vibe64-launch-controls__preview-pulse`};var _hoisted_3$1={key:1,class:`vibe64-launch-controls__preview-empty`,role:`status`};var _hoisted_4$1={key:2,class:`vibe64-launch-controls__preview-empty vibe64-launch-controls__preview-diagnostic`};var _hoisted_5={class:`vibe64-launch-controls__preview-diagnostic-actions`};var _hoisted_6={key:3,class:`vibe64-launch-controls__preview-empty`};var _hoisted_7=[`title`];var _hoisted_8={key:3,class:`vibe64-launch-controls__preview-status-detail`};var _sfc_main$1={__name:`Vibe64PreviewStatus`,props:{session:{default:null,type:Object},surface:{required:true,type:Object}},setup(__props){const{acceptResourceRetry,embeddedManualStartButtonDisabled,embeddedManualStartButtonVisible,forceStartEmbeddedPreview,launchStatusDetailText,loading,operationBusy,previewActivityVisible,previewCanShowLog,previewCheckAgainVisible,previewEmptyText,previewInFlightText,previewLoadingOverlayVisible,previewNotice,previewNoticeVisible,previewRecoveryLabel,previewRecoveryVisible,previewSetupRetryVisible,previewSuspended,previewUrl,recheckResourceAdmission,recoverEmbeddedPreview,resourceAdmissionId,resumePreview,retryLaunchStatus,retryPreviewWorkspaceSetup,showLaunchLog}=__props.surface;const resourceRecoveryControl=inject(VIBE64_RESOURCE_RECOVERY_KEY,null);const resourceRetryBusy=ref(false);function setResourceRetryBusy(value){if(!value&&!resourceRetryBusy.value)return;resourceRetryBusy.value=value;operationBusy.value=value}return(_ctx,_cache)=>{return openBlock(),createElementBlock(Fragment,null,[unref(previewLoadingOverlayVisible)?(openBlock(),createElementBlock(`div`,_hoisted_1$1,[createBaseVNode(`div`,_hoisted_2$1,[createVNode(VIcon,{icon:unref(mdiWebClock),size:`46`},null,8,[`icon`])]),createBaseVNode(`span`,null,toDisplayString(unref(previewInFlightText)||`Opening preview.`),1)])):createCommentVNode(``,true),unref(previewSuspended)?(openBlock(),createElementBlock(`div`,_hoisted_3$1,[_cache[1]||(_cache[1]=createBaseVNode(`strong`,null,`Preview suspended`,-1)),_cache[2]||(_cache[2]=createBaseVNode(`span`,null,`This page is unloaded. App servers and agents are unaffected. Unsaved page changes may be lost.`,-1)),createVNode(VBtn,{"prepend-icon":unref(mdiPlayCircleOutline),variant:`tonal`,onClick:unref(resumePreview)},{default:withCtx(()=>[..._cache[0]||(_cache[0]=[createTextVNode(`Resume preview`,-1)])]),_:1},8,[`prepend-icon`,`onClick`])])):unref(previewNoticeVisible)?(openBlock(),createElementBlock(`div`,_hoisted_4$1,[createVNode(VIcon,{class:`vibe64-launch-controls__preview-diagnostic-icon`,icon:unref(mdiAlertCircleOutline),size:`38`},null,8,[`icon`]),createBaseVNode(`strong`,null,toDisplayString(unref(previewNotice).title),1),createBaseVNode(`span`,null,toDisplayString(unref(previewNotice).message),1),createBaseVNode(`div`,_hoisted_5,[unref(resourceRecoveryControl)&&unref(resourceAdmissionId)?(openBlock(),createBlock(resolveDynamicComponent(unref(resourceRecoveryControl)),{key:`${__props.session?.sessionId}:${unref(resourceAdmissionId)}`,"admission-id":unref(resourceAdmissionId),"session-id":__props.session?.sessionId||``,disabled:unref(operationBusy)&&!resourceRetryBusy.value,onBusy:setResourceRetryBusy,onRetryResult:unref(acceptResourceRetry),onRecheck:unref(recheckResourceAdmission)},null,40,[`admission-id`,`session-id`,`disabled`,`onRetryResult`,`onRecheck`])):createCommentVNode(``,true),unref(previewRecoveryVisible)?(openBlock(),createBlock(VBtn,{key:1,disabled:resourceRetryBusy.value,color:`primary`,"prepend-icon":unref(mdiRefresh),size:`small`,variant:`flat`,onClick:unref(recoverEmbeddedPreview)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(previewRecoveryLabel)),1)]),_:1},8,[`disabled`,`prepend-icon`,`onClick`])):createCommentVNode(``,true),unref(previewCanShowLog)?(openBlock(),createBlock(VBtn,{key:2,"prepend-icon":unref(mdiConsoleLine),size:`small`,variant:`tonal`,onClick:unref(showLaunchLog)},{default:withCtx(()=>[..._cache[3]||(_cache[3]=[createTextVNode(` Show log `,-1)])]),_:1},8,[`prepend-icon`,`onClick`])):createCommentVNode(``,true)])])):!unref(previewUrl)?(openBlock(),createElementBlock(`div`,_hoisted_6,[createBaseVNode(`div`,{class:normalizeClass([`vibe64-launch-controls__preview-pulse`,{"vibe64-launch-controls__preview-pulse--active":unref(previewActivityVisible)}])},[createVNode(VIcon,{icon:unref(mdiWebClock),size:`46`},null,8,[`icon`])],2),createBaseVNode(`span`,{class:`vibe64-launch-controls__preview-empty-text`,title:unref(previewEmptyText)},toDisplayString(unref(previewEmptyText)),9,_hoisted_7),unref(embeddedManualStartButtonVisible)&&!unref(previewActivityVisible)?(openBlock(),createBlock(VBtn,{key:0,disabled:unref(embeddedManualStartButtonDisabled),color:`primary`,"prepend-icon":unref(mdiPlayCircleOutline),size:`small`,variant:`flat`,onClick:unref(forceStartEmbeddedPreview)},{default:withCtx(()=>[..._cache[4]||(_cache[4]=[createTextVNode(` Start preview `,-1)])]),_:1},8,[`disabled`,`prepend-icon`,`onClick`])):createCommentVNode(``,true),unref(previewSetupRetryVisible)?(openBlock(),createBlock(VBtn,{key:1,disabled:unref(operationBusy)||unref(loading),color:`primary`,"data-vibe64-preview-setup-retry":``,"prepend-icon":unref(mdiRefresh),size:`small`,title:`Run the session's declared setup steps again`,variant:`flat`,onClick:unref(retryPreviewWorkspaceSetup)},{default:withCtx(()=>[..._cache[5]||(_cache[5]=[createTextVNode(` Retry setup `,-1)])]),_:1},8,[`disabled`,`prepend-icon`,`onClick`])):unref(previewCheckAgainVisible)?(openBlock(),createBlock(VBtn,{key:2,disabled:unref(operationBusy)||unref(loading),"prepend-icon":unref(mdiRefresh),size:`small`,title:`Check preview availability again`,variant:`tonal`,onClick:unref(retryLaunchStatus)},{default:withCtx(()=>[..._cache[6]||(_cache[6]=[createTextVNode(` Check again `,-1)])]),_:1},8,[`disabled`,`prepend-icon`,`onClick`])):createCommentVNode(``,true),unref(launchStatusDetailText)&&unref(launchStatusDetailText)!==String(unref(previewEmptyText)||``).trim()?(openBlock(),createElementBlock(`code`,_hoisted_8,toDisplayString(unref(launchStatusDetailText)),1)):createCommentVNode(``,true)])):createCommentVNode(``,true)],64)}}};var Vibe64PreviewStatus_default=_plugin_vue_export_helper_default(_sfc_main$1,[[`__scopeId`,`data-v-5883c754`]]);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 AUTO_START_ATTEMPT_COOLDOWN_MS=7e3;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 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{}}var LAUNCH_STATUS_IDLE_RECOVERY_INITIAL_DELAY_MS=1200;var LAUNCH_STATUS_IDLE_RECOVERY_INTERVAL_MS=3e3;var LAUNCH_STATUS_IDLE_RECOVERY_LIMIT=6;function useVibe64OutputAutoStart({autoStartManagedPreview,autoStartTargetId,busy,launch,outputs,outputTerminal,previewDisplayed,projectSlug}){const{canLoadOutputs,launchScopeKey,launchStatusLoadError,outputTargets,outputTargetsResource,previewState,previewStoppedIntent,refresh,sessionId,sessionRevision,terminalDisplayed}=outputs;const{terminalVisible}=outputTerminal;const{autoStartKey,operationBusy,resourceAdmissionId,run}=launch;const autoStartCooldownVersion=ref(0);const launchStatusIdleRecoveryCount=ref(0);const launchStatusIdleRecoveryExhausted=computed(()=>launchStatusIdleRecoveryCount.value>=LAUNCH_STATUS_IDLE_RECOVERY_LIMIT);const outputTargetsSettledForAutoStart=ref(false);let autoStartTimer=0;let autoStartCooldownTimer=0;let scheduledAutoStartKey=``;let launchStatusIdleRecoveryTimer=0;let launchStatusIdleRecoveryScopeKey=``;let outputTargetsRefreshSessionId=sessionId.value;let outputTargetsRefreshRevision=sessionRevision.value;const requestedAutoStartTargetId=computed(()=>String(readRefOrGetterValue(autoStartTargetId)||``).trim());const autoStartRequestKey=computed(()=>requestedAutoStartTargetId.value||(readRefOrGetterValue(autoStartManagedPreview)===true?`managed-preview`:``));const previewPaneDisplayed=computed(()=>readRefOrGetterValue(previewDisplayed)!==false);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 outputTargetsLoadingForAutoStart=computed(()=>autoStartOutputsLoading({outputTargetsLoading:outputTargetsResource.isLoading.value,outputTargetsSettled:outputTargetsSettledForAutoStart.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`));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()},{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 resetAutoStart(){clearAutoStartTimer();resetOutputsAutoStartSettlement();resetLaunchStatusIdleRecovery()}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 autoStartReady(key,target){return 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})}watch(canLoadOutputs,canLoad=>{if(canLoad)return;resetAutoStart()},{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(()=>[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=autoStartReady(key,target);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(!autoStartReady(currentKey,currentTarget))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`||750<=0){start();return}autoStartTimer=window.setTimeout(start,750)},{flush:`post`,immediate:true});onBeforeUnmount(()=>{clearAutoStartTimer();clearAutoStartCooldownTimer();clearLaunchStatusIdleRecoveryTimer()});return{launchStatusIdleRecoveryExhausted,resetAutoStart}}var LAUNCH_STATUS_RETRY_LIMIT=2;var LAUNCH_STATUS_RETRY_BASE_DELAY_MS=1e3;var LAUNCH_STATUS_RETRY_MAX_DELAY_MS=5e3;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 outputTargetWorktreePath(session={}){return String(session?.sourcePath||``)}function launchControlsSessionCanRun(session={}){const metadata=normalizeObject(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 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`}var TERMINAL_STOP_POLL_INTERVAL_MS=100;var TERMINAL_STOP_POLL_ATTEMPTS=50;function delay(milliseconds=0){return new Promise(resolve=>setTimeout(resolve,milliseconds))}function useVibe64OutputLaunch({busy,embeddedPreview,outputs,outputTerminal,projectSlug}){const{canLoadOutputs,launchScopeKey,previewState,refresh,sessionId,sessionsApiPath,status,workspacePreparing}=outputs;const{activeOutputTarget,activeOutputTargetId,activeTerminal,applyLaunchTerminalSession,clearStaleLaunchTerminal,connectLaunchTerminal,terminal,terminalCanClose,terminalCanStop,terminalExpanded,terminalIndicatorState,terminalIsRunning}=outputTerminal;const{terminalMetadata,terminalSessionId}=terminal;const operationBusy=ref(false);const launchError=ref(``);const refusedAdmissionId=ref(``);const launchStarting=ref(false);const launchWaiting=ref(false);const autoStartKey=ref(``);let disposed=false;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 resourceAdmissionId=computed(()=>[`ready`,`starting`].includes(previewState.value)?``:refusedAdmissionId.value||String(status.value.resourceAdmissionId||``));const terminalCanRetry=computed(()=>Boolean(!terminalIsRunning.value&&activeOutputTargetId.value));const terminalCanRestart=computed(()=>Boolean(terminalCanStop.value&&activeOutputTargetId.value));const launchButtonsDisabled=computed(()=>Boolean(workspacePreparing.value||readRefOrGetterValue(busy)||operationBusy.value||terminalIsRunning.value));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 externalBusy=readRefOrGetterValue(busy);const currentSessionId=sessionId.value;const startedScopeKey=launchScopeKey.value;if(!currentSessionId||!canLoadOutputs.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||!canLoadOutputs.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}}async function acceptResourceRetry(result={}){if(result.ok===false)return;refusedAdmissionId.value=``;launchError.value=``;if(applyLaunchTerminalSession(result))connectLaunchTerminal();await refresh()}async function stopTerminal(){if(!sessionId.value||!terminalSessionId.value)return false;operationBusy.value=true;try{const stopped=await stopTerminalCommand.run({sessionId:sessionId.value,terminalSessionId:terminalSessionId.value});applyLaunchTerminalSession(stopped);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;if(!target)return false;return run(target,{applyDefaultDisplay:false,forceRestart:true})}async function retryTerminal(){if(!terminalCanRetry.value)return false;const target=activeOutputTarget.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});clearStaleLaunchTerminal();terminalExpanded.value=false;await refresh();return true}catch{return false}finally{operationBusy.value=false}}function resetLaunch(){autoStartKey.value=``;launchError.value=``;refusedAdmissionId.value=``;launchWaiting.value=false}watch([previewState,terminalIndicatorState,launchError],([state,indicator])=>{if(state===`ready`&&indicator===`running`){launchError.value=``;refusedAdmissionId.value=``;launchWaiting.value=false}});onBeforeUnmount(()=>{disposed=true});return{acceptResourceRetry,autoStartKey,closeTerminal,launchButtonsDisabled,launchError,launchStarting,launchWaiting,operationBusy,parametersForTarget,parametersRemembered,rememberParameters,resetLaunch,resourceAdmissionId,restartTerminal,retryTerminal,run,stopTerminal,terminalCanRestart,terminalCanRetry}}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_INTERACTION_MESSAGE_TYPE=`vibe64:preview-interaction`;var PREVIEW_PICK_RESULT_MESSAGE_TYPE=`vibe64:preview-pick-result`;var PREVIEW_PICK_START_MESSAGE_TYPE=`vibe64:preview-pick-start`;var PREVIEW_PICK_STOP_MESSAGE_TYPE=`vibe64:preview-pick-stop`;var PREVIEW_RECORDING_MESSAGE_TYPE=`vibe64:preview-recording`;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 localPreviewBrowserHref(){if(typeof window===`undefined`)return``;return String(window.location?.href||``)}function browserCanOpenTarget(target={}){return String(target.kind||`url`)===`url`&&Boolean(String(target.href||``).trim())}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 preview proxy 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 proxied 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 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]`}var LAUNCH_BROWSER_WINDOW_FEATURES=`popup,width=1400,height=900,left=80,top=60`;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 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 normalizeLaunchPreview(preview={}){const source=normalizeObject(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=isRecord(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 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=normalizeObject(status);const previewSource=normalizeObject(source.preview);const preview=normalizeLaunchPreview(previewSource);if(previewSource.state||preview.href||preview.targetHref)return preview;const previewTarget=normalizeObject(source.previewTarget);const openTarget=normalizeObject(source.openTarget);const href=String(previewTarget.href||openTarget.previewHref||``).trim();if(!href||previewTarget.available===false||openTarget.available===false)return preview;const activeTerminal=normalizeObject(source.activeTerminal);return normalizeLaunchPreview({canRestart:Boolean(activeTerminal.id||normalizeObject(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 launchTerminalIsReady(metadata={}){return metadata?.launchReady===true||metadata?.launchReady===`true`}function launchPreviewRequiresProxy(metadata={}){return Boolean(String(metadata?.previewAuth||``).trim())}function useVibe64OutputPreview({outputs,outputTerminal,projectSlug}){const{previewHref,previewMessage,previewRecovery,previewState,previewTarget,previewTargetHref,selectedSession,sessionId,sessionsApiPath,status}=outputs;const{activeOutputTarget,activeTerminal,terminal,terminalIsRunning,terminalLaunchReady}=outputTerminal;const{terminalMetadata}=terminal;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 previewIdentity=computed(()=>{const value=status.value.previewIdentity;return isRecord(value)?value:{available:false,defaultMode:`guest`,disabledReason:``,identities:[]}});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 terminalPreviewRequiresProxy=computed(()=>launchPreviewRequiresProxy({...activeTerminal.value?.metadata||{},...terminalMetadata.value||{}}));const previewTargetDisabledReason=computed(()=>![`ready`,`stale`].includes(previewState.value)?previewMessage.value:``);const previewTargetRecovery=computed(()=>previewRecovery.value);const terminalPreviewProxyPending=computed(()=>Boolean(terminalPreviewRequiresProxy.value&&terminalLaunchReady.value&&terminalIsRunning.value&&!previewHref.value));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})}function openAction(action={}){return openLaunchBrowserTarget(action,selectedSession.value,null,projectSlug.value)}return{launchActions,openAction,previewIdentity,previewTargetDisabledReason,previewTargetRecovery,previewTestNotice,publishPreviewDiagnostic,publishPreviewState,requestPreviewIdentityGrant,terminalPreviewProxyPending,terminalPreviewRequiresProxy}}function useVibe64OutputStatus({localLaunchStarting,projectSlug,session,sourceOperationsSuspended,windowDisplayed}){const paths=usePaths();const launchStatusAttempt=ref(0);const sourceOperationsResumePending=ref(false);let launchStatusAttemptLoading=false;let launchStatusAttemptScopeKey=``;const selectedSession=computed(()=>readRefOrGetterValue(session)||null);const sessionId=computed(()=>String(selectedSession.value?.sessionId||``));const sessionRevision=computed(()=>vibe64SessionRevision(selectedSession.value));const launchScopeKey=computed(()=>launchControlScopeKey(projectSlug.value,sessionId.value));const terminalDisplayed=computed(()=>readRefOrGetterValue(windowDisplayed)!==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 outputTargetsRequestPath=computed(()=>{const origin=typeof window===`undefined`?``:String(window.location?.origin||``);return outputTargetsPath.value&&origin?`${outputTargetsPath.value}?editorOrigin=${encodeURIComponent(origin)}`:outputTargetsPath.value});const outputTargetsResource=useEndpointResource({enabled:canLoadOutputs,fallbackLoadError:`Outputs could not be loaded.`,path:outputTargetsRequestPath,queryOptions:{retry:launchStatusShouldRetry,retryDelay:launchStatusRetryDelay},queryKey:computed(()=>vibe64OutputsQueryKey(`app`,ROUTE_VISIBILITY_PUBLIC,sessionId.value,projectSlug.value)),refreshOnPull:true,requestRecovery:false,realtime:null});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``;const error=outputTargetsResource.query?.error?.value||null;return launchStatusErrorText({error,fallback:outputTargetsResource.loadError.value,path:outputTargetsPath.value})});const preview=computed(()=>launchPreviewFromStatus(status.value));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 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(()=>isRecord(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 isRecord(value)?value:{error:null,mode:``,presentationKind:``,state:`idle`,targetId:``}});async function refresh({scopeKey=launchScopeKey.value}={}){if(!canLoadOutputs.value)return null;const refreshScopeKey=String(scopeKey||``).trim();if(!refreshScopeKey||refreshScopeKey!==launchScopeKey.value)return null;return typeof outputTargetsResource.query?.refetch===`function`?outputTargetsResource.query.refetch({cancelRefetch:true}):outputTargetsResource.reload()}async function startWorkspaceSetupWhen(status=``){if(String(selectedSession.value?.workspaceSetup?.status||``).trim()!==status||!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}}function resetLaunchStatusAttempt(){launchStatusAttempt.value=0;launchStatusAttemptLoading=false;launchStatusAttemptScopeKey=launchScopeKey.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:localLaunchStarting(),payload:context?.payload||{}},sessionId.value),onEvent:()=>refresh()});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});return{canLoadOutputs,launchScopeKey,launchStatusAttempt,launchStatusLoadError,outputExecution,outputResults,outputRuns,outputTargets,outputTargetsLoaded,outputTargetsResource,previewCanRestart,previewCanShowLog,previewCanStart,previewHref,previewMessage,previewRecovery,previewState,previewStoppedIntent,previewTarget,previewTargetHref,refresh,resetLaunchStatusAttempt,selectedSession,sessionId,sessionRevision,sessionsApiPath,startWorkspaceSetupWhen,status,terminalDisplayed,testApproval,workspacePreparing}}function useVibe64OutputTerminal({outputs,projectSlug}){const{outputExecution,outputTargets,selectedSession,sessionId,status,terminalDisplayed}=outputs;const terminalExpanded=ref(false);let attachedTerminalId=``;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,terminalExitCode,terminalExited,terminalMetadata,terminalOutput,terminalSessionId,terminalStarting,terminalStatus}=terminal;const activeTerminal=computed(()=>{const terminalStatusValue=status.value.activeTerminal;return isRecord(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 terminalLaunchReady=computed(()=>launchTerminalIsReady({...activeTerminal.value?.metadata||{},...terminalMetadata.value||{}}));const terminalIsRunning=computed(()=>{const statusValue=terminalStatus.value||activeTerminal.value?.status||``;return statusValue===`running`||statusValue===`closing`||terminalStarting.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 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 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.`});function applyLaunchTerminalSession(terminalSession={}){if(!terminalSession||terminalSession.ok===false||!terminalSession.id)return false;attachedTerminalId=terminalSession.id;applyTerminalSession(terminalSession,{fallbackStatus:`running`});return true}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()}function clearStaleLaunchTerminal(){attachedTerminalId=``;closeTerminalSocket();resetTerminalSessionState();resetTerminalDisplay()}function hideLaunchTerminal(){closeTerminalSocket();disposeTerminalDisplay()}function resetLaunchTerminal(){attachedTerminalId=``;closeTerminalSocket();disposeTerminalDisplay();resetTerminalSessionState();resetTerminalDisplay();terminalExpanded.value=false}async function copyLog(){if(!terminalOutput.value||typeof navigator===`undefined`||!navigator.clipboard?.writeText)return false;await navigator.clipboard.writeText(terminalOutput.value);return true}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});onBeforeUnmount(disposeTerminalUi);return{activeOutputTarget,activeOutputTargetId,activeTerminal,applyLaunchTerminalSession,clearStaleLaunchTerminal,connectLaunchTerminal,copyLog,expandTerminal,hideLaunchTerminal,minimizeTerminal,resetLaunchTerminal,terminal,terminalCanClose,terminalCanCopyLog,terminalCanStop,terminalDockVisible,terminalExpanded,terminalIndicatorLabel,terminalIndicatorState,terminalIsRunning,terminalLaunchReady,terminalSubtitle,terminalTitle,terminalVisible,terminalWindowStorageKey,terminalWindowVisible}}function useVibe64OutputControls({autoStartManagedPreview=()=>false,autoStartTargetId=()=>``,busy=()=>false,embeddedPreview=()=>false,previewDisplayed=()=>true,session=null,sourceOperationsSuspended=()=>false,windowDisplayed=()=>true}={}){const projectSlug=useVibe64ProjectSlug();const outputs=useVibe64OutputStatus({localLaunchStarting:()=>launch.launchStarting.value,projectSlug,session,sourceOperationsSuspended,windowDisplayed});const outputTerminal=useVibe64OutputTerminal({outputs,projectSlug});const preview=useVibe64OutputPreview({outputs,outputTerminal,projectSlug});const launch=useVibe64OutputLaunch({busy,embeddedPreview,outputs,outputTerminal,projectSlug});const autoStart=useVibe64OutputAutoStart({autoStartManagedPreview,autoStartTargetId,busy,launch,outputs,outputTerminal,previewDisplayed,projectSlug});const{terminal}=outputTerminal;const visible=computed(()=>Boolean((outputs.canLoadOutputs.value||outputTerminal.terminalVisible.value)&&(outputs.outputTargets.value.length>0||outputs.outputTargetsResource.loadError.value||outputTerminal.terminalVisible.value)));watch(terminal.terminalError,message=>{if(!terminalSessionMissingError(message))return;outputTerminal.clearStaleLaunchTerminal();outputs.refresh()});watch(outputs.terminalDisplayed,displayed=>{if(displayed){outputTerminal.connectLaunchTerminal();return}autoStart.resetAutoStart();outputTerminal.hideLaunchTerminal()});watch(outputs.launchScopeKey,()=>{launch.resetLaunch();outputs.resetLaunchStatusAttempt();autoStart.resetAutoStart();outputTerminal.resetLaunchTerminal()});return{activeOutputTarget:outputTerminal.activeOutputTarget,previewTestNotice:preview.previewTestNotice,activeOutputTargetId:outputTerminal.activeOutputTargetId,activeTerminal:outputTerminal.activeTerminal,closeTerminal:launch.closeTerminal,copyLog:outputTerminal.copyLog,expandTerminal:outputTerminal.expandTerminal,launchActions:preview.launchActions,launchButtonsDisabled:launch.launchButtonsDisabled,launchError:launch.launchError,resourceAdmissionId:launch.resourceAdmissionId,acceptResourceRetry:launch.acceptResourceRetry,testApproval:outputs.testApproval,launchStatusAttempt:outputs.launchStatusAttempt,launchStatusIdleRecoveryExhausted:autoStart.launchStatusIdleRecoveryExhausted,launchStarting:launch.launchStarting,launchWaiting:computed(()=>outputs.workspacePreparing.value||launch.launchWaiting.value),workspacePreparing:outputs.workspacePreparing,outputTargets:outputs.outputTargets,outputTargetsLoaded:outputs.outputTargetsLoaded,outputExecution:outputs.outputExecution,outputResults:outputs.outputResults,outputRuns:outputs.outputRuns,loading:outputs.outputTargetsResource.isLoading,loadError:outputs.launchStatusLoadError,minimizeTerminal:outputTerminal.minimizeTerminal,openAction:preview.openAction,operationBusy:launch.operationBusy,previewCanRestart:outputs.previewCanRestart,previewCanShowLog:outputs.previewCanShowLog,previewCanStart:outputs.previewCanStart,previewHref:outputs.previewHref,previewIdentity:preview.previewIdentity,previewMessage:outputs.previewMessage,previewState:outputs.previewState,previewStoppedIntent:outputs.previewStoppedIntent,previewTargetDisabledReason:preview.previewTargetDisabledReason,previewTargetHref:outputs.previewTargetHref,previewTargetRecovery:preview.previewTargetRecovery,terminalPreviewRequiresProxy:preview.terminalPreviewRequiresProxy,terminalPreviewProxyPending:preview.terminalPreviewProxyPending,publishPreviewState:preview.publishPreviewState,publishPreviewDiagnostic:preview.publishPreviewDiagnostic,requestPreviewIdentityGrant:preview.requestPreviewIdentityGrant,refresh:outputs.refresh,restartTerminal:launch.restartTerminal,retryTerminal:launch.retryTerminal,parametersForTarget:launch.parametersForTarget,parametersRemembered:launch.parametersRemembered,rememberParameters:launch.rememberParameters,run:launch.run,sendCtrlC:terminal.sendCtrlC,stopTerminal:launch.stopTerminal,startNewlyConfiguredWorkspaceSetup:()=>outputs.startWorkspaceSetupWhen(`unconfigured`),retryFailedWorkspaceSetup:()=>outputs.startWorkspaceSetupWhen(`failed`),terminal,terminalCanClose:outputTerminal.terminalCanClose,terminalCanCopyLog:outputTerminal.terminalCanCopyLog,terminalCanRestart:launch.terminalCanRestart,terminalCanRetry:launch.terminalCanRetry,terminalCanStop:outputTerminal.terminalCanStop,terminalCommandPreview:terminal.terminalCommandPreview,terminalDisplayed:outputs.terminalDisplayed,terminalDockVisible:outputTerminal.terminalDockVisible,terminalError:terminal.terminalError,terminalExpanded:outputTerminal.terminalExpanded,terminalExited:terminal.terminalExited,terminalExitCode:terminal.terminalExitCode,terminalIndicatorLabel:outputTerminal.terminalIndicatorLabel,terminalIndicatorState:outputTerminal.terminalIndicatorState,terminalIsRunning:outputTerminal.terminalIsRunning,terminalLaunchReady:outputTerminal.terminalLaunchReady,terminalMetadata:terminal.terminalMetadata,terminalOutput:terminal.terminalOutput,terminalSessionId:terminal.terminalSessionId,terminalStarting:terminal.terminalStarting,terminalStatus:terminal.terminalStatus,terminalSubtitle:outputTerminal.terminalSubtitle,terminalTitle:outputTerminal.terminalTitle,terminalVisible:outputTerminal.terminalVisible,terminalWindowStorageKey:outputTerminal.terminalWindowStorageKey,terminalWindowVisible:outputTerminal.terminalWindowVisible,visible}}function useVibe64OutputOptions({outputs,projectSlug,props,targets}){const{launchError,operationBusy,outputTargets,parametersForTarget,parametersRemembered,rememberParameters,run,terminalIsRunning}=outputs;const{outputOptionsTarget}=targets;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});return{openOutputOptions,outputOptionsAction,outputOptionsError,outputOptionsErrors,outputOptionsRemember,outputOptionsSelection,outputOptionsValues,outputOptionsVisible,resetOutputOptions,runWithOptions,submitOutputOptions}}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&¶m?.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_DISPLAY_QUERY_PARAMS=Object.freeze([PREVIEW_PROXY_TOKEN_QUERY_PARAM]);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 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 redactPreviewDebugDetails(value){if(typeof value===`string`)return value.includes(`vibe64_preview_token`)?previewUrlWithoutDisplayParams(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 useVibe64PreviewAddress({frame,projectSlug,props,targets}){const{previewBaseUrl,previewDebugLog,previewDisplayBaseUrl,previewReadyForIframe,previewVisitedUrl,requestPreviewFrame}=frame;const{previewContextTarget}=targets;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 previewLocationStorageKey=computed(()=>props.embeddedPreview&&props.session?launchPreviewLocationStorageKey(props.session,projectSlug.value):``);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 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);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 recordPreviewVisit(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});recordPreviewVisit(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}watch(previewLocationStorageKey,(storageKey,previousStorageKey)=>{if(storageKey===previousStorageKey)return;previewVisitedUrl.value=``;resetPreviewHistory(``)},{flush:`sync`,immediate:true});watch([previewReadyForIframe,previewBaseUrl,previewDisplayBaseUrl],([,,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)}},{flush:`sync`,immediate:true});watch(previewDisplayedAddress,url=>{if(!previewAddressFocused.value)previewAddressDraft.value=url||``},{immediate:true});return{copyPreviewUrl,goPreviewBack,openPreviewRoute,previewAddressBlur,previewAddressDraft,previewAddressError,previewAddressFocus,previewBackAvailable,previewDisplayedAddress,previewDisplayedUrl,previewRouteDialogError,previewRouteDialogParams,previewRouteDialogPath,previewRouteDialogVisible,previewRouteFormValues,previewRouteSelection,previewRoutes,previewRoutesAvailable,resetPreviewAddressDraft,recordPreviewVisit,submitPreviewAddress,submitPreviewRouteDialog}}var ORIENTATION_AVAILABLE_MESSAGE_TYPE=`orientation-available`;var ORIENTATION_INIT_MESSAGE_TYPE=`orientation-init`;var ORIENTATION_PROTOCOL_VERSION=1;var PACKET_FIELDS=Object.freeze([`type`,`protocolVersion`,`playerInstanceId`,`instanceId`]);function isOrientationAnnouncement(value){return value?.type===ORIENTATION_AVAILABLE_MESSAGE_TYPE}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 exactFields(value,fields){return value&&typeof value===`object`&&!Array.isArray(value)&&Object.keys(value).sort().join(`,`)===fields.slice().sort().join(`,`)}function useVibe64LearningOrientation({preview,frameVisible}){const learning=useVibe64Learning();const reportActivity=usePageActivity();let orientation=null;function frameCurrent(channel){const current=preview();return orientation===channel&&Boolean(current)&¤t.frame===channel.frame&¤t.frame?.contentWindow===channel.window&¤t.frameRequestId===channel.frameRequestId&¤t.sessionId===channel.sessionId&¤t.terminalSessionId===channel.terminalSessionId&¤t.projectSlug===channel.projectSlug}function channelVisible(channel){return frameCurrent(channel)&&frameVisible(channel.frame)}function retireInteraction(channel=orientation){if(channel)channel.pending=null}function close(){retireInteraction();orientation?.port?.close();orientation=null}function interactionCurrent(channel,pending){return channel.pending===pending&&channelVisible(channel)&&learning.exerciseCurrent(pending.ticket)}function handlePacket(channel,input){if(!frameCurrent(channel))return;if(input?.protocolVersion!==ORIENTATION_PROTOCOL_VERSION||input.playerInstanceId!==channel.playerInstanceId||input.instanceId!==channel.instanceId){retireInteraction(channel);return}if(input.type===`ready`&&exactFields(input,PACKET_FIELDS)){channel.ready=true;return}if(!channel.ready||!channelVisible(channel)){retireInteraction(channel);return}if(input.type===`button`&&exactFields(input,[...PACKET_FIELDS,`interactionId`])&&orientationUuid(input.interactionId)){retireInteraction(channel);reportActivity(`app-pressed`,{projectSlug:channel.projectSlug,sessionId:channel.sessionId});const ticket=learning.beginExercise(channel.projectSlug);if(ticket)channel.pending={ticket,interactionId:input.interactionId,phase:`button`};return}const pending=channel.pending;if(!pending||input.interactionId!==pending.interactionId)return;if(!interactionCurrent(channel,pending)){retireInteraction(channel);return}if(input.type===`request`&&pending.phase===`button`&&typeof input.method===`string`&&typeof input.path===`string`&&exactFields(input,[...PACKET_FIELDS,`interactionId`,`method`,`path`])){pending.phase=`request`;return}if(input.type===`response-displayed`&&pending.phase===`request`&&orientationUuid(input.requestId)&&typeof input.message===`string`&&exactFields(input,[...PACKET_FIELDS,`interactionId`,`requestId`,`message`])){retireInteraction(channel);learning.finishExercise(pending.ticket,{sessionId:channel.sessionId,instanceId:channel.instanceId,interactionId:pending.interactionId,requestId:input.requestId});return}retireInteraction(channel)}function connect(){const channel=orientation;if(!channel||channel.port||!frameCurrent(channel)||!preview()?.loaded)return;const ports=new MessageChannel;channel.port=ports.port1;channel.port.onmessage=event=>handlePacket(channel,event.data);channel.port.onmessageerror=()=>retireInteraction(channel);channel.port.start();try{channel.window.postMessage({type:ORIENTATION_INIT_MESSAGE_TYPE,protocolVersion:ORIENTATION_PROTOCOL_VERSION,playerInstanceId:channel.playerInstanceId},channel.origin,[ports.port2])}catch{ports.port2.close();close()}}function announce(event){const current=preview();if(!exactFields(event.data,[`type`,`protocolVersion`,`instanceId`])||event.data.protocolVersion!==ORIENTATION_PROTOCOL_VERSION||!orientationUuid(event.data.instanceId)||event.ports?.length||!current?.frameRequestId||!current.projectSlug||!current.sessionId||!current.terminalSessionId)return;learning.prepareExercise(current.projectSlug);if(orientation&&frameCurrent(orientation)&&orientation.instanceId===event.data.instanceId)return;close();orientation={frame:current.frame,window:event.source,origin:event.origin,frameRequestId:current.frameRequestId,projectSlug:current.projectSlug,sessionId:current.sessionId,terminalSessionId:current.terminalSessionId,instanceId:event.data.instanceId,playerInstanceId:crypto.randomUUID(),ready:false,port:null,pending:null};connect()}function invalidateHidden(){if(orientation?.pending&&!interactionCurrent(orientation,orientation.pending))retireInteraction()}watch(()=>{const current=preview();return[current?.frame,current?.frameRequestId,current?.loaded,current?.displayed,current?.projectSlug,current?.sessionId,current?.terminalSessionId,learning.exerciseStep(current?.projectSlug)]},()=>{if(orientation&&!frameCurrent(orientation))close();else connect();invalidateHidden()},{flush:`sync`});onBeforeMount(()=>{document.addEventListener(`visibilitychange`,invalidateHidden)});onBeforeUnmount(()=>{document.removeEventListener(`visibilitychange`,invalidateHidden);close()});return{announce,close}}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,fallback=`Preview capture failed.`){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((typeof error===`string`?error:error?.message)||``).trim()||fallback}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 canDeliver=typeof prepareFile===`function`||typeof attachFile===`function`;const supported=computed(()=>session.supported());const buttonVisible=computed(()=>previewCaptureAvailable({canAttach:canDeliver,displayed:readRefOrGetterValue(previewDisplayed)===true,loaded:readRefOrGetterValue(previewLoaded)===true,supported:supported.value,visible:visible.value}));async function deliverPreviewFile({attachFailureMessage=`The preview file could not be attached to the current message.`,busy:deliveryBusy,failureMessage=`The preview file could not be attached.`,fileName,produce}){if(deliveryBusy.value||!canDeliver)return false;deliveryBusy.value=true;noticeVisible.value=false;try{const result=typeof prepareFile===`function`?await prepareFile({fileName,produce}):await attachFile(await produce({}));if(!(Array.isArray(result)?result.length>0:Boolean(result))){if(typeof prepareFile===`function`)return false;throw new Error(attachFailureMessage)}noticeText.value=``;noticeVisible.value=false;return true}catch(error){if(error?.name===`AbortError`||error?.code===`capture_cancelled`)return false;noticeColor.value=`error`;noticeText.value=previewCaptureErrorMessage(error,failureMessage);noticeVisible.value=true;return false}finally{deliveryBusy.value=false}}async function capturePreview(){if(busy.value||!currentVisibleRect())return false;try{return await deliverPreviewFile({attachFailureMessage:`The preview image could not be attached to the current message.`,busy,failureMessage:`Preview capture failed.`,fileName:`Preview screenshot`,produce:({signal}={})=>{const stopCapture=()=>session.stop();signal?.addEventListener?.(`abort`,stopCapture,{once:true});return session.capture(currentVisibleRect).finally(()=>{signal?.removeEventListener?.(`abort`,stopCapture)})}})}finally{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,deliverPreviewFile,noticeColor,noticeText,noticeVisible,refreshVisibility,supported,visible}}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 isPreviewBridgeReadyMessage(value={}){return String(value?.type||``)===PREVIEW_BRIDGE_READY_MESSAGE_TYPE}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 previewLoadingOverlayShouldShow({identityBusy=false,loadedFrameRequestId=0,previewFrameRequestId=0,previewUrl=``}={}){return Boolean(identityBusy||previewOpeningOverlayVisible({loadedFrameRequestId,previewFrameRequestId,previewUrl}))}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,targetOrigin=``,targetWindow=null,timeoutMessage=`The application preview did not respond in time.`,timeoutMs=3e3}={}){if(!targetOrigin||!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},targetOrigin)}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})}var PREVIEW_DIAGNOSTICS_TIMEOUT_MS=3e3;var PREVIEW_IDENTITY_TIMEOUT_MS=1e4;function useVibe64PreviewFrame({followIdentityReload,identityBusy,identityFrameReady,outputs,projectSlug,props,resourceRetryCount}){const{activeOutputTargetId,launchActions,previewState,publishPreviewDiagnostic,terminalPreviewRequiresProxy,terminalSessionId}=outputs;const previewFrame=ref(null);const previewSuspended=ref(false);const previewBridgeVersion=ref(0);let previewBridgeOrigin=``;const previewBridgeRequests=createPreviewBridgeRequestRegistry();const previewDiagnosticsBusy=ref(false);const previewPicking=ref(false);const previewFrameRequest=ref({id:0,identity:``,src:``});const previewLoadedFrameRequestId=ref(0);const previewVisitedUrl=ref(``);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 previewPaneDisplayed=computed(()=>props.previewDisplayed!==false);const previewReadyForIframe=computed(()=>Boolean([`ready`,`stale`].includes(previewState.value)&&previewBaseUrl.value));const previewIdentityLifecycleKey=computed(()=>previewIdentityLifecycleIdentity({outputTargetId:activeOutputTargetId.value,previewBaseUrl:previewBaseUrl.value,projectSlug:projectSlug.value,sessionId:props.session?.sessionId,terminalSessionId:terminalSessionId.value}));const previewFrameRequestId=computed(()=>previewFrameRequest.value.id);const previewUrl=computed(()=>previewFrameRequest.value.src);const previewFrameLoaded=computed(()=>Boolean(previewUrl.value&&previewFrameRequestId.value>0&&previewLoadedFrameRequestId.value===previewFrameRequestId.value));const previewDiagnosticsAvailable=computed(()=>Boolean(previewFrameLoaded.value&&previewFrame.value?.contentWindow&&previewBridgeVersion.value>=8));const previewLoadingOverlayVisible=computed(()=>previewLoadingOverlayShouldShow({identityBusy:identityBusy(),loadedFrameRequestId:previewLoadedFrameRequestId.value,previewFrameRequestId:previewFrameRequestId.value,previewUrl:previewUrl.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??resourceRetryCount(),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=``){switchPreviewPicking(false);previewBridgeVersion.value=0;previewBridgeOrigin=``;previewBridgeRequests.rejectAll(`The application preview changed.`);previewDiagnosticsBusy.value=false;previewDebugLog(`bridge.reset`,{reason})}function postToPreviewBridge(message={}){const target=previewFrame.value?.contentWindow;if(!target||!previewBridgeOrigin)return false;target.postMessage({...message,version:8},previewBridgeOrigin);return true}function previewPickKeydown(event){if(event?.key===`Escape`)stopPreviewPick()}function switchPreviewPicking(picking){if(previewPicking.value===picking)return;previewPicking.value=picking;if(picking)window.addEventListener(`keydown`,previewPickKeydown);else window.removeEventListener(`keydown`,previewPickKeydown)}function stopPreviewPick(){if(previewPicking.value){switchPreviewPicking(false);postToPreviewBridge({type:PREVIEW_PICK_STOP_MESSAGE_TYPE})}}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}))}const orientation=useVibe64LearningOrientation({preview:()=>props.embeddedPreview&&previewUrl.value?{frame:previewFrame.value,frameRequestId:previewFrameRequestId.value,loaded:previewFrameLoaded.value,displayed:previewPaneDisplayed.value&&props.windowDisplayed!==false,projectSlug:projectSlug.value,sessionId:props.session?.sessionId,terminalSessionId:terminalSessionId.value}:null,frameVisible:previewFrameVisible});function clearPreviewFrame(reason=``){orientation.close();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:activeOutputTargetId.value,sessionId:props.session?.sessionId,src:nextSrc,terminalSessionId:terminalSessionId.value});if(!nextIdentity||!force&&nextIdentity===previewFrameRequest.value.identity)return false;orientation.close();resetPreviewBridge(reason||`frame-requested`);previewFrameRequest.value={id:previewFrameRequest.value.id+1,identity:nextIdentity,src:nextSrc};followIdentityReload(previewFrameRequest.value.id);previewDebugLog(`frame.requested`,{force,reason,src:nextSrc});return true}function requestPreviewState(){if(!previewPaneDisplayed.value||!previewFrame.value?.contentWindow||!previewUrl.value||!previewBridgeOrigin){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},previewBridgeOrigin)}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,targetOrigin:previewBridgeOrigin,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},targetOrigin:previewBridgeOrigin,targetWindow:previewFrame.value?.contentWindow,timeoutMessage:`The application preview did not complete the identity exchange in time.`,timeoutMs:PREVIEW_IDENTITY_TIMEOUT_MS})}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});identityFrameReady(normalizedRequestId);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()}function receivePreviewBridgeMessage(event){const bridgeReady=isPreviewBridgeReadyMessage(event.data);if(bridgeReady&&previewFrameLoaded.value){orientation.close();resetPreviewBridge(`bridge-document-ready`)}previewBridgeVersion.value=Math.max(previewBridgeVersion.value,Math.max(0,Number(event?.data?.version)||0));if(bridgeReady){previewBridgeOrigin=String(event.origin||``);markPreviewFrameReady(previewFrameRequestId.value,`bridge-ready`)}return bridgeReady}function cancelPreviewBridgeRequests(message){previewBridgeRequests.rejectAll(message);previewDiagnosticsBusy.value=false}onBeforeUnmount(()=>{stopPreviewPick();previewBridgeRequests.rejectAll(`The application preview closed.`)});return{cancelPreviewBridgeRequests,clearPreviewFrame,handlePreviewFrameLoad,orientation,postToPreviewBridge,previewBaseUrl,previewBridgeRequests,previewBridgeVersion,previewDebugLog,previewDiagnosticsAvailable,previewDiagnosticsBusy,previewDisplayBaseUrl,previewEmbedUnavailableReason,previewFrame,previewFrameLoaded,previewFrameRequestId,previewIdentityLifecycleKey,previewLoadingOverlayVisible,previewPaneDisplayed,previewPicking,previewReadyForIframe,previewSuspended,previewUrl,previewVisitedUrl,receivePreviewBridgeMessage,requestPreviewDiagnostics,requestPreviewFrame,requestPreviewIdentityExchange,requestPreviewState,switchPreviewPicking,stopPreviewPick}}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]);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 defaultPreviewIdentitySelection({capability=null}={}){const name=String(capability?.defaultIdentityName||``).trim();return capability?.defaultMode===`identity`&&name?{identityName:name,mode:`identity`}:{mode:`guest`}}function useVibe64PreviewIdentity({frame,outputs,props}){const{previewIdentity:previewIdentityCapability,requestPreviewIdentityGrant}=outputs;const{cancelPreviewBridgeRequests,orientation,previewFrameLoaded,previewFrameRequestId,previewIdentityLifecycleKey,previewSuspended,requestPreviewFrame,requestPreviewIdentityExchange}=frame;const previewIdentityBusy=ref(false);const previewIdentityCurrent=ref(null);const previewIdentityError=ref(``);const previewIdentityRequested=ref(null);let previewIdentityAutomaticAttempt=``;let previewIdentityResumeSelection=null;let previewIdentityLifecycle=``;let previewIdentityReloadRequestId=0;const previewIdentityAvailable=computed(()=>Boolean(props.embeddedPreview&&previewIdentityCapability.value?.available===true));const previewIdentityConfigured=computed(()=>normalizeConfiguredPreviewIdentities(previewIdentityCapability.value?.identities));const previewIdentityLabel=computed(()=>previewIdentityLabelText({busy:previewIdentityBusy.value,identity:previewIdentityCurrent.value}));const previewIdentityTitle=computed(()=>previewIdentityTitleText({busy:previewIdentityBusy.value,error:previewIdentityError.value,identity:previewIdentityCurrent.value}));const previewIdentitySelectionDisabled=computed(()=>Boolean(previewIdentityBusy.value||!previewFrameLoaded.value));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 followIdentityReload(frameRequestId){if(previewIdentityReloadRequestId>0)previewIdentityReloadRequestId=frameRequestId}function handlePreviewFrameReady(frameRequestId){if(frameRequestId===previewIdentityReloadRequestId){completePreviewIdentityTransition();return}beginDefaultPreviewIdentity()}function rememberPreviewIdentityForResume(){previewIdentityResumeSelection=previewIdentityRequested.value}function allowResumedPreviewIdentity(){if(previewIdentityResumeSelection)previewIdentityAutomaticAttempt=``}watch(previewIdentityLifecycleKey,lifecycle=>{if(lifecycle===previewIdentityLifecycle)return;orientation.close();previewIdentityLifecycle=lifecycle;previewIdentityAutomaticAttempt=``;previewIdentityResumeSelection=null;resetPreviewIdentityState();cancelPreviewBridgeRequests(`The active application preview changed.`)},{flush:`sync`,immediate:true});watch(previewIdentityAvailable,available=>{if(available&&previewFrameLoaded.value)beginDefaultPreviewIdentity()});return{allowResumedPreviewIdentity,completePreviewIdentityTransition,followIdentityReload,handlePreviewFrameReady,previewIdentityAvailable,previewIdentityBusy,previewIdentityConfigured,previewIdentityCurrent,previewIdentityError,previewIdentityLabel,previewIdentityRequested,previewIdentitySelectionDisabled,previewIdentityTitle,rememberPreviewIdentityForResume,selectPreviewConfiguredIdentity,selectPreviewGuest}}function useVibe64PreviewMessages({address,frame,outputs,pick,reload}){const{launchActions,publishPreviewState}=outputs;const{orientation,previewBaseUrl,previewBridgeRequests,previewDebugLog,previewDisplayBaseUrl,previewFrame,previewSuspended,receivePreviewBridgeMessage}=frame;const{recordPreviewVisit}=address;const{finishPreviewPick,forwardPreviewInteraction,publishPreviewRecording}=pick;const{handlePreviewResourceFailure}=reload;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_INTERACTION_MESSAGE_TYPE,PREVIEW_LOCATION_MESSAGE_TYPE,PREVIEW_PICK_RESULT_MESSAGE_TYPE,PREVIEW_RESOURCE_FAILURE_MESSAGE_TYPE].includes(previewMessageType(value))}function handlePreviewBridgeMessage(event){if(previewSuspended.value)return;const orientationAvailable=isOrientationAnnouncement(event?.data);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){orientation.announce(event);return}const messageType=previewMessageType(event.data);if(receivePreviewBridgeMessage(event)){publishPreviewRecording();return}if(messageType===`vibe64:preview-pick-result`){finishPreviewPick(event.data);return}if(messageType===`vibe64:preview-interaction`){forwardPreviewInteraction(event.data);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){recordPreviewVisit(frameUrl,{reason:String(event?.data?.reason||``)});publishPreviewState({route:previewRouteFromUrl(frameUrl),title:String(event?.data?.title||``)})}}onBeforeMount(()=>{window.addEventListener(`message`,handlePreviewBridgeMessage)});onBeforeUnmount(()=>{window.removeEventListener(`message`,handlePreviewBridgeMessage)})}var PREVIEW_PICK_NO_COMPONENT_TEXT=`No component information on this page. Record while clicking to see its requests.`;var PREVIEW_PICK_NOT_SCANNED_TEXT=`This project has not been scanned yet. Refresh the architecture scan in Usage, then pick again.`;function previewComponentSourcePath(file=``,sourceRoot=``){const relative=String(sourceEditorLinkTarget({href:String(file||``),sourceRoot})?.path||``);return relative.split(`/`).every(part=>part&&part!==`.`&&part!==`..`)?relative:``}function previewPickColors(element){const style=element&&typeof globalThis.getComputedStyle===`function`?globalThis.getComputedStyle(element):null;const hex=name=>{const channels=String(style?.getPropertyValue(name)||``).match(/^\s*rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)\s*$/u)?.slice(1).map(Number);return channels?.every(channel=>channel<=255)?`#${channels.map(channel=>channel.toString(16).padStart(2,`0`)).join(``)}`:``};const color=hex(`--v64-primary`);const onColor=hex(`--v64-on-primary`);return color&&onColor?{color,onColor}:{}}function previewUsageEntryForFile(entries=[],file=``){const matches=(Array.isArray(entries)?entries:[]).filter(entry=>entry?.id&&entry.file===file);return matches.find(entry=>entry.kind===`component`)||matches.find(entry=>entry.kind===`page`)||null}function useVibe64PreviewPick({frame,props,usage:{openUsage,readUsageEntries,recordInteraction,recording}}){const{postToPreviewBridge,previewBridgeVersion,previewFrame,previewFrameLoaded,previewPaneDisplayed,previewPicking,previewSuspended,switchPreviewPicking,stopPreviewPick}=frame;const previewPickBusy=ref(false);const previewPickNoticeText=ref(``);const previewPickNoticeVisible=ref(false);const previewPickNoticeOpensUsage=ref(false);const previewInteractions={forwarded:0,highest:0,recordingId:``};const previewPickAvailable=computed(()=>Boolean(typeof readUsageEntries===`function`&&previewFrameLoaded.value&&previewPaneDisplayed.value&&!previewSuspended.value&&previewBridgeVersion.value>=8));const previewRecordingId=computed(()=>{const current=toValue(recording);return current?.state===`recording`&¤t?.target?.kind===`web`?String(current.id||``):``});const previewRecordedInteractions=computed(()=>previewRecordingId.value?Math.max(0,Number(toValue(recording)?.highestInteraction)||0):0);function showPreviewPickNotice(text,{opensUsage=false}={}){previewPickNoticeText.value=text;previewPickNoticeOpensUsage.value=opensUsage&&typeof openUsage===`function`;previewPickNoticeVisible.value=true}function openUsageFromPickNotice(){previewPickNoticeVisible.value=false;openUsage?.({mode:`calls`})}function togglePreviewPick(){if(previewPicking.value){stopPreviewPick();return false}if(!previewPickAvailable.value||previewPickBusy.value)return false;switchPreviewPicking(postToPreviewBridge({type:PREVIEW_PICK_START_MESSAGE_TYPE,...previewPickColors(previewFrame.value)}));return previewPicking.value}async function finishPreviewPick(result={}){if(!previewPicking.value)return null;switchPreviewPicking(false);if(result?.cancelled===true)return null;const file=previewComponentSourcePath(result?.componentFile,props.session?.sourcePath);if(!file){showPreviewPickNotice(PREVIEW_PICK_NO_COMPONENT_TEXT);return null}previewPickBusy.value=true;try{const answer=await readUsageEntries({limit:50,q:file.slice(-80)});const entry=previewUsageEntryForFile(answer?.entries,file);if(!entry){showPreviewPickNotice(`${file.split(`/`).pop()} has no usage entry yet. Refresh the architecture scan, then pick again.`,{opensUsage:true});return null}openUsage?.({entryId:entry.id,mode:`calls`});return entry}catch(error){if(error?.code===`vibe64_genesis_city_missing`)showPreviewPickNotice(PREVIEW_PICK_NOT_SCANNED_TEXT,{opensUsage:true});else showPreviewPickNotice(String(error?.message||``).trim()||`Usage could not be read. Pick again.`);return null}finally{previewPickBusy.value=false}}function publishPreviewRecording(){const recordingId=previewRecordingId.value;if(previewInteractions.recordingId!==recordingId)Object.assign(previewInteractions,{forwarded:0,highest:0,recordingId});previewInteractions.highest=Math.max(previewInteractions.highest,previewRecordedInteractions.value);postToPreviewBridge({active:Boolean(recordingId),nextInteraction:previewInteractions.highest+1,recordingId:recordingId||null,type:PREVIEW_RECORDING_MESSAGE_TYPE})}async function forwardPreviewInteraction(data={}){const id=String(data?.id||``);const recordingId=previewRecordingId.value;if(typeof recordInteraction!==`function`||!recordingId||recordingId!==previewInteractions.recordingId||!USAGE_INTERACTION_ID_PATTERN.test(id)||Number(id.slice(2))<=previewInteractions.highest||previewInteractions.forwarded>=USAGE_RECORDING_LIMITS.interactions)return;previewInteractions.highest=Number(id.slice(2));previewInteractions.forwarded+=1;const at=Date.parse(String(data?.at||``));const result=await recordInteraction({at:new Date(Number.isFinite(at)?at:Date.now()).toISOString(),componentFile:previewComponentSourcePath(data?.componentFile,props.session?.sourcePath)||null,id,kind:[`enter`,`submit`].includes(data?.kind)?data.kind:`click`,label:String(data?.elementLabel||``).trim().slice(0,80)||`element`});const next=Number(result?.nextInteraction);if(result?.ok===false&&Number.isSafeInteger(next)&&previewInteractions.recordingId===recordingId){previewInteractions.highest=Math.max(previewInteractions.highest,next-1);publishPreviewRecording()}}watch([previewRecordingId,previewRecordedInteractions],publishPreviewRecording);watch(previewPickAvailable,available=>{if(!available)stopPreviewPick()},{flush:`sync`});return{finishPreviewPick,forwardPreviewInteraction,openUsageFromPickNotice,previewPickAvailable,previewPickBusy,previewPickNoticeOpensUsage,previewPickNoticeText,previewPickNoticeVisible,publishPreviewRecording,togglePreviewPick}}var LAUNCH_PREVIEW_TOOLBAR_POSITIONS=Object.freeze([`left`,`center`,`right`]);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 launchToolbarDockShouldShow({embeddedPreview=false,embeddedTerminalVisible=false,previewIssueVisible=false,terminalDockVisible=false,terminalVisible=false}={}){if(!embeddedPreview)return Boolean(terminalDockVisible);if(previewIssueVisible)return true;return Boolean(terminalVisible||embeddedTerminalVisible)}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 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 useVibe64PreviewPresentation({address,frame,identity,outputs,props,recovery,targets}){const{activeOutputTarget,launchError,launchStarting,launchStatusAttempt,launchWaiting,loadError,loading,operationBusy,outputTargets,outputTargetsLoaded,previewCanRestart,previewCanStart,previewMessage,previewState,terminalCanRestart,terminalCanRetry,terminalDisplayed,terminalDockVisible,terminalExpanded,terminalIsRunning,terminalVisible,workspacePreparing}=outputs;const{embeddedManualStartButtonVisible,embeddedStartTarget,outputSetupUnavailableReason}=targets;const{previewRestartPending}=recovery;const{previewEmbedUnavailableReason,previewLoadingOverlayVisible,previewSuspended,previewUrl}=frame;const{previewIdentityBusy,previewIdentityRequested}=identity;const{previewDisplayedAddress}=address;const previewLogVisible=ref(false);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 previewCheckAgainVisible=computed(()=>Boolean(props.embeddedPreview&&previewState.value===`idle`&&!previewUrl.value&&!terminalVisible.value&&outputSetupUnavailableReason.value&&!loadError.value));const previewSetupRetryVisible=computed(()=>Boolean(previewCheckAgainVisible.value&&String(props.session?.workspaceSetup?.status||``).trim()===`failed`));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 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));return{embeddedTerminalFrameVisible,embeddedTerminalSurfaceVisible,embeddedTerminalVisible,launchStatusChipText,launchStatusChipTitle,launchStatusChipVisible,launchStatusDetailText,launchStatusRetryVisible,launchStatusText,launchToolbarDockVisible,previewActivityVisible:computed(()=>Boolean(previewStarting.value||launchStarting.value||launchWaiting.value||terminalIsRunning.value||loading.value)),previewBrowserControlsVisible,previewCheckAgainVisible,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})),previewInFlightText,previewIssue,previewIssueVisible,previewLogVisible,previewNotice,previewNoticeVisible,previewRecoveryLabel,previewRecoveryVisible,previewSetupRetryVisible,previewStarting,previewTerminalRecoveryVisible,previewToolbarRecoveryVisible}}function useVibe64PreviewRecovery({outputs,projectSlug,props,targets}){const{loadError,operationBusy,outputTargets,previewCanRestart,previewCanStart,previewState,previewStoppedIntent,previewTestNotice,refresh:refreshOutputs,resourceAdmissionId,restartTerminal,retryFailedWorkspaceSetup,retryTerminal,run,startNewlyConfiguredWorkspaceSetup,terminalCanRestart,terminalCanRetry,terminalIsRunning,testApproval}=outputs;const{embeddedStartTarget}=targets;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}});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}async function retryLaunchStatus(){await startNewlyConfiguredWorkspaceSetup?.();await refreshOutputs()}async function retryPreviewWorkspaceSetup(){await retryFailedWorkspaceSetup?.();await refreshOutputs()}return{forceStartEmbeddedPreview,previewRestartPending,previewWorkNotice,recheckResourceAdmission,recoverEmbeddedPreview,retryLaunchStatus,retryPreviewWorkspaceSetup}}var PREVIEW_RESOURCE_RETRY_DELAY_MS=250;var PREVIEW_RESOURCE_RETRY_LIMIT=1;function useVibe64PreviewReload({frame,identity,outputs,projectSlug,props}){const{refresh:refreshOutputs}=outputs;const{clearPreviewFrame,previewDebugLog,previewFrameRequestId,previewIdentityLifecycleKey,previewSuspended,previewUrl,requestPreviewFrame}=frame;const{allowResumedPreviewIdentity,completePreviewIdentityTransition,rememberPreviewIdentityForResume}=identity;const reportActivity=usePageActivity();const previewResourceNoticeText=ref(``);const previewResourceNoticeVisible=ref(false);let previewResourceRetryCount=0;let previewResourceRetryLifecycle=``;let previewResourceRetryTimer=null;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 suspendPreview(){rememberPreviewIdentityForResume();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;allowResumedPreviewIdentity();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}function currentPreviewResourceRetryCount(){return previewResourceRetryCount}watch(previewIdentityLifecycleKey,(lifecycle,previousLifecycle)=>{if(lifecycle===previousLifecycle)return;resetPreviewResourceRecovery(lifecycle)},{flush:`sync`,immediate:true});onBeforeUnmount(cancelPreviewResourceRetry);return{cancelPreviewResourceRetry,currentPreviewResourceRetryCount,handlePreviewResourceFailure,previewResourceNoticeText,previewResourceNoticeVisible,reloadPreview,resumePreview,suspendPreview}}function useVibe64PreviewTargets({outputs,props}){const{activeOutputTarget,launchButtonsDisabled,loading,operationBusy,outputTargets,terminalVisible}=outputs;const runMenuDisabled=computed(()=>Boolean(launchButtonsDisabled.value||loading.value||outputTargets.value.length<1));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 previewContextTarget=computed(()=>embeddedAutoStartTarget.value||activeOutputTarget.value||embeddedStartTarget.value||null);const outputOptionsTarget=computed(()=>activeOutputTarget.value||previewContextTarget.value);return{embeddedAutoStartTarget,embeddedManualStartButtonDisabled,embeddedManualStartButtonVisible,embeddedStartTarget,manualLaunchMenuVisible,outputOptionsAvailable:computed(()=>Boolean(outputOptionsTarget.value?.parameters?.length)),outputOptionsTarget,outputSetupUnavailableReason,previewContextTarget,runMenuDisabled}}function useVibe64PreviewToolbar({projectSlug,props}){const previewToolbarExpanded=ref(false);const previewToolbarPosition=ref(`center`);const previewToolbarStorageKey=computed(()=>props.embeddedPreview&&props.session?launchPreviewToolbarStorageKey(props.session,projectSlug.value):``);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}watch(previewToolbarStorageKey,storageKey=>{previewToolbarExpanded.value=false;previewToolbarPosition.value=normalizeLaunchPreviewToolbarPosition(readLocalStorageJson(storageKey,`center`))},{immediate:true});return{collapsePreviewToolbar,expandPreviewToolbar,movePreviewToolbar,previewToolbarExpanded,previewToolbarPosition}}function useVibe64OutputControlsSurface(props,{openUsage=null,readUsageEntries=null,recordInteraction=null,recording=null}={}){const outputs=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 projectSlug=useVibe64ProjectSlug();const targets=useVibe64PreviewTargets({outputs,props});const options=useVibe64OutputOptions({outputs,projectSlug,props,targets});const recovery=useVibe64PreviewRecovery({outputs,projectSlug,props,targets});const toolbar=useVibe64PreviewToolbar({projectSlug,props});const frame=useVibe64PreviewFrame({followIdentityReload:frameRequestId=>identity.followIdentityReload(frameRequestId),identityBusy:()=>identity.previewIdentityBusy.value,identityFrameReady:frameRequestId=>identity.handlePreviewFrameReady(frameRequestId),outputs,projectSlug,props,resourceRetryCount:()=>reload.currentPreviewResourceRetryCount()});const identity=useVibe64PreviewIdentity({frame,outputs,props});const reload=useVibe64PreviewReload({frame,identity,outputs,projectSlug,props});const address=useVibe64PreviewAddress({frame,projectSlug,props,targets});const pick=useVibe64PreviewPick({frame,props,usage:{openUsage,readUsageEntries,recordInteraction,recording}});useVibe64PreviewMessages({address,frame,outputs,pick,reload});const presentation=useVibe64PreviewPresentation({address,frame,identity,outputs,props,recovery,targets});const{expandTerminal,minimizeTerminal,outputTargetsLoaded,previewState}=outputs;const{collapsePreviewToolbar}=toolbar;const{clearPreviewFrame,previewBaseUrl,previewDisplayBaseUrl,previewPaneDisplayed,previewReadyForIframe,previewSuspended,requestPreviewFrame,requestPreviewState}=frame;const{previewLogVisible}=presentation;const{cancelPreviewResourceRetry}=reload;const toolbarTeleportTarget=computed(()=>String(props.toolbarTeleportTarget||``).trim());watch([previewReadyForIframe,previewBaseUrl,previewDisplayBaseUrl],([ready,baseUrl])=>{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`});function setTerminalExpanded(expanded){previewLogVisible.value=Boolean(expanded);if(expanded){expandTerminal();return}minimizeTerminal()}function showLaunchLog(){collapsePreviewToolbar();previewLogVisible.value=true;expandTerminal()}return{outputOptionsAction:options.outputOptionsAction,previewWorkNotice:recovery.previewWorkNotice,previewTestNotice:outputs.previewTestNotice,outputOptionsAvailable:targets.outputOptionsAvailable,outputOptionsError:options.outputOptionsError,outputOptionsErrors:options.outputOptionsErrors,outputOptionsRemember:options.outputOptionsRemember,outputOptionsSelection:options.outputOptionsSelection,outputOptionsValues:options.outputOptionsValues,outputOptionsVisible:options.outputOptionsVisible,openOutputOptions:options.openOutputOptions,resetOutputOptions:options.resetOutputOptions,runWithOptions:options.runWithOptions,submitOutputOptions:options.submitOutputOptions,embeddedAutoStartTarget:targets.embeddedAutoStartTarget,embeddedManualStartButtonDisabled:targets.embeddedManualStartButtonDisabled,embeddedManualStartButtonVisible:targets.embeddedManualStartButtonVisible,embeddedStartTarget:targets.embeddedStartTarget,embeddedTerminalFrameVisible:presentation.embeddedTerminalFrameVisible,embeddedTerminalSurfaceVisible:presentation.embeddedTerminalSurfaceVisible,embeddedTerminalVisible:presentation.embeddedTerminalVisible,collapsePreviewToolbar:toolbar.collapsePreviewToolbar,forceStartEmbeddedPreview:recovery.forceStartEmbeddedPreview,goPreviewBack:address.goPreviewBack,handlePreviewFrameLoad:frame.handlePreviewFrameLoad,expandPreviewToolbar:toolbar.expandPreviewToolbar,launchActions:outputs.launchActions,launchButtonsDisabled:outputs.launchButtonsDisabled,launchError:outputs.launchError,resourceAdmissionId:outputs.resourceAdmissionId,testApproval:outputs.testApproval,acceptResourceRetry:outputs.acceptResourceRetry,launchStatusAttempt:outputs.launchStatusAttempt,launchStatusChipText:presentation.launchStatusChipText,launchStatusChipTitle:presentation.launchStatusChipTitle,launchStatusChipVisible:presentation.launchStatusChipVisible,launchStatusDetailText:presentation.launchStatusDetailText,launchStatusRetryVisible:presentation.launchStatusRetryVisible,launchStatusText:presentation.launchStatusText,outputExecution:outputs.outputExecution,outputResults:outputs.outputResults,outputRuns:outputs.outputRuns,outputTargets:outputs.outputTargets,launchToolbarDockVisible:presentation.launchToolbarDockVisible,loading:outputs.loading,loadError:outputs.loadError,manualLaunchMenuVisible:targets.manualLaunchMenuVisible,movePreviewToolbar:toolbar.movePreviewToolbar,openAction:outputs.openAction,operationBusy:outputs.operationBusy,previewBaseUrl:frame.previewBaseUrl,previewAddressBlur:address.previewAddressBlur,previewAddressDraft:address.previewAddressDraft,previewAddressError:address.previewAddressError,previewAddressFocus:address.previewAddressFocus,previewBackAvailable:address.previewBackAvailable,previewActivityVisible:presentation.previewActivityVisible,previewCanRestart:outputs.previewCanRestart,previewCanShowLog:outputs.previewCanShowLog,previewCanStart:outputs.previewCanStart,previewCheckAgainVisible:presentation.previewCheckAgainVisible,previewSetupRetryVisible:presentation.previewSetupRetryVisible,previewBrowserControlsVisible:presentation.previewBrowserControlsVisible,previewDisplayedAddress:address.previewDisplayedAddress,previewDisplayedUrl:address.previewDisplayedUrl,previewDiagnosticsAvailable:frame.previewDiagnosticsAvailable,previewDiagnosticsBusy:frame.previewDiagnosticsBusy,previewEmbedUnavailableReason:frame.previewEmbedUnavailableReason,previewEmptyText:presentation.previewEmptyText,previewFrame:frame.previewFrame,previewFrameLoaded:frame.previewFrameLoaded,previewFrameRequestId:frame.previewFrameRequestId,previewIdentityAvailable:identity.previewIdentityAvailable,previewIdentityBusy:identity.previewIdentityBusy,previewIdentityConfigured:identity.previewIdentityConfigured,previewIdentityCurrent:identity.previewIdentityCurrent,previewIdentityError:identity.previewIdentityError,previewIdentityLabel:identity.previewIdentityLabel,previewIdentitySelectionDisabled:identity.previewIdentitySelectionDisabled,previewIdentityTitle:identity.previewIdentityTitle,previewIdentityTypeLabel,previewIssue:presentation.previewIssue,previewIssueVisible:presentation.previewIssueVisible,previewInFlightText:presentation.previewInFlightText,previewLoadingOverlayVisible:frame.previewLoadingOverlayVisible,previewMessage:outputs.previewMessage,previewRouteDialogError:address.previewRouteDialogError,previewRouteDialogParams:address.previewRouteDialogParams,previewRouteDialogPath:address.previewRouteDialogPath,previewRouteDialogVisible:address.previewRouteDialogVisible,previewRouteFormValues:address.previewRouteFormValues,previewRouteSelection:address.previewRouteSelection,previewRoutes:address.previewRoutes,previewRoutesAvailable:address.previewRoutesAvailable,previewNotice:presentation.previewNotice,previewNoticeVisible:presentation.previewNoticeVisible,previewRecoveryLabel:presentation.previewRecoveryLabel,previewRecoveryVisible:presentation.previewRecoveryVisible,previewResourceNoticeText:reload.previewResourceNoticeText,previewResourceNoticeVisible:reload.previewResourceNoticeVisible,previewPickAvailable:pick.previewPickAvailable,previewPickBusy:pick.previewPickBusy,previewPickNoticeOpensUsage:pick.previewPickNoticeOpensUsage,previewPickNoticeText:pick.previewPickNoticeText,previewPickNoticeVisible:pick.previewPickNoticeVisible,previewPicking:frame.previewPicking,openUsageFromPickNotice:pick.openUsageFromPickNotice,stopPreviewPick:frame.stopPreviewPick,togglePreviewPick:pick.togglePreviewPick,previewState:outputs.previewState,previewTerminalRecoveryVisible:presentation.previewTerminalRecoveryVisible,previewToolbarRecoveryVisible:presentation.previewToolbarRecoveryVisible,previewStarting:presentation.previewStarting,previewToolbarExpanded:toolbar.previewToolbarExpanded,previewToolbarPosition:toolbar.previewToolbarPosition,previewUrl:frame.previewUrl,copyPreviewUrl:address.copyPreviewUrl,openPreviewRoute:address.openPreviewRoute,recoverEmbeddedPreview:recovery.recoverEmbeddedPreview,recheckResourceAdmission:recovery.recheckResourceAdmission,reloadPreview:reload.reloadPreview,previewSuspended:frame.previewSuspended,suspendPreview:reload.suspendPreview,resumePreview:reload.resumePreview,retryLaunchStatus:recovery.retryLaunchStatus,retryPreviewWorkspaceSetup:recovery.retryPreviewWorkspaceSetup,requestPreviewDiagnostics:frame.requestPreviewDiagnostics,resetPreviewAddressDraft:address.resetPreviewAddressDraft,selectPreviewConfiguredIdentity:identity.selectPreviewConfiguredIdentity,selectPreviewGuest:identity.selectPreviewGuest,submitPreviewRouteDialog:address.submitPreviewRouteDialog,submitPreviewAddress:address.submitPreviewAddress,restartTerminal:outputs.restartTerminal,retryTerminal:outputs.retryTerminal,runMenuDisabled:targets.runMenuDisabled,showLaunchLog,stopTerminal:outputs.stopTerminal,setTerminalExpanded,terminal:outputs.terminal,terminalCanStop:outputs.terminalCanStop,terminalCanRestart:outputs.terminalCanRestart,terminalCanRetry:outputs.terminalCanRetry,terminalCommandPreview:outputs.terminalCommandPreview,terminalDisplayed:outputs.terminalDisplayed,terminalExpanded:outputs.terminalExpanded,terminalError:outputs.terminalError,terminalIndicatorLabel:outputs.terminalIndicatorLabel,terminalIndicatorState:outputs.terminalIndicatorState,terminalIsRunning:outputs.terminalIsRunning,terminalStatus:outputs.terminalStatus,terminalSubtitle:outputs.terminalSubtitle,terminalTitle:outputs.terminalTitle,terminalVisible:outputs.terminalVisible,terminalWindowStorageKey:outputs.terminalWindowStorageKey,terminalWindowVisible:outputs.terminalWindowVisible,toolbarTeleportTarget,visible:outputs.visible}}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(PREVIEW_PROXY_TOKEN_QUERY_PARAM);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{dr as vModelText,mr as withModifiers,pr as withKeys,t as VChip,x as VIcon}from"./VChip-BRhZ1px1.js";import{$n as normalizeProps,D as createVNode,E as createTextVNode,En as toValue,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{t as useEndpointResource}from"./useEndpointResource-BaT7yEQ5.js";import{l as normalizeObject,r as isRecord}from"./normalize-Cecw_kDB.js";import{r as getHttpWebClient}from"./httpClient-Dj5wBWSr.js";import{n as VList,s as VListItem,t as VMenu}from"./VMenu-BaCC4Of9.js";import{t as VTextField}from"./VTextField-Dmm1M-tz.js";import{c as vibe64ProjectScopedStorageKey,t as currentProjectSlugFromLocation}from"./vibe64ProjectScope.local-BbrorE15.js";import{s as ROUTE_VISIBILITY_PUBLIC}from"./errorMessageHelpers-KoewcxJa.js";import{$n as mdiOpenInNew,C as mdiArrowLeft,Cr as mdiRoutes,G as mdiChevronRight,K as mdiChevronUp,Tt as mdiDotsHorizontal,Ur as mdiStopCircleOutline,W as mdiChevronLeft,cr as mdiPlayCircleOutline,di as mdiWebClock,f as mdiAlertCircleOutline,ft as mdiContentCopy,gr as mdiRefresh,kt as mdiDownloadOutline,n as mdiAccountCircleOutline,nr as mdiPause,ot as mdiCogOutline,s as mdiAccountOffOutline,sr as mdiPlay,u as mdiAccountSwitchOutline,ut as mdiConsoleLine,vr as mdiRestart,xt as mdiCursorDefaultClickOutline}from"./mdi-DwGK7nOu.js";import{t as VBtn}from"./VBtn-B6ryRXW-.js";import{t as VAlert}from"./VAlert-CBpSKTfy.js";import{t as VCheckbox}from"./VCheckbox-Bybg_FNE.js";import{t as VDivider}from"./VDivider-DY2s_j83.js";import{t as VDialog}from"./VDialog-CYfdjZRu.js";import{a as VCardSubtitle,i as VCardTitle,n as VCardText,o as VCardActions,r as VCardItem,t as VCard}from"./VCard-BzaViLPx.js";import{t as VSpacer}from"./VSpacer-B5ip6FSG.js";import{t as VSnackbar}from"./VSnackbar-B38PV3iX.js";import{t as _plugin_vue_export_helper_default}from"./_plugin-vue_export-helper-DNW4j-dv.js";import{n as useRealtimeEvent}from"./useRealtimeEvent-DbrYLgvU.js";import{t as usePaths}from"./usePaths-DaWJ_Tvi.js";import{a as VIBE64_RESOURCE_RECOVERY_KEY,i as vibe64OutputTerminalWebSocketUrl,r as terminalSessionMissingError}from"./_slug_-JgF_FQ6F.js";import{m as sourceEditorLinkTarget}from"./Vibe64SessionFiles-DjeEvtpc.js";import{t as useCommand}from"./useCommand-DGM7l3ja.js";import{a as Vibe64Terminal_default,i as createWebSocketTerminalDriver,t as useVibe64Terminal}from"./useVibe64Terminal-B8qevIXQ.js";import{n as stableLocalStorageKeyPart,r as writeLocalStorageJson,t as readLocalStorageJson}from"./browserLocalStorage-B4C7rHrs.js";import{n as useVibe64ProjectSlug}from"./useVibe64ProjectScope-C4-hpbwc.js";import{i as vibe64RealtimePayloadFromCurrentTab,r as vibe64RealtimeOriginPayload}from"./vibe64BrowserTabOrigin-D6Mxx-QS.js";import{C as vibe64OutputRunPath,D as vibe64PreviewIdentityPath,E as vibe64OutputsQueryKey,I as vibe64SessionPath,L as vibe64SessionPreviewStatePath,S as vibe64OutputResultPath,T as vibe64OutputsPath,o as VIBE64_SESSIONS_API_SUFFIX,s as VIBE64_SESSION_CHANGED_EVENT,w as vibe64OutputRunStopPath}from"./vibe64SessionRequestConfig-DvrfyP8A.js";import{t as SYSTEM_GRAPH_API_SUFFIX}from"./useVibe64SystemGraph-BdvumnPL.js";import{A as readRefOrGetterValue,O as useVibe64Learning,at as usePageActivity,d as USAGE_RECORDING_LIMITS,l as useVibe64UsageRecording,u as USAGE_INTERACTION_ID_PATTERN}from"./index-CNkd6O5t.js";import{t as Vibe64TemporaryAiFixAction_default}from"./Vibe64TemporaryAiFixAction-DT62W459.js";import{o as vibe64SessionRevision,t as isArchivedVibe64Session}from"./vibe64SessionViewModel-B0cCumM8.js";import{n as vibe64SessionDebugError,r as vibe64SessionDebugLog}from"./vibe64SessionDebugLog-D6ibBX8L.js";var _sfc_main$9={__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 _sfc_main$8={__name:`Vibe64OutputOptionsDialog`,props:{surface:{required:true,type:Object}},setup(__props){const{operationBusy,outputOptionsAction,outputOptionsError,outputOptionsErrors,outputOptionsRemember,outputOptionsSelection,outputOptionsValues,outputOptionsVisible,resetOutputOptions,submitOutputOptions}=__props.surface;return(_ctx,_cache)=>{return openBlock(),createBlock(VDialog,{modelValue:unref(outputOptionsVisible),"onUpdate:modelValue":_cache[2]||(_cache[2]=$event=>isRef(outputOptionsVisible)?outputOptionsVisible.value=$event:null),"aria-label":`Preview options`,"max-width":`520`,persistent:unref(operationBusy),scrollable:``},{default:withCtx(()=>[createVNode(VCard,null,{default:withCtx(()=>[createVNode(VCardTitle,null,{default:withCtx(()=>[..._cache[3]||(_cache[3]=[createTextVNode(`Preview options`,-1)])]),_:1}),createVNode(VCardSubtitle,null,{default:withCtx(()=>[createTextVNode(toDisplayString(unref(outputOptionsSelection)?.label),1)]),_:1}),createVNode(VCardText,null,{default:withCtx(()=>[(openBlock(true),createElementBlock(Fragment,null,renderList(unref(outputOptionsSelection)?.parameters||[],parameter=>{return openBlock(),createBlock(VTextField,{key:parameter.id,modelValue:unref(outputOptionsValues)[parameter.id],"onUpdate:modelValue":$event=>unref(outputOptionsValues)[parameter.id]=$event,class:`mb-3`,disabled:unref(operationBusy),"error-messages":unref(outputOptionsErrors)[parameter.id],hint:parameter.description,label:parameter.label,maxlength:4096,"persistent-hint":Boolean(parameter.description),required:parameter.required,variant:`outlined`,onKeydown:withKeys(withModifiers(unref(submitOutputOptions),[`prevent`]),[`enter`])},null,8,[`modelValue`,`onUpdate:modelValue`,`disabled`,`error-messages`,`hint`,`label`,`persistent-hint`,`required`,`onKeydown`])}),128)),createVNode(VCheckbox,{modelValue:unref(outputOptionsRemember),"onUpdate:modelValue":_cache[0]||(_cache[0]=$event=>isRef(outputOptionsRemember)?outputOptionsRemember.value=$event:null),disabled:unref(operationBusy),hint:`Use these values for new sessions in this browser.`,label:`Remember for this project`,"persistent-hint":``},null,8,[`modelValue`,`disabled`]),createVNode(VBtn,{disabled:unref(operationBusy),variant:`text`,onClick:unref(resetOutputOptions)},{default:withCtx(()=>[..._cache[4]||(_cache[4]=[createTextVNode(`Use defaults`,-1)])]),_:1},8,[`disabled`,`onClick`]),unref(outputOptionsError)?(openBlock(),createBlock(VAlert,{key:0,class:`mt-3`,type:`error`,variant:`tonal`},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(outputOptionsError)),1)]),_:1})):createCommentVNode(``,true)]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{disabled:unref(operationBusy),variant:`text`,onClick:_cache[1]||(_cache[1]=$event=>outputOptionsVisible.value=false)},{default:withCtx(()=>[..._cache[5]||(_cache[5]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{disabled:unref(operationBusy),color:`primary`,variant:`flat`,onClick:unref(submitOutputOptions)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(outputOptionsAction)),1)]),_:1},8,[`disabled`,`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`,`persistent`])}}};var Vibe64OutputOptionsDialog_default=_plugin_vue_export_helper_default(_sfc_main$8,[[`__scopeId`,`data-v-8fb19d1b`]]);var _sfc_main$7={__name:`Vibe64OutputResultsMenu`,props:{surface:{required:true,type:Object}},setup(__props){const{outputExecution,outputResults,outputTargets}=__props.surface;const resultsButtonVisible=computed(()=>Boolean(outputResults.value.length>0||outputExecution.value.error||outputTargets.value.some(target=>Array.isArray(target?.downloads)&&target.downloads.length>0)));const outputResultsLabel=computed(()=>{const count=outputResults.value.length;if(count>0)return`${count} downloadable ${count===1?`result`:`results`}`;return outputExecution.value.error?`Build results need attention`:`No build results yet`});function outputResultSubtitle(result={}){const bytes=Number(result.size||0);return`${bytes>=1048576?`${(bytes/1048576).toFixed(1)} MB`:bytes>=1024?`${(bytes/1024).toFixed(1)} KB`:`${bytes} B`} · SHA-256 ${String(result.sha256||``).slice(0,12)}…`}return(_ctx,_cache)=>{return resultsButtonVisible.value?(openBlock(),createBlock(VMenu,{key:0,"close-on-content-click":false,location:`bottom end`},{activator:withCtx(({props:menuProps})=>[createVNode(VBtn,mergeProps(menuProps,{"aria-label":outputResultsLabel.value,disabled:unref(outputResults).length<1&&!unref(outputExecution).error,icon:unref(mdiDownloadOutline),size:`small`,title:outputResultsLabel.value,variant:`text`}),null,16,[`aria-label`,`disabled`,`icon`,`title`])]),default:withCtx(()=>[createVNode(VCard,{class:`vibe64-launch-controls__results-card`},{default:withCtx(()=>[createVNode(VCardItem,{"prepend-icon":unref(mdiDownloadOutline),subtitle:`Immutable snapshots from this session`,title:`Build results`},null,8,[`prepend-icon`]),unref(outputExecution).error?(openBlock(),createBlock(VAlert,{key:0,class:`vibe64-launch-controls__results-error`,density:`compact`,type:`error`,variant:`tonal`},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(outputExecution).error.message),1)]),_:1})):createCommentVNode(``,true),unref(outputResults).length?(openBlock(),createBlock(VList,{key:1,density:`comfortable`},{default:withCtx(()=>[(openBlock(true),createElementBlock(Fragment,null,renderList(unref(outputResults),result=>{return openBlock(),createBlock(VListItem,{key:result.id,href:result.href,"prepend-icon":unref(mdiDownloadOutline),subtitle:outputResultSubtitle(result),title:result.name},null,8,[`href`,`prepend-icon`,`subtitle`,`title`])}),128))]),_:1})):createCommentVNode(``,true)]),_:1})]),_:1})):createCommentVNode(``,true)}}};var Vibe64OutputResultsMenu_default=_plugin_vue_export_helper_default(_sfc_main$7,[[`__scopeId`,`data-v-5ae8ab6b`]]);var _hoisted_1$4=[`title`];var _hoisted_2$3=[`aria-invalid`,`disabled`,`placeholder`];var _sfc_main$6={__name:`Vibe64PreviewAddressBar`,props:{surface:{required:true,type:Object}},setup(__props){const{copyPreviewUrl,goPreviewBack,launchActions,openAction,openPreviewRoute,previewAddressBlur,previewAddressDraft,previewAddressError,previewAddressFocus,previewBackAvailable,previewBaseUrl,previewDisplayedAddress,previewPickAvailable,previewPickBusy,previewPicking,previewRoutes,previewRoutesAvailable,previewSuspended,reloadPreview,resetPreviewAddressDraft,resumePreview,submitPreviewAddress,suspendPreview,togglePreviewPick}=__props.surface;return(_ctx,_cache)=>{return openBlock(),createElementBlock(`form`,{"aria-label":`Preview page`,class:normalizeClass([`vibe64-launch-controls__preview-nav`,{"vibe64-launch-controls__preview-nav--invalid":unref(previewAddressError)}]),title:unref(previewAddressError)||`Preview URL`,onSubmit:_cache[5]||(_cache[5]=withModifiers((...args)=>unref(submitPreviewAddress)&&unref(submitPreviewAddress)(...args),[`prevent`]))},[createVNode(VBtn,{"aria-label":`Go back in preview`,disabled:!unref(previewBackAvailable),icon:unref(mdiArrowLeft),size:`small`,title:`Go back in preview`,type:`button`,variant:`text`,onClick:unref(goPreviewBack)},null,8,[`disabled`,`icon`,`onClick`]),unref(previewRoutesAvailable)?(openBlock(),createBlock(VMenu,{key:0,location:`bottom start`},{activator:withCtx(({props:menuProps})=>[createVNode(VBtn,mergeProps(menuProps,{"aria-label":`Preview pages`,icon:unref(mdiRoutes),size:`small`,title:`Preview pages`,type:`button`,variant:`text`}),null,16,[`icon`])]),default:withCtx(()=>[createVNode(VList,{class:`vibe64-launch-controls__route-menu`,density:`compact`},{default:withCtx(()=>[(openBlock(true),createElementBlock(Fragment,null,renderList(unref(previewRoutes),route=>{return openBlock(),createBlock(VListItem,{key:route.id,subtitle:route.pathTemplate,title:route.label,onClick:$event=>unref(openPreviewRoute)(route)},null,8,[`subtitle`,`title`,`onClick`])}),128))]),_:1})]),_:1})):createCommentVNode(``,true),withDirectives(createBaseVNode(`input`,{"onUpdate:modelValue":_cache[0]||(_cache[0]=$event=>isRef(previewAddressDraft)?previewAddressDraft.value=$event:null),"aria-label":`Preview URL`,"aria-invalid":unref(previewAddressError)?`true`:`false`,autocapitalize:`off`,autocomplete:`off`,class:`vibe64-launch-controls__preview-address`,disabled:!unref(previewBaseUrl),placeholder:unref(previewDisplayedAddress)?``:`Preview URL unavailable`,spellcheck:`false`,type:`text`,onBlur:_cache[1]||(_cache[1]=(...args)=>unref(previewAddressBlur)&&unref(previewAddressBlur)(...args)),onFocus:_cache[2]||(_cache[2]=(...args)=>unref(previewAddressFocus)&&unref(previewAddressFocus)(...args)),onKeydown:_cache[3]||(_cache[3]=withKeys(withModifiers((...args)=>unref(resetPreviewAddressDraft)&&unref(resetPreviewAddressDraft)(...args),[`prevent`]),[`esc`]))},null,40,_hoisted_2$3),[[vModelText,unref(previewAddressDraft)]]),createVNode(VBtn,{icon:unref(mdiRefresh),size:`small`,disabled:unref(previewSuspended),title:`Reload preview`,"data-vibe64-guide":`reload-preview`,type:`button`,variant:`text`,onClick:unref(reloadPreview)},null,8,[`icon`,`disabled`,`onClick`]),createVNode(VBtn,{"aria-pressed":unref(previewPicking)?`true`:`false`,"aria-label":`Pick element`,color:unref(previewPicking)?`primary`:void 0,disabled:unref(previewPickBusy)||!unref(previewPicking)&&!unref(previewPickAvailable),icon:unref(mdiCursorDefaultClickOutline),loading:unref(previewPickBusy),size:`small`,title:`Show what this element uses`,type:`button`,variant:unref(previewPicking)?`tonal`:`text`,onClick:unref(togglePreviewPick)},null,8,[`aria-pressed`,`color`,`disabled`,`icon`,`loading`,`variant`,`onClick`]),createVNode(VBtn,{"aria-label":unref(previewSuspended)?`Resume preview`:`Suspend preview`,icon:unref(previewSuspended)?unref(mdiPlay):unref(mdiPause),size:`small`,title:unref(previewSuspended)?`Resume preview`:`Suspend preview — unload this page; unsaved page changes may be lost`,type:`button`,variant:`text`,onClick:_cache[4]||(_cache[4]=$event=>unref(previewSuspended)?unref(resumePreview)():unref(suspendPreview)())},null,8,[`aria-label`,`icon`,`title`]),createVNode(VBtn,{disabled:!unref(previewDisplayedAddress),icon:unref(mdiContentCopy),size:`small`,title:`Copy preview URL`,type:`button`,variant:`text`,onClick:withModifiers(unref(copyPreviewUrl),[`prevent`])},null,8,[`disabled`,`icon`,`onClick`]),(openBlock(true),createElementBlock(Fragment,null,renderList(unref(launchActions),action=>{return openBlock(),createBlock(VBtn,{key:action.id||action.href,"aria-label":action.label||`Open in new tab`,icon:unref(mdiOpenInNew),size:`small`,title:action.label||action.href,type:`button`,variant:`text`,onClick:$event=>unref(openAction)(action)},null,8,[`aria-label`,`icon`,`title`,`onClick`])}),128))],42,_hoisted_1$4)}}};var Vibe64PreviewAddressBar_default=_plugin_vue_export_helper_default(_sfc_main$6,[[`__scopeId`,`data-v-18d2e0f4`]]);var _hoisted_1$3={key:1,class:`vibe64-launch-controls__identity-recovery`};var _sfc_main$5={__name:`Vibe64PreviewIdentityMenu`,props:{fixPreviewIdentityWithTemporaryAi:{default:null,type:Function},surface:{required:true,type:Object}},setup(__props){const props=__props;const{previewIdentityAvailable,previewIdentityBusy,previewIdentityConfigured,previewIdentityCurrent,previewIdentityError,previewIdentityLabel,previewIdentitySelectionDisabled,previewIdentityTitle,previewIdentityTypeLabel,selectPreviewConfiguredIdentity,selectPreviewGuest}=props.surface;const previewIdentityFailedSelection=ref(null);const previewIdentityFixSending=ref(false);const previewIdentityFixAvailable=computed(()=>Boolean(previewIdentityError.value&&previewIdentityFailedSelection.value&&typeof props.fixPreviewIdentityWithTemporaryAi===`function`));async function selectPreviewIdentityFromMenu(identity={}){previewIdentityFailedSelection.value=identity;const selected=await selectPreviewConfiguredIdentity(identity);if(selected)previewIdentityFailedSelection.value=null;return selected}async function requestCodexPreviewIdentityFix(){if(!previewIdentityFixAvailable.value||previewIdentityFixSending.value)return false;previewIdentityFixSending.value=true;try{return await props.fixPreviewIdentityWithTemporaryAi({error:previewIdentityError.value,identity:previewIdentityFailedSelection.value})}finally{previewIdentityFixSending.value=false}}watch(previewIdentityError,error=>{if(!error)previewIdentityFailedSelection.value=null});return(_ctx,_cache)=>{return unref(previewIdentityAvailable)?(openBlock(),createBlock(VMenu,{key:0,location:`bottom end`},{activator:withCtx(({props:menuProps})=>[createVNode(VBtn,mergeProps(menuProps,{"aria-label":unref(previewIdentityTitle),color:unref(previewIdentityError)?`error`:void 0,disabled:unref(previewIdentityBusy),icon:unref(mdiAccountSwitchOutline),size:`small`,title:unref(previewIdentityTitle),variant:`text`}),null,16,[`aria-label`,`color`,`disabled`,`icon`,`title`])]),default:withCtx(()=>[createVNode(VCard,{class:`vibe64-launch-controls__identity-menu`},{default:withCtx(()=>[createVNode(VCardItem,{"prepend-icon":unref(mdiAccountCircleOutline),subtitle:`Application preview identity`,title:unref(previewIdentityLabel)},null,8,[`prepend-icon`,`title`]),createVNode(VDivider),createVNode(VList,{density:`compact`},{default:withCtx(()=>[(openBlock(true),createElementBlock(Fragment,null,renderList(unref(previewIdentityConfigured),identity=>{return openBlock(),createBlock(VListItem,{key:identity.name,active:unref(previewIdentityCurrent)?.mode===`identity`&&unref(previewIdentityCurrent)?.name===identity.name,disabled:unref(previewIdentitySelectionDisabled),"prepend-icon":unref(mdiAccountCircleOutline),subtitle:`${unref(previewIdentityTypeLabel)(identity.type)}: ${identity.value}`,title:identity.name,onClick:$event=>selectPreviewIdentityFromMenu(identity)},null,8,[`active`,`disabled`,`prepend-icon`,`subtitle`,`title`,`onClick`])}),128)),createVNode(VListItem,{active:unref(previewIdentityCurrent)?.mode===`guest`,disabled:unref(previewIdentitySelectionDisabled),"prepend-icon":unref(mdiAccountOffOutline),subtitle:`Use the app signed out`,title:`Guest`,onClick:unref(selectPreviewGuest)},null,8,[`active`,`disabled`,`prepend-icon`,`onClick`])]),_:1}),unref(previewIdentityError)?(openBlock(),createBlock(VAlert,{key:0,class:`vibe64-launch-controls__identity-error`,density:`compact`,type:`error`,variant:`tonal`},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(previewIdentityError)),1)]),_:1})):createCommentVNode(``,true),previewIdentityFixAvailable.value?(openBlock(),createElementBlock(`div`,_hoisted_1$3,[createVNode(Vibe64TemporaryAiFixAction_default,{disabled:previewIdentityFixSending.value,pending:previewIdentityFixSending.value,title:`Open Temporary AI to resolve preview identity`,onClick:requestCodexPreviewIdentityFix},null,8,[`disabled`,`pending`])])):createCommentVNode(``,true)]),_:1})]),_:1})):createCommentVNode(``,true)}}};var Vibe64PreviewIdentityMenu_default=_plugin_vue_export_helper_default(_sfc_main$5,[[`__scopeId`,`data-v-24f77058`]]);var _sfc_main$4={__name:`Vibe64PreviewIssueMenu`,props:{surface:{required:true,type:Object}},setup(__props){const{embeddedStartTarget,operationBusy,previewCanRestart,previewCanShowLog,previewIssue,previewIssueVisible,recoverEmbeddedPreview,retryTerminal,showLaunchLog,terminalCanRetry}=__props.surface;return(_ctx,_cache)=>{return unref(previewIssueVisible)?(openBlock(),createBlock(VMenu,{key:0,"close-on-content-click":false,location:`bottom end`},{activator:withCtx(({props:menuProps})=>[createVNode(VBtn,mergeProps(menuProps,{class:`vibe64-launch-controls__attention-button`,color:`warning`,icon:unref(mdiAlertCircleOutline),size:`small`,title:unref(previewIssue).title,variant:`text`}),null,16,[`icon`,`title`])]),default:withCtx(()=>[createVNode(VCard,{class:`vibe64-launch-controls__attention-menu`},{default:withCtx(()=>[createVNode(VCardText,{class:`vibe64-launch-controls__attention-body`},{default:withCtx(()=>[createVNode(VIcon,{class:`vibe64-launch-controls__attention-icon`,icon:unref(mdiAlertCircleOutline),size:`28`},null,8,[`icon`]),createBaseVNode(`div`,null,[createBaseVNode(`strong`,null,toDisplayString(unref(previewIssue).title),1),createBaseVNode(`p`,null,toDisplayString(unref(previewIssue).message),1)])]),_:1}),createVNode(VCardActions,{class:`vibe64-launch-controls__attention-actions`},{default:withCtx(()=>[unref(previewCanShowLog)?(openBlock(),createBlock(VBtn,{key:0,"prepend-icon":unref(mdiConsoleLine),size:`small`,variant:`tonal`,onClick:unref(showLaunchLog)},{default:withCtx(()=>[..._cache[0]||(_cache[0]=[createTextVNode(` Show log `,-1)])]),_:1},8,[`prepend-icon`,`onClick`])):createCommentVNode(``,true),unref(previewCanRestart)&&unref(embeddedStartTarget)?(openBlock(),createBlock(VBtn,{key:1,disabled:unref(operationBusy),"prepend-icon":unref(mdiRefresh),size:`small`,variant:`tonal`,onClick:unref(recoverEmbeddedPreview)},{default:withCtx(()=>[..._cache[1]||(_cache[1]=[createTextVNode(` Restart preview `,-1)])]),_:1},8,[`disabled`,`prepend-icon`,`onClick`])):createCommentVNode(``,true),unref(terminalCanRetry)&&!(unref(previewCanRestart)&&unref(embeddedStartTarget))?(openBlock(),createBlock(VBtn,{key:2,disabled:unref(operationBusy),icon:unref(mdiRefresh),size:`small`,title:`Retry preview`,variant:`text`,onClick:unref(retryTerminal)},null,8,[`disabled`,`icon`,`onClick`])):createCommentVNode(``,true)]),_:1})]),_:1})]),_:1})):createCommentVNode(``,true)}}};var Vibe64PreviewIssueMenu_default=_plugin_vue_export_helper_default(_sfc_main$4,[[`__scopeId`,`data-v-0b52895a`]]);var _hoisted_1$2={key:0,class:`vibe64-launch-controls__mobile-collapsed`};var _hoisted_2$2=[`aria-label`,`title`];var _hoisted_3$2={class:`vibe64-launch-controls__toolbar-main`};var _hoisted_4$2={class:`vibe64-launch-controls__secondary-actions`};var _hoisted_5$1=[`title`];var _hoisted_6$1=[`aria-label`,`title`];var _hoisted_7$1={key:1,class:`vibe64-launch-controls__auto-start-actions`};var _sfc_main$3={__name:`Vibe64OutputToolbar`,props:{buttonLabel:{default:`Run`,type:String},buttonSize:{default:`small`,type:String},buttonVariant:{default:`tonal`,type:String},embeddedPreview:{default:false,type:Boolean},fixPreviewIdentityWithTemporaryAi:{default:null,type:Function},surface:{required:true,type:Object}},setup(__props){const props=__props;const{collapsePreviewToolbar,embeddedManualStartButtonDisabled,embeddedManualStartButtonVisible,expandPreviewToolbar,forceStartEmbeddedPreview,launchActions,launchButtonsDisabled,launchStatusChipText,launchStatusChipTitle,launchStatusChipVisible,launchStatusRetryVisible,launchToolbarDockVisible,loading,manualLaunchMenuVisible,movePreviewToolbar,openAction,openOutputOptions,operationBusy,outputOptionsAvailable,outputTargets,previewBrowserControlsVisible,previewToolbarExpanded,previewToolbarPosition,previewToolbarRecoveryVisible,recoverEmbeddedPreview,restartTerminal,retryLaunchStatus,retryTerminal,runMenuDisabled,runWithOptions,showLaunchLog,stopTerminal,terminalCanRestart,terminalCanRetry,terminalCanStop,terminalIndicatorLabel,terminalIndicatorState,terminalTitle,terminalVisible,toolbarTeleportTarget}=props.surface;const previewNavVisible=computed(()=>Boolean(props.embeddedPreview&&previewBrowserControlsVisible.value));return(_ctx,_cache)=>{return openBlock(),createElementBlock(`div`,{class:normalizeClass([`vibe64-launch-controls__toolbar`,[{"vibe64-launch-controls__toolbar--mobile-collapsed":__props.embeddedPreview&&!unref(previewToolbarExpanded),"vibe64-launch-controls__toolbar--mobile-expanded":__props.embeddedPreview&&unref(previewToolbarExpanded),"vibe64-launch-controls__toolbar--teleported":unref(toolbarTeleportTarget)},__props.embeddedPreview?`vibe64-launch-controls__toolbar--${unref(previewToolbarPosition)}`:``]])},[__props.embeddedPreview?(openBlock(),createElementBlock(`div`,_hoisted_1$2,[createVNode(VBtn,{class:`vibe64-launch-controls__position-button`,disabled:unref(previewToolbarPosition)===`left`,icon:unref(mdiChevronLeft),size:`small`,title:`Move controls left`,variant:`text`,onClick:_cache[0]||(_cache[0]=$event=>unref(movePreviewToolbar)(-1))},null,8,[`disabled`,`icon`]),createBaseVNode(`button`,{"aria-label":`Show preview controls`,class:`vibe64-launch-controls__mobile-expand`,type:`button`,title:`Show preview controls`,onClick:_cache[1]||(_cache[1]=(...args)=>unref(expandPreviewToolbar)&&unref(expandPreviewToolbar)(...args))},[createBaseVNode(`span`,{class:normalizeClass([`vibe64-launch-controls__status-dot`,`vibe64-launch-controls__status-dot--${unref(terminalIndicatorState)}`]),"aria-label":unref(terminalIndicatorLabel),title:unref(terminalIndicatorLabel)},null,10,_hoisted_2$2),createVNode(VIcon,{icon:unref(mdiDotsHorizontal),size:`18`},null,8,[`icon`])]),createVNode(VBtn,{class:`vibe64-launch-controls__position-button`,disabled:unref(previewToolbarPosition)===`right`,icon:unref(mdiChevronRight),size:`small`,title:`Move controls right`,variant:`text`,onClick:_cache[2]||(_cache[2]=$event=>unref(movePreviewToolbar)(1))},null,8,[`disabled`,`icon`])])):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_3$2,[__props.embeddedPreview?(openBlock(),createBlock(VBtn,{key:0,class:`vibe64-launch-controls__position-button`,disabled:unref(previewToolbarPosition)===`left`,icon:unref(mdiChevronLeft),size:`small`,title:`Move controls left`,variant:`text`,onClick:_cache[3]||(_cache[3]=$event=>unref(movePreviewToolbar)(-1))},null,8,[`disabled`,`icon`])):createCommentVNode(``,true),__props.embeddedPreview?(openBlock(),createBlock(VBtn,{key:1,class:`vibe64-launch-controls__mobile-collapse-button`,icon:unref(mdiChevronUp),size:`small`,title:`Collapse preview controls`,variant:`text`,onClick:unref(collapsePreviewToolbar)},null,8,[`icon`,`onClick`])):createCommentVNode(``,true),previewNavVisible.value?(openBlock(),createBlock(Vibe64PreviewAddressBar_default,{key:2,surface:__props.surface},null,8,[`surface`])):__props.embeddedPreview?(openBlock(),createBlock(VBtn,{key:3,disabled:unref(loading),icon:unref(mdiRefresh),"aria-label":`Refresh output status`,title:`Refresh output status`,variant:`text`,onClick:unref(retryLaunchStatus)},null,8,[`disabled`,`icon`,`onClick`])):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_4$2,[createVNode(Vibe64PreviewIdentityMenu_default,{"fix-preview-identity-with-temporary-ai":__props.fixPreviewIdentityWithTemporaryAi,surface:__props.surface},null,8,[`fix-preview-identity-with-temporary-ai`,`surface`]),unref(launchToolbarDockVisible)?(openBlock(),createElementBlock(`div`,{key:0,"aria-label":`Preview server`,class:`vibe64-launch-controls__dock`,role:`group`,title:unref(terminalTitle)},[createBaseVNode(`span`,{class:normalizeClass([`vibe64-launch-controls__status-dot`,`vibe64-launch-controls__status-dot--${unref(terminalIndicatorState)}`]),"aria-label":unref(terminalIndicatorLabel),role:`img`,title:unref(terminalIndicatorLabel)},null,10,_hoisted_6$1),(openBlock(true),createElementBlock(Fragment,null,renderList(previewNavVisible.value?[]:unref(launchActions),action=>{return openBlock(),createBlock(VBtn,{key:action.id||action.href,icon:unref(mdiOpenInNew),size:`small`,title:action.label||action.href,variant:`text`,onClick:$event=>unref(openAction)(action)},null,8,[`icon`,`title`,`onClick`])}),128)),unref(terminalVisible)?(openBlock(),createBlock(VBtn,{key:0,"aria-label":`Show run output`,icon:unref(mdiConsoleLine),size:`small`,title:`Show run output`,variant:`text`,onClick:unref(showLaunchLog)},null,8,[`icon`,`onClick`])):createCommentVNode(``,true),unref(terminalCanStop)?(openBlock(),createBlock(VBtn,{key:1,"aria-label":`Stop preview`,disabled:unref(operationBusy),icon:unref(mdiStopCircleOutline),size:`small`,title:`Stop preview`,variant:`text`,onClick:unref(stopTerminal)},null,8,[`disabled`,`icon`,`onClick`])):createCommentVNode(``,true),unref(previewToolbarRecoveryVisible)?(openBlock(),createBlock(VBtn,{key:2,"aria-label":`Restart preview`,disabled:unref(operationBusy),icon:unref(mdiRestart),size:`small`,title:`Restart preview`,variant:`text`,onClick:unref(recoverEmbeddedPreview)},null,8,[`disabled`,`icon`,`onClick`])):createCommentVNode(``,true),unref(terminalCanRetry)&&!unref(previewToolbarRecoveryVisible)?(openBlock(),createBlock(VBtn,{key:3,"aria-label":`Retry preview`,disabled:unref(operationBusy),icon:unref(mdiRestart),size:`small`,title:`Retry`,variant:`text`,onClick:unref(retryTerminal)},null,8,[`disabled`,`icon`,`onClick`])):createCommentVNode(``,true),unref(terminalCanRestart)&&!unref(previewToolbarRecoveryVisible)?(openBlock(),createBlock(VBtn,{key:4,"aria-label":`Restart preview server`,disabled:unref(operationBusy),icon:unref(mdiRestart),size:`small`,title:`Restart`,variant:`text`,onClick:unref(restartTerminal)},null,8,[`disabled`,`icon`,`onClick`])):createCommentVNode(``,true)],8,_hoisted_5$1)):unref(embeddedManualStartButtonVisible)?(openBlock(),createElementBlock(`div`,_hoisted_7$1,[createVNode(VBtn,{"aria-label":`Start preview`,class:`vibe64-launch-controls__auto-start-button`,disabled:unref(embeddedManualStartButtonDisabled),icon:unref(mdiPlayCircleOutline),size:`small`,title:`Start preview`,variant:`text`,onClick:unref(forceStartEmbeddedPreview)},null,8,[`disabled`,`icon`,`onClick`])])):createCommentVNode(``,true),unref(outputOptionsAvailable)?(openBlock(),createBlock(VBtn,{key:2,"aria-label":`Preview options`,disabled:unref(operationBusy),icon:unref(mdiCogOutline),size:`small`,title:`Preview options`,variant:`text`,onClick:_cache[4]||(_cache[4]=$event=>unref(openOutputOptions)())},null,8,[`disabled`,`icon`])):createCommentVNode(``,true),createVNode(Vibe64OutputResultsMenu_default,{surface:__props.surface},null,8,[`surface`]),unref(manualLaunchMenuVisible)?(openBlock(),createBlock(VMenu,{key:3,location:`bottom end`},{activator:withCtx(({props:menuProps})=>[createVNode(VBtn,mergeProps(menuProps,{class:`vibe64-launch-controls__run-button`,color:`primary`,disabled:unref(runMenuDisabled),"prepend-icon":unref(mdiPlayCircleOutline),size:__props.buttonSize,title:`Run target`,variant:__props.buttonVariant}),{default:withCtx(()=>[createTextVNode(toDisplayString(__props.buttonLabel),1)]),_:1},16,[`disabled`,`prepend-icon`,`size`,`variant`])]),default:withCtx(()=>[createVNode(VList,{class:`vibe64-launch-controls__menu`,density:`compact`},{default:withCtx(()=>[(openBlock(true),createElementBlock(Fragment,null,renderList(unref(outputTargets),outputTarget=>{return openBlock(),createBlock(VListItem,{key:outputTarget.id,disabled:unref(launchButtonsDisabled)||outputTarget.available===false,"prepend-icon":unref(mdiPlayCircleOutline),subtitle:outputTarget.disabledReason||``,title:outputTarget.label,onClick:$event=>unref(runWithOptions)(outputTarget)},null,8,[`disabled`,`prepend-icon`,`subtitle`,`title`,`onClick`])}),128))]),_:1})]),_:1})):createCommentVNode(``,true),unref(launchStatusChipVisible)?(openBlock(),createBlock(VChip,{key:4,color:`warning`,size:`small`,variant:`tonal`,title:unref(launchStatusChipTitle)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(launchStatusChipText)),1)]),_:1},8,[`title`])):createCommentVNode(``,true),unref(launchStatusRetryVisible)?(openBlock(),createBlock(VBtn,{key:5,disabled:unref(loading),icon:unref(mdiRefresh),size:`small`,title:`Retry preview status`,variant:`text`,onClick:unref(retryLaunchStatus)},null,8,[`disabled`,`icon`,`onClick`])):createCommentVNode(``,true),__props.embeddedPreview?(openBlock(),createBlock(VBtn,{key:6,class:`vibe64-launch-controls__position-button`,disabled:unref(previewToolbarPosition)===`right`,icon:unref(mdiChevronRight),size:`small`,title:`Move controls right`,variant:`text`,onClick:_cache[5]||(_cache[5]=$event=>unref(movePreviewToolbar)(1))},null,8,[`disabled`,`icon`])):createCommentVNode(``,true),createVNode(Vibe64PreviewIssueMenu_default,{surface:__props.surface},null,8,[`surface`])])])],2)}}};var Vibe64OutputToolbar_default=_plugin_vue_export_helper_default(_sfc_main$3,[[`__scopeId`,`data-v-11bdc41d`]]);var _sfc_main$2={__name:`Vibe64PreviewRouteDialog`,props:{surface:{required:true,type:Object}},setup(__props){const{previewRouteDialogError,previewRouteDialogParams,previewRouteDialogPath,previewRouteDialogVisible,previewRouteFormValues,previewRouteSelection,submitPreviewRouteDialog}=__props.surface;return(_ctx,_cache)=>{return openBlock(),createBlock(VDialog,{modelValue:unref(previewRouteDialogVisible),"onUpdate:modelValue":_cache[1]||(_cache[1]=$event=>isRef(previewRouteDialogVisible)?previewRouteDialogVisible.value=$event:null),"max-width":`520`},{default:withCtx(()=>[createVNode(VCard,{class:`vibe64-launch-controls__route-card`},{default:withCtx(()=>[createVNode(VCardTitle,null,{default:withCtx(()=>[createTextVNode(toDisplayString(unref(previewRouteSelection)?.label||`Preview page`),1)]),_:1}),createVNode(VCardText,null,{default:withCtx(()=>[createVNode(VTextField,{density:`compact`,label:`URL`,"model-value":unref(previewRouteDialogPath),readonly:``,variant:`outlined`},null,8,[`model-value`]),(openBlock(true),createElementBlock(Fragment,null,renderList(unref(previewRouteDialogParams),param=>{return openBlock(),createBlock(VTextField,{key:param.name,modelValue:unref(previewRouteFormValues)[param.name],"onUpdate:modelValue":$event=>unref(previewRouteFormValues)[param.name]=$event,density:`comfortable`,hint:param.description,label:param.label,placeholder:param.placeholder,"persistent-hint":Boolean(param.description),variant:`outlined`,onKeydown:withKeys(withModifiers(unref(submitPreviewRouteDialog),[`prevent`]),[`enter`])},null,8,[`modelValue`,`onUpdate:modelValue`,`hint`,`label`,`placeholder`,`persistent-hint`,`onKeydown`])}),128)),unref(previewRouteDialogError)?(openBlock(),createBlock(VAlert,{key:0,density:`compact`,type:`warning`,variant:`tonal`},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(previewRouteDialogError)),1)]),_:1})):createCommentVNode(``,true)]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{variant:`text`,onClick:_cache[0]||(_cache[0]=$event=>previewRouteDialogVisible.value=false)},{default:withCtx(()=>[..._cache[2]||(_cache[2]=[createTextVNode(` Cancel `,-1)])]),_:1}),createVNode(VBtn,{color:`primary`,variant:`flat`,onClick:unref(submitPreviewRouteDialog)},{default:withCtx(()=>[..._cache[3]||(_cache[3]=[createTextVNode(` Open `,-1)])]),_:1},8,[`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`])}}};var Vibe64PreviewRouteDialog_default=_plugin_vue_export_helper_default(_sfc_main$2,[[`__scopeId`,`data-v-506152e8`]]);var _hoisted_1$1={key:0,class:`vibe64-launch-controls__preview-empty vibe64-launch-controls__preview-overlay`};var _hoisted_2$1={class:`vibe64-launch-controls__preview-pulse`};var _hoisted_3$1={key:1,class:`vibe64-launch-controls__preview-empty`,role:`status`};var _hoisted_4$1={key:2,class:`vibe64-launch-controls__preview-empty vibe64-launch-controls__preview-diagnostic`};var _hoisted_5={class:`vibe64-launch-controls__preview-diagnostic-actions`};var _hoisted_6={key:3,class:`vibe64-launch-controls__preview-empty`};var _hoisted_7=[`title`];var _hoisted_8={key:3,class:`vibe64-launch-controls__preview-status-detail`};var _sfc_main$1={__name:`Vibe64PreviewStatus`,props:{session:{default:null,type:Object},surface:{required:true,type:Object}},setup(__props){const{acceptResourceRetry,embeddedManualStartButtonDisabled,embeddedManualStartButtonVisible,forceStartEmbeddedPreview,launchStatusDetailText,loading,operationBusy,previewActivityVisible,previewCanShowLog,previewCheckAgainVisible,previewEmptyText,previewInFlightText,previewLoadingOverlayVisible,previewNotice,previewNoticeVisible,previewRecoveryLabel,previewRecoveryVisible,previewSetupRetryVisible,previewSuspended,previewUrl,recheckResourceAdmission,recoverEmbeddedPreview,resourceAdmissionId,resumePreview,retryLaunchStatus,retryPreviewWorkspaceSetup,showLaunchLog}=__props.surface;const resourceRecoveryControl=inject(VIBE64_RESOURCE_RECOVERY_KEY,null);const resourceRetryBusy=ref(false);function setResourceRetryBusy(value){if(!value&&!resourceRetryBusy.value)return;resourceRetryBusy.value=value;operationBusy.value=value}return(_ctx,_cache)=>{return openBlock(),createElementBlock(Fragment,null,[unref(previewLoadingOverlayVisible)?(openBlock(),createElementBlock(`div`,_hoisted_1$1,[createBaseVNode(`div`,_hoisted_2$1,[createVNode(VIcon,{icon:unref(mdiWebClock),size:`46`},null,8,[`icon`])]),createBaseVNode(`span`,null,toDisplayString(unref(previewInFlightText)||`Opening preview.`),1)])):createCommentVNode(``,true),unref(previewSuspended)?(openBlock(),createElementBlock(`div`,_hoisted_3$1,[_cache[1]||(_cache[1]=createBaseVNode(`strong`,null,`Preview suspended`,-1)),_cache[2]||(_cache[2]=createBaseVNode(`span`,null,`This page is unloaded. App servers and agents are unaffected. Unsaved page changes may be lost.`,-1)),createVNode(VBtn,{"prepend-icon":unref(mdiPlayCircleOutline),variant:`tonal`,onClick:unref(resumePreview)},{default:withCtx(()=>[..._cache[0]||(_cache[0]=[createTextVNode(`Resume preview`,-1)])]),_:1},8,[`prepend-icon`,`onClick`])])):unref(previewNoticeVisible)?(openBlock(),createElementBlock(`div`,_hoisted_4$1,[createVNode(VIcon,{class:`vibe64-launch-controls__preview-diagnostic-icon`,icon:unref(mdiAlertCircleOutline),size:`38`},null,8,[`icon`]),createBaseVNode(`strong`,null,toDisplayString(unref(previewNotice).title),1),createBaseVNode(`span`,null,toDisplayString(unref(previewNotice).message),1),createBaseVNode(`div`,_hoisted_5,[unref(resourceRecoveryControl)&&unref(resourceAdmissionId)?(openBlock(),createBlock(resolveDynamicComponent(unref(resourceRecoveryControl)),{key:`${__props.session?.sessionId}:${unref(resourceAdmissionId)}`,"admission-id":unref(resourceAdmissionId),"session-id":__props.session?.sessionId||``,disabled:unref(operationBusy)&&!resourceRetryBusy.value,onBusy:setResourceRetryBusy,onRetryResult:unref(acceptResourceRetry),onRecheck:unref(recheckResourceAdmission)},null,40,[`admission-id`,`session-id`,`disabled`,`onRetryResult`,`onRecheck`])):createCommentVNode(``,true),unref(previewRecoveryVisible)?(openBlock(),createBlock(VBtn,{key:1,disabled:resourceRetryBusy.value,color:`primary`,"prepend-icon":unref(mdiRefresh),size:`small`,variant:`flat`,onClick:unref(recoverEmbeddedPreview)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(previewRecoveryLabel)),1)]),_:1},8,[`disabled`,`prepend-icon`,`onClick`])):createCommentVNode(``,true),unref(previewCanShowLog)?(openBlock(),createBlock(VBtn,{key:2,"prepend-icon":unref(mdiConsoleLine),size:`small`,variant:`tonal`,onClick:unref(showLaunchLog)},{default:withCtx(()=>[..._cache[3]||(_cache[3]=[createTextVNode(` Show log `,-1)])]),_:1},8,[`prepend-icon`,`onClick`])):createCommentVNode(``,true)])])):!unref(previewUrl)?(openBlock(),createElementBlock(`div`,_hoisted_6,[createBaseVNode(`div`,{class:normalizeClass([`vibe64-launch-controls__preview-pulse`,{"vibe64-launch-controls__preview-pulse--active":unref(previewActivityVisible)}])},[createVNode(VIcon,{icon:unref(mdiWebClock),size:`46`},null,8,[`icon`])],2),createBaseVNode(`span`,{class:`vibe64-launch-controls__preview-empty-text`,title:unref(previewEmptyText)},toDisplayString(unref(previewEmptyText)),9,_hoisted_7),unref(embeddedManualStartButtonVisible)&&!unref(previewActivityVisible)?(openBlock(),createBlock(VBtn,{key:0,disabled:unref(embeddedManualStartButtonDisabled),color:`primary`,"prepend-icon":unref(mdiPlayCircleOutline),size:`small`,variant:`flat`,onClick:unref(forceStartEmbeddedPreview)},{default:withCtx(()=>[..._cache[4]||(_cache[4]=[createTextVNode(` Start preview `,-1)])]),_:1},8,[`disabled`,`prepend-icon`,`onClick`])):createCommentVNode(``,true),unref(previewSetupRetryVisible)?(openBlock(),createBlock(VBtn,{key:1,disabled:unref(operationBusy)||unref(loading),color:`primary`,"data-vibe64-preview-setup-retry":``,"prepend-icon":unref(mdiRefresh),size:`small`,title:`Run the session's declared setup steps again`,variant:`flat`,onClick:unref(retryPreviewWorkspaceSetup)},{default:withCtx(()=>[..._cache[5]||(_cache[5]=[createTextVNode(` Retry setup `,-1)])]),_:1},8,[`disabled`,`prepend-icon`,`onClick`])):unref(previewCheckAgainVisible)?(openBlock(),createBlock(VBtn,{key:2,disabled:unref(operationBusy)||unref(loading),"prepend-icon":unref(mdiRefresh),size:`small`,title:`Check preview availability again`,variant:`tonal`,onClick:unref(retryLaunchStatus)},{default:withCtx(()=>[..._cache[6]||(_cache[6]=[createTextVNode(` Check again `,-1)])]),_:1},8,[`disabled`,`prepend-icon`,`onClick`])):createCommentVNode(``,true),unref(launchStatusDetailText)&&unref(launchStatusDetailText)!==String(unref(previewEmptyText)||``).trim()?(openBlock(),createElementBlock(`code`,_hoisted_8,toDisplayString(unref(launchStatusDetailText)),1)):createCommentVNode(``,true)])):createCommentVNode(``,true)],64)}}};var Vibe64PreviewStatus_default=_plugin_vue_export_helper_default(_sfc_main$1,[[`__scopeId`,`data-v-5883c754`]]);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 AUTO_START_ATTEMPT_COOLDOWN_MS=7e3;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 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{}}var LAUNCH_STATUS_IDLE_RECOVERY_INITIAL_DELAY_MS=1200;var LAUNCH_STATUS_IDLE_RECOVERY_INTERVAL_MS=3e3;var LAUNCH_STATUS_IDLE_RECOVERY_LIMIT=6;function useVibe64OutputAutoStart({autoStartManagedPreview,autoStartTargetId,busy,launch,outputs,outputTerminal,previewDisplayed,projectSlug}){const{canLoadOutputs,launchScopeKey,launchStatusLoadError,outputTargets,outputTargetsResource,previewState,previewStoppedIntent,refresh,sessionId,sessionRevision,terminalDisplayed}=outputs;const{terminalVisible}=outputTerminal;const{autoStartKey,operationBusy,resourceAdmissionId,run}=launch;const autoStartCooldownVersion=ref(0);const launchStatusIdleRecoveryCount=ref(0);const launchStatusIdleRecoveryExhausted=computed(()=>launchStatusIdleRecoveryCount.value>=LAUNCH_STATUS_IDLE_RECOVERY_LIMIT);const outputTargetsSettledForAutoStart=ref(false);let autoStartTimer=0;let autoStartCooldownTimer=0;let scheduledAutoStartKey=``;let launchStatusIdleRecoveryTimer=0;let launchStatusIdleRecoveryScopeKey=``;let outputTargetsRefreshSessionId=sessionId.value;let outputTargetsRefreshRevision=sessionRevision.value;const requestedAutoStartTargetId=computed(()=>String(readRefOrGetterValue(autoStartTargetId)||``).trim());const autoStartRequestKey=computed(()=>requestedAutoStartTargetId.value||(readRefOrGetterValue(autoStartManagedPreview)===true?`managed-preview`:``));const previewPaneDisplayed=computed(()=>readRefOrGetterValue(previewDisplayed)!==false);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 outputTargetsLoadingForAutoStart=computed(()=>autoStartOutputsLoading({outputTargetsLoading:outputTargetsResource.isLoading.value,outputTargetsSettled:outputTargetsSettledForAutoStart.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`));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()},{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 resetAutoStart(){clearAutoStartTimer();resetOutputsAutoStartSettlement();resetLaunchStatusIdleRecovery()}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 autoStartReady(key,target){return 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})}watch(canLoadOutputs,canLoad=>{if(canLoad)return;resetAutoStart()},{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(()=>[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=autoStartReady(key,target);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(!autoStartReady(currentKey,currentTarget))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`||750<=0){start();return}autoStartTimer=window.setTimeout(start,750)},{flush:`post`,immediate:true});onBeforeUnmount(()=>{clearAutoStartTimer();clearAutoStartCooldownTimer();clearLaunchStatusIdleRecoveryTimer()});return{launchStatusIdleRecoveryExhausted,resetAutoStart}}var LAUNCH_STATUS_RETRY_LIMIT=2;var LAUNCH_STATUS_RETRY_BASE_DELAY_MS=1e3;var LAUNCH_STATUS_RETRY_MAX_DELAY_MS=5e3;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 outputTargetWorktreePath(session={}){return String(session?.sourcePath||``)}function launchControlsSessionCanRun(session={}){const metadata=normalizeObject(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 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`}var TERMINAL_STOP_POLL_INTERVAL_MS=100;var TERMINAL_STOP_POLL_ATTEMPTS=50;function delay(milliseconds=0){return new Promise(resolve=>setTimeout(resolve,milliseconds))}function useVibe64OutputLaunch({busy,embeddedPreview,outputs,outputTerminal,projectSlug}){const{canLoadOutputs,launchScopeKey,previewState,refresh,sessionId,sessionsApiPath,status,workspacePreparing}=outputs;const{activeOutputTarget,activeOutputTargetId,activeTerminal,applyLaunchTerminalSession,clearStaleLaunchTerminal,connectLaunchTerminal,terminal,terminalCanClose,terminalCanStop,terminalExpanded,terminalIndicatorState,terminalIsRunning}=outputTerminal;const{terminalMetadata,terminalSessionId}=terminal;const operationBusy=ref(false);const launchError=ref(``);const refusedAdmissionId=ref(``);const launchStarting=ref(false);const launchWaiting=ref(false);const autoStartKey=ref(``);let disposed=false;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 resourceAdmissionId=computed(()=>[`ready`,`starting`].includes(previewState.value)?``:refusedAdmissionId.value||String(status.value.resourceAdmissionId||``));const terminalCanRetry=computed(()=>Boolean(!terminalIsRunning.value&&activeOutputTargetId.value));const terminalCanRestart=computed(()=>Boolean(terminalCanStop.value&&activeOutputTargetId.value));const launchButtonsDisabled=computed(()=>Boolean(workspacePreparing.value||readRefOrGetterValue(busy)||operationBusy.value||terminalIsRunning.value));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 externalBusy=readRefOrGetterValue(busy);const currentSessionId=sessionId.value;const startedScopeKey=launchScopeKey.value;if(!currentSessionId||!canLoadOutputs.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||!canLoadOutputs.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}}async function acceptResourceRetry(result={}){if(result.ok===false)return;refusedAdmissionId.value=``;launchError.value=``;if(applyLaunchTerminalSession(result))connectLaunchTerminal();await refresh()}async function stopTerminal(){if(!sessionId.value||!terminalSessionId.value)return false;operationBusy.value=true;try{const stopped=await stopTerminalCommand.run({sessionId:sessionId.value,terminalSessionId:terminalSessionId.value});applyLaunchTerminalSession(stopped);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;if(!target)return false;return run(target,{applyDefaultDisplay:false,forceRestart:true})}async function retryTerminal(){if(!terminalCanRetry.value)return false;const target=activeOutputTarget.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});clearStaleLaunchTerminal();terminalExpanded.value=false;await refresh();return true}catch{return false}finally{operationBusy.value=false}}function resetLaunch(){autoStartKey.value=``;launchError.value=``;refusedAdmissionId.value=``;launchWaiting.value=false}watch([previewState,terminalIndicatorState,launchError],([state,indicator])=>{if(state===`ready`&&indicator===`running`){launchError.value=``;refusedAdmissionId.value=``;launchWaiting.value=false}});onBeforeUnmount(()=>{disposed=true});return{acceptResourceRetry,autoStartKey,closeTerminal,launchButtonsDisabled,launchError,launchStarting,launchWaiting,operationBusy,parametersForTarget,parametersRemembered,rememberParameters,resetLaunch,resourceAdmissionId,restartTerminal,retryTerminal,run,stopTerminal,terminalCanRestart,terminalCanRetry}}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_INTERACTION_MESSAGE_TYPE=`vibe64:preview-interaction`;var PREVIEW_PICK_RESULT_MESSAGE_TYPE=`vibe64:preview-pick-result`;var PREVIEW_PICK_START_MESSAGE_TYPE=`vibe64:preview-pick-start`;var PREVIEW_PICK_STOP_MESSAGE_TYPE=`vibe64:preview-pick-stop`;var PREVIEW_RECORDING_MESSAGE_TYPE=`vibe64:preview-recording`;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 localPreviewBrowserHref(){if(typeof window===`undefined`)return``;return String(window.location?.href||``)}function browserCanOpenTarget(target={}){return String(target.kind||`url`)===`url`&&Boolean(String(target.href||``).trim())}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 preview proxy 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 proxied 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 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]`}var LAUNCH_BROWSER_WINDOW_FEATURES=`popup,width=1400,height=900,left=80,top=60`;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 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 normalizeLaunchPreview(preview={}){const source=normalizeObject(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=isRecord(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 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=normalizeObject(status);const previewSource=normalizeObject(source.preview);const preview=normalizeLaunchPreview(previewSource);if(previewSource.state||preview.href||preview.targetHref)return preview;const previewTarget=normalizeObject(source.previewTarget);const openTarget=normalizeObject(source.openTarget);const href=String(previewTarget.href||openTarget.previewHref||``).trim();if(!href||previewTarget.available===false||openTarget.available===false)return preview;const activeTerminal=normalizeObject(source.activeTerminal);return normalizeLaunchPreview({canRestart:Boolean(activeTerminal.id||normalizeObject(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 launchTerminalIsReady(metadata={}){return metadata?.launchReady===true||metadata?.launchReady===`true`}function launchPreviewRequiresProxy(metadata={}){return Boolean(String(metadata?.previewAuth||``).trim())}function useVibe64OutputPreview({outputs,outputTerminal,projectSlug}){const{previewHref,previewMessage,previewRecovery,previewState,previewTarget,previewTargetHref,selectedSession,sessionId,sessionsApiPath,status}=outputs;const{activeOutputTarget,activeTerminal,terminal,terminalIsRunning,terminalLaunchReady}=outputTerminal;const{terminalMetadata}=terminal;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 previewIdentity=computed(()=>{const value=status.value.previewIdentity;return isRecord(value)?value:{available:false,defaultMode:`guest`,disabledReason:``,identities:[]}});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 terminalPreviewRequiresProxy=computed(()=>launchPreviewRequiresProxy({...activeTerminal.value?.metadata||{},...terminalMetadata.value||{}}));const previewTargetDisabledReason=computed(()=>![`ready`,`stale`].includes(previewState.value)?previewMessage.value:``);const previewTargetRecovery=computed(()=>previewRecovery.value);const terminalPreviewProxyPending=computed(()=>Boolean(terminalPreviewRequiresProxy.value&&terminalLaunchReady.value&&terminalIsRunning.value&&!previewHref.value));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})}function openAction(action={}){return openLaunchBrowserTarget(action,selectedSession.value,null,projectSlug.value)}return{launchActions,openAction,previewIdentity,previewTargetDisabledReason,previewTargetRecovery,previewTestNotice,publishPreviewDiagnostic,publishPreviewState,requestPreviewIdentityGrant,terminalPreviewProxyPending,terminalPreviewRequiresProxy}}function useVibe64OutputStatus({localLaunchStarting,projectSlug,session,sourceOperationsSuspended,windowDisplayed}){const paths=usePaths();const launchStatusAttempt=ref(0);const sourceOperationsResumePending=ref(false);let launchStatusAttemptLoading=false;let launchStatusAttemptScopeKey=``;const selectedSession=computed(()=>readRefOrGetterValue(session)||null);const sessionId=computed(()=>String(selectedSession.value?.sessionId||``));const sessionRevision=computed(()=>vibe64SessionRevision(selectedSession.value));const launchScopeKey=computed(()=>launchControlScopeKey(projectSlug.value,sessionId.value));const terminalDisplayed=computed(()=>readRefOrGetterValue(windowDisplayed)!==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 outputTargetsRequestPath=computed(()=>{const origin=typeof window===`undefined`?``:String(window.location?.origin||``);return outputTargetsPath.value&&origin?`${outputTargetsPath.value}?editorOrigin=${encodeURIComponent(origin)}`:outputTargetsPath.value});const outputTargetsResource=useEndpointResource({enabled:canLoadOutputs,fallbackLoadError:`Outputs could not be loaded.`,path:outputTargetsRequestPath,queryOptions:{retry:launchStatusShouldRetry,retryDelay:launchStatusRetryDelay},queryKey:computed(()=>vibe64OutputsQueryKey(`app`,ROUTE_VISIBILITY_PUBLIC,sessionId.value,projectSlug.value)),refreshOnPull:true,requestRecovery:false,realtime:null});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``;const error=outputTargetsResource.query?.error?.value||null;return launchStatusErrorText({error,fallback:outputTargetsResource.loadError.value,path:outputTargetsPath.value})});const preview=computed(()=>launchPreviewFromStatus(status.value));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 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(()=>isRecord(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 isRecord(value)?value:{error:null,mode:``,presentationKind:``,state:`idle`,targetId:``}});async function refresh({scopeKey=launchScopeKey.value}={}){if(!canLoadOutputs.value)return null;const refreshScopeKey=String(scopeKey||``).trim();if(!refreshScopeKey||refreshScopeKey!==launchScopeKey.value)return null;return typeof outputTargetsResource.query?.refetch===`function`?outputTargetsResource.query.refetch({cancelRefetch:true}):outputTargetsResource.reload()}async function startWorkspaceSetupWhen(status=``){if(String(selectedSession.value?.workspaceSetup?.status||``).trim()!==status||!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}}function resetLaunchStatusAttempt(){launchStatusAttempt.value=0;launchStatusAttemptLoading=false;launchStatusAttemptScopeKey=launchScopeKey.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:localLaunchStarting(),payload:context?.payload||{}},sessionId.value),onEvent:()=>refresh()});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});return{canLoadOutputs,launchScopeKey,launchStatusAttempt,launchStatusLoadError,outputExecution,outputResults,outputRuns,outputTargets,outputTargetsLoaded,outputTargetsResource,previewCanRestart,previewCanShowLog,previewCanStart,previewHref,previewMessage,previewRecovery,previewState,previewStoppedIntent,previewTarget,previewTargetHref,refresh,resetLaunchStatusAttempt,selectedSession,sessionId,sessionRevision,sessionsApiPath,startWorkspaceSetupWhen,status,terminalDisplayed,testApproval,workspacePreparing}}function useVibe64OutputTerminal({outputs,projectSlug}){const{outputExecution,outputTargets,selectedSession,sessionId,status,terminalDisplayed}=outputs;const terminalExpanded=ref(false);let attachedTerminalId=``;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,terminalExitCode,terminalExited,terminalMetadata,terminalOutput,terminalSessionId,terminalStarting,terminalStatus}=terminal;const activeTerminal=computed(()=>{const terminalStatusValue=status.value.activeTerminal;return isRecord(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 terminalLaunchReady=computed(()=>launchTerminalIsReady({...activeTerminal.value?.metadata||{},...terminalMetadata.value||{}}));const terminalIsRunning=computed(()=>{const statusValue=terminalStatus.value||activeTerminal.value?.status||``;return statusValue===`running`||statusValue===`closing`||terminalStarting.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 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 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.`});function applyLaunchTerminalSession(terminalSession={}){if(!terminalSession||terminalSession.ok===false||!terminalSession.id)return false;attachedTerminalId=terminalSession.id;applyTerminalSession(terminalSession,{fallbackStatus:`running`});return true}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()}function clearStaleLaunchTerminal(){attachedTerminalId=``;closeTerminalSocket();resetTerminalSessionState();resetTerminalDisplay()}function hideLaunchTerminal(){closeTerminalSocket();disposeTerminalDisplay()}function resetLaunchTerminal(){attachedTerminalId=``;closeTerminalSocket();disposeTerminalDisplay();resetTerminalSessionState();resetTerminalDisplay();terminalExpanded.value=false}async function copyLog(){if(!terminalOutput.value||typeof navigator===`undefined`||!navigator.clipboard?.writeText)return false;await navigator.clipboard.writeText(terminalOutput.value);return true}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});onBeforeUnmount(disposeTerminalUi);return{activeOutputTarget,activeOutputTargetId,activeTerminal,applyLaunchTerminalSession,clearStaleLaunchTerminal,connectLaunchTerminal,copyLog,expandTerminal,hideLaunchTerminal,minimizeTerminal,resetLaunchTerminal,terminal,terminalCanClose,terminalCanCopyLog,terminalCanStop,terminalDockVisible,terminalExpanded,terminalIndicatorLabel,terminalIndicatorState,terminalIsRunning,terminalLaunchReady,terminalSubtitle,terminalTitle,terminalVisible,terminalWindowStorageKey,terminalWindowVisible}}function useVibe64OutputControls({autoStartManagedPreview=()=>false,autoStartTargetId=()=>``,busy=()=>false,embeddedPreview=()=>false,previewDisplayed=()=>true,session=null,sourceOperationsSuspended=()=>false,windowDisplayed=()=>true}={}){const projectSlug=useVibe64ProjectSlug();const outputs=useVibe64OutputStatus({localLaunchStarting:()=>launch.launchStarting.value,projectSlug,session,sourceOperationsSuspended,windowDisplayed});const outputTerminal=useVibe64OutputTerminal({outputs,projectSlug});const preview=useVibe64OutputPreview({outputs,outputTerminal,projectSlug});const launch=useVibe64OutputLaunch({busy,embeddedPreview,outputs,outputTerminal,projectSlug});const autoStart=useVibe64OutputAutoStart({autoStartManagedPreview,autoStartTargetId,busy,launch,outputs,outputTerminal,previewDisplayed,projectSlug});const{terminal}=outputTerminal;const visible=computed(()=>Boolean((outputs.canLoadOutputs.value||outputTerminal.terminalVisible.value)&&(outputs.outputTargets.value.length>0||outputs.outputTargetsResource.loadError.value||outputTerminal.terminalVisible.value)));watch(terminal.terminalError,message=>{if(!terminalSessionMissingError(message))return;outputTerminal.clearStaleLaunchTerminal();outputs.refresh()});watch(outputs.terminalDisplayed,displayed=>{if(displayed){outputTerminal.connectLaunchTerminal();return}autoStart.resetAutoStart();outputTerminal.hideLaunchTerminal()});watch(outputs.launchScopeKey,()=>{launch.resetLaunch();outputs.resetLaunchStatusAttempt();autoStart.resetAutoStart();outputTerminal.resetLaunchTerminal()});return{activeOutputTarget:outputTerminal.activeOutputTarget,previewTestNotice:preview.previewTestNotice,activeOutputTargetId:outputTerminal.activeOutputTargetId,activeTerminal:outputTerminal.activeTerminal,closeTerminal:launch.closeTerminal,copyLog:outputTerminal.copyLog,expandTerminal:outputTerminal.expandTerminal,launchActions:preview.launchActions,launchButtonsDisabled:launch.launchButtonsDisabled,launchError:launch.launchError,resourceAdmissionId:launch.resourceAdmissionId,acceptResourceRetry:launch.acceptResourceRetry,testApproval:outputs.testApproval,launchStatusAttempt:outputs.launchStatusAttempt,launchStatusIdleRecoveryExhausted:autoStart.launchStatusIdleRecoveryExhausted,launchStarting:launch.launchStarting,launchWaiting:computed(()=>outputs.workspacePreparing.value||launch.launchWaiting.value),workspacePreparing:outputs.workspacePreparing,outputTargets:outputs.outputTargets,outputTargetsLoaded:outputs.outputTargetsLoaded,outputExecution:outputs.outputExecution,outputResults:outputs.outputResults,outputRuns:outputs.outputRuns,loading:outputs.outputTargetsResource.isLoading,loadError:outputs.launchStatusLoadError,minimizeTerminal:outputTerminal.minimizeTerminal,openAction:preview.openAction,operationBusy:launch.operationBusy,previewCanRestart:outputs.previewCanRestart,previewCanShowLog:outputs.previewCanShowLog,previewCanStart:outputs.previewCanStart,previewHref:outputs.previewHref,previewIdentity:preview.previewIdentity,previewMessage:outputs.previewMessage,previewState:outputs.previewState,previewStoppedIntent:outputs.previewStoppedIntent,previewTargetDisabledReason:preview.previewTargetDisabledReason,previewTargetHref:outputs.previewTargetHref,previewTargetRecovery:preview.previewTargetRecovery,terminalPreviewRequiresProxy:preview.terminalPreviewRequiresProxy,terminalPreviewProxyPending:preview.terminalPreviewProxyPending,publishPreviewState:preview.publishPreviewState,publishPreviewDiagnostic:preview.publishPreviewDiagnostic,requestPreviewIdentityGrant:preview.requestPreviewIdentityGrant,refresh:outputs.refresh,restartTerminal:launch.restartTerminal,retryTerminal:launch.retryTerminal,parametersForTarget:launch.parametersForTarget,parametersRemembered:launch.parametersRemembered,rememberParameters:launch.rememberParameters,run:launch.run,sendCtrlC:terminal.sendCtrlC,stopTerminal:launch.stopTerminal,startNewlyConfiguredWorkspaceSetup:()=>outputs.startWorkspaceSetupWhen(`unconfigured`),retryFailedWorkspaceSetup:()=>outputs.startWorkspaceSetupWhen(`failed`),terminal,terminalCanClose:outputTerminal.terminalCanClose,terminalCanCopyLog:outputTerminal.terminalCanCopyLog,terminalCanRestart:launch.terminalCanRestart,terminalCanRetry:launch.terminalCanRetry,terminalCanStop:outputTerminal.terminalCanStop,terminalCommandPreview:terminal.terminalCommandPreview,terminalDisplayed:outputs.terminalDisplayed,terminalDockVisible:outputTerminal.terminalDockVisible,terminalError:terminal.terminalError,terminalExpanded:outputTerminal.terminalExpanded,terminalExited:terminal.terminalExited,terminalExitCode:terminal.terminalExitCode,terminalIndicatorLabel:outputTerminal.terminalIndicatorLabel,terminalIndicatorState:outputTerminal.terminalIndicatorState,terminalIsRunning:outputTerminal.terminalIsRunning,terminalLaunchReady:outputTerminal.terminalLaunchReady,terminalMetadata:terminal.terminalMetadata,terminalOutput:terminal.terminalOutput,terminalSessionId:terminal.terminalSessionId,terminalStarting:terminal.terminalStarting,terminalStatus:terminal.terminalStatus,terminalSubtitle:outputTerminal.terminalSubtitle,terminalTitle:outputTerminal.terminalTitle,terminalVisible:outputTerminal.terminalVisible,terminalWindowStorageKey:outputTerminal.terminalWindowStorageKey,terminalWindowVisible:outputTerminal.terminalWindowVisible,visible}}function useVibe64OutputOptions({outputs,projectSlug,props,targets}){const{launchError,operationBusy,outputTargets,parametersForTarget,parametersRemembered,rememberParameters,run,terminalIsRunning}=outputs;const{outputOptionsTarget}=targets;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});return{openOutputOptions,outputOptionsAction,outputOptionsError,outputOptionsErrors,outputOptionsRemember,outputOptionsSelection,outputOptionsValues,outputOptionsVisible,resetOutputOptions,runWithOptions,submitOutputOptions}}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&¶m?.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_DISPLAY_QUERY_PARAMS=Object.freeze([PREVIEW_PROXY_TOKEN_QUERY_PARAM]);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 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 redactPreviewDebugDetails(value){if(typeof value===`string`)return value.includes(`vibe64_preview_token`)?previewUrlWithoutDisplayParams(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 useVibe64PreviewAddress({frame,projectSlug,props,targets}){const{previewBaseUrl,previewDebugLog,previewDisplayBaseUrl,previewReadyForIframe,previewVisitedUrl,requestPreviewFrame}=frame;const{previewContextTarget}=targets;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 previewLocationStorageKey=computed(()=>props.embeddedPreview&&props.session?launchPreviewLocationStorageKey(props.session,projectSlug.value):``);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 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);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 recordPreviewVisit(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});recordPreviewVisit(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}watch(previewLocationStorageKey,(storageKey,previousStorageKey)=>{if(storageKey===previousStorageKey)return;previewVisitedUrl.value=``;resetPreviewHistory(``)},{flush:`sync`,immediate:true});watch([previewReadyForIframe,previewBaseUrl,previewDisplayBaseUrl],([,,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)}},{flush:`sync`,immediate:true});watch(previewDisplayedAddress,url=>{if(!previewAddressFocused.value)previewAddressDraft.value=url||``},{immediate:true});return{copyPreviewUrl,goPreviewBack,openPreviewRoute,previewAddressBlur,previewAddressDraft,previewAddressError,previewAddressFocus,previewBackAvailable,previewDisplayedAddress,previewDisplayedUrl,previewRouteDialogError,previewRouteDialogParams,previewRouteDialogPath,previewRouteDialogVisible,previewRouteFormValues,previewRouteSelection,previewRoutes,previewRoutesAvailable,resetPreviewAddressDraft,recordPreviewVisit,submitPreviewAddress,submitPreviewRouteDialog}}var ORIENTATION_AVAILABLE_MESSAGE_TYPE=`orientation-available`;var ORIENTATION_INIT_MESSAGE_TYPE=`orientation-init`;var ORIENTATION_PROTOCOL_VERSION=1;var PACKET_FIELDS=Object.freeze([`type`,`protocolVersion`,`playerInstanceId`,`instanceId`]);function isOrientationAnnouncement(value){return value?.type===ORIENTATION_AVAILABLE_MESSAGE_TYPE}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 exactFields(value,fields){return value&&typeof value===`object`&&!Array.isArray(value)&&Object.keys(value).sort().join(`,`)===fields.slice().sort().join(`,`)}function useVibe64LearningOrientation({preview,frameVisible}){const learning=useVibe64Learning();const reportActivity=usePageActivity();let orientation=null;function frameCurrent(channel){const current=preview();return orientation===channel&&Boolean(current)&¤t.frame===channel.frame&¤t.frame?.contentWindow===channel.window&¤t.frameRequestId===channel.frameRequestId&¤t.sessionId===channel.sessionId&¤t.terminalSessionId===channel.terminalSessionId&¤t.projectSlug===channel.projectSlug}function channelVisible(channel){return frameCurrent(channel)&&frameVisible(channel.frame)}function retireInteraction(channel=orientation){if(channel)channel.pending=null}function close(){retireInteraction();orientation?.port?.close();orientation=null}function interactionCurrent(channel,pending){return channel.pending===pending&&channelVisible(channel)&&learning.exerciseCurrent(pending.ticket)}function handlePacket(channel,input){if(!frameCurrent(channel))return;if(input?.protocolVersion!==ORIENTATION_PROTOCOL_VERSION||input.playerInstanceId!==channel.playerInstanceId||input.instanceId!==channel.instanceId){retireInteraction(channel);return}if(input.type===`ready`&&exactFields(input,PACKET_FIELDS)){channel.ready=true;return}if(!channel.ready||!channelVisible(channel)){retireInteraction(channel);return}if(input.type===`button`&&exactFields(input,[...PACKET_FIELDS,`interactionId`])&&orientationUuid(input.interactionId)){retireInteraction(channel);reportActivity(`app-pressed`,{projectSlug:channel.projectSlug,sessionId:channel.sessionId});const ticket=learning.beginExercise(channel.projectSlug);if(ticket)channel.pending={ticket,interactionId:input.interactionId,phase:`button`};return}const pending=channel.pending;if(!pending||input.interactionId!==pending.interactionId)return;if(!interactionCurrent(channel,pending)){retireInteraction(channel);return}if(input.type===`request`&&pending.phase===`button`&&typeof input.method===`string`&&typeof input.path===`string`&&exactFields(input,[...PACKET_FIELDS,`interactionId`,`method`,`path`])){pending.phase=`request`;return}if(input.type===`response-displayed`&&pending.phase===`request`&&orientationUuid(input.requestId)&&typeof input.message===`string`&&exactFields(input,[...PACKET_FIELDS,`interactionId`,`requestId`,`message`])){retireInteraction(channel);learning.finishExercise(pending.ticket,{sessionId:channel.sessionId,instanceId:channel.instanceId,interactionId:pending.interactionId,requestId:input.requestId});return}retireInteraction(channel)}function connect(){const channel=orientation;if(!channel||channel.port||!frameCurrent(channel)||!preview()?.loaded)return;const ports=new MessageChannel;channel.port=ports.port1;channel.port.onmessage=event=>handlePacket(channel,event.data);channel.port.onmessageerror=()=>retireInteraction(channel);channel.port.start();try{channel.window.postMessage({type:ORIENTATION_INIT_MESSAGE_TYPE,protocolVersion:ORIENTATION_PROTOCOL_VERSION,playerInstanceId:channel.playerInstanceId},channel.origin,[ports.port2])}catch{ports.port2.close();close()}}function announce(event){const current=preview();if(!exactFields(event.data,[`type`,`protocolVersion`,`instanceId`])||event.data.protocolVersion!==ORIENTATION_PROTOCOL_VERSION||!orientationUuid(event.data.instanceId)||event.ports?.length||!current?.frameRequestId||!current.projectSlug||!current.sessionId||!current.terminalSessionId)return;learning.prepareExercise(current.projectSlug);if(orientation&&frameCurrent(orientation)&&orientation.instanceId===event.data.instanceId)return;close();orientation={frame:current.frame,window:event.source,origin:event.origin,frameRequestId:current.frameRequestId,projectSlug:current.projectSlug,sessionId:current.sessionId,terminalSessionId:current.terminalSessionId,instanceId:event.data.instanceId,playerInstanceId:crypto.randomUUID(),ready:false,port:null,pending:null};connect()}function invalidateHidden(){if(orientation?.pending&&!interactionCurrent(orientation,orientation.pending))retireInteraction()}watch(()=>{const current=preview();return[current?.frame,current?.frameRequestId,current?.loaded,current?.displayed,current?.projectSlug,current?.sessionId,current?.terminalSessionId,learning.exerciseStep(current?.projectSlug)]},()=>{if(orientation&&!frameCurrent(orientation))close();else connect();invalidateHidden()},{flush:`sync`});onBeforeMount(()=>{document.addEventListener(`visibilitychange`,invalidateHidden)});onBeforeUnmount(()=>{document.removeEventListener(`visibilitychange`,invalidateHidden);close()});return{announce,close}}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,fallback=`Preview capture failed.`){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((typeof error===`string`?error:error?.message)||``).trim()||fallback}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 canDeliver=typeof prepareFile===`function`||typeof attachFile===`function`;const supported=computed(()=>session.supported());const buttonVisible=computed(()=>previewCaptureAvailable({canAttach:canDeliver,displayed:readRefOrGetterValue(previewDisplayed)===true,loaded:readRefOrGetterValue(previewLoaded)===true,supported:supported.value,visible:visible.value}));async function deliverPreviewFile({attachFailureMessage=`The preview file could not be attached to the current message.`,busy:deliveryBusy,failureMessage=`The preview file could not be attached.`,fileName,produce}){if(deliveryBusy.value||!canDeliver)return false;deliveryBusy.value=true;noticeVisible.value=false;try{const result=typeof prepareFile===`function`?await prepareFile({fileName,produce}):await attachFile(await produce({}));if(!(Array.isArray(result)?result.length>0:Boolean(result))){if(typeof prepareFile===`function`)return false;throw new Error(attachFailureMessage)}noticeText.value=``;noticeVisible.value=false;return true}catch(error){if(error?.name===`AbortError`||error?.code===`capture_cancelled`)return false;noticeColor.value=`error`;noticeText.value=previewCaptureErrorMessage(error,failureMessage);noticeVisible.value=true;return false}finally{deliveryBusy.value=false}}async function capturePreview(){if(busy.value||!currentVisibleRect())return false;try{return await deliverPreviewFile({attachFailureMessage:`The preview image could not be attached to the current message.`,busy,failureMessage:`Preview capture failed.`,fileName:`Preview screenshot`,produce:({signal}={})=>{const stopCapture=()=>session.stop();signal?.addEventListener?.(`abort`,stopCapture,{once:true});return session.capture(currentVisibleRect).finally(()=>{signal?.removeEventListener?.(`abort`,stopCapture)})}})}finally{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,deliverPreviewFile,noticeColor,noticeText,noticeVisible,refreshVisibility,supported,visible}}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 isPreviewBridgeReadyMessage(value={}){return String(value?.type||``)===PREVIEW_BRIDGE_READY_MESSAGE_TYPE}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 previewLoadingOverlayShouldShow({identityBusy=false,loadedFrameRequestId=0,previewFrameRequestId=0,previewUrl=``}={}){return Boolean(identityBusy||previewOpeningOverlayVisible({loadedFrameRequestId,previewFrameRequestId,previewUrl}))}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,targetOrigin=``,targetWindow=null,timeoutMessage=`The application preview did not respond in time.`,timeoutMs=3e3}={}){if(!targetOrigin||!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},targetOrigin)}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})}var PREVIEW_DIAGNOSTICS_TIMEOUT_MS=3e3;var PREVIEW_IDENTITY_TIMEOUT_MS=1e4;function useVibe64PreviewFrame({followIdentityReload,identityBusy,identityFrameReady,outputs,projectSlug,props,resourceRetryCount}){const{activeOutputTargetId,launchActions,previewState,publishPreviewDiagnostic,terminalPreviewRequiresProxy,terminalSessionId}=outputs;const previewFrame=ref(null);const previewSuspended=ref(false);const previewBridgeVersion=ref(0);let previewBridgeOrigin=``;const previewBridgeRequests=createPreviewBridgeRequestRegistry();const previewDiagnosticsBusy=ref(false);const previewPicking=ref(false);const previewFrameRequest=ref({id:0,identity:``,src:``});const previewLoadedFrameRequestId=ref(0);const previewVisitedUrl=ref(``);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 previewPaneDisplayed=computed(()=>props.previewDisplayed!==false);const previewReadyForIframe=computed(()=>Boolean([`ready`,`stale`].includes(previewState.value)&&previewBaseUrl.value));const previewIdentityLifecycleKey=computed(()=>previewIdentityLifecycleIdentity({outputTargetId:activeOutputTargetId.value,previewBaseUrl:previewBaseUrl.value,projectSlug:projectSlug.value,sessionId:props.session?.sessionId,terminalSessionId:terminalSessionId.value}));const previewFrameRequestId=computed(()=>previewFrameRequest.value.id);const previewUrl=computed(()=>previewFrameRequest.value.src);const previewFrameLoaded=computed(()=>Boolean(previewUrl.value&&previewFrameRequestId.value>0&&previewLoadedFrameRequestId.value===previewFrameRequestId.value));const previewDiagnosticsAvailable=computed(()=>Boolean(previewFrameLoaded.value&&previewFrame.value?.contentWindow&&previewBridgeVersion.value>=8));const previewLoadingOverlayVisible=computed(()=>previewLoadingOverlayShouldShow({identityBusy:identityBusy(),loadedFrameRequestId:previewLoadedFrameRequestId.value,previewFrameRequestId:previewFrameRequestId.value,previewUrl:previewUrl.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??resourceRetryCount(),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=``){switchPreviewPicking(false);previewBridgeVersion.value=0;previewBridgeOrigin=``;previewBridgeRequests.rejectAll(`The application preview changed.`);previewDiagnosticsBusy.value=false;previewDebugLog(`bridge.reset`,{reason})}function postToPreviewBridge(message={}){const target=previewFrame.value?.contentWindow;if(!target||!previewBridgeOrigin)return false;target.postMessage({...message,version:8},previewBridgeOrigin);return true}function previewPickKeydown(event){if(event?.key===`Escape`)stopPreviewPick()}function switchPreviewPicking(picking){if(previewPicking.value===picking)return;previewPicking.value=picking;if(picking)window.addEventListener(`keydown`,previewPickKeydown);else window.removeEventListener(`keydown`,previewPickKeydown)}function stopPreviewPick(){if(previewPicking.value){switchPreviewPicking(false);postToPreviewBridge({type:PREVIEW_PICK_STOP_MESSAGE_TYPE})}}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}))}const orientation=useVibe64LearningOrientation({preview:()=>props.embeddedPreview&&previewUrl.value?{frame:previewFrame.value,frameRequestId:previewFrameRequestId.value,loaded:previewFrameLoaded.value,displayed:previewPaneDisplayed.value&&props.windowDisplayed!==false,projectSlug:projectSlug.value,sessionId:props.session?.sessionId,terminalSessionId:terminalSessionId.value}:null,frameVisible:previewFrameVisible});function clearPreviewFrame(reason=``){orientation.close();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:activeOutputTargetId.value,sessionId:props.session?.sessionId,src:nextSrc,terminalSessionId:terminalSessionId.value});if(!nextIdentity||!force&&nextIdentity===previewFrameRequest.value.identity)return false;orientation.close();resetPreviewBridge(reason||`frame-requested`);previewFrameRequest.value={id:previewFrameRequest.value.id+1,identity:nextIdentity,src:nextSrc};followIdentityReload(previewFrameRequest.value.id);previewDebugLog(`frame.requested`,{force,reason,src:nextSrc});return true}function requestPreviewState(){if(!previewPaneDisplayed.value||!previewFrame.value?.contentWindow||!previewUrl.value||!previewBridgeOrigin){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},previewBridgeOrigin)}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,targetOrigin:previewBridgeOrigin,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},targetOrigin:previewBridgeOrigin,targetWindow:previewFrame.value?.contentWindow,timeoutMessage:`The application preview did not complete the identity exchange in time.`,timeoutMs:PREVIEW_IDENTITY_TIMEOUT_MS})}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});identityFrameReady(normalizedRequestId);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()}function receivePreviewBridgeMessage(event){const bridgeReady=isPreviewBridgeReadyMessage(event.data);if(bridgeReady&&previewFrameLoaded.value){orientation.close();resetPreviewBridge(`bridge-document-ready`)}previewBridgeVersion.value=Math.max(previewBridgeVersion.value,Math.max(0,Number(event?.data?.version)||0));if(bridgeReady){previewBridgeOrigin=String(event.origin||``);markPreviewFrameReady(previewFrameRequestId.value,`bridge-ready`)}return bridgeReady}function cancelPreviewBridgeRequests(message){previewBridgeRequests.rejectAll(message);previewDiagnosticsBusy.value=false}onBeforeUnmount(()=>{stopPreviewPick();previewBridgeRequests.rejectAll(`The application preview closed.`)});return{cancelPreviewBridgeRequests,clearPreviewFrame,handlePreviewFrameLoad,orientation,postToPreviewBridge,previewBaseUrl,previewBridgeRequests,previewBridgeVersion,previewDebugLog,previewDiagnosticsAvailable,previewDiagnosticsBusy,previewDisplayBaseUrl,previewEmbedUnavailableReason,previewFrame,previewFrameLoaded,previewFrameRequestId,previewIdentityLifecycleKey,previewLoadingOverlayVisible,previewPaneDisplayed,previewPicking,previewReadyForIframe,previewSuspended,previewUrl,previewVisitedUrl,receivePreviewBridgeMessage,requestPreviewDiagnostics,requestPreviewFrame,requestPreviewIdentityExchange,requestPreviewState,switchPreviewPicking,stopPreviewPick}}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]);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 defaultPreviewIdentitySelection({capability=null}={}){const name=String(capability?.defaultIdentityName||``).trim();return capability?.defaultMode===`identity`&&name?{identityName:name,mode:`identity`}:{mode:`guest`}}function useVibe64PreviewIdentity({frame,outputs,props}){const{previewIdentity:previewIdentityCapability,requestPreviewIdentityGrant}=outputs;const{cancelPreviewBridgeRequests,orientation,previewFrameLoaded,previewFrameRequestId,previewIdentityLifecycleKey,previewSuspended,requestPreviewFrame,requestPreviewIdentityExchange}=frame;const previewIdentityBusy=ref(false);const previewIdentityCurrent=ref(null);const previewIdentityError=ref(``);const previewIdentityRequested=ref(null);let previewIdentityAutomaticAttempt=``;let previewIdentityResumeSelection=null;let previewIdentityLifecycle=``;let previewIdentityReloadRequestId=0;const previewIdentityAvailable=computed(()=>Boolean(props.embeddedPreview&&previewIdentityCapability.value?.available===true));const previewIdentityConfigured=computed(()=>normalizeConfiguredPreviewIdentities(previewIdentityCapability.value?.identities));const previewIdentityLabel=computed(()=>previewIdentityLabelText({busy:previewIdentityBusy.value,identity:previewIdentityCurrent.value}));const previewIdentityTitle=computed(()=>previewIdentityTitleText({busy:previewIdentityBusy.value,error:previewIdentityError.value,identity:previewIdentityCurrent.value}));const previewIdentitySelectionDisabled=computed(()=>Boolean(previewIdentityBusy.value||!previewFrameLoaded.value));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 followIdentityReload(frameRequestId){if(previewIdentityReloadRequestId>0)previewIdentityReloadRequestId=frameRequestId}function handlePreviewFrameReady(frameRequestId){if(frameRequestId===previewIdentityReloadRequestId){completePreviewIdentityTransition();return}beginDefaultPreviewIdentity()}function rememberPreviewIdentityForResume(){previewIdentityResumeSelection=previewIdentityRequested.value}function allowResumedPreviewIdentity(){if(previewIdentityResumeSelection)previewIdentityAutomaticAttempt=``}watch(previewIdentityLifecycleKey,lifecycle=>{if(lifecycle===previewIdentityLifecycle)return;orientation.close();previewIdentityLifecycle=lifecycle;previewIdentityAutomaticAttempt=``;previewIdentityResumeSelection=null;resetPreviewIdentityState();cancelPreviewBridgeRequests(`The active application preview changed.`)},{flush:`sync`,immediate:true});watch(previewIdentityAvailable,available=>{if(available&&previewFrameLoaded.value)beginDefaultPreviewIdentity()});return{allowResumedPreviewIdentity,completePreviewIdentityTransition,followIdentityReload,handlePreviewFrameReady,previewIdentityAvailable,previewIdentityBusy,previewIdentityConfigured,previewIdentityCurrent,previewIdentityError,previewIdentityLabel,previewIdentityRequested,previewIdentitySelectionDisabled,previewIdentityTitle,rememberPreviewIdentityForResume,selectPreviewConfiguredIdentity,selectPreviewGuest}}function useVibe64PreviewMessages({address,frame,outputs,pick,reload}){const{launchActions,publishPreviewState}=outputs;const{orientation,previewBaseUrl,previewBridgeRequests,previewDebugLog,previewDisplayBaseUrl,previewFrame,previewSuspended,receivePreviewBridgeMessage}=frame;const{recordPreviewVisit}=address;const{finishPreviewPick,forwardPreviewInteraction,publishPreviewRecording}=pick;const{handlePreviewResourceFailure}=reload;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_INTERACTION_MESSAGE_TYPE,PREVIEW_LOCATION_MESSAGE_TYPE,PREVIEW_PICK_RESULT_MESSAGE_TYPE,PREVIEW_RESOURCE_FAILURE_MESSAGE_TYPE].includes(previewMessageType(value))}function handlePreviewBridgeMessage(event){if(previewSuspended.value)return;const orientationAvailable=isOrientationAnnouncement(event?.data);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){orientation.announce(event);return}const messageType=previewMessageType(event.data);if(receivePreviewBridgeMessage(event)){publishPreviewRecording();return}if(messageType===`vibe64:preview-pick-result`){finishPreviewPick(event.data);return}if(messageType===`vibe64:preview-interaction`){forwardPreviewInteraction(event.data);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){recordPreviewVisit(frameUrl,{reason:String(event?.data?.reason||``)});publishPreviewState({route:previewRouteFromUrl(frameUrl),title:String(event?.data?.title||``)})}}onBeforeMount(()=>{window.addEventListener(`message`,handlePreviewBridgeMessage)});onBeforeUnmount(()=>{window.removeEventListener(`message`,handlePreviewBridgeMessage)})}var PREVIEW_PICK_NO_COMPONENT_TEXT=`No component information on this page. Record while clicking to see its requests.`;var PREVIEW_PICK_NOT_SCANNED_TEXT=`This project has not been scanned yet. Refresh the architecture scan in Usage, then pick again.`;function previewComponentSourcePath(file=``,sourceRoot=``){const relative=String(sourceEditorLinkTarget({href:String(file||``),sourceRoot})?.path||``);return relative.split(`/`).every(part=>part&&part!==`.`&&part!==`..`)?relative:``}function previewPickColors(element){const style=element&&typeof globalThis.getComputedStyle===`function`?globalThis.getComputedStyle(element):null;const hex=name=>{const channels=String(style?.getPropertyValue(name)||``).match(/^\s*rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)\s*$/u)?.slice(1).map(Number);return channels?.every(channel=>channel<=255)?`#${channels.map(channel=>channel.toString(16).padStart(2,`0`)).join(``)}`:``};const color=hex(`--v64-primary`);const onColor=hex(`--v64-on-primary`);return color&&onColor?{color,onColor}:{}}function previewUsageEntryForFile(entries=[],file=``){const matches=(Array.isArray(entries)?entries:[]).filter(entry=>entry?.id&&entry.file===file);return matches.find(entry=>entry.kind===`component`)||matches.find(entry=>entry.kind===`page`)||null}function useVibe64PreviewPick({frame,props,usage:{openUsage,readUsageEntries,recordInteraction,recording}}){const{postToPreviewBridge,previewBridgeVersion,previewFrame,previewFrameLoaded,previewPaneDisplayed,previewPicking,previewSuspended,switchPreviewPicking,stopPreviewPick}=frame;const previewPickBusy=ref(false);const previewPickNoticeText=ref(``);const previewPickNoticeVisible=ref(false);const previewPickNoticeOpensUsage=ref(false);const previewInteractions={forwarded:0,highest:0,recordingId:``};const previewPickAvailable=computed(()=>Boolean(typeof readUsageEntries===`function`&&previewFrameLoaded.value&&previewPaneDisplayed.value&&!previewSuspended.value&&previewBridgeVersion.value>=8));const previewRecordingId=computed(()=>{const current=toValue(recording);return current?.state===`recording`&¤t?.target?.kind===`web`?String(current.id||``):``});const previewRecordedInteractions=computed(()=>previewRecordingId.value?Math.max(0,Number(toValue(recording)?.highestInteraction)||0):0);function showPreviewPickNotice(text,{opensUsage=false}={}){previewPickNoticeText.value=text;previewPickNoticeOpensUsage.value=opensUsage&&typeof openUsage===`function`;previewPickNoticeVisible.value=true}function openUsageFromPickNotice(){previewPickNoticeVisible.value=false;openUsage?.({mode:`calls`})}function togglePreviewPick(){if(previewPicking.value){stopPreviewPick();return false}if(!previewPickAvailable.value||previewPickBusy.value)return false;switchPreviewPicking(postToPreviewBridge({type:PREVIEW_PICK_START_MESSAGE_TYPE,...previewPickColors(previewFrame.value)}));return previewPicking.value}async function finishPreviewPick(result={}){if(!previewPicking.value)return null;switchPreviewPicking(false);if(result?.cancelled===true)return null;const file=previewComponentSourcePath(result?.componentFile,props.session?.sourcePath);if(!file){showPreviewPickNotice(PREVIEW_PICK_NO_COMPONENT_TEXT);return null}previewPickBusy.value=true;try{const answer=await readUsageEntries({limit:50,q:file.slice(-80)});const entry=previewUsageEntryForFile(answer?.entries,file);if(!entry){showPreviewPickNotice(`${file.split(`/`).pop()} has no usage entry yet. Refresh the architecture scan, then pick again.`,{opensUsage:true});return null}openUsage?.({entryId:entry.id,mode:`calls`});return entry}catch(error){if(error?.code===`vibe64_genesis_city_missing`)showPreviewPickNotice(PREVIEW_PICK_NOT_SCANNED_TEXT,{opensUsage:true});else showPreviewPickNotice(String(error?.message||``).trim()||`Usage could not be read. Pick again.`);return null}finally{previewPickBusy.value=false}}function publishPreviewRecording(){const recordingId=previewRecordingId.value;if(previewInteractions.recordingId!==recordingId)Object.assign(previewInteractions,{forwarded:0,highest:0,recordingId});previewInteractions.highest=Math.max(previewInteractions.highest,previewRecordedInteractions.value);postToPreviewBridge({active:Boolean(recordingId),nextInteraction:previewInteractions.highest+1,recordingId:recordingId||null,type:PREVIEW_RECORDING_MESSAGE_TYPE})}async function forwardPreviewInteraction(data={}){const id=String(data?.id||``);const recordingId=previewRecordingId.value;if(typeof recordInteraction!==`function`||!recordingId||recordingId!==previewInteractions.recordingId||!USAGE_INTERACTION_ID_PATTERN.test(id)||Number(id.slice(2))<=previewInteractions.highest||previewInteractions.forwarded>=USAGE_RECORDING_LIMITS.interactions)return;previewInteractions.highest=Number(id.slice(2));previewInteractions.forwarded+=1;const at=Date.parse(String(data?.at||``));const result=await recordInteraction({at:new Date(Number.isFinite(at)?at:Date.now()).toISOString(),componentFile:previewComponentSourcePath(data?.componentFile,props.session?.sourcePath)||null,id,kind:[`enter`,`submit`].includes(data?.kind)?data.kind:`click`,label:String(data?.elementLabel||``).trim().slice(0,80)||`element`});const next=Number(result?.nextInteraction);if(result?.ok===false&&Number.isSafeInteger(next)&&previewInteractions.recordingId===recordingId){previewInteractions.highest=Math.max(previewInteractions.highest,next-1);publishPreviewRecording()}}watch([previewRecordingId,previewRecordedInteractions],publishPreviewRecording);watch(previewPickAvailable,available=>{if(!available)stopPreviewPick()},{flush:`sync`});return{finishPreviewPick,forwardPreviewInteraction,openUsageFromPickNotice,previewPickAvailable,previewPickBusy,previewPickNoticeOpensUsage,previewPickNoticeText,previewPickNoticeVisible,publishPreviewRecording,togglePreviewPick}}var LAUNCH_PREVIEW_TOOLBAR_POSITIONS=Object.freeze([`left`,`center`,`right`]);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 launchToolbarDockShouldShow({embeddedPreview=false,embeddedTerminalVisible=false,previewIssueVisible=false,terminalDockVisible=false,terminalVisible=false}={}){if(!embeddedPreview)return Boolean(terminalDockVisible);if(previewIssueVisible)return true;return Boolean(terminalVisible||embeddedTerminalVisible)}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 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 useVibe64PreviewPresentation({address,frame,identity,outputs,props,recovery,targets}){const{activeOutputTarget,launchError,launchStarting,launchStatusAttempt,launchWaiting,loadError,loading,operationBusy,outputTargets,outputTargetsLoaded,previewCanRestart,previewCanStart,previewMessage,previewState,terminalCanRestart,terminalCanRetry,terminalDisplayed,terminalDockVisible,terminalExpanded,terminalIsRunning,terminalVisible,workspacePreparing}=outputs;const{embeddedManualStartButtonVisible,embeddedStartTarget,outputSetupUnavailableReason}=targets;const{previewRestartPending}=recovery;const{previewEmbedUnavailableReason,previewLoadingOverlayVisible,previewSuspended,previewUrl}=frame;const{previewIdentityBusy,previewIdentityRequested}=identity;const{previewDisplayedAddress}=address;const previewLogVisible=ref(false);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 previewCheckAgainVisible=computed(()=>Boolean(props.embeddedPreview&&previewState.value===`idle`&&!previewUrl.value&&!terminalVisible.value&&outputSetupUnavailableReason.value&&!loadError.value));const previewSetupRetryVisible=computed(()=>Boolean(previewCheckAgainVisible.value&&String(props.session?.workspaceSetup?.status||``).trim()===`failed`));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 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));return{embeddedTerminalFrameVisible,embeddedTerminalSurfaceVisible,embeddedTerminalVisible,launchStatusChipText,launchStatusChipTitle,launchStatusChipVisible,launchStatusDetailText,launchStatusRetryVisible,launchStatusText,launchToolbarDockVisible,previewActivityVisible:computed(()=>Boolean(previewStarting.value||launchStarting.value||launchWaiting.value||terminalIsRunning.value||loading.value)),previewBrowserControlsVisible,previewCheckAgainVisible,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})),previewInFlightText,previewIssue,previewIssueVisible,previewLogVisible,previewNotice,previewNoticeVisible,previewRecoveryLabel,previewRecoveryVisible,previewSetupRetryVisible,previewStarting,previewTerminalRecoveryVisible,previewToolbarRecoveryVisible}}function useVibe64PreviewRecovery({outputs,projectSlug,props,targets}){const{loadError,operationBusy,outputTargets,previewCanRestart,previewCanStart,previewState,previewStoppedIntent,previewTestNotice,refresh:refreshOutputs,resourceAdmissionId,restartTerminal,retryFailedWorkspaceSetup,retryTerminal,run,startNewlyConfiguredWorkspaceSetup,terminalCanRestart,terminalCanRetry,terminalIsRunning,testApproval}=outputs;const{embeddedStartTarget}=targets;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}});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}async function retryLaunchStatus(){await startNewlyConfiguredWorkspaceSetup?.();await refreshOutputs()}async function retryPreviewWorkspaceSetup(){await retryFailedWorkspaceSetup?.();await refreshOutputs()}return{forceStartEmbeddedPreview,previewRestartPending,previewWorkNotice,recheckResourceAdmission,recoverEmbeddedPreview,retryLaunchStatus,retryPreviewWorkspaceSetup}}var PREVIEW_RESOURCE_RETRY_DELAY_MS=250;var PREVIEW_RESOURCE_RETRY_LIMIT=1;function useVibe64PreviewReload({frame,identity,outputs,projectSlug,props}){const{refresh:refreshOutputs}=outputs;const{clearPreviewFrame,previewDebugLog,previewFrameRequestId,previewIdentityLifecycleKey,previewSuspended,previewUrl,requestPreviewFrame}=frame;const{allowResumedPreviewIdentity,completePreviewIdentityTransition,rememberPreviewIdentityForResume}=identity;const reportActivity=usePageActivity();const previewResourceNoticeText=ref(``);const previewResourceNoticeVisible=ref(false);let previewResourceRetryCount=0;let previewResourceRetryLifecycle=``;let previewResourceRetryTimer=null;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 suspendPreview(){rememberPreviewIdentityForResume();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;allowResumedPreviewIdentity();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}function currentPreviewResourceRetryCount(){return previewResourceRetryCount}watch(previewIdentityLifecycleKey,(lifecycle,previousLifecycle)=>{if(lifecycle===previousLifecycle)return;resetPreviewResourceRecovery(lifecycle)},{flush:`sync`,immediate:true});onBeforeUnmount(cancelPreviewResourceRetry);return{cancelPreviewResourceRetry,currentPreviewResourceRetryCount,handlePreviewResourceFailure,previewResourceNoticeText,previewResourceNoticeVisible,reloadPreview,resumePreview,suspendPreview}}function useVibe64PreviewTargets({outputs,props}){const{activeOutputTarget,launchButtonsDisabled,loading,operationBusy,outputTargets,terminalVisible}=outputs;const runMenuDisabled=computed(()=>Boolean(launchButtonsDisabled.value||loading.value||outputTargets.value.length<1));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 previewContextTarget=computed(()=>embeddedAutoStartTarget.value||activeOutputTarget.value||embeddedStartTarget.value||null);const outputOptionsTarget=computed(()=>activeOutputTarget.value||previewContextTarget.value);return{embeddedAutoStartTarget,embeddedManualStartButtonDisabled,embeddedManualStartButtonVisible,embeddedStartTarget,manualLaunchMenuVisible,outputOptionsAvailable:computed(()=>Boolean(outputOptionsTarget.value?.parameters?.length)),outputOptionsTarget,outputSetupUnavailableReason,previewContextTarget,runMenuDisabled}}function useVibe64PreviewToolbar({projectSlug,props}){const previewToolbarExpanded=ref(false);const previewToolbarPosition=ref(`center`);const previewToolbarStorageKey=computed(()=>props.embeddedPreview&&props.session?launchPreviewToolbarStorageKey(props.session,projectSlug.value):``);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}watch(previewToolbarStorageKey,storageKey=>{previewToolbarExpanded.value=false;previewToolbarPosition.value=normalizeLaunchPreviewToolbarPosition(readLocalStorageJson(storageKey,`center`))},{immediate:true});return{collapsePreviewToolbar,expandPreviewToolbar,movePreviewToolbar,previewToolbarExpanded,previewToolbarPosition}}function useVibe64OutputControlsSurface(props,{openUsage=null,readUsageEntries=null,recordInteraction=null,recording=null}={}){const outputs=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 projectSlug=useVibe64ProjectSlug();const targets=useVibe64PreviewTargets({outputs,props});const options=useVibe64OutputOptions({outputs,projectSlug,props,targets});const recovery=useVibe64PreviewRecovery({outputs,projectSlug,props,targets});const toolbar=useVibe64PreviewToolbar({projectSlug,props});const frame=useVibe64PreviewFrame({followIdentityReload:frameRequestId=>identity.followIdentityReload(frameRequestId),identityBusy:()=>identity.previewIdentityBusy.value,identityFrameReady:frameRequestId=>identity.handlePreviewFrameReady(frameRequestId),outputs,projectSlug,props,resourceRetryCount:()=>reload.currentPreviewResourceRetryCount()});const identity=useVibe64PreviewIdentity({frame,outputs,props});const reload=useVibe64PreviewReload({frame,identity,outputs,projectSlug,props});const address=useVibe64PreviewAddress({frame,projectSlug,props,targets});const pick=useVibe64PreviewPick({frame,props,usage:{openUsage,readUsageEntries,recordInteraction,recording}});useVibe64PreviewMessages({address,frame,outputs,pick,reload});const presentation=useVibe64PreviewPresentation({address,frame,identity,outputs,props,recovery,targets});const{expandTerminal,minimizeTerminal,outputTargetsLoaded,previewState}=outputs;const{collapsePreviewToolbar}=toolbar;const{clearPreviewFrame,previewBaseUrl,previewDisplayBaseUrl,previewPaneDisplayed,previewReadyForIframe,previewSuspended,requestPreviewFrame,requestPreviewState}=frame;const{previewLogVisible}=presentation;const{cancelPreviewResourceRetry}=reload;const toolbarTeleportTarget=computed(()=>String(props.toolbarTeleportTarget||``).trim());watch([previewReadyForIframe,previewBaseUrl,previewDisplayBaseUrl],([ready,baseUrl])=>{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`});function setTerminalExpanded(expanded){previewLogVisible.value=Boolean(expanded);if(expanded){expandTerminal();return}minimizeTerminal()}function showLaunchLog(){collapsePreviewToolbar();previewLogVisible.value=true;expandTerminal()}return{outputOptionsAction:options.outputOptionsAction,previewWorkNotice:recovery.previewWorkNotice,previewTestNotice:outputs.previewTestNotice,outputOptionsAvailable:targets.outputOptionsAvailable,outputOptionsError:options.outputOptionsError,outputOptionsErrors:options.outputOptionsErrors,outputOptionsRemember:options.outputOptionsRemember,outputOptionsSelection:options.outputOptionsSelection,outputOptionsValues:options.outputOptionsValues,outputOptionsVisible:options.outputOptionsVisible,openOutputOptions:options.openOutputOptions,resetOutputOptions:options.resetOutputOptions,runWithOptions:options.runWithOptions,submitOutputOptions:options.submitOutputOptions,embeddedAutoStartTarget:targets.embeddedAutoStartTarget,embeddedManualStartButtonDisabled:targets.embeddedManualStartButtonDisabled,embeddedManualStartButtonVisible:targets.embeddedManualStartButtonVisible,embeddedStartTarget:targets.embeddedStartTarget,embeddedTerminalFrameVisible:presentation.embeddedTerminalFrameVisible,embeddedTerminalSurfaceVisible:presentation.embeddedTerminalSurfaceVisible,embeddedTerminalVisible:presentation.embeddedTerminalVisible,collapsePreviewToolbar:toolbar.collapsePreviewToolbar,forceStartEmbeddedPreview:recovery.forceStartEmbeddedPreview,goPreviewBack:address.goPreviewBack,handlePreviewFrameLoad:frame.handlePreviewFrameLoad,expandPreviewToolbar:toolbar.expandPreviewToolbar,launchActions:outputs.launchActions,launchButtonsDisabled:outputs.launchButtonsDisabled,launchError:outputs.launchError,resourceAdmissionId:outputs.resourceAdmissionId,testApproval:outputs.testApproval,acceptResourceRetry:outputs.acceptResourceRetry,launchStatusAttempt:outputs.launchStatusAttempt,launchStatusChipText:presentation.launchStatusChipText,launchStatusChipTitle:presentation.launchStatusChipTitle,launchStatusChipVisible:presentation.launchStatusChipVisible,launchStatusDetailText:presentation.launchStatusDetailText,launchStatusRetryVisible:presentation.launchStatusRetryVisible,launchStatusText:presentation.launchStatusText,outputExecution:outputs.outputExecution,outputResults:outputs.outputResults,outputRuns:outputs.outputRuns,outputTargets:outputs.outputTargets,launchToolbarDockVisible:presentation.launchToolbarDockVisible,loading:outputs.loading,loadError:outputs.loadError,manualLaunchMenuVisible:targets.manualLaunchMenuVisible,movePreviewToolbar:toolbar.movePreviewToolbar,openAction:outputs.openAction,operationBusy:outputs.operationBusy,previewBaseUrl:frame.previewBaseUrl,previewAddressBlur:address.previewAddressBlur,previewAddressDraft:address.previewAddressDraft,previewAddressError:address.previewAddressError,previewAddressFocus:address.previewAddressFocus,previewBackAvailable:address.previewBackAvailable,previewActivityVisible:presentation.previewActivityVisible,previewCanRestart:outputs.previewCanRestart,previewCanShowLog:outputs.previewCanShowLog,previewCanStart:outputs.previewCanStart,previewCheckAgainVisible:presentation.previewCheckAgainVisible,previewSetupRetryVisible:presentation.previewSetupRetryVisible,previewBrowserControlsVisible:presentation.previewBrowserControlsVisible,previewDisplayedAddress:address.previewDisplayedAddress,previewDisplayedUrl:address.previewDisplayedUrl,previewDiagnosticsAvailable:frame.previewDiagnosticsAvailable,previewDiagnosticsBusy:frame.previewDiagnosticsBusy,previewEmbedUnavailableReason:frame.previewEmbedUnavailableReason,previewEmptyText:presentation.previewEmptyText,previewFrame:frame.previewFrame,previewFrameLoaded:frame.previewFrameLoaded,previewFrameRequestId:frame.previewFrameRequestId,previewIdentityAvailable:identity.previewIdentityAvailable,previewIdentityBusy:identity.previewIdentityBusy,previewIdentityConfigured:identity.previewIdentityConfigured,previewIdentityCurrent:identity.previewIdentityCurrent,previewIdentityError:identity.previewIdentityError,previewIdentityLabel:identity.previewIdentityLabel,previewIdentitySelectionDisabled:identity.previewIdentitySelectionDisabled,previewIdentityTitle:identity.previewIdentityTitle,previewIdentityTypeLabel,previewIssue:presentation.previewIssue,previewIssueVisible:presentation.previewIssueVisible,previewInFlightText:presentation.previewInFlightText,previewLoadingOverlayVisible:frame.previewLoadingOverlayVisible,previewMessage:outputs.previewMessage,previewRouteDialogError:address.previewRouteDialogError,previewRouteDialogParams:address.previewRouteDialogParams,previewRouteDialogPath:address.previewRouteDialogPath,previewRouteDialogVisible:address.previewRouteDialogVisible,previewRouteFormValues:address.previewRouteFormValues,previewRouteSelection:address.previewRouteSelection,previewRoutes:address.previewRoutes,previewRoutesAvailable:address.previewRoutesAvailable,previewNotice:presentation.previewNotice,previewNoticeVisible:presentation.previewNoticeVisible,previewRecoveryLabel:presentation.previewRecoveryLabel,previewRecoveryVisible:presentation.previewRecoveryVisible,previewResourceNoticeText:reload.previewResourceNoticeText,previewResourceNoticeVisible:reload.previewResourceNoticeVisible,previewPickAvailable:pick.previewPickAvailable,previewPickBusy:pick.previewPickBusy,previewPickNoticeOpensUsage:pick.previewPickNoticeOpensUsage,previewPickNoticeText:pick.previewPickNoticeText,previewPickNoticeVisible:pick.previewPickNoticeVisible,previewPicking:frame.previewPicking,openUsageFromPickNotice:pick.openUsageFromPickNotice,stopPreviewPick:frame.stopPreviewPick,togglePreviewPick:pick.togglePreviewPick,previewState:outputs.previewState,previewTerminalRecoveryVisible:presentation.previewTerminalRecoveryVisible,previewToolbarRecoveryVisible:presentation.previewToolbarRecoveryVisible,previewStarting:presentation.previewStarting,previewToolbarExpanded:toolbar.previewToolbarExpanded,previewToolbarPosition:toolbar.previewToolbarPosition,previewUrl:frame.previewUrl,copyPreviewUrl:address.copyPreviewUrl,openPreviewRoute:address.openPreviewRoute,recoverEmbeddedPreview:recovery.recoverEmbeddedPreview,recheckResourceAdmission:recovery.recheckResourceAdmission,reloadPreview:reload.reloadPreview,previewSuspended:frame.previewSuspended,suspendPreview:reload.suspendPreview,resumePreview:reload.resumePreview,retryLaunchStatus:recovery.retryLaunchStatus,retryPreviewWorkspaceSetup:recovery.retryPreviewWorkspaceSetup,requestPreviewDiagnostics:frame.requestPreviewDiagnostics,resetPreviewAddressDraft:address.resetPreviewAddressDraft,selectPreviewConfiguredIdentity:identity.selectPreviewConfiguredIdentity,selectPreviewGuest:identity.selectPreviewGuest,submitPreviewRouteDialog:address.submitPreviewRouteDialog,submitPreviewAddress:address.submitPreviewAddress,restartTerminal:outputs.restartTerminal,retryTerminal:outputs.retryTerminal,runMenuDisabled:targets.runMenuDisabled,showLaunchLog,stopTerminal:outputs.stopTerminal,setTerminalExpanded,terminal:outputs.terminal,terminalCanStop:outputs.terminalCanStop,terminalCanRestart:outputs.terminalCanRestart,terminalCanRetry:outputs.terminalCanRetry,terminalCommandPreview:outputs.terminalCommandPreview,terminalDisplayed:outputs.terminalDisplayed,terminalExpanded:outputs.terminalExpanded,terminalError:outputs.terminalError,terminalIndicatorLabel:outputs.terminalIndicatorLabel,terminalIndicatorState:outputs.terminalIndicatorState,terminalIsRunning:outputs.terminalIsRunning,terminalStatus:outputs.terminalStatus,terminalSubtitle:outputs.terminalSubtitle,terminalTitle:outputs.terminalTitle,terminalVisible:outputs.terminalVisible,terminalWindowStorageKey:outputs.terminalWindowStorageKey,terminalWindowVisible:outputs.terminalWindowVisible,toolbarTeleportTarget,visible:outputs.visible}}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(PREVIEW_PROXY_TOKEN_QUERY_PARAM);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(`
|