@elizaos/plugin-steward-app 2.0.3-beta.5 → 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/routes/steward-bridge.ts"],"sourcesContent":["import { loadElizaConfig } from \"@elizaos/agent/config/config\";\nimport {\n loadStewardCredentials,\n resolveEffectiveStewardConfig,\n saveStewardCredentials,\n} from \"@elizaos/app-core/services/steward-credentials\";\nimport { fingerprintRandomToken } from \"@elizaos/app-core/services/steward-sidecar/helpers\";\nimport {\n type PolicyResult,\n type PolicyRule,\n type SignTransactionInput,\n StewardApiError,\n StewardClient,\n type TxRecord,\n} from \"@stwd/sdk\";\nimport { fetchSolanaNativeBalanceViaRpc } from \"../api/wallet.js\";\nimport { fetchEvmNativeBalanceViaRpc } from \"../api/wallet-evm-balance.js\";\nimport { resolveWalletRpcReadiness } from \"../api/wallet-rpc.js\";\nimport type { StewardSignRequest, StewardSignResponse } from \"../types/steward.js\";\n\nexport interface StewardBridgeOptions {\n env?: NodeJS.ProcessEnv;\n evmAddress?: string | null;\n agentId?: string | null;\n client?: StewardClient | null;\n}\n\nexport interface StewardBridgeStatus {\n configured: boolean;\n available: boolean;\n connected: boolean;\n baseUrl: string | null;\n agentId: string | null;\n evmAddress: string | null;\n error: string | null;\n walletAddresses?: { evm: string | null; solana: string | null };\n agentName?: string;\n vaultHealth?: \"ok\" | \"degraded\" | \"error\";\n}\n\nexport interface StewardPendingApprovalResult {\n mode: \"steward\";\n pendingApproval: true;\n policyResults: PolicyResult[];\n}\n\nexport interface StewardSignedTransactionResult {\n mode: \"steward\";\n pendingApproval: false;\n txHash: string;\n}\n\nexport type StewardExecutionResult =\n | StewardPendingApprovalResult\n | StewardSignedTransactionResult;\n\nfunction normalizeEnvValue(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n return trimmed || null;\n}\n\ntype StewardConnectionDetails = {\n baseUrl: string | null;\n apiKey: string | null;\n tenantId: string | null;\n bearerToken: string | null;\n agentId: string | null;\n};\n\nfunction resolveStewardConnection(\n env: NodeJS.ProcessEnv = process.env,\n): StewardConnectionDetails {\n const persisted = resolveEffectiveStewardConfig(env);\n const baseUrl =\n normalizeEnvValue(env.STEWARD_API_URL) ??\n normalizeEnvValue(persisted?.apiUrl) ??\n null;\n const apiKey =\n normalizeEnvValue(env.STEWARD_API_KEY) ??\n normalizeEnvValue(persisted?.apiKey) ??\n null;\n const tenantId =\n normalizeEnvValue(env.STEWARD_TENANT_ID) ??\n normalizeEnvValue(persisted?.tenantId) ??\n null;\n const agentId =\n normalizeEnvValue(env.STEWARD_AGENT_ID) ??\n normalizeEnvValue(env.ELIZA_STEWARD_AGENT_ID) ??\n normalizeEnvValue(persisted?.agentId) ??\n null;\n const agentToken =\n normalizeEnvValue(env.STEWARD_AGENT_TOKEN) ??\n normalizeEnvValue(persisted?.agentToken) ??\n null;\n\n return {\n baseUrl,\n apiKey,\n tenantId,\n bearerToken: apiKey ? null : agentToken,\n agentId,\n };\n}\n\nfunction resolveStewardRpcReadinessSafe(): ReturnType<\n typeof resolveWalletRpcReadiness\n> | null {\n try {\n return resolveWalletRpcReadiness(loadElizaConfig());\n } catch {\n return null;\n }\n}\n\nfunction firstRpcUrl(urls: string[]): string | null {\n return (\n urls\n .find((candidate) => typeof candidate === \"string\" && candidate.trim())\n ?.trim() ?? null\n );\n}\n\nfunction resolveEvmNativeBalanceFallback(\n chainId: number,\n readiness: ReturnType<typeof resolveWalletRpcReadiness>,\n): { rpcUrl: string; symbol: string; chainId: number } | null {\n switch (chainId) {\n case 1: {\n const rpcUrl = firstRpcUrl(readiness.ethereumRpcUrls);\n return rpcUrl ? { rpcUrl, symbol: \"ETH\", chainId } : null;\n }\n case 8453: {\n const rpcUrl = firstRpcUrl(readiness.baseRpcUrls);\n return rpcUrl ? { rpcUrl, symbol: \"ETH\", chainId } : null;\n }\n case 56:\n case 97: {\n const rpcUrl = firstRpcUrl(readiness.bscRpcUrls);\n return rpcUrl ? { rpcUrl, symbol: \"BNB\", chainId } : null;\n }\n case 43114: {\n const rpcUrl = firstRpcUrl(readiness.avalancheRpcUrls);\n return rpcUrl ? { rpcUrl, symbol: \"AVAX\", chainId } : null;\n }\n default:\n return null;\n }\n}\n\nexport function resolveStewardAgentId(\n env: NodeJS.ProcessEnv = process.env,\n evmAddress?: string | null,\n): string | null {\n return resolveStewardConnection(env).agentId ?? evmAddress?.trim() ?? null;\n}\n\nexport function createStewardClient(\n options: StewardBridgeOptions = {},\n): StewardClient | null {\n if (options.client !== undefined) {\n return options.client;\n }\n\n const env = options.env ?? process.env;\n const connection = resolveStewardConnection(env);\n const baseUrl = connection.baseUrl;\n if (!baseUrl) {\n return null;\n }\n\n return new StewardClient({\n baseUrl,\n bearerToken: connection.bearerToken ?? undefined,\n apiKey: connection.apiKey ?? undefined,\n tenantId: connection.tenantId ?? undefined,\n });\n}\n\nexport async function getStewardBridgeStatus(\n options: StewardBridgeOptions = {},\n): Promise<StewardBridgeStatus> {\n const env = options.env ?? process.env;\n const baseUrl = normalizeEnvValue(env.STEWARD_API_URL);\n const evmAddress = options.evmAddress ?? null;\n const agentId = options.agentId ?? resolveStewardAgentId(env, evmAddress);\n const client = createStewardClient(options);\n\n if (!baseUrl || !client) {\n // Check persisted credentials as fallback\n const persisted = resolveEffectiveStewardConfig(env);\n if (!persisted?.apiUrl) {\n return {\n configured: false,\n available: false,\n connected: false,\n baseUrl,\n agentId,\n evmAddress,\n error: null,\n };\n }\n\n // Re-derive from persisted credentials\n const fallbackClient = new StewardClient({\n baseUrl: persisted.apiUrl,\n bearerToken: persisted.agentToken || undefined,\n apiKey: persisted.apiKey || undefined,\n tenantId: persisted.tenantId || undefined,\n });\n const fallbackAgentId = persisted.agentId || agentId;\n\n if (!fallbackClient || !fallbackAgentId) {\n return {\n configured: false,\n available: false,\n connected: false,\n baseUrl: persisted.apiUrl,\n agentId: fallbackAgentId,\n evmAddress,\n error: null,\n };\n }\n\n // Use persisted values for the rest of this function\n try {\n type AgentDataShape = {\n walletAddress?: string;\n walletAddresses?: { evm?: string; solana?: string };\n name?: string;\n };\n let agentData: AgentDataShape | null = null;\n\n if (fallbackAgentId) {\n try {\n agentData = (await fallbackClient.getAgent(\n fallbackAgentId,\n )) as AgentDataShape;\n } catch (error: unknown) {\n if (\n !(error instanceof StewardApiError) ||\n ((error as StewardApiError).status !== 404 &&\n (error as StewardApiError).status !== 400)\n ) {\n throw error;\n }\n }\n }\n\n const walletAddresses = agentData\n ? {\n evm:\n agentData.walletAddresses?.evm?.trim() ||\n agentData.walletAddress?.trim() ||\n null,\n solana: agentData.walletAddresses?.solana?.trim() || null,\n }\n : undefined;\n\n return {\n configured: true,\n available: true,\n connected: true,\n baseUrl: persisted.apiUrl,\n agentId: fallbackAgentId,\n evmAddress: walletAddresses?.evm ?? evmAddress,\n error: null,\n walletAddresses,\n agentName: agentData?.name || undefined,\n vaultHealth: fallbackAgentId && !agentData ? \"degraded\" : \"ok\",\n };\n } catch (error) {\n return {\n configured: true,\n available: false,\n connected: false,\n baseUrl: persisted.apiUrl,\n agentId: fallbackAgentId,\n evmAddress,\n error: formatStewardError(error),\n vaultHealth: \"error\",\n };\n }\n }\n\n try {\n type AgentDataShape = {\n walletAddress?: string;\n walletAddresses?: { evm?: string; solana?: string };\n name?: string;\n };\n let agentData: AgentDataShape | null = null;\n\n if (agentId) {\n try {\n agentData = (await client.getAgent(agentId)) as AgentDataShape;\n } catch (error: unknown) {\n if (\n !(error instanceof StewardApiError) ||\n ((error as StewardApiError).status !== 404 &&\n (error as StewardApiError).status !== 400)\n ) {\n throw error;\n }\n }\n } else {\n await client.listAgents();\n }\n\n // Extract wallet addresses from agent data\n const walletAddresses = agentData\n ? {\n evm:\n agentData.walletAddresses?.evm?.trim() ||\n agentData.walletAddress?.trim() ||\n null,\n solana: agentData.walletAddresses?.solana?.trim() || null,\n }\n : undefined;\n\n const agentName = agentData?.name || undefined;\n\n // Determine vault health by checking if we could read the agent\n let vaultHealth: \"ok\" | \"degraded\" | \"error\" = \"ok\";\n if (agentId && !agentData) {\n vaultHealth = \"degraded\";\n }\n\n return {\n configured: true,\n available: true,\n connected: true,\n baseUrl,\n agentId,\n evmAddress: walletAddresses?.evm ?? evmAddress,\n error: null,\n walletAddresses,\n agentName,\n vaultHealth,\n };\n } catch (error) {\n return {\n configured: true,\n available: false,\n connected: false,\n baseUrl,\n agentId,\n evmAddress,\n error: formatStewardError(error),\n vaultHealth: \"error\",\n };\n }\n}\n\n/** Check if Steward env vars are configured (synchronous, no network). */\nexport function isStewardConfigured(\n env: NodeJS.ProcessEnv = process.env,\n): boolean {\n const connection = resolveStewardConnection(env);\n return Boolean(connection.baseUrl && connection.agentId);\n}\n\nexport function formatStewardError(error: unknown): string {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof error.message === \"string\"\n ) {\n return error.message;\n }\n return String(error);\n}\n\nexport async function signTransactionWithOptionalSteward(params: {\n tx: SignTransactionInput;\n env?: NodeJS.ProcessEnv;\n evmAddress?: string | null;\n agentId?: string | null;\n client?: StewardClient | null;\n}): Promise<StewardExecutionResult> {\n const env = params.env ?? process.env;\n const evmAddress = params.evmAddress ?? null;\n const agentId =\n params.agentId ?? resolveStewardAgentId(env, evmAddress) ?? null;\n const client = createStewardClient({\n env,\n evmAddress,\n agentId,\n client: params.client,\n });\n\n if (!client || !agentId) {\n throw new Error(\n \"Steward credentials and agent ID must be provided to sign transactions.\",\n );\n }\n\n // Basic tx shape validation before sending to steward.\n const tx = params.tx;\n if (!tx || typeof tx !== \"object\") {\n throw new Error(\"Transaction input is required and must be an object.\");\n }\n if (!(\"to\" in tx) || typeof tx.to !== \"string\" || !tx.to.trim()) {\n throw new Error(\"Transaction must include a valid 'to' address.\");\n }\n\n const result = await client.signTransaction(agentId, tx);\n if (\"txHash\" in result) {\n return {\n mode: \"steward\",\n pendingApproval: false,\n txHash: result.txHash,\n };\n }\n\n if (\"results\" in result) {\n return {\n mode: \"steward\",\n pendingApproval: true,\n policyResults: result.results,\n };\n }\n\n throw new Error(\"Steward returned an unsigned transaction unexpectedly\");\n}\n\n// ── Wallet address / balance / token helpers ─────────────────────────────────\n\nexport interface StewardWalletAddresses {\n evmAddress: string | null;\n solanaAddress: string | null;\n}\n\n/**\n * Fetch steward-managed wallet addresses for the configured agent.\n * Calls `GET /agents/:agentId` and extracts `walletAddresses.evm` / `walletAddresses.solana`.\n * Falls back to the flat `walletAddress` field if the extended shape is missing.\n */\nexport async function getStewardWalletAddresses(\n options: StewardBridgeOptions = {},\n): Promise<StewardWalletAddresses> {\n const env = options.env ?? process.env;\n const evmAddr = options.evmAddress ?? null;\n const agentId =\n options.agentId ?? resolveStewardAgentId(env, evmAddr) ?? null;\n const client = createStewardClient(options);\n\n if (!client || !agentId) {\n return { evmAddress: null, solanaAddress: null };\n }\n\n // The SDK's AgentIdentity type only declares `walletAddress` (string),\n // but the live API returns an extended `walletAddresses` object with\n // per-chain addresses. Cast to `unknown` to access those extra fields.\n const agent = (await client.getAgent(agentId)) as {\n walletAddress?: string;\n walletAddresses?: { evm?: string; solana?: string };\n };\n\n const evmAddress =\n agent.walletAddresses?.evm?.trim() || agent.walletAddress?.trim() || null;\n const solanaAddress = agent.walletAddresses?.solana?.trim() || null;\n\n return { evmAddress, solanaAddress };\n}\n\nexport interface StewardBalanceResult {\n balance: string;\n formatted: string;\n symbol: string;\n chainId: number;\n}\n\n/**\n * Fetch the native balance for a steward-managed agent wallet.\n * Uses the SDK's `getBalance()` when available.\n */\nexport async function getStewardBalance(\n agentId: string,\n chainId?: number,\n options: StewardBridgeOptions = {},\n): Promise<StewardBalanceResult> {\n const client = createStewardClient(options);\n if (!client) throw new Error(\"Steward not configured\");\n\n try {\n const result = await client.getBalance(agentId, chainId);\n return {\n balance: result.balances.native,\n formatted: result.balances.nativeFormatted,\n symbol: result.balances.symbol,\n chainId: result.balances.chainId,\n };\n } catch (error) {\n const readiness = resolveStewardRpcReadinessSafe();\n const walletAddresses = await getStewardWalletAddresses({\n ...options,\n agentId,\n });\n\n if (\n chainId === 101 &&\n walletAddresses.solanaAddress &&\n readiness &&\n readiness.solanaRpcUrls.length > 0\n ) {\n const result = await fetchSolanaNativeBalanceViaRpc(\n walletAddresses.solanaAddress,\n readiness.solanaRpcUrls,\n );\n return {\n balance: result.solBalance,\n formatted: result.solBalance,\n symbol: \"SOL\",\n chainId,\n };\n }\n\n const evmFallback =\n readiness && chainId != null\n ? resolveEvmNativeBalanceFallback(chainId, readiness)\n : null;\n if (evmFallback && walletAddresses.evmAddress) {\n const balance = await fetchEvmNativeBalanceViaRpc(\n evmFallback.rpcUrl,\n walletAddresses.evmAddress,\n );\n return {\n balance,\n formatted: balance,\n symbol: evmFallback.symbol,\n chainId: evmFallback.chainId,\n };\n }\n\n throw error;\n }\n}\n\nexport interface StewardTokenBalancesResult {\n native: {\n balance: string;\n formatted: string;\n symbol: string;\n chainId: number;\n };\n tokens: Array<{\n address: string;\n symbol: string;\n name: string;\n balance: string;\n formatted: string;\n decimals: number;\n valueUsd?: string;\n logoUrl?: string;\n }>;\n}\n\n/**\n * Fetch token balances for a steward-managed agent wallet.\n * The SDK doesn't expose a token-list endpoint, so this uses a direct\n * fetch to `GET /agents/:agentId/tokens?chainId=X`.\n */\nexport async function getStewardTokenBalances(\n agentId: string,\n chainId?: number,\n options: StewardBridgeOptions = {},\n): Promise<StewardTokenBalancesResult> {\n const env = options.env ?? process.env;\n const baseUrl = getStewardBaseUrl(env);\n if (!baseUrl) throw new Error(\"Steward not configured\");\n\n const headers = buildStewardHeaders(env);\n const qs = chainId != null ? `?chainId=${encodeURIComponent(chainId)}` : \"\";\n try {\n const res = await fetch(\n `${baseUrl}/agents/${encodeURIComponent(agentId)}/tokens${qs}`,\n { headers },\n );\n\n if (!res.ok) {\n const errText = await res.text().catch(() => \"Unknown error\");\n throw new Error(\n `Steward token balances failed (${res.status}): ${errText}`,\n );\n }\n\n const body = (await res.json()) as {\n ok?: boolean;\n data?: StewardTokenBalancesResult;\n };\n return (\n body.data ?? {\n native: {\n balance: \"0\",\n formatted: \"0\",\n symbol: \"???\",\n chainId: chainId ?? 0,\n },\n tokens: [],\n }\n );\n } catch (error) {\n const readiness = resolveStewardRpcReadinessSafe();\n const walletAddresses = await getStewardWalletAddresses({\n ...options,\n agentId,\n });\n\n if (\n chainId === 101 &&\n walletAddresses.solanaAddress &&\n readiness &&\n readiness.solanaRpcUrls.length > 0\n ) {\n const native = await fetchSolanaNativeBalanceViaRpc(\n walletAddresses.solanaAddress,\n readiness.solanaRpcUrls,\n );\n return {\n native: {\n balance: native.solBalance,\n formatted: native.solBalance,\n symbol: \"SOL\",\n chainId,\n },\n tokens: [],\n };\n }\n\n const evmFallback =\n readiness && chainId != null\n ? resolveEvmNativeBalanceFallback(chainId, readiness)\n : null;\n if (evmFallback && walletAddresses.evmAddress) {\n const nativeBalance = await fetchEvmNativeBalanceViaRpc(\n evmFallback.rpcUrl,\n walletAddresses.evmAddress,\n );\n return {\n native: {\n balance: nativeBalance,\n formatted: nativeBalance,\n symbol: evmFallback.symbol,\n chainId: evmFallback.chainId,\n },\n tokens: [],\n };\n }\n\n throw error;\n }\n}\n\n// ── Steward REST operations outside the current @stwd/sdk surface ────────────\n\n/**\n * Build auth headers for direct steward API calls.\n * Used by direct REST adapters for pending, approve, and deny endpoints.\n */\nexport function buildStewardHeaders(\n env: NodeJS.ProcessEnv = process.env,\n): Headers {\n const headers = new Headers();\n headers.set(\"Content-Type\", \"application/json\");\n headers.set(\"Accept\", \"application/json\");\n\n const connection = resolveStewardConnection(env);\n const bearerToken = connection.bearerToken;\n const apiKey = connection.apiKey;\n const tenantId = connection.tenantId;\n\n if (bearerToken) {\n headers.set(\"Authorization\", `Bearer ${bearerToken}`);\n } else if (apiKey) {\n headers.set(\"X-Steward-Key\", apiKey);\n }\n if (tenantId) {\n headers.set(\"X-Steward-Tenant\", tenantId);\n }\n return headers;\n}\n\nfunction getStewardBaseUrl(\n env: NodeJS.ProcessEnv = process.env,\n): string | null {\n return resolveStewardConnection(env).baseUrl;\n}\n\nexport interface StewardPendingEntry {\n queueId: string;\n status: string;\n requestedAt: string;\n transaction: TxRecord;\n}\n\n/**\n * Fetch pending approval queue from steward.\n * Returns empty array if the endpoint is not available (404).\n */\nexport async function getStewardPendingApprovals(\n agentId: string,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<StewardPendingEntry[]> {\n const baseUrl = getStewardBaseUrl(env);\n if (!baseUrl) throw new Error(\"Steward not configured\");\n\n const headers = buildStewardHeaders(env);\n const res = await fetch(\n `${baseUrl}/vault/${encodeURIComponent(agentId)}/pending`,\n { headers },\n );\n\n if (res.status === 404) return [];\n\n if (!res.ok) {\n const errText = await res.text().catch(() => \"Unknown error\");\n throw new Error(\n `Steward pending approvals failed (${res.status}): ${errText}`,\n );\n }\n\n const body = await res.json();\n return body.data ?? body ?? [];\n}\n\n/**\n * Approve a pending transaction on steward.\n */\nexport async function approveStewardTransaction(\n agentId: string,\n txId: string,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<{ txId: string; txHash?: string }> {\n const baseUrl = getStewardBaseUrl(env);\n if (!baseUrl) throw new Error(\"Steward not configured\");\n\n const headers = buildStewardHeaders(env);\n const res = await fetch(\n `${baseUrl}/vault/${encodeURIComponent(agentId)}/approve/${encodeURIComponent(txId)}`,\n { method: \"POST\", headers },\n );\n\n if (!res.ok) {\n const errText = await res.text().catch(() => \"Unknown error\");\n throw new Error(`Steward approve failed (${res.status}): ${errText}`);\n }\n\n const body = await res.json();\n return body.data ?? body;\n}\n\n/**\n * Deny/reject a pending transaction on steward.\n * Uses POST /vault/:agentId/reject/:txId\n */\nexport async function denyStewardTransaction(\n agentId: string,\n txId: string,\n reason?: string,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<{ txId: string }> {\n const baseUrl = getStewardBaseUrl(env);\n if (!baseUrl) throw new Error(\"Steward not configured\");\n\n const headers = buildStewardHeaders(env);\n const reqBody: Record<string, string> = {};\n if (reason) reqBody.reason = reason;\n\n const res = await fetch(\n `${baseUrl}/vault/${encodeURIComponent(agentId)}/reject/${encodeURIComponent(txId)}`,\n { method: \"POST\", headers, body: JSON.stringify(reqBody) },\n );\n\n if (!res.ok) {\n const errText = await res.text().catch(() => \"Unknown error\");\n throw new Error(`Steward deny failed (${res.status}): ${errText}`);\n }\n\n const body = await res.json().catch(() => ({}));\n return body.data ?? body ?? { txId };\n}\n\n/**\n * Fetch transaction history from steward.\n * Uses GET /vault/:agentId/history for full transaction records.\n */\nexport async function getStewardHistory(\n agentId: string,\n opts?: { limit?: number; offset?: number },\n env: NodeJS.ProcessEnv = process.env,\n): Promise<TxRecord[]> {\n const baseUrl = getStewardBaseUrl(env);\n if (!baseUrl) throw new Error(\"Steward not configured\");\n\n const headers = buildStewardHeaders(env);\n const params = new URLSearchParams();\n if (opts?.limit != null) params.set(\"limit\", String(opts.limit));\n if (opts?.offset != null) params.set(\"offset\", String(opts.offset));\n const qs = params.toString() ? `?${params.toString()}` : \"\";\n\n const res = await fetch(\n `${baseUrl}/vault/${encodeURIComponent(agentId)}/history${qs}`,\n { headers },\n );\n\n if (!res.ok) {\n const errText = await res.text().catch(() => \"Unknown error\");\n throw new Error(`Steward history failed (${res.status}): ${errText}`);\n }\n\n const body = await res.json();\n return body.data ?? body ?? [];\n}\n\n/**\n * Provision a steward wallet for a new agent.\n * Creates the agent identity + wallet on steward, optionally with default policies.\n */\nexport async function provisionStewardWallet(params: {\n agentId: string;\n agentName: string;\n platformId?: string;\n defaultPolicies?: PolicyRule[];\n env?: NodeJS.ProcessEnv;\n}): Promise<{ walletAddress: string }> {\n const env = params.env ?? process.env;\n const client = createStewardClient({ env });\n if (!client) {\n throw new Error(\"Steward not configured — cannot provision wallet\");\n }\n\n const identity = await client.createWallet(\n params.agentId,\n params.agentName,\n params.platformId,\n );\n\n // Apply default policies if provided\n if (params.defaultPolicies && params.defaultPolicies.length > 0) {\n await client.setPolicies(params.agentId, params.defaultPolicies);\n }\n\n return { walletAddress: identity.walletAddress };\n}\n\n// ── Steward Vault Signing ────────────────────────────────────────────────────\n\n/**\n * Sign (and optionally broadcast) a transaction through the Steward vault.\n *\n * This calls `POST /vault/:agentId/sign` directly. The three possible outcomes\n * are mapped to a combined {@link StewardSignResponse}:\n *\n * - **Approved** (HTTP 200): `{ approved: true, txHash }`.\n * - **Pending approval** (HTTP 202): `{ approved: false, pending: true, txId }`.\n * - **Denied** (HTTP 403): `{ approved: false, denied: true, violations }`.\n */\nexport async function signViaSteward(\n request: StewardSignRequest,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<StewardSignResponse> {\n const baseUrl = getStewardBaseUrl(env);\n if (!baseUrl) throw new Error(\"Steward not configured\");\n\n const evmAddress =\n normalizeEnvValue(env.EVM_ADDRESS) ??\n normalizeEnvValue(env.ELIZA_EVM_ADDRESS) ??\n null;\n const agentId = resolveStewardAgentId(env, evmAddress);\n if (!agentId) throw new Error(\"Steward agent ID not resolved\");\n\n const headers = buildStewardHeaders(env);\n const res = await fetch(\n `${baseUrl}/vault/${encodeURIComponent(agentId)}/sign`,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n to: request.to,\n value: request.value,\n chainId: request.chainId,\n data: request.data,\n broadcast: request.broadcast ?? true,\n description: request.description,\n }),\n },\n );\n\n const body = (await res.json().catch(() => ({}))) as Record<string, unknown>;\n\n // Approved — HTTP 200\n if (res.ok && body.ok === true) {\n const data = (body.data ?? {}) as Record<string, unknown>;\n return {\n approved: true,\n txHash: typeof data.txHash === \"string\" ? data.txHash : undefined,\n };\n }\n\n // Pending approval — HTTP 202\n if (res.status === 202) {\n const data = (body.data ?? {}) as Record<string, unknown>;\n return {\n approved: false,\n pending: true,\n txId: typeof data.txId === \"string\" ? data.txId : undefined,\n violations: normalizeViolations(data.violations),\n };\n }\n\n // Denied — HTTP 403\n if (res.status === 403) {\n const data = (body.data ?? {}) as Record<string, unknown>;\n return {\n approved: false,\n denied: true,\n violations: normalizeViolations(data.violations),\n };\n }\n\n // Unexpected error\n const errMsg =\n typeof body.error === \"string\"\n ? body.error\n : `Steward sign failed (${res.status})`;\n throw new Error(errMsg);\n}\n\nfunction normalizeViolations(\n raw: unknown,\n): Array<{ policy: string; reason: string }> | undefined {\n if (!Array.isArray(raw)) return undefined;\n return raw\n .filter(\n (v): v is { policy: string; reason: string } =>\n !!v &&\n typeof v === \"object\" &&\n typeof (v as Record<string, unknown>).policy === \"string\" &&\n typeof (v as Record<string, unknown>).reason === \"string\",\n )\n .map((v) => ({ policy: v.policy, reason: v.reason }));\n}\n\n// ── Webhook Support ──────────────────────────────────────────────────────────\n\nexport type StewardWebhookEventType =\n | \"tx.pending\"\n | \"tx.approved\"\n | \"tx.denied\"\n | \"tx.confirmed\";\n\nexport interface StewardWebhookEvent {\n event: StewardWebhookEventType;\n data: Record<string, unknown>;\n timestamp?: string;\n}\n\nconst MAX_WEBHOOK_EVENTS = 200;\n\n/**\n * In-memory ring buffer for recent webhook events from steward.\n * The UI can poll these to get near-real-time updates without WebSocket.\n */\nconst recentWebhookEvents: StewardWebhookEvent[] = [];\n\n/** Push a webhook event into the in-memory buffer. */\nexport function pushWebhookEvent(event: StewardWebhookEvent): void {\n recentWebhookEvents.push(event);\n if (recentWebhookEvents.length > MAX_WEBHOOK_EVENTS) {\n recentWebhookEvents.splice(\n 0,\n recentWebhookEvents.length - MAX_WEBHOOK_EVENTS,\n );\n }\n}\n\n/** Read recent webhook events, optionally filtered by event type. */\nexport function getRecentWebhookEvents(\n eventType?: StewardWebhookEventType,\n sinceIndex = 0,\n): { events: StewardWebhookEvent[]; nextIndex: number } {\n const all = eventType\n ? recentWebhookEvents.filter((e) => e.event === eventType)\n : recentWebhookEvents;\n const events = all.slice(sinceIndex);\n return { events, nextIndex: recentWebhookEvents.length };\n}\n\n/**\n * Register a webhook URL with steward so it pushes tx events to the app.\n * Calls PUT /tenants/:tenantId with { webhookUrl }.\n */\nexport async function registerStewardWebhook(\n webhookUrl: string,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<void> {\n const baseUrl = getStewardBaseUrl(env);\n if (!baseUrl) throw new Error(\"Steward not configured\");\n\n const tenantId = normalizeEnvValue(env.STEWARD_TENANT_ID);\n if (!tenantId)\n throw new Error(\"STEWARD_TENANT_ID not set — cannot register webhook\");\n\n const headers = buildStewardHeaders(env);\n const res = await fetch(\n `${baseUrl}/tenants/${encodeURIComponent(tenantId)}`,\n {\n method: \"PUT\",\n headers,\n body: JSON.stringify({ webhookUrl }),\n },\n );\n\n if (!res.ok) {\n const errText = await res.text().catch(() => \"Unknown error\");\n throw new Error(\n `Steward webhook registration failed (${res.status}): ${errText}`,\n );\n }\n}\n\n/**\n * Attempt to register the local webhook endpoint with steward.\n * Logs but does not throw on failure (best-effort).\n */\nexport async function tryRegisterStewardWebhook(\n port = Number(\n process.env.ELIZA_API_PORT?.trim() ||\n process.env.ELIZA_PORT?.trim() ||\n \"31337\",\n ) || 31337,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<void> {\n if (!isStewardConfigured(env)) return;\n\n const webhookUrl = `http://127.0.0.1:${port}/api/wallet/steward-webhook`;\n try {\n await registerStewardWebhook(webhookUrl, env);\n console.info(`[steward] Webhook registered: ${webhookUrl}`);\n } catch (err) {\n console.warn(\n `[steward] Webhook registration failed (non-fatal): ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n}\n\n// ── Steward Auto-Setup (first launch) ────────────────────────────────────────\n\n/** Promise-based lock to prevent concurrent ensureStewardAgent calls. */\nlet ensureStewardAgentPromise: Promise<EnsureStewardAgentResult | null> | null =\n null;\n\nexport interface EnsureStewardAgentResult {\n agentId: string;\n agentName: string;\n walletAddresses: { evm: string | null; solana: string | null };\n created: boolean;\n}\n\n/**\n * Ensure the configured steward agent exists. If it doesn't, create it.\n *\n * This is a lazy-init function — call it on first request to steward-status,\n * not on server startup. It's idempotent and will only run once per process.\n *\n * If steward setup fails, logs a warning and returns null (does not throw).\n */\nexport function ensureStewardAgent(\n options: {\n agentId?: string;\n agentName?: string;\n env?: NodeJS.ProcessEnv;\n } = {},\n): Promise<EnsureStewardAgentResult | null> {\n if (!ensureStewardAgentPromise) {\n ensureStewardAgentPromise = doEnsureStewardAgent(options);\n }\n return ensureStewardAgentPromise;\n}\n\nasync function doEnsureStewardAgent(\n options: {\n agentId?: string;\n agentName?: string;\n env?: NodeJS.ProcessEnv;\n } = {},\n): Promise<EnsureStewardAgentResult | null> {\n const env = options.env ?? process.env;\n const baseUrl = normalizeEnvValue(env.STEWARD_API_URL);\n if (!baseUrl) {\n return null;\n }\n\n const agentId = options.agentId ?? resolveStewardAgentId(env) ?? null;\n\n if (!agentId) {\n return null;\n }\n\n const agentName = options.agentName ?? agentId;\n\n try {\n const client = createStewardClient({ env });\n if (!client) {\n return null;\n }\n\n // Check if agent exists\n try {\n const agent = (await client.getAgent(agentId)) as {\n id: string;\n name?: string;\n walletAddress?: string;\n walletAddresses?: { evm?: string; solana?: string };\n };\n\n const result: EnsureStewardAgentResult = {\n agentId,\n agentName: agent.name || agentName,\n walletAddresses: {\n evm:\n agent.walletAddresses?.evm?.trim() ||\n agent.walletAddress?.trim() ||\n null,\n solana: agent.walletAddresses?.solana?.trim() || null,\n },\n created: false,\n };\n\n // Update persisted credentials with wallet addresses\n persistAgentCredentials(baseUrl, env, result);\n\n return result;\n } catch (err: unknown) {\n if (\n !(err instanceof StewardApiError) ||\n (err as StewardApiError).status !== 404\n ) {\n throw err;\n }\n }\n\n // Agent doesn't exist — try to create it\n console.info(`[steward] Agent \"${agentId}\" not found, creating...`);\n\n const tenantId = normalizeEnvValue(env.STEWARD_TENANT_ID);\n const apiKey = normalizeEnvValue(env.STEWARD_API_KEY);\n\n // Try to create tenant first (may already exist, that's ok)\n if (tenantId && apiKey) {\n try {\n const tenantRes = await fetch(`${baseUrl}/tenants`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Api-Key\": normalizeEnvValue(env.STEWARD_MASTER_PASSWORD) ?? \"\",\n },\n body: JSON.stringify({\n id: tenantId,\n name: \"Desktop\",\n apiKeyHash: fingerprintRandomToken(apiKey),\n }),\n });\n\n if (!tenantRes.ok) {\n const body = (await tenantRes.json().catch(() => ({}))) as {\n error?: string;\n };\n if (!body.error?.includes(\"already exists\")) {\n console.warn(\n `[steward] Tenant creation returned ${tenantRes.status}: ${body.error}`,\n );\n }\n }\n } catch (tenantErr) {\n console.warn(\n `[steward] Tenant creation failed (non-fatal): ${\n tenantErr instanceof Error ? tenantErr.message : String(tenantErr)\n }`,\n );\n }\n }\n\n // Create agent\n const headers = buildStewardHeaders(env);\n const agentRes = await fetch(`${baseUrl}/agents`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ id: agentId, name: agentName }),\n });\n\n if (!agentRes.ok) {\n const errText = await agentRes.text().catch(() => \"Unknown error\");\n console.warn(\n `[steward] Agent creation failed (${agentRes.status}): ${errText}`,\n );\n return null;\n }\n\n const agentBody = (await agentRes.json()) as {\n ok: boolean;\n data?: {\n id: string;\n walletAddress?: string;\n walletAddresses?: { evm?: string; solana?: string };\n };\n };\n\n if (!agentBody.ok || !agentBody.data) {\n console.warn(\"[steward] Agent creation returned unexpected response\");\n return null;\n }\n\n // Get agent token\n let agentToken = \"\";\n try {\n const tokenRes = await fetch(\n `${baseUrl}/agents/${encodeURIComponent(agentId)}/token`,\n { method: \"POST\", headers },\n );\n if (tokenRes.ok) {\n const tokenBody = (await tokenRes.json()) as {\n ok: boolean;\n data?: { token: string };\n };\n agentToken = tokenBody.data?.token ?? \"\";\n }\n } catch {\n console.warn(\"[steward] Token generation failed (non-fatal)\");\n }\n\n const result: EnsureStewardAgentResult = {\n agentId,\n agentName,\n walletAddresses: {\n evm:\n agentBody.data.walletAddresses?.evm?.trim() ||\n agentBody.data.walletAddress?.trim() ||\n null,\n solana: agentBody.data.walletAddresses?.solana?.trim() || null,\n },\n created: true,\n };\n\n console.info(\n `[steward] Agent \"${agentId}\" created with wallet ${result.walletAddresses.evm ?? \"(none)\"}`,\n );\n\n // Persist credentials\n persistAgentCredentials(baseUrl, env, result, agentToken);\n\n return result;\n } catch (err) {\n console.warn(\n `[steward] Auto-setup failed (non-fatal): ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n return null;\n }\n}\n\nfunction persistAgentCredentials(\n apiUrl: string,\n env: NodeJS.ProcessEnv,\n result: EnsureStewardAgentResult,\n agentToken?: string,\n): void {\n try {\n const existing = loadStewardCredentials();\n saveStewardCredentials({\n apiUrl,\n tenantId:\n normalizeEnvValue(env.STEWARD_TENANT_ID) ?? existing?.tenantId ?? \"\",\n agentId: result.agentId,\n apiKey: normalizeEnvValue(env.STEWARD_API_KEY) ?? existing?.apiKey ?? \"\",\n agentToken:\n agentToken ??\n normalizeEnvValue(env.STEWARD_AGENT_TOKEN) ??\n existing?.agentToken ??\n \"\",\n walletAddresses: {\n evm: result.walletAddresses.evm ?? undefined,\n solana: result.walletAddresses.solana ?? undefined,\n },\n agentName: result.agentName,\n });\n } catch (credErr) {\n console.warn(\n `[steward] Failed to persist credentials (non-fatal): ${\n credErr instanceof Error ? credErr.message : String(credErr)\n }`,\n );\n }\n}\n\n/** Reset the ensured flag (for testing). */\nexport function __resetStewardAgentEnsured(): void {\n ensureStewardAgentPromise = null;\n}\n"],"mappings":"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","names":["result"]}
@@ -0,0 +1,21 @@
1
+ import type http from "node:http";
2
+ import { type CompatRuntimeState } from "@elizaos/app-core/api/compat-route-shared";
3
+ /**
4
+ * Steward wallet routes:
5
+ *
6
+ * - `GET /api/wallet/steward-status`
7
+ * - `GET /api/wallet/steward-policies`
8
+ * - `PUT /api/wallet/steward-policies`
9
+ * - `GET /api/wallet/steward-tx-records`
10
+ * - `GET /api/wallet/steward-pending-approvals`
11
+ * - `POST /api/wallet/steward-approve-tx`
12
+ * - `POST /api/wallet/steward-deny-tx`
13
+ * - `POST /api/wallet/steward-webhook` (loopback only, no auth)
14
+ * - `GET /api/wallet/steward-webhook-events`
15
+ * - `POST /api/wallet/steward-sign`
16
+ * - `GET /api/wallet/steward-addresses`
17
+ * - `GET /api/wallet/steward-balances`
18
+ * - `GET /api/wallet/steward-tokens`
19
+ */
20
+ export declare function handleStewardCompatRoutes(req: http.IncomingMessage, res: http.ServerResponse, _state: CompatRuntimeState): Promise<boolean>;
21
+ //# sourceMappingURL=steward-compat-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steward-compat-routes.d.ts","sourceRoot":"","sources":["../../src/routes/steward-compat-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EACL,KAAK,kBAAkB,EAIxB,MAAM,2CAA2C,CAAC;AA0BnD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,OAAO,CAAC,CA8alB"}
@@ -0,0 +1,350 @@
1
+ import { ensureCompatApiAuthorized } from "@elizaos/app-core/api/auth";
2
+ import {
3
+ getConfiguredCompatAgentName,
4
+ isLoopbackRemoteAddress,
5
+ readCompatJsonBody
6
+ } from "@elizaos/app-core/api/compat-route-shared";
7
+ import {
8
+ sendJsonError as sendJsonErrorResponse,
9
+ sendJson as sendJsonResponse
10
+ } from "@elizaos/app-core/api/response";
11
+ import { logger } from "@elizaos/core";
12
+ import { getWalletAddresses } from "../api/wallet.js";
13
+ import {
14
+ approveStewardTransaction,
15
+ createStewardClient,
16
+ denyStewardTransaction,
17
+ ensureStewardAgent,
18
+ getRecentWebhookEvents,
19
+ getStewardBalance,
20
+ getStewardBridgeStatus,
21
+ getStewardHistory,
22
+ getStewardPendingApprovals,
23
+ getStewardTokenBalances,
24
+ getStewardWalletAddresses,
25
+ isStewardConfigured,
26
+ pushWebhookEvent,
27
+ resolveStewardAgentId,
28
+ signViaSteward
29
+ } from "./steward-bridge.js";
30
+ async function handleStewardCompatRoutes(req, res, _state) {
31
+ const method = (req.method ?? "GET").toUpperCase();
32
+ const url = new URL(req.url ?? "/", "http://localhost");
33
+ if (!url.pathname.startsWith("/api/wallet/steward")) {
34
+ return false;
35
+ }
36
+ if (method === "GET" && url.pathname === "/api/wallet/steward-status") {
37
+ if (!ensureCompatApiAuthorized(req, res)) {
38
+ return true;
39
+ }
40
+ const addresses = getWalletAddresses();
41
+ if (isStewardConfigured()) {
42
+ const agentId = resolveStewardAgentId(process.env, addresses.evmAddress);
43
+ const characterName = getConfiguredCompatAgentName();
44
+ void ensureStewardAgent({
45
+ agentId: agentId ?? void 0,
46
+ agentName: characterName ?? void 0
47
+ }).catch(() => {
48
+ });
49
+ }
50
+ const status = await getStewardBridgeStatus({
51
+ evmAddress: addresses.evmAddress
52
+ });
53
+ sendJsonResponse(res, 200, status);
54
+ return true;
55
+ }
56
+ if (method === "GET" && url.pathname === "/api/wallet/steward-policies") {
57
+ if (!ensureCompatApiAuthorized(req, res)) {
58
+ return true;
59
+ }
60
+ const addresses = getWalletAddresses();
61
+ const agentId = resolveStewardAgentId(process.env, addresses.evmAddress);
62
+ const stewardClient = createStewardClient();
63
+ if (!stewardClient || !agentId) {
64
+ sendJsonResponse(res, 503, {
65
+ error: "Steward not configured"
66
+ });
67
+ return true;
68
+ }
69
+ try {
70
+ const policies = await stewardClient.getPolicies(agentId);
71
+ sendJsonResponse(res, 200, policies);
72
+ } catch (err) {
73
+ const message = err instanceof Error ? err.message : "Failed to fetch policies";
74
+ sendJsonResponse(res, 500, { error: message });
75
+ }
76
+ return true;
77
+ }
78
+ if (method === "PUT" && url.pathname === "/api/wallet/steward-policies") {
79
+ if (!ensureCompatApiAuthorized(req, res)) {
80
+ return true;
81
+ }
82
+ const body = await readCompatJsonBody(req, res);
83
+ if (!body) return true;
84
+ const { policies } = body;
85
+ if (!Array.isArray(policies)) {
86
+ sendJsonResponse(res, 400, {
87
+ error: "policies must be an array"
88
+ });
89
+ return true;
90
+ }
91
+ const addresses = getWalletAddresses();
92
+ const agentId = resolveStewardAgentId(process.env, addresses.evmAddress);
93
+ const stewardClient = createStewardClient();
94
+ if (!stewardClient || !agentId) {
95
+ sendJsonResponse(res, 503, {
96
+ error: "Steward not configured"
97
+ });
98
+ return true;
99
+ }
100
+ try {
101
+ await stewardClient.setPolicies(
102
+ agentId,
103
+ policies
104
+ );
105
+ sendJsonResponse(res, 200, { ok: true });
106
+ } catch (err) {
107
+ const message = err instanceof Error ? err.message : "Failed to save policies";
108
+ sendJsonResponse(res, 500, { error: message });
109
+ }
110
+ return true;
111
+ }
112
+ if (method === "GET" && url.pathname === "/api/wallet/steward-tx-records") {
113
+ if (!ensureCompatApiAuthorized(req, res)) {
114
+ return true;
115
+ }
116
+ const addresses = getWalletAddresses();
117
+ const agentId = resolveStewardAgentId(process.env, addresses.evmAddress);
118
+ if (!agentId || !createStewardClient()) {
119
+ sendJsonResponse(res, 503, {
120
+ error: "Steward not configured"
121
+ });
122
+ return true;
123
+ }
124
+ try {
125
+ const status = url.searchParams.get("status") || void 0;
126
+ const limit = parseInt(url.searchParams.get("limit") || "50", 10);
127
+ const offset = parseInt(url.searchParams.get("offset") || "0", 10);
128
+ const history = await getStewardHistory(agentId, {
129
+ limit,
130
+ offset
131
+ });
132
+ const filtered = status ? history.filter((h) => h.status === status) : history;
133
+ sendJsonResponse(res, 200, {
134
+ records: filtered,
135
+ total: filtered.length,
136
+ offset,
137
+ limit
138
+ });
139
+ } catch (err) {
140
+ const message = err instanceof Error ? err.message : "Failed to fetch tx records";
141
+ sendJsonResponse(res, 500, { error: message });
142
+ }
143
+ return true;
144
+ }
145
+ if (method === "GET" && url.pathname === "/api/wallet/steward-pending-approvals") {
146
+ if (!ensureCompatApiAuthorized(req, res)) {
147
+ return true;
148
+ }
149
+ const addresses = getWalletAddresses();
150
+ const agentId = resolveStewardAgentId(process.env, addresses.evmAddress);
151
+ if (!agentId || !createStewardClient()) {
152
+ sendJsonResponse(res, 503, {
153
+ error: "Steward not configured"
154
+ });
155
+ return true;
156
+ }
157
+ try {
158
+ const pending = await getStewardPendingApprovals(agentId);
159
+ sendJsonResponse(res, 200, pending);
160
+ } catch (err) {
161
+ const message = err instanceof Error ? err.message : "Failed to fetch pending approvals";
162
+ sendJsonResponse(res, 500, { error: message });
163
+ }
164
+ return true;
165
+ }
166
+ if (method === "POST" && (url.pathname === "/api/wallet/steward-approve-tx" || url.pathname === "/api/wallet/steward-deny-tx")) {
167
+ if (!ensureCompatApiAuthorized(req, res)) {
168
+ return true;
169
+ }
170
+ const body = await readCompatJsonBody(req, res);
171
+ if (!body) return true;
172
+ const txId = typeof body.txId === "string" ? body.txId : "";
173
+ if (!txId) {
174
+ sendJsonResponse(res, 400, { error: "txId is required" });
175
+ return true;
176
+ }
177
+ const addresses = getWalletAddresses();
178
+ const agentId = resolveStewardAgentId(process.env, addresses.evmAddress);
179
+ if (!agentId || !createStewardClient()) {
180
+ sendJsonResponse(res, 503, {
181
+ error: "Steward not configured"
182
+ });
183
+ return true;
184
+ }
185
+ const isApprove = url.pathname.includes("approve");
186
+ const reason = typeof body.reason === "string" ? body.reason : void 0;
187
+ try {
188
+ const result = isApprove ? await approveStewardTransaction(agentId, txId) : await denyStewardTransaction(agentId, txId, reason);
189
+ sendJsonResponse(res, 200, { ok: true, ...result });
190
+ } catch (err) {
191
+ const action = isApprove ? "approve" : "deny";
192
+ const message = err instanceof Error ? err.message : `Failed to ${action} transaction`;
193
+ sendJsonResponse(res, 500, { error: message });
194
+ }
195
+ return true;
196
+ }
197
+ if (method === "POST" && url.pathname === "/api/wallet/steward-webhook") {
198
+ if (!isLoopbackRemoteAddress(req.socket?.remoteAddress)) {
199
+ logger.warn(
200
+ `[steward-webhook] Rejected non-loopback request from ${req.socket?.remoteAddress}`
201
+ );
202
+ sendJsonErrorResponse(res, 403, "Webhook only accepted from localhost");
203
+ return true;
204
+ }
205
+ const body = await readCompatJsonBody(req, res);
206
+ if (!body) return true;
207
+ const event = typeof body.event === "string" ? body.event : "";
208
+ const VALID_EVENTS = [
209
+ "tx.pending",
210
+ "tx.approved",
211
+ "tx.denied",
212
+ "tx.confirmed"
213
+ ];
214
+ if (!VALID_EVENTS.includes(event)) {
215
+ sendJsonResponse(res, 400, { error: `Unknown event type: ${event}` });
216
+ return true;
217
+ }
218
+ const data = body.data && typeof body.data === "object" && !Array.isArray(body.data) ? body.data : {};
219
+ pushWebhookEvent({
220
+ event,
221
+ data,
222
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
223
+ });
224
+ logger.info(`[steward-webhook] Received ${event}`);
225
+ sendJsonResponse(res, 200, { ok: true });
226
+ return true;
227
+ }
228
+ if (method === "GET" && url.pathname === "/api/wallet/steward-webhook-events") {
229
+ if (!ensureCompatApiAuthorized(req, res)) {
230
+ return true;
231
+ }
232
+ const eventType = url.searchParams.get(
233
+ "event"
234
+ );
235
+ const sinceIndex = Number.parseInt(
236
+ url.searchParams.get("since") || "0",
237
+ 10
238
+ );
239
+ const result = getRecentWebhookEvents(
240
+ eventType || void 0,
241
+ Number.isNaN(sinceIndex) ? 0 : sinceIndex
242
+ );
243
+ sendJsonResponse(res, 200, result);
244
+ return true;
245
+ }
246
+ if (method === "POST" && url.pathname === "/api/wallet/steward-sign") {
247
+ if (!ensureCompatApiAuthorized(req, res)) {
248
+ return true;
249
+ }
250
+ const body = await readCompatJsonBody(req, res);
251
+ if (!body) return true;
252
+ const to = typeof body.to === "string" ? body.to.trim() : "";
253
+ const value = typeof body.value === "string" ? body.value.trim() : "";
254
+ const chainId = typeof body.chainId === "number" ? body.chainId : Number(body.chainId);
255
+ const data = typeof body.data === "string" ? body.data : void 0;
256
+ const description = typeof body.description === "string" ? body.description : void 0;
257
+ if (!to || !value || !Number.isFinite(chainId) || chainId <= 0) {
258
+ sendJsonResponse(res, 400, {
259
+ error: "to, value, and a valid chainId are required"
260
+ });
261
+ return true;
262
+ }
263
+ try {
264
+ const result = await signViaSteward({
265
+ to,
266
+ value,
267
+ chainId,
268
+ data,
269
+ broadcast: true,
270
+ description
271
+ });
272
+ if (result.approved) {
273
+ sendJsonResponse(res, 200, result);
274
+ } else if (result.pending) {
275
+ sendJsonResponse(res, 202, result);
276
+ } else if (result.denied) {
277
+ sendJsonResponse(res, 403, result);
278
+ } else {
279
+ sendJsonResponse(res, 200, result);
280
+ }
281
+ } catch (err) {
282
+ const message = err instanceof Error ? err.message : "Steward sign failed";
283
+ sendJsonResponse(res, 500, { error: message });
284
+ }
285
+ return true;
286
+ }
287
+ if (method === "GET" && url.pathname === "/api/wallet/steward-addresses") {
288
+ if (!ensureCompatApiAuthorized(req, res)) {
289
+ return true;
290
+ }
291
+ try {
292
+ const addresses = getWalletAddresses();
293
+ const stewardAddresses = await getStewardWalletAddresses({
294
+ evmAddress: addresses.evmAddress
295
+ });
296
+ sendJsonResponse(res, 200, stewardAddresses);
297
+ } catch (err) {
298
+ const message = err instanceof Error ? err.message : "Failed to fetch steward addresses";
299
+ sendJsonResponse(res, 500, { error: message });
300
+ }
301
+ return true;
302
+ }
303
+ if (method === "GET" && url.pathname === "/api/wallet/steward-balances") {
304
+ if (!ensureCompatApiAuthorized(req, res)) {
305
+ return true;
306
+ }
307
+ const addresses = getWalletAddresses();
308
+ const agentId = resolveStewardAgentId(process.env, addresses.evmAddress);
309
+ if (!agentId || !createStewardClient()) {
310
+ sendJsonResponse(res, 503, { error: "Steward not configured" });
311
+ return true;
312
+ }
313
+ const chainId = url.searchParams.get("chainId");
314
+ const parsedChainId = chainId ? Number.parseInt(chainId, 10) : void 0;
315
+ try {
316
+ const balance = await getStewardBalance(agentId, parsedChainId);
317
+ sendJsonResponse(res, 200, balance);
318
+ } catch (err) {
319
+ const message = err instanceof Error ? err.message : "Failed to fetch steward balance";
320
+ sendJsonResponse(res, 500, { error: message });
321
+ }
322
+ return true;
323
+ }
324
+ if (method === "GET" && url.pathname === "/api/wallet/steward-tokens") {
325
+ if (!ensureCompatApiAuthorized(req, res)) {
326
+ return true;
327
+ }
328
+ const addresses = getWalletAddresses();
329
+ const agentId = resolveStewardAgentId(process.env, addresses.evmAddress);
330
+ if (!agentId || !createStewardClient()) {
331
+ sendJsonResponse(res, 503, { error: "Steward not configured" });
332
+ return true;
333
+ }
334
+ const chainId = url.searchParams.get("chainId");
335
+ const parsedChainId = chainId ? Number.parseInt(chainId, 10) : void 0;
336
+ try {
337
+ const tokens = await getStewardTokenBalances(agentId, parsedChainId);
338
+ sendJsonResponse(res, 200, tokens);
339
+ } catch (err) {
340
+ const message = err instanceof Error ? err.message : "Failed to fetch steward tokens";
341
+ sendJsonResponse(res, 500, { error: message });
342
+ }
343
+ return true;
344
+ }
345
+ return false;
346
+ }
347
+ export {
348
+ handleStewardCompatRoutes
349
+ };
350
+ //# sourceMappingURL=steward-compat-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/routes/steward-compat-routes.ts"],"sourcesContent":["import type http from \"node:http\";\nimport { ensureCompatApiAuthorized } from \"@elizaos/app-core/api/auth\";\nimport {\n type CompatRuntimeState,\n getConfiguredCompatAgentName,\n isLoopbackRemoteAddress,\n readCompatJsonBody,\n} from \"@elizaos/app-core/api/compat-route-shared\";\nimport {\n sendJsonError as sendJsonErrorResponse,\n sendJson as sendJsonResponse,\n} from \"@elizaos/app-core/api/response\";\nimport { logger } from \"@elizaos/core\";\nimport { getWalletAddresses } from \"../api/wallet.js\";\nimport {\n approveStewardTransaction,\n createStewardClient,\n denyStewardTransaction,\n ensureStewardAgent,\n getRecentWebhookEvents,\n getStewardBalance,\n getStewardBridgeStatus,\n getStewardHistory,\n getStewardPendingApprovals,\n getStewardTokenBalances,\n getStewardWalletAddresses,\n isStewardConfigured,\n pushWebhookEvent,\n resolveStewardAgentId,\n type StewardWebhookEventType,\n signViaSteward,\n} from \"./steward-bridge.js\";\n\n/**\n * Steward wallet routes:\n *\n * - `GET /api/wallet/steward-status`\n * - `GET /api/wallet/steward-policies`\n * - `PUT /api/wallet/steward-policies`\n * - `GET /api/wallet/steward-tx-records`\n * - `GET /api/wallet/steward-pending-approvals`\n * - `POST /api/wallet/steward-approve-tx`\n * - `POST /api/wallet/steward-deny-tx`\n * - `POST /api/wallet/steward-webhook` (loopback only, no auth)\n * - `GET /api/wallet/steward-webhook-events`\n * - `POST /api/wallet/steward-sign`\n * - `GET /api/wallet/steward-addresses`\n * - `GET /api/wallet/steward-balances`\n * - `GET /api/wallet/steward-tokens`\n */\nexport async function handleStewardCompatRoutes(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n _state: CompatRuntimeState,\n): Promise<boolean> {\n const method = (req.method ?? \"GET\").toUpperCase();\n const url = new URL(req.url ?? \"/\", \"http://localhost\");\n\n // Quick prefix check — all steward routes live under /api/wallet/steward-*\n if (!url.pathname.startsWith(\"/api/wallet/steward\")) {\n return false;\n }\n\n // ── GET /api/wallet/steward-status ──────────────────────────────────\n if (method === \"GET\" && url.pathname === \"/api/wallet/steward-status\") {\n if (!ensureCompatApiAuthorized(req, res)) {\n return true;\n }\n\n const addresses = getWalletAddresses();\n\n // Lazy initialization: on first request, ensure the steward agent exists\n if (isStewardConfigured()) {\n const agentId = resolveStewardAgentId(process.env, addresses.evmAddress);\n const characterName = getConfiguredCompatAgentName();\n void ensureStewardAgent({\n agentId: agentId ?? undefined,\n agentName: characterName ?? undefined,\n }).catch(() => {\n /* non-fatal — logged internally */\n });\n }\n\n const status = await getStewardBridgeStatus({\n evmAddress: addresses.evmAddress,\n });\n sendJsonResponse(res, 200, status);\n return true;\n }\n\n // ── GET /api/wallet/steward-policies ────────────────────────────────\n if (method === \"GET\" && url.pathname === \"/api/wallet/steward-policies\") {\n if (!ensureCompatApiAuthorized(req, res)) {\n return true;\n }\n\n const addresses = getWalletAddresses();\n const agentId = resolveStewardAgentId(process.env, addresses.evmAddress);\n const stewardClient = createStewardClient();\n\n if (!stewardClient || !agentId) {\n sendJsonResponse(res, 503, {\n error: \"Steward not configured\",\n });\n return true;\n }\n\n try {\n const policies = await stewardClient.getPolicies(agentId);\n sendJsonResponse(res, 200, policies);\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Failed to fetch policies\";\n sendJsonResponse(res, 500, { error: message });\n }\n return true;\n }\n\n // ── PUT /api/wallet/steward-policies ────────────────────────────────\n if (method === \"PUT\" && url.pathname === \"/api/wallet/steward-policies\") {\n if (!ensureCompatApiAuthorized(req, res)) {\n return true;\n }\n\n const body = await readCompatJsonBody(req, res);\n if (!body) return true;\n\n const { policies } = body as {\n policies: Array<{\n id: string;\n type: string;\n enabled: boolean;\n config: Record<string, unknown>;\n }>;\n };\n\n if (!Array.isArray(policies)) {\n sendJsonResponse(res, 400, {\n error: \"policies must be an array\",\n });\n return true;\n }\n\n const addresses = getWalletAddresses();\n const agentId = resolveStewardAgentId(process.env, addresses.evmAddress);\n const stewardClient = createStewardClient();\n\n if (!stewardClient || !agentId) {\n sendJsonResponse(res, 503, {\n error: \"Steward not configured\",\n });\n return true;\n }\n\n try {\n await stewardClient.setPolicies(\n agentId,\n policies as import(\"@stwd/sdk\").PolicyRule[],\n );\n sendJsonResponse(res, 200, { ok: true });\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Failed to save policies\";\n sendJsonResponse(res, 500, { error: message });\n }\n return true;\n }\n\n // ── GET /api/wallet/steward-tx-records ──────────────────────────────\n if (method === \"GET\" && url.pathname === \"/api/wallet/steward-tx-records\") {\n if (!ensureCompatApiAuthorized(req, res)) {\n return true;\n }\n\n const addresses = getWalletAddresses();\n const agentId = resolveStewardAgentId(process.env, addresses.evmAddress);\n\n if (!agentId || !createStewardClient()) {\n sendJsonResponse(res, 503, {\n error: \"Steward not configured\",\n });\n return true;\n }\n\n try {\n const status = url.searchParams.get(\"status\") || undefined;\n const limit = parseInt(url.searchParams.get(\"limit\") || \"50\", 10);\n const offset = parseInt(url.searchParams.get(\"offset\") || \"0\", 10);\n const history = await getStewardHistory(agentId, {\n limit,\n offset,\n });\n const filtered = status\n ? history.filter((h: { status: string }) => h.status === status)\n : history;\n sendJsonResponse(res, 200, {\n records: filtered,\n total: filtered.length,\n offset,\n limit,\n });\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Failed to fetch tx records\";\n sendJsonResponse(res, 500, { error: message });\n }\n return true;\n }\n\n // ── GET /api/wallet/steward-pending-approvals ───────────────────────\n if (\n method === \"GET\" &&\n url.pathname === \"/api/wallet/steward-pending-approvals\"\n ) {\n if (!ensureCompatApiAuthorized(req, res)) {\n return true;\n }\n\n const addresses = getWalletAddresses();\n const agentId = resolveStewardAgentId(process.env, addresses.evmAddress);\n\n if (!agentId || !createStewardClient()) {\n sendJsonResponse(res, 503, {\n error: \"Steward not configured\",\n });\n return true;\n }\n\n try {\n const pending = await getStewardPendingApprovals(agentId);\n sendJsonResponse(res, 200, pending);\n } catch (err) {\n const message =\n err instanceof Error\n ? err.message\n : \"Failed to fetch pending approvals\";\n sendJsonResponse(res, 500, { error: message });\n }\n return true;\n }\n\n // ── POST /api/wallet/steward-approve-tx | steward-deny-tx ──────────\n if (\n method === \"POST\" &&\n (url.pathname === \"/api/wallet/steward-approve-tx\" ||\n url.pathname === \"/api/wallet/steward-deny-tx\")\n ) {\n if (!ensureCompatApiAuthorized(req, res)) {\n return true;\n }\n\n const body = await readCompatJsonBody(req, res);\n if (!body) return true;\n\n const txId = typeof body.txId === \"string\" ? body.txId : \"\";\n if (!txId) {\n sendJsonResponse(res, 400, { error: \"txId is required\" });\n return true;\n }\n\n const addresses = getWalletAddresses();\n const agentId = resolveStewardAgentId(process.env, addresses.evmAddress);\n\n if (!agentId || !createStewardClient()) {\n sendJsonResponse(res, 503, {\n error: \"Steward not configured\",\n });\n return true;\n }\n\n const isApprove = url.pathname.includes(\"approve\");\n const reason = typeof body.reason === \"string\" ? body.reason : undefined;\n\n try {\n const result = isApprove\n ? await approveStewardTransaction(agentId, txId)\n : await denyStewardTransaction(agentId, txId, reason);\n sendJsonResponse(res, 200, { ok: true, ...result });\n } catch (err) {\n const action = isApprove ? \"approve\" : \"deny\";\n const message =\n err instanceof Error ? err.message : `Failed to ${action} transaction`;\n sendJsonResponse(res, 500, { error: message });\n }\n return true;\n }\n\n // ── POST /api/wallet/steward-webhook (loopback only, no auth) ──────\n if (method === \"POST\" && url.pathname === \"/api/wallet/steward-webhook\") {\n if (!isLoopbackRemoteAddress(req.socket?.remoteAddress)) {\n logger.warn(\n `[steward-webhook] Rejected non-loopback request from ${req.socket?.remoteAddress}`,\n );\n sendJsonErrorResponse(res, 403, \"Webhook only accepted from localhost\");\n return true;\n }\n\n const body = await readCompatJsonBody(req, res);\n if (!body) return true;\n\n const event = typeof body.event === \"string\" ? body.event : \"\";\n const VALID_EVENTS: StewardWebhookEventType[] = [\n \"tx.pending\",\n \"tx.approved\",\n \"tx.denied\",\n \"tx.confirmed\",\n ];\n\n if (!VALID_EVENTS.includes(event as StewardWebhookEventType)) {\n sendJsonResponse(res, 400, { error: `Unknown event type: ${event}` });\n return true;\n }\n\n const data =\n body.data && typeof body.data === \"object\" && !Array.isArray(body.data)\n ? (body.data as Record<string, unknown>)\n : {};\n\n pushWebhookEvent({\n event: event as StewardWebhookEventType,\n data,\n timestamp: new Date().toISOString(),\n });\n\n logger.info(`[steward-webhook] Received ${event}`);\n sendJsonResponse(res, 200, { ok: true });\n return true;\n }\n\n // ── GET /api/wallet/steward-webhook-events ──────────────────────────\n if (\n method === \"GET\" &&\n url.pathname === \"/api/wallet/steward-webhook-events\"\n ) {\n if (!ensureCompatApiAuthorized(req, res)) {\n return true;\n }\n\n const eventType = url.searchParams.get(\n \"event\",\n ) as StewardWebhookEventType | null;\n const sinceIndex = Number.parseInt(\n url.searchParams.get(\"since\") || \"0\",\n 10,\n );\n\n const result = getRecentWebhookEvents(\n eventType || undefined,\n Number.isNaN(sinceIndex) ? 0 : sinceIndex,\n );\n sendJsonResponse(res, 200, result);\n return true;\n }\n\n // ── POST /api/wallet/steward-sign ───────────────────────────────────\n if (method === \"POST\" && url.pathname === \"/api/wallet/steward-sign\") {\n if (!ensureCompatApiAuthorized(req, res)) {\n return true;\n }\n\n const body = await readCompatJsonBody(req, res);\n if (!body) return true;\n\n const to = typeof body.to === \"string\" ? body.to.trim() : \"\";\n const value = typeof body.value === \"string\" ? body.value.trim() : \"\";\n const chainId =\n typeof body.chainId === \"number\" ? body.chainId : Number(body.chainId);\n const data = typeof body.data === \"string\" ? body.data : undefined;\n const description =\n typeof body.description === \"string\" ? body.description : undefined;\n\n if (!to || !value || !Number.isFinite(chainId) || chainId <= 0) {\n sendJsonResponse(res, 400, {\n error: \"to, value, and a valid chainId are required\",\n });\n return true;\n }\n\n try {\n const result = await signViaSteward({\n to,\n value,\n chainId,\n data,\n broadcast: true,\n description,\n });\n\n if (result.approved) {\n sendJsonResponse(res, 200, result);\n } else if (result.pending) {\n sendJsonResponse(res, 202, result);\n } else if (result.denied) {\n sendJsonResponse(res, 403, result);\n } else {\n sendJsonResponse(res, 200, result);\n }\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Steward sign failed\";\n sendJsonResponse(res, 500, { error: message });\n }\n return true;\n }\n\n // ── GET /api/wallet/steward-addresses ───────────────────────────────\n if (method === \"GET\" && url.pathname === \"/api/wallet/steward-addresses\") {\n if (!ensureCompatApiAuthorized(req, res)) {\n return true;\n }\n\n try {\n const addresses = getWalletAddresses();\n const stewardAddresses = await getStewardWalletAddresses({\n evmAddress: addresses.evmAddress,\n });\n sendJsonResponse(res, 200, stewardAddresses);\n } catch (err) {\n const message =\n err instanceof Error\n ? err.message\n : \"Failed to fetch steward addresses\";\n sendJsonResponse(res, 500, { error: message });\n }\n return true;\n }\n\n // ── GET /api/wallet/steward-balances ────────────────────────────────\n if (method === \"GET\" && url.pathname === \"/api/wallet/steward-balances\") {\n if (!ensureCompatApiAuthorized(req, res)) {\n return true;\n }\n\n const addresses = getWalletAddresses();\n const agentId = resolveStewardAgentId(process.env, addresses.evmAddress);\n\n if (!agentId || !createStewardClient()) {\n sendJsonResponse(res, 503, { error: \"Steward not configured\" });\n return true;\n }\n\n const chainId = url.searchParams.get(\"chainId\");\n const parsedChainId = chainId ? Number.parseInt(chainId, 10) : undefined;\n\n try {\n const balance = await getStewardBalance(agentId, parsedChainId);\n sendJsonResponse(res, 200, balance);\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Failed to fetch steward balance\";\n sendJsonResponse(res, 500, { error: message });\n }\n return true;\n }\n\n // ── GET /api/wallet/steward-tokens ──────────────────────────────────\n if (method === \"GET\" && url.pathname === \"/api/wallet/steward-tokens\") {\n if (!ensureCompatApiAuthorized(req, res)) {\n return true;\n }\n\n const addresses = getWalletAddresses();\n const agentId = resolveStewardAgentId(process.env, addresses.evmAddress);\n\n if (!agentId || !createStewardClient()) {\n sendJsonResponse(res, 503, { error: \"Steward not configured\" });\n return true;\n }\n\n const chainId = url.searchParams.get(\"chainId\");\n const parsedChainId = chainId ? Number.parseInt(chainId, 10) : undefined;\n\n try {\n const tokens = await getStewardTokenBalances(agentId, parsedChainId);\n sendJsonResponse(res, 200, tokens);\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Failed to fetch steward tokens\";\n sendJsonResponse(res, 500, { error: message });\n }\n return true;\n }\n\n return false;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,6 @@
1
+ import type http from "node:http";
2
+ import { type CompatRuntimeState } from "@elizaos/app-core/api/compat-route-shared";
3
+ /** @internal Exported for testing. Parse a transaction value string to BigInt. */
4
+ export declare function safeParseBigInt(value: string): bigint;
5
+ export declare function handleWalletBrowserCompatRoutes(req: http.IncomingMessage, res: http.ServerResponse, _state: CompatRuntimeState): Promise<boolean>;
6
+ //# sourceMappingURL=wallet-browser-compat-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet-browser-compat-routes.d.ts","sourceRoot":"","sources":["../../src/routes/wallet-browser-compat-routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,OAAO,EACL,KAAK,kBAAkB,EAExB,MAAM,2CAA2C,CAAC;AAUnD,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQrD;AA6VD,wBAAsB,+BAA+B,CACnD,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,OAAO,CAAC,CA+JlB"}