From c4837892c4d96167eda05450564c796e2cb30349 Mon Sep 17 00:00:00 2001 From: M3gA-Mind Date: Fri, 6 Feb 2026 21:54:03 +0530 Subject: [PATCH] fix: improve error handling and network selection in WalletInfoSection - Enhanced the parsing of network data to ensure robustness against undefined values. - Updated network selection logic to prioritize valid entries and provide a fallback. - Improved error logging for better debugging of wallet information loading issues. - Adjusted balance retrieval to handle cases where chain_id may be missing. --- src/components/WalletInfoSection.tsx | 20 +++++++++++----- src/lib/skills/hooks.ts | 36 +++++++++++++++------------- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/src/components/WalletInfoSection.tsx b/src/components/WalletInfoSection.tsx index dc168433a..b1f28943e 100644 --- a/src/components/WalletInfoSection.tsx +++ b/src/components/WalletInfoSection.tsx @@ -45,17 +45,24 @@ export default function WalletInfoSection() { if (!cancelled) setError('Could not load networks'); return; } - const listData = JSON.parse(listText) as { networks?: Array<{ chain_id: string; name: string; chain_type: string }> }; - const networks = listData.networks ?? []; - const firstEvm = networks.find((n: { chain_type: string }) => n.chain_type === 'evm'); - const first = firstEvm ?? networks[0]; + const listData = JSON.parse(listText) as { networks?: Array<{ chain_id?: string; name?: string; chain_type?: string }> }; + const networks = Array.isArray(listData.networks) ? listData.networks : []; + const firstEvm = networks.find((n) => n && n.chain_type === 'evm'); + const first = firstEvm ?? networks.find(Boolean); if (!first || cancelled) return; - if (!cancelled) setNetworkName(first.name); + const networkNameVal = first.name ?? first.chain_id ?? 'Unknown'; + if (!cancelled) setNetworkName(networkNameVal); + + const chainId = first.chain_id ?? ''; + if (!chainId) { + if (!cancelled) setBalance('—'); + return; + } const balanceRes = await skillManager.callTool('wallet', 'get_balance', { address: primaryAddress, - chain_id: first.chain_id, + chain_id: chainId, chain_type: first.chain_type ?? 'evm', }); const balanceText = balanceRes.content?.[0]?.text; @@ -78,6 +85,7 @@ export default function WalletInfoSection() { const display = value < 0.0001 ? '0' : value.toFixed(4); if (!cancelled) setBalance(`${display} ${symbol}`); } catch (e) { + console.error(e); if (!cancelled) { setError(e instanceof Error ? e.message : 'Failed to load wallet info'); setBalance(null); diff --git a/src/lib/skills/hooks.ts b/src/lib/skills/hooks.ts index d79728254..c60582ff0 100644 --- a/src/lib/skills/hooks.ts +++ b/src/lib/skills/hooks.ts @@ -43,42 +43,44 @@ function deriveConnectionStatus( // Process is running or ready — use the skill's self-reported state const hostState = skillState as SkillHostConnectionState | undefined; - if (!hostState) { - // No state pushed yet. Skills that don't maintain an external connection - // (e.g. cron-based skills) may never push host state. If setup is complete - // and the lifecycle says "ready", treat it as connected. - if (setupComplete && lifecycleStatus === "ready") { + const connStatus = hostState?.connection_status; + const authStatus = hostState?.auth_status; + + // If the skill hasn't pushed any state, or pushed state without standard + // connection_status / auth_status fields, fall back to lifecycle + setupComplete. + if (!connStatus && !authStatus) { + if (setupComplete && (lifecycleStatus === "ready" || lifecycleStatus === "running")) { return "connected"; } + if (!hostState) { + return "connecting"; + } + // Skill pushed custom state but no connection fields — treat as connecting return "connecting"; } - const connStatus = hostState.connection_status; - const authStatus = hostState.auth_status; - // Check for errors first if (connStatus === "error" || authStatus === "error") { return "error"; } - // Fully connected and authenticated - if (connStatus === "connected" && authStatus === "authenticated") { - return "connected"; - } - // Connecting or authenticating if (connStatus === "connecting" || authStatus === "authenticating") { return "connecting"; } - // Connected but not authenticated - if (connStatus === "connected" && authStatus === "not_authenticated") { - return "not_authenticated"; + // Connected — check auth if the skill uses it + if (connStatus === "connected") { + if (!authStatus || authStatus === "authenticated") { + return "connected"; + } + if (authStatus === "not_authenticated") { + return "not_authenticated"; + } } // Disconnected from service if (connStatus === "disconnected") { - // If setup is complete but we're disconnected, it might be a reconnecting state if (setupComplete) { return "disconnected"; }