PageSourceSearch

https://www.sipflow.dev/_next/static/chunks/app/live/page-1852ae33efaccfab.js

js sipflow.dev collected 2026-10-02 01:53:13 UTC 53,477 bytes, 1 lines download raw bytes

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.