@aaronbassett/midnight-local-devnet 0.3.1 → 0.4.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.
- package/dist/cli/dashboard/html.js +362 -19
- package/dist/cli/dashboard/html.js.map +1 -1
- package/dist/cli/dashboard/lib/proof-server-api.js +5 -3
- package/dist/cli/dashboard/lib/proof-server-api.js.map +1 -1
- package/dist/cli/dashboard/server.js +39 -1
- package/dist/cli/dashboard/server.js.map +1 -1
- package/dist/cli/dashboard/state-collector.js +12 -6
- package/dist/cli/dashboard/state-collector.js.map +1 -1
- package/package.json +1 -1
|
@@ -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) ---
|
|
@@ -1352,7 +1445,7 @@ export function generateDashboardHtml({ wsUrl }) {
|
|
|
1352
1445
|
}
|
|
1353
1446
|
|
|
1354
1447
|
// --- ImportWalletModal ---
|
|
1355
|
-
function ImportWalletModal({ onClose, onImport, sendMessage, deriveResult }) {
|
|
1448
|
+
function ImportWalletModal({ onClose, onImport, sendMessage, deriveResult, deriveAccountsResult }) {
|
|
1356
1449
|
const [tab, setTab] = useState('mnemonic');
|
|
1357
1450
|
const [mnemonic, setMnemonic] = useState('');
|
|
1358
1451
|
const [address, setAddress] = useState('');
|
|
@@ -1360,6 +1453,12 @@ export function generateDashboardHtml({ wsUrl }) {
|
|
|
1360
1453
|
const [deriving, setDeriving] = useState(false);
|
|
1361
1454
|
const [derivedAddress, setDerivedAddress] = useState(null);
|
|
1362
1455
|
|
|
1456
|
+
// File import state
|
|
1457
|
+
const [fileAccounts, setFileAccounts] = useState(null);
|
|
1458
|
+
const [fileError, setFileError] = useState(null);
|
|
1459
|
+
const [derivingFile, setDerivingFile] = useState(false);
|
|
1460
|
+
const [fileResults, setFileResults] = useState(null);
|
|
1461
|
+
|
|
1363
1462
|
// Watch for derive-result coming in
|
|
1364
1463
|
useEffect(() => {
|
|
1365
1464
|
if (deriveResult && deriving) {
|
|
@@ -1368,6 +1467,14 @@ export function generateDashboardHtml({ wsUrl }) {
|
|
|
1368
1467
|
}
|
|
1369
1468
|
}, [deriveResult, deriving]);
|
|
1370
1469
|
|
|
1470
|
+
// Watch for derive-accounts-result
|
|
1471
|
+
useEffect(() => {
|
|
1472
|
+
if (deriveAccountsResult && derivingFile) {
|
|
1473
|
+
setFileResults(deriveAccountsResult);
|
|
1474
|
+
setDerivingFile(false);
|
|
1475
|
+
}
|
|
1476
|
+
}, [deriveAccountsResult, derivingFile]);
|
|
1477
|
+
|
|
1371
1478
|
const handleDerive = useCallback(() => {
|
|
1372
1479
|
if (!mnemonic.trim()) return;
|
|
1373
1480
|
setDeriving(true);
|
|
@@ -1375,6 +1482,56 @@ export function generateDashboardHtml({ wsUrl }) {
|
|
|
1375
1482
|
sendMessage({ type: 'command', action: 'derive-address', mnemonic: mnemonic.trim() });
|
|
1376
1483
|
}, [mnemonic, sendMessage]);
|
|
1377
1484
|
|
|
1485
|
+
const handleFileSelect = useCallback((e) => {
|
|
1486
|
+
const file = e.target.files[0];
|
|
1487
|
+
if (!file) return;
|
|
1488
|
+
setFileError(null);
|
|
1489
|
+
setFileResults(null);
|
|
1490
|
+
const reader = new FileReader();
|
|
1491
|
+
reader.onload = (ev) => {
|
|
1492
|
+
try {
|
|
1493
|
+
const data = JSON.parse(ev.target.result);
|
|
1494
|
+
if (!data.accounts || !Array.isArray(data.accounts)) {
|
|
1495
|
+
setFileError('Invalid format: expected { "accounts": [...] }');
|
|
1496
|
+
return;
|
|
1497
|
+
}
|
|
1498
|
+
const withMnemonic = data.accounts.filter(a => a.mnemonic);
|
|
1499
|
+
if (withMnemonic.length === 0) {
|
|
1500
|
+
setFileError('No accounts with mnemonic phrases found');
|
|
1501
|
+
return;
|
|
1502
|
+
}
|
|
1503
|
+
setFileAccounts(withMnemonic);
|
|
1504
|
+
} catch (err) {
|
|
1505
|
+
setFileError('Failed to parse JSON: ' + err.message);
|
|
1506
|
+
}
|
|
1507
|
+
};
|
|
1508
|
+
reader.readAsText(file);
|
|
1509
|
+
}, []);
|
|
1510
|
+
|
|
1511
|
+
const handleDeriveFile = useCallback(() => {
|
|
1512
|
+
if (!fileAccounts) return;
|
|
1513
|
+
setDerivingFile(true);
|
|
1514
|
+
setFileResults(null);
|
|
1515
|
+
sendMessage({
|
|
1516
|
+
type: 'command',
|
|
1517
|
+
action: 'derive-accounts',
|
|
1518
|
+
accounts: fileAccounts.map(a => ({ name: a.name, mnemonic: a.mnemonic })),
|
|
1519
|
+
});
|
|
1520
|
+
}, [fileAccounts, sendMessage]);
|
|
1521
|
+
|
|
1522
|
+
const handleImportFile = useCallback(() => {
|
|
1523
|
+
if (!fileResults) return;
|
|
1524
|
+
for (const account of fileResults) {
|
|
1525
|
+
onImport({
|
|
1526
|
+
id: crypto.randomUUID(),
|
|
1527
|
+
publicKey: account.address,
|
|
1528
|
+
displayName: account.name || 'Imported Wallet',
|
|
1529
|
+
hasMnemonic: true,
|
|
1530
|
+
});
|
|
1531
|
+
}
|
|
1532
|
+
onClose();
|
|
1533
|
+
}, [fileResults, onImport, onClose]);
|
|
1534
|
+
|
|
1378
1535
|
const handleImport = useCallback(() => {
|
|
1379
1536
|
if (tab === 'mnemonic') {
|
|
1380
1537
|
if (!derivedAddress) return;
|
|
@@ -1403,10 +1560,73 @@ export function generateDashboardHtml({ wsUrl }) {
|
|
|
1403
1560
|
<button class="modal-close" onClick=\${onClose}>\${icons.x}</button>
|
|
1404
1561
|
</div>
|
|
1405
1562
|
<div class="modal-tabs">
|
|
1563
|
+
<button class="modal-tab \${tab === 'file' ? 'active' : ''}" onClick=\${() => setTab('file')}>File</button>
|
|
1406
1564
|
<button class="modal-tab \${tab === 'mnemonic' ? 'active' : ''}" onClick=\${() => { setTab('mnemonic'); setDerivedAddress(null); }}>Mnemonic</button>
|
|
1407
1565
|
<button class="modal-tab \${tab === 'address' ? 'active' : ''}" onClick=\${() => setTab('address')}>Address</button>
|
|
1408
1566
|
</div>
|
|
1409
|
-
\${tab === '
|
|
1567
|
+
\${tab === 'file' ? html\`
|
|
1568
|
+
<div class="modal-field">
|
|
1569
|
+
<label class="modal-label">accounts.json File</label>
|
|
1570
|
+
<div class="file-drop-zone">
|
|
1571
|
+
<input type="file" accept=".json,application/json" onChange=\${handleFileSelect} />
|
|
1572
|
+
<div style="color: var(--mn-text-muted); font-size: 13px;">
|
|
1573
|
+
\${icons.upload} Click to select accounts.json
|
|
1574
|
+
</div>
|
|
1575
|
+
</div>
|
|
1576
|
+
</div>
|
|
1577
|
+
\${fileError ? html\`
|
|
1578
|
+
<div style="color: var(--mn-error); font-size: 12px; margin-bottom: 10px;">\${fileError}</div>
|
|
1579
|
+
\` : null}
|
|
1580
|
+
\${fileAccounts && !fileResults ? html\`
|
|
1581
|
+
<div style="margin-bottom: 14px;">
|
|
1582
|
+
<div style="font-size: 12px; color: var(--mn-text-muted); margin-bottom: 8px;">
|
|
1583
|
+
Found \${fileAccounts.length} account\${fileAccounts.length !== 1 ? 's' : ''} with mnemonics
|
|
1584
|
+
</div>
|
|
1585
|
+
<table class="file-preview-table">
|
|
1586
|
+
<thead><tr><th>Name</th><th>Mnemonic</th></tr></thead>
|
|
1587
|
+
<tbody>
|
|
1588
|
+
\${fileAccounts.map(a => html\`
|
|
1589
|
+
<tr>
|
|
1590
|
+
<td>\${a.name}</td>
|
|
1591
|
+
<td class="mono" style="color: var(--mn-text-muted);">\${a.mnemonic.split(' ').slice(0, 3).join(' ')}...</td>
|
|
1592
|
+
</tr>
|
|
1593
|
+
\`)}
|
|
1594
|
+
</tbody>
|
|
1595
|
+
</table>
|
|
1596
|
+
<div style="margin-top: 12px;">
|
|
1597
|
+
<button class="btn btn-primary" onClick=\${handleDeriveFile} disabled=\${derivingFile}>
|
|
1598
|
+
\${derivingFile ? html\`<span class="btn-spinner"></span> Deriving...
|
|
1599
|
+
\` : 'Derive Addresses'}
|
|
1600
|
+
</button>
|
|
1601
|
+
</div>
|
|
1602
|
+
</div>
|
|
1603
|
+
\` : null}
|
|
1604
|
+
\${fileResults ? html\`
|
|
1605
|
+
<div style="margin-bottom: 14px;">
|
|
1606
|
+
<div style="font-size: 12px; color: var(--mn-success); margin-bottom: 8px;">
|
|
1607
|
+
Derived \${fileResults.length} address\${fileResults.length !== 1 ? 'es' : ''}
|
|
1608
|
+
</div>
|
|
1609
|
+
<table class="file-preview-table">
|
|
1610
|
+
<thead><tr><th>Name</th><th>Address</th></tr></thead>
|
|
1611
|
+
<tbody>
|
|
1612
|
+
\${fileResults.map(a => html\`
|
|
1613
|
+
<tr>
|
|
1614
|
+
<td>\${a.name}</td>
|
|
1615
|
+
<td class="mono">\${truncateAddress(a.address)}</td>
|
|
1616
|
+
</tr>
|
|
1617
|
+
\`)}
|
|
1618
|
+
</tbody>
|
|
1619
|
+
</table>
|
|
1620
|
+
</div>
|
|
1621
|
+
\` : null}
|
|
1622
|
+
<div class="modal-actions">
|
|
1623
|
+
<button class="btn" onClick=\${onClose}>Cancel</button>
|
|
1624
|
+
<button class="btn btn-primary" onClick=\${handleImportFile}
|
|
1625
|
+
disabled=\${!fileResults}>
|
|
1626
|
+
Import \${fileResults ? fileResults.length : ''} Wallet\${fileResults && fileResults.length !== 1 ? 's' : ''}
|
|
1627
|
+
</button>
|
|
1628
|
+
</div>
|
|
1629
|
+
\` : tab === 'mnemonic' ? html\`
|
|
1410
1630
|
<div class="modal-field">
|
|
1411
1631
|
<label class="modal-label">Mnemonic Phrase</label>
|
|
1412
1632
|
<input class="modal-input mono" type="text" placeholder="Enter mnemonic words..."
|
|
@@ -1422,32 +1642,130 @@ export function generateDashboardHtml({ wsUrl }) {
|
|
|
1422
1642
|
</div>
|
|
1423
1643
|
\` : null}
|
|
1424
1644
|
</div>
|
|
1645
|
+
<div class="modal-field">
|
|
1646
|
+
<label class="modal-label">Display Name (optional)</label>
|
|
1647
|
+
<input class="modal-input" type="text" placeholder="e.g. My Wallet"
|
|
1648
|
+
value=\${displayName} onInput=\${e => setDisplayName(e.target.value)} />
|
|
1649
|
+
</div>
|
|
1650
|
+
<div class="modal-actions">
|
|
1651
|
+
<button class="btn" onClick=\${onClose}>Cancel</button>
|
|
1652
|
+
<button class="btn btn-primary" onClick=\${handleImport}
|
|
1653
|
+
disabled=\${!derivedAddress}>
|
|
1654
|
+
Import
|
|
1655
|
+
</button>
|
|
1656
|
+
</div>
|
|
1425
1657
|
\` : html\`
|
|
1426
1658
|
<div class="modal-field">
|
|
1427
1659
|
<label class="modal-label">Public Key / Address</label>
|
|
1428
1660
|
<input class="modal-input mono" type="text" placeholder="Paste public key..."
|
|
1429
1661
|
value=\${address} onInput=\${e => setAddress(e.target.value)} />
|
|
1430
1662
|
</div>
|
|
1663
|
+
<div class="modal-field">
|
|
1664
|
+
<label class="modal-label">Display Name (optional)</label>
|
|
1665
|
+
<input class="modal-input" type="text" placeholder="e.g. My Wallet"
|
|
1666
|
+
value=\${displayName} onInput=\${e => setDisplayName(e.target.value)} />
|
|
1667
|
+
</div>
|
|
1668
|
+
<div class="modal-actions">
|
|
1669
|
+
<button class="btn" onClick=\${onClose}>Cancel</button>
|
|
1670
|
+
<button class="btn btn-primary" onClick=\${handleImport}
|
|
1671
|
+
disabled=\${!address.trim()}>
|
|
1672
|
+
Import
|
|
1673
|
+
</button>
|
|
1674
|
+
</div>
|
|
1431
1675
|
\`}
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1676
|
+
</div>
|
|
1677
|
+
</div>
|
|
1678
|
+
\`;
|
|
1679
|
+
}
|
|
1680
|
+
|
|
1681
|
+
// --- GenerateWalletModal ---
|
|
1682
|
+
function GenerateWalletModal({ onClose, onImport, sendMessage, generateResult }) {
|
|
1683
|
+
const [generating, setGenerating] = useState(false);
|
|
1684
|
+
const [result, setResult] = useState(null);
|
|
1685
|
+
const [copied, setCopied] = useState(false);
|
|
1686
|
+
|
|
1687
|
+
useEffect(() => {
|
|
1688
|
+
if (generateResult && generating) {
|
|
1689
|
+
setResult(generateResult);
|
|
1690
|
+
setGenerating(false);
|
|
1691
|
+
}
|
|
1692
|
+
}, [generateResult, generating]);
|
|
1693
|
+
|
|
1694
|
+
const handleGenerate = useCallback(() => {
|
|
1695
|
+
setGenerating(true);
|
|
1696
|
+
setResult(null);
|
|
1697
|
+
setCopied(false);
|
|
1698
|
+
sendMessage({ type: 'command', action: 'generate-wallet' });
|
|
1699
|
+
}, [sendMessage]);
|
|
1700
|
+
|
|
1701
|
+
// Generate on mount
|
|
1702
|
+
useEffect(() => { handleGenerate(); }, []);
|
|
1703
|
+
|
|
1704
|
+
const handleCopy = useCallback(() => {
|
|
1705
|
+
if (!result) return;
|
|
1706
|
+
navigator.clipboard.writeText(result.mnemonic).then(() => {
|
|
1707
|
+
setCopied(true);
|
|
1708
|
+
setTimeout(() => setCopied(false), 2000);
|
|
1709
|
+
}).catch(() => {});
|
|
1710
|
+
}, [result]);
|
|
1711
|
+
|
|
1712
|
+
const handleAdd = useCallback(() => {
|
|
1713
|
+
if (!result) return;
|
|
1714
|
+
onImport({
|
|
1715
|
+
id: crypto.randomUUID(),
|
|
1716
|
+
publicKey: result.address,
|
|
1717
|
+
displayName: 'Generated Wallet',
|
|
1718
|
+
hasMnemonic: true,
|
|
1719
|
+
});
|
|
1720
|
+
onClose();
|
|
1721
|
+
}, [result, onImport, onClose]);
|
|
1722
|
+
|
|
1723
|
+
return html\`
|
|
1724
|
+
<div class="modal-overlay" onClick=\${(e) => { if (e.target === e.currentTarget) onClose(); }}>
|
|
1725
|
+
<div class="modal-dialog">
|
|
1726
|
+
<div class="modal-header">
|
|
1727
|
+
<span class="modal-title">Generate Wallet</span>
|
|
1728
|
+
<button class="modal-close" onClick=\${onClose}>\${icons.x}</button>
|
|
1443
1729
|
</div>
|
|
1730
|
+
\${generating ? html\`
|
|
1731
|
+
<div style="text-align: center; padding: 24px 0;">
|
|
1732
|
+
<span class="btn-spinner" style="width: 20px; height: 20px;"></span>
|
|
1733
|
+
<div style="margin-top: 10px; color: var(--mn-text-muted); font-size: 13px;">Generating wallet...</div>
|
|
1734
|
+
</div>
|
|
1735
|
+
\` : result ? html\`
|
|
1736
|
+
<div class="mnemonic-warning">
|
|
1737
|
+
<span style="font-size: 16px; flex-shrink: 0;">!</span>
|
|
1738
|
+
<span>Save this mnemonic phrase securely. It will not be shown again and cannot be recovered.</span>
|
|
1739
|
+
</div>
|
|
1740
|
+
<div class="modal-field">
|
|
1741
|
+
<label class="modal-label">Mnemonic Phrase</label>
|
|
1742
|
+
<div class="mnemonic-display">\${result.mnemonic}</div>
|
|
1743
|
+
</div>
|
|
1744
|
+
<div class="modal-field">
|
|
1745
|
+
<label class="modal-label">Derived Address</label>
|
|
1746
|
+
<div style="font-family: 'JetBrains Mono', monospace; font-size: 12px; color: var(--mn-success); word-break: break-all;">
|
|
1747
|
+
\${result.address}
|
|
1748
|
+
</div>
|
|
1749
|
+
</div>
|
|
1750
|
+
<div class="modal-actions" style="justify-content: space-between;">
|
|
1751
|
+
<div style="display: flex; gap: 8px;">
|
|
1752
|
+
<button class="btn" onClick=\${handleCopy}>
|
|
1753
|
+
\${icons.copy} \${copied ? 'Copied!' : 'Copy Mnemonic'}
|
|
1754
|
+
</button>
|
|
1755
|
+
<button class="btn" onClick=\${handleGenerate}>
|
|
1756
|
+
\${icons.refresh} New
|
|
1757
|
+
</button>
|
|
1758
|
+
</div>
|
|
1759
|
+
<button class="btn btn-primary" onClick=\${handleAdd}>Add to Wallets</button>
|
|
1760
|
+
</div>
|
|
1761
|
+
\` : null}
|
|
1444
1762
|
</div>
|
|
1445
1763
|
</div>
|
|
1446
1764
|
\`;
|
|
1447
1765
|
}
|
|
1448
1766
|
|
|
1449
1767
|
// --- WalletCard ---
|
|
1450
|
-
function WalletCard({ wallet, walletSyncStatus, sendMessage, onOpenImportModal, importHandlerRef }) {
|
|
1768
|
+
function WalletCard({ wallet, walletSyncStatus, sendMessage, onOpenImportModal, onOpenGenerateModal, importHandlerRef }) {
|
|
1451
1769
|
// Load wallets from localStorage, ensuring master wallet is always first
|
|
1452
1770
|
const [wallets, setWallets] = useState(() => {
|
|
1453
1771
|
const stored = loadWallets();
|
|
@@ -1574,9 +1892,18 @@ export function generateDashboardHtml({ wsUrl }) {
|
|
|
1574
1892
|
</button>
|
|
1575
1893
|
\` : null}
|
|
1576
1894
|
</div>
|
|
1577
|
-
<
|
|
1578
|
-
|
|
1579
|
-
|
|
1895
|
+
<div style="display: flex; gap: 6px;">
|
|
1896
|
+
<button class="btn" onClick=\${() => sendMessage({ type: 'command', action: 'sync-wallet' })}
|
|
1897
|
+
disabled=\${walletSyncStatus === 'syncing'} title="Sync wallet balances">
|
|
1898
|
+
\${icons.refresh} Sync
|
|
1899
|
+
</button>
|
|
1900
|
+
<button class="btn" onClick=\${onOpenGenerateModal} title="Generate new wallet">
|
|
1901
|
+
\${icons.key} Generate
|
|
1902
|
+
</button>
|
|
1903
|
+
<button class="btn" onClick=\${onOpenImportModal} title="Import wallet">
|
|
1904
|
+
\${icons.plus} Import
|
|
1905
|
+
</button>
|
|
1906
|
+
</div>
|
|
1580
1907
|
</div>
|
|
1581
1908
|
|
|
1582
1909
|
\${deletingId ? html\`
|
|
@@ -1787,7 +2114,10 @@ export function generateDashboardHtml({ wsUrl }) {
|
|
|
1787
2114
|
}, []);
|
|
1788
2115
|
|
|
1789
2116
|
const [deriveResult, setDeriveResult] = useState(null);
|
|
2117
|
+
const [deriveAccountsResult, setDeriveAccountsResult] = useState(null);
|
|
2118
|
+
const [generateResult, setGenerateResult] = useState(null);
|
|
1790
2119
|
const [showImportModal, setShowImportModal] = useState(false);
|
|
2120
|
+
const [showGenerateModal, setShowGenerateModal] = useState(false);
|
|
1791
2121
|
const importHandlerRef = useRef(null);
|
|
1792
2122
|
|
|
1793
2123
|
useEffect(() => {
|
|
@@ -1811,6 +2141,10 @@ export function generateDashboardHtml({ wsUrl }) {
|
|
|
1811
2141
|
addToast(msg.message || (msg.success ? 'Command succeeded' : 'Command failed'), msg.success ? 'success' : 'error');
|
|
1812
2142
|
} else if (msg.type === 'derive-result') {
|
|
1813
2143
|
setDeriveResult(msg.address || null);
|
|
2144
|
+
} else if (msg.type === 'derive-accounts-result') {
|
|
2145
|
+
setDeriveAccountsResult(msg.accounts || null);
|
|
2146
|
+
} else if (msg.type === 'generate-result') {
|
|
2147
|
+
setGenerateResult(msg);
|
|
1814
2148
|
}
|
|
1815
2149
|
} catch (e) {
|
|
1816
2150
|
// ignore malformed messages
|
|
@@ -1853,7 +2187,7 @@ export function generateDashboardHtml({ wsUrl }) {
|
|
|
1853
2187
|
<\${ProofServerCard} proofServer=\${state.proofServer} health=\${state.health.proofServer} serverTime=\${state.serverTime} />
|
|
1854
2188
|
</div>
|
|
1855
2189
|
<div class="cards-grid">
|
|
1856
|
-
<\${WalletCard} wallet=\${state.wallet} walletSyncStatus=\${state.walletSyncStatus} sendMessage=\${sendMessage} onOpenImportModal=\${() => { setDeriveResult(null); setShowImportModal(true); }} importHandlerRef=\${importHandlerRef} />
|
|
2190
|
+
<\${WalletCard} wallet=\${state.wallet} walletSyncStatus=\${state.walletSyncStatus} sendMessage=\${sendMessage} onOpenImportModal=\${() => { setDeriveResult(null); setDeriveAccountsResult(null); setShowImportModal(true); }} onOpenGenerateModal=\${() => { setGenerateResult(null); setShowGenerateModal(true); }} importHandlerRef=\${importHandlerRef} />
|
|
1857
2191
|
</div>
|
|
1858
2192
|
<div class="cards-grid">
|
|
1859
2193
|
<\${ResponseChart} health=\${state.health} />
|
|
@@ -1865,6 +2199,15 @@ export function generateDashboardHtml({ wsUrl }) {
|
|
|
1865
2199
|
onImport=\${(w) => importHandlerRef.current && importHandlerRef.current(w)}
|
|
1866
2200
|
sendMessage=\${sendMessage}
|
|
1867
2201
|
deriveResult=\${deriveResult}
|
|
2202
|
+
deriveAccountsResult=\${deriveAccountsResult}
|
|
2203
|
+
/>
|
|
2204
|
+
\` : null}
|
|
2205
|
+
\${showGenerateModal ? html\`
|
|
2206
|
+
<\${GenerateWalletModal}
|
|
2207
|
+
onClose=\${() => setShowGenerateModal(false)}
|
|
2208
|
+
onImport=\${(w) => importHandlerRef.current && importHandlerRef.current(w)}
|
|
2209
|
+
sendMessage=\${sendMessage}
|
|
2210
|
+
generateResult=\${generateResult}
|
|
1868
2211
|
/>
|
|
1869
2212
|
\` : null}
|
|
1870
2213
|
\`;
|
|
@@ -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
|
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAokCpC,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,
|
|
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 } 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,7 @@ export function createDashboardApp(opts) {
|
|
|
24
24
|
let walletSyncStatus = 'idle';
|
|
25
25
|
let walletSyncPromise = null;
|
|
26
26
|
let masterWalletAddress = null;
|
|
27
|
+
let lastStateJson = null;
|
|
27
28
|
// ---------- GET / — serve dashboard HTML ----------
|
|
28
29
|
app.get('/', (c) => {
|
|
29
30
|
const html = generateDashboardHtml({ wsUrl: `ws://localhost:${port}/ws` });
|
|
@@ -34,6 +35,10 @@ export function createDashboardApp(opts) {
|
|
|
34
35
|
const wss = new WebSocketServer({ server, path: '/ws' });
|
|
35
36
|
wss.on('connection', (ws) => {
|
|
36
37
|
clients.add(ws);
|
|
38
|
+
// Send current state immediately so the client doesn't wait for the next tick
|
|
39
|
+
if (lastStateJson && ws.readyState === ws.OPEN) {
|
|
40
|
+
ws.send(lastStateJson);
|
|
41
|
+
}
|
|
37
42
|
ws.on('close', () => {
|
|
38
43
|
clients.delete(ws);
|
|
39
44
|
});
|
|
@@ -85,6 +90,38 @@ export function createDashboardApp(opts) {
|
|
|
85
90
|
}
|
|
86
91
|
return;
|
|
87
92
|
}
|
|
93
|
+
else if (action === 'generate-wallet') {
|
|
94
|
+
try {
|
|
95
|
+
const mnemonic = generateNewMnemonic();
|
|
96
|
+
const address = deriveAddressFromMnemonic(mnemonic, config.networkId);
|
|
97
|
+
sendToClient(ws, { type: 'generate-result', mnemonic, address });
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
101
|
+
sendToClient(ws, { type: 'result', action, success: false, error });
|
|
102
|
+
}
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
else if (action === 'derive-accounts') {
|
|
106
|
+
const accounts = msg.accounts;
|
|
107
|
+
if (!accounts || !Array.isArray(accounts)) {
|
|
108
|
+
sendToClient(ws, { type: 'result', action, success: false, error: 'Missing accounts array' });
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
const results = accounts.map((a) => ({
|
|
113
|
+
name: a.name,
|
|
114
|
+
address: deriveAddressFromMnemonic(a.mnemonic, config.networkId),
|
|
115
|
+
hasMnemonic: true,
|
|
116
|
+
}));
|
|
117
|
+
sendToClient(ws, { type: 'derive-accounts-result', accounts: results });
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
121
|
+
sendToClient(ws, { type: 'result', action, success: false, error });
|
|
122
|
+
}
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
88
125
|
else if (action === 'set-polling') {
|
|
89
126
|
const { service, interval } = msg;
|
|
90
127
|
if (!service || !validServices.has(service) || typeof interval !== 'number' || interval < 1000) {
|
|
@@ -195,6 +232,7 @@ export function createDashboardApp(opts) {
|
|
|
195
232
|
});
|
|
196
233
|
// JSON.stringify with bigint-safe replacer (just in case)
|
|
197
234
|
const json = JSON.stringify({ type: 'state', data: state }, (_key, value) => typeof value === 'bigint' ? value.toString() : value);
|
|
235
|
+
lastStateJson = json;
|
|
198
236
|
broadcastRaw(json);
|
|
199
237
|
}
|
|
200
238
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/cli/dashboard/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAiC,MAAM,IAAI,CAAC;AAIpE,OAAO,EAAE,cAAc,EAA8D,MAAM,sBAAsB,CAAC;AAClH,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/cli/dashboard/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
111
|
-
|
|
112
|
-
this.cachedProofServer = {
|
|
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) {
|
|
@@ -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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"}
|