@elizaos/plugin-steward-app 2.0.3-beta.6 → 2.0.3-beta.7

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.
Files changed (219) hide show
  1. package/dist/ApprovalQueue.d.ts +18 -0
  2. package/dist/ApprovalQueue.d.ts.map +1 -0
  3. package/dist/ApprovalQueue.js +420 -0
  4. package/dist/ApprovalQueue.js.map +1 -0
  5. package/dist/StewardLogo.d.ts +11 -0
  6. package/dist/StewardLogo.d.ts.map +1 -0
  7. package/dist/StewardLogo.js +36 -0
  8. package/dist/StewardLogo.js.map +1 -0
  9. package/dist/StewardView.d.ts +13 -0
  10. package/dist/StewardView.d.ts.map +1 -0
  11. package/dist/StewardView.helpers.d.ts +15 -0
  12. package/dist/StewardView.helpers.d.ts.map +1 -0
  13. package/dist/StewardView.helpers.js +45 -0
  14. package/dist/StewardView.helpers.js.map +1 -0
  15. package/dist/StewardView.interact.d.ts +2 -0
  16. package/dist/StewardView.interact.d.ts.map +1 -0
  17. package/dist/StewardView.interact.js +54 -0
  18. package/dist/StewardView.interact.js.map +1 -0
  19. package/dist/StewardView.js +249 -0
  20. package/dist/StewardView.js.map +1 -0
  21. package/dist/TransactionHistory.d.ts +22 -0
  22. package/dist/TransactionHistory.d.ts.map +1 -0
  23. package/dist/TransactionHistory.js +361 -0
  24. package/dist/TransactionHistory.js.map +1 -0
  25. package/dist/__fixtures__/steward-sdk-fixtures.d.ts +10 -0
  26. package/dist/__fixtures__/steward-sdk-fixtures.d.ts.map +1 -0
  27. package/dist/__fixtures__/steward-sdk-fixtures.js +60 -0
  28. package/dist/__fixtures__/steward-sdk-fixtures.js.map +1 -0
  29. package/dist/actions/wallet-action-shared.d.ts +15 -0
  30. package/dist/actions/wallet-action-shared.d.ts.map +1 -0
  31. package/dist/actions/wallet-action-shared.js +16 -0
  32. package/dist/actions/wallet-action-shared.js.map +1 -0
  33. package/dist/api/binance-skill-helpers.d.ts +21 -0
  34. package/dist/api/binance-skill-helpers.d.ts.map +1 -0
  35. package/dist/api/binance-skill-helpers.js +790 -0
  36. package/dist/api/binance-skill-helpers.js.map +1 -0
  37. package/dist/api/bsc-trade.d.ts +36 -0
  38. package/dist/api/bsc-trade.d.ts.map +1 -0
  39. package/dist/api/bsc-trade.js +796 -0
  40. package/dist/api/bsc-trade.js.map +1 -0
  41. package/dist/api/trade-safety.d.ts +35 -0
  42. package/dist/api/trade-safety.d.ts.map +1 -0
  43. package/dist/api/trade-safety.js +56 -0
  44. package/dist/api/trade-safety.js.map +1 -0
  45. package/dist/api/tx-service.d.ts +53 -0
  46. package/dist/api/tx-service.d.ts.map +1 -0
  47. package/dist/api/tx-service.js +206 -0
  48. package/dist/api/tx-service.js.map +1 -0
  49. package/dist/api/wallet-bsc-routes.d.ts +63 -0
  50. package/dist/api/wallet-bsc-routes.d.ts.map +1 -0
  51. package/dist/api/wallet-bsc-routes.js +337 -0
  52. package/dist/api/wallet-bsc-routes.js.map +1 -0
  53. package/dist/api/wallet-capability.d.ts +2 -0
  54. package/dist/api/wallet-capability.d.ts.map +1 -0
  55. package/dist/api/wallet-capability.js +15 -0
  56. package/dist/api/wallet-capability.js.map +1 -0
  57. package/dist/api/wallet-dex-prices.d.ts +43 -0
  58. package/dist/api/wallet-dex-prices.d.ts.map +1 -0
  59. package/dist/api/wallet-dex-prices.js +132 -0
  60. package/dist/api/wallet-dex-prices.js.map +1 -0
  61. package/dist/api/wallet-evm-balance.d.ts +72 -0
  62. package/dist/api/wallet-evm-balance.d.ts.map +1 -0
  63. package/dist/api/wallet-evm-balance.js +697 -0
  64. package/dist/api/wallet-evm-balance.js.map +1 -0
  65. package/dist/api/wallet-routes.d.ts +27 -0
  66. package/dist/api/wallet-routes.d.ts.map +1 -0
  67. package/dist/api/wallet-routes.js +556 -0
  68. package/dist/api/wallet-routes.js.map +1 -0
  69. package/dist/api/wallet-rpc.d.ts +73 -0
  70. package/dist/api/wallet-rpc.d.ts.map +1 -0
  71. package/dist/api/wallet-rpc.js +460 -0
  72. package/dist/api/wallet-rpc.js.map +1 -0
  73. package/dist/api/wallet-trade-routes.d.ts +104 -0
  74. package/dist/api/wallet-trade-routes.d.ts.map +1 -0
  75. package/dist/api/wallet-trade-routes.js +353 -0
  76. package/dist/api/wallet-trade-routes.js.map +1 -0
  77. package/dist/api/wallet-trading-profile.d.ts +31 -0
  78. package/dist/api/wallet-trading-profile.d.ts.map +1 -0
  79. package/dist/api/wallet-trading-profile.js +500 -0
  80. package/dist/api/wallet-trading-profile.js.map +1 -0
  81. package/dist/api/wallet.d.ts +60 -0
  82. package/dist/api/wallet.d.ts.map +1 -0
  83. package/dist/api/wallet.js +617 -0
  84. package/dist/api/wallet.js.map +1 -0
  85. package/dist/chain-utils.d.ts +10 -0
  86. package/dist/chain-utils.d.ts.map +1 -0
  87. package/dist/chain-utils.js +81 -0
  88. package/dist/chain-utils.js.map +1 -0
  89. package/dist/components/StewardSpatialView.d.ts +74 -0
  90. package/dist/components/StewardSpatialView.d.ts.map +1 -0
  91. package/dist/components/StewardSpatialView.js +309 -0
  92. package/dist/components/StewardSpatialView.js.map +1 -0
  93. package/dist/index.d.ts +20 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +77 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/plugin.d.ts +21 -0
  98. package/dist/plugin.d.ts.map +1 -0
  99. package/dist/plugin.js +319 -0
  100. package/dist/plugin.js.map +1 -0
  101. package/dist/providers/steward-balance.d.ts +12 -0
  102. package/dist/providers/steward-balance.d.ts.map +1 -0
  103. package/dist/providers/steward-balance.js +85 -0
  104. package/dist/providers/steward-balance.js.map +1 -0
  105. package/dist/providers/steward-receive-address.d.ts +12 -0
  106. package/dist/providers/steward-receive-address.d.ts.map +1 -0
  107. package/dist/providers/steward-receive-address.js +47 -0
  108. package/dist/providers/steward-receive-address.js.map +1 -0
  109. package/dist/register-routes.d.ts +2 -0
  110. package/dist/register-routes.d.ts.map +1 -0
  111. package/dist/register-routes.js +6 -0
  112. package/dist/register-routes.js.map +1 -0
  113. package/dist/register-terminal-view.d.ts +15 -0
  114. package/dist/register-terminal-view.d.ts.map +1 -0
  115. package/dist/register-terminal-view.js +34 -0
  116. package/dist/register-terminal-view.js.map +1 -0
  117. package/dist/routes/steward-bridge.d.ts +202 -0
  118. package/dist/routes/steward-bridge.d.ts.map +1 -0
  119. package/dist/routes/steward-bridge.js +776 -0
  120. package/dist/routes/steward-bridge.js.map +1 -0
  121. package/dist/routes/steward-compat-routes.d.ts +21 -0
  122. package/dist/routes/steward-compat-routes.d.ts.map +1 -0
  123. package/dist/routes/steward-compat-routes.js +350 -0
  124. package/dist/routes/steward-compat-routes.js.map +1 -0
  125. package/dist/routes/wallet-browser-compat-routes.d.ts +6 -0
  126. package/dist/routes/wallet-browser-compat-routes.d.ts.map +1 -0
  127. package/dist/routes/wallet-browser-compat-routes.js +402 -0
  128. package/dist/routes/wallet-browser-compat-routes.js.map +1 -0
  129. package/dist/routes/wallet-bsc-core-routes.d.ts +15 -0
  130. package/dist/routes/wallet-bsc-core-routes.d.ts.map +1 -0
  131. package/dist/routes/wallet-bsc-core-routes.js +59 -0
  132. package/dist/routes/wallet-bsc-core-routes.js.map +1 -0
  133. package/dist/routes/wallet-compat-routes.d.ts +13 -0
  134. package/dist/routes/wallet-compat-routes.d.ts.map +1 -0
  135. package/dist/routes/wallet-compat-routes.js +206 -0
  136. package/dist/routes/wallet-compat-routes.js.map +1 -0
  137. package/dist/routes/wallet-core-routes.d.ts +16 -0
  138. package/dist/routes/wallet-core-routes.d.ts.map +1 -0
  139. package/dist/routes/wallet-core-routes.js +48 -0
  140. package/dist/routes/wallet-core-routes.js.map +1 -0
  141. package/dist/routes/wallet-trade-compat-routes.d.ts +11 -0
  142. package/dist/routes/wallet-trade-compat-routes.d.ts.map +1 -0
  143. package/dist/routes/wallet-trade-compat-routes.js +570 -0
  144. package/dist/routes/wallet-trade-compat-routes.js.map +1 -0
  145. package/dist/security/hydrate-wallet-keys-from-platform-store.d.ts +7 -0
  146. package/dist/security/hydrate-wallet-keys-from-platform-store.d.ts.map +1 -0
  147. package/dist/security/hydrate-wallet-keys-from-platform-store.js +43 -0
  148. package/dist/security/hydrate-wallet-keys-from-platform-store.js.map +1 -0
  149. package/dist/security/wallet-os-store-actions.d.ts +14 -0
  150. package/dist/security/wallet-os-store-actions.d.ts.map +1 -0
  151. package/dist/security/wallet-os-store-actions.js +63 -0
  152. package/dist/security/wallet-os-store-actions.js.map +1 -0
  153. package/dist/services/steward-credentials.d.ts +2 -0
  154. package/dist/services/steward-credentials.d.ts.map +1 -0
  155. package/dist/services/steward-credentials.js +2 -0
  156. package/dist/services/steward-credentials.js.map +1 -0
  157. package/dist/services/steward-evm-account.d.ts +75 -0
  158. package/dist/services/steward-evm-account.d.ts.map +1 -0
  159. package/dist/services/steward-evm-account.js +279 -0
  160. package/dist/services/steward-evm-account.js.map +1 -0
  161. package/dist/services/steward-evm-bridge.d.ts +36 -0
  162. package/dist/services/steward-evm-bridge.d.ts.map +1 -0
  163. package/dist/services/steward-evm-bridge.js +78 -0
  164. package/dist/services/steward-evm-bridge.js.map +1 -0
  165. package/dist/services/steward-sidecar/health-check.d.ts +2 -0
  166. package/dist/services/steward-sidecar/health-check.d.ts.map +1 -0
  167. package/dist/services/steward-sidecar/health-check.js +2 -0
  168. package/dist/services/steward-sidecar/health-check.js.map +1 -0
  169. package/dist/services/steward-sidecar/helpers.d.ts +2 -0
  170. package/dist/services/steward-sidecar/helpers.d.ts.map +1 -0
  171. package/dist/services/steward-sidecar/helpers.js +2 -0
  172. package/dist/services/steward-sidecar/helpers.js.map +1 -0
  173. package/dist/services/steward-sidecar/process-management.d.ts +2 -0
  174. package/dist/services/steward-sidecar/process-management.d.ts.map +1 -0
  175. package/dist/services/steward-sidecar/process-management.js +2 -0
  176. package/dist/services/steward-sidecar/process-management.js.map +1 -0
  177. package/dist/services/steward-sidecar/types.d.ts +2 -0
  178. package/dist/services/steward-sidecar/types.d.ts.map +1 -0
  179. package/dist/services/steward-sidecar/types.js +2 -0
  180. package/dist/services/steward-sidecar/types.js.map +1 -0
  181. package/dist/services/steward-sidecar/wallet-setup.d.ts +2 -0
  182. package/dist/services/steward-sidecar/wallet-setup.d.ts.map +1 -0
  183. package/dist/services/steward-sidecar/wallet-setup.js +2 -0
  184. package/dist/services/steward-sidecar/wallet-setup.js.map +1 -0
  185. package/dist/services/steward-sidecar.d.ts +2 -0
  186. package/dist/services/steward-sidecar.d.ts.map +1 -0
  187. package/dist/services/steward-sidecar.js +2 -0
  188. package/dist/services/steward-sidecar.js.map +1 -0
  189. package/dist/services/steward-wallet.d.ts +25 -0
  190. package/dist/services/steward-wallet.d.ts.map +1 -0
  191. package/dist/services/steward-wallet.js +333 -0
  192. package/dist/services/steward-wallet.js.map +1 -0
  193. package/dist/steward-ui-state.d.ts +14 -0
  194. package/dist/steward-ui-state.d.ts.map +1 -0
  195. package/dist/steward-ui-state.js +46 -0
  196. package/dist/steward-ui-state.js.map +1 -0
  197. package/dist/steward-view-bundle.d.ts +3 -0
  198. package/dist/steward-view-bundle.d.ts.map +1 -0
  199. package/dist/steward-view-bundle.js +7 -0
  200. package/dist/steward-view-bundle.js.map +1 -0
  201. package/dist/types/bsc-trade.d.ts +180 -0
  202. package/dist/types/bsc-trade.d.ts.map +1 -0
  203. package/dist/types/bsc-trade.js +1 -0
  204. package/dist/types/bsc-trade.js.map +1 -0
  205. package/dist/types/index.d.ts +3 -0
  206. package/dist/types/index.d.ts.map +1 -0
  207. package/dist/types/index.js +3 -0
  208. package/dist/types/index.js.map +1 -0
  209. package/dist/types/steward.d.ts +83 -0
  210. package/dist/types/steward.d.ts.map +1 -0
  211. package/dist/types/steward.js +1 -0
  212. package/dist/types/steward.js.map +1 -0
  213. package/dist/ui.d.ts +7 -0
  214. package/dist/ui.d.ts.map +1 -0
  215. package/dist/ui.js +7 -0
  216. package/dist/ui.js.map +1 -0
  217. package/dist/views/bundle.js +601 -0
  218. package/dist/views/bundle.js.map +1 -0
  219. package/package.json +8 -8
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/api/wallet.ts"],"sourcesContent":["/**\n * Wallet key generation, address derivation, and balance/NFT fetching.\n * Uses Node crypto primitives + ethers (keccak-256 / checksum).\n * Balance data from Alchemy/Ankr (EVM), NodeReal/QuickNode (BSC RPC),\n * and Helius (Solana) REST APIs.\n *\n * DEX price oracle logic lives in ./wallet-dex-prices.ts\n * EVM balance + NFT fetching lives in ./wallet-evm-balance.ts\n */\nimport crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type {\n KeyValidationResult,\n SolanaTokenBalance,\n WalletAddresses,\n WalletChain,\n WalletGenerateResult,\n WalletImportResult,\n WalletKeys,\n} from \"@elizaos/core\";\nimport { logger, resolveStateDir } from \"@elizaos/core\";\nimport { secp256k1 } from \"@noble/curves/secp256k1.js\";\nimport * as ethers from \"ethers\";\n\ntype StewardAgentWalletPayload = {\n walletAddress?: string;\n walletAddresses?: { evm?: string; solana?: string };\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction readStringField(\n record: Record<string, unknown>,\n key: string,\n): string | undefined {\n const value = record[key];\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction readStewardAgentWalletPayload(\n value: unknown,\n): StewardAgentWalletPayload {\n const envelope = isRecord(value) ? value : {};\n const payload = isRecord(envelope.data) ? envelope.data : envelope;\n const walletAddresses = isRecord(payload.walletAddresses)\n ? {\n evm: readStringField(payload.walletAddresses, \"evm\"),\n solana: readStringField(payload.walletAddresses, \"solana\"),\n }\n : undefined;\n return {\n walletAddress: readStringField(payload, \"walletAddress\"),\n walletAddresses,\n };\n}\n\n// ── Re-exports from contracts/wallet ──────────────────────────────────\n\nexport type {\n BscTradeExecuteRequest,\n BscTradeExecuteResponse,\n BscTradeExecutionResult,\n BscTradePreflightRequest,\n BscTradePreflightResponse,\n BscTradeQuoteRequest,\n BscTradeQuoteResponse,\n BscTradeSide,\n BscTradeTxStatus,\n BscTradeTxStatusResponse,\n BscTransferExecuteRequest,\n BscTransferExecuteResponse,\n BscTransferExecutionResult,\n BscUnsignedApprovalTx,\n BscUnsignedTradeTx,\n BscUnsignedTransferTx,\n EvmChainBalance,\n EvmTokenBalance,\n KeyValidationResult,\n SolanaTokenBalance,\n TradePermissionMode,\n WalletAddresses,\n WalletBalancesResponse,\n WalletChain,\n WalletConfigStatus,\n WalletGenerateResult,\n WalletImportResult,\n WalletKeys,\n WalletTradeLedgerEntry,\n WalletTradeSource,\n WalletTradingProfileResponse,\n WalletTradingProfileSourceFilter,\n WalletTradingProfileWindow,\n} from \"@elizaos/core\";\n\n// ── Re-exports from extracted modules ─────────────────────────────────\n\nexport {\n computeValueUsd,\n DEX_PRICE_TIMEOUT_MS,\n DEXPAPRIKA_CHAIN_MAP,\n DEXSCREENER_CHAIN_MAP,\n type DexScreenerPair,\n type DexTokenMeta,\n fetchDexPaprikaPrices,\n fetchDexPrices,\n fetchDexScreenerPrices,\n WRAPPED_NATIVE,\n} from \"./wallet-dex-prices.js\";\n\nexport {\n type AnkrTokenAsset,\n DEFAULT_EVM_CHAINS,\n type EvmProviderKeys,\n fetchEvmBalances,\n resolveEvmProviderKeys,\n} from \"./wallet-evm-balance.js\";\n\n// ── Constants ─────────────────────────────────────────────────────────\n\nconst FETCH_TIMEOUT_MS = 15_000;\nexport const MANAGED_EVM_ADDRESS_ENV_KEY = \"ELIZA_MANAGED_EVM_ADDRESS\";\nexport const MANAGED_SOLANA_ADDRESS_ENV_KEY = \"ELIZA_MANAGED_SOLANA_ADDRESS\";\n\n/** Module-level cache for steward wallet addresses (avoids process.env mutation). */\nlet stewardAddressCache: { evm: string | null; solana: string | null } | null =\n null;\n\n// ── EVM key derivation (secp256k1 via @noble/curves + keccak-256) ─────\n\nfunction generateEvmPrivateKey(): string {\n return `0x${crypto.randomBytes(32).toString(\"hex\")}`;\n}\n\nexport function deriveEvmAddress(privateKeyHex: string): string {\n const cleaned = privateKeyHex.startsWith(\"0x\")\n ? privateKeyHex.slice(2)\n : privateKeyHex;\n // Use @noble/curves — works in Node, Bun, and browsers.\n // (Node's crypto.createECDH(\"secp256k1\") fails in Bun due to BoringSSL.)\n const pubKey = secp256k1.getPublicKey(Buffer.from(cleaned, \"hex\"), false); // uncompressed (65 bytes)\n const pubNoPrefix = pubKey.subarray(1); // drop the 04 prefix\n // Ethereum address = last 20 bytes of keccak-256(pubkey).\n const hash = ethers.keccak256(pubNoPrefix);\n const raw = hash.slice(26); // drop '0x' + first 24 hex chars (12 bytes)\n return ethers.getAddress(`0x${raw}`);\n}\n\n// ── Solana key derivation (Ed25519 via Node crypto) ───────────────────\n\nfunction generateSolanaKeypair(): { privateKey: string; publicKey: string } {\n const { privateKey, publicKey } = crypto.generateKeyPairSync(\"ed25519\");\n const privBytes = privateKey.export({ type: \"pkcs8\", format: \"der\" });\n const pubBytes = publicKey.export({ type: \"spki\", format: \"der\" });\n // Ed25519 PKCS8 DER: raw 32-byte seed at offset 16; SPKI DER: raw 32-byte pubkey at offset 12\n const seed = (privBytes as Buffer).subarray(16, 48);\n const pubRaw = (pubBytes as Buffer).subarray(12, 44);\n // Solana secret key = seed(32) + pubkey(32)\n return {\n privateKey: base58Encode(Buffer.concat([seed, pubRaw])),\n publicKey: base58Encode(pubRaw),\n };\n}\n\nexport function deriveSolanaAddress(privateKeyString: string): string {\n const secretBytes = decodeSolanaPrivateKey(privateKeyString);\n if (secretBytes.length === 64) return base58Encode(secretBytes.subarray(32));\n if (secretBytes.length === 32) {\n // Derive pubkey from 32-byte seed\n const keyObj = crypto.createPrivateKey({\n key: Buffer.concat([\n Buffer.from(\"302e020100300506032b657004220420\", \"hex\"),\n secretBytes,\n ]),\n format: \"der\",\n type: \"pkcs8\",\n });\n const pubDer = crypto\n .createPublicKey(keyObj)\n .export({ type: \"spki\", format: \"der\" }) as Buffer;\n return base58Encode(pubDer.subarray(12, 44));\n }\n throw new Error(`Invalid Solana secret key length: ${secretBytes.length}`);\n}\n\n// ── Base58 (Bitcoin alphabet) ─────────────────────────────────────────\n\nconst B58 = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n\nfunction base58Encode(data: Buffer | Uint8Array): string {\n let num = BigInt(`0x${Buffer.from(data).toString(\"hex\")}`);\n const chars: string[] = [];\n while (num > 0n) {\n chars.unshift(B58[Number(num % 58n)]);\n num /= 58n;\n }\n for (const byte of data) {\n if (byte === 0) chars.unshift(\"1\");\n else break;\n }\n return chars.join(\"\") || \"1\";\n}\n\nfunction base58Decode(str: string): Buffer {\n if (str.length === 0) return Buffer.alloc(0);\n let num = 0n;\n for (const c of str) {\n const i = B58.indexOf(c);\n if (i === -1) throw new Error(`Invalid base58: ${c}`);\n num = num * 58n + BigInt(i);\n }\n const hex = num.toString(16).padStart(2, \"0\");\n const bytes = Buffer.from(hex.length % 2 ? `0${hex}` : hex, \"hex\");\n let zeros = 0;\n for (const c of str) {\n if (c === \"1\") zeros++;\n else break;\n }\n return zeros > 0 ? Buffer.concat([Buffer.alloc(zeros), bytes]) : bytes;\n}\n\n/** Redacted/sentinel env values to skip without treating them as keys. */\nconst ENV_SENTINEL_RE =\n /^\\[?\\s*(REDACTED|PLACEHOLDER|T(?:O)D(?:O)|CHANGEME|EMPTY)\\s*]?$/i;\n\nfunction decodeSolanaPrivateKey(key: string): Buffer {\n if (ENV_SENTINEL_RE.test(key)) {\n throw new Error(\"sentinel env value\");\n }\n // Only attempt JSON array parse when the content looks like a numeric array\n // e.g. [1,2,3,...] — not [REDACTED] or other bracket-wrapped strings\n if (key.startsWith(\"[\") && key.endsWith(\"]\") && /^\\[\\s*\\d/.test(key)) {\n try {\n const parsed = JSON.parse(key) as unknown;\n if (\n !Array.isArray(parsed) ||\n !parsed.every((v) => typeof v === \"number\")\n ) {\n throw new Error(\"not a numeric array\");\n }\n return Buffer.from(parsed);\n } catch {\n throw new Error(\"Invalid JSON byte-array format\");\n }\n }\n return base58Decode(key);\n}\n\n// ── Key validation ────────────────────────────────────────────────────\n\nconst HEX_RE = /^[0-9a-fA-F]+$/;\n\nexport function validateEvmPrivateKey(key: string): KeyValidationResult {\n const cleaned = key.startsWith(\"0x\") ? key.slice(2) : key;\n if (cleaned.length !== 64)\n return {\n valid: false,\n chain: \"evm\",\n address: null,\n error: \"Must be 64 hex characters\",\n };\n if (!HEX_RE.test(cleaned))\n return {\n valid: false,\n chain: \"evm\",\n address: null,\n error: \"Invalid hex characters\",\n };\n try {\n return {\n valid: true,\n chain: \"evm\",\n address: deriveEvmAddress(key),\n error: null,\n };\n } catch (err) {\n return {\n valid: false,\n chain: \"evm\",\n address: null,\n error: `Derivation failed: ${String(err)}`,\n };\n }\n}\n\nexport function validateSolanaPrivateKey(key: string): KeyValidationResult {\n try {\n const bytes = decodeSolanaPrivateKey(key);\n if (bytes.length !== 64 && bytes.length !== 32) {\n return {\n valid: false,\n chain: \"solana\",\n address: null,\n error: `Must be 32 or 64 bytes, got ${bytes.length}`,\n };\n }\n return {\n valid: true,\n chain: \"solana\",\n address: deriveSolanaAddress(key),\n error: null,\n };\n } catch (err) {\n return {\n valid: false,\n chain: \"solana\",\n address: null,\n error: `Invalid key: ${String(err)}`,\n };\n }\n}\n\n/** Auto-detect chain from key format and validate. */\nexport function validatePrivateKey(key: string): KeyValidationResult {\n const trimmed = key.trim();\n if (\n trimmed.startsWith(\"0x\") ||\n (trimmed.length === 64 && HEX_RE.test(trimmed))\n )\n return validateEvmPrivateKey(trimmed);\n return validateSolanaPrivateKey(trimmed);\n}\n\n/** Mask a secret string for safe display (e.g. logs, UI). */\nexport function maskSecret(value: string): string {\n if (!value || value.length <= 8) return \"****\";\n return `${value.slice(0, 4)}...${value.slice(-4)}`;\n}\n\n// ── Key generation ────────────────────────────────────────────────────\n\nexport function generateWalletKeys(): WalletKeys {\n const evmPrivateKey = generateEvmPrivateKey();\n const solana = generateSolanaKeypair();\n return {\n evmPrivateKey,\n evmAddress: deriveEvmAddress(evmPrivateKey),\n solanaPrivateKey: solana.privateKey,\n solanaAddress: solana.publicKey,\n };\n}\n\nexport function generateWalletForChain(\n chain: WalletChain,\n): WalletGenerateResult {\n if (chain === \"evm\") {\n const pk = generateEvmPrivateKey();\n return { chain, address: deriveEvmAddress(pk), privateKey: pk };\n }\n const sol = generateSolanaKeypair();\n return {\n chain: \"solana\",\n address: sol.publicKey,\n privateKey: sol.privateKey,\n };\n}\n\nexport function syncSolanaPublicKeyEnv(\n privateKey = process.env.SOLANA_PRIVATE_KEY,\n): string | null {\n const trimmed = privateKey?.trim();\n if (!trimmed || ENV_SENTINEL_RE.test(trimmed)) {\n return null;\n }\n\n try {\n const publicKey = deriveSolanaAddress(trimmed);\n process.env.SOLANA_PUBLIC_KEY = publicKey;\n process.env.WALLET_PUBLIC_KEY = publicKey;\n return publicKey;\n } catch {\n return null;\n }\n}\n\nexport function setSolanaWalletEnv(privateKey: string): string | null {\n const trimmed = privateKey.trim();\n process.env.SOLANA_PRIVATE_KEY = trimmed;\n return syncSolanaPublicKeyEnv(trimmed);\n}\n\n/** Validate key, store in process.env. Caller persists to config if needed. */\nexport function importWallet(\n chain: WalletChain,\n privateKey: string,\n): WalletImportResult {\n const trimmed = privateKey.trim();\n if (chain === \"evm\") {\n const v = validateEvmPrivateKey(trimmed);\n if (!v.valid)\n return { success: false, chain, address: null, error: v.error };\n process.env.EVM_PRIVATE_KEY = trimmed.startsWith(\"0x\")\n ? trimmed\n : `0x${trimmed}`;\n logger.info(`[wallet] Imported EVM wallet: ${v.address}`);\n return { success: true, chain, address: v.address, error: null };\n }\n const v = validateSolanaPrivateKey(trimmed);\n if (!v.valid) return { success: false, chain, address: null, error: v.error };\n setSolanaWalletEnv(trimmed);\n logger.info(`[wallet] Imported Solana wallet: ${v.address}`);\n return { success: true, chain, address: v.address, error: null };\n}\n\n// ── Steward wallet cache env keys ─────────────────────────────────────\n\nexport const STEWARD_EVM_ADDRESS_ENV_KEY = \"STEWARD_EVM_ADDRESS\";\nexport const STEWARD_SOLANA_ADDRESS_ENV_KEY = \"STEWARD_SOLANA_ADDRESS\";\n\nfunction resolveStewardCredentialsPath(): string {\n return path.join(resolveStateDir(), \"steward-credentials.json\");\n}\n\ntype PersistedStewardCredentials = {\n apiUrl?: string;\n tenantId?: string;\n agentId?: string;\n apiKey?: string;\n agentToken?: string;\n};\n\nfunction normalizeOptionalString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction readPersistedStewardCredentials(): {\n apiUrl: string | null;\n tenantId: string | null;\n agentId: string | null;\n apiKey: string | null;\n agentToken: string | null;\n} | null {\n const credentialsPath = resolveStewardCredentialsPath();\n try {\n if (!fs.existsSync(credentialsPath)) {\n return null;\n }\n const parsed = JSON.parse(\n fs.readFileSync(credentialsPath, \"utf8\"),\n ) as PersistedStewardCredentials;\n return {\n apiUrl: normalizeOptionalString(parsed.apiUrl),\n tenantId: normalizeOptionalString(parsed.tenantId),\n agentId: normalizeOptionalString(parsed.agentId),\n apiKey: normalizeOptionalString(parsed.apiKey),\n agentToken: normalizeOptionalString(parsed.agentToken),\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Initialise the steward wallet address cache.\n *\n * Call once during server startup. Fetches addresses from the steward API\n * and writes them to `process.env.STEWARD_EVM_ADDRESS` /\n * `process.env.STEWARD_SOLANA_ADDRESS` so the synchronous\n * `getWalletAddresses()` can use them without hitting the network.\n */\nexport async function initStewardWalletCache(): Promise<void> {\n const persisted = readPersistedStewardCredentials();\n const stewardApiUrl =\n normalizeOptionalString(process.env.STEWARD_API_URL) ?? persisted?.apiUrl;\n if (!stewardApiUrl) return;\n\n const agentId =\n normalizeOptionalString(process.env.STEWARD_AGENT_ID) ||\n normalizeOptionalString(process.env.ELIZA_STEWARD_AGENT_ID) ||\n persisted?.agentId ||\n null;\n\n if (!agentId) return;\n\n try {\n const headers: Record<string, string> = { Accept: \"application/json\" };\n const bearerToken =\n normalizeOptionalString(process.env.STEWARD_AGENT_TOKEN) ??\n persisted?.agentToken;\n const apiKey =\n normalizeOptionalString(process.env.STEWARD_API_KEY) ?? persisted?.apiKey;\n const tenantId =\n normalizeOptionalString(process.env.STEWARD_TENANT_ID) ??\n persisted?.tenantId;\n\n if (bearerToken) {\n headers.Authorization = `Bearer ${bearerToken}`;\n } else if (apiKey) {\n headers[\"X-Steward-Key\"] = apiKey;\n }\n if (tenantId) {\n headers[\"X-Steward-Tenant\"] = tenantId;\n }\n\n const res = await fetch(\n `${stewardApiUrl}/agents/${encodeURIComponent(agentId)}`,\n { headers, signal: AbortSignal.timeout(FETCH_TIMEOUT_MS) },\n );\n\n if (!res.ok) {\n logger.warn(\n `[wallet] Steward wallet cache init: agent lookup returned ${res.status}`,\n );\n return;\n }\n\n const agent = readStewardAgentWalletPayload(await res.json());\n const stewardEvm =\n agent?.walletAddresses?.evm?.trim() ||\n agent?.walletAddress?.trim() ||\n null;\n const stewardSolana = agent?.walletAddresses?.solana?.trim() || null;\n\n stewardAddressCache = { evm: stewardEvm, solana: stewardSolana };\n if (stewardEvm) {\n process.env[STEWARD_EVM_ADDRESS_ENV_KEY] = stewardEvm;\n } else {\n delete process.env[STEWARD_EVM_ADDRESS_ENV_KEY];\n }\n if (stewardSolana) {\n process.env[STEWARD_SOLANA_ADDRESS_ENV_KEY] = stewardSolana;\n if (!process.env.SOLANA_PUBLIC_KEY?.trim()) {\n process.env.SOLANA_PUBLIC_KEY = stewardSolana;\n }\n if (!process.env.WALLET_PUBLIC_KEY?.trim()) {\n process.env.WALLET_PUBLIC_KEY = stewardSolana;\n }\n } else {\n delete process.env[STEWARD_SOLANA_ADDRESS_ENV_KEY];\n }\n\n if (stewardEvm) {\n logger.info(`[wallet] Steward EVM address cached: ${stewardEvm}`);\n }\n if (stewardSolana) {\n logger.info(`[wallet] Steward Solana address cached: ${stewardSolana}`);\n }\n } catch (err) {\n logger.debug(`[wallet] Steward wallet cache init unavailable: ${err}`);\n }\n}\n\n/**\n * Derive addresses from env keys. Works without a running runtime.\n *\n * Resolution order (steward-first):\n * 1. Steward cached addresses (`STEWARD_EVM_ADDRESS` / `STEWARD_SOLANA_ADDRESS`)\n * 2. Local private key derivation (`EVM_PRIVATE_KEY` / `SOLANA_PRIVATE_KEY`)\n * 3. Managed address env vars (`ELIZA_MANAGED_EVM_ADDRESS` / `ELIZA_MANAGED_SOLANA_ADDRESS`)\n */\nexport function getWalletAddresses(): WalletAddresses {\n let evmAddress: string | null = null;\n let solanaAddress: string | null = null;\n\n // ── 1. Steward cached addresses (primary) ──────────────────────────\n const stewardEvm =\n stewardAddressCache?.evm?.trim() ??\n process.env[STEWARD_EVM_ADDRESS_ENV_KEY]?.trim();\n if (stewardEvm && /^0x[0-9a-fA-F]{40}$/.test(stewardEvm)) {\n evmAddress = stewardEvm;\n }\n\n const stewardSolana =\n stewardAddressCache?.solana?.trim() ??\n process.env[STEWARD_SOLANA_ADDRESS_ENV_KEY]?.trim();\n if (stewardSolana) {\n try {\n const decoded = base58Decode(stewardSolana);\n if (decoded.length === 32) {\n solanaAddress = stewardSolana;\n }\n } catch {\n // invalid — skip\n }\n }\n\n // ── 2. Local private key derivation (fallback) ─────────────────────\n if (!evmAddress) {\n const evmKey = process.env.EVM_PRIVATE_KEY;\n if (evmKey && !ENV_SENTINEL_RE.test(evmKey)) {\n try {\n evmAddress = deriveEvmAddress(evmKey);\n } catch (e) {\n logger.warn(`Bad EVM key: ${e}`);\n }\n }\n }\n\n if (!solanaAddress) {\n const solKey = process.env.SOLANA_PRIVATE_KEY;\n if (solKey && !ENV_SENTINEL_RE.test(solKey)) {\n try {\n solanaAddress = deriveSolanaAddress(solKey);\n } catch (e) {\n logger.warn(`Bad SOL key: ${e}`);\n }\n }\n }\n\n // ── 3. Managed address env vars (last resort) ──────────────────────\n if (!evmAddress) {\n const managedEvmAddress = process.env[MANAGED_EVM_ADDRESS_ENV_KEY];\n if (managedEvmAddress) {\n const trimmed = managedEvmAddress.trim();\n if (/^0x[0-9a-fA-F]{40}$/.test(trimmed)) {\n evmAddress = trimmed;\n } else {\n logger.warn(\"Bad managed EVM address in env\");\n }\n }\n }\n\n if (!solanaAddress) {\n const managedSolanaAddress = process.env[MANAGED_SOLANA_ADDRESS_ENV_KEY];\n if (managedSolanaAddress) {\n const trimmed = managedSolanaAddress.trim();\n try {\n const decoded = base58Decode(trimmed);\n if (decoded.length === 32) {\n solanaAddress = trimmed;\n } else {\n logger.warn(\"Bad managed Solana address in env\");\n }\n } catch {\n logger.warn(\"Bad managed Solana address in env\");\n }\n }\n }\n\n return { evmAddress, solanaAddress };\n}\n\n/**\n * Extended wallet addresses including steward-managed wallets.\n * Calls steward API (async) to discover additional addresses.\n * Key-derived addresses are always preferred; steward addresses fill gaps.\n */\nexport async function getWalletAddressesWithSteward(): Promise<\n WalletAddresses & {\n stewardEvmAddress?: string | null;\n stewardSolanaAddress?: string | null;\n }\n> {\n const base = getWalletAddresses();\n\n // Only augment when steward is configured\n const stewardApiUrl = process.env.STEWARD_API_URL?.trim();\n if (!stewardApiUrl) {\n return base;\n }\n\n const agentId =\n process.env.STEWARD_AGENT_ID?.trim() ||\n process.env.ELIZA_STEWARD_AGENT_ID?.trim() ||\n base.evmAddress?.trim() ||\n null;\n\n if (!agentId) {\n return base;\n }\n\n try {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n };\n const bearerToken = process.env.STEWARD_AGENT_TOKEN?.trim();\n const apiKey = process.env.STEWARD_API_KEY?.trim();\n const tenantId = process.env.STEWARD_TENANT_ID?.trim();\n\n if (bearerToken) {\n headers.Authorization = `Bearer ${bearerToken}`;\n } else if (apiKey) {\n headers[\"X-Steward-Key\"] = apiKey;\n }\n if (tenantId) {\n headers[\"X-Steward-Tenant\"] = tenantId;\n }\n\n const res = await fetch(\n `${stewardApiUrl}/agents/${encodeURIComponent(agentId)}`,\n { headers, signal: AbortSignal.timeout(FETCH_TIMEOUT_MS) },\n );\n\n if (!res.ok) {\n logger.warn(`Steward agent lookup returned ${res.status}`);\n return base;\n }\n\n const agent = readStewardAgentWalletPayload(await res.json());\n const stewardEvm =\n agent?.walletAddresses?.evm?.trim() ||\n agent?.walletAddress?.trim() ||\n null;\n const stewardSolana = agent?.walletAddresses?.solana?.trim() || null;\n\n return {\n evmAddress: base.evmAddress ?? stewardEvm,\n solanaAddress: base.solanaAddress ?? stewardSolana,\n stewardEvmAddress: stewardEvm,\n stewardSolanaAddress: stewardSolana,\n };\n } catch (err) {\n logger.warn(`Steward wallet address lookup failed: ${err}`);\n return base;\n }\n}\n\n// ── Helius API (Solana tokens + NFTs) ─────────────────────────────────\n\ninterface HeliusAsset {\n id: string;\n interface: string;\n content?: {\n metadata?: { name?: string; symbol?: string; description?: string };\n links?: { image?: string };\n };\n token_info?: {\n balance?: number;\n decimals?: number;\n price_info?: { total_price?: number };\n symbol?: string;\n };\n grouping?: Array<{\n group_key?: string;\n collection_metadata?: { name?: string };\n }>;\n}\n\nfunction rpcJsonRequest(body: string): RequestInit {\n return {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),\n body,\n };\n}\n\nfunction describeRpcEndpoint(url: string): string {\n try {\n return new URL(url).host;\n } catch {\n return \"rpc\";\n }\n}\n\n/** Parse JSON from a fetch response. If the body isn't JSON, throw with the raw text. */\nasync function jsonOrThrow<T>(res: Response): Promise<T> {\n const text = await res.text();\n if (!res.ok) throw new Error(text.slice(0, 200) || `HTTP ${res.status}`);\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new Error(text.slice(0, 200) || \"Invalid JSON\");\n }\n}\n\nexport async function fetchSolanaBalances(\n address: string,\n heliusKey: string,\n): Promise<{\n solBalance: string;\n solValueUsd: string;\n tokens: SolanaTokenBalance[];\n}> {\n const url = `https://mainnet.helius-rpc.com/?api-key=${heliusKey}`;\n const rpc = (body: string): RequestInit => ({\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),\n body,\n });\n\n let solBalance = \"0\";\n try {\n const data = await jsonOrThrow<{\n result?: { value?: number };\n error?: { message?: string };\n }>(\n await fetch(\n url,\n rpc(\n JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"getBalance\",\n params: [address],\n }),\n ),\n ),\n );\n if (data.error?.message) throw new Error(data.error.message);\n solBalance = ((data.result?.value ?? 0) / 1e9).toFixed(9);\n } catch (err) {\n logger.warn(`SOL balance fetch failed: ${String(err)}`);\n }\n\n const tokens: SolanaTokenBalance[] = [];\n try {\n const data = await jsonOrThrow<{\n result?: { items?: HeliusAsset[] };\n error?: { message?: string };\n }>(\n await fetch(\n url,\n rpc(\n JSON.stringify({\n jsonrpc: \"2.0\",\n id: 2,\n method: \"getAssetsByOwner\",\n params: {\n ownerAddress: address,\n displayOptions: { showFungible: true, showNativeBalance: true },\n page: 1,\n limit: 100,\n },\n }),\n ),\n ),\n );\n if (data.error?.message) throw new Error(data.error.message);\n for (const item of data.result?.items ?? []) {\n if (\n item.interface !== \"FungibleToken\" &&\n item.interface !== \"FungibleAsset\"\n )\n continue;\n const dec = item.token_info?.decimals ?? 0;\n const raw = item.token_info?.balance ?? 0;\n tokens.push({\n symbol:\n item.token_info?.symbol ?? item.content?.metadata?.symbol ?? \"???\",\n name: item.content?.metadata?.name ?? \"Unknown\",\n mint: item.id,\n balance: dec > 0 ? (raw / 10 ** dec).toString() : raw.toString(),\n decimals: dec,\n valueUsd: item.token_info?.price_info?.total_price?.toFixed(2) ?? \"0\",\n logoUrl: item.content?.links?.image ?? \"\",\n });\n }\n } catch (err) {\n logger.warn(`Solana token fetch failed: ${String(err)}`);\n }\n\n return { solBalance, solValueUsd: \"0\", tokens };\n}\n\nexport async function fetchSolanaNativeBalanceViaRpc(\n address: string,\n rpcUrls: string[],\n): Promise<{\n solBalance: string;\n solValueUsd: string;\n tokens: SolanaTokenBalance[];\n}> {\n const urls = [...new Set(rpcUrls)].filter((u) => Boolean(u?.trim()));\n const errors: string[] = [];\n\n for (const rpcUrl of urls) {\n try {\n const data = await jsonOrThrow<{\n result?: { value?: number };\n error?: { message?: string };\n }>(\n await fetch(\n rpcUrl,\n rpcJsonRequest(\n JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"getBalance\",\n params: [address],\n }),\n ),\n ),\n );\n if (data.error?.message) throw new Error(data.error.message);\n\n const solBalance = ((data.result?.value ?? 0) / 1e9).toFixed(9);\n return { solBalance, solValueUsd: \"0\", tokens: [] };\n } catch (err) {\n const msg = String(err);\n errors.push(`${describeRpcEndpoint(rpcUrl)}: ${msg}`);\n }\n }\n\n throw new Error(errors.join(\" | \").slice(0, 400) || \"Solana RPC unavailable\");\n}\n"],"mappings":"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","names":["v"]}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Chain utilities for displaying chain names, symbols, and block explorer links.
3
+ */
4
+ export declare function getChainName(chainId: number): string;
5
+ export declare function getChainSymbol(chainId: number): string;
6
+ export declare function getExplorerTxUrl(chainId: number, txHash: string): string | null;
7
+ export declare function getExplorerAddressUrl(chainId: number, address: string): string | null;
8
+ export declare function truncateAddress(address: string, chars?: number): string;
9
+ export declare function formatWeiValue(weiStr: string, chainId: number): string;
10
+ //# sourceMappingURL=chain-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain-utils.d.ts","sourceRoot":"","sources":["../src/chain-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwCH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CAOf;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,IAAI,CAOf;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,MAAM,CAGlE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAkBtE"}
@@ -0,0 +1,81 @@
1
+ const CHAIN_MAP = {
2
+ 1: { name: "Ethereum", symbol: "ETH", explorerBase: "https://etherscan.io" },
3
+ 56: { name: "BSC", symbol: "BNB", explorerBase: "https://bscscan.com" },
4
+ 97: {
5
+ name: "BSC Testnet",
6
+ symbol: "tBNB",
7
+ explorerBase: "https://testnet.bscscan.com"
8
+ },
9
+ 137: {
10
+ name: "Polygon",
11
+ symbol: "POL",
12
+ explorerBase: "https://polygonscan.com"
13
+ },
14
+ 8453: { name: "Base", symbol: "ETH", explorerBase: "https://basescan.org" },
15
+ 42161: {
16
+ name: "Arbitrum",
17
+ symbol: "ETH",
18
+ explorerBase: "https://arbiscan.io"
19
+ },
20
+ 84532: {
21
+ name: "Base Sepolia",
22
+ symbol: "ETH",
23
+ explorerBase: "https://sepolia.basescan.org"
24
+ },
25
+ 101: { name: "Solana", symbol: "SOL", explorerBase: "https://solscan.io" },
26
+ 102: {
27
+ name: "Solana Devnet",
28
+ symbol: "SOL",
29
+ explorerBase: "https://solscan.io"
30
+ }
31
+ };
32
+ function getChainName(chainId) {
33
+ return CHAIN_MAP[chainId]?.name ?? `Chain ${chainId}`;
34
+ }
35
+ function getChainSymbol(chainId) {
36
+ return CHAIN_MAP[chainId]?.symbol ?? "???";
37
+ }
38
+ function getExplorerTxUrl(chainId, txHash) {
39
+ const meta = CHAIN_MAP[chainId];
40
+ if (!meta || !txHash) return null;
41
+ if (chainId === 101 || chainId === 102) {
42
+ return `${meta.explorerBase}/tx/${txHash}${chainId === 102 ? "?cluster=devnet" : ""}`;
43
+ }
44
+ return `${meta.explorerBase}/tx/${txHash}`;
45
+ }
46
+ function getExplorerAddressUrl(chainId, address) {
47
+ const meta = CHAIN_MAP[chainId];
48
+ if (!meta || !address) return null;
49
+ if (chainId === 101 || chainId === 102) {
50
+ return `${meta.explorerBase}/account/${address}${chainId === 102 ? "?cluster=devnet" : ""}`;
51
+ }
52
+ return `${meta.explorerBase}/address/${address}`;
53
+ }
54
+ function truncateAddress(address, chars = 6) {
55
+ if (!address || address.length <= chars * 2 + 2) return address;
56
+ return `${address.slice(0, chars + 2)}\u2026${address.slice(-chars)}`;
57
+ }
58
+ function formatWeiValue(weiStr, chainId) {
59
+ try {
60
+ const wei = BigInt(weiStr);
61
+ const isSolana = chainId === 101 || chainId === 102;
62
+ const decimals = isSolana ? 9 : 18;
63
+ const divisor = BigInt(10 ** decimals);
64
+ const whole = wei / divisor;
65
+ const frac = wei % divisor;
66
+ const fracStr = frac.toString().padStart(decimals, "0").slice(0, 6).replace(/0+$/, "");
67
+ const symbol = getChainSymbol(chainId);
68
+ return `${whole}${fracStr ? `.${fracStr}` : ""} ${symbol}`;
69
+ } catch {
70
+ return `${weiStr} wei`;
71
+ }
72
+ }
73
+ export {
74
+ formatWeiValue,
75
+ getChainName,
76
+ getChainSymbol,
77
+ getExplorerAddressUrl,
78
+ getExplorerTxUrl,
79
+ truncateAddress
80
+ };
81
+ //# sourceMappingURL=chain-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/chain-utils.ts"],"sourcesContent":["/**\n * Chain utilities for displaying chain names, symbols, and block explorer links.\n */\n\ninterface ChainMeta {\n name: string;\n symbol: string;\n explorerBase: string;\n}\n\nconst CHAIN_MAP: Record<number, ChainMeta> = {\n 1: { name: \"Ethereum\", symbol: \"ETH\", explorerBase: \"https://etherscan.io\" },\n 56: { name: \"BSC\", symbol: \"BNB\", explorerBase: \"https://bscscan.com\" },\n 97: {\n name: \"BSC Testnet\",\n symbol: \"tBNB\",\n explorerBase: \"https://testnet.bscscan.com\",\n },\n 137: {\n name: \"Polygon\",\n symbol: \"POL\",\n explorerBase: \"https://polygonscan.com\",\n },\n 8453: { name: \"Base\", symbol: \"ETH\", explorerBase: \"https://basescan.org\" },\n 42161: {\n name: \"Arbitrum\",\n symbol: \"ETH\",\n explorerBase: \"https://arbiscan.io\",\n },\n 84532: {\n name: \"Base Sepolia\",\n symbol: \"ETH\",\n explorerBase: \"https://sepolia.basescan.org\",\n },\n 101: { name: \"Solana\", symbol: \"SOL\", explorerBase: \"https://solscan.io\" },\n 102: {\n name: \"Solana Devnet\",\n symbol: \"SOL\",\n explorerBase: \"https://solscan.io\",\n },\n};\n\nexport function getChainName(chainId: number): string {\n return CHAIN_MAP[chainId]?.name ?? `Chain ${chainId}`;\n}\n\nexport function getChainSymbol(chainId: number): string {\n return CHAIN_MAP[chainId]?.symbol ?? \"???\";\n}\n\nexport function getExplorerTxUrl(\n chainId: number,\n txHash: string,\n): string | null {\n const meta = CHAIN_MAP[chainId];\n if (!meta || !txHash) return null;\n if (chainId === 101 || chainId === 102) {\n return `${meta.explorerBase}/tx/${txHash}${chainId === 102 ? \"?cluster=devnet\" : \"\"}`;\n }\n return `${meta.explorerBase}/tx/${txHash}`;\n}\n\nexport function getExplorerAddressUrl(\n chainId: number,\n address: string,\n): string | null {\n const meta = CHAIN_MAP[chainId];\n if (!meta || !address) return null;\n if (chainId === 101 || chainId === 102) {\n return `${meta.explorerBase}/account/${address}${chainId === 102 ? \"?cluster=devnet\" : \"\"}`;\n }\n return `${meta.explorerBase}/address/${address}`;\n}\n\nexport function truncateAddress(address: string, chars = 6): string {\n if (!address || address.length <= chars * 2 + 2) return address;\n return `${address.slice(0, chars + 2)}…${address.slice(-chars)}`;\n}\n\nexport function formatWeiValue(weiStr: string, chainId: number): string {\n try {\n const wei = BigInt(weiStr);\n const isSolana = chainId === 101 || chainId === 102;\n const decimals = isSolana ? 9 : 18;\n const divisor = BigInt(10 ** decimals);\n const whole = wei / divisor;\n const frac = wei % divisor;\n const fracStr = frac\n .toString()\n .padStart(decimals, \"0\")\n .slice(0, 6)\n .replace(/0+$/, \"\");\n const symbol = getChainSymbol(chainId);\n return `${whole}${fracStr ? `.${fracStr}` : \"\"} ${symbol}`;\n } catch {\n return `${weiStr} wei`;\n }\n}\n"],"mappings":"AAUA,MAAM,YAAuC;AAAA,EAC3C,GAAG,EAAE,MAAM,YAAY,QAAQ,OAAO,cAAc,uBAAuB;AAAA,EAC3E,IAAI,EAAE,MAAM,OAAO,QAAQ,OAAO,cAAc,sBAAsB;AAAA,EACtE,IAAI;AAAA,IACF,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AAAA,EACA,KAAK;AAAA,IACH,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AAAA,EACA,MAAM,EAAE,MAAM,QAAQ,QAAQ,OAAO,cAAc,uBAAuB;AAAA,EAC1E,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AAAA,EACA,KAAK,EAAE,MAAM,UAAU,QAAQ,OAAO,cAAc,qBAAqB;AAAA,EACzE,KAAK;AAAA,IACH,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AACF;AAEO,SAAS,aAAa,SAAyB;AACpD,SAAO,UAAU,OAAO,GAAG,QAAQ,SAAS,OAAO;AACrD;AAEO,SAAS,eAAe,SAAyB;AACtD,SAAO,UAAU,OAAO,GAAG,UAAU;AACvC;AAEO,SAAS,iBACd,SACA,QACe;AACf,QAAM,OAAO,UAAU,OAAO;AAC9B,MAAI,CAAC,QAAQ,CAAC,OAAQ,QAAO;AAC7B,MAAI,YAAY,OAAO,YAAY,KAAK;AACtC,WAAO,GAAG,KAAK,YAAY,OAAO,MAAM,GAAG,YAAY,MAAM,oBAAoB,EAAE;AAAA,EACrF;AACA,SAAO,GAAG,KAAK,YAAY,OAAO,MAAM;AAC1C;AAEO,SAAS,sBACd,SACA,SACe;AACf,QAAM,OAAO,UAAU,OAAO;AAC9B,MAAI,CAAC,QAAQ,CAAC,QAAS,QAAO;AAC9B,MAAI,YAAY,OAAO,YAAY,KAAK;AACtC,WAAO,GAAG,KAAK,YAAY,YAAY,OAAO,GAAG,YAAY,MAAM,oBAAoB,EAAE;AAAA,EAC3F;AACA,SAAO,GAAG,KAAK,YAAY,YAAY,OAAO;AAChD;AAEO,SAAS,gBAAgB,SAAiB,QAAQ,GAAW;AAClE,MAAI,CAAC,WAAW,QAAQ,UAAU,QAAQ,IAAI,EAAG,QAAO;AACxD,SAAO,GAAG,QAAQ,MAAM,GAAG,QAAQ,CAAC,CAAC,SAAI,QAAQ,MAAM,CAAC,KAAK,CAAC;AAChE;AAEO,SAAS,eAAe,QAAgB,SAAyB;AACtE,MAAI;AACF,UAAM,MAAM,OAAO,MAAM;AACzB,UAAM,WAAW,YAAY,OAAO,YAAY;AAChD,UAAM,WAAW,WAAW,IAAI;AAChC,UAAM,UAAU,OAAO,MAAM,QAAQ;AACrC,UAAM,QAAQ,MAAM;AACpB,UAAM,OAAO,MAAM;AACnB,UAAM,UAAU,KACb,SAAS,EACT,SAAS,UAAU,GAAG,EACtB,MAAM,GAAG,CAAC,EACV,QAAQ,OAAO,EAAE;AACpB,UAAM,SAAS,eAAe,OAAO;AACrC,WAAO,GAAG,KAAK,GAAG,UAAU,IAAI,OAAO,KAAK,EAAE,IAAI,MAAM;AAAA,EAC1D,QAAQ;AACN,WAAO,GAAG,MAAM;AAAA,EAClB;AACF;","names":[]}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * StewardSpatialView — the Steward approvals + history panel authored once with
3
+ * the spatial vocabulary, so it renders correctly wherever it is displayed:
4
+ *
5
+ * - GUI / XR - mounted in `<SpatialSurface>` (DOM; XR scales up).
6
+ * - TUI - rendered to real terminal lines by the agent terminal, via
7
+ * `registerSpatialTerminalView` (see `register-terminal-view.tsx`).
8
+ *
9
+ * It is purely presentational (a snapshot + an action callback in, primitives
10
+ * out) and imports only the cross-modality primitives plus type-only views of
11
+ * the Steward response shapes, so it is safe to render in the Node agent process
12
+ * where the terminal lives (no browser/app-runtime import).
13
+ */
14
+ import type { StewardPendingApproval, StewardTxRecord, StewardTxStatus } from "../types/steward.js";
15
+ /** A pending-approval row in the snapshot (mirrors the loopback pending shape). */
16
+ export interface StewardApprovalRow {
17
+ queueId: string;
18
+ requestedAt: string;
19
+ txId: string;
20
+ status: string;
21
+ chainId: number;
22
+ to: string;
23
+ value: string;
24
+ /** Count of policy results attached to the transaction. */
25
+ policyCount: number;
26
+ }
27
+ /** A history row in the snapshot (mirrors the loopback tx-record shape). */
28
+ export interface StewardHistoryRow {
29
+ id: string;
30
+ createdAt: string;
31
+ status: StewardTxStatus;
32
+ chainId: number;
33
+ to: string;
34
+ value: string;
35
+ txHash?: string;
36
+ }
37
+ export interface StewardSnapshot {
38
+ /** Active tab — Approvals or History. */
39
+ tab: "approvals" | "history";
40
+ connected: boolean;
41
+ configured: boolean;
42
+ available: boolean;
43
+ evmAddress: string | null;
44
+ pendingApprovals: StewardApprovalRow[];
45
+ history: StewardHistoryRow[];
46
+ /** Total history records (for pagination, not the visible slice length). */
47
+ historyTotal: number;
48
+ /** Active history filters. */
49
+ statusFilter: string | null;
50
+ chainFilter: number | null;
51
+ /** 0-based page index. */
52
+ page: number;
53
+ pageSize: number;
54
+ loading?: boolean;
55
+ error?: string | null;
56
+ }
57
+ /** Map a native pending-approval entry to the presentational row shape. */
58
+ export declare function toStewardApprovalRow(entry: StewardPendingApproval): StewardApprovalRow;
59
+ /** Map a native tx record to the presentational history row shape. */
60
+ export declare function toStewardHistoryRow(record: StewardTxRecord): StewardHistoryRow;
61
+ export interface StewardSpatialViewProps {
62
+ snapshot: StewardSnapshot;
63
+ /**
64
+ * Dispatch by agent id: `tab:approvals`, `tab:history`, `refresh`,
65
+ * `approve:<queueId>`, `reject:<queueId>`, `copy:<value>`,
66
+ * `filter-status`, `filter-chain`, `page-prev`, `page-next`.
67
+ *
68
+ * `copy:<value>` carries the literal string to copy to the clipboard (the
69
+ * recipient address for both approval and history rows).
70
+ */
71
+ onAction?: (action: string) => void;
72
+ }
73
+ export declare function StewardSpatialView({ snapshot, onAction, }: StewardSpatialViewProps): import("react/jsx-runtime").JSX.Element;
74
+ //# sourceMappingURL=StewardSpatialView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StewardSpatialView.d.ts","sourceRoot":"","sources":["../../src/components/StewardSpatialView.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAYH,OAAO,KAAK,EACV,sBAAsB,EACtB,eAAe,EACf,eAAe,EAChB,MAAM,qBAAqB,CAAC;AAE7B,mFAAmF;AACnF,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,4EAA4E;AAC5E,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,yCAAyC;IACzC,GAAG,EAAE,WAAW,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,gBAAgB,EAAE,kBAAkB,EAAE,CAAC;IACvC,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,4EAA4E;IAC5E,YAAY,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AA2BD,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,sBAAsB,GAC5B,kBAAkB,CAYpB;AAED,sEAAsE;AACtE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,eAAe,GACtB,iBAAiB,CAUnB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,eAAe,CAAC;IAC1B;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAyMD,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,GACT,EAAE,uBAAuB,2CA8DzB"}
@@ -0,0 +1,309 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import {
3
+ Button,
4
+ Card,
5
+ Divider,
6
+ HStack,
7
+ List,
8
+ Text,
9
+ VStack
10
+ } from "@elizaos/ui/spatial";
11
+ const PAGE_SIZE = 25;
12
+ function statusTone(status) {
13
+ switch (status) {
14
+ case "confirmed":
15
+ case "broadcast":
16
+ case "approved":
17
+ case "signed":
18
+ return "success";
19
+ case "failed":
20
+ case "rejected":
21
+ return "danger";
22
+ case "pending":
23
+ return "warning";
24
+ default:
25
+ return "muted";
26
+ }
27
+ }
28
+ function shortAddress(value) {
29
+ if (!value) return "no steward evm address";
30
+ if (value.length <= 12) return value;
31
+ return `${value.slice(0, 6)}..${value.slice(-4)}`;
32
+ }
33
+ function toStewardApprovalRow(entry) {
34
+ const tx = entry.transaction;
35
+ return {
36
+ queueId: entry.queueId,
37
+ requestedAt: entry.requestedAt,
38
+ txId: tx.id,
39
+ status: tx.status,
40
+ chainId: tx.request.chainId,
41
+ to: tx.request.to,
42
+ value: tx.request.value,
43
+ policyCount: tx.policyResults.length
44
+ };
45
+ }
46
+ function toStewardHistoryRow(record) {
47
+ return {
48
+ id: record.id,
49
+ createdAt: record.createdAt,
50
+ status: record.status,
51
+ chainId: record.request.chainId,
52
+ to: record.request.to,
53
+ value: record.request.value,
54
+ txHash: record.txHash
55
+ };
56
+ }
57
+ function StatusLine({ label, value }) {
58
+ return /* @__PURE__ */ jsxs(HStack, { gap: 1, align: "center", children: [
59
+ /* @__PURE__ */ jsx(Text, { style: "caption", tone: "muted", children: label }),
60
+ /* @__PURE__ */ jsx(Text, { style: "caption", grow: 1, wrap: false, children: value })
61
+ ] });
62
+ }
63
+ function ApprovalsBody({
64
+ snapshot,
65
+ dispatch
66
+ }) {
67
+ return /* @__PURE__ */ jsxs(VStack, { gap: 1, width: "100%", children: [
68
+ /* @__PURE__ */ jsx(
69
+ StatusLine,
70
+ {
71
+ label: "configured",
72
+ value: snapshot.configured ? "yes" : "no"
73
+ }
74
+ ),
75
+ /* @__PURE__ */ jsx(StatusLine, { label: "available", value: snapshot.available ? "yes" : "no" }),
76
+ /* @__PURE__ */ jsx(StatusLine, { label: "evm", value: shortAddress(snapshot.evmAddress) }),
77
+ !snapshot.connected && !snapshot.loading ? /* @__PURE__ */ jsx(Text, { tone: "muted", style: "caption", wrap: true, children: "Set STEWARD_API_URL and STEWARD_API_KEY to enable vault approvals." }) : null,
78
+ /* @__PURE__ */ jsx(Divider, { label: "pending approvals" }),
79
+ snapshot.pendingApprovals.length === 0 ? /* @__PURE__ */ jsx(Text, { tone: "muted", align: "center", style: "caption", children: snapshot.loading ? "Loading" : "None" }) : /* @__PURE__ */ jsx(List, { gap: 1, width: "100%", children: snapshot.pendingApprovals.map((item) => /* @__PURE__ */ jsxs(
80
+ VStack,
81
+ {
82
+ gap: 0,
83
+ width: "100%",
84
+ agent: `approval-${item.queueId}`,
85
+ children: [
86
+ /* @__PURE__ */ jsxs(HStack, { gap: 1, align: "center", width: "100%", children: [
87
+ /* @__PURE__ */ jsx(Text, { bold: true, grow: 1, wrap: false, children: item.txId }),
88
+ /* @__PURE__ */ jsx(Text, { style: "caption", tone: statusTone(item.status), children: item.status })
89
+ ] }),
90
+ /* @__PURE__ */ jsxs(HStack, { gap: 1, align: "center", width: "100%", children: [
91
+ /* @__PURE__ */ jsxs(Text, { style: "caption", tone: "muted", grow: 1, wrap: false, children: [
92
+ "chain ",
93
+ item.chainId,
94
+ " to ",
95
+ item.to
96
+ ] }),
97
+ /* @__PURE__ */ jsx(
98
+ Button,
99
+ {
100
+ variant: "ghost",
101
+ tone: "default",
102
+ agent: `copy-${item.queueId}`,
103
+ onPress: dispatch(`copy:${item.to}`),
104
+ children: "Copy"
105
+ }
106
+ )
107
+ ] }),
108
+ /* @__PURE__ */ jsxs(Text, { style: "caption", tone: "muted", wrap: false, children: [
109
+ "value ",
110
+ item.value,
111
+ " | ",
112
+ item.policyCount,
113
+ " policy"
114
+ ] }),
115
+ /* @__PURE__ */ jsxs(HStack, { gap: 1, width: "100%", children: [
116
+ /* @__PURE__ */ jsx(
117
+ Button,
118
+ {
119
+ tone: "primary",
120
+ grow: 1,
121
+ agent: `approve-${item.queueId}`,
122
+ onPress: dispatch(`approve:${item.queueId}`),
123
+ children: "Approve"
124
+ }
125
+ ),
126
+ /* @__PURE__ */ jsx(
127
+ Button,
128
+ {
129
+ variant: "outline",
130
+ tone: "danger",
131
+ grow: 1,
132
+ agent: `reject-${item.queueId}`,
133
+ onPress: dispatch(`reject:${item.queueId}`),
134
+ children: "Reject"
135
+ }
136
+ )
137
+ ] })
138
+ ]
139
+ },
140
+ item.queueId
141
+ )) })
142
+ ] });
143
+ }
144
+ function HistoryBody({
145
+ snapshot,
146
+ dispatch
147
+ }) {
148
+ const pageSize = snapshot.pageSize || PAGE_SIZE;
149
+ const totalPages = Math.max(1, Math.ceil(snapshot.historyTotal / pageSize));
150
+ const pageLabel = `page ${snapshot.page + 1}/${totalPages}`;
151
+ return /* @__PURE__ */ jsxs(VStack, { gap: 1, width: "100%", children: [
152
+ /* @__PURE__ */ jsxs(HStack, { gap: 1, align: "center", width: "100%", children: [
153
+ /* @__PURE__ */ jsxs(Text, { style: "caption", tone: "muted", grow: 1, children: [
154
+ snapshot.historyTotal,
155
+ " records"
156
+ ] }),
157
+ /* @__PURE__ */ jsxs(
158
+ Button,
159
+ {
160
+ variant: "outline",
161
+ tone: "default",
162
+ agent: "filter-status",
163
+ onPress: dispatch("filter-status"),
164
+ children: [
165
+ "status: ",
166
+ snapshot.statusFilter ?? "all"
167
+ ]
168
+ }
169
+ ),
170
+ /* @__PURE__ */ jsxs(
171
+ Button,
172
+ {
173
+ variant: "outline",
174
+ tone: "default",
175
+ agent: "filter-chain",
176
+ onPress: dispatch("filter-chain"),
177
+ children: [
178
+ "chain: ",
179
+ snapshot.chainFilter ?? "all"
180
+ ]
181
+ }
182
+ )
183
+ ] }),
184
+ /* @__PURE__ */ jsx(Divider, { label: "transaction history" }),
185
+ snapshot.history.length === 0 ? /* @__PURE__ */ jsx(Text, { tone: "muted", align: "center", style: "caption", children: snapshot.loading ? "Loading" : "None" }) : /* @__PURE__ */ jsx(List, { gap: 1, width: "100%", children: snapshot.history.map((tx) => /* @__PURE__ */ jsxs(VStack, { gap: 0, width: "100%", agent: `tx-${tx.id}`, children: [
186
+ /* @__PURE__ */ jsxs(HStack, { gap: 1, align: "center", width: "100%", children: [
187
+ /* @__PURE__ */ jsx(Text, { bold: true, grow: 1, wrap: false, children: tx.id }),
188
+ /* @__PURE__ */ jsx(Text, { style: "caption", tone: statusTone(tx.status), children: tx.status }),
189
+ /* @__PURE__ */ jsx(
190
+ Button,
191
+ {
192
+ variant: "ghost",
193
+ tone: "default",
194
+ agent: `copy-${tx.id}`,
195
+ onPress: dispatch(`copy:${tx.to}`),
196
+ children: "Copy"
197
+ }
198
+ )
199
+ ] }),
200
+ /* @__PURE__ */ jsxs(Text, { style: "caption", tone: "muted", wrap: false, children: [
201
+ "chain ",
202
+ tx.chainId,
203
+ " to ",
204
+ tx.to
205
+ ] }),
206
+ tx.txHash ? /* @__PURE__ */ jsxs(Text, { style: "caption", tone: "muted", wrap: false, children: [
207
+ "hash ",
208
+ tx.txHash
209
+ ] }) : null
210
+ ] }, tx.id)) }),
211
+ /* @__PURE__ */ jsxs(HStack, { gap: 1, align: "center", width: "100%", children: [
212
+ /* @__PURE__ */ jsx(
213
+ Button,
214
+ {
215
+ variant: "outline",
216
+ tone: "default",
217
+ disabled: snapshot.page <= 0,
218
+ agent: "page-prev",
219
+ onPress: dispatch("page-prev"),
220
+ children: "Prev"
221
+ }
222
+ ),
223
+ /* @__PURE__ */ jsx(Text, { style: "caption", tone: "muted", align: "center", grow: 1, children: pageLabel }),
224
+ /* @__PURE__ */ jsx(
225
+ Button,
226
+ {
227
+ variant: "outline",
228
+ tone: "default",
229
+ disabled: snapshot.page + 1 >= totalPages,
230
+ agent: "page-next",
231
+ onPress: dispatch("page-next"),
232
+ children: "Next"
233
+ }
234
+ )
235
+ ] })
236
+ ] });
237
+ }
238
+ function StewardSpatialView({
239
+ snapshot,
240
+ onAction
241
+ }) {
242
+ const dispatch = (action) => () => onAction?.(action);
243
+ const title = snapshot.tab === "approvals" ? "Approvals" : "History";
244
+ return /* @__PURE__ */ jsxs(Card, { gap: 1, padding: 1, children: [
245
+ /* @__PURE__ */ jsxs(HStack, { gap: 1, align: "center", width: "100%", children: [
246
+ /* @__PURE__ */ jsx(
247
+ Text,
248
+ {
249
+ style: "caption",
250
+ tone: snapshot.connected ? "success" : "danger",
251
+ grow: 1,
252
+ children: snapshot.connected ? "connected" : "not-connected"
253
+ }
254
+ ),
255
+ /* @__PURE__ */ jsx(Text, { style: "caption", tone: "muted", children: shortAddress(snapshot.evmAddress) })
256
+ ] }),
257
+ snapshot.error ? /* @__PURE__ */ jsx(Text, { tone: "danger", style: "caption", wrap: true, children: snapshot.error }) : null,
258
+ /* @__PURE__ */ jsxs(HStack, { gap: 1, width: "100%", wrap: true, children: [
259
+ /* @__PURE__ */ jsxs(
260
+ Button,
261
+ {
262
+ variant: snapshot.tab === "approvals" ? "solid" : "outline",
263
+ tone: snapshot.tab === "approvals" ? "primary" : "default",
264
+ grow: 1,
265
+ agent: "tab-approvals",
266
+ onPress: dispatch("tab:approvals"),
267
+ children: [
268
+ "Approvals (",
269
+ snapshot.pendingApprovals.length,
270
+ ")"
271
+ ]
272
+ }
273
+ ),
274
+ /* @__PURE__ */ jsxs(
275
+ Button,
276
+ {
277
+ variant: snapshot.tab === "history" ? "solid" : "outline",
278
+ tone: snapshot.tab === "history" ? "primary" : "default",
279
+ grow: 1,
280
+ agent: "tab-history",
281
+ onPress: dispatch("tab:history"),
282
+ children: [
283
+ "History (",
284
+ snapshot.historyTotal,
285
+ ")"
286
+ ]
287
+ }
288
+ ),
289
+ /* @__PURE__ */ jsx(
290
+ Button,
291
+ {
292
+ variant: "ghost",
293
+ tone: "default",
294
+ agent: "refresh",
295
+ onPress: dispatch("refresh"),
296
+ children: snapshot.loading ? "..." : "Refresh"
297
+ }
298
+ )
299
+ ] }),
300
+ /* @__PURE__ */ jsx(Divider, { label: title }),
301
+ snapshot.tab === "approvals" ? /* @__PURE__ */ jsx(ApprovalsBody, { snapshot, dispatch }) : /* @__PURE__ */ jsx(HistoryBody, { snapshot, dispatch })
302
+ ] });
303
+ }
304
+ export {
305
+ StewardSpatialView,
306
+ toStewardApprovalRow,
307
+ toStewardHistoryRow
308
+ };
309
+ //# sourceMappingURL=StewardSpatialView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/StewardSpatialView.tsx"],"sourcesContent":["/**\n * StewardSpatialView — the Steward approvals + history panel authored once with\n * the spatial vocabulary, so it renders correctly wherever it is displayed:\n *\n * - GUI / XR - mounted in `<SpatialSurface>` (DOM; XR scales up).\n * - TUI - rendered to real terminal lines by the agent terminal, via\n * `registerSpatialTerminalView` (see `register-terminal-view.tsx`).\n *\n * It is purely presentational (a snapshot + an action callback in, primitives\n * out) and imports only the cross-modality primitives plus type-only views of\n * the Steward response shapes, so it is safe to render in the Node agent process\n * where the terminal lives (no browser/app-runtime import).\n */\n\nimport {\n Button,\n Card,\n Divider,\n HStack,\n List,\n type SpatialTone,\n Text,\n VStack,\n} from \"@elizaos/ui/spatial\";\nimport type {\n StewardPendingApproval,\n StewardTxRecord,\n StewardTxStatus,\n} from \"../types/steward.js\";\n\n/** A pending-approval row in the snapshot (mirrors the loopback pending shape). */\nexport interface StewardApprovalRow {\n queueId: string;\n requestedAt: string;\n txId: string;\n status: string;\n chainId: number;\n to: string;\n value: string;\n /** Count of policy results attached to the transaction. */\n policyCount: number;\n}\n\n/** A history row in the snapshot (mirrors the loopback tx-record shape). */\nexport interface StewardHistoryRow {\n id: string;\n createdAt: string;\n status: StewardTxStatus;\n chainId: number;\n to: string;\n value: string;\n txHash?: string;\n}\n\nexport interface StewardSnapshot {\n /** Active tab — Approvals or History. */\n tab: \"approvals\" | \"history\";\n connected: boolean;\n configured: boolean;\n available: boolean;\n evmAddress: string | null;\n pendingApprovals: StewardApprovalRow[];\n history: StewardHistoryRow[];\n /** Total history records (for pagination, not the visible slice length). */\n historyTotal: number;\n /** Active history filters. */\n statusFilter: string | null;\n chainFilter: number | null;\n /** 0-based page index. */\n page: number;\n pageSize: number;\n loading?: boolean;\n error?: string | null;\n}\n\nconst PAGE_SIZE = 25;\n\nfunction statusTone(status: string): SpatialTone {\n switch (status) {\n case \"confirmed\":\n case \"broadcast\":\n case \"approved\":\n case \"signed\":\n return \"success\";\n case \"failed\":\n case \"rejected\":\n return \"danger\";\n case \"pending\":\n return \"warning\";\n default:\n return \"muted\";\n }\n}\n\nfunction shortAddress(value: string | null | undefined): string {\n if (!value) return \"no steward evm address\";\n if (value.length <= 12) return value;\n return `${value.slice(0, 6)}..${value.slice(-4)}`;\n}\n\n/** Map a native pending-approval entry to the presentational row shape. */\nexport function toStewardApprovalRow(\n entry: StewardPendingApproval,\n): StewardApprovalRow {\n const tx = entry.transaction;\n return {\n queueId: entry.queueId,\n requestedAt: entry.requestedAt,\n txId: tx.id,\n status: tx.status,\n chainId: tx.request.chainId,\n to: tx.request.to,\n value: tx.request.value,\n policyCount: tx.policyResults.length,\n };\n}\n\n/** Map a native tx record to the presentational history row shape. */\nexport function toStewardHistoryRow(\n record: StewardTxRecord,\n): StewardHistoryRow {\n return {\n id: record.id,\n createdAt: record.createdAt,\n status: record.status,\n chainId: record.request.chainId,\n to: record.request.to,\n value: record.request.value,\n txHash: record.txHash,\n };\n}\n\nexport interface StewardSpatialViewProps {\n snapshot: StewardSnapshot;\n /**\n * Dispatch by agent id: `tab:approvals`, `tab:history`, `refresh`,\n * `approve:<queueId>`, `reject:<queueId>`, `copy:<value>`,\n * `filter-status`, `filter-chain`, `page-prev`, `page-next`.\n *\n * `copy:<value>` carries the literal string to copy to the clipboard (the\n * recipient address for both approval and history rows).\n */\n onAction?: (action: string) => void;\n}\n\nfunction StatusLine({ label, value }: { label: string; value: string }) {\n return (\n <HStack gap={1} align=\"center\">\n <Text style=\"caption\" tone=\"muted\">\n {label}\n </Text>\n <Text style=\"caption\" grow={1} wrap={false}>\n {value}\n </Text>\n </HStack>\n );\n}\n\nfunction ApprovalsBody({\n snapshot,\n dispatch,\n}: {\n snapshot: StewardSnapshot;\n dispatch: (action: string) => () => void;\n}) {\n return (\n <VStack gap={1} width=\"100%\">\n <StatusLine\n label=\"configured\"\n value={snapshot.configured ? \"yes\" : \"no\"}\n />\n <StatusLine label=\"available\" value={snapshot.available ? \"yes\" : \"no\"} />\n <StatusLine label=\"evm\" value={shortAddress(snapshot.evmAddress)} />\n\n {!snapshot.connected && !snapshot.loading ? (\n <Text tone=\"muted\" style=\"caption\" wrap>\n Set STEWARD_API_URL and STEWARD_API_KEY to enable vault approvals.\n </Text>\n ) : null}\n\n <Divider label=\"pending approvals\" />\n {snapshot.pendingApprovals.length === 0 ? (\n <Text tone=\"muted\" align=\"center\" style=\"caption\">\n {snapshot.loading ? \"Loading\" : \"None\"}\n </Text>\n ) : (\n <List gap={1} width=\"100%\">\n {snapshot.pendingApprovals.map((item) => (\n <VStack\n key={item.queueId}\n gap={0}\n width=\"100%\"\n agent={`approval-${item.queueId}`}\n >\n <HStack gap={1} align=\"center\" width=\"100%\">\n <Text bold grow={1} wrap={false}>\n {item.txId}\n </Text>\n <Text style=\"caption\" tone={statusTone(item.status)}>\n {item.status}\n </Text>\n </HStack>\n <HStack gap={1} align=\"center\" width=\"100%\">\n <Text style=\"caption\" tone=\"muted\" grow={1} wrap={false}>\n chain {item.chainId} to {item.to}\n </Text>\n <Button\n variant=\"ghost\"\n tone=\"default\"\n agent={`copy-${item.queueId}`}\n onPress={dispatch(`copy:${item.to}`)}\n >\n Copy\n </Button>\n </HStack>\n <Text style=\"caption\" tone=\"muted\" wrap={false}>\n value {item.value} | {item.policyCount} policy\n </Text>\n <HStack gap={1} width=\"100%\">\n <Button\n tone=\"primary\"\n grow={1}\n agent={`approve-${item.queueId}`}\n onPress={dispatch(`approve:${item.queueId}`)}\n >\n Approve\n </Button>\n <Button\n variant=\"outline\"\n tone=\"danger\"\n grow={1}\n agent={`reject-${item.queueId}`}\n onPress={dispatch(`reject:${item.queueId}`)}\n >\n Reject\n </Button>\n </HStack>\n </VStack>\n ))}\n </List>\n )}\n </VStack>\n );\n}\n\nfunction HistoryBody({\n snapshot,\n dispatch,\n}: {\n snapshot: StewardSnapshot;\n dispatch: (action: string) => () => void;\n}) {\n const pageSize = snapshot.pageSize || PAGE_SIZE;\n const totalPages = Math.max(1, Math.ceil(snapshot.historyTotal / pageSize));\n const pageLabel = `page ${snapshot.page + 1}/${totalPages}`;\n return (\n <VStack gap={1} width=\"100%\">\n <HStack gap={1} align=\"center\" width=\"100%\">\n <Text style=\"caption\" tone=\"muted\" grow={1}>\n {snapshot.historyTotal} records\n </Text>\n <Button\n variant=\"outline\"\n tone=\"default\"\n agent=\"filter-status\"\n onPress={dispatch(\"filter-status\")}\n >\n status: {snapshot.statusFilter ?? \"all\"}\n </Button>\n <Button\n variant=\"outline\"\n tone=\"default\"\n agent=\"filter-chain\"\n onPress={dispatch(\"filter-chain\")}\n >\n chain: {snapshot.chainFilter ?? \"all\"}\n </Button>\n </HStack>\n\n <Divider label=\"transaction history\" />\n {snapshot.history.length === 0 ? (\n <Text tone=\"muted\" align=\"center\" style=\"caption\">\n {snapshot.loading ? \"Loading\" : \"None\"}\n </Text>\n ) : (\n <List gap={1} width=\"100%\">\n {snapshot.history.map((tx) => (\n <VStack key={tx.id} gap={0} width=\"100%\" agent={`tx-${tx.id}`}>\n <HStack gap={1} align=\"center\" width=\"100%\">\n <Text bold grow={1} wrap={false}>\n {tx.id}\n </Text>\n <Text style=\"caption\" tone={statusTone(tx.status)}>\n {tx.status}\n </Text>\n <Button\n variant=\"ghost\"\n tone=\"default\"\n agent={`copy-${tx.id}`}\n onPress={dispatch(`copy:${tx.to}`)}\n >\n Copy\n </Button>\n </HStack>\n <Text style=\"caption\" tone=\"muted\" wrap={false}>\n chain {tx.chainId} to {tx.to}\n </Text>\n {tx.txHash ? (\n <Text style=\"caption\" tone=\"muted\" wrap={false}>\n hash {tx.txHash}\n </Text>\n ) : null}\n </VStack>\n ))}\n </List>\n )}\n\n <HStack gap={1} align=\"center\" width=\"100%\">\n <Button\n variant=\"outline\"\n tone=\"default\"\n disabled={snapshot.page <= 0}\n agent=\"page-prev\"\n onPress={dispatch(\"page-prev\")}\n >\n Prev\n </Button>\n <Text style=\"caption\" tone=\"muted\" align=\"center\" grow={1}>\n {pageLabel}\n </Text>\n <Button\n variant=\"outline\"\n tone=\"default\"\n disabled={snapshot.page + 1 >= totalPages}\n agent=\"page-next\"\n onPress={dispatch(\"page-next\")}\n >\n Next\n </Button>\n </HStack>\n </VStack>\n );\n}\n\nexport function StewardSpatialView({\n snapshot,\n onAction,\n}: StewardSpatialViewProps) {\n const dispatch = (action: string) => () => onAction?.(action);\n const title = snapshot.tab === \"approvals\" ? \"Approvals\" : \"History\";\n return (\n <Card gap={1} padding={1}>\n <HStack gap={1} align=\"center\" width=\"100%\">\n <Text\n style=\"caption\"\n tone={snapshot.connected ? \"success\" : \"danger\"}\n grow={1}\n >\n {snapshot.connected ? \"connected\" : \"not-connected\"}\n </Text>\n <Text style=\"caption\" tone=\"muted\">\n {shortAddress(snapshot.evmAddress)}\n </Text>\n </HStack>\n\n {snapshot.error ? (\n <Text tone=\"danger\" style=\"caption\" wrap>\n {snapshot.error}\n </Text>\n ) : null}\n\n <HStack gap={1} width=\"100%\" wrap>\n <Button\n variant={snapshot.tab === \"approvals\" ? \"solid\" : \"outline\"}\n tone={snapshot.tab === \"approvals\" ? \"primary\" : \"default\"}\n grow={1}\n agent=\"tab-approvals\"\n onPress={dispatch(\"tab:approvals\")}\n >\n Approvals ({snapshot.pendingApprovals.length})\n </Button>\n <Button\n variant={snapshot.tab === \"history\" ? \"solid\" : \"outline\"}\n tone={snapshot.tab === \"history\" ? \"primary\" : \"default\"}\n grow={1}\n agent=\"tab-history\"\n onPress={dispatch(\"tab:history\")}\n >\n History ({snapshot.historyTotal})\n </Button>\n <Button\n variant=\"ghost\"\n tone=\"default\"\n agent=\"refresh\"\n onPress={dispatch(\"refresh\")}\n >\n {snapshot.loading ? \"...\" : \"Refresh\"}\n </Button>\n </HStack>\n\n <Divider label={title} />\n\n {snapshot.tab === \"approvals\" ? (\n <ApprovalsBody snapshot={snapshot} dispatch={dispatch} />\n ) : (\n <HistoryBody snapshot={snapshot} dispatch={dispatch} />\n )}\n </Card>\n );\n}\n"],"mappings":"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","names":[]}