diff --git a/repeater/web/html/assets/CADCalibration-CN8_E1ZT.js b/repeater/web/html/assets/CADCalibration-CEP43ngf.js
similarity index 98%
rename from repeater/web/html/assets/CADCalibration-CN8_E1ZT.js
rename to repeater/web/html/assets/CADCalibration-CEP43ngf.js
index a7d62d7..3833006 100644
--- a/repeater/web/html/assets/CADCalibration-CN8_E1ZT.js
+++ b/repeater/web/html/assets/CADCalibration-CEP43ngf.js
@@ -1 +1 @@
-import{r as e}from"./chunk-DECur_0Z.js";import{E as t,H as n,T as r,f as i,g as a,gt as o,ht as ee,l as s,m as c,o as l,p as u,r as d,s as f,u as p,w as te}from"./runtime-core.esm-bundler-BiwffnQU.js";import{l as ne,t as m}from"./api-D4EC7CQ7.js";import{t as re}from"./system-tQ_uAfZI.js";import{t as h}from"./_plugin-vue_export-helper-TcpyXLsZ.js";import{t as g}from"./plotly.min-B1MU54E1.js";import{t as ie}from"./RestartModal-QtkihGZG.js";var _=e(g(),1),ae={class:`p-6 space-y-6`},v={class:`glass-card rounded-[15px] p-6`},y={class:`flex justify-center`},oe={class:`flex gap-4`},se=[`disabled`],ce=[`disabled`],le={class:`glass-card rounded-[15px] p-6 space-y-4`},ue={class:`text-content-primary dark:text-content-primary`},de={class:`flex items-center justify-between gap-4 px-4 bg-primary/10 border border-primary/30 rounded-lg h-[52px] overflow-hidden`},fe={key:0,class:`text-content-primary dark:text-primary text-sm`},pe={key:1,class:`text-content-muted dark:text-content-muted text-sm italic`},me={key:2,class:`text-content-primary dark:text-content-primary text-sm`},he={key:3,class:`text-content-secondary dark:text-content-muted text-sm`},ge={class:`space-y-2`},b={class:`w-full bg-white/10 rounded-full h-2`},x={class:`text-content-secondary dark:text-content-muted text-sm`},S={class:`grid grid-cols-2 md:grid-cols-4 gap-4`},C={class:`glass-card rounded-[15px] p-4 text-center`},w={class:`text-2xl font-bold text-primary`},T={class:`glass-card rounded-[15px] p-4 text-center`},E={class:`text-2xl font-bold text-primary`},D={class:`glass-card rounded-[15px] p-4 text-center`},O={class:`text-2xl font-bold text-primary`},k={class:`glass-card rounded-[15px] p-4 text-center`},A={class:`text-2xl font-bold text-primary`},j=h(a({name:`CADCalibrationView`,__name:`CADCalibration`,setup(e){let a=re(),h=l(()=>document.documentElement.classList.contains(`dark`)),g=()=>{let e=h.value;return{title:e?`#F9FAFB`:`#111827`,subtitle:e?`#9CA3AF`:`#6B7280`,axis:e?`#D1D5DB`:`#374151`,tick:e?`#9CA3AF`:`#6B7280`,grid:e?`rgba(148, 163, 184, 0.1)`:`rgba(107, 114, 128, 0.15)`,zeroline:e?`rgba(148, 163, 184, 0.2)`:`rgba(107, 114, 128, 0.25)`,line:e?`rgba(148, 163, 184, 0.3)`:`rgba(107, 114, 128, 0.35)`,colorbarBorder:e?`rgba(255,255,255,0.2)`:`rgba(0,0,0,0.15)`,markerLine:e?`rgba(255,255,255,0.2)`:`rgba(0,0,0,0.15)`}},j=n(!1),M=n(null),N=n(null),P=n({}),F=n(null),I=n([]),L=n({}),R=n(`Ready to start calibration`),z=n(0),B=n(0),V=n(0),H=n(0),U=n(0),W=n(0),G=n(null),K=n(!1),q=n(!1),J=n(!1),Y=n(!1),X=null,_e={responsive:!0,displayModeBar:!0,modeBarButtonsToRemove:[`pan2d`,`select2d`,`lasso2d`,`autoScale2d`],displaylogo:!1,toImageButtonOptions:{format:`png`,filename:`cad-calibration-heatmap`,height:600,width:800,scale:2}};function ve(){let e=g(),t=[{x:[],y:[],z:[],mode:`markers`,type:`scatter`,marker:{size:12,color:[],colorscale:[[0,`rgba(75, 85, 99, 0.4)`],[.1,`rgba(6, 182, 212, 0.3)`],[.5,`rgba(6, 182, 212, 0.6)`],[1,`rgba(16, 185, 129, 0.9)`]],showscale:!0,colorbar:{title:{text:`Detection Rate (%)`,font:{color:e.axis,size:14}},tickfont:{color:e.tick},bgcolor:`rgba(0,0,0,0)`,bordercolor:e.colorbarBorder,borderwidth:1,thickness:15},line:{color:e.markerLine,width:1}},hovertemplate:`Peak: %{x}
Min: %{y}
Detection Rate: %{marker.color:.1f}%
Channel Activity Detection Calibration`,font:{color:e.title,size:18},x:.5},xaxis:{title:{text:`CAD Peak Threshold`,font:{color:e.axis,size:14}},tickfont:{color:e.tick},gridcolor:e.grid,zerolinecolor:e.zeroline,linecolor:e.line},yaxis:{title:{text:`CAD Min Threshold`,font:{color:e.axis,size:14}},tickfont:{color:e.tick},gridcolor:e.grid,zerolinecolor:e.zeroline,linecolor:e.line},plot_bgcolor:`rgba(0, 0, 0, 0)`,paper_bgcolor:`rgba(0, 0, 0, 0)`,font:{color:e.title,family:`Inter, system-ui, sans-serif`},margin:{l:80,r:80,t:100,b:80},showlegend:!1};_.default.newPlot(`plotly-chart`,t,n,_e)}function ye(){if(Object.keys(P.value).length===0)return;let e=Object.values(P.value),t=[],n=[],r=[];for(let i of e)t.push(i.det_peak),n.push(i.det_min),r.push(i.detection_rate);let i={x:[t],y:[n],"marker.color":[r],hovertemplate:`Peak: %{x}
Min: %{y}
Detection Rate: %{marker.color:.1f}%
Status: Tested
Manage companion identities (TCP frame server)
Manage companion identities (TCP frame server)
API tokens are used for machine-to-machine authentication. Include the token in the X-API-Key header when making API requests.
Tokens are only shown once at creation. Store them securely.
PyMC Console must be installed at /opt/pymc_console/web/html before selecting this option.
Web frontend changes will take effect after restarting the pymc-repeater service.
There are three layers of advert rate limit control: Each layer can be enabled/disabled independently and the others will still function.
Decision flow when all enabled: Adaptive tier check → Penalty box check → Token bucket check → Violation recording (triggers penalty box)
Activity tiers:Quiet (bypass limiting) → Normal (lighter: 0.5x intervals) → Busy (base: 1.0x intervals) → Congested (stricter: 2.0x intervals)
Note: Adaptive mode scales refill/min-interval timing; bucket capacity stays at the configured base value.
Mesh traffic can reach your repeater through different paths, so duplicate advert packets are expected.
This is normal behavior and helps prevent repeated rebroadcasts from flooding the mesh.
Each sender has a token bucket. Every forwarded advert uses one token.
If a sender keeps hitting the limit, it is temporarily blocked.
Adaptive mode adjusts limits based on recent advert activity.
This page is served over HTTP, not HTTPS. Exported data (including identity keys) will be transmitted in plain text. Only use these features on a trusted local network.
Download a complete backup including all passwords, JWT secrets, and identity keys. Required for restoring to a new device or recovering from a failed SD card.
Contains sensitive data. The backup file will include plain-text passwords and private keys. Store it securely and never share it.
Download the repeater's private identity key for backup. This key determines the node's address and cryptographic identity on the mesh.
Sensitive data. The identity key is the repeater's private key. Anyone with this key can impersonate your node. Store the exported file securely and never share it.
Memory tracing is running. Let the repeater run for a few minutes, then click Check Again to see which parts of the code are using more memory.
`,2)]])):v(``,!0),c.value&&p.value?(e(),T(`div`,eu,[w(`div`,{class:b([`mb-5 p-4 rounded-lg border flex items-start gap-3`,I.value])},[w(`div`,{class:`mt-0.5`,innerHTML:L.value},null,8,tu),w(`div`,null,[w(`p`,nu,m(R.value),1),w(`p`,ru,m(z.value),1)])],2),w(`div`,iu,[c.value.rss_mb===void 0?v(``,!0):(e(),T(`div`,au,[n[6]||=w(`p`,{class:`text-xs text-content-muted mb-1`},`Total Memory Used`,-1),w(`p`,ou,m(c.value.rss_mb)+` MB`,1)])),c.value.traced_current_mb===void 0?v(``,!0):(e(),T(`div`,su,[n[7]||=w(`p`,{class:`text-xs text-content-muted mb-1`},`Tracked Now`,-1),w(`p`,cu,m(c.value.traced_current_mb)+` MB`,1)])),c.value.traced_peak_mb===void 0?v(``,!0):(e(),T(`div`,lu,[n[8]||=w(`p`,{class:`text-xs text-content-muted mb-1`},`Peak Tracked`,-1),w(`p`,uu,m(c.value.traced_peak_mb)+` MB`,1)]))]),c.value.growth_since_baseline&&c.value.growth_since_baseline.length>0?(e(),T(`div`,du,[n[9]||=w(`h4`,{class:`text-sm font-semibold text-content-primary dark:text-content-primary mb-1`},`Memory Growth Breakdown`,-1),n[10]||=w(`p`,{class:`text-xs text-content-muted mb-3`},` Items at the top with red/orange tags are the most likely cause of memory issues. Green items are normal and can be ignored. `,-1),w(`div`,fu,[(e(!0),T(C,null,i(c.value.growth_since_baseline,(t,n)=>(e(),T(`div`,{key:n,class:b([`rounded-lg border p-3 transition-colors`,k(t)])},[w(`div`,pu,[w(`div`,mu,[w(`span`,hu,m(n+1),1),w(`span`,{class:b([`shrink-0 inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-semibold`,O(t)])},m(D(t)),3)]),w(`div`,gu,[w(`span`,{class:b([`font-mono text-sm font-semibold`,A(t)])},`+`+m(M(t.size_diff_kb)),3),w(`p`,_u,m(M(t.current_size_kb))+` total`,1)])]),w(`div`,vu,[w(`p`,yu,m(N(t.file)),1),t.count_diff===0?v(``,!0):(e(),T(`p`,bu,m(t.count_diff>0?`+`:``)+m(t.count_diff)+` new allocation`+m(Math.abs(t.count_diff)===1?``:`s`),1))])],2))),128))])])):c.value.growth_since_baseline&&c.value.growth_since_baseline.length===0?(e(),T(`div`,xu,[...n[11]||=[w(`svg`,{class:`w-5 h-5 text-green-600 dark:text-green-400 shrink-0`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[w(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z`})],-1),w(`span`,{class:`text-green-700 dark:text-green-400`},`No memory growth detected. Everything looks healthy.`,-1)]])):v(``,!0),c.value.current_top_20&&c.value.current_top_20.length>0?(e(),T(`div`,Su,[w(`button`,{onClick:n[0]||=e=>d.value=!d.value,class:`flex items-center gap-2 text-sm font-semibold text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-primary transition-colors mb-3`},[(e(),T(`svg`,{class:b([`w-4 h-4 transition-transform`,{"rotate-90":d.value}]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...n[12]||=[w(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 5l7 7-7 7`},null,-1)]],2)),n[13]||=S(` Advanced: Current Top Allocations `,-1)]),y(V,{name:`expand`},{default:r(()=>[d.value?(e(),T(`div`,Cu,[w(`table`,wu,[n[14]||=w(`thead`,null,[w(`tr`,{class:`bg-background-mute dark:bg-background/30 text-left`},[w(`th`,{class:`px-3 py-2 text-xs font-medium text-content-muted`},`#`),w(`th`,{class:`px-3 py-2 text-xs font-medium text-content-muted`},`Location`),w(`th`,{class:`px-3 py-2 text-xs font-medium text-content-muted text-right`},`Size`),w(`th`,{class:`px-3 py-2 text-xs font-medium text-content-muted text-right`},`Count`)])],-1),w(`tbody`,null,[(e(!0),T(C,null,i(c.value.current_top_20,(t,n)=>(e(),T(`tr`,{key:n,class:`border-t border-stroke-subtle/50 dark:border-stroke/5 hover:bg-background-mute/50 dark:hover:bg-background/20 transition-colors`},[w(`td`,Tu,m(n+1),1),w(`td`,Eu,m(N(t.file)),1),w(`td`,Du,m(M(t.size_kb)),1),w(`td`,Ou,m(t.count),1)]))),128))])])])):v(``,!0)]),_:1})])):v(``,!0)])):v(``,!0),!a.value&&!o.value&&!l.value&&!p.value&&!s.value&&u.value===null?(e(),T(`div`,ku,[...n[15]||=[S(` Click `,-1),w(`strong`,null,`Start Tracing`,-1),S(` to enable memory diagnostics. `,-1),w(`br`,null,null,-1),w(`span`,{class:`text-xs`},`Tracing uses extra memory — remember to stop it when done.`,-1)]])):v(``,!0)])]))}}),[[`__scopeId`,`data-v-218b986b`]]),ju={class:`p-3 sm:p-6 space-y-4 sm:space-y-6`},Mu={class:`flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},Nu={class:`glass-card rounded-[15px] p-3 sm:p-6 mt-4 sm:mt-6`},Pu={class:`relative -mx-3 sm:mx-0 mb-4 sm:mb-6`},Fu={key:0,class:`absolute left-0 top-0 bottom-[1px] w-12 z-10 flex items-center`},Iu={key:0,class:`absolute right-0 top-0 bottom-[1px] w-12 z-10 flex items-center justify-end`},Lu=[`onClick`],Ru={class:`flex items-center gap-1 sm:gap-2`},zu={key:0,class:`w-3.5 h-3.5 sm:w-4 sm:h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Bu={key:1,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Vu={key:2,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Hu={key:3,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Uu={key:4,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Wu={key:5,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Gu={key:6,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Ku={key:7,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},qu={key:8,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Ju={key:9,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Yu={key:10,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Xu={key:11,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Zu={class:`min-h-[400px]`},Qu={key:0,class:`flex items-center justify-center py-12`},$u={key:1,class:`flex items-center justify-center py-12`},ed={class:`text-center`},td={class:`text-content-secondary dark:text-content-muted text-sm mb-4`},nd={key:2},rd=P(p({name:`ConfigurationView`,__name:`Configuration`,setup(n){let o=M(),s=N(),c=t(J(`configuration_activeTab`,`radio`)),f=t(!1),p=t(null),h=t(null),x=t(!1),D=t(!1);function O(){if(!p.value)return;let e=p.value;D.value=e.scrollLeft>4,x.value=e.scrollLeftAPI tokens are used for machine-to-machine authentication. Include the token in the X-API-Key header when making API requests.
Tokens are only shown once at creation. Store them securely.
PyMC Console must be installed at /opt/pymc_console/web/html before selecting this option.
Web frontend changes will take effect after restarting the pymc-repeater service.
There are three layers of advert rate limit control: Each layer can be enabled/disabled independently and the others will still function.
Decision flow when all enabled: Adaptive tier check → Penalty box check → Token bucket check → Violation recording (triggers penalty box)
Activity tiers:Quiet (bypass limiting) → Normal (lighter: 0.5x intervals) → Busy (base: 1.0x intervals) → Congested (stricter: 2.0x intervals)
Note: Adaptive mode scales refill/min-interval timing; bucket capacity stays at the configured base value.
Mesh traffic can reach your repeater through different paths, so duplicate advert packets are expected.
This is normal behavior and helps prevent repeated rebroadcasts from flooding the mesh.
Each sender has a token bucket. Every forwarded advert uses one token.
If a sender keeps hitting the limit, it is temporarily blocked.
Adaptive mode adjusts limits based on recent advert activity.
This page is served over HTTP, not HTTPS. Exported data (including identity keys) will be transmitted in plain text. Only use these features on a trusted local network.
Download a complete backup including all passwords, JWT secrets, and identity keys. Required for restoring to a new device or recovering from a failed SD card.
Contains sensitive data. The backup file will include plain-text passwords and private keys. Store it securely and never share it.
Download the repeater's private identity key for backup. This key determines the node's address and cryptographic identity on the mesh.
Sensitive data. The identity key is the repeater's private key. Anyone with this key can impersonate your node. Store the exported file securely and never share it.
Memory tracing is running. Let the repeater run for a few minutes, then click Check Again to see which parts of the code are using more memory.
`,2)]])):v(``,!0),c.value&&p.value?(e(),T(`div`,eu,[w(`div`,{class:b([`mb-5 p-4 rounded-lg border flex items-start gap-3`,I.value])},[w(`div`,{class:`mt-0.5`,innerHTML:L.value},null,8,tu),w(`div`,null,[w(`p`,nu,m(R.value),1),w(`p`,ru,m(z.value),1)])],2),w(`div`,iu,[c.value.rss_mb===void 0?v(``,!0):(e(),T(`div`,au,[n[6]||=w(`p`,{class:`text-xs text-content-muted mb-1`},`Total Memory Used`,-1),w(`p`,ou,m(c.value.rss_mb)+` MB`,1)])),c.value.traced_current_mb===void 0?v(``,!0):(e(),T(`div`,su,[n[7]||=w(`p`,{class:`text-xs text-content-muted mb-1`},`Tracked Now`,-1),w(`p`,cu,m(c.value.traced_current_mb)+` MB`,1)])),c.value.traced_peak_mb===void 0?v(``,!0):(e(),T(`div`,lu,[n[8]||=w(`p`,{class:`text-xs text-content-muted mb-1`},`Peak Tracked`,-1),w(`p`,uu,m(c.value.traced_peak_mb)+` MB`,1)]))]),c.value.growth_since_baseline&&c.value.growth_since_baseline.length>0?(e(),T(`div`,du,[n[9]||=w(`h4`,{class:`text-sm font-semibold text-content-primary dark:text-content-primary mb-1`},`Memory Growth Breakdown`,-1),n[10]||=w(`p`,{class:`text-xs text-content-muted mb-3`},` Items at the top with red/orange tags are the most likely cause of memory issues. Green items are normal and can be ignored. `,-1),w(`div`,fu,[(e(!0),T(C,null,i(c.value.growth_since_baseline,(t,n)=>(e(),T(`div`,{key:n,class:b([`rounded-lg border p-3 transition-colors`,k(t)])},[w(`div`,pu,[w(`div`,mu,[w(`span`,hu,m(n+1),1),w(`span`,{class:b([`shrink-0 inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-semibold`,O(t)])},m(D(t)),3)]),w(`div`,gu,[w(`span`,{class:b([`font-mono text-sm font-semibold`,A(t)])},`+`+m(M(t.size_diff_kb)),3),w(`p`,_u,m(M(t.current_size_kb))+` total`,1)])]),w(`div`,vu,[w(`p`,yu,m(N(t.file)),1),t.count_diff===0?v(``,!0):(e(),T(`p`,bu,m(t.count_diff>0?`+`:``)+m(t.count_diff)+` new allocation`+m(Math.abs(t.count_diff)===1?``:`s`),1))])],2))),128))])])):c.value.growth_since_baseline&&c.value.growth_since_baseline.length===0?(e(),T(`div`,xu,[...n[11]||=[w(`svg`,{class:`w-5 h-5 text-green-600 dark:text-green-400 shrink-0`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[w(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z`})],-1),w(`span`,{class:`text-green-700 dark:text-green-400`},`No memory growth detected. Everything looks healthy.`,-1)]])):v(``,!0),c.value.current_top_20&&c.value.current_top_20.length>0?(e(),T(`div`,Su,[w(`button`,{onClick:n[0]||=e=>d.value=!d.value,class:`flex items-center gap-2 text-sm font-semibold text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-primary transition-colors mb-3`},[(e(),T(`svg`,{class:b([`w-4 h-4 transition-transform`,{"rotate-90":d.value}]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...n[12]||=[w(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 5l7 7-7 7`},null,-1)]],2)),n[13]||=S(` Advanced: Current Top Allocations `,-1)]),y(V,{name:`expand`},{default:r(()=>[d.value?(e(),T(`div`,Cu,[w(`table`,wu,[n[14]||=w(`thead`,null,[w(`tr`,{class:`bg-background-mute dark:bg-background/30 text-left`},[w(`th`,{class:`px-3 py-2 text-xs font-medium text-content-muted`},`#`),w(`th`,{class:`px-3 py-2 text-xs font-medium text-content-muted`},`Location`),w(`th`,{class:`px-3 py-2 text-xs font-medium text-content-muted text-right`},`Size`),w(`th`,{class:`px-3 py-2 text-xs font-medium text-content-muted text-right`},`Count`)])],-1),w(`tbody`,null,[(e(!0),T(C,null,i(c.value.current_top_20,(t,n)=>(e(),T(`tr`,{key:n,class:`border-t border-stroke-subtle/50 dark:border-stroke/5 hover:bg-background-mute/50 dark:hover:bg-background/20 transition-colors`},[w(`td`,Tu,m(n+1),1),w(`td`,Eu,m(N(t.file)),1),w(`td`,Du,m(M(t.size_kb)),1),w(`td`,Ou,m(t.count),1)]))),128))])])])):v(``,!0)]),_:1})])):v(``,!0)])):v(``,!0),!a.value&&!o.value&&!l.value&&!p.value&&!s.value&&u.value===null?(e(),T(`div`,ku,[...n[15]||=[S(` Click `,-1),w(`strong`,null,`Start Tracing`,-1),S(` to enable memory diagnostics. `,-1),w(`br`,null,null,-1),w(`span`,{class:`text-xs`},`Tracing uses extra memory — remember to stop it when done.`,-1)]])):v(``,!0)])]))}}),[[`__scopeId`,`data-v-218b986b`]]),ju={class:`p-3 sm:p-6 space-y-4 sm:space-y-6`},Mu={class:`flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},Nu={class:`glass-card rounded-[15px] p-3 sm:p-6 mt-4 sm:mt-6`},Pu={class:`relative -mx-3 sm:mx-0 mb-4 sm:mb-6`},Fu={key:0,class:`absolute left-0 top-0 bottom-[1px] w-12 z-10 flex items-center`},Iu={key:0,class:`absolute right-0 top-0 bottom-[1px] w-12 z-10 flex items-center justify-end`},Lu=[`onClick`],Ru={class:`flex items-center gap-1 sm:gap-2`},zu={key:0,class:`w-3.5 h-3.5 sm:w-4 sm:h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Bu={key:1,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Vu={key:2,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Hu={key:3,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Uu={key:4,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Wu={key:5,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Gu={key:6,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Ku={key:7,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},qu={key:8,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Ju={key:9,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Yu={key:10,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Xu={key:11,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Zu={class:`min-h-[400px]`},Qu={key:0,class:`flex items-center justify-center py-12`},$u={key:1,class:`flex items-center justify-center py-12`},ed={class:`text-center`},td={class:`text-content-secondary dark:text-content-muted text-sm mb-4`},nd={key:2},rd=P(p({name:`ConfigurationView`,__name:`Configuration`,setup(n){let o=M(),s=N(),c=t(J(`configuration_activeTab`,`radio`)),f=t(!1),p=t(null),h=t(null),x=t(!1),D=t(!1);function O(){if(!p.value)return;let e=p.value;D.value=e.scrollLeft>4,x.value=e.scrollLeftActivity (Last 24 Hours)
Activity (Last 24 Hours)
No logs match the current filter criteria.
`,3)]])):(e(),p(`div`,A,[(e(!0),p(d,null,n(K.value,(t,n)=>(e(),p(`div`,{key:n,class:`flex items-start gap-4 p-4 hover:bg-background-mute dark:hover:bg-stroke/5 transition-colors font-mono text-sm`},[f(`span`,j,` [`+o(X(t.timestamp))+`] `,1),f(`span`,M,o(H(t.message)),1),f(`span`,{class:c([`flex-shrink-0 px-2 py-1 text-xs font-medium rounded`,Z(t.level)])},o(t.level),3),f(`span`,N,o(U(t.message)),1)]))),128))]))]))])]))}});export{P as default}; \ No newline at end of file +import{E as e,H as t,O as n,S as r,f as i,g as a,gt as o,l as s,mt as c,o as l,p as u,r as d,s as f,u as p,w as m}from"./runtime-core.esm-bundler-BiwffnQU.js";import{t as h}from"./api-DRn_D8oU.js";var g={class:`space-y-6`},_={class:`glass-card backdrop-blur border border-stroke-subtle dark:border-white/10 rounded-[15px] p-6`},v={class:`flex items-center justify-between mb-4`},ee=[`disabled`],y={class:`bg-gray-50 dark:bg-white/5 border border-stroke-subtle dark:border-stroke/10 rounded-lg p-4`},b={class:`flex flex-wrap gap-2`},x=[`onClick`],S={key:0,class:`w-px h-6 bg-stroke-subtle dark:bg-stroke/20 mx-2 self-center`},C=[`onClick`],w={class:`glass-card backdrop-blur border border-stroke-subtle dark:border-white/10 rounded-[15px] overflow-hidden`},T={key:0,class:`p-8 text-center`},E={key:1,class:`p-8 text-center`},D={class:`text-content-secondary dark:text-content-muted mb-4`},O={key:2,class:`max-h-[600px] overflow-y-auto`},k={key:0,class:`p-8 text-center`},A={key:1,class:`divide-y divide-gray-200 dark:divide-white/5`},j={class:`flex-shrink-0 text-content-secondary dark:text-content-muted`},M={class:`flex-shrink-0 px-2 py-1 text-xs font-medium rounded bg-blue-500/20 text-blue-600 dark:text-blue-400`},N={class:`text-content-primary dark:text-content-primary flex-1 break-all`},P=a({name:`LogsView`,__name:`Logs`,setup(a){let P=t([]),F=t(new Set),I=t(new Set([`DEBUG`,`INFO`,`WARNING`,`ERROR`])),L=t(new Set),R=t(new Set),z=t(!0),B=t(null),V=null,H=e=>{let t=e.match(/- ([^-]+) - (?:DEBUG|INFO|WARNING|ERROR) -/);return t?t[1].trim():`Unknown`},U=e=>{let t=e.match(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} - [^-]+ - (?:DEBUG|INFO|WARNING|ERROR) - (.+)$/);return t?t[1]:e},W=(e,t)=>{if(e.size!==t.size)return!1;for(let n of e)if(!t.has(n))return!1;return!0},G=async()=>{try{let e=await h.getLogs();if(e.logs&&e.logs.length>0){P.value=e.logs;let t=new Set;P.value.forEach(e=>{let n=H(e.message);t.add(n)});let n=new Set;P.value.forEach(e=>{n.add(e.level)}),F.value.size===0&&(F.value=new Set(t));let r=!W(L.value,t),i=!W(R.value,n);r&&(L.value=t),i&&(R.value=n),B.value=null}}catch(e){console.error(`Error loading logs:`,e),B.value=e instanceof Error?e.message:`Failed to load logs`}finally{z.value=!1}},K=l(()=>P.value.filter(e=>{let t=H(e.message),n=F.value.has(t),r=I.value.has(e.level);return n&&r})),q=l(()=>Array.from(L.value).sort()),J=l(()=>{let e=[`ERROR`,`WARNING`,`WARN`,`INFO`,`DEBUG`];return Array.from(R.value).sort((t,n)=>{let r=e.indexOf(t),i=e.indexOf(n);return r!==-1&&i!==-1?r-i:t.localeCompare(n)})}),Y=e=>{I.value.has(e)?I.value.delete(e):I.value.add(e),I.value=new Set(I.value)},X=e=>new Date(e).toLocaleTimeString(`en-US`,{hour12:!1,hour:`2-digit`,minute:`2-digit`,second:`2-digit`}),Z=e=>({ERROR:`text-red-600 dark:text-red-400 bg-red-900/20`,WARNING:`text-yellow-600 dark:text-yellow-400 bg-yellow-900/20`,WARN:`text-yellow-600 dark:text-yellow-400 bg-yellow-900/20`,INFO:`text-blue-600 dark:text-blue-400 bg-blue-900/20`,DEBUG:`text-gray-400 bg-gray-900/20`})[e]||`text-gray-400 bg-gray-900/20`,Q=(e,t)=>t?{ERROR:`bg-red-100 dark:bg-red-500/20 text-red-600 dark:text-red-400 border-red-500/50`,WARNING:`bg-yellow-100 dark:bg-yellow-500/20 text-yellow-600 dark:text-yellow-400 border-yellow-500/50`,WARN:`bg-yellow-100 dark:bg-yellow-500/20 text-yellow-600 dark:text-yellow-400 border-yellow-500/50`,INFO:`bg-blue-500/20 text-blue-600 dark:text-blue-400 border-blue-500/50`,DEBUG:`bg-gray-500/20 text-gray-400 border-gray-500/50`}[e]||`bg-primary/20 text-primary border-primary/50`:`bg-background-mute dark:bg-white/5 text-content-muted dark:text-white/60 border-stroke-subtle dark:border-white/20 hover:bg-stroke-subtle dark:hover:bg-white/10`,$=e=>{F.value.has(e)?F.value.delete(e):F.value.add(e),F.value=new Set(F.value)},te=()=>{F.value=new Set(L.value)},ne=()=>{F.value=new Set},re=()=>{I.value=new Set(R.value)},ie=()=>{I.value=new Set},ae=()=>{V&&clearInterval(V),V=setInterval(G,5e3)},oe=()=>{V&&=(clearInterval(V),null)};return m(()=>{G(),ae()}),r(()=>{oe()}),(t,r)=>(e(),p(`div`,g,[f(`div`,_,[f(`div`,v,[r[1]||=f(`div`,null,[f(`h1`,{class:`text-content-primary dark:text-content-primary text-2xl font-semibold mb-2`},` System Logs `),f(`p`,{class:`text-content-secondary dark:text-content-muted`},` Real-time system events and diagnostics `)],-1),f(`button`,{onClick:G,disabled:z.value,class:`flex items-center gap-2 px-4 py-2 bg-primary/20 hover:bg-primary/30 text-primary border border-primary/50 rounded-lg transition-colors disabled:opacity-50`},[(e(),p(`svg`,{class:c([`w-4 h-4`,{"animate-spin":z.value}]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...r[0]||=[f(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15`},null,-1)]],2)),u(` `+o(z.value?`Loading...`:`Refresh`),1)],8,ee)]),f(`div`,y,[f(`div`,{class:`flex flex-wrap items-center gap-3 mb-4`},[r[2]||=f(`span`,{class:`text-content-primary dark:text-content-primary font-medium`},`Filters:`,-1),f(`button`,{onClick:te,class:`px-3 py-1 text-xs bg-accent-green/20 hover:bg-accent-green/30 text-accent-green border border-accent-green/50 rounded transition-colors`},` All Loggers `),f(`button`,{onClick:ne,class:`px-3 py-1 text-xs bg-accent-red/20 hover:bg-accent-red/30 text-accent-red border border-accent-red/50 rounded transition-colors`},` Clear Loggers `),r[3]||=f(`div`,{class:`w-px h-4 bg-white/20 mx-1`},null,-1),f(`button`,{onClick:re,class:`px-3 py-1 text-xs bg-accent-green/20 hover:bg-accent-green/30 text-accent-green border border-accent-green/50 rounded transition-colors`},` All Levels `),f(`button`,{onClick:ie,class:`px-3 py-1 text-xs bg-accent-red/20 hover:bg-accent-red/30 text-accent-red border border-accent-red/50 rounded transition-colors`},` Clear Levels `)]),f(`div`,b,[(e(!0),p(d,null,n(q.value,t=>(e(),p(`button`,{key:`logger-`+t,onClick:e=>$(t),class:c([`px-3 py-1 text-xs border rounded-full transition-colors`,F.value.has(t)?`bg-primary/20 text-primary border-primary/50`:`bg-background-mute dark:bg-white/5 text-content-secondary dark:text-content-muted border-stroke-subtle dark:border-stroke/20 hover:bg-stroke-subtle dark:hover:bg-white/10`])},o(t),11,x))),128)),q.value.length>0&&J.value.length>0?(e(),p(`div`,S)):s(``,!0),(e(!0),p(d,null,n(J.value,t=>(e(),p(`button`,{key:`level-`+t,onClick:e=>Y(t),class:c([`px-3 py-1 text-xs border rounded-full transition-colors font-medium`,I.value.has(t)?Q(t,!0):Q(t,!1)])},o(t),11,C))),128))])])]),f(`div`,w,[z.value&&P.value.length===0?(e(),p(`div`,T,[...r[4]||=[f(`div`,{class:`animate-spin rounded-full h-8 w-8 border-b-2 border-primary mx-auto mb-4`},null,-1),f(`p`,{class:`text-content-secondary dark:text-content-muted`},`Loading system logs...`,-1)]])):B.value?(e(),p(`div`,E,[r[5]||=f(`div`,{class:`text-red-600 dark:text-red-400 mb-4`},[f(`svg`,{class:`w-12 h-12 mx-auto mb-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[f(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`})])],-1),r[6]||=f(`h3`,{class:`text-content-primary dark:text-content-primary text-lg font-medium mb-2`},` Error Loading Logs `,-1),f(`p`,D,o(B.value),1),f(`button`,{onClick:G,class:`px-4 py-2 bg-red-100 dark:bg-red-500/20 hover:bg-red-500/30 text-red-600 dark:text-red-400 border border-red-500/50 rounded-lg transition-colors`},` Try Again `)])):(e(),p(`div`,O,[K.value.length===0?(e(),p(`div`,k,[...r[7]||=[i(`No logs match the current filter criteria.
`,3)]])):(e(),p(`div`,A,[(e(!0),p(d,null,n(K.value,(t,n)=>(e(),p(`div`,{key:n,class:`flex items-start gap-4 p-4 hover:bg-background-mute dark:hover:bg-stroke/5 transition-colors font-mono text-sm`},[f(`span`,j,` [`+o(X(t.timestamp))+`] `,1),f(`span`,M,o(H(t.message)),1),f(`span`,{class:c([`flex-shrink-0 px-2 py-1 text-xs font-medium rounded`,Z(t.level)])},o(t.level),3),f(`span`,N,o(U(t.message)),1)]))),128))]))]))])]))}});export{P as default}; \ No newline at end of file diff --git a/repeater/web/html/assets/MessageDialog-BjntbgUi.js b/repeater/web/html/assets/MessageDialog-D2UtTnD7.js similarity index 96% rename from repeater/web/html/assets/MessageDialog-BjntbgUi.js rename to repeater/web/html/assets/MessageDialog-D2UtTnD7.js index 1c62ae5..33e0b4a 100644 --- a/repeater/web/html/assets/MessageDialog-BjntbgUi.js +++ b/repeater/web/html/assets/MessageDialog-D2UtTnD7.js @@ -1 +1 @@ -import{E as e,c as t,g as n,gt as r,i,l as a,mt as o,s,u as c}from"./runtime-core.esm-bundler-BiwffnQU.js";import{_ as l}from"./index-D5Pf18i0.js";var u={class:`modal-card max-w-md`},d={class:`mb-6`},f={key:0,class:`w-6 h-6`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},p={key:1,class:`w-6 h-6`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},m={key:2,class:`w-6 h-6`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},h={class:`text-content-secondary dark:text-content-primary/80 text-base leading-relaxed`},g={class:`flex`},_=n({__name:`MessageDialog`,props:{show:{type:Boolean},message:{},variant:{default:`success`}},emits:[`close`],setup(n,{emit:_}){let v=n,y=_,b={success:`bg-green-100 dark:bg-green-500/20 border-green-600/40 dark:border-green-500/30 text-green-600 dark:text-green-400`,error:`bg-red-100 dark:bg-red-500/20 border-red-500/30 text-red-600 dark:text-red-400`,info:`bg-blue-500/20 border-blue-500/30 text-blue-600 dark:text-blue-400`},x={success:`bg-green-500 hover:bg-green-600`,error:`bg-red-500 hover:bg-red-600`,info:`bg-blue-500 hover:bg-blue-600`};return(n,_)=>(e(),t(i,{to:`body`},[v.show?(e(),c(`div`,{key:0,onClick:_[1]||=l(e=>y(`close`),[`self`]),class:`modal-backdrop`},[s(`div`,u,[s(`div`,d,[s(`div`,{class:o([`inline-flex p-3 rounded-xl mb-4`,b[v.variant]])},[v.variant===`success`?(e(),c(`svg`,f,[..._[2]||=[s(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M5 13l4 4L19 7`},null,-1)]])):v.variant===`error`?(e(),c(`svg`,p,[..._[3]||=[s(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`},null,-1)]])):(e(),c(`svg`,m,[..._[4]||=[s(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`},null,-1)]]))],2),s(`p`,h,r(v.message),1)]),s(`div`,g,[s(`button`,{onClick:_[0]||=e=>y(`close`),class:o([`flex-1 px-4 py-3 rounded-xl text-white transition-all duration-200`,x[v.variant]])},` OK `,2)])])])):a(``,!0)]))}});export{_ as t}; \ No newline at end of file +import{E as e,c as t,g as n,gt as r,i,l as a,mt as o,s,u as c}from"./runtime-core.esm-bundler-BiwffnQU.js";import{_ as l}from"./index-Bwi6QvPf.js";var u={class:`modal-card max-w-md`},d={class:`mb-6`},f={key:0,class:`w-6 h-6`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},p={key:1,class:`w-6 h-6`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},m={key:2,class:`w-6 h-6`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},h={class:`text-content-secondary dark:text-content-primary/80 text-base leading-relaxed`},g={class:`flex`},_=n({__name:`MessageDialog`,props:{show:{type:Boolean},message:{},variant:{default:`success`}},emits:[`close`],setup(n,{emit:_}){let v=n,y=_,b={success:`bg-green-100 dark:bg-green-500/20 border-green-600/40 dark:border-green-500/30 text-green-600 dark:text-green-400`,error:`bg-red-100 dark:bg-red-500/20 border-red-500/30 text-red-600 dark:text-red-400`,info:`bg-blue-500/20 border-blue-500/30 text-blue-600 dark:text-blue-400`},x={success:`bg-green-500 hover:bg-green-600`,error:`bg-red-500 hover:bg-red-600`,info:`bg-blue-500 hover:bg-blue-600`};return(n,_)=>(e(),t(i,{to:`body`},[v.show?(e(),c(`div`,{key:0,onClick:_[1]||=l(e=>y(`close`),[`self`]),class:`modal-backdrop`},[s(`div`,u,[s(`div`,d,[s(`div`,{class:o([`inline-flex p-3 rounded-xl mb-4`,b[v.variant]])},[v.variant===`success`?(e(),c(`svg`,f,[..._[2]||=[s(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M5 13l4 4L19 7`},null,-1)]])):v.variant===`error`?(e(),c(`svg`,p,[..._[3]||=[s(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`},null,-1)]])):(e(),c(`svg`,m,[..._[4]||=[s(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`},null,-1)]]))],2),s(`p`,h,r(v.message),1)]),s(`div`,g,[s(`button`,{onClick:_[0]||=e=>y(`close`),class:o([`flex-1 px-4 py-3 rounded-xl text-white transition-all duration-200`,x[v.variant]])},` OK `,2)])])])):a(``,!0)]))}});export{_ as t}; \ No newline at end of file diff --git a/repeater/web/html/assets/Neighbors-CxUv8hFU.js b/repeater/web/html/assets/Neighbors-CxUv8hFU.js deleted file mode 100644 index 0ad0146..0000000 --- a/repeater/web/html/assets/Neighbors-CxUv8hFU.js +++ /dev/null @@ -1,65 +0,0 @@ -import{r as e}from"./chunk-DECur_0Z.js";import{E as t,H as n,N as r,O as i,P as a,T as o,Y as s,b as c,c as l,f as u,g as d,gt as f,ht as p,i as m,j as h,l as g,m as _,mt as v,o as y,p as b,r as x,s as S,u as C,w}from"./runtime-core.esm-bundler-BiwffnQU.js";import{t as T}from"./api-D4EC7CQ7.js";import{t as E}from"./system-tQ_uAfZI.js";import{n as D,r as O,t as k}from"./dataService-BXOgiPpv.js";import{t as A}from"./_plugin-vue_export-helper-TcpyXLsZ.js";import{_ as j,h as M,m as N,p as P,u as F}from"./index-D5Pf18i0.js";import{t as I}from"./leaflet-src-h-Ags50K.js";/* empty css */import{a as L,i as R,l as z,o as B,r as V,s as H,u as U}from"./formatters-7ihR6KRV.js";import{n as W,t as G}from"./preferences-BlQds_au.js";import{t as K}from"./useSignalQuality-CVSr-znZ.js";var q={class:`modal-card max-w-md`},J={class:`bg-gray-50 dark:bg-white/5 border border-stroke-subtle dark:border-stroke/10 rounded-lg p-4 mb-6`},ee={class:`flex items-center gap-3`},Y={class:`flex-1 min-w-0`},te={class:`text-content-primary dark:text-content-primary font-medium truncate`},ne={class:`text-content-secondary dark:text-content-muted text-sm font-mono`},re={key:0,class:`text-white/50 text-xs`},ie={key:1,class:`text-white/50 text-xs`},ae=d({__name:`DeleteNeighborModal`,props:{show:{type:Boolean},neighbor:{}},emits:[`close`,`delete`],setup(e,{emit:n}){let r=e,i=n,a=()=>{r.neighbor&&(i(`delete`,r.neighbor.id),o())},o=()=>{i(`close`)};return(n,r)=>(t(),l(m,{to:`body`},[e.show&&e.neighbor?(t(),C(`div`,{key:0,onClick:r[0]||=j(e=>o(),[`self`]),class:`modal-backdrop-heavy`},[S(`div`,q,[S(`div`,{class:`flex items-center gap-3 mb-6`},[r[2]||=S(`svg`,{class:`w-6 h-6 text-accent-red`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z`})],-1),r[3]||=S(`div`,null,[S(`h3`,{class:`text-xl font-semibold text-content-primary dark:text-content-primary`},` Delete Neighbor `),S(`p`,{class:`text-content-secondary dark:text-content-muted text-sm mt-1`},` Are you sure you want to delete this neighbor? `)],-1),S(`button`,{onClick:o,class:`ml-auto text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-primary transition-colors`},[...r[1]||=[S(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])]),S(`div`,J,[S(`div`,ee,[S(`div`,Y,[S(`div`,te,f(e.neighbor?.node_name||e.neighbor?.long_name||e.neighbor?.short_name||`Unknown`),1),S(`div`,ne,` ID: `+f(e.neighbor?.node_num_hex||e.neighbor?.node_num||e.neighbor?.id||`N/A`),1),e.neighbor?.contact_type?(t(),C(`div`,re,f(e.neighbor.contact_type),1)):g(``,!0),e.neighbor?.hw_model?(t(),C(`div`,ie,f(e.neighbor.hw_model),1)):g(``,!0)])])]),r[4]||=S(`div`,{class:`bg-accent-red/10 border border-accent-red/30 rounded-lg p-4 mb-6`},[S(`div`,{class:`flex items-center gap-2 text-accent-red text-sm`},[S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`})]),S(`span`,null,`This action cannot be undone`)])],-1),S(`div`,{class:`flex gap-3`},[S(`button`,{onClick:o,class:`flex-1 px-4 py-3 bg-background-mute dark:bg-white/5 hover:bg-stroke-subtle dark:hover:bg-white/10 border border-stroke-subtle dark:border-stroke/20 text-content-primary dark:text-content-primary rounded-lg transition-colors`},` Cancel `),S(`button`,{onClick:a,class:`flex-1 px-4 py-3 bg-accent-red/20 hover:bg-accent-red/30 border border-accent-red/50 text-accent-red rounded-lg transition-colors font-medium`},` Delete `)])])])):g(``,!0)]))}}),oe={class:`bg-gradient-to-r from-primary/20 to-accent-cyan/20 border-b border-stroke-subtle dark:border-stroke/10 px-6 py-4`},se={class:`flex items-center justify-between`},ce={class:`flex items-center gap-3`},le={key:0,class:`text-sm text-content-secondary dark:text-content-muted`},ue={class:`p-6`},de={key:0,class:`text-center py-8`},fe={key:1,class:`text-center py-8`},pe={class:`text-content-secondary dark:text-content-muted text-sm`},me={key:2,class:`space-y-4`},he={class:`bg-background-mute dark:bg-background/50 border border-stroke-subtle dark:border-stroke/10 rounded-[15px] p-4`},ge={class:`flex items-center justify-between mb-2`},_e={class:`flex items-baseline gap-2`},ve={class:`text-3xl font-bold text-content-primary dark:text-content-primary`},ye={class:`grid grid-cols-2 gap-3`},be={class:`bg-background-mute dark:bg-background/50 border border-stroke-subtle dark:border-stroke/10 rounded-[15px] p-4`},xe={class:`flex items-center gap-2 mb-2`},Se={class:`flex gap-0.5`},Ce={class:`flex items-baseline gap-1`},we={class:`text-xl font-bold text-content-primary dark:text-content-primary`},Te={class:`bg-background-mute dark:bg-background/50 border border-stroke-subtle dark:border-stroke/10 rounded-[15px] p-4`},Ee={class:`flex items-baseline gap-1`},De={class:`text-xl font-bold text-content-primary dark:text-content-primary`},Oe={key:0,class:`flex items-start gap-3 bg-amber-500/10 border border-amber-500/30 rounded-[12px] p-3`},ke={class:`text-xs leading-relaxed`},Ae={class:`font-semibold text-amber-600 dark:text-amber-400 mb-0.5`},je={class:`bg-background-mute dark:bg-background/50 border border-stroke-subtle dark:border-stroke/10 rounded-[15px] p-4`},Me={class:`relative`},Ne={class:`flex items-center gap-2 overflow-x-auto pb-2`},Pe={key:0,class:`relative flex items-center`},Fe={key:0,class:`absolute left-1/2 -translate-x-1/2 animate-pulse`},Ie={class:`text-content-muted dark:text-content-muted text-xs mt-2 flex items-center justify-between`},Le={key:0,class:`text-cyan-500 dark:text-primary animate-pulse`},Re={class:`flex items-center justify-between text-xs text-content-muted dark:text-content-muted pt-2`},ze=A(d({__name:`PingResultModal`,props:{show:{type:Boolean},nodeName:{default:null},result:{default:null},error:{default:null},loading:{type:Boolean,default:!1}},emits:[`close`],setup(e,{emit:a}){let o=e,s=a,c=E(),{getSignalQuality:u}=K(),d=n(0),p=n(!1),b=y(()=>{let e=c.stats?.config?.radio?.spreading_factor??7,t=c.stats?.config?.radio?.bandwidth??125,n=c.stats?.config?.radio?.coding_rate??5;return 2**e/t*(8+4.25*(n-4)+20)}),w=y(()=>{if(!o.result)return{color:`text-gray-400`,label:`Unknown`};let e=o.result.rtt_ms,t=b.value,n=o.result.path.length,r=2*t*n+500*n;return eNo mesh neighbors have been discovered in your area yet.
`,3),S(`button`,{onClick:me,class:`mt-4 px-4 py-2 bg-primary/20 text-primary border border-primary/30 rounded-lg hover:bg-primary/30 transition-colors`},` Refresh `)])):fe.value.length===0&&ue.value?(t(),C(`div`,Ir,[n[23]||=u(`Try adjusting your filter criteria to see more results.
`,3),S(`button`,{onClick:le,class:`px-4 py-2 bg-primary/20 text-primary border border-primary/30 rounded-lg hover:bg-primary/30 transition-colors`},` Clear Filters `)])):g(``,!0)],64)),_(ae,{show:H.value,neighbor:re.value,onClose:Ce,onDelete:we},null,8,[`show`,`neighbor`]),_(ze,{show:U.value,"node-name":ee.value,result:q.value,error:J.value,loading:K.value,onClose:ye},null,8,[`show`,`node-name`,`result`,`error`,`loading`]),_(Et,{"is-open":te.value,neighbor:ne.value,"base-latitude":ie.value,"base-longitude":oe.value,onClose:Se},null,8,[`is-open`,`neighbor`,`base-latitude`,`base-longitude`])]))}});export{Lr as default}; \ No newline at end of file diff --git a/repeater/web/html/assets/Neighbors-OKIvSeVA.js b/repeater/web/html/assets/Neighbors-OKIvSeVA.js new file mode 100644 index 0000000..11875d7 --- /dev/null +++ b/repeater/web/html/assets/Neighbors-OKIvSeVA.js @@ -0,0 +1,65 @@ +import{r as e}from"./chunk-DECur_0Z.js";import{E as t,H as n,N as r,O as i,P as a,T as o,Y as s,b as c,c as l,f as u,g as d,gt as f,ht as p,i as m,j as h,l as g,m as _,mt as v,o as y,p as b,r as x,s as S,u as C,w}from"./runtime-core.esm-bundler-BiwffnQU.js";import{t as T}from"./api-DRn_D8oU.js";import{t as E}from"./system-DN2LtoaR.js";import{n as D,r as O,t as k}from"./dataService-C7SHAYZL.js";import{t as A}from"./_plugin-vue_export-helper-TcpyXLsZ.js";import{_ as j,h as M,m as N,p as P,u as F}from"./index-Bwi6QvPf.js";import{t as I}from"./leaflet-src-h-Ags50K.js";/* empty css */import{a as L,i as R,l as z,o as B,r as ee,s as V,u as H}from"./formatters-7ihR6KRV.js";import{n as U,t as W}from"./preferences-BlQds_au.js";import{t as G}from"./useSignalQuality-gmzVl2Tz.js";var K={class:`modal-card max-w-md`},te={class:`bg-gray-50 dark:bg-white/5 border border-stroke-subtle dark:border-stroke/10 rounded-lg p-4 mb-6`},q={class:`flex items-center gap-3`},ne={class:`flex-1 min-w-0`},re={class:`text-content-primary dark:text-content-primary font-medium truncate`},ie={class:`text-content-secondary dark:text-content-muted text-sm font-mono`},ae={key:0,class:`text-white/50 text-xs`},oe={key:1,class:`text-white/50 text-xs`},se=d({__name:`DeleteNeighborModal`,props:{show:{type:Boolean},neighbor:{}},emits:[`close`,`delete`],setup(e,{emit:n}){let r=e,i=n,a=()=>{r.neighbor&&(i(`delete`,r.neighbor.id),o())},o=()=>{i(`close`)};return(n,r)=>(t(),l(m,{to:`body`},[e.show&&e.neighbor?(t(),C(`div`,{key:0,onClick:r[0]||=j(e=>o(),[`self`]),class:`modal-backdrop-heavy`},[S(`div`,K,[S(`div`,{class:`flex items-center gap-3 mb-6`},[r[2]||=S(`svg`,{class:`w-6 h-6 text-accent-red`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z`})],-1),r[3]||=S(`div`,null,[S(`h3`,{class:`text-xl font-semibold text-content-primary dark:text-content-primary`},` Delete Neighbor `),S(`p`,{class:`text-content-secondary dark:text-content-muted text-sm mt-1`},` Are you sure you want to delete this neighbor? `)],-1),S(`button`,{onClick:o,class:`ml-auto text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-primary transition-colors`},[...r[1]||=[S(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])]),S(`div`,te,[S(`div`,q,[S(`div`,ne,[S(`div`,re,f(e.neighbor?.node_name||e.neighbor?.long_name||e.neighbor?.short_name||`Unknown`),1),S(`div`,ie,` ID: `+f(e.neighbor?.node_num_hex||e.neighbor?.node_num||e.neighbor?.id||`N/A`),1),e.neighbor?.contact_type?(t(),C(`div`,ae,f(e.neighbor.contact_type),1)):g(``,!0),e.neighbor?.hw_model?(t(),C(`div`,oe,f(e.neighbor.hw_model),1)):g(``,!0)])])]),r[4]||=S(`div`,{class:`bg-accent-red/10 border border-accent-red/30 rounded-lg p-4 mb-6`},[S(`div`,{class:`flex items-center gap-2 text-accent-red text-sm`},[S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`})]),S(`span`,null,`This action cannot be undone`)])],-1),S(`div`,{class:`flex gap-3`},[S(`button`,{onClick:o,class:`flex-1 px-4 py-3 bg-background-mute dark:bg-white/5 hover:bg-stroke-subtle dark:hover:bg-white/10 border border-stroke-subtle dark:border-stroke/20 text-content-primary dark:text-content-primary rounded-lg transition-colors`},` Cancel `),S(`button`,{onClick:a,class:`flex-1 px-4 py-3 bg-accent-red/20 hover:bg-accent-red/30 border border-accent-red/50 text-accent-red rounded-lg transition-colors font-medium`},` Delete `)])])])):g(``,!0)]))}}),ce={class:`bg-gradient-to-r from-primary/20 to-accent-cyan/20 border-b border-stroke-subtle dark:border-stroke/10 px-6 py-4`},le={class:`flex items-center justify-between`},ue={class:`flex items-center gap-3`},J={key:0,class:`text-sm text-content-secondary dark:text-content-muted`},de={class:`p-6`},fe={key:0,class:`text-center py-8`},pe={key:1,class:`text-center py-8`},me={class:`text-content-secondary dark:text-content-muted text-sm`},he={key:2,class:`space-y-4`},ge={class:`bg-background-mute dark:bg-background/50 border border-stroke-subtle dark:border-stroke/10 rounded-[15px] p-4`},_e={class:`flex items-center justify-between mb-2`},ve={class:`flex items-baseline gap-2`},ye={class:`text-3xl font-bold text-content-primary dark:text-content-primary`},be={class:`grid grid-cols-2 gap-3`},xe={class:`bg-background-mute dark:bg-background/50 border border-stroke-subtle dark:border-stroke/10 rounded-[15px] p-4`},Se={class:`flex items-center gap-2 mb-2`},Ce={class:`flex gap-0.5`},we={class:`flex items-baseline gap-1`},Te={class:`text-xl font-bold text-content-primary dark:text-content-primary`},Ee={class:`bg-background-mute dark:bg-background/50 border border-stroke-subtle dark:border-stroke/10 rounded-[15px] p-4`},De={class:`flex items-baseline gap-1`},Oe={class:`text-xl font-bold text-content-primary dark:text-content-primary`},ke={key:0,class:`flex items-start gap-3 bg-amber-500/10 border border-amber-500/30 rounded-[12px] p-3`},Ae={class:`text-xs leading-relaxed`},je={class:`font-semibold text-amber-600 dark:text-amber-400 mb-0.5`},Me={class:`bg-background-mute dark:bg-background/50 border border-stroke-subtle dark:border-stroke/10 rounded-[15px] p-4`},Ne={class:`relative`},Pe={class:`flex items-center gap-2 overflow-x-auto pb-2`},Fe={key:0,class:`relative flex items-center`},Ie={key:0,class:`absolute left-1/2 -translate-x-1/2 animate-pulse`},Le={class:`text-content-muted dark:text-content-muted text-xs mt-2 flex items-center justify-between`},Re={key:0,class:`text-cyan-500 dark:text-primary animate-pulse`},ze={class:`flex items-center justify-between text-xs text-content-muted dark:text-content-muted pt-2`},Be=A(d({__name:`PingResultModal`,props:{show:{type:Boolean},nodeName:{default:null},result:{default:null},error:{default:null},loading:{type:Boolean,default:!1}},emits:[`close`],setup(e,{emit:a}){let o=e,s=a,c=E(),{getSignalQuality:u}=G(),d=n(0),p=n(!1),b=y(()=>{let e=c.stats?.config?.radio?.spreading_factor??7,t=c.stats?.config?.radio?.bandwidth??125,n=c.stats?.config?.radio?.coding_rate??5;return 2**e/t*(8+4.25*(n-4)+20)}),w=y(()=>{if(!o.result)return{color:`text-gray-400`,label:`Unknown`};let e=o.result.rtt_ms,t=b.value,n=o.result.path.length,r=2*t*n+500*n;return eNo mesh neighbors have been discovered in your area yet.
`,3),S(`button`,{onClick:me,class:`mt-4 px-4 py-2 bg-primary/20 text-primary border border-primary/30 rounded-lg hover:bg-primary/30 transition-colors`},` Refresh `)])):fe.value.length===0&&J.value?(t(),C(`div`,Mr,[n[23]||=u(`Try adjusting your filter criteria to see more results.
`,3),S(`button`,{onClick:ue,class:`px-4 py-2 bg-primary/20 text-primary border border-primary/30 rounded-lg hover:bg-primary/30 transition-colors`},` Clear Filters `)])):g(``,!0)],64)),_(se,{show:ee.value,neighbor:ie.value,onClose:Ce,onDelete:we},null,8,[`show`,`neighbor`]),_(Be,{show:V.value,"node-name":te.value,result:G.value,error:K.value,loading:H.value,onClose:ye},null,8,[`show`,`node-name`,`result`,`error`,`loading`]),_(Dt,{"is-open":ne.value,neighbor:re.value,"base-latitude":ae.value,"base-longitude":oe.value,onClose:Se},null,8,[`is-open`,`neighbor`,`base-latitude`,`base-longitude`])]))}});export{Nr as default}; \ No newline at end of file diff --git a/repeater/web/html/assets/RFNoiseFloor-BtM4cQMv.js b/repeater/web/html/assets/RFNoiseFloor-BtM4cQMv.js new file mode 100644 index 0000000..e68e9b5 --- /dev/null +++ b/repeater/web/html/assets/RFNoiseFloor-BtM4cQMv.js @@ -0,0 +1 @@ +import{o as e}from"./index-Bwi6QvPf.js";export{e as default}; \ No newline at end of file diff --git a/repeater/web/html/assets/RFNoiseFloor-D8K9P6qW.js b/repeater/web/html/assets/RFNoiseFloor-D8K9P6qW.js deleted file mode 100644 index 84a64d0..0000000 --- a/repeater/web/html/assets/RFNoiseFloor-D8K9P6qW.js +++ /dev/null @@ -1 +0,0 @@ -import{o as e}from"./index-D5Pf18i0.js";export{e as default}; \ No newline at end of file diff --git a/repeater/web/html/assets/RestartModal-QtkihGZG.js b/repeater/web/html/assets/RestartModal-haLtPnBZ.js similarity index 95% rename from repeater/web/html/assets/RestartModal-QtkihGZG.js rename to repeater/web/html/assets/RestartModal-haLtPnBZ.js index 5994b29..2a683fa 100644 --- a/repeater/web/html/assets/RestartModal-QtkihGZG.js +++ b/repeater/web/html/assets/RestartModal-haLtPnBZ.js @@ -1 +1 @@ -import{E as e,H as t,N as n,S as r,c as i,g as a,gt as o,i as s,j as c,l,m as u,r as d,s as f,u as p}from"./runtime-core.esm-bundler-BiwffnQU.js";import{t as m}from"./api-D4EC7CQ7.js";import{_ as h,t as g,u as _}from"./index-D5Pf18i0.js";var v={class:`bg-white dark:bg-[var(--color-surface-elevated)] rounded-xl shadow-xl border border-stroke-subtle dark:border-stroke/20 p-6 max-w-md w-full mx-4`},y={key:0,class:`flex flex-col items-center gap-5 py-2`},b={class:`flex items-start gap-3 mb-4`},x={class:`text-base font-semibold text-content-primary dark:text-content-primary`},S={class:`mt-1 text-sm text-content-secondary dark:text-content-muted`},C=50,w=5,T=a({__name:`RestartModal`,props:{modelValue:{type:Boolean},message:{},title:{default:`Service Restart Required`}},emits:[`update:modelValue`],setup(a,{emit:T}){let E=a,D=T,O=t(!1),k=t(!1),A=null,j=0,M=0;function N(){O.value&&!k.value||(O.value=!1,k.value=!1,A&&=(clearTimeout(A),null),j=0,M=0,D(`update:modelValue`,!1))}async function P(){O.value=!0,k.value=!1;try{await m.post(`/restart_service`,{})}catch{}j=0,M=0,A=setTimeout(F,1e4)}function F(){j++,fetch(`/api/needs_setup`,{method:`GET`}).then(e=>{e.ok?(M++,M>=w?window.location.reload():A=setTimeout(F,1e3)):(M=0,I())}).catch(()=>{M=0,I()})}function I(){jManage room server identities and messages
Manage room server identities and messages
Welcome to your pyMC Repeater! Let's get you set up in just a few steps.
You'll configure:
Welcome to your pyMC Repeater! Let's get you set up in just a few steps.
You'll configure:
Packet Rate (RX/TX PER HOUR)
Packet Rate (RX/TX PER HOUR)
In Progress
In Progress