Sync build v0.9.181

Automated sync from private repository.
Commit: fb455e38213ce3e7d7601e362aaaf12d51d38705
This commit is contained in:
GitHub Actions Bot
2026-01-24 02:51:58 +00:00
parent 0e1289698d
commit ee0986695e
33 changed files with 26 additions and 26 deletions
+1 -1
View File
@@ -1 +1 @@
0.9.180
0.9.181
+1
View File
@@ -0,0 +1 @@
import{j as e}from"./vendor-react-DuLqNXZc.js";import{c as s}from"./recharts-BcVXFyqP.js";function l({title:l,icon:t,badge:a,subtitle:i,actions:r,iconColor:c="text-icon-card-title",largeTitle:n=!1,listHeader:x=!1,stackActionsOnMobile:m=!1}){return m&&r?e.jsxs("div",{className:s("flex flex-col gap-1 flex-shrink-0",x?"px-4 py-3 border-b border-border-subtle bg-bg-elevated/20":"mb-3"),children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2 min-h-[32px]",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[t&&e.jsx("span",{className:s("icon-md flex items-center justify-center",c),children:t}),e.jsx("span",{className:s(n?"type-subheading text-text-primary":"type-micro"),children:l}),a&&e.jsx("span",{className:"pill-tag",children:a})]}),e.jsx("div",{className:"flex items-center gap-2 flex-wrap",children:r})]}),i&&e.jsx("p",{className:"type-label text-text-muted ml-8",children:i})]}):e.jsxs("div",{className:s("flex flex-col gap-1 flex-shrink-0",x?"px-4 py-3 border-b border-border-subtle bg-bg-elevated/20":"mb-3"),children:[e.jsxs("div",{className:"flex items-center justify-between gap-2 min-h-[32px]",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[t&&e.jsx("span",{className:s("icon-md flex items-center justify-center",c),children:t}),e.jsx("span",{className:s(n?"type-subheading text-text-primary":"type-micro"),children:l}),a&&e.jsx("span",{className:"pill-tag",children:a})]}),r&&e.jsx("div",{className:"flex items-center gap-2 flex-wrap",children:r})]}),i&&e.jsx("p",{className:"type-label text-text-muted ml-8",children:i})]})}function t({children:l,centered:t,className:a}){return e.jsx("div",{className:s("flex-1 min-h-0",t&&"flex items-center justify-center",a),children:l})}export{l as C,t as a};
-1
View File
@@ -1 +0,0 @@
import{j as e}from"./vendor-react-DuLqNXZc.js";import{c as s}from"./recharts-BcVXFyqP.js";function l({title:l,icon:t,badge:a,subtitle:r,actions:i,iconColor:c="text-icon-card-title",largeTitle:n=!1,listHeader:x=!1,stackActionsOnMobile:m=!1}){return m&&i?e.jsxs("div",{className:s("flex flex-col gap-1 flex-shrink-0",x?"px-4 py-3 border-b border-border-subtle bg-bg-elevated/20":"mb-3"),children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[t&&e.jsx("span",{className:s("icon-md flex items-center justify-center",c),children:t}),e.jsx("span",{className:s(n?"type-subheading text-text-primary":"type-micro"),children:l}),a&&e.jsx("span",{className:"pill-tag",children:a})]}),e.jsx("div",{className:"flex items-center gap-2 flex-wrap",children:i})]}),r&&e.jsx("p",{className:"type-label text-text-muted ml-8",children:r})]}):e.jsxs("div",{className:s("flex flex-col gap-1 flex-shrink-0",x?"px-4 py-3 border-b border-border-subtle bg-bg-elevated/20":"mb-3"),children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[t&&e.jsx("span",{className:s("icon-md flex items-center justify-center",c),children:t}),e.jsx("span",{className:s(n?"type-subheading text-text-primary":"type-micro"),children:l}),a&&e.jsx("span",{className:"pill-tag",children:a})]}),i&&e.jsx("div",{className:"flex items-center gap-2 flex-wrap",children:i})]}),r&&e.jsx("p",{className:"type-label text-text-muted ml-8",children:r})]})}function t({children:l,centered:t,className:a}){return e.jsx("div",{className:s("flex-1 min-h-0",t&&"flex items-center justify-center",a),children:l})}export{l as C,t as a};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-1
View File
@@ -1 +0,0 @@
import{r as e,j as s,F as a,a_ as t,a$ as r}from"./vendor-react-DuLqNXZc.js";import{c as l}from"./recharts-BcVXFyqP.js";import{ad as i,ae as c,b as o,af as n,r as m,ac as x,ag as d}from"./index-CNYURenD.js";import{u as p}from"./usePolling-B2aIg0-t.js";import{P as h,b as j,a as g,L as u}from"./PageLayout-DcevNKfF.js";import{C as f}from"./Card-QsoFS2aH.js";import"./vendor-core-WoOfkQwm.js";import"./deckgl-DTsmDcfs.js";const v=e.memo(function({log:e}){return s.jsx("div",{className:"p-3 rounded-2xl bg-white/[0.02] hover:bg-white/[0.04] transition-colors",children:s.jsxs("div",{className:"flex items-baseline gap-3",children:[s.jsx("span",{className:l("type-data-sm w-14 shrink-0",d(e.level)),children:e.level}),s.jsxs("div",{className:"flex-1 min-w-0",children:[s.jsx("p",{className:"type-data-sm text-text-primary break-words whitespace-pre-wrap",children:e.message}),s.jsx("p",{className:"type-data-xs text-text-muted mt-1",children:new Date(e.timestamp).toLocaleString()})]})]})})});function w({showDebug:e,onToggle:a}){return s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:l("type-data-sm",e?"text-accent-tertiary":"text-accent-primary"),children:e?"DEBUG":"INFO"}),s.jsx("button",{onClick:a,className:l("relative w-10 h-5 rounded-full transition-colors duration-200",e?"bg-accent-tertiary":"bg-accent-primary"),role:"switch","aria-checked":e,children:s.jsx("span",{className:l("absolute top-[2px] left-[2px] w-4 h-4 bg-white rounded-full shadow-sm transition-transform duration-200",e?"translate-x-5":"translate-x-0")})})]})}function N(){const d=i(),N=c(),b=o(),y=n(),k=m(),[C,D]=e.useState(!1),L=e.useCallback(()=>{D(e=>!e)},[]),P=C?d:d.filter(e=>"DEBUG"!==e.level);return p(y,x.logs,b),s.jsxs(h,{children:[s.jsx(j,{title:"System Logs",icon:s.jsx(a,{}),controls:s.jsx(w,{showDebug:C,onToggle:L})}),s.jsxs(g,{noPadding:!0,children:[s.jsx(f,{listHeader:!0,icon:s.jsx(a,{className:"icon-sm"}),title:"Log Entries",actions:s.jsx("button",{onClick:()=>k(!b),className:l("transition-colors",b?"text-signal-critical hover:text-signal-critical/80":"text-accent-primary hover:text-accent-primary/80 animate-pulse-slow"),title:b?"Pause":"Resume",children:b?s.jsx(t,{className:"w-5 h-5"}):s.jsx(r,{className:"w-5 h-5"})})}),s.jsx("div",{className:"space-y-2 max-h-[calc(100vh-300px)] sm:max-h-[calc(100vh-250px)] overflow-y-auto p-4",children:N&&0===d.length?s.jsx(u,{count:10}):0===P.length?s.jsx("div",{className:"text-center py-12 text-text-muted",children:0===d.length?"No logs available":"No logs match selected filters"}):P.map((e,a)=>s.jsx(v,{log:e},`${e.timestamp}-${a}`))})]})]})}export{N as default};
+1
View File
@@ -0,0 +1 @@
import{r as s,j as e,F as a,a_ as t,a$ as l}from"./vendor-react-DuLqNXZc.js";import{c as r}from"./recharts-BcVXFyqP.js";import{ad as i,ae as o,b as c,af as n,r as m,ac as x,ag as d}from"./index-DXUhtyfh.js";import{u as p}from"./usePolling-B2aIg0-t.js";import{P as h,b as g,a as j,L as u}from"./PageLayout-DcevNKfF.js";import{C as f}from"./Card-DD3rQAGW.js";import"./vendor-core-WoOfkQwm.js";import"./deckgl-DTsmDcfs.js";const v=s.memo(function({log:s}){return e.jsx("div",{className:"p-3 rounded-2xl bg-subtle-fill hover:bg-subtle-fill-strong transition-colors",children:e.jsxs("div",{className:"flex items-baseline gap-3",children:[e.jsx("span",{className:r("type-data-sm w-14 shrink-0",d(s.level)),children:s.level}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"type-data-sm text-text-primary break-words whitespace-pre-wrap",children:s.message}),e.jsx("p",{className:"type-data-xs text-text-muted mt-1",children:new Date(s.timestamp).toLocaleString()})]})]})})});function N({showDebug:s,onToggle:a}){return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:r("type-data-sm",s?"text-accent-tertiary":"text-accent-primary"),children:s?"DEBUG":"INFO"}),e.jsx("button",{onClick:a,className:r("relative w-10 h-5 rounded-full transition-colors duration-200",s?"bg-accent-tertiary":"bg-accent-primary"),role:"switch","aria-checked":s,children:e.jsx("span",{className:r("absolute top-[2px] left-[2px] w-4 h-4 bg-white rounded-full shadow-sm transition-transform duration-200",s?"translate-x-5":"translate-x-0")})})]})}function b(){const d=i(),b=o(),w=c(),y=n(),k=m(),[C,D]=s.useState(!1),L=s.useCallback(()=>{D(s=>!s)},[]),P=C?d:d.filter(s=>"DEBUG"!==s.level);return p(y,x.logs,w),e.jsxs(h,{children:[e.jsx(g,{title:"System Logs",icon:e.jsx(a,{}),controls:e.jsx(N,{showDebug:C,onToggle:L})}),e.jsxs(j,{noPadding:!0,children:[e.jsx(f,{listHeader:!0,icon:e.jsx(a,{className:"icon-sm"}),title:"Log Entries",actions:e.jsx("button",{onClick:()=>k(!w),className:r("transition-colors",w?"text-signal-critical hover:text-signal-critical/80":"text-accent-primary hover:text-accent-primary/80 animate-pulse-slow"),title:w?"Pause":"Resume",children:w?e.jsx(t,{className:"w-5 h-5"}):e.jsx(l,{className:"w-5 h-5"})})}),e.jsx("div",{className:"space-y-2 max-h-[calc(100vh-300px)] sm:max-h-[calc(100vh-250px)] overflow-y-auto p-4",children:b&&0===d.length?e.jsx(u,{count:10}):0===P.length?e.jsx("div",{className:"text-center py-12 text-text-muted",children:0===d.length?"No logs available":"No logs match selected filters"}):P.map((s,a)=>e.jsx(v,{log:s},`${s.timestamp}-${a}`))})]})]})}export{b as default};
@@ -1 +1 @@
import{j as e,p as s}from"./vendor-react-DuLqNXZc.js";import{a as t}from"./PageLayout-DcevNKfF.js";import{D as a}from"./DataBox-Bp3zpxWt.js";import{at as r}from"./index-CNYURenD.js";import{C as l}from"./Card-QsoFS2aH.js";function c({nodeName:c,repeaterVersion:m,coreVersion:i,localHash:n,publicKey:d}){return e.jsxs(t,{children:[e.jsx(l,{icon:e.jsx(s,{}),title:"Node Information",largeTitle:!0}),e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-3 sm:gap-4",children:[e.jsxs("div",{className:"min-w-0 col-span-2 sm:col-span-1",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Node Name"}),e.jsx("p",{className:"type-body text-text-primary mt-0.5 sm:mt-1 truncate",title:c,children:c})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Repeater"}),e.jsxs("p",{className:"type-data text-text-primary mt-0.5 sm:mt-1 truncate",title:`v${m}`,children:["v",m]})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Core"}),e.jsxs("p",{className:"type-data text-text-primary mt-0.5 sm:mt-1 truncate",title:`v${i}`,children:["v",i]})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Console"}),e.jsxs("p",{className:"type-data text-text-primary mt-0.5 sm:mt-1 truncate",title:`v${r}`,children:["v",r]})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Local Hash"}),e.jsx("div",{className:"mt-0.5 sm:mt-1",children:n?e.jsx(a,{copy:!0,size:"compact",children:n}):e.jsx("span",{className:"type-data-sm text-text-secondary",children:"N/A"})})]})]}),d&&e.jsxs("div",{className:"mt-3 sm:mt-4 pt-3 sm:pt-4 border-t border-border-subtle",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Public Key"}),e.jsx("div",{className:"mt-0.5 sm:mt-1",children:e.jsx(a,{copy:!0,size:"responsive",children:d})})]})]})}export{c as N};
import{j as e,p as s}from"./vendor-react-DuLqNXZc.js";import{a as t}from"./PageLayout-DcevNKfF.js";import{D as a}from"./DataBox-Bp3zpxWt.js";import{at as r}from"./index-DXUhtyfh.js";import{C as l}from"./Card-DD3rQAGW.js";function c({nodeName:c,repeaterVersion:m,coreVersion:i,localHash:n,publicKey:d}){return e.jsxs(t,{children:[e.jsx(l,{icon:e.jsx(s,{}),title:"Node Information",largeTitle:!0}),e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-3 sm:gap-4",children:[e.jsxs("div",{className:"min-w-0 col-span-2 sm:col-span-1",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Node Name"}),e.jsx("p",{className:"type-body text-text-primary mt-0.5 sm:mt-1 truncate",title:c,children:c})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Repeater"}),e.jsxs("p",{className:"type-data text-text-primary mt-0.5 sm:mt-1 truncate",title:`v${m}`,children:["v",m]})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Core"}),e.jsxs("p",{className:"type-data text-text-primary mt-0.5 sm:mt-1 truncate",title:`v${i}`,children:["v",i]})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Console"}),e.jsxs("p",{className:"type-data text-text-primary mt-0.5 sm:mt-1 truncate",title:`v${r}`,children:["v",r]})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Local Hash"}),e.jsx("div",{className:"mt-0.5 sm:mt-1",children:n?e.jsx(a,{copy:!0,size:"compact",children:n}):e.jsx("span",{className:"type-data-sm text-text-secondary",children:"N/A"})})]})]}),d&&e.jsxs("div",{className:"mt-3 sm:mt-4 pt-3 sm:pt-4 border-t border-border-subtle",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Public Key"}),e.jsx("div",{className:"mt-0.5 sm:mt-1",children:e.jsx(a,{copy:!0,size:"responsive",children:d})})]})]})}export{c as N};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{d as t,aw as e}from"./index-CNYURenD.js";function o(t){if(Array.isArray(t))return t;if("string"==typeof t&&t.startsWith("["))try{const e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}return[]}function n(n,r,s){const a=new Map;for(const e of r){const o=t(e);a.has(o)||a.set(o,e)}const c=new Map,i=new Map;for(const t of n){const n=t.route??t.route_type;if(!e(n))continue;const r=o(t.original_path);if(0===r.length)continue;const f=r.map(t=>t.toUpperCase());if(!t.transmitted&&f.length>=2){const t=f[f.length-2];if(t){const e=a.get(t);e&&i.set(e,(i.get(e)??0)+1)}}if(f.includes(s))for(const t of f){if(t===s)continue;const e=a.get(t);e&&c.set(e,(c.get(e)??0)+1)}}let f=0,u=0;for(const t of r)f=Math.max(f,c.get(t)??0),u=Math.max(u,i.get(t)??0);const h=new Map;let d=0,g=0,l=0;for(const t of r){const e=c.get(t)??0,o=i.get(t)??0,n=f>0?Math.round(e/f*100):0,r=u>0?Math.round(o/u*100):0,s=n+r;h.set(t,{hash:t,listenerCount:e,loudCount:o,listenerScore:n,loudScore:r,blendedScore:s}),d=Math.max(d,n),g=Math.max(g,r),l=Math.max(l,s)}return{scores:h,maxListenerScore:d,maxLoudScore:g,maxBlendedScore:l}}const r={YELLOW:"#FFB224",GREEN:"#46A758",RED:"#E5484D",GRAY:"#505050"};export{r as L,n as c};
import{d as t,aw as e}from"./index-DXUhtyfh.js";function o(t){if(Array.isArray(t))return t;if("string"==typeof t&&t.startsWith("["))try{const e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}return[]}function n(n,r,s){const a=new Map;for(const e of r){const o=t(e);a.has(o)||a.set(o,e)}const c=new Map,i=new Map;for(const t of n){const n=t.route??t.route_type;if(!e(n))continue;const r=o(t.original_path);if(0===r.length)continue;const f=r.map(t=>t.toUpperCase());if(!t.transmitted&&f.length>=2){const t=f[f.length-2];if(t){const e=a.get(t);e&&i.set(e,(i.get(e)??0)+1)}}if(f.includes(s))for(const t of f){if(t===s)continue;const e=a.get(t);e&&c.set(e,(c.get(e)??0)+1)}}let f=0,u=0;for(const t of r)f=Math.max(f,c.get(t)??0),u=Math.max(u,i.get(t)??0);const h=new Map;let d=0,g=0,l=0;for(const t of r){const e=c.get(t)??0,o=i.get(t)??0,n=f>0?Math.round(e/f*100):0,r=u>0?Math.round(o/u*100):0,s=n+r;h.set(t,{hash:t,listenerCount:e,loudCount:o,listenerScore:n,loudScore:r,blendedScore:s}),d=Math.max(d,n),g=Math.max(g,r),l=Math.max(l,s)}return{scores:h,maxListenerScore:d,maxLoudScore:g,maxBlendedScore:l}}const r={YELLOW:"#FFB224",GREEN:"#46A758",RED:"#E5484D",GRAY:"#505050"};export{r as L,n as c};
@@ -1 +1 @@
import{an as t}from"./index-CNYURenD.js";async function e(e,r=10){return t("/api/ping_neighbor",{method:"POST",body:JSON.stringify({target_id:e,timeout:r})})}const r=["Chat Node","Repeater","Room Server","Hybrid Node","Unknown"];async function s(s,n=10){if(n<1||n>60)return{success:!1,error:"Timeout must be 1-60 seconds"};let o;const a=s.match(/^(0x)?([0-9a-fA-F]{1,2})$/);if(a)o=`0x${a[2].padStart(2,"0")}`;else{const e=await async function(e){const s=e.toLowerCase();for(const n of r)try{const e=await t(`/api/adverts_by_contact_type?contact_type=${encodeURIComponent(n)}&hours=168`),r=e.success&&e.data?e.data:e,o=(Array.isArray(r)?r:[]).find(t=>t.node_name&&t.node_name.toLowerCase()===s);if(o&&o.pubkey)return`0x${o.pubkey.substring(0,2)}`}catch{continue}return null}(s);if(!e)return{success:!1,error:`Node '${s}' not found`};o=e}const c=await e(o,n);if(!c.success||!c.data)return{success:!1,error:c.error||"Ping failed"};const i=(u=c.data).rtt_ms>500||u.rssi<-120?"Poor":u.rtt_ms>250||u.rssi<-100?"Fair":u.rtt_ms>100||u.rssi<-80?"Good":"Excellent";var u;return{success:!0,data:{...c.data,quality:i}}}export{s as a,e as p};
import{an as t}from"./index-DXUhtyfh.js";async function e(e,r=10){return t("/api/ping_neighbor",{method:"POST",body:JSON.stringify({target_id:e,timeout:r})})}const r=["Chat Node","Repeater","Room Server","Hybrid Node","Unknown"];async function s(s,n=10){if(n<1||n>60)return{success:!1,error:"Timeout must be 1-60 seconds"};let o;const a=s.match(/^(0x)?([0-9a-fA-F]{1,2})$/);if(a)o=`0x${a[2].padStart(2,"0")}`;else{const e=await async function(e){const s=e.toLowerCase();for(const n of r)try{const e=await t(`/api/adverts_by_contact_type?contact_type=${encodeURIComponent(n)}&hours=168`),r=e.success&&e.data?e.data:e,o=(Array.isArray(r)?r:[]).find(t=>t.node_name&&t.node_name.toLowerCase()===s);if(o&&o.pubkey)return`0x${o.pubkey.substring(0,2)}`}catch{continue}return null}(s);if(!e)return{success:!1,error:`Node '${s}' not found`};o=e}const c=await e(o,n);if(!c.success||!c.data)return{success:!1,error:c.error||"Ping failed"};const i=(u=c.data).rtt_ms>500||u.rssi<-120?"Poor":u.rtt_ms>250||u.rssi<-100?"Fair":u.rtt_ms>100||u.rssi<-80?"Good":"Excellent";var u;return{success:!0,data:{...c.data,quality:i}}}export{s as a,e as p};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -39,10 +39,10 @@
--font-data: 'JetBrains Mono', 'SF Mono', Monaco, monospace;
}
</style>
<script type="module" crossorigin src="/assets/index-CNYURenD.js"></script>
<script type="module" crossorigin src="/assets/index-DXUhtyfh.js"></script>
<link rel="modulepreload" crossorigin href="/assets/vendor-core-WoOfkQwm.js">
<link rel="modulepreload" crossorigin href="/assets/vendor-react-DuLqNXZc.js">
<link rel="stylesheet" crossorigin href="/assets/index-4ay-Ogw2.css">
<link rel="stylesheet" crossorigin href="/assets/index-DmCxg1Gg.css">
</head>
<body>
<div id="root"></div>
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "pymc_console",
"version": "0.9.180",
"version": "0.9.181",
"description": "Vite + React Dashboard for pyMC_Repeater",
"private": true,
"type": "module",