1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3141],{914:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(73068).A)("CircleCheck",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]])},11600:(e,t,s)=>{Promise.resolve().then(s.bind(s,22913)),Promise.resolve().then(s.bind(s,55501))},18563:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(73068).A)("ArrowDown",[["path",{d:"M12 5v14",key:"s699le"}],["path",{d:"m19 12-7 7-7-7",key:"1idqje"}]])},22913:(e,t,s)=>{"use strict";s.d(t,{LiveWorkspace:()=>eJ});var a=s(66891),r=s(74267),l=s(59914),n=s(18563),i=s(42971),d=s(37758),o=s(76576),c=s(73068);let u=(0,c.A)("Square",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]);var x=s(11585),m=s(95892),p=s(34238),h=s(55512),b=s(13586),g=s(75975),f=s(38648),v=s(26466),k=s(54369),y=s(31801),j=s(2284),w=s(85928),C=s(79620),z=s(21870),N=s(82346),I=s(92899),S=s(61499),M=s(66894),T=s(97334),A=s(88150),P=s(84809),O=s(75126),R=s(70372);let E={endpoint:"",auth:{type:"none"},transport:"auto"},B={excludeRetransmissions:!1,minMessages:1,failedOnly:!1},L=null,$=null,H=null,F=null,_=new Map,q=new Map,U=new Map,D=new Map,W=new Map,G=new Map;function K(e){return F&&F.config.endpoint===e.endpoint&&F.config.auth?.type===e.auth?.type&&F.config.auth?.value===e.auth?.value&&F.config.transport===e.transport&&F.config.bridgeExtensionId===e.bridgeExtensionId?F:F=new P.zp(e,e.bridgeExtensionId?.trim()||void 0)}function Q(e,t,s,a,r){let l=new Map;for(let t of e)l.set(t.callId,[...t.messages]);for(let e of t){if(!a&&e.isRetransmission)continue;let t=l.get(e.callId)??[];t.some(t=>t.id===e.id)||t.push(e),l.set(e.callId,t)}let n=[];for(let e of l.values())n.push(...e);let i=(0,O.mm)(n).filter(e=>(function(e,t){if(t.minMessages&&e.messages.length<t.minMessages||t.failedOnly&&"failed"!==e.state)return!1;if(t.method){let s=t.method.toUpperCase();if(!e.messages.some(e=>e.method?.toUpperCase()===s))return!1}if(t.phoneNumber){let s=t.phoneNumber.toLowerCase();if(!`${e.from??""} ${e.to??""}`.toLowerCase().includes(s))return!1}return!0})(e,s));i.sort((e,t)=>t.startTime-e.startTime);let d=i.slice(0,r),o=new Set(e.map(e=>e.callId)),c=new Set;for(let e of d)o.has(e.callId)||c.add(e.callId);return{calls:d,addedCallIds:c}}let Y=(0,M.v)()((0,T.Zr)((e,t)=>({config:E,filters:B,maxCalls:200,showRetransmissions:!0,feedState:"idle",transport:"disconnected",messagesPerSec:0,droppedSinceStart:0,lastTestResult:null,bridgeAvailable:null,bridgeProbed:!1,bridgeCapabilities:[],liveSource:"homer",activeCaptureTabs:[],audioFaultsByCallId:new Map,runtimeOverlayByCallId:new Map,calls:[],callGroups:[],selectedCallId:null,selectedMessageId:null,newCallIds:new Set,paused:!1,pendingCalls:[],pendingMessages:[],feedError:null,searching:!1,searchError:null,mobileTab:"calls",callsOpen:!0,issuesOpen:!0,inspectorOpen:!0,setEndpoint:t=>{e(e=>({config:{...e.config,endpoint:t.trim()}})),R.C.getState().setLiveConfig({endpoint:t.trim()})},setAuth:t=>{e(e=>({config:{...e.config,auth:t}})),R.C.getState().setLiveConfig({auth:t})},setTransportPreference:t=>{e(e=>({config:{...e.config,transport:t}})),R.C.getState().setLiveConfig({transport:t})},setBridgeExtensionId:t=>{let s=t.trim()||void 0;e(e=>({config:{...e.config,bridgeExtensionId:s},bridgeProbed:!1,bridgeAvailable:null,bridgeCapabilities:[]})),R.C.getState().setLiveConfig({bridgeExtensionId:s})},setLiveSource:t=>{e({liveSource:t}),R.C.getState().setLiveSource(t)},setFilters:t=>e(e=>({filters:{...e.filters,...t}})),setMaxCalls:t=>{let s=Math.min(500,Math.max(50,Math.floor(t)));e({maxCalls:s}),R.C.getState().setMaxCalls(s)},setShowRetransmissions:t=>{e({showRetransmissions:t}),R.C.getState().setShowRetransmissions(t)},setMobileTab:t=>e({mobileTab:t}),setCallsOpen:t=>e({callsOpen:t}),setIssuesOpen:t=>e({issuesOpen:t}),setInspectorOpen:t=>e({inspectorOpen:t}),applyRtcp:s=>{ea(e,t,s)},applyQuality:s=>{er(e,t,s)},selectCall:t=>{e(e=>{let s=new Set(e.newCallIds);t&&s.delete(t);let a=t?function(e,t){let s=e.find(e=>e.calls.some(e=>e.callId===t));if(!s)return null;let a=[...s.calls].sort((e,t)=>e.startTime-t.startTime)[0];return a?.callId??null}(e.callGroups,t)??t:null;return{selectedCallId:a,selectedMessageId:null,newCallIds:s,mobileTab:a?"ladder":"calls"}})},selectMessage:t=>e(e=>({selectedMessageId:t,mobileTab:t?"inspector":e.mobileTab})),togglePause:()=>{let{paused:s,pendingMessages:a}=t();s?(e({paused:!1}),a.length>
10&&(X(e,t,a,!0),e({pendingMessages:[],pendingCalls:[]}))):e({paused:!0})},flushPending:()=>{let{pendingMessages:s}=t();0!==s.length&&(X(e,t,s,!0),e({pendingMessages:[],pendingCalls:[]}))},clearCalls:()=>{_.clear(),q.clear(),U.clear(),D.clear(),V.clear(),e({calls:[],callGroups:[],newCallIds:new Set,selectedCallId:null,selectedMessageId:null,pendingCalls:[],pendingMessages:[],audioFaultsByCallId:new Map,runtimeOverlayByCallId:new Map})},recomputeGroups:()=>{let s=t();if(0===s.calls.length)return;let a=R.C.getState().correlationHeaders;e({callGroups:(0,O.KE)(s.calls,a).sort((e,t)=>t.startTime-e.startTime)})},testConnection:async()=>{let{config:s}=t();if(!s.endpoint){let t={success:!1,message:"Set the Homer endpoint URL first."};return e({lastTestResult:t}),t}let a=K(s),r=new P.Hu(a),l=await r.testConnection();return e({lastTestResult:l}),l},probeBridge:async()=>{let{config:s}=t(),a=K(s),r=await a.probeBridge();e({bridgeAvailable:r.available,bridgeProbed:!0,bridgeCapabilities:r.capabilities??[]})},checkBridgePermission:async e=>{let{config:s}=t(),a=K(s),r=await a.route();if("bridge"!==r)return{granted:!0,route:r,pattern:""};let l=await a.checkHostPermission(e);return{granted:l.granted,route:r,pattern:l.pattern}},requestBridgePermission:async s=>{let{config:a}=t(),r=K(a),l=r.requestHostPermissionViaPopup(s),n=await l;return n.granted&&e({bridgeAvailable:(await r.probeBridge()).available,bridgeProbed:!0}),n},connect:()=>{let s=t();if("browser-capture"===s.liveSource){var a,r;let s,l;return void(a=e,r=t,J(),s=K(r().config),a({feedError:null,droppedSinceStart:0,audioFaultsByCallId:new Map,runtimeOverlayByCallId:new Map}),_.clear(),q.clear(),U.clear(),D.clear(),V.clear(),$=l=new P.h7(s,{onCorrelation:e=>(function(e,t){for(let t of e)V.set(t.messageId,t)})(e,r()),onBatch:e=>{let t=r();if(t.paused)a({pendingCalls:Q(t.pendingCalls.length>0?t.pendingCalls:t.calls,e,t.filters,t.showRetransmissions,t.maxCalls).calls,pendingMessages:[...t.pendingMessages,...e]});else{X(a,r,e,!1);let t=r();for(let e of t.calls)if(!_.has(e.callId))for(let t of e.messages){let s=V.get(t.id);if(s){_.set(e.callId,s.tabId),V.delete(t.id);break}}Z([],t)}},onRuntimeEvents:e=>{Z(e,r());let t=function(e){let t=new Set;for(let s of e){let e;if("pcId"in s&&s.pcId&&(e=q.get(s.pcId)),!e)continue;let a=U.get(e)??[];a.push(s),a.length>500&&a.shift(),U.set(e,a),t.add(e)}return t}(e);!function(e,t,s){for(let a of s){if("pc_stats_sample"!==a.type)continue;let s=q.get(a.pcId);if(!s)continue;let r=a.audio;if(!r)continue;let l=(r.jitter??0)*1e3,n=r.packetsLost??0,i=r.packetsReceived??0,d=n+i>0?n/(n+i):0;ea(e,t,{callId:s,report:{timestamp:a.ts,ssrc:0,src:{ip:"127.0.0.1",port:0},dst:{ip:a.origin||"0.0.0.0",port:0},fractionLost:d,packetsLost:n,highestSeq:0,iaJitter:l,lsr:0,dlsr:0,rttMs:a.candidatePair?.currentRoundTripTime!==void 0?1e3*a.candidatePair.currentRoundTripTime:void 0}})}}(a,r,e),t.size>0&&function(e,t,s){let a=new Map(t.audioFaultsByCallId),r=new Map(t.runtimeOverlayByCallId);for(let e of s){let s=U.get(e)??[],l=t.calls.find(t=>t.callId===e),n=l?function(e){for(let t of e.messages){let e=t.parsedSdp;if(e)for(let t of e.media){if("audio"!==t.kind)continue;let e=t.rtpmaps.find(e=>!/telephone-event|cn|red|opus-?red/i.test(e.encoding));if(e)return e.encoding}}}(l):void 0;n&&D.set(e,n);let i=(0,O.ZG)(s,e,{negotiatedCodec:n??D.get(e)});0===i.length?a.delete(e):a.set(e,i);let d=(0,O.Br)(s);0===d.states.size?r.delete(e):r.set(e,d)}e({audioFaultsByCallId:a,runtimeOverlayByCallId:r})}(a,r(),t)},onActiveTabs:e=>a({activeCaptureTabs:e}),onState:e=>a({feedState:e}),onTransport:e=>a({transport:e}),onError:e=>a({feedError:e}),onStats:({messagesPerSec:e,droppedSinceStart:t})=>a({messagesPerSec:e,droppedSinceStart:t})}),l.start())}if(!s.config.endpoint)return void e({feedError:"Set the Homer endpoint URL first."});J();let l=K(s.config);(H=new P.YM(l,{onRtcp:s=>ea(e,t,s),onQuality:s=>er(e,t,s),onError:t=>e({feedError:t})},Date.now())).start();let n=new P.qB(l,{onBatch:s=>{let a=t();a.paused?e({pendingCalls:Q(a.pendingCalls.length>0?a.pendingCalls:a.calls,s,a.filters,a.showRetransmissions,a.maxCalls).calls,pendingMessages:[...a.pendingMessages,...s]}):X(e,t,s,!1)},onState:t=>e({feedState:t}),onTransport:t=>e({transport:t}),onError:t=>e({feedError:t}),onStats:({messagesPerSec:t,droppedSinceStart:s})=>e({messagesPerSec:t,droppedSinceStart:s})},Date.now());L=n,e({feedError:null,droppedSinceStart:0}),n.start()},disconnect:()=>{J(),e({feedState:"idle",transport:"disconnected",messagesPerSec:0,activeCaptureTabs:[]})},runHistoricalSearch:async s=>{let{config:a}=t();if(!a.endpoint)return void e({searchError:"Set the Homer endpoint URL first."});e({searching:!0,searchError:null});let r=K(a),l=new P.Hu(r),n=await l.search(s);n.error?e({searching:!1,searchError:n.error}):(X(e,t,n.calls.flatMap(e=>e.messages),!0),e({searching:!1}))}}),{name:"sipflow.homer",storage:(0,T.KU)(()=>localStorage),partialize:e=>({config:e.config,filters:e.filters,maxCalls:e.maxCalls,showRetransmissions:e.showRetransmissions})}));function J(){L&&(L.stop(),L=null),$&&($.stop(),$=null),H&&(H.stop(),H=null)}let V=new Map;function Z(e,t){for(let s of e){if("pc_local_description"!==s.type&&"pc_remote_description"!==s.type||q.has(s.pcId))continue;let e=function(e){let t=/^a=fingerprint:\s*\S+\s+(\S+)/m.exec(e);return t?.[1]??null}(s.sdp),a=function(e){let t=/^a=ice-ufrag:\s*(\S+)/m.exec(e);return t?.[1]??null}
1(s.sdp),r=null;if(e||a)for(let s of t.calls){for(let t of s.messages){for(let l of t.parsedSdp?.media??[])if(e&&l.fingerprint&&l.fingerprint.fingerprint===e||a&&l.iceUfrag===a){r=s.callId;break}if(r)break}if(r)break}if(!r){let e=t.calls.filter(e=>_.get(e.callId)===s.tabId).sort((e,t)=>t.startTime-e.startTime);r=e[0]?.callId??null}r&&q.set(s.pcId,r)}}function X(e,t,s,a){let r=t(),l=Q(r.calls,s,r.filters,r.showRetransmissions,r.maxCalls),n=new Set(r.newCallIds);for(let e of l.addedCallIds)n.add(e);let i=l.calls;for(let e of l.addedCallIds)i=function(e,t){let s=W.get(t),a=G.get(t);return s||a?(W.delete(t),G.delete(t),e.map(e=>{if(e.callId!==t)return e;let r=e.mediaQuality;for(let t of s??[])r=(0,P.Id)(e,r,t.report);for(let l of a??[])r=(0,P.Yr)(e,r,t,l.report,s?.[0]?.report?{src:s[0].report.src,dst:s[0].report.dst}:void 0);return r?{...e,mediaQuality:r}:e})):e}(i,e);let d=R.C.getState().correlationHeaders,o=(0,O.KE)(i,d).sort((e,t)=>t.startTime-e.startTime);e({calls:i,callGroups:o,newCallIds:n}),a&&null===r.selectedCallId&&l.calls[0]&&e({selectedCallId:l.calls[0].callId})}function ee(e,t,s,a){let r=t().calls.map(e=>e.callId===s?{...e,mediaQuality:a}:e),l=R.C.getState().correlationHeaders,n=(0,O.KE)(r,l).sort((e,t)=>t.startTime-e.startTime);e({calls:r,callGroups:n})}function et(e,t){return e.calls.find(e=>e.callId===t)}function es(e,t,s){let a=e.get(t)??[];a.push(s),e.set(t,a),setTimeout(()=>{let s=e.get(t);if(!s)return;let a=s.filter(e=>Date.now()-e.report.timestamp<3e4);0===a.length?e.delete(t):e.set(t,a)},3e4)}function ea(e,t,s){var a,r;let l=t(),n=s.callId?et(l,s.callId):void 0;if(n||(a=s.report.src,r=s.report.dst,n=l.calls.find(e=>{let t=e.messages.find(e=>"INVITE"===e.method&&e.sdpInfo),s=t?.sdpInfo?.streams.find(e=>"audio"===e.media);if(!s)return!1;let l=s.address??t?.source.ip;if(!l)return!1;let n=s.port;return a.ip===l&&a.port===n||r.ip===l&&r.port===n})),!n){s.callId&&es(W,s.callId,s);return}let i=(0,P.Id)(n,n.mediaQuality,s.report);ee(e,t,n.callId,i)}function er(e,t,s){let a=t(),r=s.callId?et(a,s.callId):void 0;if(!r){s.callId&&es(G,s.callId,s);return}let l=(0,P.Yr)(r,r.mediaQuality,r.callId,s.report);ee(e,t,r.callId,l)}function el(){return Y((0,A.k)(e=>e.selectedCallId?e.callGroups.find(t=>t.calls.some(t=>t.callId===e.selectedCallId))??null:null))}R.C.subscribe(e=>{let t=Y.getState(),s={};(e.liveConfig.endpoint!==t.config.endpoint||e.liveConfig.auth?.type!==t.config.auth?.type||e.liveConfig.auth?.value!==t.config.auth?.value||e.liveConfig.transport!==t.config.transport||e.liveConfig.bridgeExtensionId!==t.config.bridgeExtensionId)&&(s.config=e.liveConfig),e.liveSource!==t.liveSource&&(s.liveSource=e.liveSource),e.maxCalls!==t.maxCalls&&(s.maxCalls=e.maxCalls),e.showRetransmissions!==t.showRetransmissions&&(s.showRetransmissions=e.showRetransmissions),Object.keys(s).length>0&&Y.setState(s)});let en=[{id:"5m",label:"5m",ms:3e5},{id:"15m",label:"15m",ms:9e5},{id:"1h",label:"1h",ms:36e5},{id:"6h",label:"6h",ms:216e5},{id:"24h",label:"24h",ms:864e5},{id:"7d",label:"7d",ms:6048e5}];function ei(){let e=Y(e=>e.searching),t=Y(e=>e.searchError),s=Y(e=>e.runHistoricalSearch),[l,n]=(0,r.useState)(""),[i,d]=(0,r.useState)(""),[o,c]=(0,r.useState)("1h"),[u,x]=(0,r.useState)(50),m=async e=>{e.preventDefault();let t=en.find(e=>e.id===o)?.ms??36e5;await s({phoneNumber:l.trim()||void 0,callId:i.trim()||void 0,fromDate:new Date(Date.now()-t),toDate:new Date,limit:u})};return(0,a.jsxs)("form",{onSubmit:m,className:"border-b border-zinc-200 bg-white p-3 dark:border-white/10 dark:bg-zinc-950","aria-label":"Search Homer history",children:[(0,a.jsxs)("div",{className:"grid grid-cols-1 gap-2 sm:grid-cols-[1fr_1fr_auto_auto_auto]",children:[(0,a.jsx)("input",{type:"search",name:"phoneNumber","aria-label":"Phone number",placeholder:"Phone number",value:l,onChange:e=>n(e.target.value),className:"h-10 w-full rounded-lg border border-zinc-200 bg-white px-3 text-sm placeholder-zinc-400 focus:border-brand-500 focus:outline-2 focus:outline-brand-500/30 dark:border-white/10 dark:bg-zinc-900 dark:text-zinc-100"}),(0,a.jsx)("input",{type:"search",name:"callId","aria-label":"Call-ID",placeholder:"Call-ID",value:i,onChange:e=>d(e.target.value),className:"h-10 w-full rounded-lg border border-zinc-200 bg-white px-3 font-mono text-xs placeholder-zinc-400 focus:border-brand-500 focus:outline-2 focus:outline-brand-500/30 dark:border-white/10 dark:bg-zinc-900 dark:text-zinc-100"}),(0,a.jsx)("div",{className:"inline-flex divide-x divide-zinc-200 overflow-hidden rounded-lg border border-zinc-200 dark:divide-white/10 dark:border-white/10",children:en.map(e=>(0,a.jsx)("button",{type:"button",onClick:()=>c(e.id),"aria-pressed":o===e.id,className:o===e.id?"bg-brand-50 px-2.5 text-xs font-medium text-brand-700 dark:bg-brand-500/10 dark:text-brand-300":"bg-white px-2.5 text-xs text-zinc-600 hover:bg-zinc-50 dark:bg-zinc-900 dark:text-zinc-400 dark:hover:bg-white/5",children:e.label},e.id))}),(0,a.jsxs)("select",{"aria-label":"Limit",value:u,onChange:e=>x(Number(e.target.value)),className:"h-10 rounded-lg border border-zinc-200 bg-white px-2 text-xs focus:border-brand-500 focus:outline-2 focus:outline-brand-500/30 dark:border-white/10 dark:bg-zinc-900 dark:text-zinc-100",children:[(0,a.jsx)("option",{value:25,children:"25"}),(0,a.jsx)("option",{value:50,children:"50"}),(0,a.jsx)("option",{value:100,children:"100"}),(0,a.jsx)("option",{value:250,children:"250"})]}),(0,a.jsxs)(g.$,{type:"submit",size:"md",disabled:e,children:[e?(0,a.jsx)(I.A,{className:"size-4 animate-spin"}):(0,a.jsx)(S.A,{className:"size-4"}),(0,a.jsx)("span",{className:"max-sm:sr-only",children:"Search"})]})]}),t?(0,a.jsx)("p",{className:"mt-2 text-xs text-red-600 dark:text-red-400",children:t}):null]})}var ed=s(75431);let eo=(0,c.A)("RadioTower",[["path",{d:"M4.9 16.1C1 12.2 1 5.8 4.9 1.9",key:"s0qx1y"}],["path",{d:"M7.8 4.7a6.14 6.14 0 0 0-.8 7.5",key:"1idnkw"}],["circle",{cx:"12",cy:"9",r:"2",key:"1092wv"}],["path",{d:"M16.2 4.8c2 2 2.26 5.11.8 7.47",key:"ojru2q"}],["path",{d:"M19.1 1.9a9.96 9.96 0 0 1 0 14.1",key:"rhi7fg"}],["path",{d:"M9.5 18h5",key:"mfy3pd"}],["path",{d:"m8 22 4-11 4 11",key:"25yftu"}]]);var ec=s(96506),eu=s(77182);let ex=(0,c.A)("RefreshCcw",[["path",{d:"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"14sxne"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16",key:"1hlbsb"}],["path",{d:"M16 16h5v5",key:"ccwih5"}]]),em=(0,c.A)("WifiOff",[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}],["path",{d:"M5 12.859a10 10 0 0 1 5.17-2.69",key:"1dl1wf"}],["path",{d:"M19 12.859a10 10 0 0 0-2.007-1.523",key:"4k23kn"}
1],["path",{d:"M2 8.82a15 15 0 0 1 4.177-2.643",key:"1grhjp"}],["path",{d:"M22 8.82a15 15 0 0 0-11.288-3.764",key:"z3jwby"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);function ep({feedState:e,transport:t,paused:s,messagesPerSec:r,pendingCount:l,bridgeAvailable:n,liveSource:i="homer",activeCaptureTabs:d=0,audioFaultCount:o=0}){let c=function(e,t,s,a){if(s)return"Paused";switch(e){case"live":if("browser-capture"===a)return"Live \xb7 Browser";return"polling"===t?"Live (polling)":"Live";case"polling":return"Polling";case"connecting":return"Connecting";case"reconnecting":return"Reconnecting";case"error":return"Error";default:return"Idle"}}(e,t,s,i),u=function(e,t){if(t)return"bg-amber-100 text-amber-800 dark:bg-amber-500/15 dark:text-amber-300";switch(e){case"live":return"bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-300";case"polling":return"bg-sky-100 text-sky-700 dark:bg-sky-500/15 dark:text-sky-300";case"connecting":case"reconnecting":return"bg-zinc-100 text-zinc-700 dark:bg-white/5 dark:text-zinc-300";case"error":return"bg-red-100 text-red-700 dark:bg-red-500/15 dark:text-red-300";default:return"bg-zinc-100 text-zinc-600 dark:bg-white/5 dark:text-zinc-400"}}(e,s),x="browser-capture"===i?0===d?"Browser SIP capture - no dialer tabs detected yet":`Capturing from ${d} dialer tab${1===d?"":"s"}`:void 0;return(0,a.jsxs)("div",{role:"status","aria-live":"polite",title:x,className:(0,v.cn)("inline-flex items-center gap-x-1.5 rounded-full px-2.5 py-1 text-xs font-medium tabular-nums",u),children:[(0,a.jsx)(eh,{feedState:e,paused:s,liveSource:i}),(0,a.jsx)("span",{children:c}),"live"!==e||s?null:(0,a.jsxs)("span",{className:"text-[11px] opacity-80",children:["\xb7 ",r.toFixed(1)," msg/s"]}),s&&l>0?(0,a.jsxs)("span",{className:"text-[11px] opacity-80",children:["\xb7 ",l," queued"]}):null,"polling"===t?(0,a.jsx)("span",{className:"text-[11px] opacity-80",children:"\xb7 polling"}):null,"browser-capture"===i&&d>0?(0,a.jsxs)("span",{className:"text-[11px] opacity-80",children:["\xb7 ",d," tab",1===d?"":"s"]}):null,!1===n?(0,a.jsx)("span",{className:"text-[11px] opacity-80",children:"\xb7 no bridge"}):null,o>0?(0,a.jsx)("span",{className:"ml-1 inline-block size-1.5 rounded-full bg-amber-500",title:`${o} live audio fault${1===o?"":"s"}`,"aria-label":`${o} live audio faults`}):null]})}function eh({feedState:e,paused:t,liveSource:s}){let r=(0,v.cn)("size-3.5","live"===e&&!t&&"animate-pulse");if(t)return(0,a.jsx)(ed.A,{className:r});switch(e){case"live":return"browser-capture"===s?(0,a.jsx)(eo,{className:r}):(0,a.jsx)(ec.A,{className:r});case"polling":return(0,a.jsx)(eu.A,{className:r});case"connecting":case"reconnecting":return(0,a.jsx)(ex,{className:r});case"error":return(0,a.jsx)(h.A,{className:r});default:return(0,a.jsx)(em,{className:r})}}var eb=s(1652),eg=s(34911),ef=s(80378),ev=s(93660),ek=s(89751),ey=s(14190);let ej={error:{Icon:eb.A,color:"text-red-500",badge:"error"},warning:{Icon:h.A,color:"text-amber-500",badge:"warning"},info:{Icon:eg.A,color:"text-sky-500",badge:"info"}};function ew(){let e,t=(e=el(),(0,r.useMemo)(()=>e?(0,O.So)(e):null,[e])),s=Y(e=>e.selectMessage),l=Y(e=>e.audioFaultsByCallId),n=(0,r.useMemo)(()=>t?(0,O.uF)(t):[],[t]),i=(0,r.useMemo)(()=>t?l.get(t.callId)??[]:[],[t,l]),d=(0,z.Jn)();if(!t)return(0,a.jsxs)("div",{className:"flex h-full flex-col",children:[(0,a.jsx)(ez,{onHide:d?.collapseIssues,summary:"No call selected"}),(0,a.jsx)(ek.p,{Icon:m.A,title:"No call selected",description:"Pick a call from the list to surface its issues here."})]});let o=n.length+i.length;return 0===o?(0,a.jsxs)("div",{className:"flex h-full flex-col",children:[(0,a.jsx)(ez,{onHide:d?.collapseIssues,summary:"0 issues"}),(0,a.jsx)(ek.p,{Icon:eg.A,iconClassName:"text-emerald-400 dark:text-emerald-400",title:"No issues detected",description:"This call looks healthy."})]}):(0,a.jsxs)("div",{className:"flex h-full flex-col",children:[(0,a.jsx)(ez,{onHide:d?.collapseIssues,summary:`${o} ${1===o?"issue":"issues"} in selected call`}),(0,a.jsxs)("ul",{role:"list",className:"scrollbar-thin flex-1 divide-y divide-zinc-100 overflow-y-auto dark:divide-white/5",children:[i.length>0?(0,a.jsx)("li",{className:"bg-amber-50/40 px-4 py-2 text-[11px] font-medium uppercase tracking-wide text-amber-700 sm:px-3 sm:py-1.5 dark:bg-amber-500/5 dark:text-amber-300",children:"Live audio"}):null,i.map((e,t)=>{let s=ej[e.severity];return(0,a.jsxs)("li",{className:"group relative",children:[(0,a.jsxs)("div",{className:"flex w-full items-start gap-x-3 px-4 py-4 pr-10 sm:px-3 sm:py-3 sm:pr-9",children:[(0,a.jsx)(ef.A,{className:(0,v.cn)("mt-0.5 size-5 shrink-0 sm:size-4",s.color)}),(0,a.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-x-2 gap-y-1",children:[(0,a.jsx)("p",{className:"min-w-0 flex-1 truncate text-base font-medium text-zinc-900 sm:text-sm dark:text-zinc-100",children:eC(e.id)}),(0,a.jsx)(f.E,{variant:s.badge,children:e.severity})]}),(0,a.jsx)("p",{className:"mt-1 text-pretty text-sm text-zinc-600 sm:text-xs dar
1k:text-zinc-400",children:e.evidence}),e.remedyChecklistId?(0,a.jsxs)("p",{className:"mt-1 font-mono text-xs text-zinc-500 sm:text-[10px] dark:text-zinc-500",children:["Remedy: ",e.remedyChecklistId]}):null]})]}),(0,a.jsx)(ev.Y,{getText:()=>(0,ey.u)(e,eC(e.id)),ariaLabel:"Copy audio issue"})]},`audio-${e.id}-${t}`)}),n.length>0&&i.length>0?(0,a.jsx)("li",{className:"px-4 py-2 text-[11px] font-medium uppercase tracking-wide text-zinc-500 sm:px-3 sm:py-1.5 dark:text-zinc-400",children:"Wire-trace issues"}):null,n.map((e,t)=>{let r=ej[e.severity];return(0,a.jsxs)("li",{className:"group relative",children:[(0,a.jsxs)("button",{type:"button",onClick:()=>{let t=e.messageIds[0];t&&s(t)},className:"flex w-full items-start gap-x-3 px-4 py-4 pr-10 text-left hover:bg-zinc-50 sm:px-3 sm:py-3 sm:pr-9 dark:hover:bg-white/5",children:[(0,a.jsx)(r.Icon,{className:(0,v.cn)("mt-0.5 size-5 shrink-0 sm:size-4",r.color)}),(0,a.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-x-2 gap-y-1",children:[(0,a.jsx)("p",{className:"min-w-0 flex-1 truncate text-base font-medium text-zinc-900 sm:text-sm dark:text-zinc-100",children:e.title}),(0,a.jsx)(f.E,{variant:r.badge,children:e.severity})]}),(0,a.jsx)("p",{className:"mt-1 text-pretty text-sm text-zinc-600 sm:text-xs dark:text-zinc-400",children:e.detail}),e.rfc?(0,a.jsx)("p",{className:"mt-1 font-mono text-xs text-zinc-500 sm:text-[10px] dark:text-zinc-500",children:e.rfc}):null]})]}),(0,a.jsx)(ev.Y,{getText:()=>(0,ey.z)(e)})]},`${e.code}-${t}`)})]})]})}function eC(e){switch(e){case"rx-flow-dead":return"One-way audio (no inbound RTP)";case"tx-flow-dead":return"One-way audio (no outbound RTP)";case"media-blackholed":return"Media black-holed";case"relay-needed":return"Symmetric NAT - TURN relay needed";case"turn-misconfigured":return"TURN configured but relay candidate missing";case"high-packet-loss":return"High packet loss";case"high-jitter":return"High jitter";case"codec-runtime-mismatch":return"Runtime codec â negotiated codec";case"high-rtt":return"High round-trip time";case"ice-flap":return"ICE flap"}}function ez({summary:e,onHide:t}){return(0,a.jsxs)("div",{className:"flex items-start justify-between gap-x-2 border-b border-zinc-200 p-3 dark:border-white/10",children:[(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsx)("p",{className:"text-xs font-medium uppercase tracking-wide text-zinc-500 dark:text-zinc-400",children:"Detected issues"}),(0,a.jsx)("p",{className:"mt-1 truncate text-sm text-zinc-900 dark:text-zinc-100",children:e})]}),t?(0,a.jsx)(z.Gp,{onClick:t,label:"Hide issues"}):null]})}var eN=s(13933),eI=s(914),eS=s(96474);let eM=(0,c.A)("KeyRound",[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]]);var eT=s(17423),eA=s(2236),eP=s(46268),eO=s(76377);function eR(e){try{let t=e.replace(/\/\*$/,""),s=new URL(t),a="wss:"===s.protocol?"https:":"ws:"===s.protocol?"http:":s.protocol;return`${a}//${s.host}`}catch{return null}}function eE({open:e,onClose:t}){let s=(0,R.C)(e=>e.liveSource),l=(0,R.C)(e=>e.setLiveSource),n=(0,R.C)(e=>e.liveConfig),i=(0,R.C)(e=>e.setLiveConfig),c=(0,R.C)(e=>e.captureOrigins),u=(0,R.C)(e=>e.setCaptureOrigins),x=(0,R.C)(e=>e.maxCalls),m=(0,R.C)(e=>e.setMaxCalls),p=(0,R.C)(e=>e.showRetransmissions),h=(0,R.C)(e=>e.setShowRetransmissions),b=Y(e=>e.lastTestResult),k=Y(e=>e.testConnection),y=Y(e=>e.probeBridge),j=Y(e=>e.checkBridgePermission),w=Y(e=>e.requestBridgePermission),C=Y(e=>e.bridgeAvailable),z=Y(e=>e.bridgeProbed),N=Y(e=>e.bridgeCapabilities),S=Y(e=>e.activeCaptureTabs),M=N.includes("browser-capture"),[T,A]=(0,r.useState)(n.endpoint),[O,E]=(0,r.useState)(n.auth?.value??""),[B,L]=(0,r.useState)(n.bridgeE
1xtensionId??""),[$,H]=(0,r.useState)(!1),[F,_]=(0,r.useState)(!1),[q,U]=(0,r.useState)(null),[D,W]=(0,r.useState)(null),[G,K]=(0,r.useState)(""),[Q,J]=(0,r.useState)(!1),[V,Z]=(0,r.useState)(null),[X,ee]=(0,r.useState)(e),[et,es]=(0,r.useState)(n);if((e!==X||n!==et)&&(ee(e),es(n),e&&(A(n.endpoint),E(n.auth?.value??""),L(n.bridgeExtensionId??""))),(0,r.useEffect)(()=>{e&&!z&&y()},[e,z,y]),(0,r.useEffect)(()=>{!e||"browser-capture"!==s||!0!==C||M&&(async()=>{let e=new P.zp(Y.getState().config,n.bridgeExtensionId?.trim()||void 0);u(await e.listCaptureOrigins())})()},[e,s,C,M,n.bridgeExtensionId,u]),!e)return null;let ea=async()=>{i({endpoint:T.trim()}),i({auth:{...n.auth??{type:"none"},value:O||void 0}}),H(!0),W(null);try{let e=await j(T);if("bridge"===e.route&&!e.granted){let e=eR(T)??T;U(e);return}let t=await k();if(t.needsPermission||!t.success&&/permission/i.test(t.message)){let e=eR(t.origin??"")??eR(T)??T;U(e)}else U(null)}finally{H(!1)}},er=()=>{let e=G.trim();if(!e)return;let t=eR(e)??e;J(!0),Z(null),(async()=>{try{let e=new P.zp(Y.getState().config,n.bridgeExtensionId?.trim()||void 0);if(!(await e.checkHostPermission(t)).granted){let e=await w(t);if(!e.granted)return void Z(e.error??"Permission denied.")}let s=await e.addCaptureOrigin(t);if(s.error)return void Z(s.error);s.origins&&u(s.origins),K("")}finally{J(!1)}})()};return(0,a.jsxs)("div",{role:"dialog","aria-modal":"true","aria-label":"Live connection settings",className:"fixed inset-0 z-40 flex",children:[(0,a.jsx)("button",{type:"button","aria-label":"Close",onClick:t,className:"flex-1 bg-zinc-900/40 backdrop-blur-sm"}),(0,a.jsxs)("div",{className:"scrollbar-thin flex w-full max-w-md flex-col overflow-y-auto bg-white shadow-xl dark:bg-zinc-950",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between border-b border-zinc-200 px-4 py-3 dark:border-white/10",children:[(0,a.jsxs)("div",{className:"inline-flex items-center gap-x-2",children:[(0,a.jsx)(d.A,{className:"size-4 text-zinc-500"}),(0,a.jsx)("h2",{className:"text-sm font-semibold text-zinc-900 dark:text-zinc-100",children:"Live connection"})]}),(0,a.jsx)("button",{type:"button",onClick:t,"aria-label":"Close",className:"rounded-md p-1.5 text-zinc-500 hover:bg-zinc-100 dark:hover:bg-white/5",children:(0,a.jsx)(eN.A,{className:"size-4"})})]}),(0,a.jsxs)("div",{className:"space-y-6 p-4",children:[(0,a.jsx)(eH,{title:"Live source",children:(0,a.jsx)(eB,{value:s,onChange:e=>l(e)})}),"homer"===s?(0,a.jsxs)(eH,{title:"Homer / qryn",children:[(0,a.jsxs)(eF,{label:"Endpoint",children:[(0,a.jsx)("input",{type:"url",inputMode:"url",placeholder:"http://10.8.0.15:3100",value:T,onChange:e=>A(e.target.value),onBlur:()=>i({endpoint:T.trim()}),className:"h-10 w-full rounded-lg border border-zinc-200 bg-white px-3 text-sm placeholder-zinc-400 focus:border-brand-500 focus:outline-2 focus:outline-brand-500/30 dark:border-white/10 dark:bg-zinc-900 dark:text-zinc-100"}),(0,a.jsx)(e_,{children:"Loki/qryn HTTP endpoint. Use http:// for internal hosts."})]}),(0,a.jsxs)(eF,{label:"Auth",children:[(0,a.jsx)("div",{className:"grid grid-cols-3 gap-2",children:["none","basic","bearer"].map(e=>(0,a.jsx)("button",{type:"button",onClick:()=>i({auth:{type:e,value:O||void 0}}),className:(0,v.cn)("h-9 rounded-lg border text-xs font-medium capitalize",(n.auth?.type??"none")===e?"border-brand-500 bg-brand-50 text-brand-700 dark:border-brand-400 dark:bg-brand-500/10 dark:text-brand-300":"border-zinc-200 bg-white text-zinc-700 dark:border-white/10 dark:bg-zinc-900 dark:text-zinc-300"),children:e},e))}),(n.auth?.type??"none")!=="none"?(0,a.jsx)("input",{type:"text",placeholder:n.auth?.type==="basic"?"user:password":"bearer-token",value:O,onChange:e=>{E(e.target.value),i({auth:{...n.auth??{type:"basic"},value:e.target.value||void 0}})},className:"mt-2 h-10 w-full rounded-lg border border-zinc-200 bg-white px-3 font-mono text-xs placeholder-zinc-400 focus:border-brand-500 focus:outline-2 focus:outline-brand-500/30 dark:border-white/10 dark:bg-zinc-900 dark:text-zinc-100"}):null]}),(0,a.jsx)(eF,{label:"Transport",children:(0,a.jsxs)("select",{value:n.transport,onChange:e=>i({transport:e.target.value}),className:"h-10 w-full rounded-lg border border-zinc-200 bg-white px-3 text-sm focus:border-brand-500 focus:outline-2 focus:outline-brand-500/30 dark:border-white/10 dark:bg-zinc-900 dark:text-zinc-100",children:[(0,a.jsx)("option",{value:"auto",children:"Auto (use bridge if installed)"}),(0,a.jsx)("option",{value:"bridge",children:"Bridge only"}),(0,a.jsx)("option",{value:"direct",children:"Direct fetch only (CORS-enabled hosts)"})]})}),(0,a.jsxs)("div",{className:"flex items-center justify-between gap-x-2",children:[(0,a.jsxs)(g.$,{variant:"primary",size:"sm",onClick:ea,disabled:$||F||!T.trim(),children:[$?(0,a.jsx)(I.A,{className:"size-3.5 animate-spin"}):null,"Test connection"]}),b?(0,a.jsxs)("span",{className:(0,v.cn)("inline-flex items-center gap-x-1.5 text-xs",b.success?"text-emerald-700 dark:text-emerald-300":"text-red-600 dark:text-red-400"),children:[b.success?(0,a.jsx)(eI.A,{className:"size-3.5"}):(0,a.jsx)(eS.A,{className:"size-3.5"}),(0,a.jsx)("span",{className:"max-w-48 truncate",children:b.message})]}):null]}),q?(0,a.jsx)("div",{className:"rounded-lg border border-amber-300 bg-amber-50 p-3 dark:border-amber-500/30 dark:bg-amber-500/10",children:(0,a.jsxs)("div",{className:"flex items-start gap-x-2",children:[(0,a.jsx)(eM,{className:"mt-0.5 size-4 shrink-0 text-amber-600 dar
1k:text-amber-300"}),(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsxs)("p",{className:"text-xs text-amber-900 dark:text-amber-100",children:["The bridge needs your permission to reach"," ",(0,a.jsx)("code",{className:"font-mono text-[11px]",children:q}),". Chrome only allows the prompt during a direct click."]}),(0,a.jsxs)(g.$,{variant:"outline",size:"sm",onClick:()=>{let e=q??n.endpoint;e&&(_(!0),W(null),(async()=>{try{let t=await w(e);if(t.granted){U(null),H(!0);try{let e=await k();e.needsPermission&&U(e.origin??eR(n.endpoint))}finally{H(!1)}}else t.error?W(t.error):W("Permission denied.")}finally{_(!1)}})())},disabled:F||$,children:[F?(0,a.jsx)(I.A,{className:"size-3.5 animate-spin"}):null,"Grant bridge access"]}),D?(0,a.jsx)("p",{className:"text-[11px] text-red-600 dark:text-red-400",children:D}):null]})]})}):null]}):(0,a.jsxs)(eH,{title:"Browser SIP capture",children:[(0,a.jsxs)("p",{className:"text-xs text-zinc-600 dark:text-zinc-400",children:["The SIP Flow Bridge extension watches WebSocket SIP traffic (JsSIP, SIP.js, Janus, â¦) on the dialer pages you allow below and streams parsed calls into this workspace. RTC diagnostics like one-way audio, NAT relay failures, and codec mismatches are detected live from ",(0,a.jsx)("code",{className:"font-mono text-[11px]",children:"getStats()"}),"."]}),!1===C?(0,a.jsx)(eL,{}):!M&&z?(0,a.jsx)(e$,{}):null,(0,a.jsxs)(eF,{label:"Allowlisted dialer origins",children:[(0,a.jsxs)("div",{className:"flex items-center gap-x-2",children:[(0,a.jsx)("input",{type:"url",placeholder:"https://my-dialer.example",value:G,onChange:e=>K(e.target.value),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),er())},disabled:Q||!M,className:"h-10 flex-1 rounded-lg border border-zinc-200 bg-white px-3 text-sm placeholder-zinc-400 focus:border-brand-500 focus:outline-2 focus:outline-brand-500/30 disabled:cursor-not-allowed disabled:opacity-60 dark:border-white/10 dark:bg-zinc-900 dark:text-zinc-100"}),(0,a.jsxs)(g.$,{variant:"primary",size:"sm",onClick:er,disabled:Q||!M||!G.trim(),children:[Q?(0,a.jsx)(I.A,{className:"size-3.5 animate-spin"}):(0,a.jsx)(eT.A,{className:"size-3.5"}),"Add"]})]}),V?(0,a.jsx)("p",{className:"mt-1 text-[11px] text-red-600 dark:text-red-400",children:V}):null,(0,a.jsx)(e_,{children:"Only origins you add are observed. The extension never injects on other sites, and SIP frames stay on this machine."})]}),(0,a.jsx)("ul",{className:"space-y-1.5",children:0===c.length?(0,a.jsx)("li",{className:"rounded-lg border border-dashed border-zinc-200 px-3 py-2 text-xs text-zinc-500 dark:border-white/10 dark:text-zinc-400",children:"No origins yet. Add the URL of your in-browser dialer above."}):c.map(e=>(0,a.jsxs)("li",{className:"flex items-center justify-between gap-x-2 rounded-lg border border-zinc-200 bg-zinc-50 px-3 py-2 dark:border-white/10 dark:bg-white/5",children:[(0,a.jsxs)("div",{className:"inline-flex items-center gap-x-2 truncate",children:[(0,a.jsx)(eA.A,{className:"size-3.5 shrink-0 text-zinc-500"}),(0,a.jsx)("code",{className:"truncate font-mono text-[11px] text-zinc-700 dark:text-zinc-300",children:e})]}),(0,a.jsx)("button",{type:"button","aria-label":`Remove ${e}`,onClick:()=>{J(!0),Z(null),(async()=>{try{let t=new P.zp(Y.getState().config,n.bridgeExtensionId?.trim()||void 0),s=await t.removeCaptureOrigin(e);u(s)}finally{J(!1)}})()},disabled:Q,className:"rounded-md p-1 text-zinc-500 hover:bg-zinc-200/50 hover:text-red-600 disabled:opacity-50 dark:hover:bg-white/10 dark:hover:text-red-300",children:(0,a.jsx)(o.A,{className:"size-3.5"})})]},e))}),(0,a.jsxs)("div",{className:"space-y-1",children:[(0,a.jsx)("p",{className:"text-xs font-medium uppercase tracking-wide text-zinc-500 dark:text-zinc-400",children:"Currently capturing"}),0===S.length?(0,a.jsx)("p",{className:"text-xs text-zinc-500 dark:text-zinc-400",children:"No active dialer tabs detected."}):(0,a.jsx)("ul",{className:"space-y-1",children:S.map(e=>(0,a.jsxs)("li",{className:"flex items-center justify-between gap-x-2 rounded-lg border border-emerald-200 bg-emerald-50/60 px-3 py-1.5 text-xs dark:border-emerald-500/20 dark:bg-emerald-500/10",children:[(0,a.jsxs)("span",{className:"inline-flex items-center gap-x-1.5 truncate",children:[(0,a.jsx)(eo,{className:"size-3 text-emerald-700 dark:text-emerald-300"}),(0,a.jsx)("span",{className:"truncate font-mono text-[11px] text-emerald-900 dark:text-emerald-200",children:e.url})]}),(0,a.jsxs)("span",{className:"tabular-nums text-emerald-700 dark:text-emerald-300",children:[e.framesPerSec.toFixed(1)," f/s"]})]},e.tabId))})]})]}),(0,a.jsxs)(eH,{title:"Buffer",children:[(0,a.jsxs)(eF,{label:"Max calls in memory",children:[(0,a.jsx)("input",{type:"number",min:50,max:500,step:50,value:x,onChange:e=>m(Number(e.target.value)),className:"h-10 w-32 rounded-lg border border-zinc-200 bg-white px-3 text-sm focus:border-brand-500 focus:outline-2 focus:outline-brand-500/30 dark:border-white/10 dark:bg-zinc-900 dark:text-zinc-100"}),(0,a.jsx)(e_,{children:"Older calls drop out of the live buffer above this cap."})]}),(0,a.jsxs)("label",{className:"inline-flex items-center gap-x-2 text-xs text-zinc-700 dark:text-zinc-300",children:[(0,a.jsx)("input",{type:"checkbox",checked:p,onChange:e=>h(e.target.checked),className:"size-4 rounded border-zinc-300 text-brand-600 focus:ring-brand-500 dark:border-white/20"}),"Show retransmissions"]})]}),(0,a.jsxs)(eH,{title:"Bridge",children:[(0,a.jsxs)("p",{className:"text-xs text-zinc-500 dark:text-zinc-400",children:["Bridge availability:"," ",null===C?"checkingâ¦":C?"detected":"not installed",M?(0,a.jsx)(f.E,{variant:"brand",className:"ml-2",children:"browser capture"}):null,!1===C?(0,a.jsxs)(a.Fragment,{children:[" \xb7 ",(0,a.jsx)("a",{href:P._n,target:"_blank",rel:"noreferrer",className:"text-brand-700 underline hover:text-brand-800 dark:text-brand-400 dark:hover:text-brand-300",children:"Install from Chrome Web Store"})]}):null]}),"production"!==eO.env.ENVIRONMENT?(0,a.jsxs)(eF,{label:"Bridge extension ID (dev only)",children:[(0,a.jsx)("input",{type:"text",placeholder:"e.g. abcdefghijklmnopqrstuvwxyzabcdef",value:B,onChange:e=>L(e.target.value),onBlur:()=>i({bridgeExtensionId:B.trim()||void 0}),spellCheck:!1,className:"h-10 w-full rounded-lg border border-zinc-200 bg-white px-3 font-mono text-xs placeholder-zinc-400 focus:border-brand-500 focus:outline-2 focus:outline-brand-500/30 dark:border-white/10 dark:bg-zinc-900 dark:text-zinc-100"}),(0,a.jsxs)(e_,{children:["Override for unpacked dev builds. Find the ID on"," ",(0,a.jsx)("code",{className:"font-mono text-[11px]",children:"chrome://extensions"})," ","under the SIPFlow Bridge card."]})]}):null]})]})]})]})}
1function eB({value:e,onChange:t}){let s=[{id:"homer",label:"Homer / qryn",description:"Loki tail or polling against your capture pipeline.",Icon:eP.A},{id:"browser-capture",label:"Browser capture",description:"SIP-over-WebSocket from in-browser dialers via the bridge.",Icon:eo}];return(0,a.jsx)("div",{className:"grid grid-cols-2 gap-2",children:s.map(s=>{let r=e===s.id;return(0,a.jsxs)("button",{type:"button",onClick:()=>t(s.id),className:(0,v.cn)("rounded-lg border px-3 py-2.5 text-left transition-colors",r?"border-brand-500 bg-brand-50 dark:border-brand-400 dark:bg-brand-500/10":"border-zinc-200 bg-white hover:border-zinc-300 dark:border-white/10 dark:bg-zinc-900 dark:hover:border-white/20"),"aria-pressed":r,children:[(0,a.jsxs)("div",{className:"flex items-center gap-x-2",children:[(0,a.jsx)(s.Icon,{className:(0,v.cn)("size-3.5",r?"text-brand-700 dark:text-brand-300":"text-zinc-500")}),(0,a.jsx)("span",{className:(0,v.cn)("text-sm font-medium",r?"text-brand-700 dark:text-brand-300":"text-zinc-900 dark:text-zinc-100"),children:s.label})]}),(0,a.jsx)("p",{className:"mt-1 text-[11px] text-zinc-600 dark:text-zinc-400",children:s.description})]},s.id)})})}function eL(){return(0,a.jsxs)("div",{className:"rounded-lg border border-amber-300 bg-amber-50 p-3 text-xs text-amber-900 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-100",children:["Browser capture requires the SIPFlow Bridge extension. Install it from the"," ",(0,a.jsx)("a",{href:P._n,target:"_blank",rel:"noreferrer",className:"underline",children:"Chrome Web Store"}),", then return here."]})}function e$(){return(0,a.jsxs)("div",{className:"rounded-lg border border-amber-300 bg-amber-50 p-3 text-xs text-amber-900 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-100",children:["Your installed bridge does not support browser capture (v1.1+ required). Update it via"," ",(0,a.jsx)("code",{className:"font-mono",children:"chrome://extensions"})," or the"," ",(0,a.jsx)("a",{href:P._n,target:"_blank",rel:"noreferrer",className:"underline",children:"Chrome Web Store"}),"."]})}function eH({title:e,children:t}){return(0,a.jsxs)("section",{className:"space-y-3",children:[(0,a.jsx)("h3",{className:"text-xs font-medium uppercase tracking-wide text-zinc-500 dark:text-zinc-400",children:e}),(0,a.jsx)("div",{className:"space-y-3",children:t})]})}function eF({label:e,children:t}){return(0,a.jsxs)("label",{className:"block text-xs font-medium text-zinc-700 dark:text-zinc-300",children:[e,(0,a.jsx)("div",{className:"mt-1",children:t})]})}function e_({children:e}){return(0,a.jsx)("p",{className:"mt-1 text-[11px] text-zinc-500 dark:text-zinc-500",children:e})}var eq=s(24318),eU=s.n(eq),eD=s(22251),eW=s(58331);function eG({open:e,onClose:t,onRecheck:s,variant:r="missing",requiredCapability:l}){if(!e)return null;let n="outdated"===r;return(0,a.jsxs)("div",{className:"rounded-2xl border border-zinc-200 bg-white p-4 sm:p-5 dark:border-white/10 dark:bg-zinc-900",children:[(0,a.jsxs)("div",{className:"flex items-start justify-between gap-x-3",children:[(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsxs)(f.E,{variant:"brand",children:[(0,a.jsx)(eD.A,{className:"size-3"}),n?"Update bridge":"Bridge required"]}),(0,a.jsx)("h3",{className:"mt-2 text-base font-semibold text-zinc-900 dark:text-zinc-100",children:n?"Update the SIP Flow Bridge":"Install the SIP Flow Bridge"}),(0,a.jsx)("p",{className:"mt-1 text-pretty text-sm text-zinc-600 dark:text-zinc-300",children:n?`Your installed bridge is missing the "${l??"browser-capture"}" capability. Update via the Chrome Web Store or chrome://extensions to enable in-browser SIP capture and live audio diagnostics.`:"Browsers block sipflow.dev (HTTPS) from talking to your internal Homer/qryn (HTTP), and they don't expose dialer page WebSockets to other tabs. The SIPFlow Bridge is a thin Chrome extension that lets the live workspace reach your internal endpoint and observe in-browser dialers (JsSIP, SIP.js, â¦). It does not parse SIP and does not send any data off your machine."})]}),(0,a.jsx)("button",{type:"button",onClick:t,"aria-label":"Dismiss",className:"rounded-md p-1 text-zinc-500 hover:bg-zinc-100 dark:hover:bg-white/5",children:(0,a.jsx)(eN.A,{className:"size-4"})})]}),(0,a.jsxs)("ul",{className:"mt-3 space-y-1 text-sm text-zinc-700 dark:text-zinc-300",children:[(0,a.jsx)("li",{children:"\xb7 Local-only - captured SIP and getStats() never leave your machine."}),(0,a.jsx)("li",{children:"\xb7 Per-origin opt-in. The bridge only watches dialers you allowlist."})]}),(0,a.jsxs)("div",{className:"mt-4 flex flex-wrap items-center gap-2",children:[(0,a.jsxs)(eU(),{href:P._n,target:"_blank",rel:"noreferrer",className:"inline-flex h-9 items-center gap-x-1.5 rounded-lg bg-brand-600 px-4 text-sm font-medium text-white hover:bg-brand-700 dark:bg-brand-500 dark:text-zinc-950 dark:hover:bg-brand-400",children:[n?"Update bridge":"Install bridge",(0,a.jsx)(eW.A,{className:"size-3.5"})]}),(0,a.jsx)(g.$,{variant:"outline",size:"md",onClick:s,children:n?"Re-check version":"I've installed it - re-check"})]})]})}var eK=s(91792),eQ=s(27903),eY=s(87571);function eJ(){let e=(0,eY.useRouter)(),t=Y(e=>e.config),s=Y(e=>e.liveSource),c=Y(e=>e.feedState),m=Y(e=>e.transport),p=Y(e=>e.messagesPerSec),h=Y(e=>e.paused),b=Y(e=>e.pendingCalls.length),I=Y(e=>e.bridgeAvailable),S=Y(e=>e.bridgeProbed),M=Y(e=>e.bridgeCapabilities),T=Y(e=>e.activeCaptureTabs),A=Y(e=>e.audioFaultsByCallId),E=Y(e=>e.runtimeOverlayByCallId),B=Y(e=>e.probeBridge),L=Y(e=>e.connect),$=Y(e=>e.disconnect),H=Y(e=>e.feedError),F=(0,R.C)(e=>e.aliases),_=(0,R.C)(e=>e.showRetransmissions),q=Y(e=>e.selectedMessageId),U=Y(e=>e.selectMessage),D=Y(e=>e.mobileTab),W=Y(e=>e.setMobileTab),G=Y(e=>e.callGroups),K=Y(e=>e.selectedCallId),Q=Y(e=>e.selectCall),J=Y(e=>e.newCallIds),V=Y(e=>e.filters.failedOnly??!1),Z=Y(e=>e.setFilters),X=Y(e=>e.togglePause),ee=Y(e=>e.flushPending),et=Y(e=>e.clearCalls),es=Y(e=>e.callsOpen),ea=Y(e=>e.setCallsOpen),er=Y(e=>e.issuesOpen),en=Y(e=>e.setIssuesOpen),ed=Y(e=>e.inspectorOpen),eo=Y(e=>e.setInspectorOpen),ec=(0,eQ.useAnalyzeStore)(e=>e.loadFromLive),eu=el(),ex=(0,r.useMemo)(()=>eu?(0,O.So)(eu):null,[eu]),em=(0,r.useMemo)(()=>G.map(e=>(0,O.So)(e)),[G]),eh=(0,r.useMemo)(()=>{let e=new Map;for(let t of G){let s=[...t.calls].sort((e,t)=>
1e.startTime-t.startTime)[0];s&&e.set(s.callId,t.calls.length)}return e},[G]),eb=(0,r.useMemo)(()=>{let e=new Map;for(let t of G){if(t.calls.length<=1)continue;let s=[...t.calls].sort((e,t)=>e.startTime-t.startTime)[0];s&&e.set(s.callId,t.description)}return e},[G]),[eg,ef]=(0,r.useState)(!1),[ev,ek]=(0,r.useState)(!1),ey=Y(e=>e.recomputeGroups),ej=(0,R.C)(e=>e.correlationHeaders);(0,r.useEffect)(()=>{ey()},[ej,ey]),(0,r.useEffect)(()=>{S||B()},[S,B]);let[eC,ez]=(0,r.useState)({bridgeProbed:S,bridgeAvailable:I,transport:t.transport});if(S!==eC.bridgeProbed||I!==eC.bridgeAvailable||t.transport!==eC.transport){ez({bridgeProbed:S,bridgeAvailable:I,transport:t.transport});let e="homer"===s&&S&&"direct"!==t.transport&&!1===I,a="browser-capture"===s&&!1===I;(e||a)&&ek(!0)}let eN=M.includes("browser-capture"),eI="browser-capture"===s&&!0===I&&!eN,eS=(0,r.useMemo)(()=>{let e=0;for(let t of A.values())e+=t.length;return e},[A]),eM="live"===c||"polling"===c,eT=e=>{if(!ex)return;let t="pcap"===e?(0,P.ZP)(ex):(0,P.j1)(ex),s=document.createElement("a");s.href=URL.createObjectURL(t),s.download=(0,P.XU)(ex,e),document.body.appendChild(s),s.click(),s.remove(),URL.revokeObjectURL(s.href)},eA=(0,r.useMemo)(()=>(0,a.jsx)(k.C,{calls:em,selectedCallId:K,onSelectCall:e=>Q(e),newCallIds:J,legCountByCallId:eh,groupDescriptionByCallId:eb,timeMode:"relative",failedOnly:V,onFailedOnlyChange:e=>Z({failedOnly:e}),emptyTitle:eM?"Waiting for calls":"No calls captured yet",emptyDescription:eM?"New SIP calls will stream in here as they hit the Homer endpoint.":"Connect to a Homer feed or run a historical search to populate the list.",toolbarLeading:K?(0,a.jsxs)(g.$,{type:"button",size:"sm",variant:"outline",onClick:()=>Q(null),title:"Clear selection and show all calls",className:"shrink-0",children:[(0,a.jsx)(l.A,{className:"size-3.5"}),(0,a.jsx)("span",{className:"max-sm:sr-only",children:"All calls"})]}):null,toolbarExtras:(0,a.jsx)(g.$,{type:"button",size:"sm",variant:h?"primary":"ghost",onClick:X,children:h?"Resume":"Pause"}),beforeBody:h&&b>0?(0,a.jsx)("div",{className:"border-b border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-800 dark:border-amber-500/20 dark:bg-amber-500/10 dark:text-amber-300",children:(0,a.jsxs)("button",{type:"button",onClick:ee,className:"inline-flex w-full items-center justify-between gap-x-2 text-left",children:[(0,a.jsxs)("span",{children:[b," new calls queued while paused"]}),(0,a.jsx)(n.A,{className:"size-3.5"})]})}):null}),[em,eh,eb,K,Q,J,V,Z,eM,h,X,b,ee]),eP=(0,a.jsx)(j.J,{call:ex,aliases:F,showRetransmissions:_,selectedMessageId:q,onSelectMessage:U,emptyMessage:"Select a live call from the list to render its ladder diagram. New messages merge in automatically.",disableRtpTabs:!0}),eO=ex?E.get(ex.callId)??null:null,eR=(0,r.useMemo)(()=>ex?(0,O.a4)(ex):null,[ex]),eB=!!eR?.applies,eL=ex?(0,C.O)(ex,eO):void 0,e$=(0,a.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col",children:[(0,a.jsx)("div",{className:"flex-1 overflow-hidden",children:(0,a.jsx)(w.u,{call:ex,selectedMessageId:q})}),eB?(0,a.jsx)(y.B,{title:"WebRTC checklist",summary:eL,storageKey:"sipflow.live.inspector.webrtc",defaultOpen:!1,children:(0,a.jsx)(C.q,{call:ex,runtimeOverlay:eO})}):null]});return(0,a.jsxs)("div",{className:"flex h-[calc(100dvh-3.5rem)] flex-col",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-y-2 border-b border-zinc-200 bg-white px-3 py-2 sm:px-4 sm:py-2.5 lg:flex-row lg:items-center lg:justify-between lg:gap-y-0 lg:gap-x-3 dark:border-white/10 dark:bg-zinc-950",children:[(0,a.jsxs)("div",{className:"flex min-w-0 items-center gap-x-2 sm:gap-x-3",children:[(0,a.jsx)("h1",{className:"truncate text-sm font-semibold text-zinc-900 dark:text-zinc-100",children:"Live SIP feed"}),(0,a.jsx)(ep,{feedState:c,transport:m,paused:h,messagesPerSec:p,pendingCount:b,bridgeAvailable:I,liveSource:s,activeCaptureTabs:T.length,audioFaultCount:eS}),H?(0,a.jsx)(f.E,{variant:"error",className:"max-w-[16rem] truncate",title:H,children:H}):null]}),(0,a.jsxs)("div",{className:"flex items-center justify-between gap-x-2 lg:justify-end lg:gap-x-3",children:[(0,a.jsxs)("div",{className:"hidden items-center gap-x-2 text-xs text-zinc-500 sm:flex dar
1k:text-zinc-400",children:[(0,a.jsxs)("span",{className:"tabular-nums",children:[em.length," calls"]}),(0,a.jsx)("span",{className:"text-zinc-300 dark:text-zinc-600",children:"\xb7"}),(0,a.jsx)("span",{className:"truncate font-mono text-[11px]",children:t.endpoint||"no endpoint"})]}),(0,a.jsx)(N.O,{callsOpen:es,onCallsOpenChange:ea,issuesOpen:er,onIssuesOpenChange:en,inspectorOpen:ed,onInspectorOpenChange:eo,disabled:!ex}),(0,a.jsx)(eK.FeedbackButton,{options:{relatedTool:"live workspace"},variant:"ghost",className:"max-sm:hidden"}),ex?(0,a.jsxs)("div",{className:"hidden items-center gap-x-1 sm:flex",children:[(0,a.jsxs)(g.$,{size:"sm",variant:"outline",onClick:()=>eT("txt"),children:[(0,a.jsx)(i.A,{className:"size-3.5"}),"TXT"]}),(0,a.jsxs)(g.$,{size:"sm",variant:"outline",onClick:()=>eT("pcap"),children:[(0,a.jsx)(i.A,{className:"size-3.5"}),"PCAP"]}),(0,a.jsx)(g.$,{size:"sm",variant:"outline",onClick:()=>{eu&&(ec(eu.calls,`live:${eu.groupId}`),e.push("/analyze"))},children:"Open in Analyze"})]}):null,(0,a.jsxs)(g.$,{size:"sm",variant:"ghost",onClick:()=>ef(!0),children:[(0,a.jsx)(d.A,{className:"size-4"}),(0,a.jsx)("span",{className:"max-sm:sr-only",children:"Connection"})]}),(0,a.jsxs)(g.$,{size:"sm",variant:"ghost",onClick:et,disabled:0===em.length,children:[(0,a.jsx)(o.A,{className:"size-3.5"}),(0,a.jsx)("span",{className:"max-sm:sr-only",children:"Clear"})]}),(0,a.jsx)(g.$,{size:"sm",onClick:()=>{eM||"connecting"===c?$():L()},disabled:"homer"===s?!t.endpoint:!0!==I||!eN,children:eM||"connecting"===c?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(u,{className:"size-3.5"}),"Stop"]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(x.A,{className:"size-3.5"}),"Connect"]})})]})]}),ev||eI?(0,a.jsx)("div",{className:"border-b border-zinc-200 px-3 py-2 sm:px-4 dark:border-white/10",children:(0,a.jsx)(eG,{open:ev||eI,onClose:()=>ek(!1),variant:eI?"outdated":"missing",requiredCapability:"browser-capture"===s?"browser-capture":void 0,onRecheck:async()=>{await B();let e=Y.getState();e.bridgeAvailable&&("browser-capture"!==s||e.bridgeCapabilities.includes("browser-capture"))&&ek(!1)}})}):null,(0,a.jsx)(ei,{}),(0,a.jsx)("div",{className:"hidden min-h-0 flex-1 overflow-hidden lg:flex",children:(0,a.jsx)(z.GS,{autoSaveId:"sipflow:live",hasSelection:!!ex,calls:eA,ladder:eP,issues:(0,a.jsx)(ew,{}),inspector:e$,callsOpen:es,onCallsOpenChange:ea,issuesOpen:er,onIssuesOpenChange:en,inspectorOpen:ed,onInspectorOpenChange:eo})}),(0,a.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col overflow-hidden lg:hidden",children:[(0,a.jsx)("div",{className:(0,v.cn)("min-h-0 overflow-hidden","calls"===D?"flex flex-1 flex-col":"hidden"),children:eA}),(0,a.jsx)("div",{className:(0,v.cn)("min-h-0 overflow-hidden","ladder"===D?"flex flex-1":"hidden"),children:eP}),(0,a.jsx)("div",{className:(0,v.cn)("min-h-0 overflow-hidden","issues"===D?"flex flex-1":"hidden"),children:(0,a.jsx)(ew,{})}),(0,a.jsx)("div",{className:(0,v.cn)("min-h-0 overflow-hidden","inspector"===D?"flex flex-1 flex-col":"hidden"),children:e$})]}),(0,a.jsx)(eZ,{active:D,onChange:W,callCount:em.length}),(0,a.jsx)(eE,{open:eg,onClose:()=>ef(!1)})]})}let eV=[{id:"calls",label:"Calls",Icon:m.A},{id:"ladder",label:"Ladder",Icon:p.A},{id:"issues",label:"Issues",Icon:h.A},{id:"inspector",label:"Inspect",Icon:b.A}];
1function eZ({active:e,onChange:t,callCount:s}){return(0,a.jsx)("nav",{"aria-label":"Live workspace panels",className:"safe-pb sticky bottom-0 z-10 grid grid-cols-4 border-t border-zinc-200 bg-white lg:hidden dark:border-white/10 dark:bg-zinc-950",children:eV.map(r=>{let l=e===r.id,n="calls"===r.id?s:0;return(0,a.jsxs)("button",{type:"button",onClick:()=>t(r.id),"aria-current":l?"page":void 0,className:(0,v.cn)("relative flex flex-col items-center justify-center gap-y-0.5 px-2 py-2.5 text-xs font-medium transition-colors",l?"text-brand-700 dark:text-brand-300":"text-zinc-500 hover:text-zinc-900 dark:text-zinc-400 dark:hover:text-zinc-100"),children:[(0,a.jsx)("span",{className:(0,v.cn)("absolute inset-x-6 top-0 h-0.5 rounded-b-full",l?"bg-brand-500 dark:bg-brand-400":"bg-transparent"),"aria-hidden":"true"}),(0,a.jsxs)("span",{className:"relative inline-flex items-center justify-center",children:[(0,a.jsx)(r.Icon,{className:"size-5"}),n>0?(0,a.jsx)("span",{className:"absolute -top-1 -right-2 inline-flex h-4 min-w-4 items-center justify-center rounded-full bg-zinc-200 px-1 text-[10px] font-medium text-zinc-700 ring-2 ring-white tabular-nums dark:bg-white/10 dark:text-zinc-200 dark:ring-zinc-950",children:n>99?"99+":n}):null]}),(0,a.jsx)("span",{children:r.label})]},r.id)})})}},76576:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(73068).A)("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]])},77182:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(73068).A)("Wifi",[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0",key:"dnpr2z"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0",key:"1x1e6c"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}]])}},e=>{e.O(0,[5509,4335,2522,949,2573,8085,3736,7142,7747,74,1979,3628,7358],()=>e(e.s=11600)),_N_E=e.O()}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.