@tiflis-io/tiflis-code-web 0.1.5 → 0.1.6
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.
|
@@ -327,7 +327,7 @@ a=extmap-allow-mixed`)!==-1){const u=o.sdp.split(`
|
|
|
327
327
|
*
|
|
328
328
|
* This source code is licensed under the ISC license.
|
|
329
329
|
* See the LICENSE file in the root directory of this source tree.
|
|
330
|
-
*/const Wg=qe("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);function Wl(e){return(...r)=>{}}const ze={log:Wl(),info:Wl(),warn:Wl(),error:Wl(),debug:Wl()},on={audio:(...e)=>ze.log("🔊",...e),voice:(...e)=>ze.log("🎤",...e),ws:(...e)=>ze.log("🔌",...e),message:(...e)=>ze.log("💬",...e),session:(...e)=>ze.log("📋",...e),auth:(...e)=>ze.log("🔐",...e)};function tk({onScan:e,onBack:r}){const[n,s]=R.useState(null),[o,u]=R.useState(null),f=R.useCallback(c=>{if(c.length>0){const h=c[0];h!=null&&h.rawValue&&e(h.rawValue)}},[e]),l=R.useCallback(c=>{ze.error("QR Scanner error:",c),c instanceof Error?c.name==="NotAllowedError"?(u(!1),s("Camera access denied. Please allow camera access in your browser settings.")):c.name==="NotFoundError"?s("No camera found on this device."):s(c.message):s("Failed to access camera")},[]);return b.jsxs("div",{className:"space-y-4",children:[b.jsxs("div",{className:"aspect-square bg-muted rounded-lg overflow-hidden relative",children:[o===!1?b.jsxs("div",{className:"absolute inset-0 flex flex-col items-center justify-center p-4 text-center",children:[b.jsx(IM,{className:"w-12 h-12 text-muted-foreground mb-4"}),b.jsx("p",{className:"text-sm text-muted-foreground",children:n})]}):n?b.jsxs("div",{className:"absolute inset-0 flex flex-col items-center justify-center p-4 text-center",children:[b.jsx(PM,{className:"w-12 h-12 text-muted-foreground mb-4"}),b.jsx("p",{className:"text-sm text-destructive",children:n})]}):b.jsx(RM,{onScan:f,onError:l,constraints:{facingMode:"environment"},styles:{container:{width:"100%",height:"100%"},video:{width:"100%",height:"100%",objectFit:"cover"}},components:{finder:!0}}),!n&&o!==!1&&b.jsxs("div",{className:"absolute inset-0 pointer-events-none",children:[b.jsx("div",{className:"absolute inset-8 border-2 border-primary rounded-lg opacity-50"}),b.jsxs("div",{className:"absolute inset-8 animate-pulse",children:[b.jsx("div",{className:"absolute top-0 left-0 w-8 h-8 border-t-4 border-l-4 border-primary rounded-tl-lg"}),b.jsx("div",{className:"absolute top-0 right-0 w-8 h-8 border-t-4 border-r-4 border-primary rounded-tr-lg"}),b.jsx("div",{className:"absolute bottom-0 left-0 w-8 h-8 border-b-4 border-l-4 border-primary rounded-bl-lg"}),b.jsx("div",{className:"absolute bottom-0 right-0 w-8 h-8 border-b-4 border-r-4 border-primary rounded-br-lg"})]})]})]}),b.jsx("p",{className:"text-sm text-center text-muted-foreground",children:"Point your camera at the QR code shown in your workstation terminal"}),b.jsxs(dt,{variant:"outline",className:"w-full",onClick:r,children:[b.jsx(OM,{className:"w-4 h-4"}),"Back to Magic Link"]})]})}const _S={supervisorMessages:[],agentMessages:{},supervisorIsLoading:!1,agentIsLoading:{},historyPaginationState:{},supervisorStreamingMessageId:null,agentStreamingMessageIds:{},pendingMessageAcks:new Set},ut=Ug(e=>({..._S,addSupervisorMessage:r=>e(n=>n.supervisorMessages.some(s=>s.id===r.id)?(console.debug("[ChatStore] Skipping duplicate supervisor message:",r.id),n):{supervisorMessages:[...n.supervisorMessages,r]}),updateSupervisorMessage:(r,n)=>e(s=>({supervisorMessages:s.supervisorMessages.map(o=>o.id===r?{...o,...n}:o)})),updateSupervisorStreamingBlocks:(r,n)=>e(s=>({supervisorMessages:s.supervisorMessages.map(o=>o.id===r?{...o,contentBlocks:n}:o)})),setSupervisorIsLoading:r=>e({supervisorIsLoading:r}),setSupervisorStreamingMessageId:r=>e({supervisorStreamingMessageId:r}),clearSupervisorMessages:()=>e({supervisorMessages:[]}),addAgentMessage:(r,n)=>e(s=>{const o=s.agentMessages[r]??[];return o.some(u=>u.id===n.id)?(console.debug("[ChatStore] Skipping duplicate agent message:",n.id,"session:",r),s):{agentMessages:{...s.agentMessages,[r]:[...o,n]}}}),updateAgentMessage:(r,n,s)=>e(o=>({agentMessages:{...o.agentMessages,[r]:(o.agentMessages[r]??[]).map(u=>u.id===n?{...u,...s}:u)}})),updateAgentStreamingBlocks:(r,n,s)=>e(o=>({agentMessages:{...o.agentMessages,[r]:(o.agentMessages[r]??[]).map(u=>u.id===n?{...u,contentBlocks:s}:u)}})),setAgentIsLoading:(r,n)=>e(s=>({agentIsLoading:{...s.agentIsLoading,[r]:n}})),setAgentStreamingMessageId:(r,n)=>e(s=>({agentStreamingMessageIds:{...s.agentStreamingMessageIds,[r]:n??""}})),clearAgentMessages:r=>e(n=>({agentMessages:{...n.agentMessages,[r]:[]}})),setMessageSendStatus:(r,n)=>e(s=>{if(s.supervisorMessages.find(f=>f.id===r))return{supervisorMessages:s.supervisorMessages.map(f=>f.id===r?{...f,sendStatus:n}:f)};const u={...s.agentMessages};for(const f in u){const l=u[f];if(l&&l.findIndex(h=>h.id===r)!==-1)return u[f]=l.map(h=>h.id===r?{...h,sendStatus:n}:h),{agentMessages:u}}return{}}),addPendingAck:r=>e(n=>({pendingMessageAcks:new Set([...n.pendingMessageAcks,r])})),removePendingAck:r=>e(n=>{const s=new Set(n.pendingMessageAcks);return s.delete(r),{pendingMessageAcks:s}}),setHistoryPaginationState:(r,n)=>e(s=>({historyPaginationState:{...s.historyPaginationState,[r]:n}})),prependSupervisorMessages:r=>e(n=>{const s=new Set(n.supervisorMessages.map(u=>u.id)),o=r.filter(u=>!s.has(u.id));return o.length<r.length&&console.debug("[ChatStore] Filtered",r.length-o.length,"duplicate supervisor messages during prepend"),{supervisorMessages:[...o,...n.supervisorMessages]}}),prependAgentMessages:(r,n)=>e(s=>{const o=s.agentMessages[r]??[],u=new Set(o.map(l=>l.id)),f=n.filter(l=>!u.has(l.id));return f.length<n.length&&console.debug("[ChatStore] Filtered",n.length-f.length,"duplicate agent messages during prepend for session:",r),{agentMessages:{...s.agentMessages,[r]:[...f,...o]}}}),reset:()=>e(_S)})),rk=5e3,nk=1e4,ik=1e4,sk=5e3,ok=500,ak=5e3,dh=class dh{constructor(){_e(this,"ws",null);_e(this,"credentials",null);_e(this,"callbacks",null);_e(this,"pingInterval",null);_e(this,"heartbeatInterval",null);_e(this,"pongTimeout",null);_e(this,"heartbeatTimeout",null);_e(this,"reconnectTimeout",null);_e(this,"reconnectAttempts",0);_e(this,"isConnecting",!1);_e(this,"isAuthenticated",!1);_e(this,"intentionalDisconnect",!1);_e(this,"pendingRequests",new Map)}init(r){this.callbacks=r}async connect(r){var n,s,o;if(!(this.isConnecting||((n=this.ws)==null?void 0:n.readyState)===WebSocket.OPEN)){this.credentials=r,this.intentionalDisconnect=!1,this.isConnecting=!0,(s=this.callbacks)==null||s.onConnectionStateChange("connecting");try{await this.establishConnection()}catch(u){throw this.isConnecting=!1,(o=this.callbacks)==null||o.onConnectionStateChange("error"),u}}}disconnect(){var r;this.intentionalDisconnect=!0,this.cleanup(),(r=this.callbacks)==null||r.onConnectionStateChange("disconnected")}async sendRequest(r){return new Promise((n,s)=>{if(!this.ws||this.ws.readyState!==WebSocket.OPEN){s(new Error("WebSocket not connected"));return}this.pendingRequests.size>=dh.MAX_PENDING_REQUESTS&&this.cleanupStaleRequests();const o=setTimeout(()=>{this.pendingRequests.delete(r.id),s(new Error("Request timeout"))},3e4);this.pendingRequests.set(r.id,{resolve:u=>{clearTimeout(o),n(u)},reject:u=>{clearTimeout(o),s(u)},timestamp:Date.now()}),this.send(r)})}send(r){var n;((n=this.ws)==null?void 0:n.readyState)===WebSocket.OPEN&&this.ws.send(JSON.stringify(r))}isConnected(){var r;return((r=this.ws)==null?void 0:r.readyState)===WebSocket.OPEN&&this.isAuthenticated}reconnect(){this.credentials&&!this.isConnecting&&(this.intentionalDisconnect=!1,this.reconnectAttempts=0,this.cleanup(),this.connect(this.credentials).catch(r=>{ze.error("Manual reconnection failed:",r)}))}getReconnectAttempts(){return this.reconnectAttempts}async establishConnection(){return new Promise((r,n)=>{if(!this.credentials){n(new Error("No credentials"));return}try{this.ws=new WebSocket(this.credentials.tunnelUrl)}catch(o){n(o);return}const s=setTimeout(()=>{var o;(o=this.ws)==null||o.close(),n(new Error("Connection timeout"))},3e4);this.ws.onopen=()=>{var o;clearTimeout(s),(o=this.callbacks)==null||o.onConnectionStateChange("connected"),this.sendConnectMessage()},this.ws.onclose=o=>{clearTimeout(s),this.handleClose(o),this.isAuthenticated||n(new Error("Connection closed before authentication"))},this.ws.onerror=o=>{var u;clearTimeout(s),ze.error("WebSocket error:",o),(u=this.callbacks)==null||u.onConnectionStateChange("error")},this.ws.onmessage=o=>{try{const u=JSON.parse(o.data);this.handleMessage(u,r,n)}catch(u){ze.error("Failed to parse message:",u)}}})}sendConnectMessage(){var n;if(!this.credentials)return;const r={type:"connect",payload:{tunnel_id:this.credentials.tunnelId,auth_key:this.credentials.authKey,device_id:this.credentials.deviceId,reconnect:this.reconnectAttempts>0}};this.send(r),(n=this.callbacks)==null||n.onConnectionStateChange("authenticating")}sendAuthMessage(){if(!this.credentials)return;const r={type:"auth",payload:{auth_key:this.credentials.authKey,device_id:this.credentials.deviceId}};this.send(r)}handleMessage(r,n,s){var o,u,f,l,c,h;if(r.id&&this.pendingRequests.has(r.id)){const m=this.pendingRequests.get(r.id);if(this.pendingRequests.delete(r.id),r.type==="error"){const p=r.payload;m==null||m.reject(new Error(`${p.code}: ${p.message}`))}else m==null||m.resolve(r);return}switch(r.type){case"connected":this.sendAuthMessage();break;case"auth.success":this.isConnecting=!1,this.isAuthenticated=!0,this.reconnectAttempts=0,(o=this.callbacks)==null||o.onConnectionStateChange("authenticated"),this.startHeartbeat(),this.requestSync(),(u=this.callbacks)==null||u.onMessage(r),n==null||n();break;case"auth.error":{this.isConnecting=!1,(f=this.callbacks)==null||f.onConnectionStateChange("error");const m=r.payload;s==null||s(new Error(`Auth failed: ${m.message}`));break}case"pong":this.handlePong();break;case"heartbeat.ack":this.handleHeartbeatAck();break;case"connection.workstation_online":(l=this.callbacks)==null||l.onWorkstationOnline();break;case"connection.workstation_offline":(c=this.callbacks)==null||c.onWorkstationOffline();break;default:(h=this.callbacks)==null||h.onMessage(r)}}startHeartbeat(){this.stopHeartbeat(),this.pingInterval=setInterval(()=>{this.sendPing()},rk),this.heartbeatInterval=setInterval(()=>{this.sendHeartbeat()},ik),this.sendHeartbeat()}stopHeartbeat(){this.pingInterval&&(clearInterval(this.pingInterval),this.pingInterval=null),this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null),this.pongTimeout&&(clearTimeout(this.pongTimeout),this.pongTimeout=null),this.heartbeatTimeout&&(clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=null)}sendPing(){this.send({type:"ping",timestamp:Date.now()}),this.pongTimeout=setTimeout(()=>{var r;ze.warn("Pong timeout - connection may be stale"),(r=this.callbacks)==null||r.onConnectionStateChange("degraded")},nk)}handlePong(){this.pongTimeout&&(clearTimeout(this.pongTimeout),this.pongTimeout=null)}sendHeartbeat(){const r={type:"heartbeat",id:crypto.randomUUID(),timestamp:Date.now()};this.send(r),this.heartbeatTimeout=setTimeout(()=>{var n;ze.warn("Heartbeat timeout - connection may be stale"),(n=this.callbacks)==null||n.onConnectionStateChange("degraded")},sk)}handleHeartbeatAck(){var r;this.heartbeatTimeout&&(clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=null),(r=this.callbacks)==null||r.onConnectionStateChange("verified")}requestSync(){const r={type:"sync",id:crypto.randomUUID(),lightweight:this.reconnectAttempts>0};this.send(r)}handleClose(r){var n,s;if(this.cleanup(),this.intentionalDisconnect){(n=this.callbacks)==null||n.onConnectionStateChange("disconnected");return}on.ws("WebSocket closed:",r.code,r.reason),(s=this.callbacks)==null||s.onConnectionStateChange("disconnected"),this.scheduleReconnect()}scheduleReconnect(){if(this.intentionalDisconnect||!this.credentials)return;const r=Math.min(ok*Math.pow(2,this.reconnectAttempts),ak);this.reconnectAttempts++,on.ws(`Reconnecting in ${r}ms (attempt ${this.reconnectAttempts})`),this.reconnectTimeout=setTimeout(()=>{this.credentials&&!this.intentionalDisconnect&&this.connect(this.credentials).catch(n=>{ze.error("Reconnection failed:",n)})},r)}cleanupStaleRequests(){const r=Date.now(),n=6e4;for(const[s,o]of this.pendingRequests)r-o.timestamp>n&&(o.reject(new Error("Request expired")),this.pendingRequests.delete(s))}cleanup(){this.stopHeartbeat(),this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=null),this.ws&&(this.ws.onopen=null,this.ws.onclose=null,this.ws.onerror=null,this.ws.onmessage=null,(this.ws.readyState===WebSocket.OPEN||this.ws.readyState===WebSocket.CONNECTING)&&this.ws.close(1e3,"Client disconnect"),this.ws=null),this.isConnecting=!1,this.isAuthenticated=!1;for(const[r,n]of this.pendingRequests)n.reject(new Error("Connection closed")),this.pendingRequests.delete(r)}};_e(dh,"MAX_PENDING_REQUESTS",100);let rg=dh;const Mt=new rg;function lk(e,r){let n;try{n=e()}catch{return}return{getItem:o=>{var u;const f=c=>c===null?null:JSON.parse(c,void 0),l=(u=n.getItem(o))!=null?u:null;return l instanceof Promise?l.then(f):f(l)},setItem:(o,u)=>n.setItem(o,JSON.stringify(u,void 0)),removeItem:o=>n.removeItem(o)}}const ng=e=>r=>{try{const n=e(r);return n instanceof Promise?n:{then(s){return ng(s)(n)},catch(s){return this}}}catch(n){return{then(s){return this},catch(s){return ng(s)(n)}}}},ck=(e,r)=>(n,s,o)=>{let u={storage:lk(()=>localStorage),partialize:w=>w,version:0,merge:(w,v)=>({...v,...w}),...r},f=!1;const l=new Set,c=new Set;let h=u.storage;if(!h)return e((...w)=>{console.warn(`[zustand persist middleware] Unable to update item '${u.name}', the given storage is currently unavailable.`),n(...w)},s,o);const m=()=>{const w=u.partialize({...s()});return h.setItem(u.name,{state:w,version:u.version})},p=o.setState;o.setState=(w,v)=>(p(w,v),m());const y=e((...w)=>(n(...w),m()),s,o);o.getInitialState=()=>y;let x;const A=()=>{var w,v;if(!h)return;f=!1,l.forEach(g=>{var _;return g((_=s())!=null?_:y)});const S=((v=u.onRehydrateStorage)==null?void 0:v.call(u,(w=s())!=null?w:y))||void 0;return ng(h.getItem.bind(h))(u.name).then(g=>{if(g)if(typeof g.version=="number"&&g.version!==u.version){if(u.migrate){const _=u.migrate(g.state,g.version);return _ instanceof Promise?_.then(T=>[!0,T]):[!0,_]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return[!1,g.state];return[!1,void 0]}).then(g=>{var _;const[T,M]=g;if(x=u.merge(M,(_=s())!=null?_:y),n(x,!0),T)return m()}).then(()=>{S==null||S(x,void 0),x=s(),f=!0,c.forEach(g=>g(x))}).catch(g=>{S==null||S(void 0,g)})};return o.persist={setOptions:w=>{u={...u,...w},w.storage&&(h=w.storage)},clearStorage:()=>{h==null||h.removeItem(u.name)},getOptions:()=>u,rehydrate:()=>A(),hasHydrated:()=>f,onHydrate:w=>(l.add(w),()=>{l.delete(w)}),onFinishHydration:w=>(c.add(w),()=>{c.delete(w)})},u.skipHydration||A(),x||y},uk=ck,a1=200,l1=480,dk=320,hk=64,yS={ttsEnabled:!0,sttLanguage:"en",sidebarCollapsed:!1,sidebarWidth:dk},Pn=Ug()(uk(e=>({...yS,setTtsEnabled:r=>e({ttsEnabled:r}),setSttLanguage:r=>e({sttLanguage:r}),setSidebarCollapsed:r=>e({sidebarCollapsed:r}),setSidebarWidth:r=>e({sidebarWidth:Math.max(a1,Math.min(l1,r))}),toggleSidebar:()=>e(r=>({sidebarCollapsed:!r.sidebarCollapsed})),reset:()=>e(yS)}),{name:"tiflis-settings"})),fk="audio/wav";class pk{constructor(){_e(this,"audioCache",new Map);_e(this,"currentMessageId",null);_e(this,"isCurrentlyLoading",!1);_e(this,"CACHE_DURATION_MS",900*1e3);_e(this,"MAX_CACHE_SIZE",50);_e(this,"sharedAudio");_e(this,"audioContext",null);_e(this,"isUnlocked",!1);_e(this,"pendingAutoPlay",null);_e(this,"listeners",new Set);_e(this,"animationFrameId",null);this.sharedAudio=new Audio,this.sharedAudio.preload="auto",this.setupSharedAudioListeners(),this.setupAudioUnlock()}setupSharedAudioListeners(){this.sharedAudio.addEventListener("play",()=>{this.startProgressTracking(),this.notifyListeners()}),this.sharedAudio.addEventListener("pause",()=>{this.stopProgressTracking(),this.notifyListeners()}),this.sharedAudio.addEventListener("ended",()=>{this.stopProgressTracking(),this.sharedAudio.currentTime=0,this.notifyListeners()}),this.sharedAudio.addEventListener("loadedmetadata",()=>{this.isCurrentlyLoading=!1,this.notifyListeners()}),this.sharedAudio.addEventListener("canplay",()=>{this.isCurrentlyLoading=!1,this.notifyListeners()}),this.sharedAudio.addEventListener("error",()=>{this.isCurrentlyLoading=!1,this.notifyListeners("Failed to load audio")})}subscribe(r){return this.listeners.add(r),r(this.getState()),()=>{this.listeners.delete(r)}}getState(){return{messageId:this.currentMessageId,isPlaying:!this.sharedAudio.paused,isLoading:this.isCurrentlyLoading,currentTime:this.sharedAudio.currentTime,duration:isNaN(this.sharedAudio.duration)?0:this.sharedAudio.duration,error:null}}notifyListeners(r){const n={...this.getState(),error:r??null};this.listeners.forEach(s=>s(n))}startProgressTracking(){if(this.animationFrameId!==null)return;const r=()=>{this.notifyListeners(),this.sharedAudio.paused?this.animationFrameId=null:this.animationFrameId=requestAnimationFrame(r)};this.animationFrameId=requestAnimationFrame(r)}stopProgressTracking(){this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null)}getAudioContext(){return this.audioContext||(this.audioContext=new(window.AudioContext||window.webkitAudioContext)),this.audioContext}setupAudioUnlock(){const r=async()=>{if(!this.isUnlocked)try{const n=this.getAudioContext();n.state==="suspended"&&await n.resume(),this.sharedAudio.src="data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA",this.sharedAudio.volume=.01;try{await this.sharedAudio.play(),this.sharedAudio.pause(),this.sharedAudio.currentTime=0,this.sharedAudio.volume=1}catch{}if(this.isUnlocked=!0,ze.log("Audio unlocked via user interaction"),this.pendingAutoPlay){const{base64Audio:s,messageId:o}=this.pendingAutoPlay;this.pendingAutoPlay=null,setTimeout(()=>{this.playAudio(s,o,!0)},50)}document.removeEventListener("touchstart",r),document.removeEventListener("touchend",r),document.removeEventListener("click",r),document.removeEventListener("keydown",r)}catch(n){ze.warn("Audio unlock failed, will retry:",n)}};document.addEventListener("touchstart",r,{once:!1,passive:!0}),document.addEventListener("touchend",r,{once:!1,passive:!0}),document.addEventListener("click",r,{once:!1,passive:!0}),document.addEventListener("keydown",r,{once:!1,passive:!0})}isAudioUnlocked(){return this.isUnlocked}async unlockIfNeeded(){if(!this.isUnlocked)try{const r=this.getAudioContext();if(r.state==="suspended"&&await r.resume(),this.sharedAudio.src="data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA",this.sharedAudio.volume=.01,await this.sharedAudio.play(),this.sharedAudio.pause(),this.sharedAudio.currentTime=0,this.sharedAudio.volume=1,this.isUnlocked=!0,ze.log("Audio manually unlocked"),this.pendingAutoPlay){const{base64Audio:n,messageId:s}=this.pendingAutoPlay;this.pendingAutoPlay=null,this.playAudio(n,s,!0)}}catch(r){ze.warn("Manual audio unlock failed:",r),this.isUnlocked=!0}}isMobileDevice(){return/iPhone|iPad|iPod|Android/i.test(navigator.userAgent)}playAudio(r,n,s){if(ze.log(`playAudio: messageId=${n}, autoPlay=${s}, isUnlocked=${this.isUnlocked}, isMobile=${this.isMobileDevice()}`),this.cacheAudio(r,n),s&&!this.isUnlocked&&this.isMobileDevice()){ze.log("Mobile: Audio not unlocked yet, queuing for auto-play"),this.pendingAutoPlay={base64Audio:r,messageId:n};return}this.stop(),this.currentMessageId=n,this.isCurrentlyLoading=!0,this.notifyListeners(),this.sharedAudio.src=`data:${fk};base64,${r}`,s?this.sharedAudio.play().then(()=>{this.isUnlocked=!0}).catch(o=>{o.name==="NotAllowedError"?(ze.log("Auto-play blocked by browser policy, user can play manually"),this.isMobileDevice()&&(this.pendingAutoPlay={base64Audio:r,messageId:n})):ze.warn("Play failed:",o.name,o.message),this.isCurrentlyLoading=!1,this.notifyListeners()}):this.sharedAudio.load()}cacheAudio(r,n){if(this.audioCache.has(n))return;this.audioCache.size>=this.MAX_CACHE_SIZE&&this.evictLRU();const s=Date.now();this.audioCache.set(n,{base64:r,expiresAt:s+this.CACHE_DURATION_MS,accessedAt:s}),this.cleanupCache()}playByMessageId(r){const n=this.audioCache.get(r);return n&&Date.now()<n.expiresAt?(n.accessedAt=Date.now(),this.playAudio(n.base64,r,!0),!0):!1}togglePlay(){this.sharedAudio.paused?this.sharedAudio.play().catch(r=>{ze.warn("Toggle play failed:",r)}):this.sharedAudio.pause()}seek(r){this.sharedAudio.duration&&(this.sharedAudio.currentTime=r*this.sharedAudio.duration,this.notifyListeners())}seekToTime(r){this.sharedAudio.currentTime=r,this.notifyListeners()}resetToStart(){this.sharedAudio.currentTime=0,this.notifyListeners()}getAudioBase64(r){const n=this.audioCache.get(r);return n&&Date.now()<n.expiresAt?n.base64:null}getAudio(r){return this.currentMessageId===r?this.sharedAudio:this.hasAudio(r)?this.sharedAudio:null}hasAudio(r){const n=this.audioCache.get(r);return n!==void 0&&Date.now()<n.expiresAt}registerAudio(r,n){n&&(this.currentMessageId=n),this.notifyListeners()}unregisterAudio(r){}stop(){this.stopProgressTracking(),this.sharedAudio.pause(),this.sharedAudio.currentTime=0,this.currentMessageId=null,this.isCurrentlyLoading=!1,this.notifyListeners()}stopAll(){this.stop()}isPlaying(){return!this.sharedAudio.paused}getCurrentMessageId(){return this.currentMessageId}cleanupCache(){const r=Date.now();for(const[n,s]of this.audioCache.entries())r>=s.expiresAt&&this.audioCache.delete(n)}evictLRU(){let r=null,n=1/0;for(const[s,o]of this.audioCache.entries())o.accessedAt<n&&(n=o.accessedAt,r=s);r&&this.audioCache.delete(r)}}const It=new pk;function _i(e){const r=e.filter(n=>n.block_type==="voice_output"||n.block_type==="voice_input");return r.length>0&&on.audio("parseContentBlocks - voice blocks from server:",r),e.map(n=>({id:n.id,blockType:n.block_type,content:n.content,metadata:n.metadata?{language:n.metadata.language,toolName:n.metadata.tool_name,toolUseId:n.metadata.tool_use_id,toolInput:n.metadata.tool_input,toolOutput:n.metadata.tool_output,toolStatus:n.metadata.tool_status,audioUrl:n.metadata.audio_url,audioBase64:n.metadata.audio_base64,messageId:n.metadata.message_id,duration:n.metadata.duration,hasAudio:n.metadata.has_audio,errorCode:n.metadata.error_code}:void 0}))}const ma={supervisorInProgress:!1,agentSessionsInProgress:new Set,pendingUpdates:new Map,isHistoryLoadingForSession(e){return e==="supervisor"?this.supervisorInProgress:this.agentSessionsInProgress.has(e)},markHistoryLoadStart(e){e==="supervisor"?this.supervisorInProgress=!0:this.agentSessionsInProgress.add(e)},markHistoryLoadEnd(e){e==="supervisor"?this.supervisorInProgress=!1:this.agentSessionsInProgress.delete(e),this.processPendingUpdates(e)},queueUpdate(e,r){const n=this.pendingUpdates.get(e)??[];n.push(r),this.pendingUpdates.set(e,n)},processPendingUpdates(e){const r=this.pendingUpdates.get(e)??[];this.pendingUpdates.delete(e);for(const n of r)try{n()}catch(s){ze.error({error:s,sessionKey:e},"Error processing pending update")}}},c1={lastSupervisorSequence:0,lastAgentSequences:new Map,checkSupervisorSequence(e){e!==void 0&&(e>this.lastSupervisorSequence+1&&ze.warn({expected:this.lastSupervisorSequence+1,received:e},"Detected supervisor message gap - messages may have been lost"),this.lastSupervisorSequence=e)},checkAgentSequence(e,r){if(r!==void 0){const n=this.lastAgentSequences.get(e)??0;r>n+1&&ze.warn({sessionId:e,expected:n+1,received:r},"Detected agent message gap - messages may have been lost"),this.lastAgentSequences.set(e,r)}}};function mk(e){const r=e;switch(r.type){case"auth.success":gk(r);break;case"sync.state":vk(r);break;case"history.response":_k(r);break;case"session.created":yk(r);break;case"session.terminated":bk(r);break;case"session.subscribed":Sk(r);break;case"supervisor.output":u1(r);break;case"supervisor.user_message":Ck(r);break;case"supervisor.context_cleared":wk();break;case"session.output":d1(r);break;case"session.replay.data":xk(r);break;case"session.user_message":Ek(r);break;case"message.ack":Ak(r);break;case"supervisor.voice_output":Tk(r);break;case"session.voice_output":Rk(r);break;case"supervisor.transcription":Dk(r);break;case"session.transcription":Mk(r);break;case"response":break;case"error":ze.error("Server error:",r.payload);break;default:ze.log("Unhandled message type:",r.type)}}function gk(e){Ve.getState().setWorkstationInfo({name:e.payload.workstation_name??"Unknown",version:e.payload.workstation_version??"",protocolVersion:e.payload.protocol_version??"",workspacesRoot:e.payload.workspaces_root??""})}function vk(e){const r=Ve.getState(),n=ut.getState(),s=e.payload.sessions.map(o=>({id:o.session_id,type:o.session_type,status:o.status,agentName:o.agent_name,workspace:o.workspace,project:o.project,worktree:o.worktree,workingDir:o.working_dir,createdAt:o.created_at?new Date(o.created_at):new Date}));if(r.setSessions(s),e.payload.availableAgents){const o=e.payload.availableAgents.map(u=>({name:u.name,baseType:u.base_type,displayName:u.name.charAt(0).toUpperCase()+u.name.slice(1),description:u.description,isAlias:u.is_alias}));r.setAvailableAgents(o)}if(e.payload.workspaces){const o=e.payload.workspaces.map(u=>({name:u.name,projects:u.projects.map(f=>({name:f.name,isGitRepo:f.is_git_repo,defaultBranch:f.default_branch}))}));r.setWorkspaces(o)}n.setHistoryPaginationState("supervisor",{oldestSequence:void 0,hasMore:!0,isLoading:!0}),ze.log("Sending supervisor history.request"),Mt.send({type:"history.request",id:crypto.randomUUID(),payload:{session_id:null,limit:50}})}function _k(e){const r=ut.getState(),{session_id:n,history:s,has_more:o,oldest_sequence:u,is_executing:f,current_streaming_blocks:l,streaming_message_id:c}=e.payload;ze.log("history.response received:",{session_id:n,historyCount:(s==null?void 0:s.length)??0,has_more:o,oldest_sequence:u,streaming_message_id:c});const h=n??"supervisor";ma.markHistoryLoadStart(h);try{if(r.setHistoryPaginationState(h,{oldestSequence:u,hasMore:o,isLoading:!1}),s.length===0)return;const p=[...s].sort((y,x)=>y.sequence-x.sequence).map(y=>({id:y.message_id??crypto.randomUUID(),sessionId:h,role:y.role,contentBlocks:y.content_blocks?_i(y.content_blocks):[{id:crypto.randomUUID(),blockType:"text",content:y.content}],isStreaming:!1,createdAt:new Date(y.createdAt)}));if(n===null){if(r.prependSupervisorMessages(p),f&&r.setSupervisorIsLoading(!0),l&&l.length>0){const y=c??crypto.randomUUID();if(r.supervisorStreamingMessageId===y)r.updateSupervisorStreamingBlocks(y,_i(l));else if(!r.supervisorMessages.some(A=>A.id===y)){const A={id:y,sessionId:"supervisor",role:"assistant",contentBlocks:_i(l),isStreaming:!0,createdAt:new Date};r.addSupervisorMessage(A),r.setSupervisorStreamingMessageId(y),r.setSupervisorIsLoading(!0)}}}else if(r.prependAgentMessages(n,p),f&&r.setAgentIsLoading(n,!0),l&&l.length>0){const y=c??crypto.randomUUID();if(r.agentStreamingMessageIds[n]===y)r.updateAgentStreamingBlocks(n,y,_i(l));else if(!(r.agentMessages[n]??[]).some(w=>w.id===y)){const w={id:y,sessionId:n,role:"assistant",contentBlocks:_i(l),isStreaming:!0,createdAt:new Date};r.addAgentMessage(n,w),r.setAgentStreamingMessageId(n,y),r.setAgentIsLoading(n,!0)}}}finally{ma.markHistoryLoadEnd(h)}}function yk(e){const r=Ve.getState(),n={id:e.session_id,type:e.payload.session_type,status:"active",agentName:e.payload.agent_name,workspace:e.payload.workspace,project:e.payload.project,worktree:e.payload.worktree,workingDir:e.payload.working_dir,createdAt:e.payload.created_at?new Date(e.payload.created_at):new Date,terminalConfig:e.payload.terminal_config?{cols:80,rows:24,bufferSize:e.payload.terminal_config.buffer_size}:void 0};r.addSession(n)}function Sk(e){const r=ut.getState(),n=e.session_id,o=Ve.getState().sessions.find(u=>u.id===n);if((o==null?void 0:o.type)!=="terminal"&&(e.is_executing&&r.setAgentIsLoading(n,!0),r.setHistoryPaginationState(n,{oldestSequence:void 0,hasMore:!0,isLoading:!0}),ze.log("Sending agent history.request",{sessionId:n}),Mt.send({type:"history.request",id:crypto.randomUUID(),payload:{session_id:n,limit:50}}),e.current_streaming_blocks&&e.current_streaming_blocks.length>0)){const u=e.streaming_message_id??crypto.randomUUID();if(r.agentStreamingMessageIds[n]===u)r.updateAgentStreamingBlocks(n,u,_i(e.current_streaming_blocks));else if(!(r.agentMessages[n]??[]).some(c=>c.id===u)){const c={id:u,sessionId:n,role:"assistant",contentBlocks:_i(e.current_streaming_blocks),isStreaming:!0,createdAt:new Date};r.addAgentMessage(n,c),r.setAgentStreamingMessageId(n,u),r.setAgentIsLoading(n,!0)}}}function bk(e){Ve.getState().removeSession(e.session_id)}function u1(e){if(c1.checkSupervisorSequence(e.sequence),ma.isHistoryLoadingForSession("supervisor")){ma.queueUpdate("supervisor",()=>u1(e));return}const r=ut.getState(),n=r.supervisorStreamingMessageId,s=e.streaming_message_id,o=_i(e.payload.content_blocks),u=o.length>0&&o.some(f=>f.content||f.blockType==="tool"||f.blockType==="voice_output");if(s&&n&&n!==s&&r.supervisorMessages.some(f=>f.id===s)){u&&r.updateSupervisorStreamingBlocks(s,o),e.payload.is_complete&&(r.updateSupervisorMessage(s,{isStreaming:!1}),r.setSupervisorStreamingMessageId(null),r.setSupervisorIsLoading(!1));return}if(n)u&&r.updateSupervisorStreamingBlocks(n,o),e.payload.is_complete&&(r.updateSupervisorMessage(n,{isStreaming:!1}),r.setSupervisorStreamingMessageId(null),r.setSupervisorIsLoading(!1));else{if(!u&&e.payload.is_complete)return;const f=s??crypto.randomUUID();if(r.supervisorMessages.some(c=>c.id===f)){u&&r.updateSupervisorStreamingBlocks(f,o),e.payload.is_complete?(r.updateSupervisorMessage(f,{isStreaming:!1}),r.setSupervisorStreamingMessageId(null),r.setSupervisorIsLoading(!1)):(r.setSupervisorStreamingMessageId(f),r.setSupervisorIsLoading(!0));return}const l={id:f,sessionId:"supervisor",role:"assistant",contentBlocks:o,isStreaming:!e.payload.is_complete,createdAt:new Date(e.payload.timestamp)};r.addSupervisorMessage(l),e.payload.is_complete||(r.setSupervisorStreamingMessageId(l.id),r.setSupervisorIsLoading(!0))}}function Ck(e){const r=ut.getState(),s=Ve.getState().credentials;if(s&&e.payload.from_device_id===s.deviceId)return;const o={id:crypto.randomUUID(),sessionId:"supervisor",role:"user",contentBlocks:[{id:crypto.randomUUID(),blockType:"text",content:e.payload.content}],isStreaming:!1,createdAt:new Date(e.payload.timestamp),fromDeviceId:e.payload.from_device_id};r.addSupervisorMessage(o)}function wk(){ut.getState().clearSupervisorMessages()}function xk(e){const r=e.session_id,{messages:n}=e.payload;if(ze.debug("Terminal replay received",{sessionId:r,messageCount:n.length,hasMore:e.payload.has_more,firstSequence:e.payload.first_sequence,lastSequence:e.payload.last_sequence}),n.length===0)return;const o=[...n].sort((u,f)=>u.sequence-f.sequence).map(u=>u.content).join("");window.dispatchEvent(new CustomEvent("terminal-output",{detail:{sessionId:r,data:o}}))}function d1(e){const r=e.session_id;if(c1.checkAgentSequence(r,e.sequence),ma.isHistoryLoadingForSession(r)){ma.queueUpdate(r,()=>d1(e));return}const n=ut.getState();if(e.payload.content_type==="terminal"){window.dispatchEvent(new CustomEvent("terminal-output",{detail:{sessionId:r,data:e.payload.content}}));return}const s=n.agentStreamingMessageIds[r],o=e.streaming_message_id,u=e.payload.content_blocks?_i(e.payload.content_blocks):[{id:crypto.randomUUID(),blockType:"text",content:e.payload.content}],f=u.length>0&&u.some(l=>l.content||l.blockType==="tool"||l.blockType==="voice_output");if(o&&s&&s!==o&&(n.agentMessages[r]??[]).some(c=>c.id===o)){f&&n.updateAgentStreamingBlocks(r,o,u),e.payload.is_complete&&(n.updateAgentMessage(r,o,{isStreaming:!1}),n.setAgentStreamingMessageId(r,null),n.setAgentIsLoading(r,!1));return}if(s)f&&n.updateAgentStreamingBlocks(r,s,u),e.payload.is_complete&&(n.updateAgentMessage(r,s,{isStreaming:!1}),n.setAgentStreamingMessageId(r,null),n.setAgentIsLoading(r,!1));else{if(!f&&e.payload.is_complete)return;const l=o??crypto.randomUUID();if((n.agentMessages[r]??[]).some(m=>m.id===l)){f&&n.updateAgentStreamingBlocks(r,l,u),e.payload.is_complete?(n.updateAgentMessage(r,l,{isStreaming:!1}),n.setAgentStreamingMessageId(r,null),n.setAgentIsLoading(r,!1)):(n.setAgentStreamingMessageId(r,l),n.setAgentIsLoading(r,!0));return}const h={id:l,sessionId:r,role:"assistant",contentBlocks:u,isStreaming:!e.payload.is_complete,createdAt:new Date(e.payload.timestamp)};n.addAgentMessage(r,h),e.payload.is_complete||(n.setAgentStreamingMessageId(r,h.id),n.setAgentIsLoading(r,!0))}}function Ek(e){const r=ut.getState(),s=Ve.getState().credentials;if(s&&e.payload.from_device_id===s.deviceId)return;const o={id:crypto.randomUUID(),sessionId:e.session_id,role:"user",contentBlocks:[{id:crypto.randomUUID(),blockType:"text",content:e.payload.content}],isStreaming:!1,createdAt:new Date,fromDeviceId:e.payload.from_device_id};r.addAgentMessage(e.session_id,o)}function Ak(e){const r=ut.getState();r.pendingMessageAcks.has(e.payload.message_id)&&(r.removePendingAck(e.payload.message_id),r.setMessageSendStatus(e.payload.message_id,"sent"))}function Tk(e){on.audio("Received supervisor.voice_output:",e);const r=Ve.getState(),n=Pn.getState(),s=ut.getState(),o=r.credentials,{message_id:u,audio_base64:f,from_device_id:l,duration:c}=e.payload,h=n.ttsEnabled,m=l!==void 0&&l===(o==null?void 0:o.deviceId),p=h&&m;on.audio(`TTS: from=${l??"nil"} me=${o==null?void 0:o.deviceId} match=${m} ttsEnabled=${h} autoPlay=${p}`),It.playAudio(f,u,p);const y=s.supervisorMessages;let x=-1;for(let A=y.length-1;A>=0;A--){const w=y[A];if(w&&w.role==="assistant"){x=A;break}}if(x!==-1){const A=y[x];if(A){const w={id:crypto.randomUUID(),blockType:"voice_output",content:"",metadata:{messageId:u,audioBase64:f,duration:c,hasAudio:!0}};s.updateSupervisorMessage(A.id,{contentBlocks:[...A.contentBlocks,w]})}}}function Rk(e){on.audio("Received session.voice_output:",e);const r=Ve.getState(),n=Pn.getState(),s=ut.getState(),o=r.credentials,u=e.session_id,{message_id:f,audio_base64:l,from_device_id:c,duration:h}=e.payload,m=n.ttsEnabled,p=c!==void 0&&c===(o==null?void 0:o.deviceId),y=m&&p;on.audio(`TTS(agent): from=${c??"nil"} me=${o==null?void 0:o.deviceId} match=${p} autoPlay=${y}`),It.playAudio(l,f,y);const x=s.agentMessages[u]??[];let A=-1;for(let w=x.length-1;w>=0;w--){const v=x[w];if(v&&v.role==="assistant"){A=w;break}}if(A!==-1){const w=x[A];if(w){const v={id:crypto.randomUUID(),blockType:"voice_output",content:"",metadata:{messageId:f,audioBase64:l,duration:h,hasAudio:!0}};s.updateAgentMessage(u,w.id,{contentBlocks:[...w.contentBlocks,v]})}}}function Dk(e){const r=ut.getState(),s=Ve.getState().credentials,{message_id:o,transcription:u,from_device_id:f}=e.payload,l=r.supervisorMessages;let c=!1;for(const h of l)if(h.id===o||h.contentBlocks.some(m=>{var p;return((p=m.metadata)==null?void 0:p.messageId)===o})){const m=h.contentBlocks.map(p=>p.blockType==="voice_input"?{...p,content:u}:p);r.updateSupervisorMessage(h.id,{contentBlocks:m}),c=!0;break}if(!c&&f&&f!==(s==null?void 0:s.deviceId)&&u){const h={id:o,sessionId:"supervisor",role:"user",contentBlocks:[{id:crypto.randomUUID(),blockType:"voice_input",content:u,metadata:{messageId:o}}],isStreaming:!1,createdAt:new Date,fromDeviceId:f};r.addSupervisorMessage(h)}}function Mk(e){const r=ut.getState(),s=Ve.getState().credentials,o=e.session_id,{message_id:u,transcription:f,from_device_id:l}=e.payload,c=r.agentMessages[o]??[];let h=!1;for(const m of c)if(m.id===u||m.contentBlocks.some(p=>{var y;return((y=p.metadata)==null?void 0:y.messageId)===u})){const p=m.contentBlocks.map(y=>y.blockType==="voice_input"?{...y,content:f}:y);r.updateAgentMessage(o,m.id,{contentBlocks:p}),h=!0;break}if(!h&&l&&l!==(s==null?void 0:s.deviceId)&&f){const m={id:u,sessionId:o,role:"user",contentBlocks:[{id:crypto.randomUUID(),blockType:"voice_input",content:f,metadata:{messageId:u}}],isStreaming:!1,createdAt:new Date,fromDeviceId:l};r.addAgentMessage(o,m)}}const pd="tiflis_credentials",pm="tiflis_device_id",SS="tiflis_encryption_key",mm="tiflis_security",ds="keys";class kk{constructor(){_e(this,"encryptionKey",null)}getDeviceId(){let r=localStorage.getItem(pm);return r||(r=crypto.randomUUID(),localStorage.setItem(pm,r)),r}async storeCredentials(r){const n=await this.getOrCreateEncryptionKey(),{encrypted:s,iv:o}=await this.encrypt(n,r.authKey),u={tunnelId:r.tunnelId,tunnelUrl:r.tunnelUrl,encryptedAuthKey:s,iv:o};localStorage.setItem(pd,JSON.stringify(u))}async getCredentials(){const r=localStorage.getItem(pd);if(!r)return null;try{const n=JSON.parse(r),s=await this.getOrCreateEncryptionKey(),o=await this.decrypt(s,n.encryptedAuthKey,n.iv);return{tunnelId:n.tunnelId,tunnelUrl:n.tunnelUrl,authKey:o,deviceId:this.getDeviceId()}}catch(n){return ze.error("Failed to decrypt credentials:",n),null}}hasCredentials(){return localStorage.getItem(pd)!==null}async forgetAll(){localStorage.removeItem(pd),localStorage.removeItem(pm);try{await this.deleteEncryptionKey()}catch(r){ze.error("Failed to delete encryption key:",r)}this.encryptionKey=null}async getOrCreateEncryptionKey(){if(this.encryptionKey)return this.encryptionKey;const r=await this.loadKeyFromDB();if(r)return this.encryptionKey=r,r;const n=await crypto.subtle.generateKey({name:"AES-GCM",length:256},!1,["encrypt","decrypt"]);return await this.saveKeyToDB(n),this.encryptionKey=n,n}async encrypt(r,n){const s=new TextEncoder,o=crypto.getRandomValues(new Uint8Array(12)),u=await crypto.subtle.encrypt({name:"AES-GCM",iv:o},r,s.encode(n));return{encrypted:this.bufferToBase64(new Uint8Array(u)),iv:this.bufferToBase64(o)}}async decrypt(r,n,s){const o=new TextDecoder,u=this.base64ToBuffer(s),f=this.base64ToBuffer(n),l=await crypto.subtle.decrypt({name:"AES-GCM",iv:u.buffer},r,f.buffer);return o.decode(l)}loadKeyFromDB(){return new Promise((r,n)=>{const s=indexedDB.open(mm,1);s.onerror=()=>n(s.error),s.onupgradeneeded=()=>{const o=s.result;o.objectStoreNames.contains(ds)||o.createObjectStore(ds)},s.onsuccess=()=>{const o=s.result;try{const l=o.transaction(ds,"readonly").objectStore(ds).get(SS);l.onerror=()=>{o.close(),n(l.error)},l.onsuccess=()=>{o.close(),r(l.result??null)}}catch(u){o.close(),n(u)}}})}saveKeyToDB(r){return new Promise((n,s)=>{const o=indexedDB.open(mm,1);o.onerror=()=>s(o.error),o.onupgradeneeded=()=>{const u=o.result;u.objectStoreNames.contains(ds)||u.createObjectStore(ds)},o.onsuccess=()=>{const u=o.result;try{const f=u.transaction(ds,"readwrite");f.objectStore(ds).put(r,SS),f.oncomplete=()=>{u.close(),n()},f.onerror=()=>{u.close(),s(f.error)}}catch(f){u.close(),s(f)}}})}deleteEncryptionKey(){return new Promise((r,n)=>{const s=indexedDB.deleteDatabase(mm);s.onblocked=()=>{ze.warn("IndexedDB delete blocked by open connections, resolving anyway"),r()},s.onerror=()=>n(s.error),s.onsuccess=()=>r()})}bufferToBase64(r){let n="";for(let s=0;s<r.byteLength;s++)n+=String.fromCharCode(r[s]);return btoa(n)}base64ToBuffer(r){const n=atob(r),s=new Uint8Array(n.length);for(let o=0;o<n.length;o++)s[o]=n.charCodeAt(o);return s}}const md=new kk;function co(){const e=R.useRef(!1),r=R.useRef(new Map),n=Ve(F=>F.setConnectionState),s=Ve(F=>F.setWorkstationOnline),o=Ve(F=>F.setAuthenticated),u=Ve(F=>F.setCredentials),f=Ve(F=>F.credentials),l=Ve(F=>F.connectionState),c=ut(F=>F.addSupervisorMessage),h=ut(F=>F.setSupervisorIsLoading),m=ut(F=>F.addPendingAck),p=ut(F=>F.setMessageSendStatus);R.useEffect(()=>{if(e.current)return;e.current=!0,Mt.init({onConnectionStateChange:ee=>{n(ee),ee==="authenticated"||ee==="verified"?s(!0):(ee==="disconnected"||ee==="error")&&s(!1)},onMessage:mk,onWorkstationOnline:()=>s(!0),onWorkstationOffline:()=>s(!1)}),(async()=>{const ee=await md.getCredentials();if(ee){u(ee),o(!0);try{await Mt.connect(ee)}catch(Y){ze.error("Auto-connect failed:",Y)}}})();const F=r.current;return()=>{F.forEach(ee=>{clearTimeout(ee)}),F.clear()}},[n,s,o,u]);const y=R.useCallback(async F=>{const ee=md.getDeviceId(),Y={...F,deviceId:ee};await md.storeCredentials(F),u(Y);try{await Mt.connect(Y),o(!0)}catch(re){throw o(!1),re}},[u,o]),x=R.useCallback(()=>{Mt.disconnect(),o(!1)},[o]),A=R.useCallback(async()=>{Mt.disconnect(),await md.forgetAll(),Ve.getState().reset(),ut.getState().reset()},[]),w=R.useCallback(async F=>{const ee=crypto.randomUUID();c({id:ee,sessionId:"supervisor",role:"user",contentBlocks:[{id:crypto.randomUUID(),blockType:"text",content:F}],isStreaming:!1,createdAt:new Date,sendStatus:"pending",fromDeviceId:f==null?void 0:f.deviceId}),m(ee),h(!0);const Y={type:"supervisor.command",id:ee,payload:{command:F}};Mt.send(Y);const re=setTimeout(()=>{r.current.delete(ee);const te=ut.getState();te.pendingMessageAcks.has(ee)&&(te.removePendingAck(ee),p(ee,"failed"))},5e3);r.current.set(ee,re)},[f,l]),v=R.useCallback(async(F,ee)=>{const Y=crypto.randomUUID(),re=ut.getState();re.addAgentMessage(F,{id:Y,sessionId:F,role:"user",contentBlocks:[{id:crypto.randomUUID(),blockType:"text",content:ee}],isStreaming:!1,createdAt:new Date,sendStatus:"pending",fromDeviceId:f==null?void 0:f.deviceId}),re.addPendingAck(Y),re.setAgentIsLoading(F,!0);const te={type:"session.execute",id:Y,session_id:F,payload:{content:ee}};Mt.send(te);const O=setTimeout(()=>{r.current.delete(Y);const G=ut.getState();G.pendingMessageAcks.has(Y)&&(G.removePendingAck(Y),G.setMessageSendStatus(Y,"failed"))},5e3);r.current.set(Y,O)},[f]),S=R.useCallback(async(F,ee,Y,re,te)=>{const O={type:"supervisor.create_session",id:crypto.randomUUID(),payload:{session_type:F,agent_name:te,workspace:ee,project:Y,worktree:re}};return Mt.sendRequest(O)},[]),g=R.useCallback(F=>{const ee={type:"session.subscribe",session_id:F};Mt.send(ee)},[]),_=R.useCallback((F,ee)=>{const Y={type:"session.input",session_id:F,payload:{data:ee}};Mt.send(Y)},[]),T=R.useCallback((F,ee,Y)=>{const re={type:"session.resize",session_id:F,payload:{cols:ee,rows:Y}};Mt.send(re)},[]),M=R.useCallback((F,ee=0,Y=500)=>{const re={type:"session.replay",session_id:F,payload:{since_sequence:ee,limit:Y}};Mt.send(re),ze.debug("Requested terminal replay",{sessionId:F,sinceSequence:ee,limit:Y})},[]),k=R.useCallback(()=>{Mt.send({type:"supervisor.cancel",id:crypto.randomUUID()}),h(!1)},[h]),L=R.useCallback(F=>{Mt.send({type:"session.cancel",id:crypto.randomUUID(),session_id:F}),ut.getState().setAgentIsLoading(F,!1)},[]),D=R.useCallback(async(F,ee)=>{if(!f){ze.error("Cannot send supervisor voice command: Not authenticated");return}if(l!=="verified"&&l!=="authenticated"){ze.error("Cannot send supervisor voice command: Not connected",{connectionState:l});return}const Y=crypto.randomUUID();on.voice(`Sending supervisor voice command: format=${ee}, audioSize=${F.length}, messageId=${Y}`),c({id:Y,sessionId:"supervisor",role:"user",contentBlocks:[{id:crypto.randomUUID(),blockType:"voice_input",content:"",metadata:{audioBase64:F,messageId:Y}}],isStreaming:!1,createdAt:new Date,sendStatus:"pending",fromDeviceId:f==null?void 0:f.deviceId});const re=crypto.randomUUID();c({id:re,sessionId:"supervisor",role:"assistant",contentBlocks:[],isStreaming:!0,createdAt:new Date}),ut.getState().setSupervisorStreamingMessageId(re),m(Y),h(!0);const O={type:"supervisor.command",id:Y,payload:{audio:F,audio_format:ee,message_id:Y}};on.voice("WebSocket sending supervisor voice:",O),Mt.send(O);const G=setTimeout(()=>{r.current.delete(Y);const j=ut.getState();j.pendingMessageAcks.has(Y)&&(ze.warn(`Voice message ACK timeout: ${Y}`),j.removePendingAck(Y),p(Y,"failed"))},1e4);r.current.set(Y,G)},[f,l,c,m,h,p]),P=R.useCallback(async(F,ee,Y)=>{if(!f){ze.error("Cannot send agent voice command: Not authenticated");return}if(l!=="verified"&&l!=="authenticated"){ze.error("Cannot send agent voice command: Not connected",{connectionState:l});return}const re=crypto.randomUUID(),te=ut.getState();on.voice(`Sending agent voice command: sessionId=${F}, format=${Y}, audioSize=${ee.length}, messageId=${re}`),te.addAgentMessage(F,{id:re,sessionId:F,role:"user",contentBlocks:[{id:crypto.randomUUID(),blockType:"voice_input",content:"",metadata:{audioBase64:ee,messageId:re}}],isStreaming:!1,createdAt:new Date,sendStatus:"pending",fromDeviceId:f==null?void 0:f.deviceId});const O=crypto.randomUUID();te.addAgentMessage(F,{id:O,sessionId:F,role:"assistant",contentBlocks:[],isStreaming:!0,createdAt:new Date}),te.setAgentStreamingMessageId(F,O),te.addPendingAck(re),te.setAgentIsLoading(F,!0);const G={type:"session.execute",id:re,session_id:F,payload:{audio:ee,audio_format:Y,message_id:re}};Mt.send(G);const j=setTimeout(()=>{r.current.delete(re);const q=ut.getState();q.pendingMessageAcks.has(re)&&(q.removePendingAck(re),q.setMessageSendStatus(re,"failed"))},1e4);r.current.set(re,j)},[f,l]),K=R.useCallback(()=>{Mt.send({type:"supervisor.clear_context",id:crypto.randomUUID()}),ut.getState().clearSupervisorMessages()},[]),$=R.useCallback(()=>{const F={type:"sync",id:crypto.randomUUID()};Mt.send(F)},[]),z=R.useCallback((F,ee,Y=20)=>{const re={type:"history.request",id:crypto.randomUUID(),payload:{session_id:F,before_sequence:ee,limit:Y}};Mt.send(re)},[]),W=R.useCallback(F=>{Mt.send({type:"supervisor.terminate_session",id:crypto.randomUUID(),payload:{session_id:F}})},[]);return{connect:y,disconnect:x,disconnectAndForget:A,sendSupervisorCommand:w,sendAgentCommand:v,sendSupervisorVoiceCommand:D,sendAgentVoiceCommand:P,createSession:S,subscribeToSession:g,sendTerminalInput:_,resizeTerminal:T,requestTerminalReplay:M,cancelSupervisor:k,cancelAgent:L,clearSupervisorContext:K,terminateSession:W,requestSync:$,requestHistory:z,isConnected:Mt.isConnected}}const h1="(prefers-color-scheme: dark)",Lk="ui-theme",f1=R.createContext(void 0);function gm(){return typeof window>"u"||window.matchMedia(h1).matches?"dark":"light"}function Ok({children:e,defaultTheme:r="system",storageKey:n=Lk}){const[s,o]=R.useState(()=>localStorage.getItem(n)||r),[u,f]=R.useState(()=>s==="system"?gm():s);R.useEffect(()=>{const c=window.document.documentElement;c.classList.remove("light","dark");const h=s==="system"?gm():s;c.classList.add(h),f(h)},[s]),R.useEffect(()=>{const c=window.matchMedia(h1),h=()=>{if(s==="system"){const m=window.document.documentElement,p=gm();m.classList.remove("light","dark"),m.classList.add(p),f(p)}};return c.addEventListener("change",h),()=>c.removeEventListener("change",h)},[s]);const l=c=>{localStorage.setItem(n,c),o(c)};return b.jsx(f1.Provider,{value:{theme:s,setTheme:l,resolvedTheme:u},children:e})}function Kg(){const e=R.useContext(f1);if(e===void 0)throw new Error("useTheme must be used within a ThemeProvider");return e}function p1(e){return b.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 64 64",...e,children:[b.jsx("defs",{children:b.jsxs("linearGradient",{id:"tiflis-accent",x1:"0%",y1:"0%",x2:"100%",y2:"100%",children:[b.jsx("stop",{offset:"0%",stopColor:"#2E5AA6"}),b.jsx("stop",{offset:"100%",stopColor:"#6F4ABF"})]})}),b.jsx("rect",{width:"64",height:"64",rx:"12",fill:"#111"}),b.jsx("path",{d:"M 14 20 L 10 26 L 10 42 L 14 48",fill:"none",stroke:"#2E5AA6",strokeWidth:"2.6",strokeLinecap:"round"}),b.jsx("path",{d:"M 50 20 L 54 26 L 54 42 L 50 48",fill:"none",stroke:"#6F4ABF",strokeWidth:"2.6",strokeLinecap:"round"}),b.jsx("text",{x:"14",y:"46",fontFamily:"monospace",fontSize:"23",fill:"url(#tiflis-accent)",children:"›"}),b.jsx("text",{x:"32",y:"47",textAnchor:"middle",fontFamily:"system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif",fontSize:"47",fontWeight:"500",fill:"#fff",children:"t"})]})}function ga(e){return b.jsx(p1,{...e})}function Ea({className:e,...r}){return b.jsx("img",{src:"/icons/claude-logo.png",alt:"Claude Code",className:e,...r})}function Aa({className:e,...r}){const{resolvedTheme:n}=Kg(),s=n==="dark"?"/icons/opencode-logo-dark.png":"/icons/opencode-logo-light.png";return b.jsx("img",{src:s,alt:"OpenCode",className:e,...r})}function Ta({className:e,...r}){return b.jsx("img",{src:"/icons/cursor-logo.png",alt:"Cursor",className:e,...r})}function va(e){return b.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",...e,children:[b.jsx("rect",{x:"3",y:"4",width:"18",height:"16",rx:"2"}),b.jsx("path",{d:"M7 9l3 3-3 3"}),b.jsx("path",{d:"M13 15h4"})]})}function xi(e){return b.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",...e,children:[b.jsx("rect",{x:"3",y:"3",width:"18",height:"18",rx:"2"}),b.jsx("circle",{cx:"12",cy:"10",r:"3"}),b.jsx("path",{d:"M7 20v-1a5 5 0 0 1 10 0v1"})]})}function Bk(){const[e,r]=R.useState(""),[n,s]=R.useState(!1),[o,u]=R.useState(null),[f,l]=R.useState(!1),{connect:c}=co(),h=R.useCallback(async y=>{u(null);const x=y??e.trim(),A=S2(x);if(!A){u("Invalid magic link format");return}s(!0);try{await c({tunnelId:A.tunnelId,tunnelUrl:A.url,authKey:A.key})}catch(w){u(w instanceof Error?w.message:"Connection failed"),s(!1)}},[c,e]),m=R.useCallback(y=>{l(!1),r(y),h(y)},[h]),p=y=>{y.key==="Enter"&&!y.shiftKey&&(y.preventDefault(),h())};return b.jsx("div",{className:"min-h-screen flex items-center justify-center p-4 bg-background",children:b.jsxs(fs,{className:"w-full max-w-md",children:[b.jsxs(ps,{className:"text-center",children:[b.jsx("div",{className:"mx-auto mb-4 w-16 h-16 rounded-lg overflow-hidden",children:b.jsx(p1,{className:"w-16 h-16"})}),b.jsx(ms,{className:"text-2xl",children:"Tiflis Code"}),b.jsx(Xs,{children:"Connect to your workstation to control AI agents remotely"})]}),b.jsx(gs,{className:"space-y-4",children:f?b.jsx(tk,{onScan:m,onBack:()=>l(!1)}):b.jsxs(b.Fragment,{children:[b.jsxs("div",{className:"space-y-2",children:[b.jsx(nC,{placeholder:"Paste magic link here...",value:e,onChange:y=>r(y.target.value),onKeyDown:p,disabled:n}),o&&b.jsx("p",{className:"text-sm text-destructive",children:o})]}),b.jsx(dt,{className:"w-full",onClick:()=>h(),disabled:!e.trim()||n,children:n?b.jsxs(b.Fragment,{children:[b.jsx(wc,{className:"animate-spin"}),"Connecting..."]}):b.jsxs(b.Fragment,{children:[b.jsx(qM,{}),"Connect"]})}),b.jsxs("div",{className:"relative",children:[b.jsx("div",{className:"absolute inset-0 flex items-center",children:b.jsx("span",{className:"w-full border-t"})}),b.jsx("div",{className:"relative flex justify-center text-xs uppercase",children:b.jsx("span",{className:"bg-background px-2 text-muted-foreground",children:"Or"})})]}),b.jsxs(dt,{variant:"outline",className:"w-full",onClick:()=>l(!0),disabled:n,children:[b.jsx(QM,{}),"Scan QR Code"]})]})})]})})}function Le(e,r,{checkForDefaultPrevented:n=!0}={}){return function(o){if(e==null||e(o),n===!1||!o.defaultPrevented)return r==null?void 0:r(o)}}function Nk(e,r){const n=R.createContext(r),s=u=>{const{children:f,...l}=u,c=R.useMemo(()=>l,Object.values(l));return b.jsx(n.Provider,{value:c,children:f})};s.displayName=e+"Provider";function o(u){const f=R.useContext(n);if(f)return f;if(r!==void 0)return r;throw new Error(`\`${u}\` must be used within \`${e}\``)}return[s,o]}function qn(e,r=[]){let n=[];function s(u,f){const l=R.createContext(f),c=n.length;n=[...n,f];const h=p=>{var S;const{scope:y,children:x,...A}=p,w=((S=y==null?void 0:y[e])==null?void 0:S[c])||l,v=R.useMemo(()=>A,Object.values(A));return b.jsx(w.Provider,{value:v,children:x})};h.displayName=u+"Provider";function m(p,y){var w;const x=((w=y==null?void 0:y[e])==null?void 0:w[c])||l,A=R.useContext(x);if(A)return A;if(f!==void 0)return f;throw new Error(`\`${p}\` must be used within \`${u}\``)}return[h,m]}const o=()=>{const u=n.map(f=>R.createContext(f));return function(l){const c=(l==null?void 0:l[e])||u;return R.useMemo(()=>({[`__scope${e}`]:{...l,[e]:c}}),[l,c])}};return o.scopeName=e,[s,Ik(o,...r)]}function Ik(...e){const r=e[0];if(e.length===1)return r;const n=()=>{const s=e.map(o=>({useScope:o(),scopeName:o.scopeName}));return function(u){const f=s.reduce((l,{useScope:c,scopeName:h})=>{const p=c(u)[`__scope${h}`];return{...l,...p}},{});return R.useMemo(()=>({[`__scope${r.scopeName}`]:f}),[f])}};return n.scopeName=r.scopeName,n}var pr=globalThis!=null&&globalThis.document?R.useLayoutEffect:()=>{},Pk=kg[" useId ".trim().toString()]||(()=>{}),jk=0;function jn(e){const[r,n]=R.useState(Pk());return pr(()=>{n(s=>s??String(jk++))},[e]),r?`radix-${r}`:""}var Uk=kg[" useInsertionEffect ".trim().toString()]||pr;function ro({prop:e,defaultProp:r,onChange:n=()=>{},caller:s}){const[o,u,f]=Fk({defaultProp:r,onChange:n}),l=e!==void 0,c=l?e:o;{const m=R.useRef(e!==void 0);R.useEffect(()=>{const p=m.current;p!==l&&console.warn(`${s} is changing from ${p?"controlled":"uncontrolled"} to ${l?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),m.current=l},[l,s])}const h=R.useCallback(m=>{var p;if(l){const y=Hk(m)?m(e):m;y!==e&&((p=f.current)==null||p.call(f,y))}else u(m)},[l,e,u,f]);return[c,h]}function Fk({defaultProp:e,onChange:r}){const[n,s]=R.useState(e),o=R.useRef(n),u=R.useRef(r);return Uk(()=>{u.current=r},[r]),R.useEffect(()=>{var f;o.current!==n&&((f=u.current)==null||f.call(u,n),o.current=n)},[n,o]),[n,s,u]}function Hk(e){return typeof e=="function"}function no(e){const r=Vk(e),n=R.forwardRef((s,o)=>{const{children:u,...f}=s,l=R.Children.toArray(u),c=l.find(Gk);if(c){const h=c.props.children,m=l.map(p=>p===c?R.Children.count(h)>1?R.Children.only(null):R.isValidElement(h)?h.props.children:null:p);return b.jsx(r,{...f,ref:o,children:R.isValidElement(h)?R.cloneElement(h,void 0,m):null})}return b.jsx(r,{...f,ref:o,children:u})});return n.displayName=`${e}.Slot`,n}function Vk(e){const r=R.forwardRef((n,s)=>{const{children:o,...u}=n;if(R.isValidElement(o)){const f=Yk(o),l=zk(u,o.props);return o.type!==R.Fragment&&(l.ref=s?Cc(s,f):f),R.cloneElement(o,l)}return R.Children.count(o)>1?R.Children.only(null):null});return r.displayName=`${e}.SlotClone`,r}var m1=Symbol("radix.slottable");function qk(e){const r=({children:n})=>b.jsx(b.Fragment,{children:n});return r.displayName=`${e}.Slottable`,r.__radixId=m1,r}function Gk(e){return R.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===m1}function zk(e,r){const n={...r};for(const s in r){const o=e[s],u=r[s];/^on[A-Z]/.test(s)?o&&u?n[s]=(...l)=>{const c=u(...l);return o(...l),c}:o&&(n[s]=o):s==="style"?n[s]={...o,...u}:s==="className"&&(n[s]=[o,u].filter(Boolean).join(" "))}return{...e,...n}}function Yk(e){var s,o;let r=(s=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:s.get,n=r&&"isReactWarning"in r&&r.isReactWarning;return n?e.ref:(r=(o=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:o.get,n=r&&"isReactWarning"in r&&r.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}var Wk=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],Je=Wk.reduce((e,r)=>{const n=no(`Primitive.${r}`),s=R.forwardRef((o,u)=>{const{asChild:f,...l}=o,c=f?n:r;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),b.jsx(c,{...l,ref:u})});return s.displayName=`Primitive.${r}`,{...e,[r]:s}},{});function g1(e,r){e&&bc.flushSync(()=>e.dispatchEvent(r))}function Fn(e){const r=R.useRef(e);return R.useEffect(()=>{r.current=e}),R.useMemo(()=>(...n)=>{var s;return(s=r.current)==null?void 0:s.call(r,...n)},[])}function Kk(e,r=globalThis==null?void 0:globalThis.document){const n=Fn(e);R.useEffect(()=>{const s=o=>{o.key==="Escape"&&n(o)};return r.addEventListener("keydown",s,{capture:!0}),()=>r.removeEventListener("keydown",s,{capture:!0})},[n,r])}var Qk="DismissableLayer",ig="dismissableLayer.update",$k="dismissableLayer.pointerDownOutside",Jk="dismissableLayer.focusOutside",bS,v1=R.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),xc=R.forwardRef((e,r)=>{const{disableOutsidePointerEvents:n=!1,onEscapeKeyDown:s,onPointerDownOutside:o,onFocusOutside:u,onInteractOutside:f,onDismiss:l,...c}=e,h=R.useContext(v1),[m,p]=R.useState(null),y=(m==null?void 0:m.ownerDocument)??(globalThis==null?void 0:globalThis.document),[,x]=R.useState({}),A=ot(r,L=>p(L)),w=Array.from(h.layers),[v]=[...h.layersWithOutsidePointerEventsDisabled].slice(-1),S=w.indexOf(v),g=m?w.indexOf(m):-1,_=h.layersWithOutsidePointerEventsDisabled.size>0,T=g>=S,M=eL(L=>{const D=L.target,P=[...h.branches].some(K=>K.contains(D));!T||P||(o==null||o(L),f==null||f(L),L.defaultPrevented||l==null||l())},y),k=tL(L=>{const D=L.target;[...h.branches].some(K=>K.contains(D))||(u==null||u(L),f==null||f(L),L.defaultPrevented||l==null||l())},y);return Kk(L=>{g===h.layers.size-1&&(s==null||s(L),!L.defaultPrevented&&l&&(L.preventDefault(),l()))},y),R.useEffect(()=>{if(m)return n&&(h.layersWithOutsidePointerEventsDisabled.size===0&&(bS=y.body.style.pointerEvents,y.body.style.pointerEvents="none"),h.layersWithOutsidePointerEventsDisabled.add(m)),h.layers.add(m),CS(),()=>{n&&h.layersWithOutsidePointerEventsDisabled.size===1&&(y.body.style.pointerEvents=bS)}},[m,y,n,h]),R.useEffect(()=>()=>{m&&(h.layers.delete(m),h.layersWithOutsidePointerEventsDisabled.delete(m),CS())},[m,h]),R.useEffect(()=>{const L=()=>x({});return document.addEventListener(ig,L),()=>document.removeEventListener(ig,L)},[]),b.jsx(Je.div,{...c,ref:A,style:{pointerEvents:_?T?"auto":"none":void 0,...e.style},onFocusCapture:Le(e.onFocusCapture,k.onFocusCapture),onBlurCapture:Le(e.onBlurCapture,k.onBlurCapture),onPointerDownCapture:Le(e.onPointerDownCapture,M.onPointerDownCapture)})});xc.displayName=Qk;var Zk="DismissableLayerBranch",Xk=R.forwardRef((e,r)=>{const n=R.useContext(v1),s=R.useRef(null),o=ot(r,s);return R.useEffect(()=>{const u=s.current;if(u)return n.branches.add(u),()=>{n.branches.delete(u)}},[n.branches]),b.jsx(Je.div,{...e,ref:o})});Xk.displayName=Zk;function eL(e,r=globalThis==null?void 0:globalThis.document){const n=Fn(e),s=R.useRef(!1),o=R.useRef(()=>{});return R.useEffect(()=>{const u=l=>{if(l.target&&!s.current){let c=function(){_1($k,n,h,{discrete:!0})};const h={originalEvent:l};l.pointerType==="touch"?(r.removeEventListener("click",o.current),o.current=c,r.addEventListener("click",o.current,{once:!0})):c()}else r.removeEventListener("click",o.current);s.current=!1},f=window.setTimeout(()=>{r.addEventListener("pointerdown",u)},0);return()=>{window.clearTimeout(f),r.removeEventListener("pointerdown",u),r.removeEventListener("click",o.current)}},[r,n]),{onPointerDownCapture:()=>s.current=!0}}function tL(e,r=globalThis==null?void 0:globalThis.document){const n=Fn(e),s=R.useRef(!1);return R.useEffect(()=>{const o=u=>{u.target&&!s.current&&_1(Jk,n,{originalEvent:u},{discrete:!1})};return r.addEventListener("focusin",o),()=>r.removeEventListener("focusin",o)},[r,n]),{onFocusCapture:()=>s.current=!0,onBlurCapture:()=>s.current=!1}}function CS(){const e=new CustomEvent(ig);document.dispatchEvent(e)}function _1(e,r,n,{discrete:s}){const o=n.originalEvent.target,u=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});r&&o.addEventListener(e,r,{once:!0}),s?g1(o,u):o.dispatchEvent(u)}var vm="focusScope.autoFocusOnMount",_m="focusScope.autoFocusOnUnmount",wS={bubbles:!1,cancelable:!0},rL="FocusScope",Ec=R.forwardRef((e,r)=>{const{loop:n=!1,trapped:s=!1,onMountAutoFocus:o,onUnmountAutoFocus:u,...f}=e,[l,c]=R.useState(null),h=Fn(o),m=Fn(u),p=R.useRef(null),y=ot(r,w=>c(w)),x=R.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;R.useEffect(()=>{if(s){let w=function(_){if(x.paused||!l)return;const T=_.target;l.contains(T)?p.current=T:hs(p.current,{select:!0})},v=function(_){if(x.paused||!l)return;const T=_.relatedTarget;T!==null&&(l.contains(T)||hs(p.current,{select:!0}))},S=function(_){if(document.activeElement===document.body)for(const M of _)M.removedNodes.length>0&&hs(l)};document.addEventListener("focusin",w),document.addEventListener("focusout",v);const g=new MutationObserver(S);return l&&g.observe(l,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",w),document.removeEventListener("focusout",v),g.disconnect()}}},[s,l,x.paused]),R.useEffect(()=>{if(l){ES.add(x);const w=document.activeElement;if(!l.contains(w)){const S=new CustomEvent(vm,wS);l.addEventListener(vm,h),l.dispatchEvent(S),S.defaultPrevented||(nL(lL(y1(l)),{select:!0}),document.activeElement===w&&hs(l))}return()=>{l.removeEventListener(vm,h),setTimeout(()=>{const S=new CustomEvent(_m,wS);l.addEventListener(_m,m),l.dispatchEvent(S),S.defaultPrevented||hs(w??document.body,{select:!0}),l.removeEventListener(_m,m),ES.remove(x)},0)}}},[l,h,m,x]);const A=R.useCallback(w=>{if(!n&&!s||x.paused)return;const v=w.key==="Tab"&&!w.altKey&&!w.ctrlKey&&!w.metaKey,S=document.activeElement;if(v&&S){const g=w.currentTarget,[_,T]=iL(g);_&&T?!w.shiftKey&&S===T?(w.preventDefault(),n&&hs(_,{select:!0})):w.shiftKey&&S===_&&(w.preventDefault(),n&&hs(T,{select:!0})):S===g&&w.preventDefault()}},[n,s,x.paused]);return b.jsx(Je.div,{tabIndex:-1,...f,ref:y,onKeyDown:A})});Ec.displayName=rL;function nL(e,{select:r=!1}={}){const n=document.activeElement;for(const s of e)if(hs(s,{select:r}),document.activeElement!==n)return}function iL(e){const r=y1(e),n=xS(r,e),s=xS(r.reverse(),e);return[n,s]}function y1(e){const r=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:s=>{const o=s.tagName==="INPUT"&&s.type==="hidden";return s.disabled||s.hidden||o?NodeFilter.FILTER_SKIP:s.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)r.push(n.currentNode);return r}function xS(e,r){for(const n of e)if(!sL(n,{upTo:r}))return n}function sL(e,{upTo:r}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(r!==void 0&&e===r)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function oL(e){return e instanceof HTMLInputElement&&"select"in e}function hs(e,{select:r=!1}={}){if(e&&e.focus){const n=document.activeElement;e.focus({preventScroll:!0}),e!==n&&oL(e)&&r&&e.select()}}var ES=aL();function aL(){let e=[];return{add(r){const n=e[0];r!==n&&(n==null||n.pause()),e=AS(e,r),e.unshift(r)},remove(r){var n;e=AS(e,r),(n=e[0])==null||n.resume()}}}function AS(e,r){const n=[...e],s=n.indexOf(r);return s!==-1&&n.splice(s,1),n}function lL(e){return e.filter(r=>r.tagName!=="A")}var cL="Portal",Ac=R.forwardRef((e,r)=>{var l;const{container:n,...s}=e,[o,u]=R.useState(!1);pr(()=>u(!0),[]);const f=n||o&&((l=globalThis==null?void 0:globalThis.document)==null?void 0:l.body);return f?MD.createPortal(b.jsx(Je.div,{...s,ref:r}),f):null});Ac.displayName=cL;function uL(e,r){return R.useReducer((n,s)=>r[n][s]??n,e)}var Gn=e=>{const{present:r,children:n}=e,s=dL(r),o=typeof n=="function"?n({present:s.isPresent}):R.Children.only(n),u=ot(s.ref,hL(o));return typeof n=="function"||s.isPresent?R.cloneElement(o,{ref:u}):null};Gn.displayName="Presence";function dL(e){const[r,n]=R.useState(),s=R.useRef(null),o=R.useRef(e),u=R.useRef("none"),f=e?"mounted":"unmounted",[l,c]=uL(f,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return R.useEffect(()=>{const h=gd(s.current);u.current=l==="mounted"?h:"none"},[l]),pr(()=>{const h=s.current,m=o.current;if(m!==e){const y=u.current,x=gd(h);e?c("MOUNT"):x==="none"||(h==null?void 0:h.display)==="none"?c("UNMOUNT"):c(m&&y!==x?"ANIMATION_OUT":"UNMOUNT"),o.current=e}},[e,c]),pr(()=>{if(r){let h;const m=r.ownerDocument.defaultView??window,p=x=>{const w=gd(s.current).includes(CSS.escape(x.animationName));if(x.target===r&&w&&(c("ANIMATION_END"),!o.current)){const v=r.style.animationFillMode;r.style.animationFillMode="forwards",h=m.setTimeout(()=>{r.style.animationFillMode==="forwards"&&(r.style.animationFillMode=v)})}},y=x=>{x.target===r&&(u.current=gd(s.current))};return r.addEventListener("animationstart",y),r.addEventListener("animationcancel",p),r.addEventListener("animationend",p),()=>{m.clearTimeout(h),r.removeEventListener("animationstart",y),r.removeEventListener("animationcancel",p),r.removeEventListener("animationend",p)}}else c("ANIMATION_END")},[r,c]),{isPresent:["mounted","unmountSuspended"].includes(l),ref:R.useCallback(h=>{s.current=h?getComputedStyle(h):null,n(h)},[])}}function gd(e){return(e==null?void 0:e.animationName)||"none"}function hL(e){var s,o;let r=(s=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:s.get,n=r&&"isReactWarning"in r&&r.isReactWarning;return n?e.ref:(r=(o=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:o.get,n=r&&"isReactWarning"in r&&r.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}var ym=0;function _h(){R.useEffect(()=>{const e=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",e[0]??TS()),document.body.insertAdjacentElement("beforeend",e[1]??TS()),ym++,()=>{ym===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(r=>r.remove()),ym--}},[])}function TS(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}var Nn=function(){return Nn=Object.assign||function(r){for(var n,s=1,o=arguments.length;s<o;s++){n=arguments[s];for(var u in n)Object.prototype.hasOwnProperty.call(n,u)&&(r[u]=n[u])}return r},Nn.apply(this,arguments)};function S1(e,r){var n={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&r.indexOf(s)<0&&(n[s]=e[s]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var o=0,s=Object.getOwnPropertySymbols(e);o<s.length;o++)r.indexOf(s[o])<0&&Object.prototype.propertyIsEnumerable.call(e,s[o])&&(n[s[o]]=e[s[o]]);return n}function fL(e,r,n){if(n||arguments.length===2)for(var s=0,o=r.length,u;s<o;s++)(u||!(s in r))&&(u||(u=Array.prototype.slice.call(r,0,s)),u[s]=r[s]);return e.concat(u||Array.prototype.slice.call(r))}var Nd="right-scroll-bar-position",Id="width-before-scroll-bar",pL="with-scroll-bars-hidden",mL="--removed-body-scroll-bar-size";function Sm(e,r){return typeof e=="function"?e(r):e&&(e.current=r),e}function gL(e,r){var n=R.useState(function(){return{value:e,callback:r,facade:{get current(){return n.value},set current(s){var o=n.value;o!==s&&(n.value=s,n.callback(s,o))}}}})[0];return n.callback=r,n.facade}var vL=typeof window<"u"?R.useLayoutEffect:R.useEffect,RS=new WeakMap;function _L(e,r){var n=gL(null,function(s){return e.forEach(function(o){return Sm(o,s)})});return vL(function(){var s=RS.get(n);if(s){var o=new Set(s),u=new Set(e),f=n.current;o.forEach(function(l){u.has(l)||Sm(l,null)}),u.forEach(function(l){o.has(l)||Sm(l,f)})}RS.set(n,e)},[e]),n}function yL(e){return e}function SL(e,r){r===void 0&&(r=yL);var n=[],s=!1,o={read:function(){if(s)throw new Error("Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`.");return n.length?n[n.length-1]:e},useMedium:function(u){var f=r(u,s);return n.push(f),function(){n=n.filter(function(l){return l!==f})}},assignSyncMedium:function(u){for(s=!0;n.length;){var f=n;n=[],f.forEach(u)}n={push:function(l){return u(l)},filter:function(){return n}}},assignMedium:function(u){s=!0;var f=[];if(n.length){var l=n;n=[],l.forEach(u),f=n}var c=function(){var m=f;f=[],m.forEach(u)},h=function(){return Promise.resolve().then(c)};h(),n={push:function(m){f.push(m),h()},filter:function(m){return f=f.filter(m),n}}}};return o}function bL(e){e===void 0&&(e={});var r=SL(null);return r.options=Nn({async:!0,ssr:!1},e),r}var b1=function(e){var r=e.sideCar,n=S1(e,["sideCar"]);if(!r)throw new Error("Sidecar: please provide `sideCar` property to import the right car");var s=r.read();if(!s)throw new Error("Sidecar medium not found");return R.createElement(s,Nn({},n))};b1.isSideCarExport=!0;function CL(e,r){return e.useMedium(r),b1}var C1=bL(),bm=function(){},yh=R.forwardRef(function(e,r){var n=R.useRef(null),s=R.useState({onScrollCapture:bm,onWheelCapture:bm,onTouchMoveCapture:bm}),o=s[0],u=s[1],f=e.forwardProps,l=e.children,c=e.className,h=e.removeScrollBar,m=e.enabled,p=e.shards,y=e.sideCar,x=e.noRelative,A=e.noIsolation,w=e.inert,v=e.allowPinchZoom,S=e.as,g=S===void 0?"div":S,_=e.gapMode,T=S1(e,["forwardProps","children","className","removeScrollBar","enabled","shards","sideCar","noRelative","noIsolation","inert","allowPinchZoom","as","gapMode"]),M=y,k=_L([n,r]),L=Nn(Nn({},T),o);return R.createElement(R.Fragment,null,m&&R.createElement(M,{sideCar:C1,removeScrollBar:h,shards:p,noRelative:x,noIsolation:A,inert:w,setCallbacks:u,allowPinchZoom:!!v,lockRef:n,gapMode:_}),f?R.cloneElement(R.Children.only(l),Nn(Nn({},L),{ref:k})):R.createElement(g,Nn({},L,{className:c,ref:k}),l))});yh.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1};yh.classNames={fullWidth:Id,zeroRight:Nd};var wL=function(){if(typeof __webpack_nonce__<"u")return __webpack_nonce__};function xL(){if(!document)return null;var e=document.createElement("style");e.type="text/css";var r=wL();return r&&e.setAttribute("nonce",r),e}function EL(e,r){e.styleSheet?e.styleSheet.cssText=r:e.appendChild(document.createTextNode(r))}function AL(e){var r=document.head||document.getElementsByTagName("head")[0];r.appendChild(e)}var TL=function(){var e=0,r=null;return{add:function(n){e==0&&(r=xL())&&(EL(r,n),AL(r)),e++},remove:function(){e--,!e&&r&&(r.parentNode&&r.parentNode.removeChild(r),r=null)}}},RL=function(){var e=TL();return function(r,n){R.useEffect(function(){return e.add(r),function(){e.remove()}},[r&&n])}},w1=function(){var e=RL(),r=function(n){var s=n.styles,o=n.dynamic;return e(s,o),null};return r},DL={left:0,top:0,right:0,gap:0},Cm=function(e){return parseInt(e||"",10)||0},ML=function(e){var r=window.getComputedStyle(document.body),n=r[e==="padding"?"paddingLeft":"marginLeft"],s=r[e==="padding"?"paddingTop":"marginTop"],o=r[e==="padding"?"paddingRight":"marginRight"];return[Cm(n),Cm(s),Cm(o)]},kL=function(e){if(e===void 0&&(e="margin"),typeof window>"u")return DL;var r=ML(e),n=document.documentElement.clientWidth,s=window.innerWidth;return{left:r[0],top:r[1],right:r[2],gap:Math.max(0,s-n+r[2]-r[0])}},LL=w1(),ua="data-scroll-locked",OL=function(e,r,n,s){var o=e.left,u=e.top,f=e.right,l=e.gap;return n===void 0&&(n="margin"),`
|
|
330
|
+
*/const Wg=qe("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);function Wl(e){return(...r)=>{}}const ze={log:Wl(),info:Wl(),warn:Wl(),error:Wl(),debug:Wl()},on={audio:(...e)=>ze.log("🔊",...e),voice:(...e)=>ze.log("🎤",...e),ws:(...e)=>ze.log("🔌",...e),message:(...e)=>ze.log("💬",...e),session:(...e)=>ze.log("📋",...e),auth:(...e)=>ze.log("🔐",...e)};function tk({onScan:e,onBack:r}){const[n,s]=R.useState(null),[o,u]=R.useState(null),f=R.useCallback(c=>{if(c.length>0){const h=c[0];h!=null&&h.rawValue&&e(h.rawValue)}},[e]),l=R.useCallback(c=>{ze.error("QR Scanner error:",c),c instanceof Error?c.name==="NotAllowedError"?(u(!1),s("Camera access denied. Please allow camera access in your browser settings.")):c.name==="NotFoundError"?s("No camera found on this device."):s(c.message):s("Failed to access camera")},[]);return b.jsxs("div",{className:"space-y-4",children:[b.jsxs("div",{className:"aspect-square bg-muted rounded-lg overflow-hidden relative",children:[o===!1?b.jsxs("div",{className:"absolute inset-0 flex flex-col items-center justify-center p-4 text-center",children:[b.jsx(IM,{className:"w-12 h-12 text-muted-foreground mb-4"}),b.jsx("p",{className:"text-sm text-muted-foreground",children:n})]}):n?b.jsxs("div",{className:"absolute inset-0 flex flex-col items-center justify-center p-4 text-center",children:[b.jsx(PM,{className:"w-12 h-12 text-muted-foreground mb-4"}),b.jsx("p",{className:"text-sm text-destructive",children:n})]}):b.jsx(RM,{onScan:f,onError:l,constraints:{facingMode:"environment"},styles:{container:{width:"100%",height:"100%"},video:{width:"100%",height:"100%",objectFit:"cover"}},components:{finder:!0}}),!n&&o!==!1&&b.jsxs("div",{className:"absolute inset-0 pointer-events-none",children:[b.jsx("div",{className:"absolute inset-8 border-2 border-primary rounded-lg opacity-50"}),b.jsxs("div",{className:"absolute inset-8 animate-pulse",children:[b.jsx("div",{className:"absolute top-0 left-0 w-8 h-8 border-t-4 border-l-4 border-primary rounded-tl-lg"}),b.jsx("div",{className:"absolute top-0 right-0 w-8 h-8 border-t-4 border-r-4 border-primary rounded-tr-lg"}),b.jsx("div",{className:"absolute bottom-0 left-0 w-8 h-8 border-b-4 border-l-4 border-primary rounded-bl-lg"}),b.jsx("div",{className:"absolute bottom-0 right-0 w-8 h-8 border-b-4 border-r-4 border-primary rounded-br-lg"})]})]})]}),b.jsx("p",{className:"text-sm text-center text-muted-foreground",children:"Point your camera at the QR code shown in your workstation terminal"}),b.jsxs(dt,{variant:"outline",className:"w-full",onClick:r,children:[b.jsx(OM,{className:"w-4 h-4"}),"Back to Magic Link"]})]})}const _S={supervisorMessages:[],agentMessages:{},supervisorIsLoading:!1,agentIsLoading:{},historyPaginationState:{},supervisorStreamingMessageId:null,agentStreamingMessageIds:{},pendingMessageAcks:new Set},ut=Ug(e=>({..._S,addSupervisorMessage:r=>e(n=>n.supervisorMessages.some(s=>s.id===r.id)?(console.debug("[ChatStore] Skipping duplicate supervisor message:",r.id),n):{supervisorMessages:[...n.supervisorMessages,r]}),updateSupervisorMessage:(r,n)=>e(s=>({supervisorMessages:s.supervisorMessages.map(o=>o.id===r?{...o,...n}:o)})),updateSupervisorStreamingBlocks:(r,n)=>e(s=>({supervisorMessages:s.supervisorMessages.map(o=>o.id===r?{...o,contentBlocks:n}:o)})),setSupervisorIsLoading:r=>e({supervisorIsLoading:r}),setSupervisorStreamingMessageId:r=>e({supervisorStreamingMessageId:r}),clearSupervisorMessages:()=>e({supervisorMessages:[]}),addAgentMessage:(r,n)=>e(s=>{const o=s.agentMessages[r]??[];return o.some(u=>u.id===n.id)?(console.debug("[ChatStore] Skipping duplicate agent message:",n.id,"session:",r),s):{agentMessages:{...s.agentMessages,[r]:[...o,n]}}}),updateAgentMessage:(r,n,s)=>e(o=>({agentMessages:{...o.agentMessages,[r]:(o.agentMessages[r]??[]).map(u=>u.id===n?{...u,...s}:u)}})),updateAgentStreamingBlocks:(r,n,s)=>e(o=>({agentMessages:{...o.agentMessages,[r]:(o.agentMessages[r]??[]).map(u=>u.id===n?{...u,contentBlocks:s}:u)}})),setAgentIsLoading:(r,n)=>e(s=>({agentIsLoading:{...s.agentIsLoading,[r]:n}})),setAgentStreamingMessageId:(r,n)=>e(s=>({agentStreamingMessageIds:{...s.agentStreamingMessageIds,[r]:n??""}})),clearAgentMessages:r=>e(n=>({agentMessages:{...n.agentMessages,[r]:[]}})),setMessageSendStatus:(r,n)=>e(s=>{if(s.supervisorMessages.find(f=>f.id===r))return{supervisorMessages:s.supervisorMessages.map(f=>f.id===r?{...f,sendStatus:n}:f)};const u={...s.agentMessages};for(const f in u){const l=u[f];if(l&&l.findIndex(h=>h.id===r)!==-1)return u[f]=l.map(h=>h.id===r?{...h,sendStatus:n}:h),{agentMessages:u}}return{}}),addPendingAck:r=>e(n=>({pendingMessageAcks:new Set([...n.pendingMessageAcks,r])})),removePendingAck:r=>e(n=>{const s=new Set(n.pendingMessageAcks);return s.delete(r),{pendingMessageAcks:s}}),setHistoryPaginationState:(r,n)=>e(s=>({historyPaginationState:{...s.historyPaginationState,[r]:n}})),prependSupervisorMessages:r=>e(n=>{const s=new Set(n.supervisorMessages.map(u=>u.id)),o=r.filter(u=>!s.has(u.id));return o.length<r.length&&console.debug("[ChatStore] Filtered",r.length-o.length,"duplicate supervisor messages during prepend"),{supervisorMessages:[...o,...n.supervisorMessages]}}),prependAgentMessages:(r,n)=>e(s=>{const o=s.agentMessages[r]??[],u=new Set(o.map(l=>l.id)),f=n.filter(l=>!u.has(l.id));return f.length<n.length&&console.debug("[ChatStore] Filtered",n.length-f.length,"duplicate agent messages during prepend for session:",r),{agentMessages:{...s.agentMessages,[r]:[...f,...o]}}}),reset:()=>e(_S)})),rk=5e3,nk=1e4,ik=1e4,sk=5e3,ok=500,ak=5e3,dh=class dh{constructor(){_e(this,"ws",null);_e(this,"credentials",null);_e(this,"callbacks",null);_e(this,"pingInterval",null);_e(this,"heartbeatInterval",null);_e(this,"pongTimeout",null);_e(this,"heartbeatTimeout",null);_e(this,"reconnectTimeout",null);_e(this,"reconnectAttempts",0);_e(this,"isConnecting",!1);_e(this,"isAuthenticated",!1);_e(this,"intentionalDisconnect",!1);_e(this,"pendingRequests",new Map)}init(r){this.callbacks=r}async connect(r){var n,s,o;if(!(this.isConnecting||((n=this.ws)==null?void 0:n.readyState)===WebSocket.OPEN)){this.credentials=r,this.intentionalDisconnect=!1,this.isConnecting=!0,(s=this.callbacks)==null||s.onConnectionStateChange("connecting");try{await this.establishConnection()}catch(u){throw this.isConnecting=!1,(o=this.callbacks)==null||o.onConnectionStateChange("error"),u}}}disconnect(){var r;this.intentionalDisconnect=!0,this.cleanup(),(r=this.callbacks)==null||r.onConnectionStateChange("disconnected")}async sendRequest(r){return new Promise((n,s)=>{if(!this.ws||this.ws.readyState!==WebSocket.OPEN){s(new Error("WebSocket not connected"));return}this.pendingRequests.size>=dh.MAX_PENDING_REQUESTS&&this.cleanupStaleRequests();const o=setTimeout(()=>{this.pendingRequests.delete(r.id),s(new Error("Request timeout"))},3e4);this.pendingRequests.set(r.id,{resolve:u=>{clearTimeout(o),n(u)},reject:u=>{clearTimeout(o),s(u)},timestamp:Date.now()}),this.send(r)})}send(r){var n;((n=this.ws)==null?void 0:n.readyState)===WebSocket.OPEN&&this.ws.send(JSON.stringify(r))}isConnected(){var r;return((r=this.ws)==null?void 0:r.readyState)===WebSocket.OPEN&&this.isAuthenticated}reconnect(){this.credentials&&!this.isConnecting&&(this.intentionalDisconnect=!1,this.reconnectAttempts=0,this.cleanup(),this.connect(this.credentials).catch(r=>{ze.error("Manual reconnection failed:",r)}))}getReconnectAttempts(){return this.reconnectAttempts}async establishConnection(){return new Promise((r,n)=>{if(!this.credentials){n(new Error("No credentials"));return}try{this.ws=new WebSocket(this.credentials.tunnelUrl)}catch(o){n(o);return}const s=setTimeout(()=>{var o;(o=this.ws)==null||o.close(),n(new Error("Connection timeout"))},3e4);this.ws.onopen=()=>{var o;clearTimeout(s),(o=this.callbacks)==null||o.onConnectionStateChange("connected"),this.sendConnectMessage()},this.ws.onclose=o=>{clearTimeout(s),this.handleClose(o),this.isAuthenticated||n(new Error("Connection closed before authentication"))},this.ws.onerror=o=>{var u;clearTimeout(s),ze.error("WebSocket error:",o),(u=this.callbacks)==null||u.onConnectionStateChange("error")},this.ws.onmessage=o=>{try{const u=JSON.parse(o.data);this.handleMessage(u,r,n)}catch(u){ze.error("Failed to parse message:",u)}}})}sendConnectMessage(){var n;if(!this.credentials)return;const r={type:"connect",payload:{tunnel_id:this.credentials.tunnelId,auth_key:this.credentials.authKey,device_id:this.credentials.deviceId,reconnect:this.reconnectAttempts>0}};this.send(r),(n=this.callbacks)==null||n.onConnectionStateChange("authenticating")}sendAuthMessage(){if(!this.credentials)return;const r={type:"auth",payload:{auth_key:this.credentials.authKey,device_id:this.credentials.deviceId}};this.send(r)}handleMessage(r,n,s){var o,u,f,l,c,h;if(r.id&&this.pendingRequests.has(r.id)){const m=this.pendingRequests.get(r.id);if(this.pendingRequests.delete(r.id),r.type==="error"){const p=r.payload;m==null||m.reject(new Error(`${p.code}: ${p.message}`))}else m==null||m.resolve(r);return}switch(r.type){case"connected":this.sendAuthMessage();break;case"auth.success":this.isConnecting=!1,this.isAuthenticated=!0,this.reconnectAttempts=0,(o=this.callbacks)==null||o.onConnectionStateChange("authenticated"),this.startHeartbeat(),this.requestSync(),(u=this.callbacks)==null||u.onMessage(r),n==null||n();break;case"auth.error":{this.isConnecting=!1,(f=this.callbacks)==null||f.onConnectionStateChange("error");const m=r.payload;s==null||s(new Error(`Auth failed: ${m.message}`));break}case"pong":this.handlePong();break;case"heartbeat.ack":this.handleHeartbeatAck();break;case"connection.workstation_online":(l=this.callbacks)==null||l.onWorkstationOnline();break;case"connection.workstation_offline":(c=this.callbacks)==null||c.onWorkstationOffline();break;default:(h=this.callbacks)==null||h.onMessage(r)}}startHeartbeat(){this.stopHeartbeat(),this.pingInterval=setInterval(()=>{this.sendPing()},rk),this.heartbeatInterval=setInterval(()=>{this.sendHeartbeat()},ik),this.sendHeartbeat()}stopHeartbeat(){this.pingInterval&&(clearInterval(this.pingInterval),this.pingInterval=null),this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null),this.pongTimeout&&(clearTimeout(this.pongTimeout),this.pongTimeout=null),this.heartbeatTimeout&&(clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=null)}sendPing(){this.send({type:"ping",timestamp:Date.now()}),this.pongTimeout=setTimeout(()=>{var r;ze.warn("Pong timeout - connection may be stale"),(r=this.callbacks)==null||r.onConnectionStateChange("degraded")},nk)}handlePong(){this.pongTimeout&&(clearTimeout(this.pongTimeout),this.pongTimeout=null)}sendHeartbeat(){const r={type:"heartbeat",id:crypto.randomUUID(),timestamp:Date.now()};this.send(r),this.heartbeatTimeout=setTimeout(()=>{var n;ze.warn("Heartbeat timeout - connection may be stale"),(n=this.callbacks)==null||n.onConnectionStateChange("degraded")},sk)}handleHeartbeatAck(){var r;this.heartbeatTimeout&&(clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=null),(r=this.callbacks)==null||r.onConnectionStateChange("verified")}requestSync(){const r={type:"sync",id:crypto.randomUUID(),lightweight:this.reconnectAttempts>0};this.send(r)}handleClose(r){var n,s;if(this.cleanup(),this.intentionalDisconnect){(n=this.callbacks)==null||n.onConnectionStateChange("disconnected");return}on.ws("WebSocket closed:",r.code,r.reason),(s=this.callbacks)==null||s.onConnectionStateChange("disconnected"),this.scheduleReconnect()}scheduleReconnect(){if(this.intentionalDisconnect||!this.credentials)return;const r=Math.min(ok*Math.pow(2,this.reconnectAttempts),ak);this.reconnectAttempts++,on.ws(`Reconnecting in ${r}ms (attempt ${this.reconnectAttempts})`),this.reconnectTimeout=setTimeout(()=>{this.credentials&&!this.intentionalDisconnect&&this.connect(this.credentials).catch(n=>{ze.error("Reconnection failed:",n)})},r)}cleanupStaleRequests(){const r=Date.now(),n=6e4;for(const[s,o]of this.pendingRequests)r-o.timestamp>n&&(o.reject(new Error("Request expired")),this.pendingRequests.delete(s))}cleanup(){this.stopHeartbeat(),this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=null),this.ws&&(this.ws.onopen=null,this.ws.onclose=null,this.ws.onerror=null,this.ws.onmessage=null,(this.ws.readyState===WebSocket.OPEN||this.ws.readyState===WebSocket.CONNECTING)&&this.ws.close(1e3,"Client disconnect"),this.ws=null),this.isConnecting=!1,this.isAuthenticated=!1;for(const[r,n]of this.pendingRequests)n.reject(new Error("Connection closed")),this.pendingRequests.delete(r)}};_e(dh,"MAX_PENDING_REQUESTS",100);let rg=dh;const Mt=new rg;function lk(e,r){let n;try{n=e()}catch{return}return{getItem:o=>{var u;const f=c=>c===null?null:JSON.parse(c,void 0),l=(u=n.getItem(o))!=null?u:null;return l instanceof Promise?l.then(f):f(l)},setItem:(o,u)=>n.setItem(o,JSON.stringify(u,void 0)),removeItem:o=>n.removeItem(o)}}const ng=e=>r=>{try{const n=e(r);return n instanceof Promise?n:{then(s){return ng(s)(n)},catch(s){return this}}}catch(n){return{then(s){return this},catch(s){return ng(s)(n)}}}},ck=(e,r)=>(n,s,o)=>{let u={storage:lk(()=>localStorage),partialize:w=>w,version:0,merge:(w,v)=>({...v,...w}),...r},f=!1;const l=new Set,c=new Set;let h=u.storage;if(!h)return e((...w)=>{console.warn(`[zustand persist middleware] Unable to update item '${u.name}', the given storage is currently unavailable.`),n(...w)},s,o);const m=()=>{const w=u.partialize({...s()});return h.setItem(u.name,{state:w,version:u.version})},p=o.setState;o.setState=(w,v)=>(p(w,v),m());const y=e((...w)=>(n(...w),m()),s,o);o.getInitialState=()=>y;let x;const A=()=>{var w,v;if(!h)return;f=!1,l.forEach(g=>{var _;return g((_=s())!=null?_:y)});const S=((v=u.onRehydrateStorage)==null?void 0:v.call(u,(w=s())!=null?w:y))||void 0;return ng(h.getItem.bind(h))(u.name).then(g=>{if(g)if(typeof g.version=="number"&&g.version!==u.version){if(u.migrate){const _=u.migrate(g.state,g.version);return _ instanceof Promise?_.then(T=>[!0,T]):[!0,_]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return[!1,g.state];return[!1,void 0]}).then(g=>{var _;const[T,M]=g;if(x=u.merge(M,(_=s())!=null?_:y),n(x,!0),T)return m()}).then(()=>{S==null||S(x,void 0),x=s(),f=!0,c.forEach(g=>g(x))}).catch(g=>{S==null||S(void 0,g)})};return o.persist={setOptions:w=>{u={...u,...w},w.storage&&(h=w.storage)},clearStorage:()=>{h==null||h.removeItem(u.name)},getOptions:()=>u,rehydrate:()=>A(),hasHydrated:()=>f,onHydrate:w=>(l.add(w),()=>{l.delete(w)}),onFinishHydration:w=>(c.add(w),()=>{c.delete(w)})},u.skipHydration||A(),x||y},uk=ck,a1=200,l1=480,dk=320,hk=64,yS={ttsEnabled:!0,sttLanguage:"en",sidebarCollapsed:!1,sidebarWidth:dk},Pn=Ug()(uk(e=>({...yS,setTtsEnabled:r=>e({ttsEnabled:r}),setSttLanguage:r=>e({sttLanguage:r}),setSidebarCollapsed:r=>e({sidebarCollapsed:r}),setSidebarWidth:r=>e({sidebarWidth:Math.max(a1,Math.min(l1,r))}),toggleSidebar:()=>e(r=>({sidebarCollapsed:!r.sidebarCollapsed})),reset:()=>e(yS)}),{name:"tiflis-settings"})),fk="audio/wav";class pk{constructor(){_e(this,"audioCache",new Map);_e(this,"currentMessageId",null);_e(this,"isCurrentlyLoading",!1);_e(this,"CACHE_DURATION_MS",900*1e3);_e(this,"MAX_CACHE_SIZE",50);_e(this,"sharedAudio");_e(this,"audioContext",null);_e(this,"isUnlocked",!1);_e(this,"pendingAutoPlay",null);_e(this,"listeners",new Set);_e(this,"animationFrameId",null);this.sharedAudio=new Audio,this.sharedAudio.preload="auto",this.setupSharedAudioListeners(),this.setupAudioUnlock()}setupSharedAudioListeners(){this.sharedAudio.addEventListener("play",()=>{this.startProgressTracking(),this.notifyListeners()}),this.sharedAudio.addEventListener("pause",()=>{this.stopProgressTracking(),this.notifyListeners()}),this.sharedAudio.addEventListener("ended",()=>{this.stopProgressTracking(),this.sharedAudio.currentTime=0,this.notifyListeners()}),this.sharedAudio.addEventListener("loadedmetadata",()=>{this.isCurrentlyLoading=!1,this.notifyListeners()}),this.sharedAudio.addEventListener("canplay",()=>{this.isCurrentlyLoading=!1,this.notifyListeners()}),this.sharedAudio.addEventListener("error",()=>{this.isCurrentlyLoading=!1,this.notifyListeners("Failed to load audio")})}subscribe(r){return this.listeners.add(r),r(this.getState()),()=>{this.listeners.delete(r)}}getState(){return{messageId:this.currentMessageId,isPlaying:!this.sharedAudio.paused,isLoading:this.isCurrentlyLoading,currentTime:this.sharedAudio.currentTime,duration:isNaN(this.sharedAudio.duration)?0:this.sharedAudio.duration,error:null}}notifyListeners(r){const n={...this.getState(),error:r??null};this.listeners.forEach(s=>s(n))}startProgressTracking(){if(this.animationFrameId!==null)return;const r=()=>{this.notifyListeners(),this.sharedAudio.paused?this.animationFrameId=null:this.animationFrameId=requestAnimationFrame(r)};this.animationFrameId=requestAnimationFrame(r)}stopProgressTracking(){this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null)}getAudioContext(){return this.audioContext||(this.audioContext=new(window.AudioContext||window.webkitAudioContext)),this.audioContext}setupAudioUnlock(){const r=async()=>{if(!this.isUnlocked)try{const n=this.getAudioContext();n.state==="suspended"&&await n.resume(),this.sharedAudio.src="data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA",this.sharedAudio.volume=.01;try{await this.sharedAudio.play(),this.sharedAudio.pause(),this.sharedAudio.currentTime=0,this.sharedAudio.volume=1}catch{}if(this.isUnlocked=!0,ze.log("Audio unlocked via user interaction"),this.pendingAutoPlay){const{base64Audio:s,messageId:o}=this.pendingAutoPlay;this.pendingAutoPlay=null,setTimeout(()=>{this.playAudio(s,o,!0)},50)}document.removeEventListener("touchstart",r),document.removeEventListener("touchend",r),document.removeEventListener("click",r),document.removeEventListener("keydown",r)}catch(n){ze.warn("Audio unlock failed, will retry:",n)}};document.addEventListener("touchstart",r,{once:!1,passive:!0}),document.addEventListener("touchend",r,{once:!1,passive:!0}),document.addEventListener("click",r,{once:!1,passive:!0}),document.addEventListener("keydown",r,{once:!1,passive:!0})}isAudioUnlocked(){return this.isUnlocked}async unlockIfNeeded(){if(!this.isUnlocked)try{const r=this.getAudioContext();if(r.state==="suspended"&&await r.resume(),this.sharedAudio.src="data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA",this.sharedAudio.volume=.01,await this.sharedAudio.play(),this.sharedAudio.pause(),this.sharedAudio.currentTime=0,this.sharedAudio.volume=1,this.isUnlocked=!0,ze.log("Audio manually unlocked"),this.pendingAutoPlay){const{base64Audio:n,messageId:s}=this.pendingAutoPlay;this.pendingAutoPlay=null,this.playAudio(n,s,!0)}}catch(r){ze.warn("Manual audio unlock failed:",r),this.isUnlocked=!0}}isMobileDevice(){return/iPhone|iPad|iPod|Android/i.test(navigator.userAgent)}playAudio(r,n,s){if(ze.log(`playAudio: messageId=${n}, autoPlay=${s}, isUnlocked=${this.isUnlocked}, isMobile=${this.isMobileDevice()}`),this.cacheAudio(r,n),s&&!this.isUnlocked&&this.isMobileDevice()){ze.log("Mobile: Audio not unlocked yet, queuing for auto-play"),this.pendingAutoPlay={base64Audio:r,messageId:n};return}this.stop(),this.currentMessageId=n,this.isCurrentlyLoading=!0,this.notifyListeners(),this.sharedAudio.src=`data:${fk};base64,${r}`,s?this.sharedAudio.play().then(()=>{this.isUnlocked=!0}).catch(o=>{o.name==="NotAllowedError"?(ze.log("Auto-play blocked by browser policy, user can play manually"),this.isMobileDevice()&&(this.pendingAutoPlay={base64Audio:r,messageId:n})):ze.warn("Play failed:",o.name,o.message),this.isCurrentlyLoading=!1,this.notifyListeners()}):this.sharedAudio.load()}cacheAudio(r,n){if(this.audioCache.has(n))return;this.audioCache.size>=this.MAX_CACHE_SIZE&&this.evictLRU();const s=Date.now();this.audioCache.set(n,{base64:r,expiresAt:s+this.CACHE_DURATION_MS,accessedAt:s}),this.cleanupCache()}playByMessageId(r){const n=this.audioCache.get(r);return n&&Date.now()<n.expiresAt?(n.accessedAt=Date.now(),this.playAudio(n.base64,r,!0),!0):!1}togglePlay(){this.sharedAudio.paused?this.sharedAudio.play().catch(r=>{ze.warn("Toggle play failed:",r)}):this.sharedAudio.pause()}seek(r){this.sharedAudio.duration&&(this.sharedAudio.currentTime=r*this.sharedAudio.duration,this.notifyListeners())}seekToTime(r){this.sharedAudio.currentTime=r,this.notifyListeners()}resetToStart(){this.sharedAudio.currentTime=0,this.notifyListeners()}getAudioBase64(r){const n=this.audioCache.get(r);return n&&Date.now()<n.expiresAt?n.base64:null}getAudio(r){return this.currentMessageId===r?this.sharedAudio:this.hasAudio(r)?this.sharedAudio:null}hasAudio(r){const n=this.audioCache.get(r);return n!==void 0&&Date.now()<n.expiresAt}registerAudio(r,n){n&&(this.currentMessageId=n),this.notifyListeners()}unregisterAudio(r){}stop(){this.stopProgressTracking(),this.sharedAudio.pause(),this.sharedAudio.currentTime=0,this.currentMessageId=null,this.isCurrentlyLoading=!1,this.notifyListeners()}stopAll(){this.stop()}isPlaying(){return!this.sharedAudio.paused}getCurrentMessageId(){return this.currentMessageId}cleanupCache(){const r=Date.now();for(const[n,s]of this.audioCache.entries())r>=s.expiresAt&&this.audioCache.delete(n)}evictLRU(){let r=null,n=1/0;for(const[s,o]of this.audioCache.entries())o.accessedAt<n&&(n=o.accessedAt,r=s);r&&this.audioCache.delete(r)}}const It=new pk;function _i(e){const r=e.filter(n=>n.block_type==="voice_output"||n.block_type==="voice_input");return r.length>0&&on.audio("parseContentBlocks - voice blocks from server:",r),e.map(n=>({id:n.id,blockType:n.block_type,content:n.content,metadata:n.metadata?{language:n.metadata.language,toolName:n.metadata.tool_name,toolUseId:n.metadata.tool_use_id,toolInput:n.metadata.tool_input,toolOutput:n.metadata.tool_output,toolStatus:n.metadata.tool_status,audioUrl:n.metadata.audio_url,audioBase64:n.metadata.audio_base64,messageId:n.metadata.message_id,duration:n.metadata.duration,hasAudio:n.metadata.has_audio,errorCode:n.metadata.error_code}:void 0}))}const ma={supervisorInProgress:!1,agentSessionsInProgress:new Set,pendingUpdates:new Map,isHistoryLoadingForSession(e){return e==="supervisor"?this.supervisorInProgress:this.agentSessionsInProgress.has(e)},markHistoryLoadStart(e){e==="supervisor"?this.supervisorInProgress=!0:this.agentSessionsInProgress.add(e)},markHistoryLoadEnd(e){e==="supervisor"?this.supervisorInProgress=!1:this.agentSessionsInProgress.delete(e),this.processPendingUpdates(e)},queueUpdate(e,r){const n=this.pendingUpdates.get(e)??[];n.push(r),this.pendingUpdates.set(e,n)},processPendingUpdates(e){const r=this.pendingUpdates.get(e)??[];this.pendingUpdates.delete(e);for(const n of r)try{n()}catch(s){ze.error({error:s,sessionKey:e},"Error processing pending update")}}},c1={lastSupervisorSequence:0,lastAgentSequences:new Map,checkSupervisorSequence(e){e!==void 0&&(e>this.lastSupervisorSequence+1&&ze.warn({expected:this.lastSupervisorSequence+1,received:e},"Detected supervisor message gap - messages may have been lost"),this.lastSupervisorSequence=e)},checkAgentSequence(e,r){if(r!==void 0){const n=this.lastAgentSequences.get(e)??0;r>n+1&&ze.warn({sessionId:e,expected:n+1,received:r},"Detected agent message gap - messages may have been lost"),this.lastAgentSequences.set(e,r)}}};function mk(e){const r=e;switch(r.type){case"auth.success":gk(r);break;case"sync.state":vk(r);break;case"history.response":_k(r);break;case"session.created":yk(r);break;case"session.terminated":bk(r);break;case"session.subscribed":Sk(r);break;case"supervisor.output":u1(r);break;case"supervisor.user_message":Ck(r);break;case"supervisor.context_cleared":wk();break;case"session.output":d1(r);break;case"session.replay.data":xk(r);break;case"session.user_message":Ek(r);break;case"message.ack":Ak(r);break;case"supervisor.voice_output":Tk(r);break;case"session.voice_output":Rk(r);break;case"supervisor.transcription":Dk(r);break;case"session.transcription":Mk(r);break;case"response":break;case"error":ze.error("Server error:",r.payload);break;default:ze.log("Unhandled message type:",r.type)}}function gk(e){Ve.getState().setWorkstationInfo({name:e.payload.workstation_name??"Unknown",version:e.payload.workstation_version??"",protocolVersion:e.payload.protocol_version??"",workspacesRoot:e.payload.workspaces_root??""})}function vk(e){const r=Ve.getState(),n=ut.getState(),s=e.payload.sessions.map(o=>({id:o.session_id,type:o.session_type,status:o.status,agentName:o.agent_name,workspace:o.workspace,project:o.project,worktree:o.worktree,workingDir:o.working_dir,createdAt:o.created_at?new Date(o.created_at):new Date}));if(r.setSessions(s),e.payload.availableAgents){const o=e.payload.availableAgents.map(u=>({name:u.name,baseType:u.base_type,displayName:u.name.charAt(0).toUpperCase()+u.name.slice(1),description:u.description,isAlias:u.is_alias}));r.setAvailableAgents(o)}if(e.payload.workspaces){const o=e.payload.workspaces.map(u=>({name:u.name,projects:u.projects.map(f=>({name:f.name,isGitRepo:f.is_git_repo,defaultBranch:f.default_branch}))}));r.setWorkspaces(o)}n.setHistoryPaginationState("supervisor",{oldestSequence:void 0,hasMore:!0,isLoading:!0}),ze.log("Sending supervisor history.request"),Mt.send({type:"history.request",id:crypto.randomUUID(),payload:{session_id:null,limit:50}})}function _k(e){const r=ut.getState(),{session_id:n,history:s,has_more:o,oldest_sequence:u,is_executing:f,current_streaming_blocks:l,streaming_message_id:c}=e.payload;ze.log("history.response received:",{session_id:n,historyCount:(s==null?void 0:s.length)??0,has_more:o,oldest_sequence:u,streaming_message_id:c});const h=n??"supervisor";ma.markHistoryLoadStart(h);try{if(r.setHistoryPaginationState(h,{oldestSequence:u,hasMore:o,isLoading:!1}),s.length===0)return;const p=[...s].sort((y,x)=>y.sequence-x.sequence).map(y=>({id:y.message_id??crypto.randomUUID(),sessionId:h,role:y.role,contentBlocks:y.content_blocks?_i(y.content_blocks):[{id:crypto.randomUUID(),blockType:"text",content:y.content}],isStreaming:!1,createdAt:new Date(y.createdAt)}));if(n===null){if(r.prependSupervisorMessages(p),f&&r.setSupervisorIsLoading(!0),l&&l.length>0){const y=c??crypto.randomUUID();if(r.supervisorStreamingMessageId===y)r.updateSupervisorStreamingBlocks(y,_i(l));else if(!r.supervisorMessages.some(A=>A.id===y)){const A={id:y,sessionId:"supervisor",role:"assistant",contentBlocks:_i(l),isStreaming:!0,createdAt:new Date};r.addSupervisorMessage(A),r.setSupervisorStreamingMessageId(y),r.setSupervisorIsLoading(!0)}}}else if(r.prependAgentMessages(n,p),f&&r.setAgentIsLoading(n,!0),l&&l.length>0){const y=c??crypto.randomUUID();if(r.agentStreamingMessageIds[n]===y)r.updateAgentStreamingBlocks(n,y,_i(l));else if(!(r.agentMessages[n]??[]).some(w=>w.id===y)){const w={id:y,sessionId:n,role:"assistant",contentBlocks:_i(l),isStreaming:!0,createdAt:new Date};r.addAgentMessage(n,w),r.setAgentStreamingMessageId(n,y),r.setAgentIsLoading(n,!0)}}}finally{ma.markHistoryLoadEnd(h)}}function yk(e){const r=Ve.getState(),n={id:e.session_id,type:e.payload.session_type,status:"active",agentName:e.payload.agent_name,workspace:e.payload.workspace,project:e.payload.project,worktree:e.payload.worktree,workingDir:e.payload.working_dir,createdAt:e.payload.created_at?new Date(e.payload.created_at):new Date,terminalConfig:e.payload.terminal_config?{cols:80,rows:24,bufferSize:e.payload.terminal_config.buffer_size}:void 0};r.addSession(n)}function Sk(e){const r=ut.getState(),n=e.session_id,o=Ve.getState().sessions.find(u=>u.id===n);if((o==null?void 0:o.type)!=="terminal"&&(e.is_executing&&r.setAgentIsLoading(n,!0),r.setHistoryPaginationState(n,{oldestSequence:void 0,hasMore:!0,isLoading:!0}),ze.log("Sending agent history.request",{sessionId:n}),Mt.send({type:"history.request",id:crypto.randomUUID(),payload:{session_id:n,limit:50}}),e.current_streaming_blocks&&e.current_streaming_blocks.length>0)){const u=e.streaming_message_id??crypto.randomUUID();if(r.agentStreamingMessageIds[n]===u)r.updateAgentStreamingBlocks(n,u,_i(e.current_streaming_blocks));else if(!(r.agentMessages[n]??[]).some(c=>c.id===u)){const c={id:u,sessionId:n,role:"assistant",contentBlocks:_i(e.current_streaming_blocks),isStreaming:!0,createdAt:new Date};r.addAgentMessage(n,c),r.setAgentStreamingMessageId(n,u),r.setAgentIsLoading(n,!0)}}}function bk(e){Ve.getState().removeSession(e.session_id)}function u1(e){if(c1.checkSupervisorSequence(e.sequence),ma.isHistoryLoadingForSession("supervisor")){ma.queueUpdate("supervisor",()=>u1(e));return}const r=ut.getState(),n=r.supervisorStreamingMessageId,s=e.streaming_message_id,o=_i(e.payload.content_blocks),u=o.length>0&&o.some(f=>f.content||f.blockType==="tool"||f.blockType==="voice_output");if(s&&n&&n!==s&&r.supervisorMessages.some(f=>f.id===s)){u&&r.updateSupervisorStreamingBlocks(s,o),e.payload.is_complete&&(r.updateSupervisorMessage(s,{isStreaming:!1}),r.setSupervisorStreamingMessageId(null),r.setSupervisorIsLoading(!1));return}if(n)u&&r.updateSupervisorStreamingBlocks(n,o),e.payload.is_complete&&(r.updateSupervisorMessage(n,{isStreaming:!1}),r.setSupervisorStreamingMessageId(null),r.setSupervisorIsLoading(!1));else{if(!u&&e.payload.is_complete)return;const f=s??crypto.randomUUID();if(r.supervisorMessages.some(c=>c.id===f)){u&&r.updateSupervisorStreamingBlocks(f,o),e.payload.is_complete?(r.updateSupervisorMessage(f,{isStreaming:!1}),r.setSupervisorStreamingMessageId(null),r.setSupervisorIsLoading(!1)):(r.setSupervisorStreamingMessageId(f),r.setSupervisorIsLoading(!0));return}const l={id:f,sessionId:"supervisor",role:"assistant",contentBlocks:o,isStreaming:!e.payload.is_complete,createdAt:new Date(e.payload.timestamp)};r.addSupervisorMessage(l),e.payload.is_complete||(r.setSupervisorStreamingMessageId(l.id),r.setSupervisorIsLoading(!0))}}function Ck(e){const r=ut.getState(),s=Ve.getState().credentials;if(s&&e.payload.from_device_id===s.deviceId)return;const o={id:crypto.randomUUID(),sessionId:"supervisor",role:"user",contentBlocks:[{id:crypto.randomUUID(),blockType:"text",content:e.payload.content}],isStreaming:!1,createdAt:new Date(e.payload.timestamp),fromDeviceId:e.payload.from_device_id};r.addSupervisorMessage(o)}function wk(){ut.getState().clearSupervisorMessages()}function xk(e){const r=e.session_id,{messages:n}=e.payload;if(ze.debug("Terminal replay received",{sessionId:r,messageCount:n.length,hasMore:e.payload.has_more,firstSequence:e.payload.first_sequence,lastSequence:e.payload.last_sequence}),n.length===0)return;const o=[...n].sort((u,f)=>u.sequence-f.sequence).map(u=>u.content).join("");window.dispatchEvent(new CustomEvent("terminal-output",{detail:{sessionId:r,data:o}}))}function d1(e){const r=e.session_id;if(c1.checkAgentSequence(r,e.sequence),ma.isHistoryLoadingForSession(r)){ma.queueUpdate(r,()=>d1(e));return}const n=ut.getState();if(e.payload.content_type==="terminal"){window.dispatchEvent(new CustomEvent("terminal-output",{detail:{sessionId:r,data:e.payload.content}}));return}const s=n.agentStreamingMessageIds[r],o=e.streaming_message_id,u=e.payload.content_blocks?_i(e.payload.content_blocks):[{id:crypto.randomUUID(),blockType:"text",content:e.payload.content}],f=u.length>0&&u.some(l=>l.content||l.blockType==="tool"||l.blockType==="voice_output");if(o&&s&&s!==o&&(n.agentMessages[r]??[]).some(c=>c.id===o)){f&&n.updateAgentStreamingBlocks(r,o,u),e.payload.is_complete&&(n.updateAgentMessage(r,o,{isStreaming:!1}),n.setAgentStreamingMessageId(r,null),n.setAgentIsLoading(r,!1));return}if(s)f&&n.updateAgentStreamingBlocks(r,s,u),e.payload.is_complete&&(n.updateAgentMessage(r,s,{isStreaming:!1}),n.setAgentStreamingMessageId(r,null),n.setAgentIsLoading(r,!1));else{if(!f&&e.payload.is_complete)return;const l=o??crypto.randomUUID();if((n.agentMessages[r]??[]).some(m=>m.id===l)){f&&n.updateAgentStreamingBlocks(r,l,u),e.payload.is_complete?(n.updateAgentMessage(r,l,{isStreaming:!1}),n.setAgentStreamingMessageId(r,null),n.setAgentIsLoading(r,!1)):(n.setAgentStreamingMessageId(r,l),n.setAgentIsLoading(r,!0));return}const h={id:l,sessionId:r,role:"assistant",contentBlocks:u,isStreaming:!e.payload.is_complete,createdAt:new Date(e.payload.timestamp)};n.addAgentMessage(r,h),e.payload.is_complete||(n.setAgentStreamingMessageId(r,h.id),n.setAgentIsLoading(r,!0))}}function Ek(e){const r=ut.getState(),s=Ve.getState().credentials;if(s&&e.payload.from_device_id===s.deviceId)return;const o={id:crypto.randomUUID(),sessionId:e.session_id,role:"user",contentBlocks:[{id:crypto.randomUUID(),blockType:"text",content:e.payload.content}],isStreaming:!1,createdAt:new Date,fromDeviceId:e.payload.from_device_id};r.addAgentMessage(e.session_id,o)}function Ak(e){const r=ut.getState();r.pendingMessageAcks.has(e.payload.message_id)&&(r.removePendingAck(e.payload.message_id),r.setMessageSendStatus(e.payload.message_id,"sent"))}function Tk(e){on.audio("Received supervisor.voice_output:",e);const r=Ve.getState(),n=Pn.getState(),s=ut.getState(),o=r.credentials,{message_id:u,audio_base64:f,from_device_id:l,duration:c}=e.payload,h=n.ttsEnabled,m=l!==void 0&&l===(o==null?void 0:o.deviceId),p=h&&m;on.audio(`TTS: from=${l??"nil"} me=${o==null?void 0:o.deviceId} match=${m} ttsEnabled=${h} autoPlay=${p}`),It.playAudio(f,u,p);const y=s.supervisorMessages;let x=-1;for(let A=y.length-1;A>=0;A--){const w=y[A];if(w&&w.role==="assistant"){x=A;break}}if(x!==-1){const A=y[x];if(A){const w={id:crypto.randomUUID(),blockType:"voice_output",content:"",metadata:{messageId:u,audioBase64:f,duration:c,hasAudio:!0}};s.updateSupervisorMessage(A.id,{contentBlocks:[...A.contentBlocks,w]})}}}function Rk(e){on.audio("Received session.voice_output:",e);const r=Ve.getState(),n=Pn.getState(),s=ut.getState(),o=r.credentials,u=e.session_id,{message_id:f,audio_base64:l,from_device_id:c,duration:h}=e.payload,m=n.ttsEnabled,p=c!==void 0&&c===(o==null?void 0:o.deviceId),y=m&&p;on.audio(`TTS(agent): from=${c??"nil"} me=${o==null?void 0:o.deviceId} match=${p} autoPlay=${y}`),It.playAudio(l,f,y);const x=s.agentMessages[u]??[];let A=-1;for(let w=x.length-1;w>=0;w--){const v=x[w];if(v&&v.role==="assistant"){A=w;break}}if(A!==-1){const w=x[A];if(w){const v={id:crypto.randomUUID(),blockType:"voice_output",content:"",metadata:{messageId:f,audioBase64:l,duration:h,hasAudio:!0}};s.updateAgentMessage(u,w.id,{contentBlocks:[...w.contentBlocks,v]})}}}function Dk(e){const r=ut.getState(),s=Ve.getState().credentials,{message_id:o,transcription:u,from_device_id:f}=e.payload,l=r.supervisorMessages;let c=!1;for(const h of l)if(h.id===o||h.contentBlocks.some(m=>{var p;return((p=m.metadata)==null?void 0:p.messageId)===o})){const m=h.contentBlocks.map(p=>p.blockType==="voice_input"?{...p,content:u}:p);r.updateSupervisorMessage(h.id,{contentBlocks:m}),c=!0;break}if(!c&&f&&f!==(s==null?void 0:s.deviceId)&&u){const h={id:o,sessionId:"supervisor",role:"user",contentBlocks:[{id:crypto.randomUUID(),blockType:"voice_input",content:u,metadata:{messageId:o}}],isStreaming:!1,createdAt:new Date,fromDeviceId:f};r.addSupervisorMessage(h)}}function Mk(e){const r=ut.getState(),s=Ve.getState().credentials,o=e.session_id,{message_id:u,transcription:f,from_device_id:l}=e.payload,c=r.agentMessages[o]??[];let h=!1;for(const m of c)if(m.id===u||m.contentBlocks.some(p=>{var y;return((y=p.metadata)==null?void 0:y.messageId)===u})){const p=m.contentBlocks.map(y=>y.blockType==="voice_input"?{...y,content:f}:y);r.updateAgentMessage(o,m.id,{contentBlocks:p}),h=!0;break}if(!h&&l&&l!==(s==null?void 0:s.deviceId)&&f){const m={id:u,sessionId:o,role:"user",contentBlocks:[{id:crypto.randomUUID(),blockType:"voice_input",content:f,metadata:{messageId:u}}],isStreaming:!1,createdAt:new Date,fromDeviceId:l};r.addAgentMessage(o,m)}}const pd="tiflis_credentials",pm="tiflis_device_id",SS="tiflis_encryption_key",mm="tiflis_security",ds="keys";class kk{constructor(){_e(this,"encryptionKey",null)}getDeviceId(){let r=localStorage.getItem(pm);return r||(r=crypto.randomUUID(),localStorage.setItem(pm,r)),r}async storeCredentials(r){const n=await this.getOrCreateEncryptionKey(),{encrypted:s,iv:o}=await this.encrypt(n,r.authKey),u={tunnelId:r.tunnelId,tunnelUrl:r.tunnelUrl,encryptedAuthKey:s,iv:o};localStorage.setItem(pd,JSON.stringify(u))}async getCredentials(){const r=localStorage.getItem(pd);if(!r)return null;try{const n=JSON.parse(r),s=await this.getOrCreateEncryptionKey(),o=await this.decrypt(s,n.encryptedAuthKey,n.iv);return{tunnelId:n.tunnelId,tunnelUrl:n.tunnelUrl,authKey:o,deviceId:this.getDeviceId()}}catch(n){return ze.error("Failed to decrypt credentials:",n),null}}hasCredentials(){return localStorage.getItem(pd)!==null}async forgetAll(){localStorage.removeItem(pd),localStorage.removeItem(pm);try{await this.deleteEncryptionKey()}catch(r){ze.error("Failed to delete encryption key:",r)}this.encryptionKey=null}async getOrCreateEncryptionKey(){if(this.encryptionKey)return this.encryptionKey;const r=await this.loadKeyFromDB();if(r)return this.encryptionKey=r,r;const n=await crypto.subtle.generateKey({name:"AES-GCM",length:256},!1,["encrypt","decrypt"]);return await this.saveKeyToDB(n),this.encryptionKey=n,n}async encrypt(r,n){const s=new TextEncoder,o=crypto.getRandomValues(new Uint8Array(12)),u=await crypto.subtle.encrypt({name:"AES-GCM",iv:o},r,s.encode(n));return{encrypted:this.bufferToBase64(new Uint8Array(u)),iv:this.bufferToBase64(o)}}async decrypt(r,n,s){const o=new TextDecoder,u=this.base64ToBuffer(s),f=this.base64ToBuffer(n),l=await crypto.subtle.decrypt({name:"AES-GCM",iv:u.buffer},r,f.buffer);return o.decode(l)}loadKeyFromDB(){return new Promise((r,n)=>{const s=indexedDB.open(mm,1);s.onerror=()=>n(s.error),s.onupgradeneeded=()=>{const o=s.result;o.objectStoreNames.contains(ds)||o.createObjectStore(ds)},s.onsuccess=()=>{const o=s.result;try{const l=o.transaction(ds,"readonly").objectStore(ds).get(SS);l.onerror=()=>{o.close(),n(l.error)},l.onsuccess=()=>{o.close(),r(l.result??null)}}catch(u){o.close(),n(u)}}})}saveKeyToDB(r){return new Promise((n,s)=>{const o=indexedDB.open(mm,1);o.onerror=()=>s(o.error),o.onupgradeneeded=()=>{const u=o.result;u.objectStoreNames.contains(ds)||u.createObjectStore(ds)},o.onsuccess=()=>{const u=o.result;try{const f=u.transaction(ds,"readwrite");f.objectStore(ds).put(r,SS),f.oncomplete=()=>{u.close(),n()},f.onerror=()=>{u.close(),s(f.error)}}catch(f){u.close(),s(f)}}})}deleteEncryptionKey(){return new Promise((r,n)=>{const s=indexedDB.deleteDatabase(mm);s.onblocked=()=>{ze.warn("IndexedDB delete blocked by open connections, resolving anyway"),r()},s.onerror=()=>n(s.error),s.onsuccess=()=>r()})}bufferToBase64(r){let n="";for(let s=0;s<r.byteLength;s++)n+=String.fromCharCode(r[s]);return btoa(n)}base64ToBuffer(r){const n=atob(r),s=new Uint8Array(n.length);for(let o=0;o<n.length;o++)s[o]=n.charCodeAt(o);return s}}const md=new kk;function co(){const e=R.useRef(!1),r=R.useRef(new Map),n=Ve(F=>F.setConnectionState),s=Ve(F=>F.setWorkstationOnline),o=Ve(F=>F.setAuthenticated),u=Ve(F=>F.setCredentials),f=Ve(F=>F.credentials),l=Ve(F=>F.connectionState),c=ut(F=>F.addSupervisorMessage),h=ut(F=>F.setSupervisorIsLoading),m=ut(F=>F.addPendingAck),p=ut(F=>F.setMessageSendStatus);R.useEffect(()=>{if(e.current)return;e.current=!0,Mt.init({onConnectionStateChange:ee=>{n(ee),ee==="authenticated"||ee==="verified"?s(!0):(ee==="disconnected"||ee==="error")&&s(!1)},onMessage:mk,onWorkstationOnline:()=>s(!0),onWorkstationOffline:()=>s(!1)}),(async()=>{const ee=await md.getCredentials();if(ee){u(ee),o(!0);try{await Mt.connect(ee)}catch(Y){ze.error("Auto-connect failed:",Y)}}})();const F=r.current;return()=>{F.forEach(ee=>{clearTimeout(ee)}),F.clear()}},[n,s,o,u]);const y=R.useCallback(async F=>{const ee=md.getDeviceId(),Y={...F,deviceId:ee};await md.storeCredentials(F),u(Y);try{await Mt.connect(Y),o(!0)}catch(re){throw o(!1),re}},[u,o]),x=R.useCallback(()=>{Mt.disconnect(),o(!1)},[o]),A=R.useCallback(async()=>{Mt.disconnect(),await md.forgetAll(),Ve.getState().reset(),ut.getState().reset()},[]),w=R.useCallback(async F=>{const ee=crypto.randomUUID();c({id:ee,sessionId:"supervisor",role:"user",contentBlocks:[{id:crypto.randomUUID(),blockType:"text",content:F}],isStreaming:!1,createdAt:new Date,sendStatus:"pending",fromDeviceId:f==null?void 0:f.deviceId}),m(ee),h(!0);const Y={type:"supervisor.command",id:ee,payload:{command:F}};Mt.send(Y);const re=setTimeout(()=>{r.current.delete(ee);const te=ut.getState();te.pendingMessageAcks.has(ee)&&(te.removePendingAck(ee),p(ee,"failed"))},5e3);r.current.set(ee,re)},[f,c,m,h,p]),v=R.useCallback(async(F,ee)=>{const Y=crypto.randomUUID(),re=ut.getState();re.addAgentMessage(F,{id:Y,sessionId:F,role:"user",contentBlocks:[{id:crypto.randomUUID(),blockType:"text",content:ee}],isStreaming:!1,createdAt:new Date,sendStatus:"pending",fromDeviceId:f==null?void 0:f.deviceId}),re.addPendingAck(Y),re.setAgentIsLoading(F,!0);const te={type:"session.execute",id:Y,session_id:F,payload:{content:ee}};Mt.send(te);const O=setTimeout(()=>{r.current.delete(Y);const G=ut.getState();G.pendingMessageAcks.has(Y)&&(G.removePendingAck(Y),G.setMessageSendStatus(Y,"failed"))},5e3);r.current.set(Y,O)},[f]),S=R.useCallback(async(F,ee,Y,re,te)=>{const O={type:"supervisor.create_session",id:crypto.randomUUID(),payload:{session_type:F,agent_name:te,workspace:ee,project:Y,worktree:re}};return Mt.sendRequest(O)},[]),g=R.useCallback(F=>{const ee={type:"session.subscribe",session_id:F};Mt.send(ee)},[]),_=R.useCallback((F,ee)=>{const Y={type:"session.input",session_id:F,payload:{data:ee}};Mt.send(Y)},[]),T=R.useCallback((F,ee,Y)=>{const re={type:"session.resize",session_id:F,payload:{cols:ee,rows:Y}};Mt.send(re)},[]),M=R.useCallback((F,ee=0,Y=500)=>{const re={type:"session.replay",session_id:F,payload:{since_sequence:ee,limit:Y}};Mt.send(re),ze.debug("Requested terminal replay",{sessionId:F,sinceSequence:ee,limit:Y})},[]),k=R.useCallback(()=>{Mt.send({type:"supervisor.cancel",id:crypto.randomUUID()}),h(!1)},[h]),L=R.useCallback(F=>{Mt.send({type:"session.cancel",id:crypto.randomUUID(),session_id:F}),ut.getState().setAgentIsLoading(F,!1)},[]),D=R.useCallback(async(F,ee)=>{if(!f){ze.error("Cannot send supervisor voice command: Not authenticated");return}if(l!=="verified"&&l!=="authenticated"){ze.error("Cannot send supervisor voice command: Not connected",{connectionState:l});return}const Y=crypto.randomUUID();on.voice(`Sending supervisor voice command: format=${ee}, audioSize=${F.length}, messageId=${Y}`),c({id:Y,sessionId:"supervisor",role:"user",contentBlocks:[{id:crypto.randomUUID(),blockType:"voice_input",content:"",metadata:{audioBase64:F,messageId:Y}}],isStreaming:!1,createdAt:new Date,sendStatus:"pending",fromDeviceId:f==null?void 0:f.deviceId});const re=crypto.randomUUID();c({id:re,sessionId:"supervisor",role:"assistant",contentBlocks:[],isStreaming:!0,createdAt:new Date}),ut.getState().setSupervisorStreamingMessageId(re),m(Y),h(!0);const O={type:"supervisor.command",id:Y,payload:{audio:F,audio_format:ee,message_id:Y}};on.voice("WebSocket sending supervisor voice:",O),Mt.send(O);const G=setTimeout(()=>{r.current.delete(Y);const j=ut.getState();j.pendingMessageAcks.has(Y)&&(ze.warn(`Voice message ACK timeout: ${Y}`),j.removePendingAck(Y),p(Y,"failed"))},1e4);r.current.set(Y,G)},[f,l,c,m,h,p]),P=R.useCallback(async(F,ee,Y)=>{if(!f){ze.error("Cannot send agent voice command: Not authenticated");return}if(l!=="verified"&&l!=="authenticated"){ze.error("Cannot send agent voice command: Not connected",{connectionState:l});return}const re=crypto.randomUUID(),te=ut.getState();on.voice(`Sending agent voice command: sessionId=${F}, format=${Y}, audioSize=${ee.length}, messageId=${re}`),te.addAgentMessage(F,{id:re,sessionId:F,role:"user",contentBlocks:[{id:crypto.randomUUID(),blockType:"voice_input",content:"",metadata:{audioBase64:ee,messageId:re}}],isStreaming:!1,createdAt:new Date,sendStatus:"pending",fromDeviceId:f==null?void 0:f.deviceId});const O=crypto.randomUUID();te.addAgentMessage(F,{id:O,sessionId:F,role:"assistant",contentBlocks:[],isStreaming:!0,createdAt:new Date}),te.setAgentStreamingMessageId(F,O),te.addPendingAck(re),te.setAgentIsLoading(F,!0);const G={type:"session.execute",id:re,session_id:F,payload:{audio:ee,audio_format:Y,message_id:re}};Mt.send(G);const j=setTimeout(()=>{r.current.delete(re);const q=ut.getState();q.pendingMessageAcks.has(re)&&(q.removePendingAck(re),q.setMessageSendStatus(re,"failed"))},1e4);r.current.set(re,j)},[f,l]),K=R.useCallback(()=>{Mt.send({type:"supervisor.clear_context",id:crypto.randomUUID()}),ut.getState().clearSupervisorMessages()},[]),$=R.useCallback(()=>{const F={type:"sync",id:crypto.randomUUID()};Mt.send(F)},[]),z=R.useCallback((F,ee,Y=20)=>{const re={type:"history.request",id:crypto.randomUUID(),payload:{session_id:F,before_sequence:ee,limit:Y}};Mt.send(re)},[]),W=R.useCallback(F=>{Mt.send({type:"supervisor.terminate_session",id:crypto.randomUUID(),payload:{session_id:F}})},[]);return{connect:y,disconnect:x,disconnectAndForget:A,sendSupervisorCommand:w,sendAgentCommand:v,sendSupervisorVoiceCommand:D,sendAgentVoiceCommand:P,createSession:S,subscribeToSession:g,sendTerminalInput:_,resizeTerminal:T,requestTerminalReplay:M,cancelSupervisor:k,cancelAgent:L,clearSupervisorContext:K,terminateSession:W,requestSync:$,requestHistory:z,isConnected:Mt.isConnected}}const h1="(prefers-color-scheme: dark)",Lk="ui-theme",f1=R.createContext(void 0);function gm(){return typeof window>"u"||window.matchMedia(h1).matches?"dark":"light"}function Ok({children:e,defaultTheme:r="system",storageKey:n=Lk}){const[s,o]=R.useState(()=>localStorage.getItem(n)||r),[u,f]=R.useState(()=>s==="system"?gm():s);R.useEffect(()=>{const c=window.document.documentElement;c.classList.remove("light","dark");const h=s==="system"?gm():s;c.classList.add(h),f(h)},[s]),R.useEffect(()=>{const c=window.matchMedia(h1),h=()=>{if(s==="system"){const m=window.document.documentElement,p=gm();m.classList.remove("light","dark"),m.classList.add(p),f(p)}};return c.addEventListener("change",h),()=>c.removeEventListener("change",h)},[s]);const l=c=>{localStorage.setItem(n,c),o(c)};return b.jsx(f1.Provider,{value:{theme:s,setTheme:l,resolvedTheme:u},children:e})}function Kg(){const e=R.useContext(f1);if(e===void 0)throw new Error("useTheme must be used within a ThemeProvider");return e}function p1(e){return b.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 64 64",...e,children:[b.jsx("defs",{children:b.jsxs("linearGradient",{id:"tiflis-accent",x1:"0%",y1:"0%",x2:"100%",y2:"100%",children:[b.jsx("stop",{offset:"0%",stopColor:"#2E5AA6"}),b.jsx("stop",{offset:"100%",stopColor:"#6F4ABF"})]})}),b.jsx("rect",{width:"64",height:"64",rx:"12",fill:"#111"}),b.jsx("path",{d:"M 14 20 L 10 26 L 10 42 L 14 48",fill:"none",stroke:"#2E5AA6",strokeWidth:"2.6",strokeLinecap:"round"}),b.jsx("path",{d:"M 50 20 L 54 26 L 54 42 L 50 48",fill:"none",stroke:"#6F4ABF",strokeWidth:"2.6",strokeLinecap:"round"}),b.jsx("text",{x:"14",y:"46",fontFamily:"monospace",fontSize:"23",fill:"url(#tiflis-accent)",children:"›"}),b.jsx("text",{x:"32",y:"47",textAnchor:"middle",fontFamily:"system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif",fontSize:"47",fontWeight:"500",fill:"#fff",children:"t"})]})}function ga(e){return b.jsx(p1,{...e})}function Ea({className:e,...r}){return b.jsx("img",{src:"/icons/claude-logo.png",alt:"Claude Code",className:e,...r})}function Aa({className:e,...r}){const{resolvedTheme:n}=Kg(),s=n==="dark"?"/icons/opencode-logo-dark.png":"/icons/opencode-logo-light.png";return b.jsx("img",{src:s,alt:"OpenCode",className:e,...r})}function Ta({className:e,...r}){return b.jsx("img",{src:"/icons/cursor-logo.png",alt:"Cursor",className:e,...r})}function va(e){return b.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",...e,children:[b.jsx("rect",{x:"3",y:"4",width:"18",height:"16",rx:"2"}),b.jsx("path",{d:"M7 9l3 3-3 3"}),b.jsx("path",{d:"M13 15h4"})]})}function xi(e){return b.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",...e,children:[b.jsx("rect",{x:"3",y:"3",width:"18",height:"18",rx:"2"}),b.jsx("circle",{cx:"12",cy:"10",r:"3"}),b.jsx("path",{d:"M7 20v-1a5 5 0 0 1 10 0v1"})]})}function Bk(){const[e,r]=R.useState(""),[n,s]=R.useState(!1),[o,u]=R.useState(null),[f,l]=R.useState(!1),{connect:c}=co(),h=R.useCallback(async y=>{u(null);const x=y??e.trim(),A=S2(x);if(!A){u("Invalid magic link format");return}s(!0);try{await c({tunnelId:A.tunnelId,tunnelUrl:A.url,authKey:A.key})}catch(w){u(w instanceof Error?w.message:"Connection failed"),s(!1)}},[c,e]),m=R.useCallback(y=>{l(!1),r(y),h(y)},[h]),p=y=>{y.key==="Enter"&&!y.shiftKey&&(y.preventDefault(),h())};return b.jsx("div",{className:"min-h-screen flex items-center justify-center p-4 bg-background",children:b.jsxs(fs,{className:"w-full max-w-md",children:[b.jsxs(ps,{className:"text-center",children:[b.jsx("div",{className:"mx-auto mb-4 w-16 h-16 rounded-lg overflow-hidden",children:b.jsx(p1,{className:"w-16 h-16"})}),b.jsx(ms,{className:"text-2xl",children:"Tiflis Code"}),b.jsx(Xs,{children:"Connect to your workstation to control AI agents remotely"})]}),b.jsx(gs,{className:"space-y-4",children:f?b.jsx(tk,{onScan:m,onBack:()=>l(!1)}):b.jsxs(b.Fragment,{children:[b.jsxs("div",{className:"space-y-2",children:[b.jsx(nC,{placeholder:"Paste magic link here...",value:e,onChange:y=>r(y.target.value),onKeyDown:p,disabled:n}),o&&b.jsx("p",{className:"text-sm text-destructive",children:o})]}),b.jsx(dt,{className:"w-full",onClick:()=>h(),disabled:!e.trim()||n,children:n?b.jsxs(b.Fragment,{children:[b.jsx(wc,{className:"animate-spin"}),"Connecting..."]}):b.jsxs(b.Fragment,{children:[b.jsx(qM,{}),"Connect"]})}),b.jsxs("div",{className:"relative",children:[b.jsx("div",{className:"absolute inset-0 flex items-center",children:b.jsx("span",{className:"w-full border-t"})}),b.jsx("div",{className:"relative flex justify-center text-xs uppercase",children:b.jsx("span",{className:"bg-background px-2 text-muted-foreground",children:"Or"})})]}),b.jsxs(dt,{variant:"outline",className:"w-full",onClick:()=>l(!0),disabled:n,children:[b.jsx(QM,{}),"Scan QR Code"]})]})})]})})}function Le(e,r,{checkForDefaultPrevented:n=!0}={}){return function(o){if(e==null||e(o),n===!1||!o.defaultPrevented)return r==null?void 0:r(o)}}function Nk(e,r){const n=R.createContext(r),s=u=>{const{children:f,...l}=u,c=R.useMemo(()=>l,Object.values(l));return b.jsx(n.Provider,{value:c,children:f})};s.displayName=e+"Provider";function o(u){const f=R.useContext(n);if(f)return f;if(r!==void 0)return r;throw new Error(`\`${u}\` must be used within \`${e}\``)}return[s,o]}function qn(e,r=[]){let n=[];function s(u,f){const l=R.createContext(f),c=n.length;n=[...n,f];const h=p=>{var S;const{scope:y,children:x,...A}=p,w=((S=y==null?void 0:y[e])==null?void 0:S[c])||l,v=R.useMemo(()=>A,Object.values(A));return b.jsx(w.Provider,{value:v,children:x})};h.displayName=u+"Provider";function m(p,y){var w;const x=((w=y==null?void 0:y[e])==null?void 0:w[c])||l,A=R.useContext(x);if(A)return A;if(f!==void 0)return f;throw new Error(`\`${p}\` must be used within \`${u}\``)}return[h,m]}const o=()=>{const u=n.map(f=>R.createContext(f));return function(l){const c=(l==null?void 0:l[e])||u;return R.useMemo(()=>({[`__scope${e}`]:{...l,[e]:c}}),[l,c])}};return o.scopeName=e,[s,Ik(o,...r)]}function Ik(...e){const r=e[0];if(e.length===1)return r;const n=()=>{const s=e.map(o=>({useScope:o(),scopeName:o.scopeName}));return function(u){const f=s.reduce((l,{useScope:c,scopeName:h})=>{const p=c(u)[`__scope${h}`];return{...l,...p}},{});return R.useMemo(()=>({[`__scope${r.scopeName}`]:f}),[f])}};return n.scopeName=r.scopeName,n}var pr=globalThis!=null&&globalThis.document?R.useLayoutEffect:()=>{},Pk=kg[" useId ".trim().toString()]||(()=>{}),jk=0;function jn(e){const[r,n]=R.useState(Pk());return pr(()=>{n(s=>s??String(jk++))},[e]),r?`radix-${r}`:""}var Uk=kg[" useInsertionEffect ".trim().toString()]||pr;function ro({prop:e,defaultProp:r,onChange:n=()=>{},caller:s}){const[o,u,f]=Fk({defaultProp:r,onChange:n}),l=e!==void 0,c=l?e:o;{const m=R.useRef(e!==void 0);R.useEffect(()=>{const p=m.current;p!==l&&console.warn(`${s} is changing from ${p?"controlled":"uncontrolled"} to ${l?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),m.current=l},[l,s])}const h=R.useCallback(m=>{var p;if(l){const y=Hk(m)?m(e):m;y!==e&&((p=f.current)==null||p.call(f,y))}else u(m)},[l,e,u,f]);return[c,h]}function Fk({defaultProp:e,onChange:r}){const[n,s]=R.useState(e),o=R.useRef(n),u=R.useRef(r);return Uk(()=>{u.current=r},[r]),R.useEffect(()=>{var f;o.current!==n&&((f=u.current)==null||f.call(u,n),o.current=n)},[n,o]),[n,s,u]}function Hk(e){return typeof e=="function"}function no(e){const r=Vk(e),n=R.forwardRef((s,o)=>{const{children:u,...f}=s,l=R.Children.toArray(u),c=l.find(Gk);if(c){const h=c.props.children,m=l.map(p=>p===c?R.Children.count(h)>1?R.Children.only(null):R.isValidElement(h)?h.props.children:null:p);return b.jsx(r,{...f,ref:o,children:R.isValidElement(h)?R.cloneElement(h,void 0,m):null})}return b.jsx(r,{...f,ref:o,children:u})});return n.displayName=`${e}.Slot`,n}function Vk(e){const r=R.forwardRef((n,s)=>{const{children:o,...u}=n;if(R.isValidElement(o)){const f=Yk(o),l=zk(u,o.props);return o.type!==R.Fragment&&(l.ref=s?Cc(s,f):f),R.cloneElement(o,l)}return R.Children.count(o)>1?R.Children.only(null):null});return r.displayName=`${e}.SlotClone`,r}var m1=Symbol("radix.slottable");function qk(e){const r=({children:n})=>b.jsx(b.Fragment,{children:n});return r.displayName=`${e}.Slottable`,r.__radixId=m1,r}function Gk(e){return R.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===m1}function zk(e,r){const n={...r};for(const s in r){const o=e[s],u=r[s];/^on[A-Z]/.test(s)?o&&u?n[s]=(...l)=>{const c=u(...l);return o(...l),c}:o&&(n[s]=o):s==="style"?n[s]={...o,...u}:s==="className"&&(n[s]=[o,u].filter(Boolean).join(" "))}return{...e,...n}}function Yk(e){var s,o;let r=(s=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:s.get,n=r&&"isReactWarning"in r&&r.isReactWarning;return n?e.ref:(r=(o=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:o.get,n=r&&"isReactWarning"in r&&r.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}var Wk=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],Je=Wk.reduce((e,r)=>{const n=no(`Primitive.${r}`),s=R.forwardRef((o,u)=>{const{asChild:f,...l}=o,c=f?n:r;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),b.jsx(c,{...l,ref:u})});return s.displayName=`Primitive.${r}`,{...e,[r]:s}},{});function g1(e,r){e&&bc.flushSync(()=>e.dispatchEvent(r))}function Fn(e){const r=R.useRef(e);return R.useEffect(()=>{r.current=e}),R.useMemo(()=>(...n)=>{var s;return(s=r.current)==null?void 0:s.call(r,...n)},[])}function Kk(e,r=globalThis==null?void 0:globalThis.document){const n=Fn(e);R.useEffect(()=>{const s=o=>{o.key==="Escape"&&n(o)};return r.addEventListener("keydown",s,{capture:!0}),()=>r.removeEventListener("keydown",s,{capture:!0})},[n,r])}var Qk="DismissableLayer",ig="dismissableLayer.update",$k="dismissableLayer.pointerDownOutside",Jk="dismissableLayer.focusOutside",bS,v1=R.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),xc=R.forwardRef((e,r)=>{const{disableOutsidePointerEvents:n=!1,onEscapeKeyDown:s,onPointerDownOutside:o,onFocusOutside:u,onInteractOutside:f,onDismiss:l,...c}=e,h=R.useContext(v1),[m,p]=R.useState(null),y=(m==null?void 0:m.ownerDocument)??(globalThis==null?void 0:globalThis.document),[,x]=R.useState({}),A=ot(r,L=>p(L)),w=Array.from(h.layers),[v]=[...h.layersWithOutsidePointerEventsDisabled].slice(-1),S=w.indexOf(v),g=m?w.indexOf(m):-1,_=h.layersWithOutsidePointerEventsDisabled.size>0,T=g>=S,M=eL(L=>{const D=L.target,P=[...h.branches].some(K=>K.contains(D));!T||P||(o==null||o(L),f==null||f(L),L.defaultPrevented||l==null||l())},y),k=tL(L=>{const D=L.target;[...h.branches].some(K=>K.contains(D))||(u==null||u(L),f==null||f(L),L.defaultPrevented||l==null||l())},y);return Kk(L=>{g===h.layers.size-1&&(s==null||s(L),!L.defaultPrevented&&l&&(L.preventDefault(),l()))},y),R.useEffect(()=>{if(m)return n&&(h.layersWithOutsidePointerEventsDisabled.size===0&&(bS=y.body.style.pointerEvents,y.body.style.pointerEvents="none"),h.layersWithOutsidePointerEventsDisabled.add(m)),h.layers.add(m),CS(),()=>{n&&h.layersWithOutsidePointerEventsDisabled.size===1&&(y.body.style.pointerEvents=bS)}},[m,y,n,h]),R.useEffect(()=>()=>{m&&(h.layers.delete(m),h.layersWithOutsidePointerEventsDisabled.delete(m),CS())},[m,h]),R.useEffect(()=>{const L=()=>x({});return document.addEventListener(ig,L),()=>document.removeEventListener(ig,L)},[]),b.jsx(Je.div,{...c,ref:A,style:{pointerEvents:_?T?"auto":"none":void 0,...e.style},onFocusCapture:Le(e.onFocusCapture,k.onFocusCapture),onBlurCapture:Le(e.onBlurCapture,k.onBlurCapture),onPointerDownCapture:Le(e.onPointerDownCapture,M.onPointerDownCapture)})});xc.displayName=Qk;var Zk="DismissableLayerBranch",Xk=R.forwardRef((e,r)=>{const n=R.useContext(v1),s=R.useRef(null),o=ot(r,s);return R.useEffect(()=>{const u=s.current;if(u)return n.branches.add(u),()=>{n.branches.delete(u)}},[n.branches]),b.jsx(Je.div,{...e,ref:o})});Xk.displayName=Zk;function eL(e,r=globalThis==null?void 0:globalThis.document){const n=Fn(e),s=R.useRef(!1),o=R.useRef(()=>{});return R.useEffect(()=>{const u=l=>{if(l.target&&!s.current){let c=function(){_1($k,n,h,{discrete:!0})};const h={originalEvent:l};l.pointerType==="touch"?(r.removeEventListener("click",o.current),o.current=c,r.addEventListener("click",o.current,{once:!0})):c()}else r.removeEventListener("click",o.current);s.current=!1},f=window.setTimeout(()=>{r.addEventListener("pointerdown",u)},0);return()=>{window.clearTimeout(f),r.removeEventListener("pointerdown",u),r.removeEventListener("click",o.current)}},[r,n]),{onPointerDownCapture:()=>s.current=!0}}function tL(e,r=globalThis==null?void 0:globalThis.document){const n=Fn(e),s=R.useRef(!1);return R.useEffect(()=>{const o=u=>{u.target&&!s.current&&_1(Jk,n,{originalEvent:u},{discrete:!1})};return r.addEventListener("focusin",o),()=>r.removeEventListener("focusin",o)},[r,n]),{onFocusCapture:()=>s.current=!0,onBlurCapture:()=>s.current=!1}}function CS(){const e=new CustomEvent(ig);document.dispatchEvent(e)}function _1(e,r,n,{discrete:s}){const o=n.originalEvent.target,u=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});r&&o.addEventListener(e,r,{once:!0}),s?g1(o,u):o.dispatchEvent(u)}var vm="focusScope.autoFocusOnMount",_m="focusScope.autoFocusOnUnmount",wS={bubbles:!1,cancelable:!0},rL="FocusScope",Ec=R.forwardRef((e,r)=>{const{loop:n=!1,trapped:s=!1,onMountAutoFocus:o,onUnmountAutoFocus:u,...f}=e,[l,c]=R.useState(null),h=Fn(o),m=Fn(u),p=R.useRef(null),y=ot(r,w=>c(w)),x=R.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;R.useEffect(()=>{if(s){let w=function(_){if(x.paused||!l)return;const T=_.target;l.contains(T)?p.current=T:hs(p.current,{select:!0})},v=function(_){if(x.paused||!l)return;const T=_.relatedTarget;T!==null&&(l.contains(T)||hs(p.current,{select:!0}))},S=function(_){if(document.activeElement===document.body)for(const M of _)M.removedNodes.length>0&&hs(l)};document.addEventListener("focusin",w),document.addEventListener("focusout",v);const g=new MutationObserver(S);return l&&g.observe(l,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",w),document.removeEventListener("focusout",v),g.disconnect()}}},[s,l,x.paused]),R.useEffect(()=>{if(l){ES.add(x);const w=document.activeElement;if(!l.contains(w)){const S=new CustomEvent(vm,wS);l.addEventListener(vm,h),l.dispatchEvent(S),S.defaultPrevented||(nL(lL(y1(l)),{select:!0}),document.activeElement===w&&hs(l))}return()=>{l.removeEventListener(vm,h),setTimeout(()=>{const S=new CustomEvent(_m,wS);l.addEventListener(_m,m),l.dispatchEvent(S),S.defaultPrevented||hs(w??document.body,{select:!0}),l.removeEventListener(_m,m),ES.remove(x)},0)}}},[l,h,m,x]);const A=R.useCallback(w=>{if(!n&&!s||x.paused)return;const v=w.key==="Tab"&&!w.altKey&&!w.ctrlKey&&!w.metaKey,S=document.activeElement;if(v&&S){const g=w.currentTarget,[_,T]=iL(g);_&&T?!w.shiftKey&&S===T?(w.preventDefault(),n&&hs(_,{select:!0})):w.shiftKey&&S===_&&(w.preventDefault(),n&&hs(T,{select:!0})):S===g&&w.preventDefault()}},[n,s,x.paused]);return b.jsx(Je.div,{tabIndex:-1,...f,ref:y,onKeyDown:A})});Ec.displayName=rL;function nL(e,{select:r=!1}={}){const n=document.activeElement;for(const s of e)if(hs(s,{select:r}),document.activeElement!==n)return}function iL(e){const r=y1(e),n=xS(r,e),s=xS(r.reverse(),e);return[n,s]}function y1(e){const r=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:s=>{const o=s.tagName==="INPUT"&&s.type==="hidden";return s.disabled||s.hidden||o?NodeFilter.FILTER_SKIP:s.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)r.push(n.currentNode);return r}function xS(e,r){for(const n of e)if(!sL(n,{upTo:r}))return n}function sL(e,{upTo:r}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(r!==void 0&&e===r)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function oL(e){return e instanceof HTMLInputElement&&"select"in e}function hs(e,{select:r=!1}={}){if(e&&e.focus){const n=document.activeElement;e.focus({preventScroll:!0}),e!==n&&oL(e)&&r&&e.select()}}var ES=aL();function aL(){let e=[];return{add(r){const n=e[0];r!==n&&(n==null||n.pause()),e=AS(e,r),e.unshift(r)},remove(r){var n;e=AS(e,r),(n=e[0])==null||n.resume()}}}function AS(e,r){const n=[...e],s=n.indexOf(r);return s!==-1&&n.splice(s,1),n}function lL(e){return e.filter(r=>r.tagName!=="A")}var cL="Portal",Ac=R.forwardRef((e,r)=>{var l;const{container:n,...s}=e,[o,u]=R.useState(!1);pr(()=>u(!0),[]);const f=n||o&&((l=globalThis==null?void 0:globalThis.document)==null?void 0:l.body);return f?MD.createPortal(b.jsx(Je.div,{...s,ref:r}),f):null});Ac.displayName=cL;function uL(e,r){return R.useReducer((n,s)=>r[n][s]??n,e)}var Gn=e=>{const{present:r,children:n}=e,s=dL(r),o=typeof n=="function"?n({present:s.isPresent}):R.Children.only(n),u=ot(s.ref,hL(o));return typeof n=="function"||s.isPresent?R.cloneElement(o,{ref:u}):null};Gn.displayName="Presence";function dL(e){const[r,n]=R.useState(),s=R.useRef(null),o=R.useRef(e),u=R.useRef("none"),f=e?"mounted":"unmounted",[l,c]=uL(f,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return R.useEffect(()=>{const h=gd(s.current);u.current=l==="mounted"?h:"none"},[l]),pr(()=>{const h=s.current,m=o.current;if(m!==e){const y=u.current,x=gd(h);e?c("MOUNT"):x==="none"||(h==null?void 0:h.display)==="none"?c("UNMOUNT"):c(m&&y!==x?"ANIMATION_OUT":"UNMOUNT"),o.current=e}},[e,c]),pr(()=>{if(r){let h;const m=r.ownerDocument.defaultView??window,p=x=>{const w=gd(s.current).includes(CSS.escape(x.animationName));if(x.target===r&&w&&(c("ANIMATION_END"),!o.current)){const v=r.style.animationFillMode;r.style.animationFillMode="forwards",h=m.setTimeout(()=>{r.style.animationFillMode==="forwards"&&(r.style.animationFillMode=v)})}},y=x=>{x.target===r&&(u.current=gd(s.current))};return r.addEventListener("animationstart",y),r.addEventListener("animationcancel",p),r.addEventListener("animationend",p),()=>{m.clearTimeout(h),r.removeEventListener("animationstart",y),r.removeEventListener("animationcancel",p),r.removeEventListener("animationend",p)}}else c("ANIMATION_END")},[r,c]),{isPresent:["mounted","unmountSuspended"].includes(l),ref:R.useCallback(h=>{s.current=h?getComputedStyle(h):null,n(h)},[])}}function gd(e){return(e==null?void 0:e.animationName)||"none"}function hL(e){var s,o;let r=(s=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:s.get,n=r&&"isReactWarning"in r&&r.isReactWarning;return n?e.ref:(r=(o=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:o.get,n=r&&"isReactWarning"in r&&r.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}var ym=0;function _h(){R.useEffect(()=>{const e=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",e[0]??TS()),document.body.insertAdjacentElement("beforeend",e[1]??TS()),ym++,()=>{ym===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(r=>r.remove()),ym--}},[])}function TS(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}var Nn=function(){return Nn=Object.assign||function(r){for(var n,s=1,o=arguments.length;s<o;s++){n=arguments[s];for(var u in n)Object.prototype.hasOwnProperty.call(n,u)&&(r[u]=n[u])}return r},Nn.apply(this,arguments)};function S1(e,r){var n={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&r.indexOf(s)<0&&(n[s]=e[s]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var o=0,s=Object.getOwnPropertySymbols(e);o<s.length;o++)r.indexOf(s[o])<0&&Object.prototype.propertyIsEnumerable.call(e,s[o])&&(n[s[o]]=e[s[o]]);return n}function fL(e,r,n){if(n||arguments.length===2)for(var s=0,o=r.length,u;s<o;s++)(u||!(s in r))&&(u||(u=Array.prototype.slice.call(r,0,s)),u[s]=r[s]);return e.concat(u||Array.prototype.slice.call(r))}var Nd="right-scroll-bar-position",Id="width-before-scroll-bar",pL="with-scroll-bars-hidden",mL="--removed-body-scroll-bar-size";function Sm(e,r){return typeof e=="function"?e(r):e&&(e.current=r),e}function gL(e,r){var n=R.useState(function(){return{value:e,callback:r,facade:{get current(){return n.value},set current(s){var o=n.value;o!==s&&(n.value=s,n.callback(s,o))}}}})[0];return n.callback=r,n.facade}var vL=typeof window<"u"?R.useLayoutEffect:R.useEffect,RS=new WeakMap;function _L(e,r){var n=gL(null,function(s){return e.forEach(function(o){return Sm(o,s)})});return vL(function(){var s=RS.get(n);if(s){var o=new Set(s),u=new Set(e),f=n.current;o.forEach(function(l){u.has(l)||Sm(l,null)}),u.forEach(function(l){o.has(l)||Sm(l,f)})}RS.set(n,e)},[e]),n}function yL(e){return e}function SL(e,r){r===void 0&&(r=yL);var n=[],s=!1,o={read:function(){if(s)throw new Error("Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`.");return n.length?n[n.length-1]:e},useMedium:function(u){var f=r(u,s);return n.push(f),function(){n=n.filter(function(l){return l!==f})}},assignSyncMedium:function(u){for(s=!0;n.length;){var f=n;n=[],f.forEach(u)}n={push:function(l){return u(l)},filter:function(){return n}}},assignMedium:function(u){s=!0;var f=[];if(n.length){var l=n;n=[],l.forEach(u),f=n}var c=function(){var m=f;f=[],m.forEach(u)},h=function(){return Promise.resolve().then(c)};h(),n={push:function(m){f.push(m),h()},filter:function(m){return f=f.filter(m),n}}}};return o}function bL(e){e===void 0&&(e={});var r=SL(null);return r.options=Nn({async:!0,ssr:!1},e),r}var b1=function(e){var r=e.sideCar,n=S1(e,["sideCar"]);if(!r)throw new Error("Sidecar: please provide `sideCar` property to import the right car");var s=r.read();if(!s)throw new Error("Sidecar medium not found");return R.createElement(s,Nn({},n))};b1.isSideCarExport=!0;function CL(e,r){return e.useMedium(r),b1}var C1=bL(),bm=function(){},yh=R.forwardRef(function(e,r){var n=R.useRef(null),s=R.useState({onScrollCapture:bm,onWheelCapture:bm,onTouchMoveCapture:bm}),o=s[0],u=s[1],f=e.forwardProps,l=e.children,c=e.className,h=e.removeScrollBar,m=e.enabled,p=e.shards,y=e.sideCar,x=e.noRelative,A=e.noIsolation,w=e.inert,v=e.allowPinchZoom,S=e.as,g=S===void 0?"div":S,_=e.gapMode,T=S1(e,["forwardProps","children","className","removeScrollBar","enabled","shards","sideCar","noRelative","noIsolation","inert","allowPinchZoom","as","gapMode"]),M=y,k=_L([n,r]),L=Nn(Nn({},T),o);return R.createElement(R.Fragment,null,m&&R.createElement(M,{sideCar:C1,removeScrollBar:h,shards:p,noRelative:x,noIsolation:A,inert:w,setCallbacks:u,allowPinchZoom:!!v,lockRef:n,gapMode:_}),f?R.cloneElement(R.Children.only(l),Nn(Nn({},L),{ref:k})):R.createElement(g,Nn({},L,{className:c,ref:k}),l))});yh.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1};yh.classNames={fullWidth:Id,zeroRight:Nd};var wL=function(){if(typeof __webpack_nonce__<"u")return __webpack_nonce__};function xL(){if(!document)return null;var e=document.createElement("style");e.type="text/css";var r=wL();return r&&e.setAttribute("nonce",r),e}function EL(e,r){e.styleSheet?e.styleSheet.cssText=r:e.appendChild(document.createTextNode(r))}function AL(e){var r=document.head||document.getElementsByTagName("head")[0];r.appendChild(e)}var TL=function(){var e=0,r=null;return{add:function(n){e==0&&(r=xL())&&(EL(r,n),AL(r)),e++},remove:function(){e--,!e&&r&&(r.parentNode&&r.parentNode.removeChild(r),r=null)}}},RL=function(){var e=TL();return function(r,n){R.useEffect(function(){return e.add(r),function(){e.remove()}},[r&&n])}},w1=function(){var e=RL(),r=function(n){var s=n.styles,o=n.dynamic;return e(s,o),null};return r},DL={left:0,top:0,right:0,gap:0},Cm=function(e){return parseInt(e||"",10)||0},ML=function(e){var r=window.getComputedStyle(document.body),n=r[e==="padding"?"paddingLeft":"marginLeft"],s=r[e==="padding"?"paddingTop":"marginTop"],o=r[e==="padding"?"paddingRight":"marginRight"];return[Cm(n),Cm(s),Cm(o)]},kL=function(e){if(e===void 0&&(e="margin"),typeof window>"u")return DL;var r=ML(e),n=document.documentElement.clientWidth,s=window.innerWidth;return{left:r[0],top:r[1],right:r[2],gap:Math.max(0,s-n+r[2]-r[0])}},LL=w1(),ua="data-scroll-locked",OL=function(e,r,n,s){var o=e.left,u=e.top,f=e.right,l=e.gap;return n===void 0&&(n="margin"),`
|
|
331
331
|
.`.concat(pL,` {
|
|
332
332
|
overflow: hidden `).concat(s,`;
|
|
333
333
|
padding-right: `).concat(l,"px ").concat(s,`;
|
|
@@ -417,4 +417,4 @@ WARNING: This link could potentially be dangerous`)){const S=window.open();if(S)
|
|
|
417
417
|
* http://bellard.org/jslinux/
|
|
418
418
|
* Copyright (c) 2011 Fabrice Bellard
|
|
419
419
|
*/var lj=class{constructor(e,r,n,s={}){this._terminal=e,this._regex=r,this._handler=n,this._options=s}provideLinks(e,r){let n=uj.computeLink(e,this._regex,this._terminal,this._handler);r(this._addCallbacks(n))}_addCallbacks(e){return e.map(r=>(r.leave=this._options.leave,r.hover=(n,s)=>{if(this._options.hover){let{range:o}=r;this._options.hover(n,s,o)}},r))}};function cj(e){try{let r=new URL(e),n=r.password&&r.username?`${r.protocol}//${r.username}:${r.password}@${r.host}`:r.username?`${r.protocol}//${r.username}@${r.host}`:`${r.protocol}//${r.host}`;return e.toLocaleLowerCase().startsWith(n.toLocaleLowerCase())}catch{return!1}}var uj=class Vd{static computeLink(r,n,s,o){let u=new RegExp(n.source,(n.flags||"")+"g"),[f,l]=Vd._getWindowedLineStrings(r-1,s),c=f.join(""),h,m=[];for(;h=u.exec(c);){let p=h[0];if(!cj(p))continue;let[y,x]=Vd._mapStrIdx(s,l,0,h.index),[A,w]=Vd._mapStrIdx(s,y,x,p.length);if(y===-1||x===-1||A===-1||w===-1)continue;let v={start:{x:x+1,y:y+1},end:{x:w,y:A+1}};m.push({range:v,text:p,activate:o})}return m}static _getWindowedLineStrings(r,n){let s,o=r,u=r,f=0,l="",c=[];if(s=n.buffer.active.getLine(r)){let h=s.translateToString(!0);if(s.isWrapped&&h[0]!==" "){for(f=0;(s=n.buffer.active.getLine(--o))&&f<2048&&(l=s.translateToString(!0),f+=l.length,c.push(l),!(!s.isWrapped||l.indexOf(" ")!==-1)););c.reverse()}for(c.push(h),f=0;(s=n.buffer.active.getLine(++u))&&s.isWrapped&&f<2048&&(l=s.translateToString(!0),f+=l.length,c.push(l),l.indexOf(" ")===-1););}return[c,o]}static _mapStrIdx(r,n,s,o){let u=r.buffer.active,f=u.getNullCell(),l=s;for(;o;){let c=u.getLine(n);if(!c)return[-1,-1];for(let h=l;h<c.length;++h){c.getCell(h,f);let m=f.getChars();if(f.getWidth()&&(o-=m.length||1,h===c.length-1&&m==="")){let p=u.getLine(n+1);p&&p.isWrapped&&(p.getCell(0,f),f.getWidth()===2&&(o+=1))}if(o<0)return[n,h]}n++,l=0}return[n,l]}},dj=/(https?|HTTPS?):[/]{2}[^\s"'!*(){}|\\\^<>`]*[^\s"':,.!?{}|\\\^~\[\]`()<>]/;function hj(e,r){let n=window.open();if(n){try{n.opener=null}catch{}n.location.href=r}else console.warn("Opening link blocked as opener could not be cleared")}var fj=class{constructor(e=hj,r={}){this._handler=e,this._options=r}activate(e){this._terminal=e;let r=this._options,n=r.urlRegex||dj;this._linkProvider=this._terminal.registerLinkProvider(new lj(this._terminal,n,this._handler,r))}dispose(){var e;(e=this._linkProvider)==null||e.dispose()}};const pj={background:"#1a1a1a",foreground:"#d4d4d4",cursor:"#d4d4d4",cursorAccent:"#1a1a1a",selectionBackground:"#3a3a3a",black:"#1a1a1a",red:"#f44747",green:"#6a9955",yellow:"#dcdcaa",blue:"#569cd6",magenta:"#c586c0",cyan:"#4ec9b0",white:"#d4d4d4",brightBlack:"#808080",brightRed:"#f44747",brightGreen:"#6a9955",brightYellow:"#dcdcaa",brightBlue:"#569cd6",brightMagenta:"#c586c0",brightCyan:"#4ec9b0",brightWhite:"#ffffff"},mj={background:"#ffffff",foreground:"#383a42",cursor:"#383a42",cursorAccent:"#ffffff",selectionBackground:"#d7d7d7",black:"#383a42",red:"#e45649",green:"#50a14f",yellow:"#c18401",blue:"#4078f2",magenta:"#a626a4",cyan:"#0184bc",white:"#fafafa",brightBlack:"#4f525e",brightRed:"#e06c75",brightGreen:"#98c379",brightYellow:"#e5c07b",brightBlue:"#61afef",brightMagenta:"#c678dd",brightCyan:"#56b6c2",brightWhite:"#ffffff"};function gj({sessionId:e}){const r=R.useRef(null),n=R.useRef(null),s=R.useRef(null),[o,u]=R.useState(!1),f=R.useRef(null),l=R.useRef(null),c=R.useRef(null),h=R.useRef(!1),m=R.useRef(0),p=R.useRef(""),y=R.useRef(null),{sendTerminalInput:x,resizeTerminal:A,subscribeToSession:w,requestTerminalReplay:v}=co(),{resolvedTheme:S}=Kg(),g=R.useMemo(()=>S==="dark"?pj:mj,[S]);R.useEffect(()=>{if(!r.current||n.current)return;const k=new sj.Terminal({cursorBlink:!0,cursorStyle:"block",cursorInactiveStyle:"outline",fontSize:14,fontFamily:'Menlo, Monaco, "Courier New", monospace',theme:g,scrollback:1e4,scrollOnUserInput:!0,smoothScrollDuration:0,fastScrollModifier:"alt",fastScrollSensitivity:5,convertEol:!0,macOptionIsMeta:!0,macOptionClickForcesSelection:!0,rightClickSelectsWord:!0,altClickMovesCursor:!0}),L=new aj.FitAddon,D=new fj;k.loadAddon(L),k.loadAddon(D),k.open(r.current),L.fit(),n.current=k,s.current=L,u(!0),k.onData(K=>{const $=Ve.getState().connectionState;($==="verified"||$==="authenticated")&&x(e,K)}),w(e);const P=setTimeout(()=>{v(e,0,500)},100);return()=>{clearTimeout(P),k.dispose(),n.current=null,s.current=null}},[e,x,w,v]);const _=R.useCallback(k=>{p.current+=k,y.current===null&&(y.current=requestAnimationFrame(()=>{n.current&&p.current&&n.current.write(p.current),p.current="",y.current=null}))},[]),T=R.useCallback(()=>{if(!s.current||!n.current||!r.current)return;const k=Date.now();if(k-m.current<500)return;const L=r.current.getBoundingClientRect(),D=Math.floor(L.width),P=Math.floor(L.height),K=c.current;if(!(K&&K.width===D&&K.height===P)){c.current={width:D,height:P},h.current=!0;try{s.current.fit();const{cols:$,rows:z}=n.current,W=l.current;(!W||W.cols!==$||W.rows!==z)&&(l.current={cols:$,rows:z},m.current=k,A(e,$,z))}finally{setTimeout(()=>{h.current=!1},50)}}},[e,A]);R.useEffect(()=>{if(!r.current||!o)return;const k=r.current,L=()=>{f.current!==null&&clearTimeout(f.current),f.current=setTimeout(()=>{f.current=null;const $=Ve.getState().connectionState;($==="verified"||$==="authenticated")&&T()},150)},D=new ResizeObserver($=>{if(h.current)return;const z=$[0];if(!z)return;let W,F;if(z.borderBoxSize&&z.borderBoxSize[0]?(W=Math.floor(z.borderBoxSize[0].inlineSize),F=Math.floor(z.borderBoxSize[0].blockSize)):(W=Math.floor(z.contentRect.width),F=Math.floor(z.contentRect.height)),W===0||F===0)return;const ee=c.current;ee&&ee.width===W&&ee.height===F||L()});D.observe(k,{box:"border-box"});const P=()=>L();window.addEventListener("resize",P);const K=setTimeout(L,50);return()=>{D.disconnect(),window.removeEventListener("resize",P),clearTimeout(K),f.current!==null&&clearTimeout(f.current)}},[o,T]),R.useEffect(()=>{n.current&&(n.current.options.theme=g)},[g]),R.useEffect(()=>{if(!n.current)return;const k=L=>{L.detail.sessionId===e&&_(L.detail.data)};return window.addEventListener("terminal-output",k),()=>{window.removeEventListener("terminal-output",k),y.current!==null&&(cancelAnimationFrame(y.current),y.current=null),n.current&&p.current&&(n.current.write(p.current),p.current="")}},[e,_]),R.useEffect(()=>{const k=L=>{L.detail.sessionId===e&&n.current&&n.current.clear()};return window.addEventListener("terminal-clear",k),()=>{window.removeEventListener("terminal-clear",k)}},[e]);const M=S==="dark"?"bg-[#1a1a1a]":"bg-white";return b.jsx("div",{className:`flex flex-col h-full ${M}`,children:b.jsx("div",{ref:r,className:"flex-1 p-2"})})}function vj(){const{sessionId:e}=Ub();return e?b.jsx(gj,{sessionId:e}):b.jsx(Ad,{to:"/chat",replace:!0})}var Ph="Switch",[_j]=qn(Ph),[yj,Sj]=_j(Ph),gA=R.forwardRef((e,r)=>{const{__scopeSwitch:n,name:s,checked:o,defaultChecked:u,required:f,disabled:l,value:c="on",onCheckedChange:h,form:m,...p}=e,[y,x]=R.useState(null),A=ot(r,_=>x(_)),w=R.useRef(!1),v=y?m||!!y.closest("form"):!0,[S,g]=ro({prop:o,defaultProp:u??!1,onChange:h,caller:Ph});return b.jsxs(yj,{scope:n,checked:S,disabled:l,children:[b.jsx(Je.button,{type:"button",role:"switch","aria-checked":S,"aria-required":f,"data-state":SA(S),"data-disabled":l?"":void 0,disabled:l,value:c,...p,ref:A,onClick:Le(e.onClick,_=>{g(T=>!T),v&&(w.current=_.isPropagationStopped(),w.current||_.stopPropagation())})}),v&&b.jsx(yA,{control:y,bubbles:!w.current,name:s,value:c,checked:S,required:f,disabled:l,form:m,style:{transform:"translateX(-100%)"}})]})});gA.displayName=Ph;var vA="SwitchThumb",_A=R.forwardRef((e,r)=>{const{__scopeSwitch:n,...s}=e,o=Sj(vA,n);return b.jsx(Je.span,{"data-state":SA(o.checked),"data-disabled":o.disabled?"":void 0,...s,ref:r})});_A.displayName=vA;var bj="SwitchBubbleInput",yA=R.forwardRef(({__scopeSwitch:e,control:r,checked:n,bubbles:s=!0,...o},u)=>{const f=R.useRef(null),l=ot(f,u),c=Cw(n),h=hw(r);return R.useEffect(()=>{const m=f.current;if(!m)return;const p=window.HTMLInputElement.prototype,x=Object.getOwnPropertyDescriptor(p,"checked").set;if(c!==n&&x){const A=new Event("click",{bubbles:s});x.call(m,n),m.dispatchEvent(A)}},[c,n,s]),b.jsx("input",{type:"checkbox","aria-hidden":!0,defaultChecked:n,...o,tabIndex:-1,ref:l,style:{...o.style,...h,position:"absolute",pointerEvents:"none",opacity:0,margin:0}})});yA.displayName=bj;function SA(e){return e?"checked":"unchecked"}var bA=gA,Cj=_A;const CA=R.forwardRef(({className:e,...r},n)=>b.jsx(bA,{className:Te("peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background","disabled:cursor-not-allowed disabled:opacity-50","data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",e),...r,ref:n,children:b.jsx(Cj,{className:Te("pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform","data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0")})}));CA.displayName=bA.displayName;function wj(){const e=Ve(v=>v.credentials),r=Ve(v=>v.workstationInfo),n=Ve(v=>v.tunnelInfo),s=Ve(v=>v.connectionState),{disconnectAndForget:o}=co(),u=Pn(v=>v.reset),f=Pn(v=>v.ttsEnabled),l=Pn(v=>v.setTtsEnabled),{theme:c,setTheme:h}=Kg(),[m,p]=R.useState(!1),y=async()=>{await o(),u(),p(!1)},x=s==="verified"||s==="authenticated",A=()=>{switch(s){case"verified":return"bg-green-500";case"authenticated":return"bg-yellow-500";case"connecting":return"bg-blue-500 animate-pulse";case"error":return"bg-red-500";default:return"bg-gray-500"}},w=()=>{switch(s){case"verified":return"Connected to Workstation";case"authenticated":return"Connected to Tunnel";case"connecting":return"Connecting...";case"error":return"Connection Error";default:return"Disconnected"}};return b.jsx("div",{className:"h-full overflow-y-auto p-4",children:b.jsxs("div",{className:"max-w-2xl mx-auto space-y-6 pb-8",children:[b.jsx("h1",{className:"text-2xl font-bold",children:"Settings"}),b.jsxs(fs,{children:[b.jsxs(ps,{children:[b.jsxs("div",{className:"flex items-center gap-2",children:[b.jsx(vS,{className:"w-5 h-5 text-muted-foreground"}),b.jsx(ms,{children:"Appearance"})]}),b.jsx(Xs,{children:"Customize the look and feel of the application"})]}),b.jsx(gs,{children:b.jsxs("div",{className:"space-y-2",children:[b.jsx("p",{className:"text-sm text-muted-foreground",children:"Theme"}),b.jsxs("div",{className:"flex gap-2",children:[b.jsxs(dt,{variant:"outline",className:Te("flex-1 gap-2",c==="light"&&"border-primary bg-primary/10"),onClick:()=>h("light"),children:[b.jsx(vS,{className:"w-4 h-4"}),"Light"]}),b.jsxs(dt,{variant:"outline",className:Te("flex-1 gap-2",c==="dark"&&"border-primary bg-primary/10"),onClick:()=>h("dark"),children:[b.jsx(YM,{className:"w-4 h-4"}),"Dark"]}),b.jsxs(dt,{variant:"outline",className:Te("flex-1 gap-2",c==="system"&&"border-primary bg-primary/10"),onClick:()=>h("system"),children:[b.jsx(VM,{className:"w-4 h-4"}),"System"]})]})]})})]}),b.jsxs(fs,{children:[b.jsxs(ps,{children:[b.jsxs("div",{className:"flex items-center gap-2",children:[b.jsx(ek,{className:"w-5 h-5 text-muted-foreground"}),b.jsx(ms,{children:"Voice"})]}),b.jsx(Xs,{children:"Configure text-to-speech and voice input settings"})]}),b.jsx(gs,{children:b.jsxs("div",{className:"flex items-center justify-between",children:[b.jsxs("div",{className:"space-y-0.5",children:[b.jsx(aa,{htmlFor:"tts-toggle",className:"text-sm font-medium",children:"Auto-play TTS responses"}),b.jsx("p",{className:"text-sm text-muted-foreground",children:"Automatically play audio when receiving voice responses"})]}),b.jsx(CA,{id:"tts-toggle",checked:f,onCheckedChange:l})]})})]}),b.jsxs(fs,{children:[b.jsxs(ps,{children:[b.jsxs("div",{className:"flex items-center gap-2",children:[x?b.jsx(o1,{className:"w-5 h-5 text-green-500"}):b.jsx(s1,{className:"w-5 h-5 text-muted-foreground"}),b.jsx(ms,{children:"Connection"})]}),b.jsx(Xs,{children:"Current connection status and information"})]}),b.jsxs(gs,{className:"space-y-4",children:[b.jsxs("div",{className:"flex items-center gap-3 p-3 rounded-lg bg-muted/50",children:[b.jsx("div",{className:`w-3 h-3 rounded-full ${A()}`}),b.jsx("span",{className:"font-medium",children:w()})]}),e&&b.jsxs("div",{className:"space-y-3 text-sm",children:[b.jsxs("div",{className:"flex items-center gap-2 text-muted-foreground",children:[b.jsx(t1,{className:"w-4 h-4"}),b.jsx("span",{children:"Connection Details"})]}),b.jsxs("div",{className:"grid gap-2 pl-6",children:[b.jsxs("div",{className:"flex justify-between",children:[b.jsx("span",{className:"text-muted-foreground",children:"Tunnel ID:"}),b.jsx("span",{className:"font-mono text-xs",children:e.tunnelId})]}),b.jsxs("div",{className:"flex justify-between",children:[b.jsx("span",{className:"text-muted-foreground",children:"Tunnel URL:"}),b.jsx("span",{className:"font-mono text-xs truncate max-w-[200px]",children:e.tunnelUrl})]}),b.jsxs("div",{className:"flex justify-between",children:[b.jsx("span",{className:"text-muted-foreground",children:"Device ID:"}),b.jsx("span",{className:"font-mono text-xs",children:e.deviceId})]})]})]}),r&&b.jsxs("div",{className:"space-y-3 text-sm border-t pt-4",children:[b.jsxs("div",{className:"flex items-center gap-2 text-muted-foreground",children:[b.jsx(zM,{className:"w-4 h-4"}),b.jsx("span",{children:"Workstation"})]}),b.jsxs("div",{className:"grid gap-2 pl-6",children:[b.jsxs("div",{className:"flex justify-between",children:[b.jsx("span",{className:"text-muted-foreground",children:"Name:"}),b.jsx("span",{children:r.name})]}),b.jsxs("div",{className:"flex justify-between",children:[b.jsx("span",{className:"text-muted-foreground",children:"Version:"}),b.jsx("span",{className:"font-mono text-xs",children:r.version})]}),r.workspacesRoot&&b.jsxs("div",{className:"flex justify-between",children:[b.jsx("span",{className:"text-muted-foreground",children:"Workspaces:"}),b.jsx("span",{className:"font-mono text-xs truncate max-w-[200px]",children:r.workspacesRoot})]})]})]}),n&&b.jsxs("div",{className:"space-y-3 text-sm border-t pt-4",children:[b.jsxs("div",{className:"flex items-center gap-2 text-muted-foreground",children:[b.jsx(JM,{className:"w-4 h-4"}),b.jsx("span",{children:"Tunnel Server"})]}),b.jsxs("div",{className:"grid gap-2 pl-6",children:[b.jsxs("div",{className:"flex justify-between",children:[b.jsx("span",{className:"text-muted-foreground",children:"Version:"}),b.jsx("span",{className:"font-mono text-xs",children:n.version})]}),n.protocolVersion&&b.jsxs("div",{className:"flex justify-between",children:[b.jsx("span",{className:"text-muted-foreground",children:"Protocol:"}),b.jsxs("span",{className:"font-mono text-xs",children:["v",n.protocolVersion]})]})]})]})]})]}),b.jsxs(fs,{children:[b.jsxs(ps,{children:[b.jsx(ms,{children:"About"}),b.jsx(Xs,{children:"Tiflis Code Web Client"})]}),b.jsxs(gs,{className:"space-y-2 text-sm",children:[b.jsxs("div",{className:"flex justify-between",children:[b.jsx("span",{className:"text-muted-foreground",children:"Version:"}),b.jsx("span",{className:"font-mono",children:"0.1.0"})]}),b.jsxs("div",{className:"flex justify-between",children:[b.jsx("span",{className:"text-muted-foreground",children:"Author:"}),b.jsx("span",{children:"Roman Barinov"})]}),b.jsxs("div",{className:"flex justify-between",children:[b.jsx("span",{className:"text-muted-foreground",children:"Repository:"}),b.jsx("a",{href:"https://github.com/tiflis-io/tiflis-code",target:"_blank",rel:"noopener noreferrer",className:"text-primary hover:underline",children:"tiflis-io/tiflis-code"})]}),b.jsxs("div",{className:"flex justify-between",children:[b.jsx("span",{className:"text-muted-foreground",children:"License:"}),b.jsx("span",{children:"FSL-1.1-NC"})]})]})]}),b.jsxs(fs,{children:[b.jsx(ps,{children:b.jsx(ms,{children:"Legal"})}),b.jsxs(gs,{className:"space-y-2 text-sm",children:[b.jsxs("div",{className:"flex justify-between items-center",children:[b.jsx("span",{className:"text-muted-foreground",children:"Privacy Policy"}),b.jsx("a",{href:"https://github.com/tiflis-io/tiflis-code/blob/main/PRIVACY.md",target:"_blank",rel:"noopener noreferrer",className:"text-primary hover:underline",children:"View"})]}),b.jsxs("div",{className:"flex justify-between items-center",children:[b.jsx("span",{className:"text-muted-foreground",children:"Terms of Service"}),b.jsx("a",{href:"https://github.com/tiflis-io/tiflis-code/blob/main/TERMS.md",target:"_blank",rel:"noopener noreferrer",className:"text-primary hover:underline",children:"View"})]})]})]}),b.jsxs(fs,{className:"border-destructive/50",children:[b.jsxs(ps,{children:[b.jsx(ms,{className:"text-destructive",children:"Danger Zone"}),b.jsx(Xs,{children:"Disconnect and clear all stored data"})]}),b.jsx(gs,{children:b.jsxs(Zd,{open:m,onOpenChange:p,children:[b.jsx(EN,{asChild:!0,children:b.jsxs(dt,{variant:"destructive",className:"w-full",children:[b.jsx(rc,{className:"w-4 h-4"}),"Disconnect & Forget All Data"]})}),b.jsxs(sc,{children:[b.jsxs(oc,{children:[b.jsx(lc,{children:"Are you sure?"}),b.jsxs(cc,{children:["This will permanently delete all stored connection data including:",b.jsxs("ul",{className:"list-disc list-inside mt-2 space-y-1",children:[b.jsx("li",{children:"Authentication keys"}),b.jsx("li",{children:"Tunnel connection settings"}),b.jsx("li",{children:"Device ID"}),b.jsx("li",{children:"All stored preferences"})]}),b.jsx("p",{className:"mt-2 font-medium",children:"You will need to scan a QR code or paste a magic link again to reconnect."})]})]}),b.jsxs(ac,{children:[b.jsx(dc,{children:"Cancel"}),b.jsx(uc,{onClick:y,className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"Delete All Data"})]})]})]})})]})]})})}function xj(){const e=Ve(r=>r.isAuthenticated);return b.jsx(SD,{children:b.jsx($R,{children:e?b.jsxs(b.Fragment,{children:[b.jsxs(Ln,{element:b.jsx(CI,{}),children:[b.jsx(Ln,{path:"/",element:b.jsx(Ad,{to:"/chat",replace:!0})}),b.jsx(Ln,{path:"/chat",element:b.jsx(wb,{})}),b.jsx(Ln,{path:"/chat/:sessionId",element:b.jsx(wb,{})}),b.jsx(Ln,{path:"/terminal/:sessionId",element:b.jsx(vj,{})}),b.jsx(Ln,{path:"/settings",element:b.jsx(wj,{})})]}),b.jsx(Ln,{path:"*",element:b.jsx(Ad,{to:"/chat",replace:!0})})]}):b.jsxs(b.Fragment,{children:[b.jsx(Ln,{path:"/",element:b.jsx(Bk,{})}),b.jsx(Ln,{path:"*",element:b.jsx(Ad,{to:"/",replace:!0})})]})})})}class Ej extends R.Component{constructor(n){super(n);_e(this,"handleReset",()=>{this.setState({hasError:!1,error:null,errorInfo:null})});_e(this,"handleReload",()=>{window.location.reload()});this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError(n){return{hasError:!0,error:n}}componentDidCatch(n,s){this.setState({errorInfo:s})}render(){return this.state.hasError?this.props.fallback?this.props.fallback:b.jsx("div",{className:"flex min-h-screen items-center justify-center bg-background p-4",role:"alert","aria-live":"assertive",children:b.jsxs("div",{className:"w-full max-w-md space-y-6 text-center",children:[b.jsx("div",{className:"mx-auto flex h-16 w-16 items-center justify-center rounded-full bg-destructive/10",children:b.jsx(Yg,{className:"h-8 w-8 text-destructive","aria-hidden":"true"})}),b.jsxs("div",{className:"space-y-2",children:[b.jsx("h1",{className:"text-2xl font-semibold text-foreground",children:"Something went wrong"}),b.jsx("p",{className:"text-muted-foreground",children:"An unexpected error occurred. Please try again or reload the page."})]}),!1,b.jsxs("div",{className:"flex flex-col gap-3 sm:flex-row sm:justify-center",children:[b.jsxs(dt,{variant:"outline",onClick:this.handleReset,className:"gap-2",children:[b.jsx(zg,{className:"h-4 w-4","aria-hidden":"true"}),"Try again"]}),b.jsx(dt,{onClick:this.handleReload,children:"Reload page"})]})]})}):this.props.children}}function Aj(){const e=LN();return b.jsx(MN,{toasts:e,onDismiss:r=>vi.dismiss(r)})}const wA=document.getElementById("root");if(!wA)throw new Error("Root element not found");$T.createRoot(wA).render(b.jsx(R.StrictMode,{children:b.jsx(Ej,{children:b.jsxs(Ok,{defaultTheme:"system",children:[b.jsx(xj,{}),b.jsx(Aj,{})]})})}));
|
|
420
|
-
//# sourceMappingURL=index-
|
|
420
|
+
//# sourceMappingURL=index-Dbp_G3RV.js.map
|