@aaronbassett/midnight-local-devnet 0.3.1 → 0.5.0

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.
@@ -126,7 +126,6 @@ export function generateDashboardHtml({ wsUrl }) {
126
126
  border: 1px solid var(--mn-border);
127
127
  border-radius: 12px;
128
128
  position: relative;
129
- overflow: hidden;
130
129
  }
131
130
 
132
131
  .header::before {
@@ -138,6 +137,8 @@ export function generateDashboardHtml({ wsUrl }) {
138
137
  height: 300px;
139
138
  background: radial-gradient(circle, rgba(59, 59, 255, 0.12) 0%, transparent 70%);
140
139
  pointer-events: none;
140
+ border-radius: inherit;
141
+ clip-path: inset(0 0 0 0 round 12px);
141
142
  }
142
143
 
143
144
  .header-left {
@@ -681,6 +682,95 @@ export function generateDashboardHtml({ wsUrl }) {
681
682
  margin-top: 20px;
682
683
  }
683
684
 
685
+ .modal-textarea {
686
+ width: 100%;
687
+ padding: 10px 12px;
688
+ background: var(--mn-bg);
689
+ border: 1px solid var(--mn-border);
690
+ border-radius: 8px;
691
+ color: var(--mn-text);
692
+ font-size: 13px;
693
+ resize: vertical;
694
+ min-height: 60px;
695
+ box-sizing: border-box;
696
+ }
697
+
698
+ .modal-textarea:focus {
699
+ outline: none;
700
+ border-color: var(--mn-accent);
701
+ }
702
+
703
+ .mnemonic-display {
704
+ padding: 14px;
705
+ background: var(--mn-bg);
706
+ border: 1px solid var(--mn-border);
707
+ border-radius: 8px;
708
+ font-family: 'JetBrains Mono', monospace;
709
+ font-size: 13px;
710
+ line-height: 1.8;
711
+ color: var(--mn-text);
712
+ word-spacing: 6px;
713
+ user-select: all;
714
+ }
715
+
716
+ .mnemonic-warning {
717
+ display: flex;
718
+ align-items: flex-start;
719
+ gap: 8px;
720
+ padding: 10px 12px;
721
+ background: rgba(234, 179, 8, 0.08);
722
+ border: 1px solid rgba(234, 179, 8, 0.25);
723
+ border-radius: 8px;
724
+ font-size: 12px;
725
+ color: var(--mn-warning);
726
+ margin-bottom: 14px;
727
+ }
728
+
729
+ .file-drop-zone {
730
+ position: relative;
731
+ border: 2px dashed var(--mn-border);
732
+ border-radius: 8px;
733
+ padding: 24px;
734
+ text-align: center;
735
+ cursor: pointer;
736
+ transition: border-color 0.15s, background 0.15s;
737
+ }
738
+
739
+ .file-drop-zone:hover {
740
+ border-color: var(--mn-accent);
741
+ background: rgba(59, 59, 255, 0.04);
742
+ }
743
+
744
+ .file-drop-zone input[type="file"] {
745
+ position: absolute;
746
+ inset: 0;
747
+ opacity: 0;
748
+ cursor: pointer;
749
+ }
750
+
751
+ .file-preview-table {
752
+ width: 100%;
753
+ font-size: 12px;
754
+ border-collapse: collapse;
755
+ margin-top: 10px;
756
+ }
757
+
758
+ .file-preview-table th,
759
+ .file-preview-table td {
760
+ text-align: left;
761
+ padding: 6px 8px;
762
+ border-bottom: 1px solid var(--mn-border);
763
+ }
764
+
765
+ .file-preview-table th {
766
+ color: var(--mn-text-muted);
767
+ font-weight: 500;
768
+ }
769
+
770
+ .file-preview-table td.mono {
771
+ font-family: 'JetBrains Mono', monospace;
772
+ }
773
+
684
774
  /* --- Wallet Selector Dropdown --- */
685
775
  .wallet-selector {
686
776
  display: flex;
@@ -1030,6 +1120,9 @@ export function generateDashboardHtml({ wsUrl }) {
1030
1120
  plus: html\`<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/><path d="M12 5v14"/></svg>\`,
1031
1121
  x: html\`<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg>\`,
1032
1122
  settings: html\`<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"/><circle cx="12" cy="12" r="3"/></svg>\`,
1123
+ refresh: html\`<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"/><path d="M21 3v5h-5"/><path d="M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"/><path d="M8 16H3v5"/></svg>\`,
1124
+ upload: html\`<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" x2="12" y1="3" y2="15"/></svg>\`,
1125
+ key: html\`<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4"/><path d="m21 2-9.3 9.3"/><circle cx="7.5" cy="15.5" r="5.5"/></svg>\`,
1033
1126
  };
1034
1127
 
1035
1128
  // --- WebSocket URL (injected at generation time) ---
@@ -1093,6 +1186,7 @@ export function generateDashboardHtml({ wsUrl }) {
1093
1186
  networkStatus: 'unknown',
1094
1187
  walletSyncStatus: 'idle',
1095
1188
  serverTime: '',
1189
+ walletBalances: {},
1096
1190
  };
1097
1191
 
1098
1192
  // --- Toast component ---
@@ -1351,8 +1445,31 @@ export function generateDashboardHtml({ wsUrl }) {
1351
1445
  localStorage.setItem(WALLETS_KEY, JSON.stringify(wallets));
1352
1446
  }
1353
1447
 
1448
+ // --- localStorage helpers for wallet mnemonics (keyed by address) ---
1449
+ const MNEMONICS_KEY = 'mn-mnemonics';
1450
+
1451
+ function loadMnemonics() {
1452
+ try {
1453
+ const raw = localStorage.getItem(MNEMONICS_KEY);
1454
+ if (raw) return JSON.parse(raw);
1455
+ } catch (e) { /* ignore */ }
1456
+ return {};
1457
+ }
1458
+
1459
+ function saveMnemonic(address, mnemonic) {
1460
+ const all = loadMnemonics();
1461
+ all[address] = mnemonic;
1462
+ localStorage.setItem(MNEMONICS_KEY, JSON.stringify(all));
1463
+ }
1464
+
1465
+ function removeMnemonic(address) {
1466
+ const all = loadMnemonics();
1467
+ delete all[address];
1468
+ localStorage.setItem(MNEMONICS_KEY, JSON.stringify(all));
1469
+ }
1470
+
1354
1471
  // --- ImportWalletModal ---
1355
- function ImportWalletModal({ onClose, onImport, sendMessage, deriveResult }) {
1472
+ function ImportWalletModal({ onClose, onImport, sendMessage, deriveResult, deriveAccountsResult }) {
1356
1473
  const [tab, setTab] = useState('mnemonic');
1357
1474
  const [mnemonic, setMnemonic] = useState('');
1358
1475
  const [address, setAddress] = useState('');
@@ -1360,6 +1477,12 @@ export function generateDashboardHtml({ wsUrl }) {
1360
1477
  const [deriving, setDeriving] = useState(false);
1361
1478
  const [derivedAddress, setDerivedAddress] = useState(null);
1362
1479
 
1480
+ // File import state
1481
+ const [fileAccounts, setFileAccounts] = useState(null);
1482
+ const [fileError, setFileError] = useState(null);
1483
+ const [derivingFile, setDerivingFile] = useState(false);
1484
+ const [fileResults, setFileResults] = useState(null);
1485
+
1363
1486
  // Watch for derive-result coming in
1364
1487
  useEffect(() => {
1365
1488
  if (deriveResult && deriving) {
@@ -1368,6 +1491,14 @@ export function generateDashboardHtml({ wsUrl }) {
1368
1491
  }
1369
1492
  }, [deriveResult, deriving]);
1370
1493
 
1494
+ // Watch for derive-accounts-result
1495
+ useEffect(() => {
1496
+ if (deriveAccountsResult && derivingFile) {
1497
+ setFileResults(deriveAccountsResult);
1498
+ setDerivingFile(false);
1499
+ }
1500
+ }, [deriveAccountsResult, derivingFile]);
1501
+
1371
1502
  const handleDerive = useCallback(() => {
1372
1503
  if (!mnemonic.trim()) return;
1373
1504
  setDeriving(true);
@@ -1375,6 +1506,63 @@ export function generateDashboardHtml({ wsUrl }) {
1375
1506
  sendMessage({ type: 'command', action: 'derive-address', mnemonic: mnemonic.trim() });
1376
1507
  }, [mnemonic, sendMessage]);
1377
1508
 
1509
+ const handleFileSelect = useCallback((e) => {
1510
+ const file = e.target.files[0];
1511
+ if (!file) return;
1512
+ setFileError(null);
1513
+ setFileResults(null);
1514
+ const reader = new FileReader();
1515
+ reader.onload = (ev) => {
1516
+ try {
1517
+ const data = JSON.parse(ev.target.result);
1518
+ if (!data.accounts || !Array.isArray(data.accounts)) {
1519
+ setFileError('Invalid format: expected { "accounts": [...] }');
1520
+ return;
1521
+ }
1522
+ const withMnemonic = data.accounts.filter(a => a.mnemonic);
1523
+ if (withMnemonic.length === 0) {
1524
+ setFileError('No accounts with mnemonic phrases found');
1525
+ return;
1526
+ }
1527
+ setFileAccounts(withMnemonic);
1528
+ } catch (err) {
1529
+ setFileError('Failed to parse JSON: ' + err.message);
1530
+ }
1531
+ };
1532
+ reader.readAsText(file);
1533
+ }, []);
1534
+
1535
+ const handleDeriveFile = useCallback(() => {
1536
+ if (!fileAccounts) return;
1537
+ setDerivingFile(true);
1538
+ setFileResults(null);
1539
+ sendMessage({
1540
+ type: 'command',
1541
+ action: 'derive-accounts',
1542
+ accounts: fileAccounts.map(a => ({ name: a.name, mnemonic: a.mnemonic })),
1543
+ });
1544
+ }, [fileAccounts, sendMessage]);
1545
+
1546
+ const handleImportFile = useCallback(() => {
1547
+ if (!fileResults || !fileAccounts) return;
1548
+ for (let i = 0; i < fileResults.length; i++) {
1549
+ const account = fileResults[i];
1550
+ onImport({
1551
+ id: crypto.randomUUID(),
1552
+ publicKey: account.address,
1553
+ displayName: account.name || 'Imported Wallet',
1554
+ hasMnemonic: true,
1555
+ });
1556
+ // Store mnemonic and register with server for balance tracking
1557
+ const mnemonicStr = fileAccounts[i] && fileAccounts[i].mnemonic;
1558
+ if (mnemonicStr) {
1559
+ saveMnemonic(account.address, mnemonicStr);
1560
+ sendMessage({ type: 'command', action: 'register-wallet', mnemonic: mnemonicStr });
1561
+ }
1562
+ }
1563
+ onClose();
1564
+ }, [fileResults, fileAccounts, onImport, onClose, sendMessage]);
1565
+
1378
1566
  const handleImport = useCallback(() => {
1379
1567
  if (tab === 'mnemonic') {
1380
1568
  if (!derivedAddress) return;
@@ -1384,6 +1572,9 @@ export function generateDashboardHtml({ wsUrl }) {
1384
1572
  displayName: displayName.trim() || 'Imported Wallet',
1385
1573
  hasMnemonic: true,
1386
1574
  });
1575
+ // Store mnemonic locally and register with server for balance tracking
1576
+ saveMnemonic(derivedAddress, mnemonic.trim());
1577
+ sendMessage({ type: 'command', action: 'register-wallet', mnemonic: mnemonic.trim() });
1387
1578
  } else {
1388
1579
  if (!address.trim()) return;
1389
1580
  onImport({
@@ -1393,7 +1584,7 @@ export function generateDashboardHtml({ wsUrl }) {
1393
1584
  });
1394
1585
  }
1395
1586
  onClose();
1396
- }, [tab, derivedAddress, address, displayName, onImport, onClose]);
1587
+ }, [tab, derivedAddress, address, displayName, mnemonic, onImport, onClose, sendMessage]);
1397
1588
 
1398
1589
  return html\`
1399
1590
  <div class="modal-overlay" onClick=\${(e) => { if (e.target === e.currentTarget) onClose(); }}>
@@ -1403,10 +1594,73 @@ export function generateDashboardHtml({ wsUrl }) {
1403
1594
  <button class="modal-close" onClick=\${onClose}>\${icons.x}</button>
1404
1595
  </div>
1405
1596
  <div class="modal-tabs">
1597
+ <button class="modal-tab \${tab === 'file' ? 'active' : ''}" onClick=\${() => setTab('file')}>File</button>
1406
1598
  <button class="modal-tab \${tab === 'mnemonic' ? 'active' : ''}" onClick=\${() => { setTab('mnemonic'); setDerivedAddress(null); }}>Mnemonic</button>
1407
1599
  <button class="modal-tab \${tab === 'address' ? 'active' : ''}" onClick=\${() => setTab('address')}>Address</button>
1408
1600
  </div>
1409
- \${tab === 'mnemonic' ? html\`
1601
+ \${tab === 'file' ? html\`
1602
+ <div class="modal-field">
1603
+ <label class="modal-label">accounts.json File</label>
1604
+ <div class="file-drop-zone">
1605
+ <input type="file" accept=".json,application/json" onChange=\${handleFileSelect} />
1606
+ <div style="color: var(--mn-text-muted); font-size: 13px;">
1607
+ \${icons.upload} Click to select accounts.json
1608
+ </div>
1609
+ </div>
1610
+ </div>
1611
+ \${fileError ? html\`
1612
+ <div style="color: var(--mn-error); font-size: 12px; margin-bottom: 10px;">\${fileError}</div>
1613
+ \` : null}
1614
+ \${fileAccounts && !fileResults ? html\`
1615
+ <div style="margin-bottom: 14px;">
1616
+ <div style="font-size: 12px; color: var(--mn-text-muted); margin-bottom: 8px;">
1617
+ Found \${fileAccounts.length} account\${fileAccounts.length !== 1 ? 's' : ''} with mnemonics
1618
+ </div>
1619
+ <table class="file-preview-table">
1620
+ <thead><tr><th>Name</th><th>Mnemonic</th></tr></thead>
1621
+ <tbody>
1622
+ \${fileAccounts.map(a => html\`
1623
+ <tr>
1624
+ <td>\${a.name}</td>
1625
+ <td class="mono" style="color: var(--mn-text-muted);">\${a.mnemonic.split(' ').slice(0, 3).join(' ')}...</td>
1626
+ </tr>
1627
+ \`)}
1628
+ </tbody>
1629
+ </table>
1630
+ <div style="margin-top: 12px;">
1631
+ <button class="btn btn-primary" onClick=\${handleDeriveFile} disabled=\${derivingFile}>
1632
+ \${derivingFile ? html\`<span class="btn-spinner"></span> Deriving...
1633
+ \` : 'Derive Addresses'}
1634
+ </button>
1635
+ </div>
1636
+ </div>
1637
+ \` : null}
1638
+ \${fileResults ? html\`
1639
+ <div style="margin-bottom: 14px;">
1640
+ <div style="font-size: 12px; color: var(--mn-success); margin-bottom: 8px;">
1641
+ Derived \${fileResults.length} address\${fileResults.length !== 1 ? 'es' : ''}
1642
+ </div>
1643
+ <table class="file-preview-table">
1644
+ <thead><tr><th>Name</th><th>Address</th></tr></thead>
1645
+ <tbody>
1646
+ \${fileResults.map(a => html\`
1647
+ <tr>
1648
+ <td>\${a.name}</td>
1649
+ <td class="mono">\${truncateAddress(a.address)}</td>
1650
+ </tr>
1651
+ \`)}
1652
+ </tbody>
1653
+ </table>
1654
+ </div>
1655
+ \` : null}
1656
+ <div class="modal-actions">
1657
+ <button class="btn" onClick=\${onClose}>Cancel</button>
1658
+ <button class="btn btn-primary" onClick=\${handleImportFile}
1659
+ disabled=\${!fileResults}>
1660
+ Import \${fileResults ? fileResults.length : ''} Wallet\${fileResults && fileResults.length !== 1 ? 's' : ''}
1661
+ </button>
1662
+ </div>
1663
+ \` : tab === 'mnemonic' ? html\`
1410
1664
  <div class="modal-field">
1411
1665
  <label class="modal-label">Mnemonic Phrase</label>
1412
1666
  <input class="modal-input mono" type="text" placeholder="Enter mnemonic words..."
@@ -1422,32 +1676,133 @@ export function generateDashboardHtml({ wsUrl }) {
1422
1676
  </div>
1423
1677
  \` : null}
1424
1678
  </div>
1679
+ <div class="modal-field">
1680
+ <label class="modal-label">Display Name (optional)</label>
1681
+ <input class="modal-input" type="text" placeholder="e.g. My Wallet"
1682
+ value=\${displayName} onInput=\${e => setDisplayName(e.target.value)} />
1683
+ </div>
1684
+ <div class="modal-actions">
1685
+ <button class="btn" onClick=\${onClose}>Cancel</button>
1686
+ <button class="btn btn-primary" onClick=\${handleImport}
1687
+ disabled=\${!derivedAddress}>
1688
+ Import
1689
+ </button>
1690
+ </div>
1425
1691
  \` : html\`
1426
1692
  <div class="modal-field">
1427
1693
  <label class="modal-label">Public Key / Address</label>
1428
1694
  <input class="modal-input mono" type="text" placeholder="Paste public key..."
1429
1695
  value=\${address} onInput=\${e => setAddress(e.target.value)} />
1430
1696
  </div>
1697
+ <div class="modal-field">
1698
+ <label class="modal-label">Display Name (optional)</label>
1699
+ <input class="modal-input" type="text" placeholder="e.g. My Wallet"
1700
+ value=\${displayName} onInput=\${e => setDisplayName(e.target.value)} />
1701
+ </div>
1702
+ <div class="modal-actions">
1703
+ <button class="btn" onClick=\${onClose}>Cancel</button>
1704
+ <button class="btn btn-primary" onClick=\${handleImport}
1705
+ disabled=\${!address.trim()}>
1706
+ Import
1707
+ </button>
1708
+ </div>
1431
1709
  \`}
1432
- <div class="modal-field">
1433
- <label class="modal-label">Display Name (optional)</label>
1434
- <input class="modal-input" type="text" placeholder="e.g. My Wallet"
1435
- value=\${displayName} onInput=\${e => setDisplayName(e.target.value)} />
1436
- </div>
1437
- <div class="modal-actions">
1438
- <button class="btn" onClick=\${onClose}>Cancel</button>
1439
- <button class="btn btn-primary" onClick=\${handleImport}
1440
- disabled=\${tab === 'mnemonic' ? !derivedAddress : !address.trim()}>
1441
- Import
1442
- </button>
1710
+ </div>
1711
+ </div>
1712
+ \`;
1713
+ }
1714
+
1715
+ // --- GenerateWalletModal ---
1716
+ function GenerateWalletModal({ onClose, onImport, sendMessage, generateResult }) {
1717
+ const [generating, setGenerating] = useState(false);
1718
+ const [result, setResult] = useState(null);
1719
+ const [copied, setCopied] = useState(false);
1720
+
1721
+ useEffect(() => {
1722
+ if (generateResult && generating) {
1723
+ setResult(generateResult);
1724
+ setGenerating(false);
1725
+ }
1726
+ }, [generateResult, generating]);
1727
+
1728
+ const handleGenerate = useCallback(() => {
1729
+ setGenerating(true);
1730
+ setResult(null);
1731
+ setCopied(false);
1732
+ sendMessage({ type: 'command', action: 'generate-wallet' });
1733
+ }, [sendMessage]);
1734
+
1735
+ // Generate on mount
1736
+ useEffect(() => { handleGenerate(); }, []);
1737
+
1738
+ const handleCopy = useCallback(() => {
1739
+ if (!result) return;
1740
+ navigator.clipboard.writeText(result.mnemonic).then(() => {
1741
+ setCopied(true);
1742
+ setTimeout(() => setCopied(false), 2000);
1743
+ }).catch(() => {});
1744
+ }, [result]);
1745
+
1746
+ const handleAdd = useCallback(() => {
1747
+ if (!result) return;
1748
+ onImport({
1749
+ id: crypto.randomUUID(),
1750
+ publicKey: result.address,
1751
+ displayName: 'Generated Wallet',
1752
+ hasMnemonic: true,
1753
+ });
1754
+ // Store mnemonic locally and register with server for balance tracking
1755
+ saveMnemonic(result.address, result.mnemonic);
1756
+ sendMessage({ type: 'command', action: 'register-wallet', mnemonic: result.mnemonic });
1757
+ onClose();
1758
+ }, [result, onImport, onClose, sendMessage]);
1759
+
1760
+ return html\`
1761
+ <div class="modal-overlay" onClick=\${(e) => { if (e.target === e.currentTarget) onClose(); }}>
1762
+ <div class="modal-dialog">
1763
+ <div class="modal-header">
1764
+ <span class="modal-title">Generate Wallet</span>
1765
+ <button class="modal-close" onClick=\${onClose}>\${icons.x}</button>
1443
1766
  </div>
1767
+ \${generating ? html\`
1768
+ <div style="text-align: center; padding: 24px 0;">
1769
+ <span class="btn-spinner" style="width: 20px; height: 20px;"></span>
1770
+ <div style="margin-top: 10px; color: var(--mn-text-muted); font-size: 13px;">Generating wallet...</div>
1771
+ </div>
1772
+ \` : result ? html\`
1773
+ <div class="mnemonic-warning">
1774
+ <span style="font-size: 16px; flex-shrink: 0;">!</span>
1775
+ <span>Save this mnemonic phrase securely. It will not be shown again and cannot be recovered.</span>
1776
+ </div>
1777
+ <div class="modal-field">
1778
+ <label class="modal-label">Mnemonic Phrase</label>
1779
+ <div class="mnemonic-display">\${result.mnemonic}</div>
1780
+ </div>
1781
+ <div class="modal-field">
1782
+ <label class="modal-label">Derived Address</label>
1783
+ <div style="font-family: 'JetBrains Mono', monospace; font-size: 12px; color: var(--mn-success); word-break: break-all;">
1784
+ \${result.address}
1785
+ </div>
1786
+ </div>
1787
+ <div class="modal-actions" style="justify-content: space-between;">
1788
+ <div style="display: flex; gap: 8px;">
1789
+ <button class="btn" onClick=\${handleCopy}>
1790
+ \${icons.copy} \${copied ? 'Copied!' : 'Copy Mnemonic'}
1791
+ </button>
1792
+ <button class="btn" onClick=\${handleGenerate}>
1793
+ \${icons.refresh} New
1794
+ </button>
1795
+ </div>
1796
+ <button class="btn btn-primary" onClick=\${handleAdd}>Add to Wallets</button>
1797
+ </div>
1798
+ \` : null}
1444
1799
  </div>
1445
1800
  </div>
1446
1801
  \`;
1447
1802
  }
1448
1803
 
1449
1804
  // --- WalletCard ---
1450
- function WalletCard({ wallet, walletSyncStatus, sendMessage, onOpenImportModal, importHandlerRef }) {
1805
+ function WalletCard({ wallet, walletSyncStatus, walletBalances, sendMessage, onOpenImportModal, onOpenGenerateModal, importHandlerRef }) {
1451
1806
  // Load wallets from localStorage, ensuring master wallet is always first
1452
1807
  const [wallets, setWallets] = useState(() => {
1453
1808
  const stored = loadWallets();
@@ -1461,6 +1816,17 @@ export function generateDashboardHtml({ wsUrl }) {
1461
1816
  return stored;
1462
1817
  });
1463
1818
 
1819
+ // Re-register mnemonic wallets with server on mount (e.g. after reconnect)
1820
+ const registeredRef = useRef(false);
1821
+ useEffect(() => {
1822
+ if (registeredRef.current) return;
1823
+ registeredRef.current = true;
1824
+ const mnemonics = loadMnemonics();
1825
+ for (const [, mn] of Object.entries(mnemonics)) {
1826
+ sendMessage({ type: 'command', action: 'register-wallet', mnemonic: mn });
1827
+ }
1828
+ }, [sendMessage]);
1829
+
1464
1830
  const [selectedId, setSelectedId] = useState('master');
1465
1831
  const [editingId, setEditingId] = useState(null);
1466
1832
  const [editName, setEditName] = useState('');
@@ -1514,14 +1880,20 @@ export function generateDashboardHtml({ wsUrl }) {
1514
1880
  }, [editingId, editName]);
1515
1881
 
1516
1882
  const handleDelete = useCallback((id) => {
1883
+ const toDelete = wallets.find(w => w.id === id);
1517
1884
  setWallets(prev => {
1518
1885
  const updated = prev.filter(w => w.id !== id);
1519
1886
  saveWallets(updated);
1520
1887
  return updated;
1521
1888
  });
1889
+ // Unregister wallet context and remove stored mnemonic
1890
+ if (toDelete && toDelete.publicKey) {
1891
+ removeMnemonic(toDelete.publicKey);
1892
+ sendMessage({ type: 'command', action: 'unregister-wallet', address: toDelete.publicKey });
1893
+ }
1522
1894
  setDeletingId(null);
1523
1895
  if (selectedId === id) setSelectedId('master');
1524
- }, [selectedId]);
1896
+ }, [selectedId, wallets, sendMessage]);
1525
1897
 
1526
1898
  const handleCopy = useCallback((text) => {
1527
1899
  navigator.clipboard.writeText(text).then(() => {
@@ -1574,9 +1946,18 @@ export function generateDashboardHtml({ wsUrl }) {
1574
1946
  </button>
1575
1947
  \` : null}
1576
1948
  </div>
1577
- <button class="btn" onClick=\${onOpenImportModal}>
1578
- \${icons.plus} Import
1579
- </button>
1949
+ <div style="display: flex; gap: 6px;">
1950
+ <button class="btn" onClick=\${() => sendMessage({ type: 'command', action: 'sync-wallet' })}
1951
+ disabled=\${walletSyncStatus === 'syncing'} title="Sync wallet balances">
1952
+ \${icons.refresh} Sync
1953
+ </button>
1954
+ <button class="btn" onClick=\${onOpenGenerateModal} title="Generate new wallet">
1955
+ \${icons.key} Generate
1956
+ </button>
1957
+ <button class="btn" onClick=\${onOpenImportModal} title="Import wallet">
1958
+ \${icons.plus} Import
1959
+ </button>
1960
+ </div>
1580
1961
  </div>
1581
1962
 
1582
1963
  \${deletingId ? html\`
@@ -1601,33 +1982,71 @@ export function generateDashboardHtml({ wsUrl }) {
1601
1982
  \` : null}
1602
1983
  </div>
1603
1984
  </div>
1604
- \${showBalances ? html\`
1605
- <div class="balance-item">
1606
- <div class="balance-value">\${formatBalance(wallet.unshielded)}</div>
1607
- <div class="balance-label">NIGHT (Unshielded)</div>
1608
- </div>
1609
- <div class="balance-item">
1610
- <div class="balance-value">\${formatBalance(wallet.shielded)}</div>
1611
- <div class="balance-label">NIGHT (Shielded)</div>
1612
- </div>
1613
- <div class="balance-item">
1614
- <div class="balance-value">\${formatBalance(wallet.dust)}</div>
1615
- <div class="balance-label">DUST</div>
1616
- </div>
1617
- \` : isMaster && walletSyncStatus === 'syncing' ? html\`
1618
- <div class="balance-item" style="grid-column: 1 / -1; text-align: center;">
1619
- <div class="sync-indicator" style="justify-content: center;">
1620
- <span class="sync-spinner"></span>
1621
- Syncing balances...
1622
- </div>
1623
- </div>
1624
- \` : !isMaster ? html\`
1625
- <div class="balance-item" style="grid-column: 1 / -1; text-align: center;">
1626
- <div style="font-size: 13px; color: var(--mn-text-muted); padding: 8px 0;">
1627
- \${selectedWallet && selectedWallet.hasMnemonic ? 'Derived address — balances not available' : 'Address only — balances not available'}
1628
- </div>
1629
- </div>
1630
- \` : null}
1985
+ \${(() => {
1986
+ if (isMaster && walletSyncStatus === 'syncing') {
1987
+ return html\`
1988
+ <div class="balance-item" style="grid-column: 1 / -1; text-align: center;">
1989
+ <div class="sync-indicator" style="justify-content: center;">
1990
+ <span class="sync-spinner"></span>
1991
+ Syncing balances...
1992
+ </div>
1993
+ </div>
1994
+ \`;
1995
+ }
1996
+ if (showBalances) {
1997
+ return html\`
1998
+ <div class="balance-item">
1999
+ <div class="balance-value">\${formatBalance(wallet.unshielded)}</div>
2000
+ <div class="balance-label">NIGHT (Unshielded)</div>
2001
+ </div>
2002
+ <div class="balance-item">
2003
+ <div class="balance-value">\${formatBalance(wallet.shielded)}</div>
2004
+ <div class="balance-label">NIGHT (Shielded)</div>
2005
+ </div>
2006
+ <div class="balance-item">
2007
+ <div class="balance-value">\${formatBalance(wallet.dust)}</div>
2008
+ <div class="balance-label">DUST</div>
2009
+ </div>
2010
+ \`;
2011
+ }
2012
+ if (!isMaster && selectedWallet) {
2013
+ const wb = walletBalances && walletBalances[selectedWallet.publicKey];
2014
+ if (wb && wb.connected) {
2015
+ return html\`
2016
+ <div class="balance-item">
2017
+ <div class="balance-value">\${formatBalance(wb.unshielded)}</div>
2018
+ <div class="balance-label">NIGHT (Unshielded)</div>
2019
+ </div>
2020
+ <div class="balance-item">
2021
+ <div class="balance-value">\${formatBalance(wb.shielded)}</div>
2022
+ <div class="balance-label">NIGHT (Shielded)</div>
2023
+ </div>
2024
+ <div class="balance-item">
2025
+ <div class="balance-value">\${formatBalance(wb.dust)}</div>
2026
+ <div class="balance-label">DUST</div>
2027
+ </div>
2028
+ \`;
2029
+ }
2030
+ if (wb && !wb.connected) {
2031
+ return html\`
2032
+ <div class="balance-item" style="grid-column: 1 / -1; text-align: center;">
2033
+ <div class="sync-indicator" style="justify-content: center;">
2034
+ <span class="sync-spinner"></span>
2035
+ Initializing wallet...
2036
+ </div>
2037
+ </div>
2038
+ \`;
2039
+ }
2040
+ return html\`
2041
+ <div class="balance-item" style="grid-column: 1 / -1; text-align: center;">
2042
+ <div style="font-size: 13px; color: var(--mn-text-muted); padding: 8px 0;">
2043
+ Address only — balances not available
2044
+ </div>
2045
+ </div>
2046
+ \`;
2047
+ }
2048
+ return null;
2049
+ })()}
1631
2050
  </div>
1632
2051
  </div>
1633
2052
 
@@ -1787,7 +2206,10 @@ export function generateDashboardHtml({ wsUrl }) {
1787
2206
  }, []);
1788
2207
 
1789
2208
  const [deriveResult, setDeriveResult] = useState(null);
2209
+ const [deriveAccountsResult, setDeriveAccountsResult] = useState(null);
2210
+ const [generateResult, setGenerateResult] = useState(null);
1790
2211
  const [showImportModal, setShowImportModal] = useState(false);
2212
+ const [showGenerateModal, setShowGenerateModal] = useState(false);
1791
2213
  const importHandlerRef = useRef(null);
1792
2214
 
1793
2215
  useEffect(() => {
@@ -1811,6 +2233,10 @@ export function generateDashboardHtml({ wsUrl }) {
1811
2233
  addToast(msg.message || (msg.success ? 'Command succeeded' : 'Command failed'), msg.success ? 'success' : 'error');
1812
2234
  } else if (msg.type === 'derive-result') {
1813
2235
  setDeriveResult(msg.address || null);
2236
+ } else if (msg.type === 'derive-accounts-result') {
2237
+ setDeriveAccountsResult(msg.accounts || null);
2238
+ } else if (msg.type === 'generate-result') {
2239
+ setGenerateResult(msg);
1814
2240
  }
1815
2241
  } catch (e) {
1816
2242
  // ignore malformed messages
@@ -1853,7 +2279,7 @@ export function generateDashboardHtml({ wsUrl }) {
1853
2279
  <\${ProofServerCard} proofServer=\${state.proofServer} health=\${state.health.proofServer} serverTime=\${state.serverTime} />
1854
2280
  </div>
1855
2281
  <div class="cards-grid">
1856
- <\${WalletCard} wallet=\${state.wallet} walletSyncStatus=\${state.walletSyncStatus} sendMessage=\${sendMessage} onOpenImportModal=\${() => { setDeriveResult(null); setShowImportModal(true); }} importHandlerRef=\${importHandlerRef} />
2282
+ <\${WalletCard} wallet=\${state.wallet} walletSyncStatus=\${state.walletSyncStatus} walletBalances=\${state.walletBalances} sendMessage=\${sendMessage} onOpenImportModal=\${() => { setDeriveResult(null); setDeriveAccountsResult(null); setShowImportModal(true); }} onOpenGenerateModal=\${() => { setGenerateResult(null); setShowGenerateModal(true); }} importHandlerRef=\${importHandlerRef} />
1857
2283
  </div>
1858
2284
  <div class="cards-grid">
1859
2285
  <\${ResponseChart} health=\${state.health} />
@@ -1865,6 +2291,15 @@ export function generateDashboardHtml({ wsUrl }) {
1865
2291
  onImport=\${(w) => importHandlerRef.current && importHandlerRef.current(w)}
1866
2292
  sendMessage=\${sendMessage}
1867
2293
  deriveResult=\${deriveResult}
2294
+ deriveAccountsResult=\${deriveAccountsResult}
2295
+ />
2296
+ \` : null}
2297
+ \${showGenerateModal ? html\`
2298
+ <\${GenerateWalletModal}
2299
+ onClose=\${() => setShowGenerateModal(false)}
2300
+ onImport=\${(w) => importHandlerRef.current && importHandlerRef.current(w)}
2301
+ sendMessage=\${sendMessage}
2302
+ generateResult=\${generateResult}
1868
2303
  />
1869
2304
  \` : null}
1870
2305
  \`;
@@ -1 +1 @@
1
- {"version":3,"file":"html.js","sourceRoot":"","sources":["../../../src/cli/dashboard/html.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SACzB,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;SACxB,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,EAAE,KAAK,EAAqB;IAChE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAigCY,gBAAgB,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA00BpC,CAAC;AACT,CAAC"}
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../../src/cli/dashboard/html.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SACzB,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;SACxB,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,EAAE,KAAK,EAAqB;IAChE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA8lCY,gBAAgB,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAgqCpC,CAAC;AACT,CAAC"}
@@ -35,10 +35,12 @@ export async function fetchProofServerReady(baseUrl) {
35
35
  }
36
36
  }
37
37
  export async function fetchProofVersions(baseUrl) {
38
- const text = await fetchText(`${baseUrl}/proof-versions`);
39
- if (!text)
40
- return null;
41
38
  try {
39
+ const response = await fetch(`${baseUrl}/proof-versions`, { signal: AbortSignal.timeout(5000) });
40
+ // Accept any response that has a body (server may return non-200)
41
+ const text = await response.text();
42
+ if (!text)
43
+ return null;
42
44
  return JSON.parse(text);
43
45
  }
44
46
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"proof-server-api.js","sourceRoot":"","sources":["../../../../src/cli/dashboard/lib/proof-server-api.ts"],"names":[],"mappings":"AAaA,KAAK,UAAU,SAAS,CAAI,GAAW;IACrC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzE,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAO,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,GAAW;IAClC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC9B,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,OAAO,SAAS,CAAoB,GAAG,OAAO,SAAS,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAAe;IAC3D,OAAO,SAAS,CAAC,GAAG,OAAO,UAAU,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAAe;IACzD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxF,kCAAkC;QAClC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAsB,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAe;IACtD,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,GAAG,OAAO,iBAAiB,CAAC,CAAC;IAC1D,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAa,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"proof-server-api.js","sourceRoot":"","sources":["../../../../src/cli/dashboard/lib/proof-server-api.ts"],"names":[],"mappings":"AAaA,KAAK,UAAU,SAAS,CAAI,GAAW;IACrC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzE,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAO,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,GAAW;IAClC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC9B,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,OAAO,SAAS,CAAoB,GAAG,OAAO,SAAS,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAAe;IAC3D,OAAO,SAAS,CAAC,GAAG,OAAO,UAAU,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAAe;IACzD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxF,kCAAkC;QAClC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAsB,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAe;IACtD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,iBAAiB,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjG,kEAAkE;QAClE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAa,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -2,7 +2,7 @@ import { Hono } from 'hono';
2
2
  import { WebSocketServer } from 'ws';
3
3
  import { StateCollector } from './state-collector.js';
4
4
  import { generateDashboardHtml } from './html.js';
5
- import { getWalletBalances, getWalletAddress, deriveAddressFromMnemonic } from '../../core/wallet.js';
5
+ import { getWalletBalances, getWalletAddress, deriveAddressFromMnemonic, generateNewMnemonic, initWalletFromMnemonic, closeWallet } from '../../core/wallet.js';
6
6
  export function createDashboardApp(opts) {
7
7
  const { config, manager, port } = opts;
8
8
  const app = new Hono();
@@ -24,6 +24,9 @@ export function createDashboardApp(opts) {
24
24
  let walletSyncStatus = 'idle';
25
25
  let walletSyncPromise = null;
26
26
  let masterWalletAddress = null;
27
+ let lastStateJson = null;
28
+ // ---------- Registered wallet contexts (non-master wallets) ----------
29
+ const registeredWallets = new Map();
27
30
  // ---------- GET / — serve dashboard HTML ----------
28
31
  app.get('/', (c) => {
29
32
  const html = generateDashboardHtml({ wsUrl: `ws://localhost:${port}/ws` });
@@ -34,6 +37,10 @@ export function createDashboardApp(opts) {
34
37
  const wss = new WebSocketServer({ server, path: '/ws' });
35
38
  wss.on('connection', (ws) => {
36
39
  clients.add(ws);
40
+ // Send current state immediately so the client doesn't wait for the next tick
41
+ if (lastStateJson && ws.readyState === ws.OPEN) {
42
+ ws.send(lastStateJson);
43
+ }
37
44
  ws.on('close', () => {
38
45
  clients.delete(ws);
39
46
  });
@@ -85,6 +92,87 @@ export function createDashboardApp(opts) {
85
92
  }
86
93
  return;
87
94
  }
95
+ else if (action === 'generate-wallet') {
96
+ try {
97
+ const mnemonic = generateNewMnemonic();
98
+ const address = deriveAddressFromMnemonic(mnemonic, config.networkId);
99
+ sendToClient(ws, { type: 'generate-result', mnemonic, address });
100
+ }
101
+ catch (err) {
102
+ const error = err instanceof Error ? err.message : String(err);
103
+ sendToClient(ws, { type: 'result', action, success: false, error });
104
+ }
105
+ return;
106
+ }
107
+ else if (action === 'derive-accounts') {
108
+ const accounts = msg.accounts;
109
+ if (!accounts || !Array.isArray(accounts)) {
110
+ sendToClient(ws, { type: 'result', action, success: false, error: 'Missing accounts array' });
111
+ return;
112
+ }
113
+ try {
114
+ const results = accounts.map((a) => ({
115
+ name: a.name,
116
+ address: deriveAddressFromMnemonic(a.mnemonic, config.networkId),
117
+ hasMnemonic: true,
118
+ }));
119
+ sendToClient(ws, { type: 'derive-accounts-result', accounts: results });
120
+ }
121
+ catch (err) {
122
+ const error = err instanceof Error ? err.message : String(err);
123
+ sendToClient(ws, { type: 'result', action, success: false, error });
124
+ }
125
+ return;
126
+ }
127
+ else if (action === 'register-wallet') {
128
+ const mnemonic = msg.mnemonic;
129
+ if (!mnemonic) {
130
+ sendToClient(ws, { type: 'result', action, success: false, error: 'Missing mnemonic' });
131
+ return;
132
+ }
133
+ try {
134
+ const address = deriveAddressFromMnemonic(mnemonic, config.networkId);
135
+ // Deduplicate by address
136
+ if (!registeredWallets.has(address)) {
137
+ registeredWallets.set(address, { mnemonic, ctx: null, initializing: true });
138
+ // Initialize wallet context in background
139
+ initWalletFromMnemonic(mnemonic, config).then((ctx) => {
140
+ const entry = registeredWallets.get(address);
141
+ if (entry) {
142
+ entry.ctx = ctx;
143
+ entry.initializing = false;
144
+ }
145
+ }).catch(() => {
146
+ const entry = registeredWallets.get(address);
147
+ if (entry) {
148
+ entry.initializing = false;
149
+ }
150
+ });
151
+ }
152
+ sendToClient(ws, { type: 'register-result', address, success: true });
153
+ }
154
+ catch (err) {
155
+ const error = err instanceof Error ? err.message : String(err);
156
+ sendToClient(ws, { type: 'result', action, success: false, error });
157
+ }
158
+ return;
159
+ }
160
+ else if (action === 'unregister-wallet') {
161
+ const address = msg.address;
162
+ if (!address) {
163
+ sendToClient(ws, { type: 'result', action, success: false, error: 'Missing address' });
164
+ return;
165
+ }
166
+ const entry = registeredWallets.get(address);
167
+ if (entry) {
168
+ if (entry.ctx) {
169
+ closeWallet(entry.ctx).catch(() => { });
170
+ }
171
+ registeredWallets.delete(address);
172
+ }
173
+ sendToClient(ws, { type: 'result', action, success: true });
174
+ return;
175
+ }
88
176
  else if (action === 'set-polling') {
89
177
  const { service, interval } = msg;
90
178
  if (!service || !validServices.has(service) || typeof interval !== 'number' || interval < 1000) {
@@ -187,14 +275,37 @@ export function createDashboardApp(opts) {
187
275
  };
188
276
  }
189
277
  }
278
+ // Collect balances from registered (non-master) wallets
279
+ const walletBalances = {};
280
+ for (const [address, entry] of registeredWallets) {
281
+ if (entry.ctx && !entry.initializing) {
282
+ try {
283
+ const bal = await getWalletBalances(entry.ctx);
284
+ walletBalances[address] = {
285
+ unshielded: bal.unshielded.toString(),
286
+ shielded: bal.shielded.toString(),
287
+ dust: bal.dust.toString(),
288
+ connected: true,
289
+ };
290
+ }
291
+ catch {
292
+ walletBalances[address] = { unshielded: '0', shielded: '0', dust: '0', connected: true };
293
+ }
294
+ }
295
+ else {
296
+ walletBalances[address] = { unshielded: '0', shielded: '0', dust: '0', connected: false };
297
+ }
298
+ }
190
299
  const state = await collector.collect({
191
300
  walletInfo,
192
301
  networkStatus: manager.getStatus(),
193
302
  polling,
194
303
  walletSyncStatus,
304
+ walletBalances,
195
305
  });
196
306
  // JSON.stringify with bigint-safe replacer (just in case)
197
307
  const json = JSON.stringify({ type: 'state', data: state }, (_key, value) => typeof value === 'bigint' ? value.toString() : value);
308
+ lastStateJson = json;
198
309
  broadcastRaw(json);
199
310
  }
200
311
  catch {
@@ -218,6 +329,13 @@ export function createDashboardApp(opts) {
218
329
  ws.close();
219
330
  }
220
331
  clients.clear();
332
+ // Close all registered wallet contexts
333
+ for (const [, entry] of registeredWallets) {
334
+ if (entry.ctx) {
335
+ closeWallet(entry.ctx).catch(() => { });
336
+ }
337
+ }
338
+ registeredWallets.clear();
221
339
  }
222
340
  return {
223
341
  app,
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/cli/dashboard/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/cli/dashboard/server.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,18 @@
1
1
  import type { NetworkConfig, ServiceStatus } from '../../core/types.js';
2
2
  import type { ParsedLogLine } from './lib/log-parser.js';
3
3
  export type WalletSyncStatus = 'idle' | 'syncing' | 'synced' | 'error';
4
+ export interface WalletBalanceInfo {
5
+ unshielded: string;
6
+ shielded: string;
7
+ dust: string;
8
+ connected: boolean;
9
+ }
4
10
  export interface CollectOptions {
5
11
  walletInfo?: WalletInfo;
6
12
  networkStatus?: string;
7
13
  polling?: PollingConfig;
8
14
  walletSyncStatus?: WalletSyncStatus;
15
+ walletBalances?: Record<string, WalletBalanceInfo>;
9
16
  }
10
17
  export interface DashboardState {
11
18
  serverTime: string;
@@ -56,6 +63,7 @@ export interface DashboardState {
56
63
  containers: ServiceStatus[];
57
64
  logs: ParsedLogLine[];
58
65
  networkStatus: string;
66
+ walletBalances: Record<string, WalletBalanceInfo>;
59
67
  }
60
68
  export interface PollingConfig {
61
69
  node?: boolean;
@@ -40,7 +40,7 @@ export class StateCollector {
40
40
  this.config = config;
41
41
  }
42
42
  async collect(opts) {
43
- const { walletInfo, networkStatus, polling, walletSyncStatus } = opts ?? {};
43
+ const { walletInfo, networkStatus, polling, walletSyncStatus, walletBalances } = opts ?? {};
44
44
  // When polling is undefined, all sections are fetched (backward compatible)
45
45
  const fetchNode = polling?.node !== false;
46
46
  const fetchIndexer = polling?.indexer !== false;
@@ -55,7 +55,9 @@ export class StateCollector {
55
55
  fetchNode ? safeCall(() => fetchSystemVersion(this.config.node), null) : Promise.resolve(null),
56
56
  fetchNode ? safeCall(() => fetchSystemHealth(this.config.node), null) : Promise.resolve(null),
57
57
  fetchNode ? safeCall(() => fetchBestBlockHeader(this.config.node), null) : Promise.resolve(null),
58
- fetchProofServer ? safeCall(() => fetchProofServerVersion(this.config.proofServer), null) : Promise.resolve(null),
58
+ // Version info changes rarely fetch alongside proof versions (10 min interval)
59
+ fetchProofVer ? safeCall(() => fetchProofServerVersion(this.config.proofServer), null) : Promise.resolve(null),
60
+ // Ready/jobs status needs frequent polling (5s interval)
59
61
  fetchProofServer ? safeCall(() => fetchProofServerReady(this.config.proofServer), null) : Promise.resolve(null),
60
62
  fetchProofVer ? safeCall(() => fetchProofVersions(this.config.proofServer), null) : Promise.resolve(null),
61
63
  fetchDocker ? safeCall(() => composePs(), []) : Promise.resolve(null),
@@ -97,19 +99,23 @@ export class StateCollector {
97
99
  };
98
100
  }
99
101
  // --- Proof server section ---
102
+ // /ready is polled frequently (proofServer flag, 5s default)
100
103
  if (fetchProofServer) {
101
104
  this.cachedProofServer = {
102
- version: proofVersion,
105
+ ...this.cachedProofServer,
103
106
  ready: proofReady?.status === 'ok',
104
107
  jobsProcessing: proofReady?.jobsProcessing ?? null,
105
108
  jobsPending: proofReady?.jobsPending ?? null,
106
109
  jobCapacity: proofReady?.jobCapacity ?? null,
107
- proofVersions: fetchProofVer ? proofVersions : this.cachedProofServer.proofVersions,
108
110
  };
109
111
  }
110
- else if (fetchProofVer) {
111
- // Only proofVersions fetched, merge into cached
112
- this.cachedProofServer = { ...this.cachedProofServer, proofVersions };
112
+ // /version and /proof-versions are fetched infrequently (proofVersions flag, 10 min default)
113
+ if (fetchProofVer) {
114
+ this.cachedProofServer = {
115
+ ...this.cachedProofServer,
116
+ version: proofVersion,
117
+ proofVersions,
118
+ };
113
119
  }
114
120
  // --- Health section ---
115
121
  if (fetchHealth) {
@@ -165,6 +171,7 @@ export class StateCollector {
165
171
  containers: [...this.cachedContainers],
166
172
  logs: [...this.cachedLogs],
167
173
  networkStatus: networkStatus ?? 'unknown',
174
+ walletBalances: walletBalances ?? {},
168
175
  };
169
176
  }
170
177
  }
@@ -1 +1 @@
1
- {"version":3,"file":"state-collector.js","sourceRoot":"","sources":["../../../src/cli/dashboard/state-collector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state-collector.js","sourceRoot":"","sources":["../../../src/cli/dashboard/state-collector.ts"],"names":[],"mappings":"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"}
@@ -22,7 +22,7 @@ export async function checkAllHealth(config) {
22
22
  const [node, indexer, proofServer] = await Promise.all([
23
23
  checkEndpoint(`${cfg.node}/health`),
24
24
  checkEndpoint(`${indexerOrigin}/ready`),
25
- checkEndpoint(`${cfg.proofServer}/version`),
25
+ checkEndpoint(`${cfg.proofServer}/health`),
26
26
  ]);
27
27
  return {
28
28
  node,
@@ -1 +1 @@
1
- {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/core/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAgB5C,KAAK,UAAU,aAAa,CAAC,GAAW;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzE,OAAO;YACL,OAAO,EAAE,QAAQ,CAAC,EAAE;YACpB,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SACjC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;YAChC,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAsB;IACzD,MAAM,GAAG,GAAG,MAAM,IAAI,aAAa,CAAC;IACpC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAClD,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACrD,aAAa,CAAC,GAAG,GAAG,CAAC,IAAI,SAAS,CAAC;QACnC,aAAa,CAAC,GAAG,aAAa,QAAQ,CAAC;QACvC,aAAa,CAAC,GAAG,GAAG,CAAC,WAAW,UAAU,CAAC;KAC5C,CAAC,CAAC;IAEH,OAAO;QACL,IAAI;QACJ,OAAO;QACP,WAAW;QACX,UAAU,EAAE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,IAAI,WAAW,CAAC,OAAO;KACnE,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/core/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAgB5C,KAAK,UAAU,aAAa,CAAC,GAAW;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzE,OAAO;YACL,OAAO,EAAE,QAAQ,CAAC,EAAE;YACpB,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SACjC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;YAChC,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAsB;IACzD,MAAM,GAAG,GAAG,MAAM,IAAI,aAAa,CAAC;IACpC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAClD,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACrD,aAAa,CAAC,GAAG,GAAG,CAAC,IAAI,SAAS,CAAC;QACnC,aAAa,CAAC,GAAG,aAAa,QAAQ,CAAC;QACvC,aAAa,CAAC,GAAG,GAAG,CAAC,WAAW,SAAS,CAAC;KAC3C,CAAC,CAAC;IAEH,OAAO;QACL,IAAI;QACJ,OAAO;QACP,WAAW;QACX,UAAU,EAAE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,IAAI,WAAW,CAAC,OAAO;KACnE,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aaronbassett/midnight-local-devnet",
3
- "version": "0.3.1",
3
+ "version": "0.5.0",
4
4
  "description": "Local Midnight development network manager — CLI and MCP server",
5
5
  "license": "MIT",
6
6
  "repository": {