convex-mcp-visual 1.4.2 → 1.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <meta name="theme-color" content="#faf8f5">
7
7
  <title>Realtime Dashboard - Convex MCP Apps</title>
8
- <script type="module" crossorigin src="../../assets/realtime-dashboard-BO8AFPT_.js"></script>
8
+ <script type="module" crossorigin src="../../assets/realtime-dashboard-D9nem8DB.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="../../assets/modulepreload-polyfill-B5Qt9EMX.js">
10
10
  <link rel="stylesheet" crossorigin href="../../assets/style-CfvT5wrm.css">
11
11
  </head>
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <meta name="theme-color" content="#faf8f5">
7
7
  <title>Schema Browser - Convex MCP Apps</title>
8
- <script type="module" crossorigin src="../../assets/schema-browser-crjsCf5V.js"></script>
8
+ <script type="module" crossorigin src="../../assets/schema-browser-S5aw9ecT.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="../../assets/modulepreload-polyfill-B5Qt9EMX.js">
10
10
  <link rel="stylesheet" crossorigin href="../../assets/style-CfvT5wrm.css">
11
11
  </head>
@@ -1,4 +1,4 @@
1
- var h=Object.defineProperty;var m=(c,e,t)=>e in c?h(c,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):c[e]=t;var l=(c,e,t)=>m(c,typeof e!="symbol"?e+"":e,t);import"./modulepreload-polyfill-B5Qt9EMX.js";class u{constructor(){l(this,"config",null);l(this,"refreshTimer",null);l(this,"isConnected",!0);l(this,"currentTheme","light");this.init()}init(){var t;this.initTheme();const e=window;if(e.__CONVEX_CONFIG__)this.config=e.__CONVEX_CONFIG__;else{const s=new URLSearchParams(window.location.search).get("config");if(s)try{this.config=JSON.parse(decodeURIComponent(s))}catch(i){console.error("Failed to parse config:",i)}}this.isConnected=!!((t=this.config)!=null&&t.deploymentUrl),this.render(),this.startAutoRefresh()}initTheme(){const e=localStorage.getItem("convex-dashboard-theme");e?this.currentTheme=e:window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches&&(this.currentTheme="light"),this.applyTheme()}applyTheme(){document.documentElement.setAttribute("data-theme",this.currentTheme),localStorage.setItem("convex-dashboard-theme",this.currentTheme)}toggleTheme(){this.currentTheme=this.currentTheme==="light"?"dark":"light",this.applyTheme();const e=document.getElementById("themeIcon");e&&(e.innerHTML=this.currentTheme==="light"?'<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></svg>':'<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg>')}render(){var s;const e=document.getElementById("app");if(!e)return;const t=((s=this.config)==null?void 0:s.deploymentUrl)||"Not connected";e.innerHTML=`
1
+ var h=Object.defineProperty;var u=(c,e,t)=>e in c?h(c,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):c[e]=t;var l=(c,e,t)=>u(c,typeof e!="symbol"?e+"":e,t);import"./modulepreload-polyfill-B5Qt9EMX.js";class m{constructor(){l(this,"config",null);l(this,"refreshTimer",null);l(this,"isConnected",!0);l(this,"currentTheme","light");this.init()}init(){var t;this.initTheme();const e=window;if(e.__CONVEX_CONFIG__)this.config=e.__CONVEX_CONFIG__;else{const s=new URLSearchParams(window.location.search).get("config");if(s)try{this.config=JSON.parse(decodeURIComponent(s))}catch(r){console.error("Failed to parse config:",r)}}this.isConnected=!!((t=this.config)!=null&&t.deploymentUrl),this.render(),this.startAutoRefresh()}initTheme(){this.currentTheme="light",this.applyTheme()}applyTheme(){this.currentTheme==="dark"?document.documentElement.setAttribute("data-theme","dark"):document.documentElement.removeAttribute("data-theme")}toggleTheme(){this.currentTheme=this.currentTheme==="light"?"dark":"light",this.applyTheme();const e=document.getElementById("themeIcon");e&&(e.innerHTML=this.currentTheme==="light"?'<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></svg>':'<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg>')}render(){var s;const e=document.getElementById("app");if(!e)return;const t=((s=this.config)==null?void 0:s.deploymentUrl)||"Not connected";e.innerHTML=`
2
2
  <div class="header">
3
3
  <h1>
4
4
  <span class="status-dot ${this.isConnected?"":"disconnected"}" id="statusDot" title="${this.isConnected?"Connected to Convex":"Not connected - check deploy key"}"></span>
@@ -15,7 +15,7 @@ var h=Object.defineProperty;var m=(c,e,t)=>e in c?h(c,e,{enumerable:!0,configura
15
15
 
16
16
  <div class="metrics-grid" id="metricsGrid"></div>
17
17
  <div class="charts-grid" id="chartsGrid"></div>
18
- `;const r=document.getElementById("themeToggle");r&&r.addEventListener("click",()=>this.toggleTheme()),this.renderMetrics(),this.renderCharts(),this.updateTimestamp()}renderMetrics(){var r;const e=document.getElementById("metricsGrid");if(!e)return;const t=((r=this.config)==null?void 0:r.metrics)||[];if(t.length===0){e.innerHTML=`
18
+ `;const i=document.getElementById("themeToggle");i&&i.addEventListener("click",()=>this.toggleTheme()),this.renderMetrics(),this.renderCharts(),this.updateTimestamp()}renderMetrics(){var i;const e=document.getElementById("metricsGrid");if(!e)return;const t=((i=this.config)==null?void 0:i.metrics)||[];if(t.length===0){e.innerHTML=`
19
19
  <div class="metric-card">
20
20
  <div class="metric-header">
21
21
  <span class="metric-label">No Metrics Configured</span>
@@ -35,10 +35,10 @@ var h=Object.defineProperty;var m=(c,e,t)=>e in c?h(c,e,{enumerable:!0,configura
35
35
  </div>
36
36
  <div class="metric-source" title="Data source: ${s.table} table">${s.table} / ${s.aggregation}${s.field?`(${s.field})`:""}</div>
37
37
  </div>
38
- `).join("")}getMetricIcon(e){return{count:"#",sum:"Σ",avg:"x̄",min:"↓",max:"↑"}[e]||"#"}getMetricTooltip(e){const t=this.getAggregationTooltip(e.aggregation);return`${e.name}: ${t} from ${e.table}${e.field?` on field "${e.field}"`:""}`}getAggregationTooltip(e){return{count:"Count - Total number of documents",sum:"Sum - Total of all values",avg:"Average - Mean of all values",min:"Minimum - Smallest value",max:"Maximum - Largest value"}[e]||e}formatNumber(e){return e>=1e6?(e/1e6).toFixed(1)+"M":e>=1e3?(e/1e3).toFixed(1)+"k":Number.isInteger(e)?e.toLocaleString():e.toFixed(2)}renderCharts(){var i,a;const e=document.getElementById("chartsGrid");if(!e)return;const t=((i=this.config)==null?void 0:i.charts)||[],r=((a=this.config)==null?void 0:a.allDocuments)||{},s=this.renderActivityTable(r);if(t.length===0){e.innerHTML=`
38
+ `).join("")}getMetricIcon(e){return{count:"#",sum:"Σ",avg:"x̄",min:"↓",max:"↑"}[e]||"#"}getMetricTooltip(e){const t=this.getAggregationTooltip(e.aggregation);return`${e.name}: ${t} from ${e.table}${e.field?` on field "${e.field}"`:""}`}getAggregationTooltip(e){return{count:"Count - Total number of documents",sum:"Sum - Total of all values",avg:"Average - Mean of all values",min:"Minimum - Smallest value",max:"Maximum - Largest value"}[e]||e}formatNumber(e){return e>=1e6?(e/1e6).toFixed(1)+"M":e>=1e3?(e/1e3).toFixed(1)+"k":Number.isInteger(e)?e.toLocaleString():e.toFixed(2)}renderCharts(){var r,a;const e=document.getElementById("chartsGrid");if(!e)return;const t=((r=this.config)==null?void 0:r.charts)||[],i=((a=this.config)==null?void 0:a.allDocuments)||{},s=this.renderActivityTable(i);if(t.length===0){e.innerHTML=`
39
39
  ${this.renderTablesOverview()}
40
40
  ${s}
41
- `;return}e.innerHTML=t.map((n,o)=>{const d=r[n.table]||[];return`
41
+ `;return}e.innerHTML=t.map((n,o)=>{const d=i[n.table]||[];return`
42
42
  <div class="chart-card">
43
43
  <div class="chart-header">
44
44
  <span class="chart-title">${n.title}</span>
@@ -48,7 +48,7 @@ var h=Object.defineProperty;var m=(c,e,t)=>e in c?h(c,e,{enumerable:!0,configura
48
48
  ${this.renderChartContent(n,d)}
49
49
  </div>
50
50
  </div>
51
- `}).join("")+s}renderTablesOverview(){var i;const e=((i=this.config)==null?void 0:i.tables)||[];if(e.length===0)return"";const t=[...e].sort((a,n)=>n.documentCount-a.documentCount),r=Math.max(...t.map(a=>a.documentCount),1),s=t.reduce((a,n)=>a+n.documentCount,0);return`
51
+ `}).join("")+s}renderTablesOverview(){var r;const e=((r=this.config)==null?void 0:r.tables)||[];if(e.length===0)return"";const t=[...e].sort((a,n)=>n.documentCount-a.documentCount),i=Math.max(...t.map(a=>a.documentCount),1),s=t.reduce((a,n)=>a+n.documentCount,0);return`
52
52
  <div class="chart-card tables-overview-card">
53
53
  <div class="chart-header">
54
54
  <span class="chart-title" title="Document count per table in your Convex database">Tables Overview</span>
@@ -60,7 +60,7 @@ var h=Object.defineProperty;var m=(c,e,t)=>e in c?h(c,e,{enumerable:!0,configura
60
60
  <div class="h-bar-row" title="${a.name}: ${a.documentCount.toLocaleString()} documents">
61
61
  <span class="h-bar-label">${a.name}</span>
62
62
  <div class="h-bar-track">
63
- <div class="h-bar-fill" style="width: ${a.documentCount/r*100}%"></div>
63
+ <div class="h-bar-fill" style="width: ${a.documentCount/i*100}%"></div>
64
64
  </div>
65
65
  <span class="h-bar-value">${this.formatNumber(a.documentCount)}</span>
66
66
  </div>
@@ -68,17 +68,17 @@ var h=Object.defineProperty;var m=(c,e,t)=>e in c?h(c,e,{enumerable:!0,configura
68
68
  </div>
69
69
  </div>
70
70
  </div>
71
- `}renderChartContent(e,t){switch(e.type){case"bar":return this.renderBarChart(t,e);case"line":return this.renderLineChart(t,e);case"pie":return this.renderPieChart(t,e);case"table":return this.renderDataTable(t);default:return`<div class="empty-state">Unknown chart type: ${e.type}</div>`}}renderBarChart(e,t){if(e.length===0)return'<div class="empty-state">No data available</div>';let r=[];if(t.groupBy){const i=new Map;for(const a of e){const n=String(a[t.groupBy]||"Unknown");i.set(n,(i.get(n)||0)+1)}r=Array.from(i.entries()).map(([a,n])=>({label:a,value:n})).sort((a,n)=>n.value-a.value).slice(0,7)}else{const i=new Map;for(const a of e){const n=new Date(a._creationTime).toLocaleDateString();i.set(n,(i.get(n)||0)+1)}r=Array.from(i.entries()).map(([a,n])=>({label:a,value:n})).slice(-7)}const s=Math.max(...r.map(i=>i.value),1);return`
71
+ `}renderChartContent(e,t){switch(e.type){case"bar":return this.renderBarChart(t,e);case"line":return this.renderLineChart(t,e);case"pie":return this.renderPieChart(t,e);case"table":return this.renderDataTable(t);default:return`<div class="empty-state">Unknown chart type: ${e.type}</div>`}}renderBarChart(e,t){if(e.length===0)return'<div class="empty-state">No data available</div>';let i=[];if(t.groupBy){const r=new Map;for(const a of e){const n=String(a[t.groupBy]||"Unknown");r.set(n,(r.get(n)||0)+1)}i=Array.from(r.entries()).map(([a,n])=>({label:a,value:n})).sort((a,n)=>n.value-a.value).slice(0,7)}else{const r=new Map;for(const a of e){const n=new Date(a._creationTime).toLocaleDateString();r.set(n,(r.get(n)||0)+1)}i=Array.from(r.entries()).map(([a,n])=>({label:a,value:n})).slice(-7)}const s=Math.max(...i.map(r=>r.value),1);return`
72
72
  <div class="bar-chart">
73
- ${r.map(i=>`
74
- <div class="bar" style="height: ${i.value/s*100}%" data-value="${i.value}">
75
- <span class="bar-label">${i.label.slice(0,8)}</span>
73
+ ${i.map(r=>`
74
+ <div class="bar" style="height: ${r.value/s*100}%" data-value="${r.value}">
75
+ <span class="bar-label">${r.label.slice(0,8)}</span>
76
76
  </div>
77
77
  `).join("")}
78
78
  </div>
79
- `}renderLineChart(e,t){return e.length===0?'<div class="empty-state">No data available</div>':this.renderBarChart(e,t)}renderPieChart(e,t){if(e.length===0||!t.groupBy)return'<div class="empty-state">No data or groupBy field specified</div>';const r=new Map;for(const n of e){const o=String(n[t.groupBy]||"Unknown");r.set(o,(r.get(o)||0)+1)}const s=e.length,i=Array.from(r.entries()).map(([n,o])=>({label:n,count:o,percent:(o/s*100).toFixed(1)})).sort((n,o)=>o.count-n.count).slice(0,5),a=["#e94560","#0f3460","#16213e","#1a1a2e","#4caf50"];return`
79
+ `}renderLineChart(e,t){return e.length===0?'<div class="empty-state">No data available</div>':this.renderBarChart(e,t)}renderPieChart(e,t){if(e.length===0||!t.groupBy)return'<div class="empty-state">No data or groupBy field specified</div>';const i=new Map;for(const n of e){const o=String(n[t.groupBy]||"Unknown");i.set(o,(i.get(o)||0)+1)}const s=e.length,r=Array.from(i.entries()).map(([n,o])=>({label:n,count:o,percent:(o/s*100).toFixed(1)})).sort((n,o)=>o.count-n.count).slice(0,5),a=["#e94560","#0f3460","#16213e","#1a1a2e","#4caf50"];return`
80
80
  <div class="pie-legend">
81
- ${i.map((n,o)=>`
81
+ ${r.map((n,o)=>`
82
82
  <div class="pie-item">
83
83
  <span class="pie-color" style="background: ${a[o%a.length]}"></span>
84
84
  <span class="pie-label">${n.label}</span>
@@ -86,24 +86,24 @@ var h=Object.defineProperty;var m=(c,e,t)=>e in c?h(c,e,{enumerable:!0,configura
86
86
  </div>
87
87
  `).join("")}
88
88
  </div>
89
- `}renderDataTable(e){const t=e.slice(0,5);if(t.length===0)return'<div class="empty-state">No documents</div>';const r=Object.keys(t[0]).slice(0,4);return`
89
+ `}renderDataTable(e){const t=e.slice(0,5);if(t.length===0)return'<div class="empty-state">No documents</div>';const i=Object.keys(t[0]).slice(0,4);return`
90
90
  <div class="table-chart">
91
91
  <table>
92
92
  <thead>
93
93
  <tr>
94
- ${r.map(s=>`<th>${s}</th>`).join("")}
94
+ ${i.map(s=>`<th>${s}</th>`).join("")}
95
95
  </tr>
96
96
  </thead>
97
97
  <tbody>
98
98
  ${t.map(s=>`
99
99
  <tr>
100
- ${r.map(i=>`<td>${this.formatValue(s[i])}</td>`).join("")}
100
+ ${i.map(r=>`<td>${this.formatValue(s[r])}</td>`).join("")}
101
101
  </tr>
102
102
  `).join("")}
103
103
  </tbody>
104
104
  </table>
105
105
  </div>
106
- `}renderActivityTable(e){const t=Object.entries(e).flatMap(([r,s])=>s.map(i=>({table:r,...i}))).sort((r,s)=>{const i=r._creationTime||0;return(s._creationTime||0)-i}).slice(0,10);return t.length===0?`
106
+ `}renderActivityTable(e){const t=Object.entries(e).flatMap(([i,s])=>s.map(r=>({table:i,...r}))).sort((i,s)=>{const r=i._creationTime||0;return(s._creationTime||0)-r}).slice(0,10);return t.length===0?`
107
107
  <div class="chart-card recent-activity-card">
108
108
  <div class="chart-header">
109
109
  <span class="chart-title">Recent Activity</span>
@@ -128,15 +128,15 @@ var h=Object.defineProperty;var m=(c,e,t)=>e in c?h(c,e,{enumerable:!0,configura
128
128
  </tr>
129
129
  </thead>
130
130
  <tbody>
131
- ${t.map(r=>`
131
+ ${t.map(i=>`
132
132
  <tr>
133
- <td><span class="table-badge">${r.table}</span></td>
134
- <td class="id-cell">${String(r._id||"").slice(0,12)}...</td>
135
- <td class="time-cell">${this.formatTimeAgo(r._creationTime)}</td>
133
+ <td><span class="table-badge">${i.table}</span></td>
134
+ <td class="id-cell">${String(i._id||"").slice(0,12)}...</td>
135
+ <td class="time-cell">${this.formatTimeAgo(i._creationTime)}</td>
136
136
  </tr>
137
137
  `).join("")}
138
138
  </tbody>
139
139
  </table>
140
140
  </div>
141
141
  </div>
142
- `}formatValue(e){if(e==null)return'<span style="color: var(--text-secondary)">null</span>';if(typeof e=="object"){const t=JSON.stringify(e);return t.length>30?t.slice(0,30)+"...":t}return typeof e=="string"&&e.length>30?e.slice(0,30)+"...":String(e)}formatTimeAgo(e){if(!e)return"Unknown";const r=Date.now()-e,s=Math.floor(r/6e4),i=Math.floor(r/36e5),a=Math.floor(r/864e5);return s<1?"Just now":s<60?`${s}m ago`:i<24?`${i}h ago`:`${a}d ago`}updateTimestamp(){const e=document.getElementById("lastUpdate");e&&(e.textContent="Updated: "+new Date().toLocaleTimeString())}startAutoRefresh(){var t;const e=(((t=this.config)==null?void 0:t.refreshInterval)||5)*1e3;this.refreshTimer=window.setInterval(()=>{this.updateTimestamp()},e)}stopAutoRefresh(){this.refreshTimer&&(clearInterval(this.refreshTimer),this.refreshTimer=null)}destroy(){this.stopAutoRefresh()}}const v=new u;window.addEventListener("beforeunload",()=>{v.destroy()});
142
+ `}formatValue(e){if(e==null)return'<span style="color: var(--text-secondary)">null</span>';if(typeof e=="object"){const t=JSON.stringify(e);return t.length>30?t.slice(0,30)+"...":t}return typeof e=="string"&&e.length>30?e.slice(0,30)+"...":String(e)}formatTimeAgo(e){if(!e)return"Unknown";const i=Date.now()-e,s=Math.floor(i/6e4),r=Math.floor(i/36e5),a=Math.floor(i/864e5);return s<1?"Just now":s<60?`${s}m ago`:r<24?`${r}h ago`:`${a}d ago`}updateTimestamp(){const e=document.getElementById("lastUpdate");e&&(e.textContent="Updated: "+new Date().toLocaleTimeString())}startAutoRefresh(){var t;const e=(((t=this.config)==null?void 0:t.refreshInterval)||5)*1e3;this.refreshTimer=window.setInterval(()=>{this.updateTimestamp()},e)}stopAutoRefresh(){this.refreshTimer&&(clearInterval(this.refreshTimer),this.refreshTimer=null)}destroy(){this.stopAutoRefresh()}}const v=new m;window.addEventListener("beforeunload",()=>{v.destroy()});
@@ -1,4 +1,4 @@
1
- var V=Object.defineProperty;var X=(E,e,t)=>e in E?V(E,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):E[e]=t;var m=(E,e,t)=>X(E,typeof e!="symbol"?e+"":e,t);import"./modulepreload-polyfill-B5Qt9EMX.js";class Y{constructor(){m(this,"config",null);m(this,"selectedTable",null);m(this,"currentPage",1);m(this,"pageSize",50);m(this,"searchQuery","");m(this,"queryModalOpen",!1);m(this,"viewMode","graph");m(this,"sidebarWidth",260);m(this,"codePanelWidth",360);m(this,"sidebarCollapsed",!1);m(this,"graphSidebarCollapsed",!1);m(this,"isResizingSidebar",!1);m(this,"graphNodes",[]);m(this,"graphEdges",[]);m(this,"canvas",null);m(this,"ctx",null);m(this,"panX",0);m(this,"panY",0);m(this,"zoom",1);m(this,"isDragging",!1);m(this,"dragStartX",0);m(this,"dragStartY",0);m(this,"selectedNode",null);m(this,"hoveredNode",null);m(this,"dpr",1);m(this,"showCodePanel",!0);m(this,"positionHistory",[]);m(this,"historyIndex",-1);m(this,"maxHistorySize",20);m(this,"showExportMenu",!1);m(this,"showFilterDropdown",!1);m(this,"sidebarSections",{tables:{collapsed:!1},convex:{collapsed:!0}});m(this,"tableSortBy","name");m(this,"tableSortOrder","asc");m(this,"filterState",{tableName:"",fieldName:"",fieldType:"",showEmpty:!0});m(this,"tooltip",null);m(this,"tooltipTimeout",null);m(this,"currentTheme","light");this.initTheme(),this.init()}initTheme(){const e=localStorage.getItem("convex-schema-theme");e==="dark"||e==="light"?this.currentTheme=e:window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches&&(this.currentTheme="light"),this.applyTheme()}applyTheme(){document.documentElement.setAttribute("data-theme",this.currentTheme)}showShortcutsModal(){const e=document.getElementById("shortcutsModal");e&&(e.style.display="flex")}hideShortcutsModal(){const e=document.getElementById("shortcutsModal");e&&(e.style.display="none")}toggleTheme(){this.currentTheme=this.currentTheme==="light"?"dark":"light",localStorage.setItem("convex-schema-theme",this.currentTheme),this.applyTheme(),this.viewMode==="graph"&&this.drawGraph()}getThemeColor(e){return getComputedStyle(document.documentElement).getPropertyValue(e).trim()}getThemeColors(){return{bgPrimary:this.getThemeColor("--bg-primary")||"#faf8f5",bgSecondary:this.getThemeColor("--bg-secondary")||"#f5f3f0",bgHover:this.getThemeColor("--bg-hover")||"#ebe9e6",textPrimary:this.getThemeColor("--text-primary")||"#1a1a1a",textSecondary:this.getThemeColor("--text-secondary")||"#6b6b6b",textMuted:this.getThemeColor("--text-muted")||"#999999",border:this.getThemeColor("--border")||"#e6e4e1",accent:this.getThemeColor("--accent")||"#8b7355",accentInteractive:this.getThemeColor("--accent-interactive")||"#EB5601",accentHover:this.getThemeColor("--accent-hover")||"#d14a01",warning:this.getThemeColor("--warning")||"#c4842d",nodeBg:this.getThemeColor("--node-bg")||"#ffffff",nodeHeader:this.getThemeColor("--node-header")||"#f8f7f5",nodeHeaderSelected:this.getThemeColor("--node-header-selected")||"#EB5601",nodeBorder:this.getThemeColor("--node-border")||"#e6e4e1",gridLine:this.getThemeColor("--grid-line")||"#e6e4e1"}}init(){var t,i,s,o,n;const e=window;if(e.__CONVEX_CONFIG__)this.config=e.__CONVEX_CONFIG__;else{const r=new URLSearchParams(window.location.search).get("config");if(r)try{this.config=JSON.parse(decodeURIComponent(r))}catch(l){console.error("Failed to parse config:",l)}}this.pageSize=((t=this.config)==null?void 0:t.pageSize)||50,(((i=this.config)==null?void 0:i.viewMode)==="graph"||((s=this.config)==null?void 0:s.viewMode)==="list")&&(this.viewMode=this.config.viewMode),this.render(),this.setupKeyboardShortcuts(),(o=this.config)!=null&&o.selectedTable?this.selectedTable=this.config.selectedTable:(n=this.config)!=null&&n.tables&&this.config.tables.length>0&&(this.selectedTable=this.config.tables[0].name),this.viewMode==="graph"&&this.initGraphView()}render(){var s,o;const e=document.getElementById("app");if(!e)return;const t=((s=this.config)==null?void 0:s.deploymentUrl)||"Not connected",i=!!((o=this.config)!=null&&o.deploymentUrl);e.innerHTML=`
1
+ var D=Object.defineProperty;var V=(x,e,t)=>e in x?D(x,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):x[e]=t;var m=(x,e,t)=>V(x,typeof e!="symbol"?e+"":e,t);import"./modulepreload-polyfill-B5Qt9EMX.js";class X{constructor(){m(this,"config",null);m(this,"selectedTable",null);m(this,"currentPage",1);m(this,"pageSize",50);m(this,"searchQuery","");m(this,"queryModalOpen",!1);m(this,"viewMode","graph");m(this,"sidebarWidth",260);m(this,"codePanelWidth",360);m(this,"sidebarCollapsed",!1);m(this,"graphSidebarCollapsed",!1);m(this,"isResizingSidebar",!1);m(this,"graphNodes",[]);m(this,"graphEdges",[]);m(this,"canvas",null);m(this,"ctx",null);m(this,"panX",0);m(this,"panY",0);m(this,"zoom",1);m(this,"isDragging",!1);m(this,"dragStartX",0);m(this,"dragStartY",0);m(this,"selectedNode",null);m(this,"hoveredNode",null);m(this,"dpr",1);m(this,"showCodePanel",!0);m(this,"positionHistory",[]);m(this,"historyIndex",-1);m(this,"maxHistorySize",20);m(this,"showExportMenu",!1);m(this,"showFilterDropdown",!1);m(this,"sidebarSections",{tables:{collapsed:!1},convex:{collapsed:!0}});m(this,"tableSortBy","name");m(this,"tableSortOrder","asc");m(this,"filterState",{tableName:"",fieldName:"",fieldType:"",showEmpty:!0});m(this,"tooltip",null);m(this,"tooltipTimeout",null);m(this,"currentTheme","light");this.initTheme(),this.init()}initTheme(){this.currentTheme="light",this.applyTheme()}applyTheme(){this.currentTheme==="dark"?document.documentElement.setAttribute("data-theme","dark"):document.documentElement.removeAttribute("data-theme")}showShortcutsModal(){const e=document.getElementById("shortcutsModal");e&&(e.style.display="flex")}hideShortcutsModal(){const e=document.getElementById("shortcutsModal");e&&(e.style.display="none")}toggleTheme(){this.currentTheme=this.currentTheme==="light"?"dark":"light",this.applyTheme(),this.viewMode==="graph"&&this.drawGraph()}getThemeColor(e){return getComputedStyle(document.documentElement).getPropertyValue(e).trim()}getThemeColors(){return{bgPrimary:this.getThemeColor("--bg-primary")||"#faf8f5",bgSecondary:this.getThemeColor("--bg-secondary")||"#f5f3f0",bgHover:this.getThemeColor("--bg-hover")||"#ebe9e6",textPrimary:this.getThemeColor("--text-primary")||"#1a1a1a",textSecondary:this.getThemeColor("--text-secondary")||"#6b6b6b",textMuted:this.getThemeColor("--text-muted")||"#999999",border:this.getThemeColor("--border")||"#e6e4e1",accent:this.getThemeColor("--accent")||"#8b7355",accentInteractive:this.getThemeColor("--accent-interactive")||"#EB5601",accentHover:this.getThemeColor("--accent-hover")||"#d14a01",warning:this.getThemeColor("--warning")||"#c4842d",nodeBg:this.getThemeColor("--node-bg")||"#ffffff",nodeHeader:this.getThemeColor("--node-header")||"#f8f7f5",nodeHeaderSelected:this.getThemeColor("--node-header-selected")||"#EB5601",nodeBorder:this.getThemeColor("--node-border")||"#e6e4e1",gridLine:this.getThemeColor("--grid-line")||"#e6e4e1"}}init(){var t,i,s,o,n;const e=window;if(e.__CONVEX_CONFIG__)this.config=e.__CONVEX_CONFIG__;else{const r=new URLSearchParams(window.location.search).get("config");if(r)try{this.config=JSON.parse(decodeURIComponent(r))}catch(l){console.error("Failed to parse config:",l)}}this.pageSize=((t=this.config)==null?void 0:t.pageSize)||50,(((i=this.config)==null?void 0:i.viewMode)==="graph"||((s=this.config)==null?void 0:s.viewMode)==="list")&&(this.viewMode=this.config.viewMode),this.render(),this.setupKeyboardShortcuts(),(o=this.config)!=null&&o.selectedTable?this.selectedTable=this.config.selectedTable:(n=this.config)!=null&&n.tables&&this.config.tables.length>0&&(this.selectedTable=this.config.tables[0].name),this.viewMode==="graph"&&this.initGraphView()}render(){var s,o;const e=document.getElementById("app");if(!e)return;const t=((s=this.config)==null?void 0:s.deploymentUrl)||"Not connected",i=!!((o=this.config)!=null&&o.deploymentUrl);e.innerHTML=`
2
2
  <div class="app-container ${this.viewMode==="graph"?"graph-mode":"list-mode"}">
3
3
  <div class="header">
4
4
  <h1>
@@ -115,7 +115,7 @@ var V=Object.defineProperty;var X=(E,e,t)=>e in E?V(E,e,{enumerable:!0,configura
115
115
  <h2>Select a Table</h2>
116
116
  <p>Choose a table from the sidebar to view its schema and documents.</p>
117
117
  </div>
118
- `;const e=(d=(l=this.config)==null?void 0:l.tables)==null?void 0:d.find(g=>g.name===this.selectedTable),t=((c=(h=this.config)==null?void 0:h.allDocuments)==null?void 0:c[this.selectedTable])||(e==null?void 0:e.documents)||[],i=(e==null?void 0:e.declaredFields)||[],s=(e==null?void 0:e.inferredFields)||[],o=i.length>0?i:s,n=i.length>0?"declared":"inferred",a=(e==null?void 0:e.documentCount)||0,r=((p=this.config)==null?void 0:p.hasAdminAccess)??!0;return`
118
+ `;const e=(d=(l=this.config)==null?void 0:l.tables)==null?void 0:d.find(u=>u.name===this.selectedTable),t=((c=(h=this.config)==null?void 0:h.allDocuments)==null?void 0:c[this.selectedTable])||(e==null?void 0:e.documents)||[],i=(e==null?void 0:e.declaredFields)||[],s=(e==null?void 0:e.inferredFields)||[],o=i.length>0?i:s,n=i.length>0?"declared":"inferred",a=(e==null?void 0:e.documentCount)||0,r=((p=this.config)==null?void 0:p.hasAdminAccess)??!0;return`
119
119
  <div class="table-header">
120
120
  <div class="table-header-title">${this.selectedTable}</div>
121
121
  <div class="table-header-meta">
@@ -515,9 +515,9 @@ var V=Object.defineProperty;var X=(E,e,t)=>e in E?V(E,e,{enumerable:!0,configura
515
515
  <button class="btn btn-primary" id="filterApply">Apply</button>
516
516
  </div>
517
517
  </div>
518
- `:""}generateSchemaCode(){var s,o,n;const e=((s=this.config)==null?void 0:s.tables)||[],t=((o=this.config)==null?void 0:o.allDocuments)||{},i={};for(const a of e){const r={};if(a.inferredFields)for(const l of a.inferredFields)r[l.name]=l.type+(l.optional?"?":"");i[a.name]={fields:r,documentCount:a.documentCount,sample:((n=t[a.name])==null?void 0:n[0])||null}}return this.syntaxHighlight(JSON.stringify(i,null,2))}syntaxHighlight(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?)/g,t=>{let i="json-string";return/:$/.test(t)&&(i="json-key"),`<span class="${i}">${t}</span>`}).replace(/\b(true|false)\b/g,'<span class="json-boolean">$1</span>').replace(/\b(null)\b/g,'<span class="json-null">$1</span>').replace(/\b(-?\d+\.?\d*)\b/g,'<span class="json-number">$1</span>')}initGraphView(){if(this.canvas=document.getElementById("graphCanvas"),!this.canvas)return;this.dpr=window.devicePixelRatio||1;const e=this.canvas.parentElement;if(e){const t=e.clientWidth,i=e.clientHeight;this.canvas.width=t*this.dpr,this.canvas.height=i*this.dpr,this.canvas.style.width=t+"px",this.canvas.style.height=i+"px"}this.ctx=this.canvas.getContext("2d"),this.ctx&&(this.ctx.scale(this.dpr,this.dpr),this.calculateGraphLayout(),this.setupGraphEvents(),this.drawGraph(),this.savePositionState(),window.addEventListener("resize",()=>{if(this.canvas&&this.canvas.parentElement&&this.ctx){const t=this.canvas.parentElement.clientWidth,i=this.canvas.parentElement.clientHeight;this.dpr=window.devicePixelRatio||1,this.canvas.width=t*this.dpr,this.canvas.height=i*this.dpr,this.canvas.style.width=t+"px",this.canvas.style.height=i+"px",this.ctx.scale(this.dpr,this.dpr),this.drawGraph()}}))}calculateGraphLayout(){var a,r;const e=((a=this.config)==null?void 0:a.tables)||[];(r=this.config)!=null&&r.allDocuments,this.graphNodes=[],this.graphEdges=[];const t=220,i=160,s=80,o=60,n=Math.ceil(Math.sqrt(e.length));e.forEach((l,d)=>{const h=d%n,c=Math.floor(d/n);this.graphNodes.push({id:l.name,x:100+h*(t+s),y:100+c*(i+o),width:t,height:i,table:l})});for(const l of this.graphNodes){const d=l.table.inferredFields||[];for(const h of d){const c=h.type.match(/Id<["'](\w+)["']>/);if(c){const g=c[1],u=this.graphNodes.find(y=>y.id===g);if(u&&u.id!==l.id){this.graphEdges.push({from:l.id,to:u.id,fromField:h.name,toField:"_id",inferred:!1});continue}}const p=h.name.toLowerCase();for(const g of this.graphNodes){if(g.id===l.id)continue;const u=g.id.toLowerCase(),y=u.endsWith("s")?u.slice(0,-1):u;(p===u+"id"||p===y+"id"||p===y+"_id"||p===u+"_id")&&(this.graphEdges.some(w=>w.from===l.id&&w.to===g.id&&w.fromField===h.name)||this.graphEdges.push({from:l.id,to:g.id,fromField:h.name,toField:"_id",inferred:!0}))}}}if(this.canvas&&this.graphNodes.length>0){const l=Math.min(...this.graphNodes.map(f=>f.x)),d=Math.max(...this.graphNodes.map(f=>f.x+f.width)),h=Math.min(...this.graphNodes.map(f=>f.y)),c=Math.max(...this.graphNodes.map(f=>f.y+f.height)),p=d-l,g=c-h,u=this.canvas.width/this.dpr,y=this.canvas.height/this.dpr;this.panX=(u-p)/2-l,this.panY=(y-g)/2-h}}setupGraphEvents(){var i,s,o,n;if(!this.canvas)return;let e=0,t=0;this.canvas.addEventListener("mousedown",a=>{const r=this.canvas.getBoundingClientRect(),l=(a.clientX-r.left-this.panX)/this.zoom,d=(a.clientY-r.top-this.panY)/this.zoom;this.selectedNode=this.graphNodes.find(h=>l>=h.x&&l<=h.x+h.width&&d>=h.y&&d<=h.y+h.height)||null,this.selectedNode&&(this.selectTable(this.selectedNode.id),this.updateCodePanel()),this.isDragging=!0,e=a.clientX,t=a.clientY,this.dragStartX=a.clientX,this.dragStartY=a.clientY}),this.canvas.addEventListener("mousemove",a=>{const r=this.canvas.getBoundingClientRect(),l=(a.clientX-r.left-this.panX)/this.zoom,d=(a.clientY-r.top-this.panY)/this.zoom,h=this.graphNodes.find(c=>c.visible!==!1&&l>=c.x&&l<=c.x+c.width&&d>=c.y&&d<=c.y+c.height)||null;if(h!==this.hoveredNode&&(this.hoveredNode=h,this.canvas.style.cursor=h?"pointer":"grab",this.hideTooltip(),this.drawGraph()),h&&!this.isDragging){const c=this.getFieldAtPosition(h,d);if(c){const p=this.getFieldTooltipContent(c,h.table.name);this.showTooltip(a.clientX,a.clientY,p.title,p.content,"field")}else this.hideTooltip()}else h||this.hideTooltip();if(this.isDragging){if(this.hideTooltip(),this.selectedNode){const c=(a.clientX-e)/this.zoom,p=(a.clientY-t)/this.zoom;this.selectedNode.x+=c,this.selectedNode.y+=p}else this.panX+=a.clientX-e,this.panY+=a.clientY-t;e=a.clientX,t=a.clientY,this.drawGraph()}}),this.canvas.addEventListener("mouseup",a=>{this.isDragging&&(this.selectedNode||Math.abs(a.clientX-this.dragStartX)>5||Math.abs(a.clientY-this.dragStartY)>5)&&this.savePositionState(),this.isDragging=!1,this.selectedNode=null}),this.canvas.addEventListener("mouseleave",()=>{this.isDragging=!1,this.selectedNode=null,this.hoveredNode=null,this.hideTooltip(),this.drawGraph()}),this.canvas.addEventListener("wheel",a=>{a.preventDefault();const r=this.canvas.getBoundingClientRect(),l=a.clientX-r.left,d=a.clientY-r.top,h=this.zoom,c=a.deltaY>0?.9:1.1;this.zoom=Math.max(.25,Math.min(2,this.zoom*c)),this.panX=l-(l-this.panX)*(this.zoom/h),this.panY=d-(d-this.panY)*(this.zoom/h),this.drawGraph()}),(i=document.getElementById("zoomIn"))==null||i.addEventListener("click",()=>{this.zoom=Math.min(2,this.zoom*1.2),this.updateZoomDisplay(),this.drawGraph()}),(s=document.getElementById("zoomOut"))==null||s.addEventListener("click",()=>{this.zoom=Math.max(.25,this.zoom/1.2),this.updateZoomDisplay(),this.drawGraph()}),(o=document.getElementById("fitView"))==null||o.addEventListener("click",()=>{this.fitToView()}),(n=document.getElementById("resetView"))==null||n.addEventListener("click",()=>{this.zoom=1,this.calculateGraphLayout(),this.updateZoomDisplay(),this.drawGraph()})}drawGraph(){if(!this.ctx||!this.canvas)return;const e=this.ctx,t=this.getThemeColors();this.canvas.width/this.dpr,this.canvas.height/this.dpr,e.save(),e.setTransform(1,0,0,1,0,0),e.fillStyle=t.bgPrimary,e.fillRect(0,0,this.canvas.width,this.canvas.height),e.restore(),e.save(),e.translate(this.panX,this.panY),e.scale(this.zoom,this.zoom),this.drawGridPattern(e);for(const i of this.graphEdges){const s=this.graphNodes.find(n=>n.id===i.from),o=this.graphNodes.find(n=>n.id===i.to);s&&o&&s.visible!==!1&&o.visible!==!1&&this.drawEdge(e,s,o,i)}for(const i of this.graphNodes)i.visible!==!1&&this.drawNode(e,i);e.restore()}drawGridPattern(e){const t=this.getThemeColors(),i=40,s=-this.panX/this.zoom-1e3,o=-this.panY/this.zoom-1e3,n=s+3e3,a=o+3e3;e.strokeStyle=t.gridLine,e.lineWidth=.5;for(let r=Math.floor(s/i)*i;r<n;r+=i)e.beginPath(),e.moveTo(r,o),e.lineTo(r,a),e.stroke();for(let r=Math.floor(o/i)*i;r<a;r+=i)e.beginPath(),e.moveTo(s,r),e.lineTo(n,r),e.stroke()}drawNode(e,t){const i=this.getThemeColors(),s=this.currentTheme==="dark",o=this.hoveredNode===t,n=this.selectedTable===t.id,a=t.x,r=t.y,l=t.width,d=10,h=this.getSortedFields(t.table.inferredFields||[]),c=12,p=h.slice(0,c),g=h.length>c,u=44,y=24,f=12,w=g?28:0,L=u+p.length*y+f+w;t.height=L;const k=s?.4:.08,B=s?.5:.15;e.shadowColor=o||n?`rgba(235, 86, 1, ${B})`:`rgba(0, 0, 0, ${k})`,e.shadowBlur=o?16:8,e.shadowOffsetX=0,e.shadowOffsetY=o?6:3,e.fillStyle=i.nodeBg,e.beginPath(),e.roundRect(a,r,l,L,d),e.fill(),e.shadowColor="transparent",e.strokeStyle=n?i.accentInteractive:o?i.accent:i.nodeBorder,e.lineWidth=n?2:1,e.stroke();const v=e.createLinearGradient(a,r,a,r+u);n?(v.addColorStop(0,i.accentInteractive),v.addColorStop(1,i.accentHover)):(v.addColorStop(0,i.nodeHeader),v.addColorStop(1,s?i.bgSecondary:i.bgHover)),e.fillStyle=v,e.beginPath(),e.roundRect(a,r,l,u,[d,d,0,0]),e.fill(),e.strokeStyle=n?"rgba(255,255,255,0.1)":i.border,e.lineWidth=1,e.beginPath(),e.moveTo(a,r+u),e.lineTo(a+l,r+u),e.stroke(),e.fillStyle=n?"#ffffff":i.textPrimary,e.font='bold 14px -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',e.textBaseline="middle";const b=t.table.name,T=l-100;let S=b;if(e.measureText(b).width>T){for(;e.measureText(S+"...").width>T&&S.length>0;)S=S.slice(0,-1);S+="..."}e.fillText(S,a+14,r+u/2);const I=`${h.length} fields`;e.font="11px -apple-system, BlinkMacSystemFont, sans-serif";const $=e.measureText(I).width+14;e.fillStyle=n?"rgba(255,255,255,0.25)":s?"rgba(255,255,255,0.1)":"rgba(0,0,0,0.06)",e.beginPath(),e.roundRect(a+l-$-10,r+(u-20)/2,$,20,10),e.fill(),e.fillStyle=n?"rgba(255,255,255,0.9)":i.textSecondary,e.textAlign="center",e.fillText(I,a+l-$/2-10,r+u/2),e.textAlign="left";let M=r+u+8;for(const C of p){const z=C.name.startsWith("_"),P=C.name==="_id",H=C.type.includes("Id<");o&&(e.fillStyle=s?"rgba(255, 255, 255, 0.03)":"rgba(0, 0, 0, 0.02)",e.fillRect(a+4,M-6,l-8,y)),P&&this.drawKeyIcon(e,a+12,M+2,n,i);const F=P?a+28:a+14;if(e.font='12px "SF Mono", Monaco, "Cascadia Code", monospace',z?e.fillStyle=i.textMuted:H?e.fillStyle=i.accent:e.fillStyle=i.accentInteractive,e.fillText(C.name,F,M+4),C.optional){const D=e.measureText(C.name).width;e.fillStyle=i.warning,e.font="10px -apple-system, sans-serif",e.fillText("?",F+D+2,M+3)}e.font='11px "SF Mono", Monaco, "Cascadia Code", monospace',e.fillStyle=z?i.textMuted:i.textSecondary,e.textAlign="right";let x=C.type;const N=80;if(e.measureText(x).width>N){for(;e.measureText(x+"...").width>N&&x.length>0;)x=x.slice(0,-1);x+="..."}e.fillText(x,a+l-12,M+4),e.textAlign="left",M+=y}if(g){const C=h.length-c;e.fillStyle=i.bgSecondary,e.beginPath(),e.roundRect(a+4,M,l-8,24,[0,0,d-4,d-4]),e.fill(),e.fillStyle=i.textSecondary,e.font="11px -apple-system, BlinkMacSystemFont, sans-serif",e.textAlign="center",e.fillText(`+ ${C} more field${C>1?"s":""}`,a+l/2,M+14),e.textAlign="left"}}getSortedFields(e){const t=["_id","_creationTime"];return[...e].sort((i,s)=>{const o=t.includes(i.name),n=t.includes(s.name);return o&&!n?-1:!o&&n?1:o&&n?t.indexOf(i.name)-t.indexOf(s.name):i.name.localeCompare(s.name)})}drawKeyIcon(e,t,i,s,o){e.save(),e.fillStyle=s?o.accentInteractive:o.warning,e.beginPath(),e.arc(t+4,i,4,0,Math.PI*2),e.fill(),e.fillRect(t+7,i-1,6,2),e.fillRect(t+10,i-1,1,3),e.fillRect(t+12,i-1,1,2),e.restore()}drawEdge(e,t,i,s){const o=this.hoveredNode!==null&&(this.hoveredNode.id===s.from||this.hoveredNode.id===s.to),n=this.calculateAttachmentPoints(t,i),a=Math.sqrt(Math.pow(n.toX-n.fromX,2)+Math.pow(n.toY-n.fromY,2)),r=Math.min(a*.4,100);let l,d,h,c;n.fromSide==="right"?(l=n.fromX+r,d=n.fromY):n.fromSide==="left"?(l=n.fromX-r,d=n.fromY):n.fromSide==="bottom"?(l=n.fromX,d=n.fromY+r):(l=n.fromX,d=n.fromY-r),n.toSide==="left"?(h=n.toX-r,c=n.toY):n.toSide==="right"?(h=n.toX+r,c=n.toY):n.toSide==="top"?(h=n.toX,c=n.toY-r):(h=n.toX,c=n.toY+r),o&&(e.save(),e.shadowColor="rgba(235, 86, 1, 0.3)",e.shadowBlur=8,e.shadowOffsetX=0,e.shadowOffsetY=0),e.strokeStyle=o?"#EB5601":"#8b7355",e.lineWidth=o?2.5:1.5,s.inferred?e.setLineDash([6,4]):e.setLineDash([]),e.beginPath(),e.moveTo(n.fromX,n.fromY),e.bezierCurveTo(l,d,h,c,n.toX,n.toY),e.stroke(),e.setLineDash([]),o&&e.restore(),this.drawArrowHead(e,h,c,n.toX,n.toY,o);const p=.5,g=this.bezierPoint(n.fromX,l,h,n.toX,p),u=this.bezierPoint(n.fromY,d,c,n.toY,p)-12;e.font="10px -apple-system, BlinkMacSystemFont, sans-serif";const y=s.fromField,f=e.measureText(y).width+10,w=16;e.fillStyle=o?"rgba(235, 86, 1, 0.1)":"rgba(255, 255, 255, 0.95)",e.beginPath(),e.roundRect(g-f/2,u-w/2,f,w,4),e.fill(),e.strokeStyle=o?"rgba(235, 86, 1, 0.3)":"#e6e4e1",e.lineWidth=1,e.stroke(),e.fillStyle=o?"#EB5601":"#6b6b6b",e.textAlign="center",e.textBaseline="middle",e.fillText(y,g,u),e.textAlign="left",e.textBaseline="alphabetic"}calculateAttachmentPoints(e,t){const i=e.x+e.width/2,s=e.y+e.height/2,o=t.x+t.width/2,n=t.y+t.height/2,a=o-i,r=n-s;let l,d,h,c,p,g;return Math.abs(a)>Math.abs(r)?a>0?(l="right",d="left",h=e.x+e.width,c=s,p=t.x,g=n):(l="left",d="right",h=e.x,c=s,p=t.x+t.width,g=n):r>0?(l="bottom",d="top",h=i,c=e.y+e.height,p=o,g=t.y):(l="top",d="bottom",h=i,c=e.y,p=o,g=t.y+t.height),{fromX:h,fromY:c,fromSide:l,toX:p,toY:g,toSide:d}}drawArrowHead(e,t,i,s,o,n){const a=Math.atan2(o-i,s-t),r=n?10:8;e.fillStyle=n?"#EB5601":"#8b7355",e.beginPath(),e.moveTo(s,o),e.lineTo(s-r*Math.cos(a-Math.PI/6),o-r*Math.sin(a-Math.PI/6)),e.lineTo(s-r*Math.cos(a+Math.PI/6),o-r*Math.sin(a+Math.PI/6)),e.closePath(),e.fill()}bezierPoint(e,t,i,s,o){const n=1-o;return n*n*n*e+3*n*n*o*t+3*n*o*o*i+o*o*o*s}updateCodePanel(){var i,s,o,n;const e=document.getElementById("codeBlock"),t=document.querySelector(".code-filename");if(e&&this.selectedTable){const a=(s=(i=this.config)==null?void 0:i.tables)==null?void 0:s.find(l=>l.name===this.selectedTable),r=((n=(o=this.config)==null?void 0:o.allDocuments)==null?void 0:n[this.selectedTable])||[];if(a){const l={table:this.selectedTable,documentCount:a.documentCount,fields:{}};if(a.inferredFields)for(const d of a.inferredFields)l.fields[d.name]={type:d.type,required:!d.optional};r.length>0&&(l.sample=r[0]),e.innerHTML=this.syntaxHighlight(JSON.stringify(l,null,2))}}t&&this.selectedTable&&(t.textContent=`${this.selectedTable}.json`)}savePositionState(){const e={nodes:this.graphNodes.map(t=>({id:t.id,x:t.x,y:t.y})),panX:this.panX,panY:this.panY,zoom:this.zoom};this.historyIndex<this.positionHistory.length-1&&(this.positionHistory=this.positionHistory.slice(0,this.historyIndex+1)),this.positionHistory.push(e),this.positionHistory.length>this.maxHistorySize?this.positionHistory.shift():this.historyIndex++,this.updateUndoRedoButtons()}undo(){this.historyIndex<=0||(this.historyIndex--,this.restorePositionState(this.positionHistory[this.historyIndex]),this.updateUndoRedoButtons())}redo(){this.historyIndex>=this.positionHistory.length-1||(this.historyIndex++,this.restorePositionState(this.positionHistory[this.historyIndex]),this.updateUndoRedoButtons())}restorePositionState(e){for(const t of e.nodes){const i=this.graphNodes.find(s=>s.id===t.id);i&&(i.x=t.x,i.y=t.y)}this.panX=e.panX,this.panY=e.panY,this.zoom=e.zoom,this.updateZoomDisplay(),this.drawGraph()}updateUndoRedoButtons(){const e=document.getElementById("undoBtn"),t=document.getElementById("redoBtn");e&&(e.disabled=this.historyIndex<=0),t&&(t.disabled=this.historyIndex>=this.positionHistory.length-1)}fitToView(){if(this.graphNodes.length===0)return;const e=this.graphNodes.filter(p=>p.visible!==!1);if(e.length===0)return;const t=60,i=Math.min(...e.map(p=>p.x))-t,s=Math.max(...e.map(p=>p.x+p.width))+t,o=Math.min(...e.map(p=>p.y))-t,n=Math.max(...e.map(p=>p.y+p.height))+t,a=s-i,r=n-o;if(!this.canvas)return;const l=this.canvas.width/this.dpr,d=this.canvas.height/this.dpr,h=l/a,c=d/r;this.zoom=Math.min(h,c,1.5),this.zoom=Math.max(this.zoom,.25),this.panX=(l-a*this.zoom)/2-i*this.zoom,this.panY=(d-r*this.zoom)/2-o*this.zoom,this.updateZoomDisplay(),this.drawGraph()}autoArrange(){this.calculateGraphLayout(),this.fitToView(),this.savePositionState()}updateZoomDisplay(){const e=document.getElementById("zoomLevel"),t=document.getElementById("zoomDisplay"),i=`${Math.round(this.zoom*100)}%`;e&&(e.textContent=i),t&&(t.textContent=i)}toggleCodePanel(){this.showCodePanel=!this.showCodePanel;const e=document.getElementById("sidebarContainer"),t=document.getElementById("viewCodeBtn");e&&e.classList.toggle("hidden",!this.showCodePanel),t&&t.classList.toggle("active",this.showCodePanel),setTimeout(()=>this.resizeCanvas(),50)}toggleExportMenu(){this.showExportMenu=!this.showExportMenu,this.showFilterDropdown=!1,this.renderDropdowns()}toggleFilterDropdown(){this.showFilterDropdown=!this.showFilterDropdown,this.showExportMenu=!1,this.renderDropdowns()}renderDropdowns(){var t,i;(t=document.getElementById("exportMenu"))==null||t.remove(),(i=document.getElementById("filterMenu"))==null||i.remove();const e=document.querySelector(".graph-view");e&&(this.showExportMenu&&(e.insertAdjacentHTML("beforeend",this.renderExportMenu()),this.setupExportMenuEvents()),this.showFilterDropdown&&(e.insertAdjacentHTML("beforeend",this.renderFilterDropdown()),this.setupFilterMenuEvents()))}setupExportMenuEvents(){var e,t,i;(e=document.getElementById("exportJson"))==null||e.addEventListener("click",()=>{this.exportSchema("json"),this.showExportMenu=!1,this.renderDropdowns()}),(t=document.getElementById("exportTs"))==null||t.addEventListener("click",()=>{this.exportSchema("typescript"),this.showExportMenu=!1,this.renderDropdowns()}),(i=document.getElementById("exportPng"))==null||i.addEventListener("click",()=>{this.exportAsPng(),this.showExportMenu=!1,this.renderDropdowns()}),setTimeout(()=>{document.addEventListener("click",this.handleOutsideClick.bind(this),{once:!0})},0)}setupFilterMenuEvents(){var e,t,i;(e=document.getElementById("filterClose"))==null||e.addEventListener("click",()=>{this.showFilterDropdown=!1,this.renderDropdowns()}),(t=document.getElementById("filterApply"))==null||t.addEventListener("click",()=>{this.applyFilters()}),(i=document.getElementById("filterClear"))==null||i.addEventListener("click",()=>{this.clearFilters()})}handleOutsideClick(e){const t=document.getElementById("exportMenu"),i=document.getElementById("exportBtn"),s=document.getElementById("filterMenu"),o=document.getElementById("filterBtn");t&&!t.contains(e.target)&&!(i!=null&&i.contains(e.target))&&(this.showExportMenu=!1,this.renderDropdowns()),s&&!s.contains(e.target)&&!(o!=null&&o.contains(e.target))&&(this.showFilterDropdown=!1,this.renderDropdowns())}exportSchema(e){var n;const t=((n=this.config)==null?void 0:n.tables)||[];let i,s,o;if(e==="json"){const a={};for(const r of t)a[r.name]={documentCount:r.documentCount,fields:(r.inferredFields||[]).reduce((l,d)=>(l[d.name]={type:d.type,required:!d.optional},l),{})};i=JSON.stringify(a,null,2),s="convex-schema.json",o="application/json"}else{const a=['import { defineSchema, defineTable } from "convex/server";','import { v } from "convex/values";',"","export default defineSchema({"];for(const r of t){const l=(r.inferredFields||[]).filter(d=>!d.name.startsWith("_")).map(d=>` ${d.name}: ${this.toConvexValidator(d.type)}${d.optional?".optional()":""},`).join(`
518
+ `:""}generateSchemaCode(){var s,o,n;const e=((s=this.config)==null?void 0:s.tables)||[],t=((o=this.config)==null?void 0:o.allDocuments)||{},i={};for(const a of e){const r={};if(a.inferredFields)for(const l of a.inferredFields)r[l.name]=l.type+(l.optional?"?":"");i[a.name]={fields:r,documentCount:a.documentCount,sample:((n=t[a.name])==null?void 0:n[0])||null}}return this.syntaxHighlight(JSON.stringify(i,null,2))}syntaxHighlight(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?)/g,t=>{let i="json-string";return/:$/.test(t)&&(i="json-key"),`<span class="${i}">${t}</span>`}).replace(/\b(true|false)\b/g,'<span class="json-boolean">$1</span>').replace(/\b(null)\b/g,'<span class="json-null">$1</span>').replace(/\b(-?\d+\.?\d*)\b/g,'<span class="json-number">$1</span>')}initGraphView(){if(this.canvas=document.getElementById("graphCanvas"),!this.canvas)return;this.dpr=window.devicePixelRatio||1;const e=this.canvas.parentElement;if(e){const t=e.clientWidth,i=e.clientHeight;this.canvas.width=t*this.dpr,this.canvas.height=i*this.dpr,this.canvas.style.width=t+"px",this.canvas.style.height=i+"px"}this.ctx=this.canvas.getContext("2d"),this.ctx&&(this.ctx.scale(this.dpr,this.dpr),this.calculateGraphLayout(),this.setupGraphEvents(),this.drawGraph(),this.savePositionState(),window.addEventListener("resize",()=>{if(this.canvas&&this.canvas.parentElement&&this.ctx){const t=this.canvas.parentElement.clientWidth,i=this.canvas.parentElement.clientHeight;this.dpr=window.devicePixelRatio||1,this.canvas.width=t*this.dpr,this.canvas.height=i*this.dpr,this.canvas.style.width=t+"px",this.canvas.style.height=i+"px",this.ctx.scale(this.dpr,this.dpr),this.drawGraph()}}))}calculateGraphLayout(){var a,r;const e=((a=this.config)==null?void 0:a.tables)||[];(r=this.config)!=null&&r.allDocuments,this.graphNodes=[],this.graphEdges=[];const t=220,i=160,s=80,o=60,n=Math.ceil(Math.sqrt(e.length));e.forEach((l,d)=>{const h=d%n,c=Math.floor(d/n);this.graphNodes.push({id:l.name,x:100+h*(t+s),y:100+c*(i+o),width:t,height:i,table:l})});for(const l of this.graphNodes){const d=l.table.inferredFields||[];for(const h of d){const c=h.type.match(/Id<["'](\w+)["']>/);if(c){const u=c[1],g=this.graphNodes.find(y=>y.id===u);if(g&&g.id!==l.id){this.graphEdges.push({from:l.id,to:g.id,fromField:h.name,toField:"_id",inferred:!1});continue}}const p=h.name.toLowerCase();for(const u of this.graphNodes){if(u.id===l.id)continue;const g=u.id.toLowerCase(),y=g.endsWith("s")?g.slice(0,-1):g;(p===g+"id"||p===y+"id"||p===y+"_id"||p===g+"_id")&&(this.graphEdges.some(T=>T.from===l.id&&T.to===u.id&&T.fromField===h.name)||this.graphEdges.push({from:l.id,to:u.id,fromField:h.name,toField:"_id",inferred:!0}))}}}if(this.canvas&&this.graphNodes.length>0){const l=Math.min(...this.graphNodes.map(v=>v.x)),d=Math.max(...this.graphNodes.map(v=>v.x+v.width)),h=Math.min(...this.graphNodes.map(v=>v.y)),c=Math.max(...this.graphNodes.map(v=>v.y+v.height)),p=d-l,u=c-h,g=this.canvas.width/this.dpr,y=this.canvas.height/this.dpr;this.panX=(g-p)/2-l,this.panY=(y-u)/2-h}}setupGraphEvents(){var i,s,o,n;if(!this.canvas)return;let e=0,t=0;this.canvas.addEventListener("mousedown",a=>{const r=this.canvas.getBoundingClientRect(),l=(a.clientX-r.left-this.panX)/this.zoom,d=(a.clientY-r.top-this.panY)/this.zoom;this.selectedNode=this.graphNodes.find(h=>l>=h.x&&l<=h.x+h.width&&d>=h.y&&d<=h.y+h.height)||null,this.selectedNode&&(this.selectTable(this.selectedNode.id),this.updateCodePanel()),this.isDragging=!0,e=a.clientX,t=a.clientY,this.dragStartX=a.clientX,this.dragStartY=a.clientY}),this.canvas.addEventListener("mousemove",a=>{const r=this.canvas.getBoundingClientRect(),l=(a.clientX-r.left-this.panX)/this.zoom,d=(a.clientY-r.top-this.panY)/this.zoom,h=this.graphNodes.find(c=>c.visible!==!1&&l>=c.x&&l<=c.x+c.width&&d>=c.y&&d<=c.y+c.height)||null;if(h!==this.hoveredNode&&(this.hoveredNode=h,this.canvas.style.cursor=h?"pointer":"grab",this.hideTooltip(),this.drawGraph()),h&&!this.isDragging){const c=this.getFieldAtPosition(h,d);if(c){const p=this.getFieldTooltipContent(c,h.table.name);this.showTooltip(a.clientX,a.clientY,p.title,p.content,"field")}else this.hideTooltip()}else h||this.hideTooltip();if(this.isDragging){if(this.hideTooltip(),this.selectedNode){const c=(a.clientX-e)/this.zoom,p=(a.clientY-t)/this.zoom;this.selectedNode.x+=c,this.selectedNode.y+=p}else this.panX+=a.clientX-e,this.panY+=a.clientY-t;e=a.clientX,t=a.clientY,this.drawGraph()}}),this.canvas.addEventListener("mouseup",a=>{this.isDragging&&(this.selectedNode||Math.abs(a.clientX-this.dragStartX)>5||Math.abs(a.clientY-this.dragStartY)>5)&&this.savePositionState(),this.isDragging=!1,this.selectedNode=null}),this.canvas.addEventListener("mouseleave",()=>{this.isDragging=!1,this.selectedNode=null,this.hoveredNode=null,this.hideTooltip(),this.drawGraph()}),this.canvas.addEventListener("wheel",a=>{a.preventDefault();const r=this.canvas.getBoundingClientRect(),l=a.clientX-r.left,d=a.clientY-r.top,h=this.zoom,c=a.deltaY>0?.9:1.1;this.zoom=Math.max(.25,Math.min(2,this.zoom*c)),this.panX=l-(l-this.panX)*(this.zoom/h),this.panY=d-(d-this.panY)*(this.zoom/h),this.drawGraph()}),(i=document.getElementById("zoomIn"))==null||i.addEventListener("click",()=>{this.zoom=Math.min(2,this.zoom*1.2),this.updateZoomDisplay(),this.drawGraph()}),(s=document.getElementById("zoomOut"))==null||s.addEventListener("click",()=>{this.zoom=Math.max(.25,this.zoom/1.2),this.updateZoomDisplay(),this.drawGraph()}),(o=document.getElementById("fitView"))==null||o.addEventListener("click",()=>{this.fitToView()}),(n=document.getElementById("resetView"))==null||n.addEventListener("click",()=>{this.zoom=1,this.calculateGraphLayout(),this.updateZoomDisplay(),this.drawGraph()})}drawGraph(){if(!this.ctx||!this.canvas)return;const e=this.ctx,t=this.getThemeColors();this.canvas.width/this.dpr,this.canvas.height/this.dpr,e.save(),e.setTransform(1,0,0,1,0,0),e.fillStyle=t.bgPrimary,e.fillRect(0,0,this.canvas.width,this.canvas.height),e.restore(),e.save(),e.translate(this.panX,this.panY),e.scale(this.zoom,this.zoom),this.drawGridPattern(e);for(const i of this.graphEdges){const s=this.graphNodes.find(n=>n.id===i.from),o=this.graphNodes.find(n=>n.id===i.to);s&&o&&s.visible!==!1&&o.visible!==!1&&this.drawEdge(e,s,o,i)}for(const i of this.graphNodes)i.visible!==!1&&this.drawNode(e,i);e.restore()}drawGridPattern(e){const t=this.getThemeColors(),i=40,s=-this.panX/this.zoom-1e3,o=-this.panY/this.zoom-1e3,n=s+3e3,a=o+3e3;e.strokeStyle=t.gridLine,e.lineWidth=.5;for(let r=Math.floor(s/i)*i;r<n;r+=i)e.beginPath(),e.moveTo(r,o),e.lineTo(r,a),e.stroke();for(let r=Math.floor(o/i)*i;r<a;r+=i)e.beginPath(),e.moveTo(s,r),e.lineTo(n,r),e.stroke()}drawNode(e,t){const i=this.getThemeColors(),s=this.currentTheme==="dark",o=this.hoveredNode===t,n=this.selectedTable===t.id,a=t.x,r=t.y,l=t.width,d=10,h=this.getSortedFields(t.table.inferredFields||[]),c=12,p=h.slice(0,c),u=h.length>c,g=44,y=24,v=12,T=u?28:0,E=g+p.length*y+v+T;t.height=E;const L=s?.4:.08,B=s?.5:.15;e.shadowColor=o||n?`rgba(235, 86, 1, ${B})`:`rgba(0, 0, 0, ${L})`,e.shadowBlur=o?16:8,e.shadowOffsetX=0,e.shadowOffsetY=o?6:3,e.fillStyle=i.nodeBg,e.beginPath(),e.roundRect(a,r,l,E,d),e.fill(),e.shadowColor="transparent",e.strokeStyle=n?i.accentInteractive:o?i.accent:i.nodeBorder,e.lineWidth=n?2:1,e.stroke(),e.fillStyle=n?i.accentInteractive:i.nodeHeader,e.beginPath(),e.roundRect(a,r,l,g,[d,d,0,0]),e.fill(),e.strokeStyle=n?"rgba(255,255,255,0.1)":i.border,e.lineWidth=1,e.beginPath(),e.moveTo(a,r+g),e.lineTo(a+l,r+g),e.stroke(),e.fillStyle=n?"#ffffff":i.textPrimary,e.font='bold 14px -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',e.textBaseline="middle";const b=t.table.name,f=l-100;let w=b;if(e.measureText(b).width>f){for(;e.measureText(w+"...").width>f&&w.length>0;)w=w.slice(0,-1);w+="..."}e.fillText(w,a+14,r+g/2);const k=`${h.length} fields`;e.font="11px -apple-system, BlinkMacSystemFont, sans-serif";const $=e.measureText(k).width+14;e.fillStyle=n?"rgba(255,255,255,0.25)":s?"rgba(255,255,255,0.1)":"rgba(0,0,0,0.06)",e.beginPath(),e.roundRect(a+l-$-10,r+(g-20)/2,$,20,10),e.fill(),e.fillStyle=n?"rgba(255,255,255,0.9)":i.textSecondary,e.textAlign="center",e.fillText(k,a+l-$/2-10,r+g/2),e.textAlign="left";let M=r+g+8;for(const C of p){const I=C.name.startsWith("_"),z=C.name==="_id",N=C.type.includes("Id<");o&&(e.fillStyle=s?"rgba(255, 255, 255, 0.03)":"rgba(0, 0, 0, 0.02)",e.fillRect(a+4,M-6,l-8,y)),z&&this.drawKeyIcon(e,a+12,M+2,n,i);const P=z?a+28:a+14;if(e.font='12px "SF Mono", Monaco, "Cascadia Code", monospace',I?e.fillStyle=i.textMuted:N?e.fillStyle=i.accent:e.fillStyle=i.accentInteractive,e.fillText(C.name,P,M+4),C.optional){const H=e.measureText(C.name).width;e.fillStyle=i.warning,e.font="10px -apple-system, sans-serif",e.fillText("?",P+H+2,M+3)}e.font='11px "SF Mono", Monaco, "Cascadia Code", monospace',e.fillStyle=I?i.textMuted:i.textSecondary,e.textAlign="right";let S=C.type;const F=80;if(e.measureText(S).width>F){for(;e.measureText(S+"...").width>F&&S.length>0;)S=S.slice(0,-1);S+="..."}e.fillText(S,a+l-12,M+4),e.textAlign="left",M+=y}if(u){const C=h.length-c;e.fillStyle=i.bgSecondary,e.beginPath(),e.roundRect(a+4,M,l-8,24,[0,0,d-4,d-4]),e.fill(),e.fillStyle=i.textSecondary,e.font="11px -apple-system, BlinkMacSystemFont, sans-serif",e.textAlign="center",e.fillText(`+ ${C} more field${C>1?"s":""}`,a+l/2,M+14),e.textAlign="left"}}getSortedFields(e){const t=["_id","_creationTime"];return[...e].sort((i,s)=>{const o=t.includes(i.name),n=t.includes(s.name);return o&&!n?-1:!o&&n?1:o&&n?t.indexOf(i.name)-t.indexOf(s.name):i.name.localeCompare(s.name)})}drawKeyIcon(e,t,i,s,o){e.save(),e.fillStyle=s?o.accentInteractive:o.warning,e.beginPath(),e.arc(t+4,i,4,0,Math.PI*2),e.fill(),e.fillRect(t+7,i-1,6,2),e.fillRect(t+10,i-1,1,3),e.fillRect(t+12,i-1,1,2),e.restore()}drawEdge(e,t,i,s){const o=this.hoveredNode!==null&&(this.hoveredNode.id===s.from||this.hoveredNode.id===s.to),n=this.calculateAttachmentPoints(t,i),a=Math.sqrt(Math.pow(n.toX-n.fromX,2)+Math.pow(n.toY-n.fromY,2)),r=Math.min(a*.4,100);let l,d,h,c;n.fromSide==="right"?(l=n.fromX+r,d=n.fromY):n.fromSide==="left"?(l=n.fromX-r,d=n.fromY):n.fromSide==="bottom"?(l=n.fromX,d=n.fromY+r):(l=n.fromX,d=n.fromY-r),n.toSide==="left"?(h=n.toX-r,c=n.toY):n.toSide==="right"?(h=n.toX+r,c=n.toY):n.toSide==="top"?(h=n.toX,c=n.toY-r):(h=n.toX,c=n.toY+r),o&&(e.save(),e.shadowColor="rgba(235, 86, 1, 0.3)",e.shadowBlur=8,e.shadowOffsetX=0,e.shadowOffsetY=0),e.strokeStyle=o?"#EB5601":"#8b7355",e.lineWidth=o?2.5:1.5,s.inferred?e.setLineDash([6,4]):e.setLineDash([]),e.beginPath(),e.moveTo(n.fromX,n.fromY),e.bezierCurveTo(l,d,h,c,n.toX,n.toY),e.stroke(),e.setLineDash([]),o&&e.restore(),this.drawArrowHead(e,h,c,n.toX,n.toY,o);const p=.5,u=this.bezierPoint(n.fromX,l,h,n.toX,p),g=this.bezierPoint(n.fromY,d,c,n.toY,p)-12;e.font="10px -apple-system, BlinkMacSystemFont, sans-serif";const y=s.fromField,v=e.measureText(y).width+10,T=16;e.fillStyle=o?"rgba(235, 86, 1, 0.1)":"rgba(255, 255, 255, 0.95)",e.beginPath(),e.roundRect(u-v/2,g-T/2,v,T,4),e.fill(),e.strokeStyle=o?"rgba(235, 86, 1, 0.3)":"#e6e4e1",e.lineWidth=1,e.stroke(),e.fillStyle=o?"#EB5601":"#6b6b6b",e.textAlign="center",e.textBaseline="middle",e.fillText(y,u,g),e.textAlign="left",e.textBaseline="alphabetic"}calculateAttachmentPoints(e,t){const i=e.x+e.width/2,s=e.y+e.height/2,o=t.x+t.width/2,n=t.y+t.height/2,a=o-i,r=n-s;let l,d,h,c,p,u;return Math.abs(a)>Math.abs(r)?a>0?(l="right",d="left",h=e.x+e.width,c=s,p=t.x,u=n):(l="left",d="right",h=e.x,c=s,p=t.x+t.width,u=n):r>0?(l="bottom",d="top",h=i,c=e.y+e.height,p=o,u=t.y):(l="top",d="bottom",h=i,c=e.y,p=o,u=t.y+t.height),{fromX:h,fromY:c,fromSide:l,toX:p,toY:u,toSide:d}}drawArrowHead(e,t,i,s,o,n){const a=Math.atan2(o-i,s-t),r=n?10:8;e.fillStyle=n?"#EB5601":"#8b7355",e.beginPath(),e.moveTo(s,o),e.lineTo(s-r*Math.cos(a-Math.PI/6),o-r*Math.sin(a-Math.PI/6)),e.lineTo(s-r*Math.cos(a+Math.PI/6),o-r*Math.sin(a+Math.PI/6)),e.closePath(),e.fill()}bezierPoint(e,t,i,s,o){const n=1-o;return n*n*n*e+3*n*n*o*t+3*n*o*o*i+o*o*o*s}updateCodePanel(){var i,s,o,n;const e=document.getElementById("codeBlock"),t=document.querySelector(".code-filename");if(e&&this.selectedTable){const a=(s=(i=this.config)==null?void 0:i.tables)==null?void 0:s.find(l=>l.name===this.selectedTable),r=((n=(o=this.config)==null?void 0:o.allDocuments)==null?void 0:n[this.selectedTable])||[];if(a){const l={table:this.selectedTable,documentCount:a.documentCount,fields:{}};if(a.inferredFields)for(const d of a.inferredFields)l.fields[d.name]={type:d.type,required:!d.optional};r.length>0&&(l.sample=r[0]),e.innerHTML=this.syntaxHighlight(JSON.stringify(l,null,2))}}t&&this.selectedTable&&(t.textContent=`${this.selectedTable}.json`)}savePositionState(){const e={nodes:this.graphNodes.map(t=>({id:t.id,x:t.x,y:t.y})),panX:this.panX,panY:this.panY,zoom:this.zoom};this.historyIndex<this.positionHistory.length-1&&(this.positionHistory=this.positionHistory.slice(0,this.historyIndex+1)),this.positionHistory.push(e),this.positionHistory.length>this.maxHistorySize?this.positionHistory.shift():this.historyIndex++,this.updateUndoRedoButtons()}undo(){this.historyIndex<=0||(this.historyIndex--,this.restorePositionState(this.positionHistory[this.historyIndex]),this.updateUndoRedoButtons())}redo(){this.historyIndex>=this.positionHistory.length-1||(this.historyIndex++,this.restorePositionState(this.positionHistory[this.historyIndex]),this.updateUndoRedoButtons())}restorePositionState(e){for(const t of e.nodes){const i=this.graphNodes.find(s=>s.id===t.id);i&&(i.x=t.x,i.y=t.y)}this.panX=e.panX,this.panY=e.panY,this.zoom=e.zoom,this.updateZoomDisplay(),this.drawGraph()}updateUndoRedoButtons(){const e=document.getElementById("undoBtn"),t=document.getElementById("redoBtn");e&&(e.disabled=this.historyIndex<=0),t&&(t.disabled=this.historyIndex>=this.positionHistory.length-1)}fitToView(){if(this.graphNodes.length===0)return;const e=this.graphNodes.filter(p=>p.visible!==!1);if(e.length===0)return;const t=60,i=Math.min(...e.map(p=>p.x))-t,s=Math.max(...e.map(p=>p.x+p.width))+t,o=Math.min(...e.map(p=>p.y))-t,n=Math.max(...e.map(p=>p.y+p.height))+t,a=s-i,r=n-o;if(!this.canvas)return;const l=this.canvas.width/this.dpr,d=this.canvas.height/this.dpr,h=l/a,c=d/r;this.zoom=Math.min(h,c,1.5),this.zoom=Math.max(this.zoom,.25),this.panX=(l-a*this.zoom)/2-i*this.zoom,this.panY=(d-r*this.zoom)/2-o*this.zoom,this.updateZoomDisplay(),this.drawGraph()}autoArrange(){this.calculateGraphLayout(),this.fitToView(),this.savePositionState()}updateZoomDisplay(){const e=document.getElementById("zoomLevel"),t=document.getElementById("zoomDisplay"),i=`${Math.round(this.zoom*100)}%`;e&&(e.textContent=i),t&&(t.textContent=i)}toggleCodePanel(){this.showCodePanel=!this.showCodePanel;const e=document.getElementById("sidebarContainer"),t=document.getElementById("viewCodeBtn");e&&e.classList.toggle("hidden",!this.showCodePanel),t&&t.classList.toggle("active",this.showCodePanel),setTimeout(()=>this.resizeCanvas(),50)}toggleExportMenu(){this.showExportMenu=!this.showExportMenu,this.showFilterDropdown=!1,this.renderDropdowns()}toggleFilterDropdown(){this.showFilterDropdown=!this.showFilterDropdown,this.showExportMenu=!1,this.renderDropdowns()}renderDropdowns(){var t,i;(t=document.getElementById("exportMenu"))==null||t.remove(),(i=document.getElementById("filterMenu"))==null||i.remove();const e=document.querySelector(".graph-view");e&&(this.showExportMenu&&(e.insertAdjacentHTML("beforeend",this.renderExportMenu()),this.setupExportMenuEvents()),this.showFilterDropdown&&(e.insertAdjacentHTML("beforeend",this.renderFilterDropdown()),this.setupFilterMenuEvents()))}setupExportMenuEvents(){var e,t,i;(e=document.getElementById("exportJson"))==null||e.addEventListener("click",()=>{this.exportSchema("json"),this.showExportMenu=!1,this.renderDropdowns()}),(t=document.getElementById("exportTs"))==null||t.addEventListener("click",()=>{this.exportSchema("typescript"),this.showExportMenu=!1,this.renderDropdowns()}),(i=document.getElementById("exportPng"))==null||i.addEventListener("click",()=>{this.exportAsPng(),this.showExportMenu=!1,this.renderDropdowns()}),setTimeout(()=>{document.addEventListener("click",this.handleOutsideClick.bind(this),{once:!0})},0)}setupFilterMenuEvents(){var e,t,i;(e=document.getElementById("filterClose"))==null||e.addEventListener("click",()=>{this.showFilterDropdown=!1,this.renderDropdowns()}),(t=document.getElementById("filterApply"))==null||t.addEventListener("click",()=>{this.applyFilters()}),(i=document.getElementById("filterClear"))==null||i.addEventListener("click",()=>{this.clearFilters()})}handleOutsideClick(e){const t=document.getElementById("exportMenu"),i=document.getElementById("exportBtn"),s=document.getElementById("filterMenu"),o=document.getElementById("filterBtn");t&&!t.contains(e.target)&&!(i!=null&&i.contains(e.target))&&(this.showExportMenu=!1,this.renderDropdowns()),s&&!s.contains(e.target)&&!(o!=null&&o.contains(e.target))&&(this.showFilterDropdown=!1,this.renderDropdowns())}exportSchema(e){var n;const t=((n=this.config)==null?void 0:n.tables)||[];let i,s,o;if(e==="json"){const a={};for(const r of t)a[r.name]={documentCount:r.documentCount,fields:(r.inferredFields||[]).reduce((l,d)=>(l[d.name]={type:d.type,required:!d.optional},l),{})};i=JSON.stringify(a,null,2),s="convex-schema.json",o="application/json"}else{const a=['import { defineSchema, defineTable } from "convex/server";','import { v } from "convex/values";',"","export default defineSchema({"];for(const r of t){const l=(r.inferredFields||[]).filter(d=>!d.name.startsWith("_")).map(d=>` ${d.name}: ${this.toConvexValidator(d.type)}${d.optional?".optional()":""},`).join(`
519
519
  `);a.push(` ${r.name}: defineTable({`),l&&a.push(l),a.push(" }),")}a.push("});"),i=a.join(`
520
- `),s="schema.ts",o="text/typescript"}this.downloadFile(i,s,o)}toConvexValidator(e){return e.startsWith("Id<")?`v.id(${e.slice(3,-1)})`:e==="string"?"v.string()":e==="number"?"v.number()":e==="boolean"?"v.boolean()":e==="null"?"v.null()":e.startsWith("array")?"v.array(v.any())":e==="object"?"v.object({})":"v.any()"}exportAsPng(){if(!this.canvas)return;const e=document.createElement("a");e.download="convex-schema-graph.png",e.href=this.canvas.toDataURL("image/png"),e.click()}downloadFile(e,t,i){const s=new Blob([e],{type:i}),o=URL.createObjectURL(s),n=document.createElement("a");n.href=o,n.download=t,n.click(),URL.revokeObjectURL(o)}applyFilters(){var o,n,a,r;const e=((o=document.getElementById("filterTableName"))==null?void 0:o.value)||"",t=((n=document.getElementById("filterFieldName"))==null?void 0:n.value)||"",i=((a=document.getElementById("filterFieldType"))==null?void 0:a.value)||"",s=((r=document.getElementById("filterShowEmpty"))==null?void 0:r.checked)??!0;this.filterState={tableName:e,fieldName:t,fieldType:i,showEmpty:s};for(const l of this.graphNodes){let d=!0;e&&!l.table.name.toLowerCase().includes(e.toLowerCase())&&(d=!1),!s&&l.table.documentCount===0&&(d=!1),d&&(t||i)&&((l.table.inferredFields||[]).some(p=>{const g=!t||p.name.toLowerCase().includes(t.toLowerCase()),u=!i||p.type.toLowerCase().includes(i.toLowerCase());return g&&u})||(d=!1)),l.visible=d}this.drawGraph(),this.showFilterDropdown=!1,this.renderDropdowns()}clearFilters(){this.filterState={tableName:"",fieldName:"",fieldType:"",showEmpty:!0};const e=document.getElementById("filterTableName"),t=document.getElementById("filterFieldName"),i=document.getElementById("filterFieldType"),s=document.getElementById("filterShowEmpty");e&&(e.value=""),t&&(t.value=""),i&&(i.value=""),s&&(s.checked=!0);for(const o of this.graphNodes)o.visible=!0;this.drawGraph()}setupEventListeners(){var e,t,i,s,o,n,a,r,l,d,h,c,p,g,u,y,f,w,L,k,B;if(document.querySelectorAll(".view-btn").forEach(v=>{v.addEventListener("click",b=>{const T=b.currentTarget.dataset.view;T&&T!==this.viewMode&&(this.viewMode=T,this.render())})}),(e=document.getElementById("refreshBtn"))==null||e.addEventListener("click",()=>this.refresh()),(t=document.getElementById("themeToggle"))==null||t.addEventListener("click",()=>this.toggleTheme()),(i=document.getElementById("shortcutsBtn"))==null||i.addEventListener("click",()=>this.showShortcutsModal()),(s=document.getElementById("shortcutsClose"))==null||s.addEventListener("click",()=>this.hideShortcutsModal()),(o=document.getElementById("shortcutsModal"))==null||o.addEventListener("click",v=>{v.target.id==="shortcutsModal"&&this.hideShortcutsModal()}),this.viewMode==="graph"){(n=document.getElementById("viewCodeBtn"))==null||n.addEventListener("click",()=>this.toggleCodePanel()),(a=document.getElementById("exportBtn"))==null||a.addEventListener("click",b=>{b.stopPropagation(),this.toggleExportMenu()}),(r=document.getElementById("autoArrangeBtn"))==null||r.addEventListener("click",()=>this.autoArrange()),(l=document.getElementById("undoBtn"))==null||l.addEventListener("click",()=>this.undo()),(d=document.getElementById("redoBtn"))==null||d.addEventListener("click",()=>this.redo()),(h=document.getElementById("filterBtn"))==null||h.addEventListener("click",b=>{b.stopPropagation(),this.toggleFilterDropdown()}),(c=document.getElementById("zoomInToolbar"))==null||c.addEventListener("click",()=>{this.zoom=Math.min(2,this.zoom*1.2),this.updateZoomDisplay(),this.drawGraph()}),(p=document.getElementById("zoomOutToolbar"))==null||p.addEventListener("click",()=>{this.zoom=Math.max(.25,this.zoom/1.2),this.updateZoomDisplay(),this.drawGraph()}),(g=document.getElementById("fitViewBtn"))==null||g.addEventListener("click",()=>this.fitToView()),(u=document.getElementById("sectionHeaderTables"))==null||u.addEventListener("click",()=>{this.toggleSidebarSection("tables")}),(y=document.getElementById("sectionHeaderConvex"))==null||y.addEventListener("click",()=>{this.toggleSidebarSection("convex")}),(f=document.getElementById("sortBtn"))==null||f.addEventListener("click",()=>{this.cycleSortOrder()});const v=document.getElementById("graphSidebarSearch");v==null||v.addEventListener("input",b=>{this.searchQuery=b.target.value.toLowerCase(),this.updateSidebarTableList()}),(w=document.getElementById("graphSidebarToggle"))==null||w.addEventListener("click",()=>{this.graphSidebarCollapsed=!this.graphSidebarCollapsed;const b=document.getElementById("enhancedSidebar"),T=document.getElementById("graphSidebarToggle");if(b&&b.classList.toggle("collapsed",this.graphSidebarCollapsed),T){T.title=this.graphSidebarCollapsed?"Expand sidebar":"Collapse sidebar";const S=T.querySelector("svg path");S&&S.setAttribute("d",this.graphSidebarCollapsed?"M5 2L10 7L5 12":"M9 2L4 7L9 12")}setTimeout(()=>this.resizeCanvas(),50)}),this.setupSidebarTableEvents()}if((L=document.getElementById("sidebarToggle"))==null||L.addEventListener("click",()=>{this.sidebarCollapsed=!this.sidebarCollapsed;const v=document.getElementById("sidebarContainer"),b=document.getElementById("sidebarToggle");v&&v.classList.toggle("collapsed",this.sidebarCollapsed),b&&(b.title=this.sidebarCollapsed?"Show panel":"Hide panel"),this.viewMode==="graph"&&setTimeout(()=>this.resizeCanvas(),50)}),this.setupSidebarResize(),this.viewMode==="list"){(k=document.getElementById("prevPage"))==null||k.addEventListener("click",()=>this.changePage(-1)),(B=document.getElementById("nextPage"))==null||B.addEventListener("click",()=>this.changePage(1));const v=document.getElementById("searchInput");v==null||v.addEventListener("input",b=>{this.searchQuery=b.target.value.toLowerCase(),this.renderTableList()})}}setupSidebarResize(){const e=document.getElementById("resizeHandle");if(!e)return;let t=0,i=0;const s=n=>{if(!this.isResizingSidebar)return;const a=n.clientX-t,r=Math.max(180,Math.min(600,i+a));if(this.viewMode==="list"){this.sidebarWidth=r;const l=document.querySelector(".sidebar");l&&(l.style.width=r+"px")}else{this.codePanelWidth=r;const l=document.getElementById("codePanel");l&&(l.style.width=r+"px")}},o=()=>{this.isResizingSidebar=!1,e.classList.remove("dragging"),document.body.style.cursor="",document.body.style.userSelect="",document.removeEventListener("mousemove",s),document.removeEventListener("mouseup",o),this.viewMode==="graph"&&this.resizeCanvas()};e.addEventListener("mousedown",n=>{n.preventDefault(),this.isResizingSidebar=!0,t=n.clientX,i=this.viewMode==="list"?this.sidebarWidth:this.codePanelWidth,e.classList.add("dragging"),document.body.style.cursor="col-resize",document.body.style.userSelect="none",document.addEventListener("mousemove",s),document.addEventListener("mouseup",o)})}resizeCanvas(){if(!this.canvas||!this.canvas.parentElement||!this.ctx)return;const e=this.canvas.parentElement.clientWidth,t=this.canvas.parentElement.clientHeight;this.dpr=window.devicePixelRatio||1,this.canvas.width=e*this.dpr,this.canvas.height=t*this.dpr,this.canvas.style.width=e+"px",this.canvas.style.height=t+"px",this.ctx.setTransform(1,0,0,1,0,0),this.ctx.scale(this.dpr,this.dpr),this.drawGraph()}setupKeyboardShortcuts(){document.addEventListener("keydown",e=>{var t,i;if(e.target instanceof HTMLInputElement||e.target instanceof HTMLTextAreaElement){e.key==="Escape"&&e.target.blur();return}switch(e.key){case"r":this.refresh();break;case"g":this.viewMode=this.viewMode==="graph"?"list":"graph",this.render();break;case"b":(t=document.getElementById("sidebarToggle"))==null||t.click();break;case"c":this.viewMode==="graph"&&this.toggleCodePanel();break;case"a":this.viewMode==="graph"&&this.autoArrange();break;case"f":this.viewMode==="graph"&&this.fitToView();break;case"z":(e.metaKey||e.ctrlKey)&&this.viewMode==="graph"&&(e.preventDefault(),e.shiftKey?this.redo():this.undo());break;case"+":case"=":this.viewMode==="graph"&&(this.zoom=Math.min(2,this.zoom*1.2),this.updateZoomDisplay(),this.drawGraph());break;case"-":this.viewMode==="graph"&&(this.zoom=Math.max(.25,this.zoom/1.2),this.updateZoomDisplay(),this.drawGraph());break;case"ArrowLeft":this.viewMode==="list"&&this.changePage(-1);break;case"ArrowRight":this.viewMode==="list"&&this.changePage(1);break;case"ArrowUp":e.preventDefault(),this.viewMode==="list"&&this.navigateTable(-1);break;case"ArrowDown":e.preventDefault(),this.viewMode==="list"&&this.navigateTable(1);break;case"/":e.preventDefault(),(i=document.getElementById("searchInput"))==null||i.focus();break}})}renderTableList(){var s;const e=document.getElementById("tableList");if(!e)return;const t=((s=this.config)==null?void 0:s.tables)||[],i=t.filter(o=>o.name.toLowerCase().includes(this.searchQuery));if(i.length===0){e.innerHTML=`
520
+ `),s="schema.ts",o="text/typescript"}this.downloadFile(i,s,o)}toConvexValidator(e){return e.startsWith("Id<")?`v.id(${e.slice(3,-1)})`:e==="string"?"v.string()":e==="number"?"v.number()":e==="boolean"?"v.boolean()":e==="null"?"v.null()":e.startsWith("array")?"v.array(v.any())":e==="object"?"v.object({})":"v.any()"}exportAsPng(){if(!this.canvas)return;const e=document.createElement("a");e.download="convex-schema-graph.png",e.href=this.canvas.toDataURL("image/png"),e.click()}downloadFile(e,t,i){const s=new Blob([e],{type:i}),o=URL.createObjectURL(s),n=document.createElement("a");n.href=o,n.download=t,n.click(),URL.revokeObjectURL(o)}applyFilters(){var o,n,a,r;const e=((o=document.getElementById("filterTableName"))==null?void 0:o.value)||"",t=((n=document.getElementById("filterFieldName"))==null?void 0:n.value)||"",i=((a=document.getElementById("filterFieldType"))==null?void 0:a.value)||"",s=((r=document.getElementById("filterShowEmpty"))==null?void 0:r.checked)??!0;this.filterState={tableName:e,fieldName:t,fieldType:i,showEmpty:s};for(const l of this.graphNodes){let d=!0;e&&!l.table.name.toLowerCase().includes(e.toLowerCase())&&(d=!1),!s&&l.table.documentCount===0&&(d=!1),d&&(t||i)&&((l.table.inferredFields||[]).some(p=>{const u=!t||p.name.toLowerCase().includes(t.toLowerCase()),g=!i||p.type.toLowerCase().includes(i.toLowerCase());return u&&g})||(d=!1)),l.visible=d}this.drawGraph(),this.showFilterDropdown=!1,this.renderDropdowns()}clearFilters(){this.filterState={tableName:"",fieldName:"",fieldType:"",showEmpty:!0};const e=document.getElementById("filterTableName"),t=document.getElementById("filterFieldName"),i=document.getElementById("filterFieldType"),s=document.getElementById("filterShowEmpty");e&&(e.value=""),t&&(t.value=""),i&&(i.value=""),s&&(s.checked=!0);for(const o of this.graphNodes)o.visible=!0;this.drawGraph()}setupEventListeners(){var e,t,i,s,o,n,a,r,l,d,h,c,p,u,g,y,v,T,E,L,B;if(document.querySelectorAll(".view-btn").forEach(b=>{b.addEventListener("click",f=>{const w=f.currentTarget.dataset.view;w&&w!==this.viewMode&&(this.viewMode=w,this.render())})}),(e=document.getElementById("refreshBtn"))==null||e.addEventListener("click",()=>this.refresh()),(t=document.getElementById("themeToggle"))==null||t.addEventListener("click",()=>this.toggleTheme()),(i=document.getElementById("shortcutsBtn"))==null||i.addEventListener("click",()=>this.showShortcutsModal()),(s=document.getElementById("shortcutsClose"))==null||s.addEventListener("click",()=>this.hideShortcutsModal()),(o=document.getElementById("shortcutsModal"))==null||o.addEventListener("click",b=>{b.target.id==="shortcutsModal"&&this.hideShortcutsModal()}),this.viewMode==="graph"){(n=document.getElementById("viewCodeBtn"))==null||n.addEventListener("click",()=>this.toggleCodePanel()),(a=document.getElementById("exportBtn"))==null||a.addEventListener("click",f=>{f.stopPropagation(),this.toggleExportMenu()}),(r=document.getElementById("autoArrangeBtn"))==null||r.addEventListener("click",()=>this.autoArrange()),(l=document.getElementById("undoBtn"))==null||l.addEventListener("click",()=>this.undo()),(d=document.getElementById("redoBtn"))==null||d.addEventListener("click",()=>this.redo()),(h=document.getElementById("filterBtn"))==null||h.addEventListener("click",f=>{f.stopPropagation(),this.toggleFilterDropdown()}),(c=document.getElementById("zoomInToolbar"))==null||c.addEventListener("click",()=>{this.zoom=Math.min(2,this.zoom*1.2),this.updateZoomDisplay(),this.drawGraph()}),(p=document.getElementById("zoomOutToolbar"))==null||p.addEventListener("click",()=>{this.zoom=Math.max(.25,this.zoom/1.2),this.updateZoomDisplay(),this.drawGraph()}),(u=document.getElementById("fitViewBtn"))==null||u.addEventListener("click",()=>this.fitToView()),(g=document.getElementById("sectionHeaderTables"))==null||g.addEventListener("click",()=>{this.toggleSidebarSection("tables")}),(y=document.getElementById("sectionHeaderConvex"))==null||y.addEventListener("click",()=>{this.toggleSidebarSection("convex")}),(v=document.getElementById("sortBtn"))==null||v.addEventListener("click",()=>{this.cycleSortOrder()});const b=document.getElementById("graphSidebarSearch");b==null||b.addEventListener("input",f=>{this.searchQuery=f.target.value.toLowerCase(),this.updateSidebarTableList()}),(T=document.getElementById("graphSidebarToggle"))==null||T.addEventListener("click",()=>{this.graphSidebarCollapsed=!this.graphSidebarCollapsed;const f=document.getElementById("enhancedSidebar"),w=document.getElementById("graphSidebarToggle");if(f&&f.classList.toggle("collapsed",this.graphSidebarCollapsed),w){w.title=this.graphSidebarCollapsed?"Expand sidebar":"Collapse sidebar";const k=w.querySelector("svg path");k&&k.setAttribute("d",this.graphSidebarCollapsed?"M5 2L10 7L5 12":"M9 2L4 7L9 12")}setTimeout(()=>this.resizeCanvas(),50)}),this.setupSidebarTableEvents()}if((E=document.getElementById("sidebarToggle"))==null||E.addEventListener("click",()=>{this.sidebarCollapsed=!this.sidebarCollapsed;const b=document.getElementById("sidebarContainer"),f=document.getElementById("sidebarToggle");b&&b.classList.toggle("collapsed",this.sidebarCollapsed),f&&(f.title=this.sidebarCollapsed?"Show panel":"Hide panel"),this.viewMode==="graph"&&setTimeout(()=>this.resizeCanvas(),50)}),this.setupSidebarResize(),this.viewMode==="list"){(L=document.getElementById("prevPage"))==null||L.addEventListener("click",()=>this.changePage(-1)),(B=document.getElementById("nextPage"))==null||B.addEventListener("click",()=>this.changePage(1));const b=document.getElementById("searchInput");b==null||b.addEventListener("input",f=>{this.searchQuery=f.target.value.toLowerCase(),this.renderTableList()})}}setupSidebarResize(){const e=document.getElementById("resizeHandle");if(!e)return;let t=0,i=0;const s=n=>{if(!this.isResizingSidebar)return;const a=n.clientX-t,r=Math.max(180,Math.min(600,i+a));if(this.viewMode==="list"){this.sidebarWidth=r;const l=document.querySelector(".sidebar");l&&(l.style.width=r+"px")}else{this.codePanelWidth=r;const l=document.getElementById("codePanel");l&&(l.style.width=r+"px")}},o=()=>{this.isResizingSidebar=!1,e.classList.remove("dragging"),document.body.style.cursor="",document.body.style.userSelect="",document.removeEventListener("mousemove",s),document.removeEventListener("mouseup",o),this.viewMode==="graph"&&this.resizeCanvas()};e.addEventListener("mousedown",n=>{n.preventDefault(),this.isResizingSidebar=!0,t=n.clientX,i=this.viewMode==="list"?this.sidebarWidth:this.codePanelWidth,e.classList.add("dragging"),document.body.style.cursor="col-resize",document.body.style.userSelect="none",document.addEventListener("mousemove",s),document.addEventListener("mouseup",o)})}resizeCanvas(){if(!this.canvas||!this.canvas.parentElement||!this.ctx)return;const e=this.canvas.parentElement.clientWidth,t=this.canvas.parentElement.clientHeight;this.dpr=window.devicePixelRatio||1,this.canvas.width=e*this.dpr,this.canvas.height=t*this.dpr,this.canvas.style.width=e+"px",this.canvas.style.height=t+"px",this.ctx.setTransform(1,0,0,1,0,0),this.ctx.scale(this.dpr,this.dpr),this.drawGraph()}setupKeyboardShortcuts(){document.addEventListener("keydown",e=>{var t,i;if(e.target instanceof HTMLInputElement||e.target instanceof HTMLTextAreaElement){e.key==="Escape"&&e.target.blur();return}switch(e.key){case"r":this.refresh();break;case"g":this.viewMode=this.viewMode==="graph"?"list":"graph",this.render();break;case"b":(t=document.getElementById("sidebarToggle"))==null||t.click();break;case"c":this.viewMode==="graph"&&this.toggleCodePanel();break;case"a":this.viewMode==="graph"&&this.autoArrange();break;case"f":this.viewMode==="graph"&&this.fitToView();break;case"z":(e.metaKey||e.ctrlKey)&&this.viewMode==="graph"&&(e.preventDefault(),e.shiftKey?this.redo():this.undo());break;case"+":case"=":this.viewMode==="graph"&&(this.zoom=Math.min(2,this.zoom*1.2),this.updateZoomDisplay(),this.drawGraph());break;case"-":this.viewMode==="graph"&&(this.zoom=Math.max(.25,this.zoom/1.2),this.updateZoomDisplay(),this.drawGraph());break;case"ArrowLeft":this.viewMode==="list"&&this.changePage(-1);break;case"ArrowRight":this.viewMode==="list"&&this.changePage(1);break;case"ArrowUp":e.preventDefault(),this.viewMode==="list"&&this.navigateTable(-1);break;case"ArrowDown":e.preventDefault(),this.viewMode==="list"&&this.navigateTable(1);break;case"/":e.preventDefault(),(i=document.getElementById("searchInput"))==null||i.focus();break}})}renderTableList(){var s;const e=document.getElementById("tableList");if(!e)return;const t=((s=this.config)==null?void 0:s.tables)||[],i=t.filter(o=>o.name.toLowerCase().includes(this.searchQuery));if(i.length===0){e.innerHTML=`
521
521
  <li class="empty-state" style="padding: 30px 20px;">
522
522
  <p>${t.length===0?"No tables found":"No matching tables"}</p>
523
523
  </li>
@@ -562,6 +562,6 @@ var V=Object.defineProperty;var X=(E,e,t)=>e in E?V(E,e,{enumerable:!0,configura
562
562
  </div>
563
563
  `).join("")}renderDocuments(e){const t=document.getElementById("docTableHead"),i=document.getElementById("docTableBody");if(!t||!i)return;const s=(this.currentPage-1)*this.pageSize,o=s+this.pageSize,n=e.slice(s,o),a=Math.ceil(e.length/this.pageSize);if(n.length===0){t.innerHTML="",i.innerHTML='<tr><td colspan="100" class="empty-state">No documents found</td></tr>';return}const r=[...new Set(n.flatMap(d=>Object.keys(d)))];r.sort((d,h)=>{const c=d.startsWith("_"),p=h.startsWith("_");return c&&!p?-1:!c&&p?1:d.localeCompare(h)}),t.innerHTML=`<tr>${r.map(d=>`<th>${d}</th>`).join("")}</tr>`,i.innerHTML=n.map(d=>`
564
564
  <tr>
565
- ${r.map(h=>{const c=d[h],p=h==="_id",g=c==null;return`<td class="${[p?"id-cell":"",g?"null-value":""].filter(Boolean).join(" ")}">${this.formatValue(c)}</td>`}).join("")}
565
+ ${r.map(h=>{const c=d[h],p=h==="_id",u=c==null;return`<td class="${[p?"id-cell":"",u?"null-value":""].filter(Boolean).join(" ")}">${this.formatValue(c)}</td>`}).join("")}
566
566
  </tr>
567
- `).join("");const l=document.getElementById("pageInfo");l&&(l.textContent=`Page ${this.currentPage} of ${a||1}`),document.getElementById("prevPage").disabled=this.currentPage<=1,document.getElementById("nextPage").disabled=this.currentPage>=a}formatValue(e){if(e==null)return'<span class="null-value">null</span>';if(typeof e=="object"){const t=JSON.stringify(e);return t.length>50?t.slice(0,50)+"...":t}return typeof e=="string"&&e.length>50?e.slice(0,50)+"...":String(e)}changePage(e){var r,l,d,h;const t=(l=(r=this.config)==null?void 0:r.tables)==null?void 0:l.find(c=>c.name===this.selectedTable),i=((h=(d=this.config)==null?void 0:d.allDocuments)==null?void 0:h[this.selectedTable||""])||(t==null?void 0:t.documents)||[],s=Math.ceil(i.length/this.pageSize),o=this.currentPage+e;if(o<1||o>s)return;this.currentPage=o;const n=document.getElementById("documentsTableWrapper");n&&(n.innerHTML=this.renderDocumentsTable(i));const a=document.querySelector(".pagination-bar");a&&(a.outerHTML=this.renderPaginationBar(i),this.setupListViewEventListeners())}refresh(){if(this.viewMode==="graph")this.calculateGraphLayout(),this.drawGraph();else if(this.selectedTable){const e=document.getElementById("listViewContent");e&&(e.innerHTML=this.renderListViewContent(),this.setupListViewEventListeners())}}}new Y;
567
+ `).join("");const l=document.getElementById("pageInfo");l&&(l.textContent=`Page ${this.currentPage} of ${a||1}`),document.getElementById("prevPage").disabled=this.currentPage<=1,document.getElementById("nextPage").disabled=this.currentPage>=a}formatValue(e){if(e==null)return'<span class="null-value">null</span>';if(typeof e=="object"){const t=JSON.stringify(e);return t.length>50?t.slice(0,50)+"...":t}return typeof e=="string"&&e.length>50?e.slice(0,50)+"...":String(e)}changePage(e){var r,l,d,h;const t=(l=(r=this.config)==null?void 0:r.tables)==null?void 0:l.find(c=>c.name===this.selectedTable),i=((h=(d=this.config)==null?void 0:d.allDocuments)==null?void 0:h[this.selectedTable||""])||(t==null?void 0:t.documents)||[],s=Math.ceil(i.length/this.pageSize),o=this.currentPage+e;if(o<1||o>s)return;this.currentPage=o;const n=document.getElementById("documentsTableWrapper");n&&(n.innerHTML=this.renderDocumentsTable(i));const a=document.querySelector(".pagination-bar");a&&(a.outerHTML=this.renderPaginationBar(i),this.setupListViewEventListeners())}refresh(){if(this.viewMode==="graph")this.calculateGraphLayout(),this.drawGraph();else if(this.selectedTable){const e=document.getElementById("listViewContent");e&&(e.innerHTML=this.renderListViewContent(),this.setupListViewEventListeners())}}}new X;
@@ -283,11 +283,7 @@ function simplifyType(type) {
283
283
  /**
284
284
  * Generate HTML page for diagram viewer
285
285
  */
286
- function generateDiagramHtml(svg, mermaidCode, theme) {
287
- const isDark = theme.includes("dark") ||
288
- theme === "tokyo-night" ||
289
- theme === "dracula" ||
290
- theme === "nord";
286
+ function generateDiagramHtml(svg, mermaidCode, _theme) {
291
287
  return `<!DOCTYPE html>
292
288
  <html lang="en">
293
289
  <head>
@@ -296,10 +292,32 @@ function generateDiagramHtml(svg, mermaidCode, theme) {
296
292
  <title>Schema Diagram</title>
297
293
  <style>
298
294
  * { box-sizing: border-box; margin: 0; padding: 0; }
295
+
296
+ :root {
297
+ /* Light Mode (Tan) - Default */
298
+ --bg-primary: #faf8f5;
299
+ --bg-secondary: #f5f3f0;
300
+ --bg-hover: #ebe9e6;
301
+ --text-primary: #1a1a1a;
302
+ --text-secondary: #6b6b6b;
303
+ --border: #e6e4e1;
304
+ --card-bg: #ffffff;
305
+ }
306
+
307
+ [data-theme="dark"] {
308
+ --bg-primary: #1e1e1e;
309
+ --bg-secondary: #252526;
310
+ --bg-hover: #37373d;
311
+ --text-primary: #cccccc;
312
+ --text-secondary: #8b8b8b;
313
+ --border: #3c3c3c;
314
+ --card-bg: #252526;
315
+ }
316
+
299
317
  body {
300
318
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
301
- background: ${isDark ? "#1e1e1e" : "#faf8f5"};
302
- color: ${isDark ? "#cccccc" : "#1a1a1a"};
319
+ background: var(--bg-primary);
320
+ color: var(--text-primary);
303
321
  min-height: 100vh;
304
322
  padding: 20px;
305
323
  }
@@ -309,7 +327,12 @@ function generateDiagramHtml(svg, mermaidCode, theme) {
309
327
  align-items: center;
310
328
  margin-bottom: 20px;
311
329
  padding-bottom: 16px;
312
- border-bottom: 1px solid ${isDark ? "#3c3c3c" : "#e6e4e1"};
330
+ border-bottom: 1px solid var(--border);
331
+ }
332
+ .header-left {
333
+ display: flex;
334
+ align-items: center;
335
+ gap: 12px;
313
336
  }
314
337
  h1 {
315
338
  font-size: 20px;
@@ -323,9 +346,40 @@ function generateDiagramHtml(svg, mermaidCode, theme) {
323
346
  border-radius: 50%;
324
347
  background: #4a8c5c;
325
348
  }
349
+ .header-actions {
350
+ display: flex;
351
+ align-items: center;
352
+ gap: 8px;
353
+ }
354
+ .theme-toggle {
355
+ width: 36px;
356
+ height: 36px;
357
+ background: var(--bg-hover);
358
+ border: 1px solid var(--border);
359
+ border-radius: 8px;
360
+ cursor: pointer;
361
+ display: flex;
362
+ align-items: center;
363
+ justify-content: center;
364
+ color: var(--text-secondary);
365
+ transition: all 0.2s ease;
366
+ }
367
+ .theme-toggle:hover {
368
+ background: #eb5601;
369
+ border-color: #eb5601;
370
+ color: white;
371
+ }
372
+ .theme-toggle svg {
373
+ width: 18px;
374
+ height: 18px;
375
+ }
376
+ .theme-toggle .sun-icon { display: none; }
377
+ .theme-toggle .moon-icon { display: block; }
378
+ [data-theme="dark"] .theme-toggle .sun-icon { display: block; }
379
+ [data-theme="dark"] .theme-toggle .moon-icon { display: none; }
326
380
  .diagram-container {
327
- background: ${isDark ? "#252526" : "#ffffff"};
328
- border: 1px solid ${isDark ? "#3c3c3c" : "#e6e4e1"};
381
+ background: var(--card-bg);
382
+ border: 1px solid var(--border);
329
383
  border-radius: 12px;
330
384
  padding: 20px;
331
385
  overflow: auto;
@@ -349,33 +403,53 @@ function generateDiagramHtml(svg, mermaidCode, theme) {
349
403
  font-weight: 600;
350
404
  }
351
405
  .copy-btn {
352
- background: ${isDark ? "#37373d" : "#f5f3f0"};
353
- border: 1px solid ${isDark ? "#3c3c3c" : "#e6e4e1"};
354
- color: ${isDark ? "#cccccc" : "#1a1a1a"};
406
+ background: var(--bg-secondary);
407
+ border: 1px solid var(--border);
408
+ color: var(--text-primary);
355
409
  padding: 6px 12px;
356
410
  border-radius: 6px;
357
411
  cursor: pointer;
358
412
  font-size: 12px;
359
413
  }
360
414
  .copy-btn:hover {
361
- background: ${isDark ? "#4a4a4f" : "#ebe9e6"};
415
+ background: var(--bg-hover);
362
416
  }
363
417
  pre {
364
- background: ${isDark ? "#1e1e1e" : "#f5f3f0"};
365
- border: 1px solid ${isDark ? "#3c3c3c" : "#e6e4e1"};
418
+ background: var(--bg-secondary);
419
+ border: 1px solid var(--border);
366
420
  border-radius: 8px;
367
421
  padding: 16px;
368
422
  overflow-x: auto;
369
423
  font-family: 'SF Mono', Monaco, monospace;
370
424
  font-size: 13px;
371
425
  line-height: 1.5;
426
+ color: var(--text-primary);
372
427
  }
373
428
  </style>
374
429
  </head>
375
430
  <body>
376
431
  <div class="header">
377
- <h1><span class="status-dot"></span> Schema Diagram</h1>
378
- <span style="font-size: 12px; color: ${isDark ? "#8b8b8b" : "#6b6b6b"};">Theme: ${theme}</span>
432
+ <div class="header-left">
433
+ <h1><span class="status-dot"></span> Schema Diagram</h1>
434
+ </div>
435
+ <div class="header-actions">
436
+ <button class="theme-toggle" onclick="toggleTheme()" title="Toggle dark/light mode">
437
+ <svg class="moon-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
438
+ <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
439
+ </svg>
440
+ <svg class="sun-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
441
+ <circle cx="12" cy="12" r="5"></circle>
442
+ <line x1="12" y1="1" x2="12" y2="3"></line>
443
+ <line x1="12" y1="21" x2="12" y2="23"></line>
444
+ <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
445
+ <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
446
+ <line x1="1" y1="12" x2="3" y2="12"></line>
447
+ <line x1="21" y1="12" x2="23" y2="12"></line>
448
+ <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
449
+ <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
450
+ </svg>
451
+ </button>
452
+ </div>
379
453
  </div>
380
454
 
381
455
  <div class="diagram-container">
@@ -391,6 +465,17 @@ function generateDiagramHtml(svg, mermaidCode, theme) {
391
465
  </div>
392
466
 
393
467
  <script>
468
+ function toggleTheme() {
469
+ const html = document.documentElement;
470
+ const currentTheme = html.getAttribute('data-theme');
471
+ // Toggle between dark and light (no persistence)
472
+ if (currentTheme === 'dark') {
473
+ html.removeAttribute('data-theme');
474
+ } else {
475
+ html.setAttribute('data-theme', 'dark');
476
+ }
477
+ }
478
+
394
479
  function copyCode() {
395
480
  const code = document.getElementById('mermaid-code').textContent;
396
481
  navigator.clipboard.writeText(code).then(() => {
@@ -399,6 +484,7 @@ function generateDiagramHtml(svg, mermaidCode, theme) {
399
484
  setTimeout(() => { btn.textContent = 'Copy'; }, 2000);
400
485
  });
401
486
  }
487
+ // Always start in tan (light) mode - no initialization needed
402
488
  </script>
403
489
  </body>
404
490
  </html>`;
@@ -1 +1 @@
1
- {"version":3,"file":"schema-diagram.js","sourceRoot":"","sources":["../../src/tools/schema-diagram.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema-diagram.js","sourceRoot":"","sources":["../../src/tools/schema-diagram.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"shared-styles.d.ts","sourceRoot":"","sources":["../../src/tools/shared-styles.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAiexC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAmB3C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAoB7C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO9C"}
1
+ {"version":3,"file":"shared-styles.d.ts","sourceRoot":"","sources":["../../src/tools/shared-styles.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAiexC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAmB3C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAc7C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO9C"}
@@ -519,20 +519,14 @@ export function getThemeToggleScript() {
519
519
  function toggleTheme() {
520
520
  const html = document.documentElement;
521
521
  const currentTheme = html.getAttribute('data-theme');
522
- const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
523
- html.setAttribute('data-theme', newTheme);
524
- localStorage.setItem('convex-mcp-theme', newTheme);
525
- }
526
-
527
- // Initialize theme from localStorage or system preference
528
- (function() {
529
- const stored = localStorage.getItem('convex-mcp-theme');
530
- if (stored) {
531
- document.documentElement.setAttribute('data-theme', stored);
532
- } else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
533
- document.documentElement.setAttribute('data-theme', 'dark');
522
+ // Toggle between dark and light (no persistence)
523
+ if (currentTheme === 'dark') {
524
+ html.removeAttribute('data-theme');
525
+ } else {
526
+ html.setAttribute('data-theme', 'dark');
534
527
  }
535
- })();
528
+ }
529
+ // Always start in tan (light) mode - no attribute needed
536
530
  `;
537
531
  }
538
532
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"shared-styles.js","sourceRoot":"","sources":["../../src/tools/shared-styles.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+dN,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;GAiBN,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO;;;;;;;;;;;;;;;;;;GAkBN,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,IAAI,SAAS,GAAG,IAAI;QAAE,OAAO,WAAW,CAAC;IACzC,IAAI,SAAS,GAAG,GAAG;QAAE,OAAO,WAAW,CAAC;IACxC,IAAI,SAAS,GAAG,IAAI;QAAE,OAAO,UAAU,CAAC;IACxC,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"shared-styles.js","sourceRoot":"","sources":["../../src/tools/shared-styles.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+dN,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;GAiBN,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO;;;;;;;;;;;;GAYN,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,IAAI,SAAS,GAAG,IAAI;QAAE,OAAO,WAAW,CAAC;IACzC,IAAI,SAAS,GAAG,GAAG;QAAE,OAAO,WAAW,CAAC;IACxC,IAAI,SAAS,GAAG,IAAI;QAAE,OAAO,UAAU,CAAC;IACxC,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "convex-mcp-visual",
3
- "version": "1.4.2",
3
+ "version": "1.4.4",
4
4
  "description": "Visual MCP tools for exploring Convex databases - schema browser, dashboard, ER diagrams. Works as CLI, MCP server, or Claude Code plugin.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",