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.
- package/README.md +1 -1
- package/bin/livedesk.js +13 -13
- package/bootstrap/client-process-identity.js +2 -2
- package/client/package.json +1 -1
- package/diagnostics/{livedesk-mac-physical-gate-core.mjs → vuvodesk-mac-physical-gate-core.mjs} +3 -3
- package/diagnostics/{livedesk-mode3-capture-smoke.mjs → vuvodesk-mode3-capture-smoke.mjs} +2 -2
- package/diagnostics/{livedesk-transport-physical.mjs → vuvodesk-transport-physical.mjs} +1 -1
- package/electron/before-pack.cjs +1 -1
- package/electron/electron-builder.e2e.yml +1 -1
- package/electron/electron-builder.linux-x64-dev.yml +1 -1
- package/electron/electron-builder.linux-x64.yml +3 -3
- package/electron/electron-builder.mac-arm64-dev.yml +1 -1
- package/electron/electron-builder.mac-arm64.yml +4 -4
- package/electron/electron-builder.mac-x64-dev.yml +1 -1
- package/electron/electron-builder.mac-x64.yml +4 -4
- package/electron/electron-builder.win-dev.yml +1 -1
- package/electron/electron-builder.win.yml +3 -3
- package/electron/electron-builder.yml +2 -2
- package/hub/package.json +1 -1
- package/hub/src/captures/capture-store.js +2 -2
- package/hub/src/console-direct.js +1 -0
- package/hub/src/console-direct.test.mjs +42 -0
- package/hub/src/server.js +2 -2
- package/hub/src/{live-desk-update.js → vuvodesk-update.js} +1 -1
- package/package.json +5 -3
- package/runtime-core/package.json +1 -1
- package/scripts/sync-web-dist.js +11 -11
- package/web/dist/app.html +11 -4
- package/web/dist/app.webmanifest +1 -1
- package/web/dist/assets/{AgentSettingsTab-1QVVyDM0.js → AgentSettingsTab-SlFWbGlY.js} +1 -1
- package/web/dist/assets/{AgentsPage-PXaoor6-.js → AgentsPage-AoFB_KD4.js} +1 -1
- package/web/dist/assets/{App-C0pLhnrj.js → App-smTkH_7F.js} +3 -3
- package/web/dist/assets/{CaptureGallery-RoIgqppm.js → CaptureGallery-bgLFx77c.js} +1 -1
- package/web/dist/assets/{DesktopUpdatePanel-CSORoxhi.js → DesktopUpdatePanel-BDIHhw5J.js} +1 -1
- package/web/dist/assets/{SettingsPage-56oq8v6l.js → SettingsPage-DLhQYnES.js} +1 -1
- package/web/dist/assets/{SettingsTabs-CZ388qM0.js → SettingsTabs-C1ovcXzw.js} +1 -1
- package/web/dist/assets/{ShareFilesPage-CxsFwtMy.js → ShareFilesPage-rESjZP8s.js} +1 -1
- package/web/dist/assets/{SupportPage-D5pCkJTU.js → SupportPage-B90rx4D0.js} +1 -1
- package/web/dist/assets/{LiveDeskApp-BEyIPIAd.js → VuvoDeskApp-BM4kuSAh.js} +1 -1
- package/web/dist/assets/{app-Cf4_lX6I.js → app-VTnPXosN.js} +1 -1
- package/web/dist/assets/{main-BBDlfRlO.js → main-DEpRH1th.js} +2 -2
- package/web/dist/assets/{styles-B5DEnner.js → styles-CDIlHYlj.js} +1 -1
- package/web/dist/index.html +10 -3
- package/web/dist/sw.js +1 -1
- package/web/dist/{livedesk-build-evidence.json → vuvodesk-build-evidence.json} +59 -59
- /package/diagnostics/{livedesk-mac-physical-isolation.mjs → vuvodesk-mac-physical-isolation.mjs} +0 -0
- /package/diagnostics/{livedesk-transport-physical-core.mjs → vuvodesk-transport-physical-core.mjs} +0 -0
- /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};
|
package/web/dist/index.html
CHANGED
|
@@ -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-
|
|
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-
|
|
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,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
3
|
"kind": "livedesk-production-web-source-evidence",
|
|
4
|
-
"generatedAt": "2026-09-
|
|
5
|
-
"pwaRelease": "0.1.
|
|
6
|
-
"sourceHash": "
|
|
4
|
+
"generatedAt": "2026-09-01T08:44:51.758Z",
|
|
5
|
+
"pwaRelease": "0.1.652",
|
|
6
|
+
"sourceHash": "0587fec4f7dfe25dd38ce38323a34331cff72d8540e25859043a94dee109bf6b",
|
|
7
7
|
"sourceFileCount": 218,
|
|
8
|
-
"sourceBytes":
|
|
8
|
+
"sourceBytes": 2961719,
|
|
9
9
|
"viteEnvironmentHash": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945",
|
|
10
|
-
"outputHash": "
|
|
10
|
+
"outputHash": "a0541ff69afa6f89cecf01b1909fca5d8e1f635ae290593986fd9bffec925a35",
|
|
11
11
|
"outputFileCount": 43,
|
|
12
|
-
"outputBytes":
|
|
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":
|
|
22
|
-
"sha256": "
|
|
21
|
+
"bytes": 6283,
|
|
22
|
+
"sha256": "12d0f7ef7ec7df4901b905db517b72f6321e637f635e14de743a37d547558dbd"
|
|
23
23
|
},
|
|
24
24
|
{
|
|
25
25
|
"path": "app.webmanifest",
|
|
26
26
|
"bytes": 841,
|
|
27
|
-
"sha256": "
|
|
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-
|
|
35
|
+
"path": "assets/AgentSettingsTab-SlFWbGlY.js",
|
|
36
36
|
"bytes": 4493,
|
|
37
|
-
"sha256": "
|
|
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/
|
|
46
|
-
"bytes":
|
|
47
|
-
"sha256": "
|
|
50
|
+
"path": "assets/App-DFLBNvIi.css",
|
|
51
|
+
"bytes": 22235,
|
|
52
|
+
"sha256": "2b6174a109112146b0f176b5d0068885bb7b2a9d832398884e49194d81ad5cad"
|
|
48
53
|
},
|
|
49
54
|
{
|
|
50
|
-
"path": "assets/App-
|
|
55
|
+
"path": "assets/App-smTkH_7F.js",
|
|
51
56
|
"bytes": 515885,
|
|
52
|
-
"sha256": "
|
|
57
|
+
"sha256": "58c91c264ebe6678d48425b43a0e62333cda1e9e7bd496cd63492253f87b8a47"
|
|
53
58
|
},
|
|
54
59
|
{
|
|
55
|
-
"path": "assets/app-
|
|
60
|
+
"path": "assets/app-VTnPXosN.js",
|
|
56
61
|
"bytes": 406,
|
|
57
|
-
"sha256": "
|
|
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-
|
|
65
|
+
"path": "assets/CaptureGallery-bgLFx77c.js",
|
|
66
66
|
"bytes": 2491,
|
|
67
|
-
"sha256": "
|
|
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-
|
|
75
|
+
"path": "assets/DesktopUpdatePanel-BDIHhw5J.js",
|
|
76
76
|
"bytes": 4387,
|
|
77
|
-
"sha256": "
|
|
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-
|
|
115
|
+
"path": "assets/SettingsPage-DLhQYnES.js",
|
|
126
116
|
"bytes": 9684,
|
|
127
|
-
"sha256": "
|
|
117
|
+
"sha256": "f2e09b77384a32b2ec18df121182e78eb1654988b8e779286bf7005a7fff4492"
|
|
128
118
|
},
|
|
129
119
|
{
|
|
130
|
-
"path": "assets/SettingsTabs-
|
|
120
|
+
"path": "assets/SettingsTabs-C1ovcXzw.js",
|
|
131
121
|
"bytes": 217,
|
|
132
|
-
"sha256": "
|
|
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-
|
|
130
|
+
"path": "assets/ShareFilesPage-rESjZP8s.js",
|
|
141
131
|
"bytes": 188619,
|
|
142
|
-
"sha256": "
|
|
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/
|
|
166
|
-
"bytes":
|
|
167
|
-
"sha256": "
|
|
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":
|
|
192
|
-
"sha256": "
|
|
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": "
|
|
227
|
+
"sha256": "52b974534ea3bb126e576a4522bc4eb137399d7eb03a0fff74f4ce8607c98318"
|
|
228
228
|
}
|
|
229
229
|
]
|
|
230
230
|
}
|
/package/diagnostics/{livedesk-mac-physical-isolation.mjs → vuvodesk-mac-physical-isolation.mjs}
RENAMED
|
File without changes
|
/package/diagnostics/{livedesk-transport-physical-core.mjs → vuvodesk-transport-physical-core.mjs}
RENAMED
|
File without changes
|
|
File without changes
|