Add private Infonet swarm discovery and gate propagation.

Signed peer manifest pull/announce on the seed, immediate hashchain push for gate messages, seed-only Docker defaults, and stale-genesis sync diagnostics.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
BigBodyCobain
2026-06-11 03:15:25 -06:00
co-authored by Cursor
parent d3006df57a
commit 776c89bfcf
14 changed files with 1129 additions and 17 deletions
@@ -60,6 +60,10 @@ export default function BootstrapView({ marketId, onBack }: BootstrapViewProps)
nodeStatus?.bootstrap?.bootstrap_seed_peer_count ?? nodeStatus?.bootstrap?.default_sync_peer_count ?? 0,
);
const syncPeerCount = Number(nodeStatus?.bootstrap?.sync_peer_count || 0);
const swarmSyncPeerCount = Number(nodeStatus?.bootstrap?.swarm_sync_peer_count || 0);
const manifestLoaded = Boolean(nodeStatus?.bootstrap?.manifest_loaded);
const swarmPull = nodeStatus?.bootstrap?.swarm_manifest_pull;
const swarmPullOk = Boolean(swarmPull?.ok) && !swarmPull?.skipped;
const lastPeerUrl = String(nodeStatus?.sync_runtime?.last_peer_url || '').trim();
const privateTransportRequired = Boolean(nodeStatus?.private_transport_required);
@@ -146,7 +150,7 @@ export default function BootstrapView({ marketId, onBack }: BootstrapViewProps)
Refresh
</button>
</div>
<div className="grid grid-cols-1 md:grid-cols-3 gap-2 text-xs">
<div className="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-4 gap-2 text-xs">
<div>
<div className="text-gray-500">Transport</div>
<div className="text-cyan-300 font-mono break-all">
@@ -163,6 +167,19 @@ export default function BootstrapView({ marketId, onBack }: BootstrapViewProps)
<div className="text-gray-500">Sync Path</div>
<div className="text-white font-mono">
{syncPeerCount} peers / {seedPeerCount} seeds
{swarmSyncPeerCount > 0 ? ` (${swarmSyncPeerCount} swarm)` : ''}
</div>
</div>
<div>
<div className="text-gray-500">Swarm Manifest</div>
<div className={swarmPullOk || manifestLoaded ? 'text-green-400' : 'text-amber-400'}>
{swarmPullOk
? `LIVE (${Number(swarmPull?.merged_peer_count || swarmPull?.peer_count || 0)} peers)`
: manifestLoaded
? 'LOCAL FILE'
: swarmPull?.skipped
? 'WAITING'
: 'NOT LOADED'}
</div>
</div>
</div>
@@ -92,7 +92,7 @@ export default function NetworkStats() {
<span className="text-gray-700">|</span>
<span>EVENTS <span className="text-white">{stats.infonetEvents}</span></span>
<span className="text-gray-700">|</span>
<span title="Configured peers this node pulls from. Usually this is just the seed unless another device is added as a sync peer.">
<span title="Peers this node syncs from (seed + swarm-discovered participants).">
SYNC PEERS <span className="text-white">{stats.syncPeers}</span>
</span>
{stats.seedPeers > stats.syncPeers ? (
@@ -25,6 +25,17 @@ export interface InfonetBootstrapSnapshot {
bootstrap_seed_peer_count?: number;
default_sync_peer_count?: number;
last_bootstrap_error?: string;
swarm_sync_peer_count?: number;
swarm_push_peer_count?: number;
swarm_manifest_pull?: {
ok?: boolean;
skipped?: boolean;
reason?: string;
detail?: string;
peer_count?: number;
merged_peer_count?: number;
seed_peer_url?: string;
};
}
export interface InfonetSyncRuntimeSnapshot {