livedesk 0.1.650 → 0.1.652

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +1 -1
  2. package/bin/livedesk.js +13 -13
  3. package/bootstrap/client-process-identity.js +2 -2
  4. package/client/package.json +1 -1
  5. package/diagnostics/{livedesk-mac-physical-gate-core.mjs → vuvodesk-mac-physical-gate-core.mjs} +3 -3
  6. package/diagnostics/{livedesk-mode3-capture-smoke.mjs → vuvodesk-mode3-capture-smoke.mjs} +2 -2
  7. package/diagnostics/{livedesk-transport-physical.mjs → vuvodesk-transport-physical.mjs} +1 -1
  8. package/electron/before-pack.cjs +1 -1
  9. package/electron/electron-builder.e2e.yml +1 -1
  10. package/electron/electron-builder.linux-x64-dev.yml +1 -1
  11. package/electron/electron-builder.linux-x64.yml +3 -3
  12. package/electron/electron-builder.mac-arm64-dev.yml +1 -1
  13. package/electron/electron-builder.mac-arm64.yml +4 -4
  14. package/electron/electron-builder.mac-x64-dev.yml +1 -1
  15. package/electron/electron-builder.mac-x64.yml +4 -4
  16. package/electron/electron-builder.win-dev.yml +1 -1
  17. package/electron/electron-builder.win.yml +3 -3
  18. package/electron/electron-builder.yml +2 -2
  19. package/hub/package.json +1 -1
  20. package/hub/src/captures/capture-store.js +2 -2
  21. package/hub/src/console-direct.js +1 -0
  22. package/hub/src/console-direct.test.mjs +42 -0
  23. package/hub/src/server.js +2 -2
  24. package/hub/src/{live-desk-update.js → vuvodesk-update.js} +1 -1
  25. package/package.json +5 -3
  26. package/runtime-core/package.json +1 -1
  27. package/scripts/sync-web-dist.js +11 -11
  28. package/web/dist/app.html +11 -4
  29. package/web/dist/app.webmanifest +1 -1
  30. package/web/dist/assets/{AgentSettingsTab-1QVVyDM0.js → AgentSettingsTab-SlFWbGlY.js} +1 -1
  31. package/web/dist/assets/{AgentsPage-PXaoor6-.js → AgentsPage-AoFB_KD4.js} +1 -1
  32. package/web/dist/assets/{App-C0pLhnrj.js → App-smTkH_7F.js} +3 -3
  33. package/web/dist/assets/{CaptureGallery-RoIgqppm.js → CaptureGallery-bgLFx77c.js} +1 -1
  34. package/web/dist/assets/{DesktopUpdatePanel-CSORoxhi.js → DesktopUpdatePanel-BDIHhw5J.js} +1 -1
  35. package/web/dist/assets/{SettingsPage-56oq8v6l.js → SettingsPage-DLhQYnES.js} +1 -1
  36. package/web/dist/assets/{SettingsTabs-CZ388qM0.js → SettingsTabs-C1ovcXzw.js} +1 -1
  37. package/web/dist/assets/{ShareFilesPage-CxsFwtMy.js → ShareFilesPage-rESjZP8s.js} +1 -1
  38. package/web/dist/assets/{SupportPage-D5pCkJTU.js → SupportPage-B90rx4D0.js} +1 -1
  39. package/web/dist/assets/{LiveDeskApp-BEyIPIAd.js → VuvoDeskApp-BM4kuSAh.js} +1 -1
  40. package/web/dist/assets/{app-Cf4_lX6I.js → app-VTnPXosN.js} +1 -1
  41. package/web/dist/assets/{main-BBDlfRlO.js → main-DEpRH1th.js} +2 -2
  42. package/web/dist/assets/{styles-B5DEnner.js → styles-CDIlHYlj.js} +1 -1
  43. package/web/dist/index.html +10 -3
  44. package/web/dist/sw.js +1 -1
  45. package/web/dist/{livedesk-build-evidence.json → vuvodesk-build-evidence.json} +59 -59
  46. /package/diagnostics/{livedesk-mac-physical-isolation.mjs → vuvodesk-mac-physical-isolation.mjs} +0 -0
  47. /package/diagnostics/{livedesk-transport-physical-core.mjs → vuvodesk-transport-physical-core.mjs} +0 -0
  48. /package/web/dist/assets/{LiveDeskApp-ao5vkK6F.css → VuvoDeskApp-ao5vkK6F.css} +0 -0
@@ -11,6 +11,6 @@ ${String(o?.message||o||"")}`.toLowerCase(),s=Object.hasOwn(kf,c)?c:/hub[- ]?(of
11
11
  ${this.session.workspaceId}
12
12
  ${this.session.workspaceRole}`:"",h=f?`${f.user.id}
13
13
  ${f.workspaceId}
14
- ${f.workspaceRole}`:"";this.session=f,s!==h&&(this.teardown("console-session-replaced",null,!0),this.lastFailure=null)}preferDirect(){this.preferred=!0}markLocalHubReachable(){this.preferred=!1,this.teardown("local-hub-reachable",null,!0),this.lastFailure=null}resume(){if(this.invalidateLivenessEvidence(),this.hasReadyPayloadPeer()){this.lastFailure=null;return}this.teardown("console-resume",null,!0),this.lastFailure=null}suspendLivenessEvidence(){this.invalidateLivenessEvidence()}retry(){this.preferred=!0,this.teardown("console-manual-retry",null,!0),this.lastFailure=null}shouldUseDirect(){return this.preferred&&!!this.session?.accessToken}inspect(){const c=this.wireBudget?.inspect()||{retainedBytes:0,reservationCount:0},f=[...this.channels.values()].filter(M=>M.wireDeadline!==null).length,s=[...this.channels.values()].filter(M=>M.openDeadline!==null).length,h=this.connectTimer===null?0:1,d=this.peerDisconnectTimer===null?0:1,p=this.controlWireDeadline===null?0:1,z=this.workspaceReauthAttempt?.deadline==null?0:1;return Object.freeze({preferred:this.preferred,stage:this.stage,directReady:this.directReady,generation:this.generation,signalSockets:this.signalSocket?1:0,peerCount:this.peer?1:0,controlChannels:this.controlChannel?1:0,logicalChannels:this.channels.size,openLogicalChannels:[...this.channels.values()].filter(M=>M.opened).length,pendingHttpRequests:this.pendingHttp.size,livenessEvidenceEpoch:this.livenessEvidenceEpoch,workspaceReauthRequests:this.workspaceReauthAttempt?1:0,consecutiveLivenessRequestTimeouts:this.consecutiveLivenessRequestTimeouts,livenessRequestTimeoutCount:this.livenessRequestTimeoutCount,pendingRemoteCandidates:this.pendingRemoteCandidates.length,connectTimers:h,peerDisconnectTimers:d,controlWireTimers:p,workspaceReauthTimers:z,logicalOpenTimers:s,logicalWireTimers:f,resourceTimers:h+d+p+z+s+f+this.pendingHttp.size,wireRetainedBytes:c.retainedBytes,wireReservations:c.reservationCount,sendBufferedBytes:this.peerBufferedAmount(),lastTerminalWireBytes:this.lastTerminalWireBytes,lastTerminalWireReservations:this.lastTerminalWireReservations,failure:this.lastFailure})}nextMessageId(){return this.wireMessageId=this.wireMessageId>=4294967295?1:this.wireMessageId+1,this.wireMessageId}isSignalOwner(c,f){return c===this.generation&&this.signalSocket===f}isPeerOwner(c){return Hy(this.peerOwner,c)}hasReadyPayloadPeer(){return this.directReady&&!!this.peerOwner&&!!this.peer&&this.peer?.connectionState!=="failed"&&this.peer?.connectionState!=="closed"&&this.controlChannel?.readyState==="open"}detachSignalFromReadyPeer(c,f,s){if(!this.isSignalOwner(c,f)||!this.hasReadyPayloadPeer())return!1;this.cancelWorkspaceReauthAttempt(c,f),this.signalSocket=null,this.signalReady=!1,this.consoleId="";try{f.close(1e3,s)}catch{}return!0}clearConnectTimer(){this.connectTimer!==null&&(window.clearTimeout(this.connectTimer),this.connectTimer=null)}clearPeerDisconnectTimer(){this.peerDisconnectTimer!==null&&(window.clearTimeout(this.peerDisconnectTimer),this.peerDisconnectTimer=null)}cancelWorkspaceReauthAttempt(c,f){const s=this.workspaceReauthAttempt;if(!s||c!==void 0&&s.generation!==c||f!==void 0&&s.socket!==f)return!1;this.workspaceReauthAttempt=null,s.deadline!==null&&(window.clearTimeout(s.deadline),s.deadline=null);try{s.controller.abort()}catch{}return!0}refreshPeerDisconnectDeadline(c,f){if(!this.isPeerOwner(c)||this.peer!==f)return;if(!(f.connectionState==="disconnected"||f.iceConnectionState==="disconnected")){this.clearPeerDisconnectTimer();return}if(this.peerDisconnectTimer!==null)return;const h=window.setTimeout(()=>{this.peerDisconnectTimer===h&&(this.peerDisconnectTimer=null,!(!this.isPeerOwner(c)||this.peer!==f)&&(f.connectionState==="disconnected"||f.iceConnectionState==="disconnected")&&this.fail(fe(),"peer-disconnected-timeout",!0))},jy);this.peerDisconnectTimer=h}clearControlWireDeadline(){this.controlWireDeadline!==null&&(window.clearTimeout(this.controlWireDeadline),this.controlWireDeadline=null)}refreshControlWireDeadline(c,f){if((f.inspect().pendingMessages||0)===0){this.clearControlWireDeadline();return}if(this.controlWireDeadline!==null)return;const h=window.setTimeout(()=>{this.controlWireDeadline===h&&(this.controlWireDeadline=null,!(!this.isPeerOwner(c)||this.controlAssembler!==f)&&(f.inspect().pendingMessages||0)>0&&this.fail(fe(),"control-wire-assembly-timeout",!0))},Qy);this.controlWireDeadline=h}resolveCurrentConnect(){const c=this.resolveConnect;this.resolveConnect=null,this.rejectConnect=null,this.connectPromise=null,this.clearConnectTimer(),c?.()}rejectCurrentConnect(c){const f=this.rejectConnect;this.resolveConnect=null,this.rejectConnect=null,this.connectPromise=null,this.clearConnectTimer(),f?.(c)}signal(c){if(!Py.has(String(c.type||"")))throw new Error("console-direct-signal-type-forbidden");const f=this.signalSocket;if(!f||f.readyState!==WebSocket.OPEN||!this.signalReady)throw Ye();f.send(JSON.stringify(c))}peerBufferedAmount(){let c=Number(this.controlChannel?.bufferedAmount||0);for(const f of this.channels.values())c+=Number(f.dataChannel?.bufferedAmount||0);return c}sendWire(c,f,s,h){if(c.readyState!=="open")throw new Error("console-direct-data-channel-not-open");const d=Cy(f,{messageId:this.nextMessageId(),kind:s,maxMessageBytes:h}),p=d.reduce((z,M)=>z+M.byteLength,0);if(p>md||this.peerBufferedAmount()>md-p)throw new Error("console-direct-send-buffer-full");for(const z of d)c.send(z)}sendControl(c){const f=this.controlChannel;if(!f||!this.directReady||!this.peerOwner)throw fe();this.sendWire(f,JSON.stringify(c),"control",gl)}fail(c,f,s=!0){this.lastFailure=qf(c),this.teardown(f,c,s)}teardown(c,f,s,h=!1){const d=this.signalSocket,p=this.peerOwner;if(s&&d?.readyState===WebSocket.OPEN&&this.signalReady&&p)try{this.signal({type:"rtc-close",connectionId:p.connectionId,hubEpoch:p.hubEpoch,reason:String(c||"console-direct-closed").slice(0,120)})}catch{}h?this.stage="hub-offline":(this.generation+=1,this.stage="idle",this.signalSocket=null,this.signalReady=!1,this.consoleId="",this.cancelWorkspaceReauthAttempt()),this.hubEpoch="",this.peerOwner=null,this.directReady=!1,this.remoteDescriptionApplied=!1,this.pendingRemoteCandidates=[],this.invalidateLivenessEvidence(),this.clearConnectTimer(),this.clearPeerDisconnectTimer();const z=f||new Error(c||"console-direct-closed");this.rejectCurrentConnect(z);for(const[w,N]of this.pendingHttp)window.clearTimeout(N.timeout),N.detachAbort(),N.reject(z),this.pendingHttp.delete(w);for(const w of[...this.channels.values()])this.retireLogicalEntry(w,f?1011:1001,c,!!f,!1);this.clearControlWireDeadline(),this.controlAssembler?.dispose(),this.controlAssembler=null;const M=this.controlChannel;if(this.controlChannel=null,M){M.onopen=null,M.onmessage=null,M.onerror=null,M.onclose=null;try{M.close()}catch{}}const R=this.peer;if(this.peer=null,R){R.onicecandidate=null,R.onconnectionstatechange=null,R.oniceconnectionstatechange=null;try{R.close()}catch{}}if(!h)try{d?.close(1e3,String(c||"console-direct-closed").slice(0,120))}catch{}const j=this.wireBudget?.inspect();this.lastTerminalWireBytes=Number(j?.retainedBytes||0),this.lastTerminalWireReservations=Number(j?.reservationCount||0),this.wireBudget=null}async connect(){if(this.directReady&&this.peerOwner&&this.controlChannel?.readyState==="open")return;if(this.connectPromise)return this.connectPromise;const c=this.session;if(!c)throw Ye();const f=this.signalSocket?.readyState===WebSocket.OPEN&&this.signalReady;if(f&&this.stage==="hub-offline"){const d=Bf();throw this.lastFailure=qf(d),d}if(f&&this.stage==="p2p"&&this.peerOwner&&this.peer){const d=this.generation,p=new Promise((z,M)=>{this.resolveConnect=z,this.rejectConnect=M});return this.connectPromise=p,this.connectTimer===null&&(this.connectTimer=window.setTimeout(()=>{d===this.generation&&!this.directReady&&this.fail(fe(),"direct-ready-timeout",!0)},xf)),p}const s=this.generation+1;this.generation=s,this.stage="signal",this.lastFailure=null;const h=new Promise((d,p)=>{this.resolveConnect=d,this.rejectConnect=p});this.connectPromise=h,this.connectTimer=window.setTimeout(()=>{if(s!==this.generation)return;const d=this.stage==="signal"?Ye():fe();this.fail(d,this.stage==="signal"?"signal-timeout":"direct-ready-timeout",!1)},this.stage==="signal"?Yy:xf);try{const d=new WebSocket(tv(c.workspaceId),[By,`${qy}${c.accessToken}`]);this.signalSocket=d,d.addEventListener("message",p=>{if(!this.isSignalOwner(s,d)||typeof p.data!="string")return;let z;try{z=JSON.parse(p.data)}catch{this.fail(Ye(),"invalid-signal-json",!1);return}this.handleSignal(z,s,d)}),d.addEventListener("error",()=>{this.isSignalOwner(s,d)&&(this.detachSignalFromReadyPeer(s,d,"signal-detached-after-ready")||this.fail(Ye(),"signal-service-unavailable",!1))}),d.addEventListener("close",()=>{this.isSignalOwner(s,d)&&(this.detachSignalFromReadyPeer(s,d,"signal-closed-after-ready")||this.fail(Ye(),"signal-service-closed",!1))})}catch{this.fail(Ye(),"signal-constructor-failed",!1)}return h}handleSignal(c,f,s){if(!this.isSignalOwner(f,s))return;if(c.type==="workspace-reauth-required"){const d=this.session,p=String(c.workspaceId||d?.workspaceId||"").trim(),z=String(c.challengeNonce||"").trim();if(!d||p!==d.workspaceId||!wa.test(z)){this.fail(Ye(),"workspace-reauth-owner-mismatch",!1);return}if(this.workspaceReauthAttempt?.challengeNonce===z&&this.workspaceReauthAttempt.generation===f&&this.workspaceReauthAttempt.socket===s)return;this.cancelWorkspaceReauthAttempt();const M=new AbortController,R={challengeNonce:z,generation:f,socket:s,controller:M,deadline:null},j=Number(c.deadlineAt||0),w=Number.isFinite(j)&&j>0?Math.max(1,j-Date.now()):hd;R.deadline=window.setTimeout(()=>{this.workspaceReauthAttempt===R&&this.cancelWorkspaceReauthAttempt(f,s)},Math.max(1,Math.min(hd,w))),this.workspaceReauthAttempt=R,(async()=>{try{await fetch(lv("/v2/rtc/reauth"),{method:"POST",headers:{Authorization:`Bearer ${d.accessToken}`,"Content-Type":"application/json"},body:JSON.stringify({workspaceId:d.workspaceId,challengeNonce:z}),signal:M.signal,cache:"no-store"})}catch{}})().finally(()=>{this.workspaceReauthAttempt===R&&(this.workspaceReauthAttempt=null,R.deadline!==null&&(window.clearTimeout(R.deadline),R.deadline=null))});return}if(c.type==="workspace-access-refreshed"||c.type==="workspace-reauth-ok"){c.type==="workspace-reauth-ok"&&this.cancelWorkspaceReauthAttempt(f,s);return}if(c.type==="workspace-access-expired"){this.fail(Ye(),"workspace-access-expired",!1);return}if(c.type==="signal-ready"){const d=String(c.consoleId||""),p=String(c.hubEpoch||"");if(c.role!=="console"||!wa.test(d)){this.fail(Ye(),"invalid-signal-ready",!1);return}if(this.signalReady=!0,this.consoleId=d,c.hubOnline!==!0){const z=Bf();this.lastFailure=qf(z),this.teardown("hub-offline",z,!1,!0);return}if(!wa.test(p)){this.fail(Ye(),"invalid-hub-epoch",!1);return}if(this.peerOwner){this.peerOwner.hubEpoch!==p&&this.fail(fe(),"hub-epoch-replaced",!1);return}this.hubEpoch=p,this.stage="p2p",this.lastFailure=null,this.clearConnectTimer(),this.connectTimer=window.setTimeout(()=>{f===this.generation&&!this.directReady&&this.fail(fe(),"direct-ready-timeout",!0)},xf),this.beginPeer(f,p);return}const h=this.peerOwner;if(!(!h||String(c.connectionId||"")!==h.connectionId||String(c.hubEpoch||"")!==h.hubEpoch)){if(c.type==="rtc-answer")this.acceptAnswer(h,c.description);else if(c.type==="rtc-ice")this.acceptRemoteCandidate(h,c.candidate,c.sdpMid);else if(c.type==="rtc-close"){const d=String(c.reason||"rtc-closed"),p=/hub-offline/i.test(d)?Bf():fe();this.fail(p,d,!1)}}}beginPeer(c,f){if(c!==this.generation||this.peer)return;const s=this.session;if(!s){this.fail(Ye(),"session-missing",!1);return}const h=Ny({userId:s.user.id,connectionId:crypto.randomUUID(),hubEpoch:f,generation:c});this.peerOwner=h,this.wireBudget=Dd({maxBytes:Wy}),this.controlAssembler=rd({budget:this.wireBudget,maxMessageBytes:gl});let d;try{d=new RTCPeerConnection({iceServers:[{urls:av()}],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"})}catch{this.fail(fe(),"peer-constructor-failed",!0);return}this.peer=d;const p=d.createDataChannel(xy,{ordered:!0});p.binaryType="arraybuffer",this.controlChannel=p,d.onicecandidate=z=>{if(!this.isPeerOwner(h)||this.peer!==d||!z.candidate)return;const M=String(z.candidate.candidate||"");if(Ma(M)){this.fail(fe(),"relay-ice-candidate-forbidden",!0);return}try{this.signal({type:"rtc-ice",connectionId:h.connectionId,hubEpoch:h.hubEpoch,candidate:M,sdpMid:z.candidate.sdpMid})}catch{this.fail(Ye(),"signal-ice-failed",!1)}},d.onconnectionstatechange=()=>{if(!(!this.isPeerOwner(h)||this.peer!==d)){if(d.connectionState==="failed"||d.connectionState==="closed"){this.fail(fe(),`peer-${d.connectionState}`,!0);return}this.refreshPeerDisconnectDeadline(h,d)}},d.oniceconnectionstatechange=()=>{if(!(!this.isPeerOwner(h)||this.peer!==d)){if(d.iceConnectionState==="failed"||d.iceConnectionState==="closed"){this.fail(fe(),`ice-${d.iceConnectionState}`,!0);return}this.refreshPeerDisconnectDeadline(h,d)}},p.onmessage=z=>{!this.isPeerOwner(h)||this.controlChannel!==p||this.handleControlWire(h,z.data)},p.onerror=()=>{!this.isPeerOwner(h)||this.controlChannel!==p||this.fail(fe(),"control-channel-error",!0)},p.onclose=()=>{!this.isPeerOwner(h)||this.controlChannel!==p||this.fail(fe(),"control-channel-closed",!0)},(async()=>{try{const z=await d.createOffer();if(!this.isPeerOwner(h)||this.peer!==d)return;if(z.type!=="offer"||Ma(z.sdp))throw new Error("relay-sdp-forbidden");if(await d.setLocalDescription(z),!this.isPeerOwner(h)||this.peer!==d)return;const M=d.localDescription||z;if(M.type!=="offer"||Ma(M.sdp))throw new Error("relay-sdp-forbidden");this.signal({type:"rtc-offer",connectionId:h.connectionId,hubEpoch:h.hubEpoch,description:{type:"offer",sdp:M.sdp||""}})}catch(z){if(!this.isPeerOwner(h))return;const M=/signal/i.test(String(z?.message||""))?Ye():fe();this.fail(M,"rtc-offer-failed",!0)}})()}async acceptAnswer(c,f){const s=this.peer;if(!(!this.isPeerOwner(c)||!s||this.remoteDescriptionApplied)){if(f?.type!=="answer"||typeof f.sdp!="string"||Ma(f.sdp)){this.fail(fe(),"rtc-answer-invalid",!0);return}try{if(await s.setRemoteDescription({type:"answer",sdp:f.sdp}),!this.isPeerOwner(c)||this.peer!==s)return;this.remoteDescriptionApplied=!0;const h=this.pendingRemoteCandidates;this.pendingRemoteCandidates=[];for(const d of h){if(!this.isPeerOwner(c)||this.peer!==s)return;await s.addIceCandidate(d.candidate?d:null)}}catch{this.isPeerOwner(c)&&this.fail(fe(),"rtc-answer-apply-failed",!0)}}}async acceptRemoteCandidate(c,f,s){if(!this.isPeerOwner(c))return;const h=String(f??""),d=s==null?null:String(s);if(h.length>4*1024||d!==null&&d.length>256||Ma(h)){this.fail(fe(),"rtc-candidate-invalid",!0);return}const p=this.peer;if(p){if(!this.remoteDescriptionApplied){if(this.pendingRemoteCandidates.length>=Ky){this.fail(fe(),"rtc-candidate-capacity",!0);return}this.pendingRemoteCandidates.push({candidate:h,sdpMid:d});return}try{await p.addIceCandidate(h?{candidate:h,sdpMid:d}:null)}catch{this.isPeerOwner(c)&&this.fail(fe(),"rtc-candidate-apply-failed",!0)}}}handleControlWire(c,f){const s=this.controlAssembler;if(!(!this.isPeerOwner(c)||!s))try{const h=s.push(vd(f));if(this.refreshControlWireDeadline(c,s),!h)return;if(h.kind!=="control"||typeof h.data!="string")throw new Error("control-wire-kind-invalid");const d=JSON.parse(h.data);if(d.type==="direct-ready"){if(d.connectionId!==c.connectionId||d.hubEpoch!==c.hubEpoch||this.controlChannel?.readyState!=="open")throw new Error("direct-ready-owner-invalid");this.directReady||(this.consecutiveLivenessRequestTimeouts=0,this.directReady=!0,this.stage="ready",this.resolveCurrentConnect());return}if(d.type==="http-response"){this.handleHttpResponse(c,d);return}if(d.type==="ws-opened"||d.type==="ws-closed"||d.type==="ws-error"){this.handleLogicalLifecycle(c,d);return}throw new Error("control-message-type-invalid")}catch{this.isPeerOwner(c)&&this.fail(fe(),"control-wire-invalid",!0)}}handleLogicalLifecycle(c,f){if(f.connectionId!==c.connectionId||f.hubEpoch!==c.hubEpoch)throw new Error("logical-lifecycle-owner-invalid");const s=String(f.channelId||"");if(!wa.test(s))throw new Error("logical-lifecycle-channel-invalid");const h=this.channels.get(s);if(!h)return;const d=h.dataChannel;if(!d||!h.openRequested||!this.logicalEntryIsCurrent(h,c,d))throw new Error("logical-lifecycle-owner-invalid");if(f.type==="ws-opened"){if(h.opened)return;h.opened=!0,this.clearLogicalOpenDeadline(h);const p=h.pendingInbound.splice(0);if(h.pendingInboundBytes=0,h.socket.managerOpened(),!this.logicalEntryIsCurrent(h,c,d)||!h.opened)return;for(const z of p)this.deliverLogicalMessage(h,z);return}if(f.type==="ws-closed"){this.retireLogicalEntry(h,Wf(f.code,1e3),String(f.reason||""),!1,!1);return}this.retireLogicalEntry(h,1011,String(f.error||"console-direct-websocket-error"),!0,!1)}handleHttpResponse(c,f){const s=String(f.requestId||""),h=this.pendingHttp.get(s);if(!(!h||h.generation!==c.generation||!this.isPeerOwner(c))){this.consecutiveLivenessRequestTimeouts=0,this.pendingHttp.delete(s),window.clearTimeout(h.timeout),h.detachAbort();try{const d=Number(f.status||502),p=f.bodyBase64?iv(f.bodyBase64):new TextEncoder().encode(JSON.stringify({ok:!1,error:f.error||"console-direct-request-failed"}));h.resolve(new Response(p,{status:Number.isInteger(d)&&d>=200&&d<=599?d:502,statusText:String(f.statusText||""),headers:f.headers||{"content-type":"application/json"}}))}catch(d){h.reject(Gf(d))}}}async fetch(c,f,s){await sv(this.connect(),f?.signal);const h=this.peerOwner;if(!h||!this.directReady||this.controlChannel?.readyState!=="open")throw fe();if(this.pendingHttp.size>=dd)throw new Error("console-direct-http-capacity-reached");const d=await cv(f?.body);if(d.byteLength>Jy)throw new Error("console-direct-http-body-too-large");if(!this.isPeerOwner(h)||!this.directReady)throw fe();if(this.pendingHttp.size>=dd)throw new Error("console-direct-http-capacity-reached");if(f?.signal?.aborted)throw f.signal.reason||new Error("Mobile Console request cancelled.");const p=crypto.randomUUID(),z=Number.isFinite(s)&&s>0?Math.floor(s):4e3,M=String(f?.method||"GET").toUpperCase(),R=M==="GET"&&ky.has(c),j=R?this.livenessEvidenceEpoch:null,w=new Promise((N,H)=>{const q=(st,yt=!1)=>{const ve=this.pendingHttp.get(p);if(ve){this.pendingHttp.delete(p),window.clearTimeout(ve.timeout),ve.detachAbort();try{this.sendControl({type:"http-cancel",requestId:p})}catch{}H(st),yt&&R&&this.recordLivenessRequestTimeout(h,ve.livenessEvidenceEpoch)}},se=()=>q(f?.signal?.reason instanceof Error?f.signal.reason:new Error("Mobile Console request cancelled."));f?.signal?.addEventListener("abort",se,{once:!0});const je=window.setTimeout(()=>{q(new Error("Mobile Console direct request timed out."),!0)},z);this.pendingHttp.set(p,{generation:h.generation,livenessEvidenceEpoch:j,resolve:N,reject:H,timeout:je,detachAbort:()=>f?.signal?.removeEventListener("abort",se)})});try{this.sendControl({type:"http-request",requestId:p,method:M,path:c,headers:fv(f),bodyBase64:d.byteLength>0?uv(d):""})}catch(N){const H=this.pendingHttp.get(p);H&&(this.pendingHttp.delete(p),window.clearTimeout(H.timeout),H.detachAbort(),H.reject(Gf(N))),this.fail(fe(),"control-send-failed",!0)}return w}openWebSocket(c,f){if(!ev.has(f))throw new Error("console-direct-purpose-invalid");if(this.channels.size>=Zy)throw new Error("console-direct-channel-capacity-reached");const s=crypto.randomUUID(),h=new ov(this,s,f,c),d={channelId:s,path:c,purpose:f,socket:h,owner:null,dataChannel:null,assembler:null,openDeadline:null,wireDeadline:null,openRequested:!1,opened:!1,pendingInbound:[],pendingInboundBytes:0};return this.channels.set(s,d),this.connect().then(()=>{this.channels.get(s)===d&&this.attachLogicalChannel(d)}).catch(p=>{this.channels.get(s)===d&&this.retireLogicalEntry(d,1011,Gf(p).message,!0,!1)}),h}attachLogicalChannel(c){const f=this.peerOwner,s=this.peer,h=this.wireBudget;if(!f||!s||!h||!this.directReady||this.channels.get(c.channelId)!==c){this.retireLogicalEntry(c,1011,"console-direct-not-ready",!0,!1);return}c.owner=f;const d=c.purpose==="frame"||c.purpose==="atlas",p=s.createDataChannel(`${Gy}${c.channelId}:${c.purpose}`,d?{ordered:!1,maxPacketLifeTime:120}:{ordered:!0});p.binaryType="arraybuffer",c.dataChannel=p,c.assembler=rd({budget:h,maxMessageBytes:d?yd:gl,maxPendingMessages:d?Fy:2}),this.refreshLogicalOpenDeadline(c,f,p),p.onopen=()=>{if(this.logicalEntryIsCurrent(c,f,p))try{this.sendControl({type:"ws-open",connectionId:f.connectionId,hubEpoch:f.hubEpoch,channelId:c.channelId,purpose:c.purpose,path:c.path}),c.openRequested=!0}catch{this.retireLogicalEntry(c,1011,"console-direct-ws-open-failed",!0,!1)}},p.onmessage=z=>{this.logicalEntryIsCurrent(c,f,p)&&this.handleLogicalWire(c,f,z.data)},p.onerror=()=>{this.logicalEntryIsCurrent(c,f,p)&&this.retireLogicalEntry(c,1011,"console-direct-channel-error",!0,!1)},p.onclose=()=>{this.logicalEntryIsCurrent(c,f,p)&&this.retireLogicalEntry(c,1006,"console-direct-channel-closed",!1,!1)}}logicalEntryIsCurrent(c,f,s){return this.channels.get(c.channelId)===c&&c.owner===f&&c.dataChannel===s&&this.isPeerOwner(f)}clearLogicalOpenDeadline(c){c.openDeadline!==null&&(window.clearTimeout(c.openDeadline),c.openDeadline=null)}refreshLogicalOpenDeadline(c,f,s){this.clearLogicalOpenDeadline(c);const h=window.setTimeout(()=>{c.openDeadline===h&&(c.openDeadline=null,!(!this.logicalEntryIsCurrent(c,f,s)||c.opened)&&this.retireLogicalEntry(c,1011,"console-direct-logical-open-timeout",!0,!1))},Xy);c.openDeadline=h}invalidateLivenessEvidence(){this.livenessEvidenceEpoch+=1,this.consecutiveLivenessRequestTimeouts=0}recordLivenessRequestTimeout(c,f){f===null||f!==this.livenessEvidenceEpoch||!this.isPeerOwner(c)||!this.directReady||(this.livenessRequestTimeoutCount+=1,this.consecutiveLivenessRequestTimeouts+=1,!(this.consecutiveLivenessRequestTimeouts<2)&&this.fail(fe(),"control-http-timeout",!0))}handleLogicalWire(c,f,s){const h=c.assembler;if(!(!h||!this.logicalEntryIsCurrent(c,f,c.dataChannel)))try{const d=h.push(vd(s));if(this.refreshLogicalWireDeadline(c,f),!d)return;if(d.kind==="control")throw new Error("logical-control-forbidden");let p;if(d.kind==="text"&&typeof d.data=="string")p={kind:"text",data:d.data,byteLength:d.byteLength};else if(d.kind==="binary"&&d.data instanceof Uint8Array)p={kind:"binary",data:d.data,byteLength:d.byteLength};else throw new Error("logical-wire-kind-invalid");if(!c.opened){this.queuePreOpenLogicalMessage(c,p);return}this.deliverLogicalMessage(c,p)}catch{this.retireLogicalEntry(c,1011,"console-direct-wire-invalid",!0,!1)}}queuePreOpenLogicalMessage(c,f){const s=c.purpose==="frame"||c.purpose==="atlas"?yd:gl;if(c.pendingInbound.length>=Iy||c.pendingInboundBytes+f.byteLength>s)throw new Error("logical-preopen-buffer-full");c.pendingInbound.push(f),c.pendingInboundBytes+=f.byteLength}deliverLogicalMessage(c,f){if(f.kind==="text"){c.socket.managerMessage(f.data);return}const s=f.data,h=s.buffer.slice(s.byteOffset,s.byteOffset+s.byteLength);c.socket.managerMessage(c.socket.binaryType==="arraybuffer"?h:new Blob([h]))}logicalBufferedAmount(c){return Number(this.channels.get(c)?.dataChannel?.bufferedAmount||0)}refreshLogicalWireDeadline(c,f){if((c.assembler?.inspect().pendingMessages||0)===0){c.wireDeadline!==null&&(window.clearTimeout(c.wireDeadline),c.wireDeadline=null);return}if(c.wireDeadline!==null)return;const h=window.setTimeout(()=>{if(c.wireDeadline!==h)return;c.wireDeadline=null;const d=c.dataChannel;!d||!this.logicalEntryIsCurrent(c,f,d)||(c.assembler?.inspect().pendingMessages||0)>0&&this.retireLogicalEntry(c,1011,"console-direct-partial-message-timeout",!0,!1)},c.purpose==="frame"||c.purpose==="atlas"?$y:Vy);c.wireDeadline=h}sendLogicalMessage(c,f){const s=this.channels.get(c),h=s?.dataChannel;if(!s||!h||!s.opened||h.readyState!=="open")throw new DOMException("WebSocket is not open.","InvalidStateError");try{if(typeof f=="string")this.sendWire(h,f,"text",gl);else if(f instanceof ArrayBuffer)this.sendWire(h,f,"binary",gl);else if(ArrayBuffer.isView(f)){const d=new Uint8Array(f.buffer,f.byteOffset,f.byteLength);this.sendWire(h,d,"binary",gl)}else throw new DOMException("Blob sends are not supported by the direct Console channel.","NotSupportedError")}catch(d){throw this.retireLogicalEntry(s,1011,"console-direct-send-failed",!0,!1),d}}closeLogicalChannel(c,f,s,h){const d=this.channels.get(c);d&&this.retireLogicalEntry(d,f,s,!1,h)}retireLogicalEntry(c,f,s,h,d){if(this.channels.get(c.channelId)!==c)return;this.channels.delete(c.channelId);const p=c.dataChannel,z=c.owner;if(d&&z&&c.openRequested&&this.isPeerOwner(z)&&this.controlChannel?.readyState==="open")try{this.sendControl({type:"ws-close",connectionId:z.connectionId,hubEpoch:z.hubEpoch,channelId:c.channelId,code:f,reason:s})}catch{h=!0}if(c.wireDeadline!==null&&(window.clearTimeout(c.wireDeadline),c.wireDeadline=null),this.clearLogicalOpenDeadline(c),c.assembler?.dispose(),c.assembler=null,c.pendingInbound=[],c.pendingInboundBytes=0,c.dataChannel=null,c.owner=null,c.openRequested=!1,c.opened=!1,p){p.onopen=null,p.onmessage=null,p.onerror=null,p.onclose=null;try{p.close()}catch{}}c.socket.managerClosed(f,s,h)}}const mt=new rv;function zd(o){mt.configure(o)}function hv(){mt.preferDirect()}function dv(){mt.markLocalHubReachable()}function kv(){mt.resume()}function Wv(){mt.suspendLivenessEvidence()}function $v(){mt.retry()}function Yf(o,c,f){return mt.preferDirect(),mt.fetch(o,c,f)}function Fv(o,c,f){return mt.shouldUseDirect()?mt.openWebSocket(c,f):new WebSocket(o)}function Iv(){return mt.inspect()}const mv="0.1.650",yv={version:mv},Pv=String(yv.version).trim(),Ua=15e3;function vv(o,c=Ua){const f=Number(o),s=Number.isFinite(Number(c))?Number(c):Ua;return Math.max(250,Math.min(12e4,Math.trunc(Number.isFinite(f)?f:s)))}class gd extends Error{constructor(c){super(`VuvoDesk Hub request timed out after ${c} ms.`),this.name="HubRequestTimeoutError",this.code="livedesk-hub-request-timeout",this.timeoutMs=c}}async function gv(o,c,f){const s=vv(c),h=new AbortController;let d=!1;const p=()=>{h.signal.aborted||h.abort(o?.reason)};o?.aborted?p():o?.addEventListener("abort",p,{once:!0});const z=setTimeout(()=>{d=!0,h.signal.aborted||h.abort(new gd(s))},s);try{return await f(h.signal)}catch(M){throw d?new gd(s):M}finally{clearTimeout(z),o?.removeEventListener("abort",p)}}function eg(o,c){if(o.current)return o.current;const f=Promise.resolve().then(c);return o.current=f,f.finally(()=>{o.current===f&&(o.current=null)}).catch(()=>{}),f}function Sv(o){let c=null;return{run(){if(c)return c;const f=Promise.resolve().then(o);c=f.finally(()=>{(c===f||c===s)&&(c=null)});const s=c;return s}}}async function bv(o,c){return o&&await o.catch(()=>{}),c()}function pv(o,c={}){if(c.publicConsole===!0)throw new Error("Public Console does not create a Hub cookie session.");return o?.workspaceKind==="team"&&o?.workspaceRole==="operator"?{accessToken:o.accessToken,workspaceId:o.workspaceId}:{accessToken:o.accessToken,refreshToken:o.refreshToken,expiresAt:o.expiresAt,user:o.user,workspaceId:o.workspaceId}}function ts(o){return!o?.user?.id||!o?.workspaceId?"":[o.user.id,o.workspaceId,o.workspaceKind,o.workspaceRole,Number(o.membershipRevision||0)].join(`
14
+ ${f.workspaceRole}`:"";this.session=f,s!==h&&(this.teardown("console-session-replaced",null,!0),this.lastFailure=null)}preferDirect(){this.preferred=!0}markLocalHubReachable(){this.preferred=!1,this.teardown("local-hub-reachable",null,!0),this.lastFailure=null}resume(){if(this.invalidateLivenessEvidence(),this.hasReadyPayloadPeer()){this.lastFailure=null;return}this.teardown("console-resume",null,!0),this.lastFailure=null}suspendLivenessEvidence(){this.invalidateLivenessEvidence()}retry(){this.preferred=!0,this.teardown("console-manual-retry",null,!0),this.lastFailure=null}shouldUseDirect(){return this.preferred&&!!this.session?.accessToken}inspect(){const c=this.wireBudget?.inspect()||{retainedBytes:0,reservationCount:0},f=[...this.channels.values()].filter(M=>M.wireDeadline!==null).length,s=[...this.channels.values()].filter(M=>M.openDeadline!==null).length,h=this.connectTimer===null?0:1,d=this.peerDisconnectTimer===null?0:1,p=this.controlWireDeadline===null?0:1,z=this.workspaceReauthAttempt?.deadline==null?0:1;return Object.freeze({preferred:this.preferred,stage:this.stage,directReady:this.directReady,generation:this.generation,signalSockets:this.signalSocket?1:0,peerCount:this.peer?1:0,controlChannels:this.controlChannel?1:0,logicalChannels:this.channels.size,openLogicalChannels:[...this.channels.values()].filter(M=>M.opened).length,pendingHttpRequests:this.pendingHttp.size,livenessEvidenceEpoch:this.livenessEvidenceEpoch,workspaceReauthRequests:this.workspaceReauthAttempt?1:0,consecutiveLivenessRequestTimeouts:this.consecutiveLivenessRequestTimeouts,livenessRequestTimeoutCount:this.livenessRequestTimeoutCount,pendingRemoteCandidates:this.pendingRemoteCandidates.length,connectTimers:h,peerDisconnectTimers:d,controlWireTimers:p,workspaceReauthTimers:z,logicalOpenTimers:s,logicalWireTimers:f,resourceTimers:h+d+p+z+s+f+this.pendingHttp.size,wireRetainedBytes:c.retainedBytes,wireReservations:c.reservationCount,sendBufferedBytes:this.peerBufferedAmount(),lastTerminalWireBytes:this.lastTerminalWireBytes,lastTerminalWireReservations:this.lastTerminalWireReservations,failure:this.lastFailure})}nextMessageId(){return this.wireMessageId=this.wireMessageId>=4294967295?1:this.wireMessageId+1,this.wireMessageId}isSignalOwner(c,f){return c===this.generation&&this.signalSocket===f}isPeerOwner(c){return Hy(this.peerOwner,c)}hasReadyPayloadPeer(){return this.directReady&&!!this.peerOwner&&!!this.peer&&this.peer?.connectionState!=="failed"&&this.peer?.connectionState!=="closed"&&this.controlChannel?.readyState==="open"}detachSignalFromReadyPeer(c,f,s){if(!this.isSignalOwner(c,f)||!this.hasReadyPayloadPeer())return!1;this.cancelWorkspaceReauthAttempt(c,f),this.signalSocket=null,this.signalReady=!1,this.consoleId="";try{f.close(1e3,s)}catch{}return!0}clearConnectTimer(){this.connectTimer!==null&&(window.clearTimeout(this.connectTimer),this.connectTimer=null)}clearPeerDisconnectTimer(){this.peerDisconnectTimer!==null&&(window.clearTimeout(this.peerDisconnectTimer),this.peerDisconnectTimer=null)}cancelWorkspaceReauthAttempt(c,f){const s=this.workspaceReauthAttempt;if(!s||c!==void 0&&s.generation!==c||f!==void 0&&s.socket!==f)return!1;this.workspaceReauthAttempt=null,s.deadline!==null&&(window.clearTimeout(s.deadline),s.deadline=null);try{s.controller.abort()}catch{}return!0}refreshPeerDisconnectDeadline(c,f){if(!this.isPeerOwner(c)||this.peer!==f)return;if(!(f.connectionState==="disconnected"||f.iceConnectionState==="disconnected")){this.clearPeerDisconnectTimer();return}if(this.peerDisconnectTimer!==null)return;const h=window.setTimeout(()=>{this.peerDisconnectTimer===h&&(this.peerDisconnectTimer=null,!(!this.isPeerOwner(c)||this.peer!==f)&&(f.connectionState==="disconnected"||f.iceConnectionState==="disconnected")&&this.fail(fe(),"peer-disconnected-timeout",!0))},jy);this.peerDisconnectTimer=h}clearControlWireDeadline(){this.controlWireDeadline!==null&&(window.clearTimeout(this.controlWireDeadline),this.controlWireDeadline=null)}refreshControlWireDeadline(c,f){if((f.inspect().pendingMessages||0)===0){this.clearControlWireDeadline();return}if(this.controlWireDeadline!==null)return;const h=window.setTimeout(()=>{this.controlWireDeadline===h&&(this.controlWireDeadline=null,!(!this.isPeerOwner(c)||this.controlAssembler!==f)&&(f.inspect().pendingMessages||0)>0&&this.fail(fe(),"control-wire-assembly-timeout",!0))},Qy);this.controlWireDeadline=h}resolveCurrentConnect(){const c=this.resolveConnect;this.resolveConnect=null,this.rejectConnect=null,this.connectPromise=null,this.clearConnectTimer(),c?.()}rejectCurrentConnect(c){const f=this.rejectConnect;this.resolveConnect=null,this.rejectConnect=null,this.connectPromise=null,this.clearConnectTimer(),f?.(c)}signal(c){if(!Py.has(String(c.type||"")))throw new Error("console-direct-signal-type-forbidden");const f=this.signalSocket;if(!f||f.readyState!==WebSocket.OPEN||!this.signalReady)throw Ye();f.send(JSON.stringify(c))}peerBufferedAmount(){let c=Number(this.controlChannel?.bufferedAmount||0);for(const f of this.channels.values())c+=Number(f.dataChannel?.bufferedAmount||0);return c}sendWire(c,f,s,h){if(c.readyState!=="open")throw new Error("console-direct-data-channel-not-open");const d=Cy(f,{messageId:this.nextMessageId(),kind:s,maxMessageBytes:h}),p=d.reduce((z,M)=>z+M.byteLength,0);if(p>md||this.peerBufferedAmount()>md-p)throw new Error("console-direct-send-buffer-full");for(const z of d)c.send(z)}sendControl(c){const f=this.controlChannel;if(!f||!this.directReady||!this.peerOwner)throw fe();this.sendWire(f,JSON.stringify(c),"control",gl)}fail(c,f,s=!0){this.lastFailure=qf(c),this.teardown(f,c,s)}teardown(c,f,s,h=!1){const d=this.signalSocket,p=this.peerOwner;if(s&&d?.readyState===WebSocket.OPEN&&this.signalReady&&p)try{this.signal({type:"rtc-close",connectionId:p.connectionId,hubEpoch:p.hubEpoch,reason:String(c||"console-direct-closed").slice(0,120)})}catch{}h?this.stage="hub-offline":(this.generation+=1,this.stage="idle",this.signalSocket=null,this.signalReady=!1,this.consoleId="",this.cancelWorkspaceReauthAttempt()),this.hubEpoch="",this.peerOwner=null,this.directReady=!1,this.remoteDescriptionApplied=!1,this.pendingRemoteCandidates=[],this.invalidateLivenessEvidence(),this.clearConnectTimer(),this.clearPeerDisconnectTimer();const z=f||new Error(c||"console-direct-closed");this.rejectCurrentConnect(z);for(const[w,N]of this.pendingHttp)window.clearTimeout(N.timeout),N.detachAbort(),N.reject(z),this.pendingHttp.delete(w);for(const w of[...this.channels.values()])this.retireLogicalEntry(w,f?1011:1001,c,!!f,!1);this.clearControlWireDeadline(),this.controlAssembler?.dispose(),this.controlAssembler=null;const M=this.controlChannel;if(this.controlChannel=null,M){M.onopen=null,M.onmessage=null,M.onerror=null,M.onclose=null;try{M.close()}catch{}}const R=this.peer;if(this.peer=null,R){R.onicecandidate=null,R.onconnectionstatechange=null,R.oniceconnectionstatechange=null;try{R.close()}catch{}}if(!h)try{d?.close(1e3,String(c||"console-direct-closed").slice(0,120))}catch{}const j=this.wireBudget?.inspect();this.lastTerminalWireBytes=Number(j?.retainedBytes||0),this.lastTerminalWireReservations=Number(j?.reservationCount||0),this.wireBudget=null}async connect(){if(this.directReady&&this.peerOwner&&this.controlChannel?.readyState==="open")return;if(this.connectPromise)return this.connectPromise;const c=this.session;if(!c)throw Ye();const f=this.signalSocket?.readyState===WebSocket.OPEN&&this.signalReady;if(f&&this.stage==="hub-offline"){const d=Bf();throw this.lastFailure=qf(d),d}if(f&&this.stage==="p2p"&&this.peerOwner&&this.peer){const d=this.generation,p=new Promise((z,M)=>{this.resolveConnect=z,this.rejectConnect=M});return this.connectPromise=p,this.connectTimer===null&&(this.connectTimer=window.setTimeout(()=>{d===this.generation&&!this.directReady&&this.fail(fe(),"direct-ready-timeout",!0)},xf)),p}const s=this.generation+1;this.generation=s,this.stage="signal",this.lastFailure=null;const h=new Promise((d,p)=>{this.resolveConnect=d,this.rejectConnect=p});this.connectPromise=h,this.connectTimer=window.setTimeout(()=>{if(s!==this.generation)return;const d=this.stage==="signal"?Ye():fe();this.fail(d,this.stage==="signal"?"signal-timeout":"direct-ready-timeout",!1)},this.stage==="signal"?Yy:xf);try{const d=new WebSocket(tv(c.workspaceId),[By,`${qy}${c.accessToken}`]);this.signalSocket=d,d.addEventListener("message",p=>{if(!this.isSignalOwner(s,d)||typeof p.data!="string")return;let z;try{z=JSON.parse(p.data)}catch{this.fail(Ye(),"invalid-signal-json",!1);return}this.handleSignal(z,s,d)}),d.addEventListener("error",()=>{this.isSignalOwner(s,d)&&(this.detachSignalFromReadyPeer(s,d,"signal-detached-after-ready")||this.fail(Ye(),"signal-service-unavailable",!1))}),d.addEventListener("close",()=>{this.isSignalOwner(s,d)&&(this.detachSignalFromReadyPeer(s,d,"signal-closed-after-ready")||this.fail(Ye(),"signal-service-closed",!1))})}catch{this.fail(Ye(),"signal-constructor-failed",!1)}return h}handleSignal(c,f,s){if(!this.isSignalOwner(f,s))return;if(c.type==="workspace-reauth-required"){const d=this.session,p=String(c.workspaceId||d?.workspaceId||"").trim(),z=String(c.challengeNonce||"").trim();if(!d||p!==d.workspaceId||!wa.test(z)){this.fail(Ye(),"workspace-reauth-owner-mismatch",!1);return}if(this.workspaceReauthAttempt?.challengeNonce===z&&this.workspaceReauthAttempt.generation===f&&this.workspaceReauthAttempt.socket===s)return;this.cancelWorkspaceReauthAttempt();const M=new AbortController,R={challengeNonce:z,generation:f,socket:s,controller:M,deadline:null},j=Number(c.deadlineAt||0),w=Number.isFinite(j)&&j>0?Math.max(1,j-Date.now()):hd;R.deadline=window.setTimeout(()=>{this.workspaceReauthAttempt===R&&this.cancelWorkspaceReauthAttempt(f,s)},Math.max(1,Math.min(hd,w))),this.workspaceReauthAttempt=R,(async()=>{try{await fetch(lv("/v2/rtc/reauth"),{method:"POST",headers:{Authorization:`Bearer ${d.accessToken}`,"Content-Type":"application/json"},body:JSON.stringify({workspaceId:d.workspaceId,challengeNonce:z}),signal:M.signal,cache:"no-store"})}catch{}})().finally(()=>{this.workspaceReauthAttempt===R&&(this.workspaceReauthAttempt=null,R.deadline!==null&&(window.clearTimeout(R.deadline),R.deadline=null))});return}if(c.type==="workspace-access-refreshed"||c.type==="workspace-reauth-ok"){c.type==="workspace-reauth-ok"&&this.cancelWorkspaceReauthAttempt(f,s);return}if(c.type==="workspace-access-expired"){this.fail(Ye(),"workspace-access-expired",!1);return}if(c.type==="signal-ready"){const d=String(c.consoleId||""),p=String(c.hubEpoch||"");if(c.role!=="console"||!wa.test(d)){this.fail(Ye(),"invalid-signal-ready",!1);return}if(this.signalReady=!0,this.consoleId=d,c.hubOnline!==!0){const z=Bf();this.lastFailure=qf(z),this.teardown("hub-offline",z,!1,!0);return}if(!wa.test(p)){this.fail(Ye(),"invalid-hub-epoch",!1);return}if(this.peerOwner){this.peerOwner.hubEpoch!==p&&this.fail(fe(),"hub-epoch-replaced",!1);return}this.hubEpoch=p,this.stage="p2p",this.lastFailure=null,this.clearConnectTimer(),this.connectTimer=window.setTimeout(()=>{f===this.generation&&!this.directReady&&this.fail(fe(),"direct-ready-timeout",!0)},xf),this.beginPeer(f,p);return}const h=this.peerOwner;if(!(!h||String(c.connectionId||"")!==h.connectionId||String(c.hubEpoch||"")!==h.hubEpoch)){if(c.type==="rtc-answer")this.acceptAnswer(h,c.description);else if(c.type==="rtc-ice")this.acceptRemoteCandidate(h,c.candidate,c.sdpMid);else if(c.type==="rtc-close"){const d=String(c.reason||"rtc-closed"),p=/hub-offline/i.test(d)?Bf():fe();this.fail(p,d,!1)}}}beginPeer(c,f){if(c!==this.generation||this.peer)return;const s=this.session;if(!s){this.fail(Ye(),"session-missing",!1);return}const h=Ny({userId:s.user.id,connectionId:crypto.randomUUID(),hubEpoch:f,generation:c});this.peerOwner=h,this.wireBudget=Dd({maxBytes:Wy}),this.controlAssembler=rd({budget:this.wireBudget,maxMessageBytes:gl});let d;try{d=new RTCPeerConnection({iceServers:[{urls:av()}],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"})}catch{this.fail(fe(),"peer-constructor-failed",!0);return}this.peer=d;const p=d.createDataChannel(xy,{ordered:!0});p.binaryType="arraybuffer",this.controlChannel=p,d.onicecandidate=z=>{if(!this.isPeerOwner(h)||this.peer!==d||!z.candidate)return;const M=String(z.candidate.candidate||"");if(Ma(M)){this.fail(fe(),"relay-ice-candidate-forbidden",!0);return}try{this.signal({type:"rtc-ice",connectionId:h.connectionId,hubEpoch:h.hubEpoch,candidate:M,sdpMid:z.candidate.sdpMid})}catch{this.fail(Ye(),"signal-ice-failed",!1)}},d.onconnectionstatechange=()=>{if(!(!this.isPeerOwner(h)||this.peer!==d)){if(d.connectionState==="failed"||d.connectionState==="closed"){this.fail(fe(),`peer-${d.connectionState}`,!0);return}this.refreshPeerDisconnectDeadline(h,d)}},d.oniceconnectionstatechange=()=>{if(!(!this.isPeerOwner(h)||this.peer!==d)){if(d.iceConnectionState==="failed"||d.iceConnectionState==="closed"){this.fail(fe(),`ice-${d.iceConnectionState}`,!0);return}this.refreshPeerDisconnectDeadline(h,d)}},p.onmessage=z=>{!this.isPeerOwner(h)||this.controlChannel!==p||this.handleControlWire(h,z.data)},p.onerror=()=>{!this.isPeerOwner(h)||this.controlChannel!==p||this.fail(fe(),"control-channel-error",!0)},p.onclose=()=>{!this.isPeerOwner(h)||this.controlChannel!==p||this.fail(fe(),"control-channel-closed",!0)},(async()=>{try{const z=await d.createOffer();if(!this.isPeerOwner(h)||this.peer!==d)return;if(z.type!=="offer"||Ma(z.sdp))throw new Error("relay-sdp-forbidden");if(await d.setLocalDescription(z),!this.isPeerOwner(h)||this.peer!==d)return;const M=d.localDescription||z;if(M.type!=="offer"||Ma(M.sdp))throw new Error("relay-sdp-forbidden");this.signal({type:"rtc-offer",connectionId:h.connectionId,hubEpoch:h.hubEpoch,description:{type:"offer",sdp:M.sdp||""}})}catch(z){if(!this.isPeerOwner(h))return;const M=/signal/i.test(String(z?.message||""))?Ye():fe();this.fail(M,"rtc-offer-failed",!0)}})()}async acceptAnswer(c,f){const s=this.peer;if(!(!this.isPeerOwner(c)||!s||this.remoteDescriptionApplied)){if(f?.type!=="answer"||typeof f.sdp!="string"||Ma(f.sdp)){this.fail(fe(),"rtc-answer-invalid",!0);return}try{if(await s.setRemoteDescription({type:"answer",sdp:f.sdp}),!this.isPeerOwner(c)||this.peer!==s)return;this.remoteDescriptionApplied=!0;const h=this.pendingRemoteCandidates;this.pendingRemoteCandidates=[];for(const d of h){if(!this.isPeerOwner(c)||this.peer!==s)return;await s.addIceCandidate(d.candidate?d:null)}}catch{this.isPeerOwner(c)&&this.fail(fe(),"rtc-answer-apply-failed",!0)}}}async acceptRemoteCandidate(c,f,s){if(!this.isPeerOwner(c))return;const h=String(f??""),d=s==null?null:String(s);if(h.length>4*1024||d!==null&&d.length>256||Ma(h)){this.fail(fe(),"rtc-candidate-invalid",!0);return}const p=this.peer;if(p){if(!this.remoteDescriptionApplied){if(this.pendingRemoteCandidates.length>=Ky){this.fail(fe(),"rtc-candidate-capacity",!0);return}this.pendingRemoteCandidates.push({candidate:h,sdpMid:d});return}try{await p.addIceCandidate(h?{candidate:h,sdpMid:d}:null)}catch{this.isPeerOwner(c)&&this.fail(fe(),"rtc-candidate-apply-failed",!0)}}}handleControlWire(c,f){const s=this.controlAssembler;if(!(!this.isPeerOwner(c)||!s))try{const h=s.push(vd(f));if(this.refreshControlWireDeadline(c,s),!h)return;if(h.kind!=="control"||typeof h.data!="string")throw new Error("control-wire-kind-invalid");const d=JSON.parse(h.data);if(d.type==="direct-ready"){if(d.connectionId!==c.connectionId||d.hubEpoch!==c.hubEpoch||this.controlChannel?.readyState!=="open")throw new Error("direct-ready-owner-invalid");this.directReady||(this.consecutiveLivenessRequestTimeouts=0,this.directReady=!0,this.stage="ready",this.resolveCurrentConnect());return}if(d.type==="http-response"){this.handleHttpResponse(c,d);return}if(d.type==="ws-opened"||d.type==="ws-closed"||d.type==="ws-error"){this.handleLogicalLifecycle(c,d);return}throw new Error("control-message-type-invalid")}catch{this.isPeerOwner(c)&&this.fail(fe(),"control-wire-invalid",!0)}}handleLogicalLifecycle(c,f){if(f.connectionId!==c.connectionId||f.hubEpoch!==c.hubEpoch)throw new Error("logical-lifecycle-owner-invalid");const s=String(f.channelId||"");if(!wa.test(s))throw new Error("logical-lifecycle-channel-invalid");const h=this.channels.get(s);if(!h)return;const d=h.dataChannel;if(!d||!h.openRequested||!this.logicalEntryIsCurrent(h,c,d))throw new Error("logical-lifecycle-owner-invalid");if(f.type==="ws-opened"){if(h.opened)return;h.opened=!0,this.clearLogicalOpenDeadline(h);const p=h.pendingInbound.splice(0);if(h.pendingInboundBytes=0,h.socket.managerOpened(),!this.logicalEntryIsCurrent(h,c,d)||!h.opened)return;for(const z of p)this.deliverLogicalMessage(h,z);return}if(f.type==="ws-closed"){this.retireLogicalEntry(h,Wf(f.code,1e3),String(f.reason||""),!1,!1);return}this.retireLogicalEntry(h,1011,String(f.error||"console-direct-websocket-error"),!0,!1)}handleHttpResponse(c,f){const s=String(f.requestId||""),h=this.pendingHttp.get(s);if(!(!h||h.generation!==c.generation||!this.isPeerOwner(c))){this.consecutiveLivenessRequestTimeouts=0,this.pendingHttp.delete(s),window.clearTimeout(h.timeout),h.detachAbort();try{const d=Number(f.status||502),p=f.bodyBase64?iv(f.bodyBase64):new TextEncoder().encode(JSON.stringify({ok:!1,error:f.error||"console-direct-request-failed"}));h.resolve(new Response(p,{status:Number.isInteger(d)&&d>=200&&d<=599?d:502,statusText:String(f.statusText||""),headers:f.headers||{"content-type":"application/json"}}))}catch(d){h.reject(Gf(d))}}}async fetch(c,f,s){await sv(this.connect(),f?.signal);const h=this.peerOwner;if(!h||!this.directReady||this.controlChannel?.readyState!=="open")throw fe();if(this.pendingHttp.size>=dd)throw new Error("console-direct-http-capacity-reached");const d=await cv(f?.body);if(d.byteLength>Jy)throw new Error("console-direct-http-body-too-large");if(!this.isPeerOwner(h)||!this.directReady)throw fe();if(this.pendingHttp.size>=dd)throw new Error("console-direct-http-capacity-reached");if(f?.signal?.aborted)throw f.signal.reason||new Error("Mobile Console request cancelled.");const p=crypto.randomUUID(),z=Number.isFinite(s)&&s>0?Math.floor(s):4e3,M=String(f?.method||"GET").toUpperCase(),R=M==="GET"&&ky.has(c),j=R?this.livenessEvidenceEpoch:null,w=new Promise((N,H)=>{const q=(st,yt=!1)=>{const ve=this.pendingHttp.get(p);if(ve){this.pendingHttp.delete(p),window.clearTimeout(ve.timeout),ve.detachAbort();try{this.sendControl({type:"http-cancel",requestId:p})}catch{}H(st),yt&&R&&this.recordLivenessRequestTimeout(h,ve.livenessEvidenceEpoch)}},se=()=>q(f?.signal?.reason instanceof Error?f.signal.reason:new Error("Mobile Console request cancelled."));f?.signal?.addEventListener("abort",se,{once:!0});const je=window.setTimeout(()=>{q(new Error("Mobile Console direct request timed out."),!0)},z);this.pendingHttp.set(p,{generation:h.generation,livenessEvidenceEpoch:j,resolve:N,reject:H,timeout:je,detachAbort:()=>f?.signal?.removeEventListener("abort",se)})});try{this.sendControl({type:"http-request",requestId:p,method:M,path:c,headers:fv(f),bodyBase64:d.byteLength>0?uv(d):""})}catch(N){const H=this.pendingHttp.get(p);H&&(this.pendingHttp.delete(p),window.clearTimeout(H.timeout),H.detachAbort(),H.reject(Gf(N))),this.fail(fe(),"control-send-failed",!0)}return w}openWebSocket(c,f){if(!ev.has(f))throw new Error("console-direct-purpose-invalid");if(this.channels.size>=Zy)throw new Error("console-direct-channel-capacity-reached");const s=crypto.randomUUID(),h=new ov(this,s,f,c),d={channelId:s,path:c,purpose:f,socket:h,owner:null,dataChannel:null,assembler:null,openDeadline:null,wireDeadline:null,openRequested:!1,opened:!1,pendingInbound:[],pendingInboundBytes:0};return this.channels.set(s,d),this.connect().then(()=>{this.channels.get(s)===d&&this.attachLogicalChannel(d)}).catch(p=>{this.channels.get(s)===d&&this.retireLogicalEntry(d,1011,Gf(p).message,!0,!1)}),h}attachLogicalChannel(c){const f=this.peerOwner,s=this.peer,h=this.wireBudget;if(!f||!s||!h||!this.directReady||this.channels.get(c.channelId)!==c){this.retireLogicalEntry(c,1011,"console-direct-not-ready",!0,!1);return}c.owner=f;const d=c.purpose==="frame"||c.purpose==="atlas",p=s.createDataChannel(`${Gy}${c.channelId}:${c.purpose}`,d?{ordered:!1,maxPacketLifeTime:120}:{ordered:!0});p.binaryType="arraybuffer",c.dataChannel=p,c.assembler=rd({budget:h,maxMessageBytes:d?yd:gl,maxPendingMessages:d?Fy:2}),this.refreshLogicalOpenDeadline(c,f,p),p.onopen=()=>{if(this.logicalEntryIsCurrent(c,f,p))try{this.sendControl({type:"ws-open",connectionId:f.connectionId,hubEpoch:f.hubEpoch,channelId:c.channelId,purpose:c.purpose,path:c.path}),c.openRequested=!0}catch{this.retireLogicalEntry(c,1011,"console-direct-ws-open-failed",!0,!1)}},p.onmessage=z=>{this.logicalEntryIsCurrent(c,f,p)&&this.handleLogicalWire(c,f,z.data)},p.onerror=()=>{this.logicalEntryIsCurrent(c,f,p)&&this.retireLogicalEntry(c,1011,"console-direct-channel-error",!0,!1)},p.onclose=()=>{this.logicalEntryIsCurrent(c,f,p)&&this.retireLogicalEntry(c,1006,"console-direct-channel-closed",!1,!1)}}logicalEntryIsCurrent(c,f,s){return this.channels.get(c.channelId)===c&&c.owner===f&&c.dataChannel===s&&this.isPeerOwner(f)}clearLogicalOpenDeadline(c){c.openDeadline!==null&&(window.clearTimeout(c.openDeadline),c.openDeadline=null)}refreshLogicalOpenDeadline(c,f,s){this.clearLogicalOpenDeadline(c);const h=window.setTimeout(()=>{c.openDeadline===h&&(c.openDeadline=null,!(!this.logicalEntryIsCurrent(c,f,s)||c.opened)&&this.retireLogicalEntry(c,1011,"console-direct-logical-open-timeout",!0,!1))},Xy);c.openDeadline=h}invalidateLivenessEvidence(){this.livenessEvidenceEpoch+=1,this.consecutiveLivenessRequestTimeouts=0}recordLivenessRequestTimeout(c,f){f===null||f!==this.livenessEvidenceEpoch||!this.isPeerOwner(c)||!this.directReady||(this.livenessRequestTimeoutCount+=1,this.consecutiveLivenessRequestTimeouts+=1,!(this.consecutiveLivenessRequestTimeouts<2)&&this.fail(fe(),"control-http-timeout",!0))}handleLogicalWire(c,f,s){const h=c.assembler;if(!(!h||!this.logicalEntryIsCurrent(c,f,c.dataChannel)))try{const d=h.push(vd(s));if(this.refreshLogicalWireDeadline(c,f),!d)return;if(d.kind==="control")throw new Error("logical-control-forbidden");let p;if(d.kind==="text"&&typeof d.data=="string")p={kind:"text",data:d.data,byteLength:d.byteLength};else if(d.kind==="binary"&&d.data instanceof Uint8Array)p={kind:"binary",data:d.data,byteLength:d.byteLength};else throw new Error("logical-wire-kind-invalid");if(!c.opened){this.queuePreOpenLogicalMessage(c,p);return}this.deliverLogicalMessage(c,p)}catch{this.retireLogicalEntry(c,1011,"console-direct-wire-invalid",!0,!1)}}queuePreOpenLogicalMessage(c,f){const s=c.purpose==="frame"||c.purpose==="atlas"?yd:gl;if(c.pendingInbound.length>=Iy||c.pendingInboundBytes+f.byteLength>s)throw new Error("logical-preopen-buffer-full");c.pendingInbound.push(f),c.pendingInboundBytes+=f.byteLength}deliverLogicalMessage(c,f){if(f.kind==="text"){c.socket.managerMessage(f.data);return}const s=f.data,h=s.buffer.slice(s.byteOffset,s.byteOffset+s.byteLength);c.socket.managerMessage(c.socket.binaryType==="arraybuffer"?h:new Blob([h]))}logicalBufferedAmount(c){return Number(this.channels.get(c)?.dataChannel?.bufferedAmount||0)}refreshLogicalWireDeadline(c,f){if((c.assembler?.inspect().pendingMessages||0)===0){c.wireDeadline!==null&&(window.clearTimeout(c.wireDeadline),c.wireDeadline=null);return}if(c.wireDeadline!==null)return;const h=window.setTimeout(()=>{if(c.wireDeadline!==h)return;c.wireDeadline=null;const d=c.dataChannel;!d||!this.logicalEntryIsCurrent(c,f,d)||(c.assembler?.inspect().pendingMessages||0)>0&&this.retireLogicalEntry(c,1011,"console-direct-partial-message-timeout",!0,!1)},c.purpose==="frame"||c.purpose==="atlas"?$y:Vy);c.wireDeadline=h}sendLogicalMessage(c,f){const s=this.channels.get(c),h=s?.dataChannel;if(!s||!h||!s.opened||h.readyState!=="open")throw new DOMException("WebSocket is not open.","InvalidStateError");try{if(typeof f=="string")this.sendWire(h,f,"text",gl);else if(f instanceof ArrayBuffer)this.sendWire(h,f,"binary",gl);else if(ArrayBuffer.isView(f)){const d=new Uint8Array(f.buffer,f.byteOffset,f.byteLength);this.sendWire(h,d,"binary",gl)}else throw new DOMException("Blob sends are not supported by the direct Console channel.","NotSupportedError")}catch(d){throw this.retireLogicalEntry(s,1011,"console-direct-send-failed",!0,!1),d}}closeLogicalChannel(c,f,s,h){const d=this.channels.get(c);d&&this.retireLogicalEntry(d,f,s,!1,h)}retireLogicalEntry(c,f,s,h,d){if(this.channels.get(c.channelId)!==c)return;this.channels.delete(c.channelId);const p=c.dataChannel,z=c.owner;if(d&&z&&c.openRequested&&this.isPeerOwner(z)&&this.controlChannel?.readyState==="open")try{this.sendControl({type:"ws-close",connectionId:z.connectionId,hubEpoch:z.hubEpoch,channelId:c.channelId,code:f,reason:s})}catch{h=!0}if(c.wireDeadline!==null&&(window.clearTimeout(c.wireDeadline),c.wireDeadline=null),this.clearLogicalOpenDeadline(c),c.assembler?.dispose(),c.assembler=null,c.pendingInbound=[],c.pendingInboundBytes=0,c.dataChannel=null,c.owner=null,c.openRequested=!1,c.opened=!1,p){p.onopen=null,p.onmessage=null,p.onerror=null,p.onclose=null;try{p.close()}catch{}}c.socket.managerClosed(f,s,h)}}const mt=new rv;function zd(o){mt.configure(o)}function hv(){mt.preferDirect()}function dv(){mt.markLocalHubReachable()}function kv(){mt.resume()}function Wv(){mt.suspendLivenessEvidence()}function $v(){mt.retry()}function Yf(o,c,f){return mt.preferDirect(),mt.fetch(o,c,f)}function Fv(o,c,f){return mt.shouldUseDirect()?mt.openWebSocket(c,f):new WebSocket(o)}function Iv(){return mt.inspect()}const mv="0.1.652",yv={version:mv},Pv=String(yv.version).trim(),Ua=15e3;function vv(o,c=Ua){const f=Number(o),s=Number.isFinite(Number(c))?Number(c):Ua;return Math.max(250,Math.min(12e4,Math.trunc(Number.isFinite(f)?f:s)))}class gd extends Error{constructor(c){super(`VuvoDesk Hub request timed out after ${c} ms.`),this.name="HubRequestTimeoutError",this.code="livedesk-hub-request-timeout",this.timeoutMs=c}}async function gv(o,c,f){const s=vv(c),h=new AbortController;let d=!1;const p=()=>{h.signal.aborted||h.abort(o?.reason)};o?.aborted?p():o?.addEventListener("abort",p,{once:!0});const z=setTimeout(()=>{d=!0,h.signal.aborted||h.abort(new gd(s))},s);try{return await f(h.signal)}catch(M){throw d?new gd(s):M}finally{clearTimeout(z),o?.removeEventListener("abort",p)}}function eg(o,c){if(o.current)return o.current;const f=Promise.resolve().then(c);return o.current=f,f.finally(()=>{o.current===f&&(o.current=null)}).catch(()=>{}),f}function Sv(o){let c=null;return{run(){if(c)return c;const f=Promise.resolve().then(o);c=f.finally(()=>{(c===f||c===s)&&(c=null)});const s=c;return s}}}async function bv(o,c){return o&&await o.catch(()=>{}),c()}function pv(o,c={}){if(c.publicConsole===!0)throw new Error("Public Console does not create a Hub cookie session.");return o?.workspaceKind==="team"&&o?.workspaceRole==="operator"?{accessToken:o.accessToken,workspaceId:o.workspaceId}:{accessToken:o.accessToken,refreshToken:o.refreshToken,expiresAt:o.expiresAt,user:o.user,workspaceId:o.workspaceId}}function ts(o){return!o?.user?.id||!o?.workspaceId?"":[o.user.id,o.workspaceId,o.workspaceKind,o.workspaceRole,Number(o.membershipRevision||0)].join(`
15
15
  `)}function Ev(o){const c=ts(o);return!c||!o?.accessToken||!o?.refreshToken?"":[c,o.accessToken,o.refreshToken,Number(o.expiresAt||0)].join(`
16
16
  `)}function Tv({publicConsole:o,path:c,requiresUiSession:f}){return o?String(c||"").split("?")[0]==="/api/auth/session"?"reject-auth-session":f?"direct":"local":"local"}const Ca=5179,_n=Ha(`http://127.0.0.1:${Ca}`);function Av(o){const c=o.split(".").map(f=>Number(f));return c.length===4&&c.every(f=>Number.isInteger(f)&&f>=0&&f<=255)?c:[]}function Md(o){const c=o.trim().toLowerCase();return c==="localhost"||c==="127.0.0.1"||c==="::1"||c==="[::1]"}function Dv(o){const c=o.trim().toLowerCase();return!c||c==="0.0.0.0"||c==="::"||c==="[::]"}function wd(o){const c=Av(o);return c.length===0?!1:c[0]===10||c[0]===172&&c[1]>=16&&c[1]<=31||c[0]===192&&c[1]===168}function Ov(o){return o.includes(":")&&!o.startsWith("[")?`[${o}]`:o}function zv(o){const c=String(o||"").trim();if(!c)return null;const f=/^[a-z][a-z\d+.-]*:\/\//i.test(c)?c:`tcp://${c}`;try{const s=new URL(f),h=s.hostname.replace(/^\[|\]$/g,""),d=Number(s.port);return!h||!Number.isInteger(d)||d<1||d>65535||Dv(h)?null:{host:h,port:d}}catch{return null}}function Ha(o){const c=String(o||"").trim()||`http://127.0.0.1:${Ca}`,f=/^[a-z][a-z\d+.-]*:\/\//i.test(c)?c:`http://${c}`;try{const s=new URL(f);return s.port||(s.port=String(Ca)),s.hash="",s.search="",s.toString().replace(/\/+$/,"")}catch{return`http://127.0.0.1:${Ca}`}}function Mv(o){const c=zv(o);return c?Ha(`http://${Ov(c.host)}:${Ca}`):""}function tg(o){const f=[o?.endpoint,...Array.isArray(o?.endpoint_candidates)?o.endpoint_candidates:[]].map(s=>Mv(String(s||""))).filter(Boolean);return[...new Set(f)]}function wv(o=_n){if(!(typeof window>"u"||window.location.protocol!=="https:"))try{const c=new URL(o);if(c.protocol!=="http:")return;if(Md(c.hostname))return"loopback";if(wd(c.hostname))return"local"}catch{return}}function lg(o,c=_n){const f=new URL(o,Ha(c));return f.protocol=f.protocol==="https:"?"wss:":"ws:",f.toString()}let Xt=null,Un="",bl="";const Qt=new Map,Cn=new Map,_a=new Map,fi=new Set;function ri(o){const c=_a.get(o);c!==void 0&&typeof window<"u"&&window.clearTimeout(c),_a.delete(o)}function Cd(){for(const o of _a.keys())ri(o)}function $f(o){const c=Number(o||0);if(Number.isFinite(c)&&c>0)return c<1e10?c*1e3:c;const f=Date.parse(String(o||""));return Number.isFinite(f)?f:0}function Ud(o,c,f){if(ri(o),typeof window>"u"||c<=Date.now())return;const s=Math.max(1e3,Math.min(45e3,c-Date.now()-15e3)),h=window.setTimeout(()=>{_a.delete(o),!(f!==Un||Xt?.workspaceKind!=="team")&&oi(o,!0).catch(()=>{})},s);_a.set(o,h)}function Cv(o,c,f){const s=Xt?.workspaceKind==="team",h=s?$f(c.accessExpiresAt)||Date.now()+6e4:0;Qt.set(o,{csrfToken:c.csrfToken,expiresAt:c.expiresAt,accessExpiresAt:h,ownerSignature:bl}),fi.add(o),s?Ud(o,h,f):ri(o)}function ng(o){const c=o?.accessToken&&o?.refreshToken&&o?.user?.id?o:null,f=ts(c),s=Ev(c);if(f!==bl&&(c&&Qt.clear(),bl=f),s!==Un&&(Cd(),Un=s,c?.workspaceKind==="team"))for(const[h,d]of Qt)d.ownerSignature===f&&Ud(h,d.accessExpiresAt,s);Xt=c,zd(c?{accessToken:c.accessToken,user:{id:c.user.id},workspaceId:c.workspaceId,workspaceKind:c.workspaceKind,workspaceRole:c.workspaceRole,membershipRevision:c.membershipRevision}:null),c&&La()&&hv()}function La(){if(typeof window>"u"||window.location.protocol!=="https:")return!1;const o=window.location.hostname.replace(/^\[|\]$/g,"");return!Md(o)&&!wd(o)}function jf(o){const c=o.split("?")[0];return c==="/api/health"||c==="/api/runtime/status"||c==="/api/auth/status"||c==="/api/auth/session"}async function si(o,c,f,s,h){const d=wv(f);return d&&(c.targetAddressSpace=d),gv(h,s,async p=>{c.signal=p;try{return await fetch(`${f}${o}`,c)}catch(z){throw!p.aborted&&d?new Error("VuvoDesk Hub is not reachable at this local network address. If Chrome shows a local network prompt, allow it; otherwise restart the Hub so port 5179 is open on the network."):z}})}async function oi(o,c=!1){if(La())throw new Error("Public Console uses verified P2P authorization instead of a Hub cookie session.");const f=Qt.get(o);if(!c&&f&&f.ownerSignature===bl&&f.expiresAt>Date.now()+3e4&&(f.accessExpiresAt===0||f.accessExpiresAt>Date.now()+15e3))return;c&&Qt.delete(o);const s=Xt,h=Un;if(!s)return;const d=Cn.get(o);if(d)return d.authSignature===h?d.promise:d.promise.catch(()=>{}).then(()=>oi(o,c));let p;const z=(async()=>{const M=await si("/api/auth/session",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(pv(s,{publicConsole:!1})),credentials:"include",cache:"no-store"},o,Ua),R=await M.json().catch(()=>null);if(!M.ok)throw new Error(`${M.status} ${R?.error||M.statusText}`);const j=String(R?.uiSession?.csrfToken||"").trim(),w=Number(R?.uiSession?.expiresAt||0);if(!j||!Number.isFinite(w)||w<=Date.now())throw new Error("VuvoDesk Hub did not issue a valid UI session.");if(h!==Un)throw Qt.set(o,{csrfToken:j,expiresAt:w,accessExpiresAt:$f(R?.uiSession?.accessExpiresAt),ownerSignature:ts(s)}),fi.add(o),new Error("VuvoDesk workspace changed while the Hub session was opening.");Cv(o,{csrfToken:j,expiresAt:w,accessExpiresAt:$f(R?.uiSession?.accessExpiresAt)},h)})().finally(()=>{Cn.get(o)===p&&Cn.delete(o)});return p={authSignature:h,promise:z},Cn.set(o,p),z}async function Uv(){const o=new Set(fi);for(const f of Cn.keys())o.add(f);La()||o.add(Ha(_n));const c=[...o].map(f=>bv(Cn.get(f)?.promise,async()=>{const s=Qt.get(f),h=await si("/api/auth/session",{method:"DELETE",headers:s?.csrfToken?{"X-LiveDesk-CSRF":s.csrfToken}:{},credentials:"include",cache:"no-store"},f,Ua);if(!h.ok&&h.status!==401){const d=await h.json().catch(()=>null);throw new Error(`${h.status} ${d?.error||h.statusText}`)}fi.delete(f),Qt.delete(f),ri(f)}));await Promise.all(c)}const _v=Sv(Uv);function ag(){return Xt=null,Un="",bl="",Cd(),zd(null),_v.run()}async function Rv(o,c,f=_n){const s=Ha(f),{timeoutMs:h=Ua,signal:d,transport:p="auto",...z}=c||{},M=!jf(o),R=M?bl:"",j=()=>!M||!!R&&R===bl,w=()=>{if(!j())throw new Error("VuvoDesk workspace changed while the Hub request was running.")},N=Tv({publicConsole:La(),path:o,requiresUiSession:M});if(M&&!Xt)throw new Error("VuvoDesk account authority is not available for this Hub request.");const H=()=>{const q=String(z.method||"GET").toUpperCase(),se=Qt.get(s),je=se?.ownerSignature===bl?se.csrfToken:"";return{...z,...d?{signal:d}:{},headers:{...z.headers||{},...!["GET","HEAD","OPTIONS"].includes(q)&&je?{"X-LiveDesk-CSRF":je}:{}},credentials:"include",cache:"no-store"}};if(N==="reject-auth-session")throw new Error("Public Console does not create a Hub cookie session.");if(N==="direct"){if(w(),d?.aborted)throw d.reason||new Error("VuvoDesk Hub request cancelled.");return Yf(o,H(),h)}if(p==="p2p"){if(w(),d?.aborted)throw d.reason||new Error("VuvoDesk Hub request cancelled.");if(!Xt||jf(o))throw new Error("Mobile Console direct connection requires an authenticated management request.");return Yf(o,H(),h)}try{M&&await oi(s),w();let q=await si(o,H(),s,h,d);if(w(),dv(),M&&q.status===401&&Xt){const se=await q.clone().json().catch(()=>null);/^hub-ui-session-(required|expired)$/.test(String(se?.error||""))&&(await oi(s,!0),w(),q=await si(o,H(),s,h,d),w())}return q}catch(q){if(!j()||d?.aborted||!Xt||jf(o))throw q;return Yf(o,H(),h)}}async function Nv(o,c,f=_n){const s=await Rv(o,{...c||{},headers:{"Content-Type":"application/json",...c?.headers||{}}},f);let h=null;try{h=await s.json()}catch(d){if(c?.signal?.aborted)throw d;h=null}if(!s.ok){const d=h&&typeof h=="object"&&"error"in h?String(h.error||""):"";throw new Error(`${s.status} ${d||s.statusText}`)}return h}async function ug({baseUrl:o=_n,targetRole:c,previousRuntimePid:f=0,allowedStates:s=["running","waiting-auth"],timeoutMs:h=3e4}){const d=Date.now()+h;let p=null;for(;Date.now()<d;){try{const M=await Nv("/api/runtime/status",void 0,o),R=String(M.role||"").toLowerCase(),j=String(M.state||"").toLowerCase(),w=Number(M.runtimePid||0),N=f>1?w>1&&w!==f:w>1;if(R===c&&s.map(H=>H.toLowerCase()).includes(j)&&N)return M}catch(M){p=M}await new Promise(M=>setTimeout(M,300))}const z=p instanceof Error?` ${p.message}`:"";throw new Error(`VuvoDesk runtime did not become ${c} with a new process.${z}`)}function ig(o,c=120){if(typeof window>"u")return;const f=new URL(window.location.href);f.port=String(o),f.pathname="/",f.search="",f.hash="";const s=f.toString();let h=0;const d=()=>{fetch(s,{cache:"no-store",mode:"no-cors"}).then(()=>window.location.replace(s)).catch(()=>{if(h+=1,h>=c){window.location.replace(s);return}window.setTimeout(d,250)})};d()}function cg(o){if(!o)return"-";const c=Date.now()-Date.parse(o);return Number.isFinite(c)?c<1e3?"now":c<6e4?`${Math.round(c/1e3)}s`:c<36e5?`${Math.round(c/6e4)}m`:`${Math.round(c/36e5)}h`:"-"}async function fg(o){await navigator.clipboard.writeText(o)}const Hv=2500;let ai=null,Ff=0,Xf=null,Sd=!1;async function Lv(){if(!La()||!window.navigator.onLine)return"";const o=new AbortController,c=window.setTimeout(()=>o.abort(),Hv);try{const f=await fetch(`/sw.js?startup-recovery=${Date.now()}`,{cache:"no-store",signal:o.signal});return f.ok?(await f.text()).match(/const PWA_RELEASE = ['"](\d+\.\d+\.\d+)['"];/)?.[1]??"":""}catch{return""}finally{window.clearTimeout(c)}}function Bv(o,c){const f=new URL(window.location.href),s=f.searchParams.get(Ra)||f.searchParams.get(Na)||"";if(bd({automaticRetry:c,online:window.navigator.onLine,retryValue:s})!=="reload-once")return Promise.resolve(!1);if(ai)return ai;const d=++Ff;return ai=(async()=>{const p=`${o}-${Date.now()}`,z=await Lv();return d!==Ff?!1:(window.location.replace(pd(window.location.href,p,z)),!0)})(),ai}function qv(){Ff+=1;const o=`manual-${Date.now()}`;window.stop(),window.location.replace(pd(window.location.href,o))}function xv(o){const c=new URL(window.location.href);return bd({automaticRetry:o,online:window.navigator.onLine,retryValue:c.searchParams.get(Ra)||c.searchParams.get(Na)||""})==="reload-once"}function Gv({detail:o,automaticRetry:c=!1}){return xv(c)?Ue.jsx("main",{className:"runtime-role-boot","aria-label":"Refreshing VuvoDesk","aria-busy":"true",children:Ue.jsx("span",{className:"runtime-role-boot-mark","aria-hidden":"true"})}):Ue.jsxs("main",{className:"runtime-role-boot","aria-label":"Starting VuvoDesk","aria-busy":"false",children:[Ue.jsx("strong",{children:"VuvoDesk could not start"}),Ue.jsx("p",{children:o}),Ue.jsx("button",{type:"button",className:"runtime-role-boot-retry",onClick:qv,children:"Try again"})]})}function Yv(){return Vf.useEffect(()=>{const o=new URL(window.location.href);if(!o.searchParams.has(Ra)&&!o.searchParams.has(Na))return;const c=new URL(Sy(o.toString()));window.history.replaceState(window.history.state,"",`${c.pathname}${c.search}${c.hash}`)},[]),null}class sg extends Vf.Component{state={failed:!1};static getDerivedStateFromError(){return{failed:!0}}componentDidCatch(c,f){console.error("[VuvoDesk] app render failed.",c,f.componentStack),Bv("render-error",this.props.automaticRetry)}render(){return this.state.failed?Ue.jsx(Gv,{detail:"The current app could not be displayed. Check the connection, then try again.",automaticRetry:this.props.automaticRetry}):Ue.jsxs(Vf.Fragment,{children:[this.props.children,Ue.jsx(Yv,{})]})}}function og(){const o=window;o.__vuvodeskStaticBootTimer!==void 0&&(window.clearTimeout(o.__vuvodeskStaticBootTimer),delete o.__vuvodeskStaticBootTimer)}const _d="serviceWorker"in navigator&&window.isSecureContext&&window.location.protocol==="https:";function Qf(){!_d||Xf||(Xf=(async()=>{await(await navigator.serviceWorker.register("/sw.js",{updateViaCache:"none"})).update();const c=await fetch(`/sw.js?pwa-release-check=${Date.now()}`,{cache:"no-store"});if(!c.ok)return;const s=(await c.text()).match(/const PWA_RELEASE = ['"](\d+\.\d+\.\d+)['"];/)?.[1];if(!s)return;const h=by(window.location.href,s);h&&window.location.replace(h)})().catch(o=>{console.warn("[VuvoDesk] PWA update check failed.",o)}).finally(()=>{Xf=null}))}function rg(){!_d||Sd||(Sd=!0,Qf(),window.addEventListener("pageshow",Qf),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&Qf()}))}export{ng as A,tg as B,Iv as C,_n as D,Jv as E,ry as F,Pv as L,Zv as M,sg as P,yy as T,Vv as _,hy as a,dy as b,Qv as c,Gv as d,eg as e,fg as f,cg as g,Nv as h,La as i,Ue as j,ag as k,wv as l,qf as m,ig as n,$v as o,Kv as p,Fv as q,Bv as r,rg as s,og as t,lg as u,Ha as v,ug as w,kv as x,Wv as y,Rv as z};
@@ -55,10 +55,10 @@
55
55
  .vuvodesk-static-boot [hidden] { display: none; }
56
56
  @keyframes vuvodesk-static-boot-spin { to { transform: rotate(360deg); } }
57
57
  </style>
58
- <script type="module" crossorigin src="/assets/main-BBDlfRlO.js" data-vuvodesk-entry></script>
58
+ <script type="module" crossorigin src="/assets/main-DEpRH1th.js" data-vuvodesk-entry></script>
59
59
  <link rel="modulepreload" crossorigin href="/assets/icons-CacEbnZu.js">
60
60
  <link rel="modulepreload" crossorigin href="/assets/react-Cfedt3N5.js">
61
- <link rel="modulepreload" crossorigin href="/assets/styles-B5DEnner.js">
61
+ <link rel="modulepreload" crossorigin href="/assets/styles-CDIlHYlj.js">
62
62
  <link rel="stylesheet" crossorigin href="/assets/styles-BbMJwyw_.css">
63
63
  <link rel="stylesheet" crossorigin href="/assets/main-CLwaKs4-.css">
64
64
  </head>
@@ -77,6 +77,7 @@
77
77
  const title = document.querySelector('[data-vuvodesk-static-boot-title]');
78
78
  const detail = document.querySelector('[data-vuvodesk-static-boot-detail]');
79
79
  const retry = document.querySelector('[data-vuvodesk-static-boot-retry]');
80
+ let recoveryStarted = false;
80
81
  const revealFailure = () => {
81
82
  if (!boot || !boot.isConnected) return;
82
83
  boot.setAttribute('aria-busy', 'false');
@@ -96,7 +97,12 @@
96
97
  }
97
98
  };
98
99
  const recoverEntryFailure = () => {
99
- if (!boot || !boot.isConnected) return;
100
+ if (recoveryStarted || !boot || !boot.isConnected) return;
101
+ recoveryStarted = true;
102
+ if (window.__vuvodeskStaticBootTimer !== undefined) {
103
+ window.clearTimeout(window.__vuvodeskStaticBootTimer);
104
+ delete window.__vuvodeskStaticBootTimer;
105
+ }
100
106
  const url = new URL(window.location.href);
101
107
  const alreadyRetried = url.searchParams.has('startup-retry')
102
108
  || url.searchParams.has('startup-refresh');
@@ -113,6 +119,7 @@
113
119
  window.stop();
114
120
  window.location.replace(url.toString());
115
121
  };
122
+ window.__vuvodeskStaticBootTimer = window.setTimeout(recoverEntryFailure, 15_000);
116
123
  window.addEventListener('error', event => {
117
124
  if (
118
125
  event.target instanceof HTMLScriptElement
package/web/dist/sw.js CHANGED
@@ -1,4 +1,4 @@
1
- const PWA_RELEASE = '0.1.650';
1
+ const PWA_RELEASE = '0.1.652';
2
2
  const OFFLINE_CACHE = `livedesk-pwa-offline-${PWA_RELEASE}`;
3
3
  const OFFLINE_URL = '/offline.html';
4
4
 
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
3
  "kind": "livedesk-production-web-source-evidence",
4
- "generatedAt": "2026-09-01T02:57:28.331Z",
5
- "pwaRelease": "0.1.650",
6
- "sourceHash": "8fa85101f445a7bbf10a148c7e63e2a2c35317c2783ad00cd039f3334940fcba",
4
+ "generatedAt": "2026-09-01T08:44:51.758Z",
5
+ "pwaRelease": "0.1.652",
6
+ "sourceHash": "0587fec4f7dfe25dd38ce38323a34331cff72d8540e25859043a94dee109bf6b",
7
7
  "sourceFileCount": 218,
8
- "sourceBytes": 2950322,
8
+ "sourceBytes": 2961719,
9
9
  "viteEnvironmentHash": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945",
10
- "outputHash": "ed9bbe33d101d0f3ab701e299023132f8241627243b47c6a33ee5f200cbb3bb6",
10
+ "outputHash": "a0541ff69afa6f89cecf01b1909fca5d8e1f635ae290593986fd9bffec925a35",
11
11
  "outputFileCount": 43,
12
- "outputBytes": 1889742,
12
+ "outputBytes": 1890496,
13
13
  "outputManifest": [
14
14
  {
15
15
  "path": "_headers",
@@ -18,13 +18,13 @@
18
18
  },
19
19
  {
20
20
  "path": "app.html",
21
- "bytes": 5906,
22
- "sha256": "1c370ca33968853ef0141449c374e6e33dd51bd84d7ed07d6f8891a57a07c72d"
21
+ "bytes": 6283,
22
+ "sha256": "12d0f7ef7ec7df4901b905db517b72f6321e637f635e14de743a37d547558dbd"
23
23
  },
24
24
  {
25
25
  "path": "app.webmanifest",
26
26
  "bytes": 841,
27
- "sha256": "b31ea45c2131feb77d76556760b1d1a86c61304415314bca1659443365d64df6"
27
+ "sha256": "67952872f14887d42d421346dad18eb811a19c28540a7ea6d67735ba105fe895"
28
28
  },
29
29
  {
30
30
  "path": "apple-touch-icon.png",
@@ -32,9 +32,14 @@
32
32
  "sha256": "0c8f7e411c993a1acaa1c41046b952cf412dbc5ff53b9d5a8fc17158ee1f0520"
33
33
  },
34
34
  {
35
- "path": "assets/AgentSettingsTab-1QVVyDM0.js",
35
+ "path": "assets/AgentSettingsTab-SlFWbGlY.js",
36
36
  "bytes": 4493,
37
- "sha256": "bad0ef0e1720689a661d6b4adfe320b07fa4964d192d27754825f1d77a6fddeb"
37
+ "sha256": "66143af142a01e47e6cfe913003088e53581e9f3d48654f4d6fb7713d993736d"
38
+ },
39
+ {
40
+ "path": "assets/AgentsPage-AoFB_KD4.js",
41
+ "bytes": 65689,
42
+ "sha256": "eb6c38d3af51040521e13ed0bfc6f9628d0a50dfbf96433cc5f2b1bdfe783015"
38
43
  },
39
44
  {
40
45
  "path": "assets/AgentsPage-D29gvPcH.css",
@@ -42,29 +47,24 @@
42
47
  "sha256": "fe349e23f92e35f98583c791185a73d99b3e9e263d2151b404e3937b0212a4aa"
43
48
  },
44
49
  {
45
- "path": "assets/AgentsPage-PXaoor6-.js",
46
- "bytes": 65689,
47
- "sha256": "0f45ddbdb3696718ac7063ad010a3cc6d58d08da9519db3764e6e3a7d5eeafce"
50
+ "path": "assets/App-DFLBNvIi.css",
51
+ "bytes": 22235,
52
+ "sha256": "2b6174a109112146b0f176b5d0068885bb7b2a9d832398884e49194d81ad5cad"
48
53
  },
49
54
  {
50
- "path": "assets/App-C0pLhnrj.js",
55
+ "path": "assets/App-smTkH_7F.js",
51
56
  "bytes": 515885,
52
- "sha256": "ed09ef4f7f73c28b900704f6d45ce1937cbd55086b2f0de213655fe18ea2412f"
57
+ "sha256": "58c91c264ebe6678d48425b43a0e62333cda1e9e7bd496cd63492253f87b8a47"
53
58
  },
54
59
  {
55
- "path": "assets/app-Cf4_lX6I.js",
60
+ "path": "assets/app-VTnPXosN.js",
56
61
  "bytes": 406,
57
- "sha256": "b1112b5f4803193e27355b3fabf2ee0e3c978da1d9ac8e2bee248acf21f44452"
58
- },
59
- {
60
- "path": "assets/App-DFLBNvIi.css",
61
- "bytes": 22235,
62
- "sha256": "2b6174a109112146b0f176b5d0068885bb7b2a9d832398884e49194d81ad5cad"
62
+ "sha256": "273a621251b2bb44ffac9ccefdd78244ac1c003f692128d28da11fd6eb4219e4"
63
63
  },
64
64
  {
65
- "path": "assets/CaptureGallery-RoIgqppm.js",
65
+ "path": "assets/CaptureGallery-bgLFx77c.js",
66
66
  "bytes": 2491,
67
- "sha256": "edcfde5bbbefee4882849ac9ecf5430bea9b06b50091a8ddc84e0416eff473a5"
67
+ "sha256": "6ed3c50205ddb0671f1c0535424e8edc38a011bbcad0844d838ccf553e9adabc"
68
68
  },
69
69
  {
70
70
  "path": "assets/desktop-auth-renderer-contract-CBeQI8Qu.js",
@@ -72,9 +72,9 @@
72
72
  "sha256": "49bb16009a16e6296627e1a30bae3c5eff22d59ab9b0fdb7d5938ce1cc16aabb"
73
73
  },
74
74
  {
75
- "path": "assets/DesktopUpdatePanel-CSORoxhi.js",
75
+ "path": "assets/DesktopUpdatePanel-BDIHhw5J.js",
76
76
  "bytes": 4387,
77
- "sha256": "c79946f7b55b0bb94cbe4aaa2138012f5d17d46d95afc8076dfd18e875a436df"
77
+ "sha256": "7a523ff0615453cccec4985f72a43e3796dcb347f0f8c9f39958fc4def0c38ef"
78
78
  },
79
79
  {
80
80
  "path": "assets/frame-lifecycle-esOdP-EY.js",
@@ -86,26 +86,16 @@
86
86
  "bytes": 34490,
87
87
  "sha256": "e95c67620eb3d7f0bbcbc563fe7f4e2bd18036558690b2de6502583cd666a45a"
88
88
  },
89
- {
90
- "path": "assets/LiveDeskApp-ao5vkK6F.css",
91
- "bytes": 26355,
92
- "sha256": "46b020c1806e59e07b454da8ab61ae111f5835f09b12f6df6364e94d146dbd56"
93
- },
94
- {
95
- "path": "assets/LiveDeskApp-BEyIPIAd.js",
96
- "bytes": 32525,
97
- "sha256": "44e76dce33df70319a4eb74d0bc5822934934d0105cf81f098c0f9bf67eaf9d0"
98
- },
99
- {
100
- "path": "assets/main-BBDlfRlO.js",
101
- "bytes": 36645,
102
- "sha256": "0597e02ddb41f7aab9b7b07c7a9acc64650ba6fe8e3e553ab7bd9941e274ce0e"
103
- },
104
89
  {
105
90
  "path": "assets/main-CLwaKs4-.css",
106
91
  "bytes": 30811,
107
92
  "sha256": "79594d3b1207b6999ede1360efd55ef03c4fd3f5ac2dceed986d0c1c3e3b1483"
108
93
  },
94
+ {
95
+ "path": "assets/main-DEpRH1th.js",
96
+ "bytes": 36645,
97
+ "sha256": "0d64cbe8bae4142ff09ddc61a2a0071548a1eeb89241c690de801128a32dc730"
98
+ },
109
99
  {
110
100
  "path": "assets/pwa-runtime-diagnostic-lane-CXJ3zl5c.js",
111
101
  "bytes": 6498,
@@ -122,14 +112,14 @@
122
112
  "sha256": "9ffcc619bc1785028bd28eaabd19c577d22228f06c0182500dec58a378fe17bc"
123
113
  },
124
114
  {
125
- "path": "assets/SettingsPage-56oq8v6l.js",
115
+ "path": "assets/SettingsPage-DLhQYnES.js",
126
116
  "bytes": 9684,
127
- "sha256": "4574243dda5c2d50fce0869861679f64b14620792c30593bf21f39fe726699c7"
117
+ "sha256": "f2e09b77384a32b2ec18df121182e78eb1654988b8e779286bf7005a7fff4492"
128
118
  },
129
119
  {
130
- "path": "assets/SettingsTabs-CZ388qM0.js",
120
+ "path": "assets/SettingsTabs-C1ovcXzw.js",
131
121
  "bytes": 217,
132
- "sha256": "48a265ffca9986e02ad308ea79612d51cdd7b668105d2c297a2e4bc5b634ee1b"
122
+ "sha256": "7b7e022cab04ebb55a01833171ec0fcb5faf80c3b35c77387a9d31210435561e"
133
123
  },
134
124
  {
135
125
  "path": "assets/ShareFilesPage-BCCMoGKE.css",
@@ -137,34 +127,44 @@
137
127
  "sha256": "8eed16509e17695b37a28790e25e12f8a00a50b8f5fcc11c5c68fae0687c9c98"
138
128
  },
139
129
  {
140
- "path": "assets/ShareFilesPage-CxsFwtMy.js",
130
+ "path": "assets/ShareFilesPage-rESjZP8s.js",
141
131
  "bytes": 188619,
142
- "sha256": "d6fe53f2ef0a268758efcc3446a66cc871f46b57ad6323b0fb04ea91e1740934"
143
- },
144
- {
145
- "path": "assets/styles-B5DEnner.js",
146
- "bytes": 237583,
147
- "sha256": "a4219c6f7507d1df5592869b97b81084466e1e44e5e3598f12c7184885c5c028"
132
+ "sha256": "537864b7ce6f8c771f52b1335e57beabb27bad5a9a3f4681526dfee21e370e8a"
148
133
  },
149
134
  {
150
135
  "path": "assets/styles-BbMJwyw_.css",
151
136
  "bytes": 126171,
152
137
  "sha256": "c32ab7aa101e49fda343978e383bca89f673c80d65366c252a1050917d28d0ec"
153
138
  },
139
+ {
140
+ "path": "assets/styles-CDIlHYlj.js",
141
+ "bytes": 237583,
142
+ "sha256": "4fd2cacfa10cf9c46540cd1447707e9e371ba340da7437f76c9455bfa48ad157"
143
+ },
154
144
  {
155
145
  "path": "assets/supabase-C7qjtLN3.js",
156
146
  "bytes": 210756,
157
147
  "sha256": "35040fe06fc7d7d25c730105638388ca6400835dac8caff268cf553d6639b886"
158
148
  },
149
+ {
150
+ "path": "assets/SupportPage-B90rx4D0.js",
151
+ "bytes": 30635,
152
+ "sha256": "bb86606bf4763803ab25adf1ff1eff986b6eed14926bdc88d17b0e8e03788021"
153
+ },
159
154
  {
160
155
  "path": "assets/SupportPage-Cxx61WwR.css",
161
156
  "bytes": 14643,
162
157
  "sha256": "59a383e6d7382973d103d21b4817bd53b124b9fa908c459bf5c418c9e4c88e82"
163
158
  },
164
159
  {
165
- "path": "assets/SupportPage-D5pCkJTU.js",
166
- "bytes": 30635,
167
- "sha256": "10f0016525fa001312a8f9d41858ae6d52f77ba680fbdfcebeebaf3b535275bf"
160
+ "path": "assets/VuvoDeskApp-ao5vkK6F.css",
161
+ "bytes": 26355,
162
+ "sha256": "46b020c1806e59e07b454da8ab61ae111f5835f09b12f6df6364e94d146dbd56"
163
+ },
164
+ {
165
+ "path": "assets/VuvoDeskApp-BM4kuSAh.js",
166
+ "bytes": 32525,
167
+ "sha256": "b619837255e58b92065d9078ae1e5eddc9f8d9d20e13ba5883cb52de045a2531"
168
168
  },
169
169
  {
170
170
  "path": "desktop-auth-callback.html",
@@ -188,8 +188,8 @@
188
188
  },
189
189
  {
190
190
  "path": "index.html",
191
- "bytes": 7038,
192
- "sha256": "4a8ddd8aaa61cb88ceeb4552bc618bd3c414b6c08b7a1e87652f616efd62d625"
191
+ "bytes": 7415,
192
+ "sha256": "fab2698f7ee867db4543f11bc306660de1bd280754187cc5b3a3517ff79af965"
193
193
  },
194
194
  {
195
195
  "path": "offline.html",
@@ -224,7 +224,7 @@
224
224
  {
225
225
  "path": "sw.js",
226
226
  "bytes": 1493,
227
- "sha256": "2d35306ef42c09f02ce8d5b1f5f6743874db2589c060bbde5ee60c15fa706cb1"
227
+ "sha256": "52b974534ea3bb126e576a4522bc4eb137399d7eb03a0fff74f4ce8607c98318"
228
228
  }
229
229
  ]
230
230
  }