@elizaos/autonomous 2.0.0-alpha.10

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 (241) hide show
  1. package/LICENSE +21 -0
  2. package/package.json +270 -0
  3. package/src/actions/emote.ts +101 -0
  4. package/src/actions/restart.ts +101 -0
  5. package/src/actions/send-message.ts +168 -0
  6. package/src/actions/stream-control.ts +439 -0
  7. package/src/actions/switch-stream-source.ts +126 -0
  8. package/src/actions/terminal.ts +186 -0
  9. package/src/api/agent-admin-routes.ts +178 -0
  10. package/src/api/agent-lifecycle-routes.ts +129 -0
  11. package/src/api/agent-model.ts +143 -0
  12. package/src/api/agent-transfer-routes.ts +211 -0
  13. package/src/api/apps-routes.ts +210 -0
  14. package/src/api/auth-routes.ts +90 -0
  15. package/src/api/bsc-trade.ts +736 -0
  16. package/src/api/bug-report-routes.ts +161 -0
  17. package/src/api/character-routes.ts +421 -0
  18. package/src/api/cloud-billing-routes.ts +598 -0
  19. package/src/api/cloud-compat-routes.ts +192 -0
  20. package/src/api/cloud-routes.ts +529 -0
  21. package/src/api/cloud-status-routes.ts +234 -0
  22. package/src/api/compat-utils.ts +154 -0
  23. package/src/api/connector-health.ts +135 -0
  24. package/src/api/coordinator-wiring.ts +179 -0
  25. package/src/api/credit-detection.ts +47 -0
  26. package/src/api/database.ts +1357 -0
  27. package/src/api/diagnostics-routes.ts +389 -0
  28. package/src/api/drop-service.ts +205 -0
  29. package/src/api/early-logs.ts +111 -0
  30. package/src/api/http-helpers.ts +252 -0
  31. package/src/api/index.ts +85 -0
  32. package/src/api/knowledge-routes.ts +1189 -0
  33. package/src/api/knowledge-service-loader.ts +92 -0
  34. package/src/api/memory-bounds.ts +121 -0
  35. package/src/api/memory-routes.ts +349 -0
  36. package/src/api/merkle-tree.ts +239 -0
  37. package/src/api/models-routes.ts +72 -0
  38. package/src/api/nfa-routes.ts +169 -0
  39. package/src/api/nft-verify.ts +188 -0
  40. package/src/api/og-tracker.ts +72 -0
  41. package/src/api/parse-action-block.ts +145 -0
  42. package/src/api/permissions-routes.ts +222 -0
  43. package/src/api/plugin-validation.ts +355 -0
  44. package/src/api/provider-switch-config.ts +455 -0
  45. package/src/api/registry-routes.ts +165 -0
  46. package/src/api/registry-service.ts +292 -0
  47. package/src/api/route-helpers.ts +21 -0
  48. package/src/api/sandbox-routes.ts +1480 -0
  49. package/src/api/server.ts +17674 -0
  50. package/src/api/signal-routes.ts +265 -0
  51. package/src/api/stream-persistence.ts +297 -0
  52. package/src/api/stream-route-state.ts +48 -0
  53. package/src/api/stream-routes.ts +1046 -0
  54. package/src/api/stream-voice-routes.ts +208 -0
  55. package/src/api/streaming-text.ts +129 -0
  56. package/src/api/streaming-types.ts +23 -0
  57. package/src/api/subscription-routes.ts +283 -0
  58. package/src/api/terminal-run-limits.ts +31 -0
  59. package/src/api/training-backend-check.ts +40 -0
  60. package/src/api/training-routes.ts +314 -0
  61. package/src/api/training-service-like.ts +46 -0
  62. package/src/api/trajectory-routes.ts +714 -0
  63. package/src/api/trigger-routes.ts +438 -0
  64. package/src/api/twitter-verify.ts +226 -0
  65. package/src/api/tx-service.ts +193 -0
  66. package/src/api/wallet-dex-prices.ts +206 -0
  67. package/src/api/wallet-evm-balance.ts +989 -0
  68. package/src/api/wallet-routes.ts +505 -0
  69. package/src/api/wallet-rpc.ts +523 -0
  70. package/src/api/wallet-trading-profile.ts +694 -0
  71. package/src/api/wallet.ts +745 -0
  72. package/src/api/whatsapp-routes.ts +282 -0
  73. package/src/api/zip-utils.ts +130 -0
  74. package/src/auth/anthropic.ts +63 -0
  75. package/src/auth/apply-stealth.ts +38 -0
  76. package/src/auth/claude-code-stealth.ts +141 -0
  77. package/src/auth/credentials.ts +226 -0
  78. package/src/auth/index.ts +18 -0
  79. package/src/auth/openai-codex.ts +94 -0
  80. package/src/auth/types.ts +24 -0
  81. package/src/awareness/registry.ts +220 -0
  82. package/src/bin.ts +10 -0
  83. package/src/cli/index.ts +36 -0
  84. package/src/cli/parse-duration.ts +43 -0
  85. package/src/cloud/auth.test.ts +370 -0
  86. package/src/cloud/auth.ts +176 -0
  87. package/src/cloud/backup.test.ts +150 -0
  88. package/src/cloud/backup.ts +50 -0
  89. package/src/cloud/base-url.ts +45 -0
  90. package/src/cloud/bridge-client.test.ts +481 -0
  91. package/src/cloud/bridge-client.ts +307 -0
  92. package/src/cloud/cloud-manager.test.ts +223 -0
  93. package/src/cloud/cloud-manager.ts +151 -0
  94. package/src/cloud/cloud-proxy.test.ts +122 -0
  95. package/src/cloud/cloud-proxy.ts +52 -0
  96. package/src/cloud/index.ts +23 -0
  97. package/src/cloud/reconnect.test.ts +178 -0
  98. package/src/cloud/reconnect.ts +108 -0
  99. package/src/cloud/validate-url.test.ts +147 -0
  100. package/src/cloud/validate-url.ts +176 -0
  101. package/src/config/character-schema.ts +44 -0
  102. package/src/config/config.ts +149 -0
  103. package/src/config/env-vars.ts +86 -0
  104. package/src/config/includes.ts +196 -0
  105. package/src/config/index.ts +15 -0
  106. package/src/config/object-utils.ts +10 -0
  107. package/src/config/paths.ts +92 -0
  108. package/src/config/plugin-auto-enable.ts +520 -0
  109. package/src/config/schema.ts +1342 -0
  110. package/src/config/telegram-custom-commands.ts +99 -0
  111. package/src/config/types.agent-defaults.ts +342 -0
  112. package/src/config/types.agents.ts +112 -0
  113. package/src/config/types.gateway.ts +243 -0
  114. package/src/config/types.hooks.ts +124 -0
  115. package/src/config/types.messages.ts +201 -0
  116. package/src/config/types.milady.ts +791 -0
  117. package/src/config/types.tools.ts +416 -0
  118. package/src/config/types.ts +7 -0
  119. package/src/config/zod-schema.agent-runtime.ts +777 -0
  120. package/src/config/zod-schema.core.ts +778 -0
  121. package/src/config/zod-schema.hooks.ts +139 -0
  122. package/src/config/zod-schema.providers-core.ts +1126 -0
  123. package/src/config/zod-schema.session.ts +98 -0
  124. package/src/config/zod-schema.ts +865 -0
  125. package/src/contracts/apps.ts +46 -0
  126. package/src/contracts/awareness.ts +56 -0
  127. package/src/contracts/config.ts +172 -0
  128. package/src/contracts/drop.ts +21 -0
  129. package/src/contracts/index.ts +8 -0
  130. package/src/contracts/onboarding.ts +592 -0
  131. package/src/contracts/permissions.ts +52 -0
  132. package/src/contracts/verification.ts +9 -0
  133. package/src/contracts/wallet.ts +503 -0
  134. package/src/diagnostics/integration-observability.ts +132 -0
  135. package/src/emotes/catalog.ts +655 -0
  136. package/src/external-modules.d.ts +7 -0
  137. package/src/hooks/discovery.test.ts +357 -0
  138. package/src/hooks/discovery.ts +231 -0
  139. package/src/hooks/eligibility.ts +146 -0
  140. package/src/hooks/hooks.test.ts +320 -0
  141. package/src/hooks/index.ts +8 -0
  142. package/src/hooks/loader.test.ts +418 -0
  143. package/src/hooks/loader.ts +256 -0
  144. package/src/hooks/registry.test.ts +168 -0
  145. package/src/hooks/registry.ts +74 -0
  146. package/src/hooks/types.ts +121 -0
  147. package/src/index.ts +19 -0
  148. package/src/onboarding-presets.ts +828 -0
  149. package/src/plugins/custom-rtmp/index.ts +40 -0
  150. package/src/providers/admin-trust.ts +76 -0
  151. package/src/providers/session-bridge.ts +143 -0
  152. package/src/providers/session-utils.ts +42 -0
  153. package/src/providers/simple-mode.ts +113 -0
  154. package/src/providers/ui-catalog.ts +135 -0
  155. package/src/providers/workspace-provider.ts +213 -0
  156. package/src/providers/workspace.ts +497 -0
  157. package/src/runtime/agent-event-service.ts +57 -0
  158. package/src/runtime/cloud-onboarding.test.ts +489 -0
  159. package/src/runtime/cloud-onboarding.ts +408 -0
  160. package/src/runtime/core-plugins.ts +53 -0
  161. package/src/runtime/custom-actions.ts +605 -0
  162. package/src/runtime/eliza.ts +4941 -0
  163. package/src/runtime/embedding-presets.ts +73 -0
  164. package/src/runtime/index.ts +8 -0
  165. package/src/runtime/milady-plugin.ts +180 -0
  166. package/src/runtime/onboarding-names.ts +76 -0
  167. package/src/runtime/release-plugin-policy.ts +119 -0
  168. package/src/runtime/restart.ts +59 -0
  169. package/src/runtime/trajectory-persistence.ts +2584 -0
  170. package/src/runtime/version.ts +6 -0
  171. package/src/security/audit-log.ts +222 -0
  172. package/src/security/network-policy.ts +91 -0
  173. package/src/server/index.ts +6 -0
  174. package/src/services/agent-export.ts +976 -0
  175. package/src/services/app-manager.ts +755 -0
  176. package/src/services/browser-capture.ts +215 -0
  177. package/src/services/coding-agent-context.ts +355 -0
  178. package/src/services/fallback-training-service.ts +196 -0
  179. package/src/services/index.ts +17 -0
  180. package/src/services/mcp-marketplace.ts +327 -0
  181. package/src/services/plugin-manager-types.ts +185 -0
  182. package/src/services/privy-wallets.ts +352 -0
  183. package/src/services/registry-client-app-meta.ts +201 -0
  184. package/src/services/registry-client-endpoints.ts +253 -0
  185. package/src/services/registry-client-local.ts +485 -0
  186. package/src/services/registry-client-network.ts +173 -0
  187. package/src/services/registry-client-queries.ts +176 -0
  188. package/src/services/registry-client-types.ts +104 -0
  189. package/src/services/registry-client.ts +366 -0
  190. package/src/services/remote-signing-service.ts +261 -0
  191. package/src/services/sandbox-engine.ts +753 -0
  192. package/src/services/sandbox-manager.ts +503 -0
  193. package/src/services/self-updater.ts +213 -0
  194. package/src/services/signal-pairing.ts +189 -0
  195. package/src/services/signing-policy.ts +230 -0
  196. package/src/services/skill-catalog-client.ts +195 -0
  197. package/src/services/skill-marketplace.ts +909 -0
  198. package/src/services/stream-manager.ts +707 -0
  199. package/src/services/tts-stream-bridge.ts +465 -0
  200. package/src/services/update-checker.ts +163 -0
  201. package/src/services/version-compat.ts +367 -0
  202. package/src/services/whatsapp-pairing.ts +279 -0
  203. package/src/shared/ui-catalog-prompt.ts +1158 -0
  204. package/src/test-support/process-helpers.ts +35 -0
  205. package/src/test-support/route-test-helpers.ts +113 -0
  206. package/src/test-support/test-helpers.ts +304 -0
  207. package/src/testing/index.ts +3 -0
  208. package/src/triggers/action.ts +342 -0
  209. package/src/triggers/runtime.ts +432 -0
  210. package/src/triggers/scheduling.ts +472 -0
  211. package/src/triggers/types.ts +133 -0
  212. package/src/types/app-hyperscape-routes-shim.d.ts +29 -0
  213. package/src/types/external-modules.d.ts +7 -0
  214. package/src/utils/exec-safety.ts +23 -0
  215. package/src/utils/number-parsing.ts +112 -0
  216. package/src/utils/spoken-text.ts +65 -0
  217. package/src/version-resolver.ts +60 -0
  218. package/test/api/agent-admin-routes.test.ts +160 -0
  219. package/test/api/agent-lifecycle-routes.test.ts +164 -0
  220. package/test/api/agent-transfer-routes.test.ts +136 -0
  221. package/test/api/apps-routes.test.ts +140 -0
  222. package/test/api/auth-routes.test.ts +160 -0
  223. package/test/api/bug-report-routes.test.ts +88 -0
  224. package/test/api/knowledge-routes.test.ts +73 -0
  225. package/test/api/lifecycle.test.ts +342 -0
  226. package/test/api/memory-routes.test.ts +74 -0
  227. package/test/api/models-routes.test.ts +112 -0
  228. package/test/api/nfa-routes.test.ts +78 -0
  229. package/test/api/permissions-routes.test.ts +185 -0
  230. package/test/api/registry-routes.test.ts +157 -0
  231. package/test/api/signal-routes.test.ts +113 -0
  232. package/test/api/subscription-routes.test.ts +90 -0
  233. package/test/api/trigger-routes.test.ts +87 -0
  234. package/test/api/wallet-routes.observability.test.ts +191 -0
  235. package/test/api/wallet-routes.test.ts +502 -0
  236. package/test/diagnostics/integration-observability.test.ts +135 -0
  237. package/test/security/audit-log.test.ts +229 -0
  238. package/test/security/network-policy.test.ts +143 -0
  239. package/test/services/version-compat.test.ts +127 -0
  240. package/tsconfig.build.json +21 -0
  241. package/tsconfig.json +19 -0
@@ -0,0 +1,523 @@
1
+ import type { MiladyConfig } from "../config/config";
2
+ import {
3
+ DEFAULT_WALLET_RPC_SELECTIONS,
4
+ normalizeWalletRpcSelections,
5
+ type WalletConfigUpdateRequest,
6
+ type WalletRpcChain,
7
+ type WalletRpcCredentialKey,
8
+ type WalletRpcSelections,
9
+ } from "../contracts/wallet";
10
+
11
+ export const DEFAULT_CLOUD_API_BASE_URL = "https://elizacloud.ai/api/v1";
12
+ export const DEFAULT_PUBLIC_BSC_RPC_URLS = [
13
+ "https://bsc-dataseed1.binance.org/",
14
+ ] as const;
15
+ export const DEFAULT_PUBLIC_ETHEREUM_RPC_URLS = [
16
+ "https://ethereum.publicnode.com/",
17
+ ] as const;
18
+ export const DEFAULT_PUBLIC_BASE_RPC_URLS = [
19
+ "https://base.publicnode.com/",
20
+ ] as const;
21
+ export const DEFAULT_PUBLIC_AVALANCHE_RPC_URLS = [
22
+ "https://avalanche.publicnode.com/ext/bc/C/rpc",
23
+ ] as const;
24
+ export const DEFAULT_PUBLIC_SOLANA_RPC_URLS = [
25
+ "https://api.mainnet-beta.solana.com",
26
+ ] as const;
27
+
28
+ type WalletCapableConfig = Pick<MiladyConfig, "cloud" | "env"> & {
29
+ wallet?: {
30
+ rpcProviders?: Partial<Record<keyof WalletRpcSelections, string>>;
31
+ };
32
+ };
33
+
34
+ export interface InventoryProviderOption {
35
+ id: WalletRpcChain;
36
+ name: string;
37
+ description: string;
38
+ rpcProviders: Array<{
39
+ id: string;
40
+ name: string;
41
+ description: string;
42
+ envKey: WalletRpcCredentialKey | null;
43
+ requiresKey: boolean;
44
+ }>;
45
+ }
46
+
47
+ export interface WalletRpcResolutionOptions {
48
+ cloudManagedAccess?: boolean | null;
49
+ cloudApiKey?: string | null;
50
+ cloudBaseUrl?: string | null;
51
+ }
52
+
53
+ export interface WalletRpcReadiness {
54
+ cloudManagedAccess: boolean;
55
+ managedBscRpcReady: boolean;
56
+ evmBalanceReady: boolean;
57
+ solanaBalanceReady: boolean;
58
+ selectedRpcProviders: WalletRpcSelections;
59
+ legacyCustomChains: WalletRpcChain[];
60
+ bscRpcUrls: string[];
61
+ ethereumRpcUrls: string[];
62
+ baseRpcUrls: string[];
63
+ avalancheRpcUrls: string[];
64
+ solanaRpcUrls: string[];
65
+ }
66
+
67
+ type SupportedCloudEvmRpcChain = "mainnet" | "base" | "bsc" | "avalanche";
68
+
69
+ const PROVIDER_CREDENTIAL_KEYS: Record<
70
+ WalletRpcChain,
71
+ Record<string, WalletRpcCredentialKey[]>
72
+ > = {
73
+ evm: {
74
+ "eliza-cloud": [],
75
+ alchemy: ["ALCHEMY_API_KEY"],
76
+ infura: ["INFURA_API_KEY"],
77
+ ankr: ["ANKR_API_KEY"],
78
+ },
79
+ bsc: {
80
+ "eliza-cloud": [],
81
+ alchemy: ["ALCHEMY_API_KEY"],
82
+ ankr: ["ANKR_API_KEY"],
83
+ nodereal: ["NODEREAL_BSC_RPC_URL"],
84
+ quicknode: ["QUICKNODE_BSC_RPC_URL"],
85
+ },
86
+ solana: {
87
+ "eliza-cloud": [],
88
+ "helius-birdeye": ["HELIUS_API_KEY", "BIRDEYE_API_KEY"],
89
+ },
90
+ };
91
+
92
+ const LEGACY_CUSTOM_CHAIN_KEYS: Record<
93
+ WalletRpcChain,
94
+ WalletRpcCredentialKey[]
95
+ > = {
96
+ evm: ["ETHEREUM_RPC_URL", "BASE_RPC_URL", "AVALANCHE_RPC_URL"],
97
+ bsc: ["BSC_RPC_URL"],
98
+ solana: ["SOLANA_RPC_URL"],
99
+ };
100
+
101
+ const WALLET_RPC_CONFIG_KEYS = [
102
+ "ALCHEMY_API_KEY",
103
+ "INFURA_API_KEY",
104
+ "ANKR_API_KEY",
105
+ "ETHEREUM_RPC_URL",
106
+ "BASE_RPC_URL",
107
+ "AVALANCHE_RPC_URL",
108
+ "HELIUS_API_KEY",
109
+ "BIRDEYE_API_KEY",
110
+ "NODEREAL_BSC_RPC_URL",
111
+ "QUICKNODE_BSC_RPC_URL",
112
+ "BSC_RPC_URL",
113
+ "SOLANA_RPC_URL",
114
+ ] as const satisfies readonly WalletRpcCredentialKey[];
115
+
116
+ function normalizeSecret(value: string | null | undefined): string | null {
117
+ if (typeof value !== "string") return null;
118
+ const trimmed = value.trim();
119
+ return trimmed.length > 0 ? trimmed : null;
120
+ }
121
+
122
+ function uniqueRpcUrls(
123
+ ...groups: Array<ReadonlyArray<string | null | undefined>>
124
+ ): string[] {
125
+ return [
126
+ ...new Set(
127
+ groups
128
+ .flat()
129
+ .map((url) => normalizeRpcUrl(url))
130
+ .filter((url): url is string => Boolean(url)),
131
+ ),
132
+ ];
133
+ }
134
+
135
+ function hasStoredSelections(config?: WalletCapableConfig | null): boolean {
136
+ const selections = config?.wallet?.rpcProviders;
137
+ return Boolean(selections && Object.keys(selections).length > 0);
138
+ }
139
+
140
+ function inferSelectedRpcProviders(): WalletRpcSelections {
141
+ return {
142
+ evm: process.env.ALCHEMY_API_KEY?.trim()
143
+ ? "alchemy"
144
+ : process.env.INFURA_API_KEY?.trim()
145
+ ? "infura"
146
+ : process.env.ANKR_API_KEY?.trim()
147
+ ? "ankr"
148
+ : DEFAULT_WALLET_RPC_SELECTIONS.evm,
149
+ bsc: process.env.NODEREAL_BSC_RPC_URL?.trim()
150
+ ? "nodereal"
151
+ : process.env.QUICKNODE_BSC_RPC_URL?.trim()
152
+ ? "quicknode"
153
+ : process.env.ALCHEMY_API_KEY?.trim()
154
+ ? "alchemy"
155
+ : process.env.ANKR_API_KEY?.trim()
156
+ ? "ankr"
157
+ : DEFAULT_WALLET_RPC_SELECTIONS.bsc,
158
+ solana:
159
+ process.env.HELIUS_API_KEY?.trim() || process.env.BIRDEYE_API_KEY?.trim()
160
+ ? "helius-birdeye"
161
+ : DEFAULT_WALLET_RPC_SELECTIONS.solana,
162
+ };
163
+ }
164
+
165
+ function hasLegacyCustomChainUrl(chain: WalletRpcChain): boolean {
166
+ return LEGACY_CUSTOM_CHAIN_KEYS[chain].some((key) =>
167
+ Boolean(normalizeSecret(process.env[key])),
168
+ );
169
+ }
170
+
171
+ function buildLegacyCustomChains(
172
+ selections: WalletRpcSelections,
173
+ ): WalletRpcChain[] {
174
+ return (Object.keys(LEGACY_CUSTOM_CHAIN_KEYS) as WalletRpcChain[]).filter(
175
+ (chain) =>
176
+ selections[chain] === DEFAULT_WALLET_RPC_SELECTIONS[chain] &&
177
+ hasLegacyCustomChainUrl(chain),
178
+ );
179
+ }
180
+
181
+ export function normalizeRpcUrl(url: string | null | undefined): string | null {
182
+ if (typeof url !== "string") return null;
183
+ const trimmed = url.trim();
184
+ if (!trimmed) return null;
185
+ try {
186
+ const parsed = new URL(trimmed);
187
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
188
+ return null;
189
+ }
190
+ return parsed.toString();
191
+ } catch {
192
+ return null;
193
+ }
194
+ }
195
+
196
+ export function resolveCloudApiBaseUrl(
197
+ rawBaseUrl?: string | null,
198
+ ): string | null {
199
+ const candidate =
200
+ normalizeSecret(rawBaseUrl ?? process.env.ELIZAOS_CLOUD_BASE_URL) ??
201
+ DEFAULT_CLOUD_API_BASE_URL;
202
+ try {
203
+ const parsed = new URL(candidate);
204
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
205
+ return null;
206
+ }
207
+ parsed.hash = "";
208
+ parsed.search = "";
209
+ const normalizedBase = parsed.toString().replace(/\/+$/, "");
210
+ return normalizedBase.endsWith("/api/v1")
211
+ ? normalizedBase
212
+ : `${normalizedBase}/api/v1`;
213
+ } catch {
214
+ return null;
215
+ }
216
+ }
217
+
218
+ export function resolveCloudApiKey(
219
+ config?: Pick<MiladyConfig, "cloud"> | null,
220
+ ): string | null {
221
+ return normalizeSecret(
222
+ config?.cloud?.apiKey ?? process.env.ELIZAOS_CLOUD_API_KEY,
223
+ );
224
+ }
225
+
226
+ function buildCloudRpcProxyUrl(
227
+ pathname: string,
228
+ options: WalletRpcResolutionOptions = {},
229
+ ): string | null {
230
+ const cloudApiKey = normalizeSecret(
231
+ options.cloudApiKey ?? process.env.ELIZAOS_CLOUD_API_KEY,
232
+ );
233
+ const cloudManagedAccess = options.cloudManagedAccess ?? Boolean(cloudApiKey);
234
+ if (!cloudManagedAccess || !cloudApiKey) {
235
+ return null;
236
+ }
237
+
238
+ const cloudBaseUrl = resolveCloudApiBaseUrl(options.cloudBaseUrl);
239
+ if (!cloudBaseUrl) {
240
+ return null;
241
+ }
242
+
243
+ const url = new URL(
244
+ pathname.replace(/^\/+/, ""),
245
+ `${cloudBaseUrl.replace(/\/+$/, "")}/`,
246
+ );
247
+ url.searchParams.set("api_key", cloudApiKey);
248
+ return normalizeRpcUrl(url.toString());
249
+ }
250
+
251
+ export function buildCloudEvmRpcUrl(
252
+ chain: SupportedCloudEvmRpcChain,
253
+ options: WalletRpcResolutionOptions = {},
254
+ ): string | null {
255
+ return buildCloudRpcProxyUrl(`proxy/evm-rpc/${chain}`, options);
256
+ }
257
+
258
+ export function buildCloudSolanaRpcUrl(
259
+ options: WalletRpcResolutionOptions = {},
260
+ ): string | null {
261
+ return buildCloudRpcProxyUrl("proxy/solana-rpc", options);
262
+ }
263
+
264
+ export function hasElizaCloudRpcAccess(
265
+ config?: Pick<MiladyConfig, "cloud"> | null,
266
+ ): boolean {
267
+ return Boolean(resolveCloudApiKey(config));
268
+ }
269
+
270
+ export function getStoredWalletRpcSelections(
271
+ config?: WalletCapableConfig | null,
272
+ ): WalletRpcSelections {
273
+ return normalizeWalletRpcSelections(config?.wallet?.rpcProviders);
274
+ }
275
+
276
+ export function getInventoryProviderOptions(): InventoryProviderOption[] {
277
+ return [
278
+ {
279
+ id: "evm",
280
+ name: "EVM",
281
+ description: "Ethereum, Base, Arbitrum, Optimism, Polygon.",
282
+ rpcProviders: [
283
+ {
284
+ id: "eliza-cloud",
285
+ name: "Eliza Cloud",
286
+ description: "Managed RPC. No setup needed.",
287
+ envKey: null,
288
+ requiresKey: false,
289
+ },
290
+ {
291
+ id: "infura",
292
+ name: "Infura",
293
+ description: "Reliable EVM infrastructure.",
294
+ envKey: "INFURA_API_KEY",
295
+ requiresKey: true,
296
+ },
297
+ {
298
+ id: "alchemy",
299
+ name: "Alchemy",
300
+ description: "Full-featured EVM data platform.",
301
+ envKey: "ALCHEMY_API_KEY",
302
+ requiresKey: true,
303
+ },
304
+ {
305
+ id: "ankr",
306
+ name: "Ankr",
307
+ description: "Decentralized RPC provider.",
308
+ envKey: "ANKR_API_KEY",
309
+ requiresKey: true,
310
+ },
311
+ ],
312
+ },
313
+ {
314
+ id: "bsc",
315
+ name: "BSC",
316
+ description: "BNB Smart Chain tokens, NFTs, and trades.",
317
+ rpcProviders: [
318
+ {
319
+ id: "eliza-cloud",
320
+ name: "Eliza Cloud",
321
+ description: "Managed RPC. No setup needed.",
322
+ envKey: null,
323
+ requiresKey: false,
324
+ },
325
+ {
326
+ id: "alchemy",
327
+ name: "Alchemy",
328
+ description: "Managed BSC RPC via Alchemy.",
329
+ envKey: "ALCHEMY_API_KEY",
330
+ requiresKey: true,
331
+ },
332
+ {
333
+ id: "ankr",
334
+ name: "Ankr",
335
+ description: "Decentralized BSC RPC provider.",
336
+ envKey: "ANKR_API_KEY",
337
+ requiresKey: true,
338
+ },
339
+ {
340
+ id: "nodereal",
341
+ name: "NodeReal",
342
+ description: "Dedicated BSC RPC endpoint.",
343
+ envKey: "NODEREAL_BSC_RPC_URL",
344
+ requiresKey: true,
345
+ },
346
+ {
347
+ id: "quicknode",
348
+ name: "QuickNode",
349
+ description: "Managed BSC RPC endpoint.",
350
+ envKey: "QUICKNODE_BSC_RPC_URL",
351
+ requiresKey: true,
352
+ },
353
+ ],
354
+ },
355
+ {
356
+ id: "solana",
357
+ name: "Solana",
358
+ description: "Solana mainnet tokens and NFTs.",
359
+ rpcProviders: [
360
+ {
361
+ id: "eliza-cloud",
362
+ name: "Eliza Cloud",
363
+ description: "Managed RPC. No setup needed.",
364
+ envKey: null,
365
+ requiresKey: false,
366
+ },
367
+ {
368
+ id: "helius-birdeye",
369
+ name: "Helius + Birdeye",
370
+ description: "Solana balances and NFT metadata.",
371
+ envKey: "HELIUS_API_KEY",
372
+ requiresKey: true,
373
+ },
374
+ ],
375
+ },
376
+ ];
377
+ }
378
+
379
+ export function resolveBscRpcUrls(
380
+ options: WalletRpcResolutionOptions = {},
381
+ ): string[] {
382
+ return uniqueRpcUrls(
383
+ [
384
+ process.env.NODEREAL_BSC_RPC_URL,
385
+ process.env.QUICKNODE_BSC_RPC_URL,
386
+ process.env.BSC_RPC_URL,
387
+ buildCloudEvmRpcUrl("bsc", options),
388
+ ],
389
+ options.cloudManagedAccess ? DEFAULT_PUBLIC_BSC_RPC_URLS : [],
390
+ );
391
+ }
392
+
393
+ export function resolveEthereumRpcUrls(
394
+ options: WalletRpcResolutionOptions = {},
395
+ ): string[] {
396
+ return uniqueRpcUrls(
397
+ [process.env.ETHEREUM_RPC_URL, buildCloudEvmRpcUrl("mainnet", options)],
398
+ options.cloudManagedAccess ? DEFAULT_PUBLIC_ETHEREUM_RPC_URLS : [],
399
+ );
400
+ }
401
+
402
+ export function resolveBaseRpcUrls(
403
+ options: WalletRpcResolutionOptions = {},
404
+ ): string[] {
405
+ return uniqueRpcUrls(
406
+ [process.env.BASE_RPC_URL, buildCloudEvmRpcUrl("base", options)],
407
+ options.cloudManagedAccess ? DEFAULT_PUBLIC_BASE_RPC_URLS : [],
408
+ );
409
+ }
410
+
411
+ export function resolveAvalancheRpcUrls(
412
+ options: WalletRpcResolutionOptions = {},
413
+ ): string[] {
414
+ return uniqueRpcUrls(
415
+ [process.env.AVALANCHE_RPC_URL, buildCloudEvmRpcUrl("avalanche", options)],
416
+ options.cloudManagedAccess ? DEFAULT_PUBLIC_AVALANCHE_RPC_URLS : [],
417
+ );
418
+ }
419
+
420
+ export function resolveSolanaRpcUrls(
421
+ options: WalletRpcResolutionOptions = {},
422
+ ): string[] {
423
+ return uniqueRpcUrls(
424
+ [process.env.SOLANA_RPC_URL, buildCloudSolanaRpcUrl(options)],
425
+ options.cloudManagedAccess ? DEFAULT_PUBLIC_SOLANA_RPC_URLS : [],
426
+ );
427
+ }
428
+
429
+ export function applyWalletRpcConfigUpdate(
430
+ config: WalletCapableConfig,
431
+ update: WalletConfigUpdateRequest,
432
+ ): void {
433
+ config.env ??= {};
434
+ const env = config.env as Record<string, string>;
435
+ const normalizedSelections = normalizeWalletRpcSelections(update.selections);
436
+ const selectedCredentialKeys = new Set<WalletRpcCredentialKey>();
437
+
438
+ for (const chain of Object.keys(normalizedSelections) as WalletRpcChain[]) {
439
+ for (const key of PROVIDER_CREDENTIAL_KEYS[chain][
440
+ normalizedSelections[chain]
441
+ ]) {
442
+ selectedCredentialKeys.add(key);
443
+ }
444
+ }
445
+
446
+ config.wallet = {
447
+ ...config.wallet,
448
+ rpcProviders: normalizedSelections,
449
+ };
450
+
451
+ for (const key of WALLET_RPC_CONFIG_KEYS) {
452
+ const value = update.credentials?.[key];
453
+ if (typeof value === "string" && value.trim()) {
454
+ const normalizedValue = value.trim();
455
+ env[key] = normalizedValue;
456
+ process.env[key] = normalizedValue;
457
+ continue;
458
+ }
459
+ if (typeof value === "string" || !selectedCredentialKeys.has(key)) {
460
+ delete env[key];
461
+ delete process.env[key];
462
+ }
463
+ }
464
+
465
+ const heliusKey = update.credentials?.HELIUS_API_KEY?.trim();
466
+ if (heliusKey) {
467
+ const solanaRpcUrl = `https://mainnet.helius-rpc.com/?api-key=${heliusKey}`;
468
+ env.SOLANA_RPC_URL = solanaRpcUrl;
469
+ process.env.SOLANA_RPC_URL = solanaRpcUrl;
470
+ } else if (
471
+ typeof update.credentials?.HELIUS_API_KEY === "string" &&
472
+ typeof update.credentials?.SOLANA_RPC_URL !== "string"
473
+ ) {
474
+ delete env.SOLANA_RPC_URL;
475
+ delete process.env.SOLANA_RPC_URL;
476
+ }
477
+ }
478
+
479
+ export function resolveWalletRpcReadiness(
480
+ config?: WalletCapableConfig | null,
481
+ ): WalletRpcReadiness {
482
+ const cloudApiKey = resolveCloudApiKey(config);
483
+ const cloudBaseUrl = resolveCloudApiBaseUrl(config?.cloud?.baseUrl);
484
+ const cloudManagedAccess = Boolean(cloudApiKey);
485
+ const cloudOptions = {
486
+ cloudManagedAccess,
487
+ cloudApiKey,
488
+ cloudBaseUrl,
489
+ } satisfies WalletRpcResolutionOptions;
490
+ const bscRpcUrls = resolveBscRpcUrls(cloudOptions);
491
+ const ethereumRpcUrls = resolveEthereumRpcUrls(cloudOptions);
492
+ const baseRpcUrls = resolveBaseRpcUrls(cloudOptions);
493
+ const avalancheRpcUrls = resolveAvalancheRpcUrls(cloudOptions);
494
+ const solanaRpcUrls = resolveSolanaRpcUrls(cloudOptions);
495
+ const selectedRpcProviders = hasStoredSelections(config)
496
+ ? getStoredWalletRpcSelections(config)
497
+ : inferSelectedRpcProviders();
498
+ const legacyCustomChains = buildLegacyCustomChains(selectedRpcProviders);
499
+
500
+ return {
501
+ cloudManagedAccess,
502
+ managedBscRpcReady: bscRpcUrls.length > 0,
503
+ evmBalanceReady: Boolean(
504
+ process.env.ALCHEMY_API_KEY?.trim() ||
505
+ process.env.ANKR_API_KEY?.trim() ||
506
+ process.env.INFURA_API_KEY?.trim() ||
507
+ bscRpcUrls.length > 0 ||
508
+ ethereumRpcUrls.length > 0 ||
509
+ baseRpcUrls.length > 0 ||
510
+ avalancheRpcUrls.length > 0,
511
+ ),
512
+ solanaBalanceReady: Boolean(
513
+ process.env.HELIUS_API_KEY?.trim() || solanaRpcUrls.length > 0,
514
+ ),
515
+ selectedRpcProviders,
516
+ legacyCustomChains,
517
+ bscRpcUrls,
518
+ ethereumRpcUrls,
519
+ baseRpcUrls,
520
+ avalancheRpcUrls,
521
+ solanaRpcUrls,
522
+ };
523
+ }