@elizaos/plugin-elizacloud 2.0.0-alpha.8 → 2.0.11-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 (452) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +196 -0
  3. package/auto-enable.ts +22 -0
  4. package/dist/browser/index.browser.js +2 -21
  5. package/dist/browser/index.browser.js.map +5 -38
  6. package/dist/cjs/index.d.ts +2 -2
  7. package/dist/cjs/index.node.cjs +9112 -2265
  8. package/dist/cjs/index.node.js.map +68 -30
  9. package/dist/cloud/auth-service-types.d.ts +8 -0
  10. package/dist/cloud/auth-service-types.d.ts.map +1 -0
  11. package/dist/cloud/auth-service-types.js +36 -0
  12. package/dist/cloud/auth-service-types.js.map +10 -0
  13. package/dist/cloud/auth.d.ts +19 -0
  14. package/dist/cloud/auth.d.ts.map +1 -0
  15. package/dist/cloud/auth.js +283 -0
  16. package/dist/cloud/auth.js.map +12 -0
  17. package/dist/cloud/backup.d.ts +18 -0
  18. package/dist/cloud/backup.d.ts.map +1 -0
  19. package/dist/cloud/backup.js +63 -0
  20. package/dist/cloud/backup.js.map +10 -0
  21. package/dist/cloud/base-url.d.ts +7 -0
  22. package/dist/cloud/base-url.d.ts.map +1 -0
  23. package/dist/cloud/base-url.js +29 -0
  24. package/dist/cloud/base-url.js.map +10 -0
  25. package/dist/cloud/bridge-client.d.ts +126 -0
  26. package/dist/cloud/bridge-client.d.ts.map +1 -0
  27. package/dist/cloud/bridge-client.js +384 -0
  28. package/dist/cloud/bridge-client.js.map +11 -0
  29. package/dist/cloud/clack-observer.d.ts +35 -0
  30. package/dist/cloud/clack-observer.d.ts.map +1 -0
  31. package/dist/cloud/clack-observer.js +143 -0
  32. package/dist/cloud/clack-observer.js.map +10 -0
  33. package/dist/cloud/cloud-api-key.d.ts +26 -0
  34. package/dist/cloud/cloud-api-key.d.ts.map +1 -0
  35. package/dist/cloud/cloud-api-key.js +60 -0
  36. package/dist/cloud/cloud-api-key.js.map +10 -0
  37. package/dist/cloud/cloud-manager.d.ts +33 -0
  38. package/dist/cloud/cloud-manager.d.ts.map +1 -0
  39. package/dist/cloud/cloud-manager.js +806 -0
  40. package/dist/cloud/cloud-manager.js.map +16 -0
  41. package/dist/cloud/cloud-proxy.d.ts +20 -0
  42. package/dist/cloud/cloud-proxy.d.ts.map +1 -0
  43. package/dist/cloud/cloud-proxy.js +54 -0
  44. package/dist/cloud/cloud-proxy.js.map +10 -0
  45. package/dist/cloud/cloud-wallet.d.ts +94 -0
  46. package/dist/cloud/cloud-wallet.d.ts.map +1 -0
  47. package/dist/cloud/cloud-wallet.js +362 -0
  48. package/dist/cloud/cloud-wallet.js.map +13 -0
  49. package/dist/cloud/duffel-client.d.ts +181 -0
  50. package/dist/cloud/duffel-client.d.ts.map +1 -0
  51. package/dist/cloud/duffel-client.js +506 -0
  52. package/dist/cloud/duffel-client.js.map +11 -0
  53. package/dist/cloud/index.d.ts +15 -0
  54. package/dist/cloud/index.d.ts.map +1 -0
  55. package/dist/cloud/index.js +1811 -0
  56. package/dist/cloud/index.js.map +24 -0
  57. package/dist/cloud/lifeops-schedule-sync-client.d.ts +43 -0
  58. package/dist/cloud/lifeops-schedule-sync-client.d.ts.map +1 -0
  59. package/dist/cloud/lifeops-schedule-sync-client.js +180 -0
  60. package/dist/cloud/lifeops-schedule-sync-client.js.map +11 -0
  61. package/dist/cloud/lifeops-schedule-sync-contracts.d.ts +89 -0
  62. package/dist/cloud/lifeops-schedule-sync-contracts.d.ts.map +1 -0
  63. package/dist/cloud/lifeops-schedule-sync-contracts.js +39 -0
  64. package/dist/cloud/lifeops-schedule-sync-contracts.js.map +10 -0
  65. package/dist/cloud/managed-payment-clients.d.ts +166 -0
  66. package/dist/cloud/managed-payment-clients.d.ts.map +1 -0
  67. package/dist/cloud/managed-payment-clients.js +238 -0
  68. package/dist/cloud/managed-payment-clients.js.map +11 -0
  69. package/dist/cloud/null-observer.d.ts +35 -0
  70. package/dist/cloud/null-observer.d.ts.map +1 -0
  71. package/dist/cloud/null-observer.js +45 -0
  72. package/dist/cloud/null-observer.js.map +10 -0
  73. package/dist/cloud/reconnect.d.ts +26 -0
  74. package/dist/cloud/reconnect.d.ts.map +1 -0
  75. package/dist/cloud/reconnect.js +104 -0
  76. package/dist/cloud/reconnect.js.map +10 -0
  77. package/dist/cloud/setup-observer.d.ts +98 -0
  78. package/dist/cloud/setup-observer.d.ts.map +1 -0
  79. package/dist/cloud/setup-observer.js +2 -0
  80. package/dist/cloud/setup-observer.js.map +9 -0
  81. package/dist/cloud/validate-url.d.ts +2 -0
  82. package/dist/cloud/validate-url.d.ts.map +1 -0
  83. package/dist/cloud/validate-url.js +175 -0
  84. package/dist/cloud/validate-url.js.map +10 -0
  85. package/dist/cloud/x402-payment-handler.d.ts +85 -0
  86. package/dist/cloud/x402-payment-handler.d.ts.map +1 -0
  87. package/dist/cloud/x402-payment-handler.js +119 -0
  88. package/dist/cloud/x402-payment-handler.js.map +10 -0
  89. package/dist/cloud-providers/cloud-status.d.ts.map +1 -1
  90. package/dist/cloud-providers/cloud-status.js +78 -0
  91. package/dist/cloud-providers/cloud-status.js.map +10 -0
  92. package/dist/cloud-providers/container-health.d.ts.map +1 -1
  93. package/dist/cloud-providers/container-health.js +74 -0
  94. package/dist/cloud-providers/container-health.js.map +10 -0
  95. package/dist/cloud-providers/credit-balance.d.ts.map +1 -1
  96. package/dist/cloud-providers/credit-balance.js +85 -0
  97. package/dist/cloud-providers/credit-balance.js.map +10 -0
  98. package/dist/cloud-providers/index.d.ts.map +1 -1
  99. package/dist/cloud-providers/index.js +24 -0
  100. package/dist/cloud-providers/index.js.map +9 -0
  101. package/dist/cloud-providers/model-registry.d.ts.map +1 -1
  102. package/dist/cloud-providers/model-registry.js +71 -0
  103. package/dist/cloud-providers/model-registry.js.map +10 -0
  104. package/dist/cloud-setup.d.ts +36 -0
  105. package/dist/cloud-setup.d.ts.map +1 -0
  106. package/dist/cloud-setup.js +883 -0
  107. package/dist/cloud-setup.js.map +14 -0
  108. package/dist/cloud-voice-catalog.d.ts +65 -0
  109. package/dist/cloud-voice-catalog.d.ts.map +1 -0
  110. package/dist/cloud-voice-catalog.js +278 -0
  111. package/dist/cloud-voice-catalog.js.map +12 -0
  112. package/dist/index.browser.d.ts +15 -3
  113. package/dist/index.browser.d.ts.map +1 -1
  114. package/dist/index.d.ts +24 -0
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +9862 -0
  117. package/dist/index.js.map +77 -0
  118. package/dist/index.node.d.ts +21 -2
  119. package/dist/index.node.d.ts.map +1 -1
  120. package/dist/init.d.ts.map +1 -1
  121. package/dist/init.js +182 -0
  122. package/dist/init.js.map +12 -0
  123. package/dist/lib/cloud-connection.d.ts +77 -0
  124. package/dist/lib/cloud-connection.d.ts.map +1 -0
  125. package/dist/lib/cloud-connection.js +654 -0
  126. package/dist/lib/cloud-connection.js.map +14 -0
  127. package/dist/lib/cloud-secrets.d.ts +10 -0
  128. package/dist/lib/cloud-secrets.d.ts.map +1 -0
  129. package/dist/lib/cloud-secrets.js +36 -0
  130. package/dist/lib/cloud-secrets.js.map +10 -0
  131. package/dist/lib/config-env.d.ts +5 -0
  132. package/dist/lib/config-env.d.ts.map +1 -0
  133. package/dist/lib/config-env.js +191 -0
  134. package/dist/lib/config-env.js.map +11 -0
  135. package/dist/lib/config-like.d.ts +40 -0
  136. package/dist/lib/config-like.d.ts.map +1 -0
  137. package/dist/lib/config-like.js +103 -0
  138. package/dist/lib/config-like.js.map +10 -0
  139. package/dist/lib/credential-type-map.d.ts +53 -0
  140. package/dist/lib/credential-type-map.d.ts.map +1 -0
  141. package/dist/lib/credential-type-map.js +88 -0
  142. package/dist/lib/credential-type-map.js.map +10 -0
  143. package/dist/lib/feature-flags.d.ts +2 -0
  144. package/dist/lib/feature-flags.d.ts.map +1 -0
  145. package/dist/lib/feature-flags.js +40 -0
  146. package/dist/lib/feature-flags.js.map +10 -0
  147. package/dist/lib/http.d.ts +11 -0
  148. package/dist/lib/http.d.ts.map +1 -0
  149. package/dist/lib/http.js +107 -0
  150. package/dist/lib/http.js.map +10 -0
  151. package/dist/lib/server-cloud-tts.d.ts +21 -0
  152. package/dist/lib/server-cloud-tts.d.ts.map +1 -0
  153. package/dist/lib/server-cloud-tts.js +251 -0
  154. package/dist/lib/server-cloud-tts.js.map +10 -0
  155. package/dist/lib/state-paths.d.ts +4 -0
  156. package/dist/lib/state-paths.d.ts.map +1 -0
  157. package/dist/lib/state-paths.js +52 -0
  158. package/dist/lib/state-paths.js.map +10 -0
  159. package/dist/lib/tts-debug.d.ts +6 -0
  160. package/dist/lib/tts-debug.d.ts.map +1 -0
  161. package/dist/lib/tts-debug.js +24 -0
  162. package/dist/lib/tts-debug.js.map +9 -0
  163. package/dist/models/embeddings.d.ts.map +1 -1
  164. package/dist/models/embeddings.js +329 -0
  165. package/dist/models/embeddings.js.map +13 -0
  166. package/dist/models/image.d.ts.map +1 -1
  167. package/dist/models/image.js +401 -0
  168. package/dist/models/image.js.map +14 -0
  169. package/dist/models/index.d.ts +1 -2
  170. package/dist/models/index.d.ts.map +1 -1
  171. package/dist/models/index.js +1896 -0
  172. package/dist/models/index.js.map +19 -0
  173. package/dist/models/research.d.ts.map +1 -1
  174. package/dist/models/research.js +341 -0
  175. package/dist/models/research.js.map +13 -0
  176. package/dist/models/speech.d.ts +61 -3
  177. package/dist/models/speech.d.ts.map +1 -1
  178. package/dist/models/speech.js +429 -0
  179. package/dist/models/speech.js.map +13 -0
  180. package/dist/models/text.d.ts +111 -3
  181. package/dist/models/text.d.ts.map +1 -1
  182. package/dist/models/text.js +1173 -0
  183. package/dist/models/text.js.map +14 -0
  184. package/dist/models/tokenization.d.ts.map +1 -1
  185. package/dist/models/tokenization.js +65 -0
  186. package/dist/models/tokenization.js.map +10 -0
  187. package/dist/models/transcription.d.ts.map +1 -1
  188. package/dist/models/transcription.js +297 -0
  189. package/dist/models/transcription.js.map +13 -0
  190. package/dist/node/index.d.ts +2 -2
  191. package/dist/node/index.node.js +9189 -2295
  192. package/dist/node/index.node.js.map +68 -30
  193. package/dist/plugin.d.ts +20 -0
  194. package/dist/plugin.d.ts.map +1 -0
  195. package/dist/plugin.js +2937 -0
  196. package/dist/plugin.js.map +28 -0
  197. package/dist/providers/openai.d.ts.map +1 -1
  198. package/dist/providers/openai.js +136 -0
  199. package/dist/providers/openai.js.map +11 -0
  200. package/dist/register-routes.d.ts +2 -0
  201. package/dist/register-routes.d.ts.map +1 -0
  202. package/dist/register-routes.js +2938 -0
  203. package/dist/register-routes.js.map +29 -0
  204. package/dist/routes/cloud-billing-routes.d.ts +9 -0
  205. package/dist/routes/cloud-billing-routes.d.ts.map +1 -0
  206. package/dist/routes/cloud-billing-routes.js +764 -0
  207. package/dist/routes/cloud-billing-routes.js.map +15 -0
  208. package/dist/routes/cloud-coding-container-routes.d.ts +8 -0
  209. package/dist/routes/cloud-coding-container-routes.d.ts.map +1 -0
  210. package/dist/routes/cloud-coding-container-routes.js +214 -0
  211. package/dist/routes/cloud-coding-container-routes.js.map +11 -0
  212. package/dist/routes/cloud-compat-routes.d.ts +10 -0
  213. package/dist/routes/cloud-compat-routes.d.ts.map +1 -0
  214. package/dist/routes/cloud-compat-routes.js +495 -0
  215. package/dist/routes/cloud-compat-routes.js.map +15 -0
  216. package/dist/routes/cloud-features-routes.d.ts +9 -0
  217. package/dist/routes/cloud-features-routes.d.ts.map +1 -0
  218. package/dist/routes/cloud-features-routes.js +124 -0
  219. package/dist/routes/cloud-features-routes.js.map +11 -0
  220. package/dist/routes/cloud-provisioning.d.ts +14 -0
  221. package/dist/routes/cloud-provisioning.d.ts.map +1 -0
  222. package/dist/routes/cloud-provisioning.js +37 -0
  223. package/dist/routes/cloud-provisioning.js.map +10 -0
  224. package/dist/routes/cloud-relay-routes.d.ts +23 -0
  225. package/dist/routes/cloud-relay-routes.d.ts.map +1 -0
  226. package/dist/routes/cloud-relay-routes.js +142 -0
  227. package/dist/routes/cloud-relay-routes.js.map +11 -0
  228. package/dist/routes/cloud-routes-autonomous.d.ts +82 -0
  229. package/dist/routes/cloud-routes-autonomous.d.ts.map +1 -0
  230. package/dist/routes/cloud-routes-autonomous.js +1252 -0
  231. package/dist/routes/cloud-routes-autonomous.js.map +18 -0
  232. package/dist/routes/cloud-routes.d.ts +35 -0
  233. package/dist/routes/cloud-routes.d.ts.map +1 -0
  234. package/dist/routes/cloud-routes.js +2173 -0
  235. package/dist/routes/cloud-routes.js.map +23 -0
  236. package/dist/routes/cloud-status-routes-autonomous.d.ts +14 -0
  237. package/dist/routes/cloud-status-routes-autonomous.d.ts.map +1 -0
  238. package/dist/routes/cloud-status-routes-autonomous.js +349 -0
  239. package/dist/routes/cloud-status-routes-autonomous.js.map +13 -0
  240. package/dist/routes/cloud-status-routes.d.ts +4 -0
  241. package/dist/routes/cloud-status-routes.d.ts.map +1 -0
  242. package/dist/routes/cloud-status-routes.js +695 -0
  243. package/dist/routes/cloud-status-routes.js.map +15 -0
  244. package/dist/routes/home-remote-runner-access-url.d.ts +16 -0
  245. package/dist/routes/home-remote-runner-access-url.d.ts.map +1 -0
  246. package/dist/routes/home-remote-runner-access-url.js +91 -0
  247. package/dist/routes/home-remote-runner-access-url.js.map +10 -0
  248. package/dist/routes/travel-provider-relay-routes.d.ts +9 -0
  249. package/dist/routes/travel-provider-relay-routes.d.ts.map +1 -0
  250. package/dist/routes/travel-provider-relay-routes.js +358 -0
  251. package/dist/routes/travel-provider-relay-routes.js.map +14 -0
  252. package/dist/services/cloud-auth.d.ts +140 -5
  253. package/dist/services/cloud-auth.d.ts.map +1 -1
  254. package/dist/services/cloud-auth.js +368 -0
  255. package/dist/services/cloud-auth.js.map +12 -0
  256. package/dist/services/cloud-backup.d.ts.map +1 -1
  257. package/dist/services/cloud-backup.js +176 -0
  258. package/dist/services/cloud-backup.js.map +11 -0
  259. package/dist/services/cloud-bootstrap.d.ts +38 -0
  260. package/dist/services/cloud-bootstrap.d.ts.map +1 -0
  261. package/dist/services/cloud-bootstrap.js +84 -0
  262. package/dist/services/cloud-bootstrap.js.map +10 -0
  263. package/dist/services/cloud-bridge.d.ts +1 -1
  264. package/dist/services/cloud-bridge.d.ts.map +1 -1
  265. package/dist/services/cloud-bridge.js +308 -0
  266. package/dist/services/cloud-bridge.js.map +11 -0
  267. package/dist/services/cloud-container.d.ts +5 -1
  268. package/dist/services/cloud-container.d.ts.map +1 -1
  269. package/dist/services/cloud-container.js +292 -0
  270. package/dist/services/cloud-container.js.map +11 -0
  271. package/dist/services/cloud-credential-provider.d.ts +55 -0
  272. package/dist/services/cloud-credential-provider.d.ts.map +1 -0
  273. package/dist/services/cloud-credential-provider.js +190 -0
  274. package/dist/services/cloud-credential-provider.js.map +11 -0
  275. package/dist/services/cloud-managed-gateway-relay.d.ts +38 -0
  276. package/dist/services/cloud-managed-gateway-relay.d.ts.map +1 -0
  277. package/dist/services/cloud-managed-gateway-relay.js +479 -0
  278. package/dist/services/cloud-managed-gateway-relay.js.map +10 -0
  279. package/dist/services/cloud-model-registry.d.ts.map +1 -1
  280. package/dist/services/cloud-model-registry.js +175 -0
  281. package/dist/services/cloud-model-registry.js.map +10 -0
  282. package/dist/services/index.d.ts +3 -1
  283. package/dist/services/index.d.ts.map +1 -1
  284. package/dist/services/index.js +29 -0
  285. package/dist/services/index.js.map +9 -0
  286. package/dist/types/cloud.d.ts +42 -19
  287. package/dist/types/cloud.d.ts.map +1 -1
  288. package/dist/types/cloud.js +52 -0
  289. package/dist/types/cloud.js.map +10 -0
  290. package/dist/types/index.d.ts +1 -1
  291. package/dist/types/index.d.ts.map +1 -1
  292. package/dist/types/index.js +24 -0
  293. package/dist/types/index.js.map +9 -0
  294. package/dist/utils/cloud-api.d.ts +2 -27
  295. package/dist/utils/cloud-api.d.ts.map +1 -1
  296. package/dist/utils/cloud-api.js +33 -0
  297. package/dist/utils/cloud-api.js.map +10 -0
  298. package/dist/utils/cloud-sdk/client.d.ts +133 -0
  299. package/dist/utils/cloud-sdk/client.d.ts.map +1 -0
  300. package/dist/utils/cloud-sdk/client.js +3693 -0
  301. package/dist/utils/cloud-sdk/client.js.map +13 -0
  302. package/dist/utils/cloud-sdk/http.d.ts +37 -0
  303. package/dist/utils/cloud-sdk/http.d.ts.map +1 -0
  304. package/dist/utils/cloud-sdk/http.js +237 -0
  305. package/dist/utils/cloud-sdk/http.js.map +11 -0
  306. package/dist/utils/cloud-sdk/index.d.ts +6 -0
  307. package/dist/utils/cloud-sdk/index.d.ts.map +1 -0
  308. package/dist/utils/cloud-sdk/index.js +29 -0
  309. package/dist/utils/cloud-sdk/index.js.map +9 -0
  310. package/dist/utils/cloud-sdk/public-routes.d.ts +5563 -0
  311. package/dist/utils/cloud-sdk/public-routes.d.ts.map +1 -0
  312. package/dist/utils/cloud-sdk/public-routes.js +3048 -0
  313. package/dist/utils/cloud-sdk/public-routes.js.map +10 -0
  314. package/dist/utils/cloud-sdk/types.cloud-api.d.ts +101 -0
  315. package/dist/utils/cloud-sdk/types.cloud-api.d.ts.map +1 -0
  316. package/dist/utils/cloud-sdk/types.cloud-api.js +2 -0
  317. package/dist/utils/cloud-sdk/types.cloud-api.js.map +9 -0
  318. package/dist/utils/cloud-sdk/types.d.ts +653 -0
  319. package/dist/utils/cloud-sdk/types.d.ts.map +1 -0
  320. package/dist/utils/cloud-sdk/types.js +29 -0
  321. package/dist/utils/cloud-sdk/types.js.map +10 -0
  322. package/dist/utils/config.d.ts +16 -3
  323. package/dist/utils/config.d.ts.map +1 -1
  324. package/dist/utils/config.js +147 -0
  325. package/dist/utils/config.js.map +10 -0
  326. package/dist/utils/events.d.ts +23 -2
  327. package/dist/utils/events.d.ts.map +1 -1
  328. package/dist/utils/events.js +45 -0
  329. package/dist/utils/events.js.map +10 -0
  330. package/dist/utils/helpers.d.ts.map +1 -1
  331. package/dist/utils/helpers.js +103 -0
  332. package/dist/utils/helpers.js.map +10 -0
  333. package/dist/utils/responses-output.d.ts +13 -0
  334. package/dist/utils/responses-output.d.ts.map +1 -0
  335. package/dist/utils/responses-output.js +102 -0
  336. package/dist/utils/responses-output.js.map +10 -0
  337. package/dist/utils/sdk-client.d.ts +5 -0
  338. package/dist/utils/sdk-client.d.ts.map +1 -0
  339. package/dist/utils/sdk-client.js +157 -0
  340. package/dist/utils/sdk-client.js.map +11 -0
  341. package/dist/utils/waifu-metering.d.ts +108 -0
  342. package/dist/utils/waifu-metering.d.ts.map +1 -0
  343. package/dist/utils/waifu-metering.js +166 -0
  344. package/dist/utils/waifu-metering.js.map +10 -0
  345. package/package.json +139 -21
  346. package/src/cloud/auth-service-types.ts +24 -0
  347. package/src/cloud/auth.ts +175 -0
  348. package/src/cloud/backup.ts +46 -0
  349. package/src/cloud/base-url.ts +6 -0
  350. package/src/cloud/bridge-client.ts +602 -0
  351. package/src/cloud/clack-observer.ts +189 -0
  352. package/src/cloud/cloud-api-key.ts +80 -0
  353. package/src/cloud/cloud-manager.ts +163 -0
  354. package/src/cloud/cloud-proxy.ts +52 -0
  355. package/src/cloud/cloud-wallet.ts +341 -0
  356. package/src/cloud/duffel-client.ts +847 -0
  357. package/src/cloud/index.ts +38 -0
  358. package/src/cloud/lifeops-schedule-sync-client.ts +245 -0
  359. package/src/cloud/lifeops-schedule-sync-contracts.ts +124 -0
  360. package/src/cloud/managed-payment-clients.ts +374 -0
  361. package/src/cloud/null-observer.ts +45 -0
  362. package/src/cloud/reconnect.ts +111 -0
  363. package/src/cloud/setup-observer.ts +125 -0
  364. package/src/cloud/validate-url.ts +187 -0
  365. package/src/cloud/x402-payment-handler.ts +215 -0
  366. package/src/cloud-providers/cloud-status.ts +75 -0
  367. package/src/cloud-providers/container-health.ts +68 -0
  368. package/src/cloud-providers/credit-balance.ts +70 -0
  369. package/src/cloud-providers/index.ts +3 -0
  370. package/src/cloud-providers/model-registry.ts +74 -0
  371. package/src/cloud-setup.ts +531 -0
  372. package/src/cloud-voice-catalog.test.ts +254 -0
  373. package/src/cloud-voice-catalog.ts +246 -0
  374. package/src/index.browser.ts +39 -0
  375. package/src/index.node.ts +69 -0
  376. package/src/index.ts +419 -0
  377. package/src/init.ts +39 -0
  378. package/src/lib/cloud-connection.ts +661 -0
  379. package/src/lib/cloud-secrets.ts +14 -0
  380. package/src/lib/config-env.ts +168 -0
  381. package/src/lib/config-like.ts +149 -0
  382. package/src/lib/credential-type-map.ts +130 -0
  383. package/src/lib/feature-flags.ts +26 -0
  384. package/src/lib/http.ts +122 -0
  385. package/src/lib/server-cloud-tts.ts +301 -0
  386. package/src/lib/state-paths.ts +28 -0
  387. package/src/lib/tts-debug.ts +5 -0
  388. package/src/models/embeddings.ts +298 -0
  389. package/src/models/image.ts +234 -0
  390. package/src/models/index.ts +16 -0
  391. package/src/models/research.ts +275 -0
  392. package/src/models/speech.ts +324 -0
  393. package/src/models/text.ts +1493 -0
  394. package/src/models/tokenization.ts +67 -0
  395. package/src/models/transcription.ts +101 -0
  396. package/src/plugin.ts +281 -0
  397. package/src/providers/openai.ts +16 -0
  398. package/src/register-routes.ts +6 -0
  399. package/src/routes/cloud-billing-routes.ts +744 -0
  400. package/src/routes/cloud-coding-container-routes.ts +198 -0
  401. package/src/routes/cloud-compat-routes.ts +304 -0
  402. package/src/routes/cloud-features-routes.ts +57 -0
  403. package/src/routes/cloud-provisioning.ts +37 -0
  404. package/src/routes/cloud-relay-routes.ts +135 -0
  405. package/src/routes/cloud-routes-autonomous.ts +993 -0
  406. package/src/routes/cloud-routes.ts +637 -0
  407. package/src/routes/cloud-status-routes-autonomous.ts +238 -0
  408. package/src/routes/cloud-status-routes.ts +73 -0
  409. package/src/routes/home-remote-runner-access-url.ts +83 -0
  410. package/src/routes/travel-provider-relay-routes.ts +193 -0
  411. package/src/services/cloud-auth.ts +574 -0
  412. package/src/services/cloud-backup.ts +208 -0
  413. package/src/services/cloud-bootstrap.ts +106 -0
  414. package/src/services/cloud-bridge.ts +386 -0
  415. package/src/services/cloud-container.ts +390 -0
  416. package/src/services/cloud-credential-provider.ts +210 -0
  417. package/src/services/cloud-managed-gateway-relay.ts +663 -0
  418. package/src/services/cloud-model-registry.ts +202 -0
  419. package/src/services/index.ts +17 -0
  420. package/{types → src/types}/cloud.ts +74 -29
  421. package/{types → src/types}/index.ts +25 -0
  422. package/src/utils/cloud-api.ts +10 -0
  423. package/src/utils/cloud-sdk/client.ts +774 -0
  424. package/src/utils/cloud-sdk/http.ts +291 -0
  425. package/src/utils/cloud-sdk/index.ts +23 -0
  426. package/src/utils/cloud-sdk/public-routes.ts +5238 -0
  427. package/src/utils/cloud-sdk/types.cloud-api.ts +120 -0
  428. package/src/utils/cloud-sdk/types.ts +760 -0
  429. package/src/utils/config.ts +193 -0
  430. package/src/utils/events.ts +65 -0
  431. package/src/utils/helpers.ts +107 -0
  432. package/src/utils/responses-output.ts +115 -0
  433. package/src/utils/sdk-client.ts +41 -0
  434. package/src/utils/waifu-metering.ts +302 -0
  435. package/dist/actions/check-credits.d.ts +0 -6
  436. package/dist/actions/check-credits.d.ts.map +0 -1
  437. package/dist/actions/freeze-agent.d.ts +0 -9
  438. package/dist/actions/freeze-agent.d.ts.map +0 -1
  439. package/dist/actions/index.d.ts +0 -5
  440. package/dist/actions/index.d.ts.map +0 -1
  441. package/dist/actions/provision-agent.d.ts +0 -8
  442. package/dist/actions/provision-agent.d.ts.map +0 -1
  443. package/dist/actions/resume-agent.d.ts +0 -9
  444. package/dist/actions/resume-agent.d.ts.map +0 -1
  445. package/dist/build.d.ts +0 -3
  446. package/dist/build.d.ts.map +0 -1
  447. package/dist/generated/specs/specs.d.ts +0 -55
  448. package/dist/generated/specs/specs.d.ts.map +0 -1
  449. package/dist/models/object.d.ts +0 -4
  450. package/dist/models/object.d.ts.map +0 -1
  451. package/dist/utils/forwarded-settings.d.ts +0 -8
  452. package/dist/utils/forwarded-settings.d.ts.map +0 -1
@@ -0,0 +1,1252 @@
1
+ import { createRequire } from "node:module";
2
+ var __defProp = Object.defineProperty;
3
+ var __returnValue = (v) => v;
4
+ function __exportSetter(name, newValue) {
5
+ this[name] = __returnValue.bind(null, newValue);
6
+ }
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, {
10
+ get: all[name],
11
+ enumerable: true,
12
+ configurable: true,
13
+ set: __exportSetter.bind(all, name)
14
+ });
15
+ };
16
+ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
17
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
18
+
19
+ // src/cloud/base-url.ts
20
+ import { normalizeCloudSiteUrl, resolveCloudApiBaseUrl } from "@elizaos/shared";
21
+ var init_base_url = () => {};
22
+
23
+ // src/cloud/validate-url.ts
24
+ import dns from "node:dns";
25
+ import net from "node:net";
26
+ import { promisify } from "node:util";
27
+ function normalizeHostLike(value) {
28
+ return value.trim().toLowerCase().replace(/^\[|\]$/g, "");
29
+ }
30
+ function decodeIpv6MappedHex(mapped) {
31
+ const parts = mapped.split(":");
32
+ if (parts.length < 1 || parts.length > 2)
33
+ return null;
34
+ const parsed = parts.map((part) => {
35
+ if (!/^[0-9a-f]{1,4}$/i.test(part))
36
+ return Number.NaN;
37
+ return Number.parseInt(part, 16);
38
+ });
39
+ if (parsed.some((value) => !Number.isFinite(value)))
40
+ return null;
41
+ const [hi, lo] = parsed.length === 1 ? [0, parsed[0]] : parsed;
42
+ const octets = [hi >> 8, hi & 255, lo >> 8, lo & 255];
43
+ return octets.join(".");
44
+ }
45
+ function canonicalizeIpv6(ip) {
46
+ try {
47
+ return new URL(`http://[${ip}]/`).hostname.replace(/^\[|\]$/g, "");
48
+ } catch {
49
+ return null;
50
+ }
51
+ }
52
+ function normalizeIpForPolicy(ip) {
53
+ const base = normalizeHostLike(ip).split("%")[0];
54
+ if (!base)
55
+ return base;
56
+ let normalized = base;
57
+ if (net.isIP(normalized) === 6) {
58
+ normalized = canonicalizeIpv6(normalized) ?? normalized;
59
+ }
60
+ let mapped = null;
61
+ if (normalized.startsWith("::ffff:")) {
62
+ mapped = normalized.slice("::ffff:".length);
63
+ } else if (normalized.startsWith("0:0:0:0:0:ffff:")) {
64
+ mapped = normalized.slice("0:0:0:0:0:ffff:".length);
65
+ }
66
+ if (!mapped)
67
+ return normalized;
68
+ if (net.isIP(mapped) === 4)
69
+ return mapped;
70
+ return decodeIpv6MappedHex(mapped) ?? normalized;
71
+ }
72
+ function cidrV4(base, prefix) {
73
+ const parsed = parseIpv4ToInt(base);
74
+ if (parsed === null) {
75
+ throw new Error(`Invalid CIDR base IPv4 address: ${base}`);
76
+ }
77
+ const shift = 32 - prefix;
78
+ const mask = shift === 32 ? 0 : 4294967295 << shift >>> 0;
79
+ return { base: parsed & mask, mask };
80
+ }
81
+ function parseIpv4ToInt(ip) {
82
+ const parts = ip.split(".");
83
+ if (parts.length !== 4)
84
+ return null;
85
+ let value = 0;
86
+ for (const part of parts) {
87
+ if (!/^\d{1,3}$/.test(part))
88
+ return null;
89
+ const octet = Number.parseInt(part, 10);
90
+ if (!Number.isInteger(octet) || octet < 0 || octet > 255)
91
+ return null;
92
+ value = value << 8 | octet;
93
+ }
94
+ return value >>> 0;
95
+ }
96
+ function isBlockedIpv4(ip) {
97
+ const asInt = parseIpv4ToInt(ip);
98
+ if (asInt === null)
99
+ return true;
100
+ return BLOCKED_IPV4_CIDRS.some((cidr) => (asInt & cidr.mask) === cidr.base);
101
+ }
102
+ function isBlockedIpv6(ip) {
103
+ const normalized = ip.toLowerCase();
104
+ return normalized === "::" || normalized === "::1" || /^fe[89ab][0-9a-f]:/.test(normalized) || /^f[cd][0-9a-f]{2}:/i.test(normalized) || normalized.startsWith("ff");
105
+ }
106
+ function isBlockedIp(ip) {
107
+ const normalized = normalizeIpForPolicy(ip);
108
+ const family = net.isIP(normalized);
109
+ if (family === 4)
110
+ return isBlockedIpv4(normalized);
111
+ if (family === 6)
112
+ return isBlockedIpv6(normalized);
113
+ return false;
114
+ }
115
+ async function validateCloudBaseUrl(rawUrl) {
116
+ let parsed;
117
+ try {
118
+ parsed = new URL(rawUrl);
119
+ } catch {
120
+ return `Invalid cloud base URL: "${rawUrl}"`;
121
+ }
122
+ if (parsed.protocol !== "https:") {
123
+ return `Cloud base URL must use HTTPS, got "${parsed.protocol}" in "${rawUrl}"`;
124
+ }
125
+ const hostname = normalizeHostLike(parsed.hostname);
126
+ if (!hostname) {
127
+ return `Invalid cloud base URL: "${rawUrl}"`;
128
+ }
129
+ if (hostname === "localhost" || hostname.endsWith(".localhost") || hostname.endsWith(".local")) {
130
+ return `Cloud base URL "${rawUrl}" points to a blocked local hostname.`;
131
+ }
132
+ const elizaDev = process.env.ELIZA_DEV?.trim().toLowerCase();
133
+ if (true) {
134
+ return null;
135
+ }
136
+ if (isBlockedIp(hostname)) {
137
+ return `Cloud base URL "${rawUrl}" points to a blocked address.`;
138
+ }
139
+ try {
140
+ const results = await dnsLookupAll(hostname, { all: true });
141
+ const addresses = Array.isArray(results) ? results : [results];
142
+ for (const entry of addresses) {
143
+ const ip = typeof entry === "string" ? entry : entry.address;
144
+ if (isBlockedIp(ip)) {
145
+ return `Cloud base URL "${rawUrl}" resolves to ${ip}, ` + "which is a blocked internal/metadata address.";
146
+ }
147
+ }
148
+ } catch {
149
+ return `Cloud base URL "${rawUrl}" could not be resolved via DNS.`;
150
+ }
151
+ return null;
152
+ }
153
+ var dnsLookupAll, BLOCKED_IPV4_CIDRS;
154
+ var init_validate_url = __esm(() => {
155
+ dnsLookupAll = promisify(dns.lookup);
156
+ BLOCKED_IPV4_CIDRS = [
157
+ cidrV4("0.0.0.0", 8),
158
+ cidrV4("10.0.0.0", 8),
159
+ cidrV4("172.16.0.0", 12),
160
+ cidrV4("192.168.0.0", 16),
161
+ cidrV4("100.64.0.0", 10),
162
+ cidrV4("127.0.0.0", 8),
163
+ cidrV4("169.254.0.0", 16),
164
+ cidrV4("192.0.0.0", 24),
165
+ cidrV4("198.18.0.0", 15),
166
+ cidrV4("192.0.2.0", 24),
167
+ cidrV4("198.51.100.0", 24),
168
+ cidrV4("203.0.113.0", 24),
169
+ cidrV4("224.0.0.0", 4),
170
+ cidrV4("240.0.0.0", 4)
171
+ ];
172
+ });
173
+
174
+ // src/lib/state-paths.ts
175
+ import fs from "node:fs";
176
+ import path from "node:path";
177
+ import {
178
+ getElizaNamespace,
179
+ resolveStateDir,
180
+ resolveUserPath
181
+ } from "@elizaos/core";
182
+ function resolveConfigPath(env = process.env, stateDirPath = resolveStateDir(env)) {
183
+ const override = env.ELIZA_CONFIG_PATH?.trim();
184
+ if (override)
185
+ return resolveUserPath(override);
186
+ const namespace = getElizaNamespace(env);
187
+ const primaryPath = path.join(stateDirPath, `${namespace}.json`);
188
+ if (fs.existsSync(primaryPath))
189
+ return primaryPath;
190
+ if (namespace !== "eliza") {
191
+ const legacyPath = path.join(stateDirPath, "eliza.json");
192
+ if (fs.existsSync(legacyPath))
193
+ return legacyPath;
194
+ }
195
+ return primaryPath;
196
+ }
197
+ var init_state_paths = () => {};
198
+
199
+ // src/lib/config-env.ts
200
+ import fs2 from "node:fs/promises";
201
+ import path2 from "node:path";
202
+ function parseConfigEnv(contents) {
203
+ const lines = contents.length === 0 ? [] : contents.split(/\r?\n/);
204
+ if (lines.length > 0 && lines[lines.length - 1] === "") {
205
+ lines.pop();
206
+ }
207
+ const index = new Map;
208
+ for (let i = 0;i < lines.length; i += 1) {
209
+ const line = lines[i] ?? "";
210
+ const trimmed = line.trim();
211
+ if (!trimmed || trimmed.startsWith("#"))
212
+ continue;
213
+ const eq = line.indexOf("=");
214
+ if (eq <= 0)
215
+ continue;
216
+ const key = line.slice(0, eq).trim();
217
+ if (KEY_PATTERN.test(key))
218
+ index.set(key, i);
219
+ }
220
+ return { lines, index };
221
+ }
222
+ function serialiseConfigEnv(parsed) {
223
+ return parsed.lines.length === 0 ? "" : `${parsed.lines.join(`
224
+ `)}
225
+ `;
226
+ }
227
+ function encodeValue(value) {
228
+ if (value === "")
229
+ return "";
230
+ const needsQuoting = /[\s#"'\\]|^\s|\s$/.test(value) || /\n|\r/.test(value);
231
+ if (!needsQuoting)
232
+ return value;
233
+ const escaped = value.replace(/\\/g, "\\\\").replace(/"/g, "\\\"").replace(/\n/g, "\\n").replace(/\r/g, "\\r");
234
+ return `"${escaped}"`;
235
+ }
236
+ function validateKey(key) {
237
+ if (!KEY_PATTERN.test(key)) {
238
+ throw new Error(`persistConfigEnv: invalid key "${key}" - must match /^[A-Z][A-Z0-9_]*$/`);
239
+ }
240
+ if (BLOCKED_CONFIG_ENV_KEYS.has(key)) {
241
+ throw new Error(`persistConfigEnv: key "${key}" is a shell/runtime hijack vector and cannot be written`);
242
+ }
243
+ }
244
+ async function readIfExists(filePath) {
245
+ try {
246
+ return await fs2.readFile(filePath, "utf8");
247
+ } catch (error) {
248
+ if (error.code === "ENOENT")
249
+ return null;
250
+ throw error;
251
+ }
252
+ }
253
+ async function writeAtomic(filePath, contents) {
254
+ const tmpPath = `${filePath}${TMP_SUFFIX}`;
255
+ const handle = await fs2.open(tmpPath, "w", 384);
256
+ try {
257
+ await handle.writeFile(contents, "utf8");
258
+ await handle.sync();
259
+ } finally {
260
+ await handle.close();
261
+ }
262
+ await fs2.rename(tmpPath, filePath);
263
+ }
264
+ function serialise(fn) {
265
+ const next = writeChain.then(fn, fn);
266
+ writeChain = next.catch(() => {
267
+ return;
268
+ });
269
+ return next;
270
+ }
271
+ function resolveConfigEnvPath(stateDir) {
272
+ return path2.join(stateDir ?? resolveStateDir(), CONFIG_ENV_FILENAME);
273
+ }
274
+ async function persistConfigEnv(key, value, opts = {}) {
275
+ validateKey(key);
276
+ await serialise(async () => {
277
+ const filePath = resolveConfigEnvPath(opts.stateDir);
278
+ await fs2.mkdir(path2.dirname(filePath), { recursive: true });
279
+ const existing = await readIfExists(filePath) ?? "";
280
+ const parsed = parseConfigEnv(existing);
281
+ const existingIdx = parsed.index.get(key);
282
+ const isDelete = value === "";
283
+ if (isDelete) {
284
+ if (existingIdx === undefined) {
285
+ delete process.env[key];
286
+ return;
287
+ }
288
+ parsed.lines.splice(existingIdx, 1);
289
+ } else {
290
+ const encoded = `${key}=${encodeValue(value)}`;
291
+ if (existingIdx === undefined) {
292
+ parsed.lines.push(encoded);
293
+ } else {
294
+ parsed.lines[existingIdx] = encoded;
295
+ }
296
+ }
297
+ if (existing.length > 0) {
298
+ await fs2.writeFile(`${filePath}${BAK_SUFFIX}`, existing, {
299
+ encoding: "utf8",
300
+ mode: 384
301
+ });
302
+ }
303
+ await writeAtomic(filePath, serialiseConfigEnv(parsed));
304
+ if (isDelete) {
305
+ delete process.env[key];
306
+ } else {
307
+ process.env[key] = value;
308
+ }
309
+ });
310
+ }
311
+ var CONFIG_ENV_FILENAME = "config.env", BAK_SUFFIX = ".bak", TMP_SUFFIX = ".tmp", KEY_PATTERN, BLOCKED_CONFIG_ENV_KEYS, writeChain;
312
+ var init_config_env = __esm(() => {
313
+ init_state_paths();
314
+ KEY_PATTERN = /^[A-Z][A-Z0-9_]*$/;
315
+ BLOCKED_CONFIG_ENV_KEYS = new Set([
316
+ "NODE_OPTIONS",
317
+ "NODE_EXTRA_CA_CERTS",
318
+ "NODE_TLS_REJECT_UNAUTHORIZED",
319
+ "NODE_PATH",
320
+ "LD_PRELOAD",
321
+ "LD_LIBRARY_PATH",
322
+ "DYLD_INSERT_LIBRARIES",
323
+ "DYLD_LIBRARY_PATH",
324
+ "DYLD_FRAMEWORK_PATH",
325
+ "DYLD_FALLBACK_FRAMEWORK_PATH",
326
+ "DYLD_FALLBACK_LIBRARY_PATH",
327
+ "PATH",
328
+ "HOME",
329
+ "SHELL",
330
+ "HTTP_PROXY",
331
+ "HTTPS_PROXY",
332
+ "ALL_PROXY",
333
+ "NO_PROXY",
334
+ "SSL_CERT_FILE",
335
+ "SSL_CERT_DIR",
336
+ "CURL_CA_BUNDLE"
337
+ ]);
338
+ writeChain = Promise.resolve();
339
+ });
340
+
341
+ // src/lib/feature-flags.ts
342
+ function readBoolFlag(name, fallback = false) {
343
+ const raw = process.env[name];
344
+ if (raw === undefined || raw === null || raw === "")
345
+ return fallback;
346
+ const trimmed = String(raw).trim().toLowerCase();
347
+ if (trimmed === "1" || trimmed === "true" || trimmed === "yes" || trimmed === "on") {
348
+ return true;
349
+ }
350
+ if (trimmed === "0" || trimmed === "false" || trimmed === "no" || trimmed === "off") {
351
+ return false;
352
+ }
353
+ return fallback;
354
+ }
355
+ function isCloudWalletEnabled() {
356
+ return readBoolFlag("ENABLE_CLOUD_WALLET");
357
+ }
358
+
359
+ // src/cloud/cloud-wallet.ts
360
+ import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
361
+ function ensureFlag() {
362
+ if (!isCloudWalletEnabled()) {
363
+ throw new CloudWalletFlagDisabledError;
364
+ }
365
+ }
366
+ function normalizePrivateKey(raw) {
367
+ const trimmed = raw.trim();
368
+ const hex = trimmed.startsWith("0x") ? trimmed.slice(2) : trimmed;
369
+ if (!/^[0-9a-fA-F]{64}$/.test(hex)) {
370
+ throw new Error(`Malformed ${ELIZA_CLOUD_CLIENT_ADDRESS_KEY_ENV}: expected 32-byte hex`);
371
+ }
372
+ return `0x${hex.toLowerCase()}`;
373
+ }
374
+ async function getOrCreateClientAddressKey(opts = {}) {
375
+ ensureFlag();
376
+ const existing = process.env[ELIZA_CLOUD_CLIENT_ADDRESS_KEY_ENV];
377
+ if (existing && existing.trim().length > 0) {
378
+ const privateKey2 = normalizePrivateKey(existing);
379
+ const account2 = privateKeyToAccount(privateKey2);
380
+ return { privateKey: privateKey2, address: account2.address, minted: false };
381
+ }
382
+ const privateKey = generatePrivateKey();
383
+ const account = privateKeyToAccount(privateKey);
384
+ process.env[ELIZA_CLOUD_CLIENT_ADDRESS_KEY_ENV] = privateKey;
385
+ await persistConfigEnv(ELIZA_CLOUD_CLIENT_ADDRESS_KEY_ENV, privateKey, {
386
+ stateDir: opts.stateDir
387
+ });
388
+ return { privateKey, address: account.address, minted: true };
389
+ }
390
+ function inflightKey(agentId, chain) {
391
+ return `${agentId}::${chain}`;
392
+ }
393
+ async function provisionOne(bridge, agentId, chain, clientAddress) {
394
+ try {
395
+ return await bridge.getAgentWallet(agentId, chain);
396
+ } catch (error) {
397
+ if (!isMissingCloudWalletError(error, chain)) {
398
+ throw error;
399
+ }
400
+ }
401
+ const provisioned = await bridge.provisionWallet({
402
+ chainType: chain,
403
+ clientAddress
404
+ });
405
+ return {
406
+ agentWalletId: provisioned.walletId,
407
+ walletAddress: provisioned.address,
408
+ walletProvider: provisioned.provider,
409
+ chainType: chain
410
+ };
411
+ }
412
+ function isMissingCloudWalletError(error, chain) {
413
+ if (error instanceof Error && new RegExp(`no cloud ${chain} wallet provisioned`, "i").test(error.message)) {
414
+ return true;
415
+ }
416
+ return typeof error === "object" && error !== null && "name" in error && error.name === "CloudBridgeError" && typeof error.status === "number" && error.status === 404;
417
+ }
418
+ function formatProvisionWarning(chain, error) {
419
+ const message = error instanceof Error ? error.message : String(error);
420
+ return `Cloud ${chain} wallet import failed: ${message}`;
421
+ }
422
+ async function provisionCloudWalletsBestEffort(bridge, opts) {
423
+ ensureFlag();
424
+ const chains = opts.chains ?? ["evm", "solana"];
425
+ const results = await Promise.all(chains.map((chain) => {
426
+ const key = inflightKey(opts.agentId, chain);
427
+ const pending = inflight.get(key);
428
+ if (pending) {
429
+ return pending.then((descriptor) => ({
430
+ chain,
431
+ ok: true,
432
+ descriptor
433
+ }), (error) => ({
434
+ chain,
435
+ ok: false,
436
+ error
437
+ }));
438
+ }
439
+ const p = provisionOne(bridge, opts.agentId, chain, opts.clientAddress).finally(() => {
440
+ inflight.delete(key);
441
+ });
442
+ inflight.set(key, p);
443
+ return p.then((descriptor) => ({
444
+ chain,
445
+ ok: true,
446
+ descriptor
447
+ }), (error) => ({
448
+ chain,
449
+ ok: false,
450
+ error
451
+ }));
452
+ }));
453
+ const out = {};
454
+ const failures = [];
455
+ for (const result of results) {
456
+ if ("descriptor" in result) {
457
+ out[result.chain] = result.descriptor;
458
+ continue;
459
+ }
460
+ failures.push({ chain: result.chain, error: result.error });
461
+ }
462
+ return {
463
+ descriptors: out,
464
+ failures,
465
+ warnings: failures.map(({ chain, error }) => formatProvisionWarning(chain, error))
466
+ };
467
+ }
468
+ async function provisionCloudWallets(bridge, opts) {
469
+ const result = await provisionCloudWalletsBestEffort(bridge, opts);
470
+ if (result.failures.length > 0 && Object.keys(result.descriptors).length === 0) {
471
+ const firstFailure = result.failures[0];
472
+ if (firstFailure?.error instanceof Error) {
473
+ throw firstFailure.error;
474
+ }
475
+ throw new Error(result.warnings[0] ?? "Failed to provision cloud wallets");
476
+ }
477
+ return result.descriptors;
478
+ }
479
+ function persistCloudWalletCache(config, descriptors) {
480
+ ensureFlag();
481
+ const wallet = config.wallet ?? {};
482
+ const cloud = { ...wallet.cloud ?? {} };
483
+ if (descriptors.evm)
484
+ cloud.evm = descriptors.evm;
485
+ if (descriptors.solana)
486
+ cloud.solana = descriptors.solana;
487
+ wallet.cloud = cloud;
488
+ config.wallet = wallet;
489
+ }
490
+ function __resetCloudWalletModuleForTests() {
491
+ inflight.clear();
492
+ delete process.env[ELIZA_CLOUD_CLIENT_ADDRESS_KEY_ENV];
493
+ }
494
+ var ELIZA_CLOUD_CLIENT_ADDRESS_KEY_ENV = "ELIZA_CLOUD_CLIENT_ADDRESS_KEY", CloudWalletFlagDisabledError, inflight;
495
+ var init_cloud_wallet = __esm(() => {
496
+ init_config_env();
497
+ CloudWalletFlagDisabledError = class CloudWalletFlagDisabledError extends Error {
498
+ constructor() {
499
+ super("ENABLE_CLOUD_WALLET is off; cloud wallet code paths are inactive");
500
+ this.name = "CloudWalletFlagDisabledError";
501
+ }
502
+ };
503
+ inflight = new Map;
504
+ });
505
+
506
+ // src/lib/http.ts
507
+ function scrubStackFields(value) {
508
+ if (value instanceof Error) {
509
+ return { error: value.message || "Internal error" };
510
+ }
511
+ if (Array.isArray(value)) {
512
+ return value.map(scrubStackFields);
513
+ }
514
+ if (value && typeof value === "object") {
515
+ const out = {};
516
+ for (const [key, nested] of Object.entries(value)) {
517
+ if (key === "stack" || key === "stackTrace")
518
+ continue;
519
+ out[key] = scrubStackFields(nested);
520
+ }
521
+ return out;
522
+ }
523
+ return value;
524
+ }
525
+ function sendJson(res, body, status = 200) {
526
+ if (res.headersSent)
527
+ return;
528
+ res.statusCode = status;
529
+ res.setHeader("content-type", "application/json; charset=utf-8");
530
+ res.end(JSON.stringify(scrubStackFields(body)));
531
+ }
532
+ function sendJsonError(res, message, status = 400) {
533
+ sendJson(res, { error: message }, status);
534
+ }
535
+ async function readRequestBody(req, options) {
536
+ const maxBytes = options.maxBytes ?? 1048576;
537
+ const chunks = [];
538
+ let size = 0;
539
+ for await (const chunk of req) {
540
+ const buffer = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
541
+ size += buffer.length;
542
+ if (size > maxBytes) {
543
+ if (options.destroyOnTooLarge)
544
+ req.destroy();
545
+ throw new Error(options.tooLargeMessage ?? "Request body too large");
546
+ }
547
+ chunks.push(buffer);
548
+ }
549
+ if (chunks.length === 0)
550
+ return null;
551
+ return Buffer.concat(chunks).toString("utf8");
552
+ }
553
+ async function readJsonBody(req, res, options = {}) {
554
+ const cached = req.body;
555
+ if (cached !== undefined) {
556
+ if (options.requireObject !== false && (!cached || typeof cached !== "object" || Array.isArray(cached))) {
557
+ sendJsonError(res, "Request body must be a JSON object", 400);
558
+ return null;
559
+ }
560
+ return cached;
561
+ }
562
+ let raw;
563
+ try {
564
+ raw = await readRequestBody(req, options);
565
+ } catch (error) {
566
+ sendJsonError(res, error instanceof Error ? error.message : "Failed to read request body", 413);
567
+ return null;
568
+ }
569
+ if (!raw?.trim()) {
570
+ const empty = {};
571
+ req.body = empty;
572
+ return empty;
573
+ }
574
+ let parsed;
575
+ try {
576
+ parsed = JSON.parse(raw);
577
+ } catch {
578
+ sendJsonError(res, "Invalid JSON in request body", 400);
579
+ return null;
580
+ }
581
+ if (options.requireObject !== false && (!parsed || typeof parsed !== "object" || Array.isArray(parsed))) {
582
+ sendJsonError(res, "Request body must be a JSON object", 400);
583
+ return null;
584
+ }
585
+ req.body = parsed;
586
+ return parsed;
587
+ }
588
+
589
+ // src/lib/config-like.ts
590
+ function ensureLinkedAccounts(config) {
591
+ config.linkedAccounts ??= {};
592
+ return config.linkedAccounts;
593
+ }
594
+ function ensureServiceRouting(config) {
595
+ config.serviceRouting ??= {};
596
+ return config.serviceRouting;
597
+ }
598
+ function persistDeploymentTarget(config, deploymentTarget) {
599
+ if (!deploymentTarget) {
600
+ delete config.deploymentTarget;
601
+ return;
602
+ }
603
+ config.deploymentTarget = { ...deploymentTarget };
604
+ }
605
+ function persistLinkedAccounts(config, linkedAccounts) {
606
+ if (!linkedAccounts)
607
+ return;
608
+ const existing = ensureLinkedAccounts(config);
609
+ for (const [accountId, account] of Object.entries(linkedAccounts)) {
610
+ if (!account || Object.keys(account).length === 0) {
611
+ delete existing[accountId];
612
+ continue;
613
+ }
614
+ existing[accountId] = {
615
+ ...existing[accountId],
616
+ ...account
617
+ };
618
+ }
619
+ if (Object.keys(existing).length === 0) {
620
+ delete config.linkedAccounts;
621
+ }
622
+ }
623
+ function persistServiceRouting(config, serviceRouting, clearRoutes = []) {
624
+ const existing = ensureServiceRouting(config);
625
+ for (const capability of clearRoutes) {
626
+ delete existing[capability];
627
+ }
628
+ if (serviceRouting) {
629
+ for (const [capability, route] of Object.entries(serviceRouting)) {
630
+ const serviceKey = capability;
631
+ if (!route || Object.keys(route).length === 0) {
632
+ delete existing[serviceKey];
633
+ continue;
634
+ }
635
+ existing[serviceKey] = { ...route };
636
+ }
637
+ }
638
+ if (Object.keys(existing).length === 0) {
639
+ delete config.serviceRouting;
640
+ }
641
+ }
642
+ function applyCanonicalSetupConfig(config, args) {
643
+ if (args.deploymentTarget !== undefined) {
644
+ persistDeploymentTarget(config, args.deploymentTarget);
645
+ }
646
+ if (args.linkedAccounts !== undefined) {
647
+ persistLinkedAccounts(config, args.linkedAccounts);
648
+ }
649
+ if (args.serviceRouting !== undefined || args.clearRoutes?.length) {
650
+ persistServiceRouting(config, args.serviceRouting, args.clearRoutes);
651
+ }
652
+ }
653
+ function normalizeEnvValue(value) {
654
+ if (typeof value !== "string")
655
+ return;
656
+ const trimmed = value.trim();
657
+ return trimmed || undefined;
658
+ }
659
+ function isTimeoutError(error) {
660
+ if (!(error instanceof Error))
661
+ return false;
662
+ if (error.name === "TimeoutError" || error.name === "AbortError")
663
+ return true;
664
+ const message = error.message.toLowerCase();
665
+ return message.includes("timed out") || message.includes("timeout");
666
+ }
667
+
668
+ // src/routes/cloud-routes-autonomous.ts
669
+ import fs3 from "node:fs/promises";
670
+ import path3 from "node:path";
671
+ import {
672
+ isCloudInferenceSelectedInConfig,
673
+ migrateLegacyRuntimeConfig
674
+ } from "@elizaos/core";
675
+ import { logger } from "@elizaos/core";
676
+ function extractAgentId(pathname) {
677
+ const id = pathname.split("/")[4];
678
+ return id && UUID_RE.test(id) ? id : null;
679
+ }
680
+ function replaceMutableRoot(target, snapshot) {
681
+ const targetRecord = target;
682
+ for (const key of Object.keys(targetRecord)) {
683
+ delete targetRecord[key];
684
+ }
685
+ Object.assign(targetRecord, structuredClone(snapshot));
686
+ }
687
+ function getCloudAuth(runtime) {
688
+ if (typeof runtime?.getService !== "function") {
689
+ return null;
690
+ }
691
+ const service = runtime.getService("CLOUD_AUTH");
692
+ return service && typeof service === "object" ? service : null;
693
+ }
694
+ function clearCloudAuth(runtime) {
695
+ const cloudAuth = getCloudAuth(runtime);
696
+ if (typeof cloudAuth?.clearAuth === "function") {
697
+ cloudAuth.clearAuth();
698
+ }
699
+ return cloudAuth;
700
+ }
701
+ async function captureConfigEnvRollbackSnapshot() {
702
+ const filePath = path3.join(resolveStateDir(), CONFIG_ENV_FILENAME2);
703
+ const bakPath = `${filePath}${CONFIG_ENV_BAK_SUFFIX}`;
704
+ let originalRaw = null;
705
+ try {
706
+ originalRaw = await fs3.readFile(filePath, "utf8");
707
+ } catch (err) {
708
+ if (err.code !== "ENOENT") {
709
+ throw err;
710
+ }
711
+ }
712
+ const previousEnv = Object.fromEntries(CLOUD_WALLET_ROLLBACK_ENV_KEYS.flatMap((key) => {
713
+ const value = process.env[key];
714
+ return typeof value === "string" ? [[key, value]] : [];
715
+ }));
716
+ return {
717
+ bakPath,
718
+ filePath,
719
+ originalRaw,
720
+ previousEnv
721
+ };
722
+ }
723
+ async function restoreConfigEnvRollbackSnapshot(snapshot) {
724
+ await fs3.mkdir(path3.dirname(snapshot.filePath), { recursive: true });
725
+ if (snapshot.originalRaw === null) {
726
+ await fs3.rm(snapshot.filePath, { force: true });
727
+ await fs3.rm(snapshot.bakPath, { force: true });
728
+ } else {
729
+ await fs3.writeFile(snapshot.filePath, snapshot.originalRaw, {
730
+ encoding: "utf8",
731
+ mode: 384
732
+ });
733
+ await fs3.writeFile(snapshot.bakPath, snapshot.originalRaw, {
734
+ encoding: "utf8",
735
+ mode: 384
736
+ });
737
+ }
738
+ for (const key of CLOUD_WALLET_ROLLBACK_ENV_KEYS) {
739
+ const previousValue = snapshot.previousEnv[key];
740
+ if (typeof previousValue === "string") {
741
+ process.env[key] = previousValue;
742
+ } else {
743
+ delete process.env[key];
744
+ }
745
+ }
746
+ }
747
+ function saveConfigOrThrow(state) {
748
+ if (!state.saveConfig) {
749
+ throw new Error("saveConfig not available");
750
+ }
751
+ state.saveConfig(state.config);
752
+ }
753
+ async function readJsonBody2(req, res) {
754
+ return await readJsonBody(req, res, {
755
+ maxBytes: 1048576,
756
+ tooLargeMessage: "Request body too large",
757
+ destroyOnTooLarge: true
758
+ });
759
+ }
760
+ function isRedirectResponse(response) {
761
+ return response.status >= 300 && response.status < 400;
762
+ }
763
+ function createNoopTelemetrySpan() {
764
+ return {
765
+ success: () => {},
766
+ failure: () => {}
767
+ };
768
+ }
769
+ function getTelemetrySpan(state, meta) {
770
+ return state.createTelemetrySpan?.(meta) ?? createNoopTelemetrySpan();
771
+ }
772
+ async function fetchWithTimeout(input, init, timeoutMs) {
773
+ return fetch(input, {
774
+ ...init,
775
+ redirect: "manual",
776
+ signal: AbortSignal.timeout(timeoutMs)
777
+ });
778
+ }
779
+ async function handleCloudRoute(req, res, pathname, method, state) {
780
+ if (method === "POST" && pathname === "/api/cloud/login") {
781
+ const baseUrl = normalizeCloudSiteUrl(state.config.cloud?.baseUrl);
782
+ const urlError = await validateCloudBaseUrl(baseUrl);
783
+ if (urlError) {
784
+ sendJsonError(res, urlError);
785
+ return true;
786
+ }
787
+ const sessionId = crypto.randomUUID();
788
+ const loginCreateSpan = getTelemetrySpan(state, {
789
+ boundary: "cloud",
790
+ operation: "login_create_session",
791
+ timeoutMs: CLOUD_LOGIN_CREATE_TIMEOUT_MS
792
+ });
793
+ let createRes;
794
+ try {
795
+ createRes = await fetchWithTimeout(`${baseUrl}/api/auth/cli-session`, {
796
+ method: "POST",
797
+ headers: { "Content-Type": "application/json" },
798
+ body: JSON.stringify({ sessionId })
799
+ }, CLOUD_LOGIN_CREATE_TIMEOUT_MS);
800
+ } catch (err) {
801
+ if (isTimeoutError(err)) {
802
+ loginCreateSpan.failure({ error: err, statusCode: 504 });
803
+ sendJsonError(res, "Eliza Cloud login request timed out", 504);
804
+ return true;
805
+ }
806
+ loginCreateSpan.failure({ error: err, statusCode: 502 });
807
+ sendJsonError(res, "Failed to reach Eliza Cloud", 502);
808
+ return true;
809
+ }
810
+ if (isRedirectResponse(createRes)) {
811
+ loginCreateSpan.failure({
812
+ statusCode: createRes.status,
813
+ errorKind: "redirect_response"
814
+ });
815
+ sendJsonError(res, "Eliza Cloud login request was redirected; redirects are not allowed", 502);
816
+ return true;
817
+ }
818
+ if (!createRes.ok) {
819
+ loginCreateSpan.failure({
820
+ statusCode: createRes.status,
821
+ errorKind: "http_error"
822
+ });
823
+ sendJsonError(res, "Failed to create auth session with Eliza Cloud", 502);
824
+ return true;
825
+ }
826
+ loginCreateSpan.success({ statusCode: createRes.status });
827
+ sendJson(res, {
828
+ ok: true,
829
+ sessionId,
830
+ browserUrl: `${baseUrl}/auth/cli-login?session=${encodeURIComponent(sessionId)}`
831
+ });
832
+ return true;
833
+ }
834
+ if (method === "GET" && pathname.startsWith("/api/cloud/login/status")) {
835
+ const url = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`);
836
+ const sessionId = url.searchParams.get("sessionId");
837
+ if (!sessionId) {
838
+ sendJsonError(res, "sessionId query parameter is required");
839
+ return true;
840
+ }
841
+ const baseUrl = normalizeCloudSiteUrl(state.config.cloud?.baseUrl);
842
+ const urlError = await validateCloudBaseUrl(baseUrl);
843
+ if (urlError) {
844
+ sendJsonError(res, urlError);
845
+ return true;
846
+ }
847
+ const loginPollSpan = getTelemetrySpan(state, {
848
+ boundary: "cloud",
849
+ operation: "login_poll_status",
850
+ timeoutMs: CLOUD_LOGIN_POLL_TIMEOUT_MS
851
+ });
852
+ let pollRes;
853
+ try {
854
+ pollRes = await fetchWithTimeout(`${baseUrl}/api/auth/cli-session/${encodeURIComponent(sessionId)}`, {}, CLOUD_LOGIN_POLL_TIMEOUT_MS);
855
+ } catch (err) {
856
+ if (isTimeoutError(err)) {
857
+ loginPollSpan.failure({ error: err, statusCode: 504 });
858
+ sendJson(res, {
859
+ status: "error",
860
+ error: "Eliza Cloud status request timed out"
861
+ }, 504);
862
+ return true;
863
+ }
864
+ loginPollSpan.failure({ error: err, statusCode: 502 });
865
+ sendJson(res, {
866
+ status: "error",
867
+ error: "Failed to reach Eliza Cloud"
868
+ }, 502);
869
+ return true;
870
+ }
871
+ if (isRedirectResponse(pollRes)) {
872
+ loginPollSpan.failure({
873
+ statusCode: pollRes.status,
874
+ errorKind: "redirect_response"
875
+ });
876
+ sendJson(res, {
877
+ status: "error",
878
+ error: "Eliza Cloud status request was redirected; redirects are not allowed"
879
+ }, 502);
880
+ return true;
881
+ }
882
+ if (!pollRes.ok) {
883
+ loginPollSpan.failure({
884
+ statusCode: pollRes.status,
885
+ errorKind: "http_error"
886
+ });
887
+ sendJson(res, pollRes.status === 404 ? { status: "expired", error: "Session not found or expired" } : {
888
+ status: "error",
889
+ error: `Eliza Cloud returned HTTP ${pollRes.status}`
890
+ });
891
+ return true;
892
+ }
893
+ let data;
894
+ try {
895
+ data = await pollRes.json();
896
+ } catch (parseErr) {
897
+ loginPollSpan.failure({ error: parseErr, statusCode: pollRes.status });
898
+ sendJson(res, { status: "error", error: "Eliza Cloud returned invalid JSON" }, 502);
899
+ return true;
900
+ }
901
+ loginPollSpan.success({ statusCode: pollRes.status });
902
+ if (data.status === "authenticated" && data.apiKey) {
903
+ const organizationId = typeof data.organizationId === "string" ? data.organizationId.trim() : undefined;
904
+ const userId = typeof data.userId === "string" ? data.userId.trim() : undefined;
905
+ const cloudAuth = clearCloudAuth(state.runtime);
906
+ migrateLegacyRuntimeConfig(state.config);
907
+ const cloud = state.config.cloud ?? {};
908
+ cloud.apiKey = data.apiKey;
909
+ state.config.cloud = cloud;
910
+ applyCanonicalSetupConfig(state.config, {
911
+ linkedAccounts: {
912
+ elizacloud: {
913
+ status: "linked",
914
+ source: "api-key"
915
+ }
916
+ }
917
+ });
918
+ const cloudInferenceSelected = isCloudInferenceSelectedInConfig(state.config);
919
+ migrateLegacyRuntimeConfig(state.config);
920
+ try {
921
+ if (state.saveConfig) {
922
+ state.saveConfig(state.config);
923
+ } else {
924
+ logger.warn("[cloud-login] saveConfig not available — config not persisted");
925
+ }
926
+ logger.info("[cloud-login] API key saved to config file");
927
+ } catch (saveErr) {
928
+ logger.error(`[cloud-login] Failed to save config: ${String(saveErr)}`);
929
+ sendJson(res, { status: "error", error: "Authenticated but failed to save config" }, 500);
930
+ return true;
931
+ }
932
+ process.env.ELIZAOS_CLOUD_API_KEY = data.apiKey;
933
+ if (cloudInferenceSelected) {
934
+ process.env.ELIZAOS_CLOUD_ENABLED = "true";
935
+ } else {
936
+ delete process.env.ELIZAOS_CLOUD_ENABLED;
937
+ }
938
+ if (state.runtime) {
939
+ const character = state.runtime.character ?? {};
940
+ state.runtime.character = character;
941
+ if (!character.secrets) {
942
+ character.secrets = {};
943
+ }
944
+ const secrets = character.secrets;
945
+ secrets.ELIZAOS_CLOUD_API_KEY = data.apiKey;
946
+ if (userId) {
947
+ secrets.ELIZA_CLOUD_USER_ID = userId;
948
+ } else {
949
+ delete secrets.ELIZA_CLOUD_USER_ID;
950
+ }
951
+ if (organizationId) {
952
+ secrets.ELIZA_CLOUD_ORGANIZATION_ID = organizationId;
953
+ } else {
954
+ delete secrets.ELIZA_CLOUD_ORGANIZATION_ID;
955
+ }
956
+ if (cloudInferenceSelected) {
957
+ secrets.ELIZAOS_CLOUD_ENABLED = "true";
958
+ } else {
959
+ delete secrets.ELIZAOS_CLOUD_ENABLED;
960
+ }
961
+ if (typeof state.runtime.setSetting === "function") {
962
+ state.runtime.setSetting("ELIZA_CLOUD_USER_ID", userId ?? null);
963
+ state.runtime.setSetting("ELIZA_CLOUD_ORGANIZATION_ID", organizationId ?? null);
964
+ }
965
+ if (typeof state.runtime.updateAgent === "function") {
966
+ await state.runtime.updateAgent(state.runtime.agentId, {
967
+ secrets: { ...secrets }
968
+ });
969
+ logger.info("[cloud-login] API key persisted to agent DB record");
970
+ } else {
971
+ logger.warn("[cloud-login] runtime.updateAgent not available — agent DB secrets not persisted");
972
+ }
973
+ }
974
+ if (state.cloudManager && typeof state.cloudManager.replaceApiKey === "function") {
975
+ await state.cloudManager.replaceApiKey(data.apiKey);
976
+ } else if (state.cloudManager && !state.cloudManager.getClient() && typeof state.cloudManager.init === "function") {
977
+ await state.cloudManager.init();
978
+ }
979
+ if (typeof cloudAuth?.authenticateWithApiKey === "function") {
980
+ cloudAuth.authenticateWithApiKey({
981
+ apiKey: data.apiKey,
982
+ organizationId,
983
+ userId
984
+ });
985
+ }
986
+ if (isCloudWalletEnabled()) {
987
+ const rollbackConfigSnapshot = structuredClone(state.config);
988
+ const rollbackEnvSnapshot = await captureConfigEnvRollbackSnapshot();
989
+ try {
990
+ const bridge = state.cloudManager?.getClient();
991
+ const agentId = state.runtime?.agentId;
992
+ if (!bridge) {
993
+ throw new Error("cloud-wallet bridge unavailable");
994
+ }
995
+ if (!agentId) {
996
+ throw new Error("cloud-wallet runtime agentId missing");
997
+ }
998
+ const { address: clientAddress, minted } = await getOrCreateClientAddressKey();
999
+ if (minted) {
1000
+ logger.info(`[cloud-login] cloud-wallet: minted client_address ${clientAddress}`);
1001
+ }
1002
+ const descriptors = await provisionCloudWallets(bridge, {
1003
+ agentId,
1004
+ clientAddress
1005
+ });
1006
+ persistCloudWalletCache(state.config, descriptors);
1007
+ const cloudCfg = state.config.cloud ?? {};
1008
+ cloudCfg.clientAddressPublicKey = clientAddress;
1009
+ state.config.cloud = cloudCfg;
1010
+ saveConfigOrThrow(state);
1011
+ if (descriptors.evm?.walletAddress) {
1012
+ process.env.ELIZA_CLOUD_EVM_ADDRESS = descriptors.evm.walletAddress;
1013
+ await persistConfigEnv("ELIZA_CLOUD_EVM_ADDRESS", descriptors.evm.walletAddress);
1014
+ }
1015
+ if (descriptors.solana?.walletAddress) {
1016
+ process.env.ELIZA_CLOUD_SOLANA_ADDRESS = descriptors.solana.walletAddress;
1017
+ await persistConfigEnv("ELIZA_CLOUD_SOLANA_ADDRESS", descriptors.solana.walletAddress);
1018
+ }
1019
+ if (descriptors.evm) {
1020
+ await persistConfigEnv("WALLET_SOURCE_EVM", "cloud");
1021
+ }
1022
+ if (descriptors.solana) {
1023
+ await persistConfigEnv("WALLET_SOURCE_SOLANA", "cloud");
1024
+ }
1025
+ const wallet = state.config.wallet ?? {};
1026
+ const primary = {
1027
+ ...wallet.primary ?? {}
1028
+ };
1029
+ if (descriptors.evm)
1030
+ primary.evm = "cloud";
1031
+ if (descriptors.solana)
1032
+ primary.solana = "cloud";
1033
+ wallet.primary = primary;
1034
+ state.config.wallet = wallet;
1035
+ saveConfigOrThrow(state);
1036
+ logger.info(`[cloud-login] cloud-wallet: provisioned ${Object.keys(descriptors).join(", ")} — applying runtime reload`);
1037
+ const restarted = state.restartRuntime ? await Promise.resolve(state.restartRuntime("cloud-wallet-bound")) : false;
1038
+ if (!restarted) {
1039
+ logger.warn("[cloud-login] cloud-wallet: restartRuntime not wired or restart declined — user must restart manually");
1040
+ }
1041
+ } catch (cloudWalletErr) {
1042
+ try {
1043
+ await restoreConfigEnvRollbackSnapshot(rollbackEnvSnapshot);
1044
+ } catch (rollbackErr) {
1045
+ logger.error(`[cloud-login] cloud-wallet rollback failed: ${String(rollbackErr)}`);
1046
+ }
1047
+ replaceMutableRoot(state.config, rollbackConfigSnapshot);
1048
+ try {
1049
+ saveConfigOrThrow(state);
1050
+ } catch (saveRollbackErr) {
1051
+ logger.error(`[cloud-login] cloud-wallet config rollback failed: ${String(saveRollbackErr)}`);
1052
+ }
1053
+ logger.error(`[cloud-login] cloud-wallet provision failed: ${String(cloudWalletErr)}`);
1054
+ }
1055
+ }
1056
+ logger.info(`[cloud-login] sending API key to loopback renderer (single-user desktop trust model)`);
1057
+ sendJson(res, {
1058
+ status: "authenticated",
1059
+ token: data.apiKey,
1060
+ keyPrefix: data.keyPrefix,
1061
+ organizationId,
1062
+ userId
1063
+ });
1064
+ } else {
1065
+ sendJson(res, { status: data.status });
1066
+ }
1067
+ return true;
1068
+ }
1069
+ if (method === "GET" && pathname === "/api/cloud/agents") {
1070
+ const client = state.cloudManager?.getClient();
1071
+ if (!client) {
1072
+ sendJsonError(res, "Not connected to Eliza Cloud", 401);
1073
+ return true;
1074
+ }
1075
+ sendJson(res, { ok: true, agents: await client.listAgents() });
1076
+ return true;
1077
+ }
1078
+ if (method === "POST" && pathname === "/api/cloud/agents") {
1079
+ const client = state.cloudManager?.getClient();
1080
+ if (!client) {
1081
+ sendJsonError(res, "Not connected to Eliza Cloud", 401);
1082
+ return true;
1083
+ }
1084
+ const body = await readJsonBody2(req, res);
1085
+ if (!body)
1086
+ return true;
1087
+ if (!body.agentName?.trim()) {
1088
+ sendJsonError(res, "agentName is required");
1089
+ return true;
1090
+ }
1091
+ let agent;
1092
+ try {
1093
+ agent = await client.createAgent({
1094
+ agentName: body.agentName,
1095
+ agentConfig: body.agentConfig,
1096
+ environmentVars: body.environmentVars
1097
+ });
1098
+ } catch (err) {
1099
+ logger.error(`[cloud] createAgent failed: ${String(err)}`);
1100
+ sendJson(res, { ok: false, error: `Cloud createAgent failed: ${String(err)}` }, 502);
1101
+ return true;
1102
+ }
1103
+ sendJson(res, { ok: true, agent }, 201);
1104
+ return true;
1105
+ }
1106
+ if (method === "POST" && pathname.startsWith("/api/cloud/agents/") && pathname.endsWith("/provision")) {
1107
+ const agentId = extractAgentId(pathname);
1108
+ if (!agentId || !state.cloudManager) {
1109
+ sendJsonError(res, "Invalid agent ID or cloud not connected", 400);
1110
+ return true;
1111
+ }
1112
+ let proxy;
1113
+ try {
1114
+ proxy = await state.cloudManager.connect(agentId);
1115
+ } catch (err) {
1116
+ logger.error(`[cloud] provision/connect failed: ${String(err)}`);
1117
+ sendJson(res, { ok: false, error: `Cloud provision failed: ${String(err)}` }, 502);
1118
+ return true;
1119
+ }
1120
+ sendJson(res, {
1121
+ ok: true,
1122
+ agentId,
1123
+ agentName: proxy.agentName,
1124
+ status: state.cloudManager.getStatus()
1125
+ });
1126
+ return true;
1127
+ }
1128
+ if (method === "POST" && pathname.startsWith("/api/cloud/agents/") && pathname.endsWith("/shutdown")) {
1129
+ const agentId = extractAgentId(pathname);
1130
+ if (!agentId || !state.cloudManager) {
1131
+ sendJsonError(res, "Invalid agent ID or cloud not connected", 400);
1132
+ return true;
1133
+ }
1134
+ const client = state.cloudManager.getClient();
1135
+ if (!client) {
1136
+ sendJsonError(res, "Not connected to Eliza Cloud", 401);
1137
+ return true;
1138
+ }
1139
+ try {
1140
+ if (state.cloudManager.getActiveAgentId() === agentId) {
1141
+ await state.cloudManager.disconnect();
1142
+ }
1143
+ await client.deleteAgent(agentId);
1144
+ } catch (err) {
1145
+ logger.error(`[cloud] shutdown/deleteAgent failed: ${String(err)}`);
1146
+ sendJson(res, { ok: false, error: `Cloud shutdown failed: ${String(err)}` }, 502);
1147
+ return true;
1148
+ }
1149
+ sendJson(res, { ok: true, agentId, status: "stopped" });
1150
+ return true;
1151
+ }
1152
+ if (method === "POST" && pathname.startsWith("/api/cloud/agents/") && pathname.endsWith("/connect")) {
1153
+ const agentId = extractAgentId(pathname);
1154
+ if (!agentId || !state.cloudManager) {
1155
+ sendJsonError(res, "Invalid agent ID or cloud not connected", 400);
1156
+ return true;
1157
+ }
1158
+ let proxy;
1159
+ try {
1160
+ if (state.cloudManager.getActiveAgentId()) {
1161
+ await state.cloudManager.disconnect();
1162
+ }
1163
+ proxy = await state.cloudManager.connect(agentId);
1164
+ } catch (err) {
1165
+ logger.error(`[cloud] connect failed: ${String(err)}`);
1166
+ sendJson(res, { ok: false, error: `Cloud connect failed: ${String(err)}` }, 502);
1167
+ return true;
1168
+ }
1169
+ sendJson(res, {
1170
+ ok: true,
1171
+ agentId,
1172
+ agentName: proxy.agentName,
1173
+ status: state.cloudManager.getStatus()
1174
+ });
1175
+ return true;
1176
+ }
1177
+ if (method === "POST" && pathname === "/api/cloud/disconnect") {
1178
+ if (state.cloudManager) {
1179
+ await state.cloudManager.disconnect();
1180
+ }
1181
+ const cloud = state.config.cloud ?? {};
1182
+ delete cloud.apiKey;
1183
+ state.config.cloud = cloud;
1184
+ applyCanonicalSetupConfig(state.config, {
1185
+ deploymentTarget: { runtime: "local" },
1186
+ linkedAccounts: {
1187
+ elizacloud: {
1188
+ status: "unlinked",
1189
+ source: "api-key"
1190
+ }
1191
+ },
1192
+ clearRoutes: ["llmText", "tts", "media", "embeddings", "rpc"]
1193
+ });
1194
+ migrateLegacyRuntimeConfig(state.config);
1195
+ try {
1196
+ if (state.saveConfig) {
1197
+ state.saveConfig(state.config);
1198
+ } else {
1199
+ logger.warn("[cloud-disconnect] saveConfig not available — config not persisted");
1200
+ }
1201
+ } catch (saveErr) {
1202
+ logger.error(`[cloud-disconnect] Failed to save config: ${String(saveErr)}`);
1203
+ sendJson(res, { ok: false, error: "Disconnected but failed to save config" }, 500);
1204
+ return true;
1205
+ }
1206
+ delete process.env.ELIZAOS_CLOUD_API_KEY;
1207
+ delete process.env.ELIZAOS_CLOUD_ENABLED;
1208
+ if (state.runtime) {
1209
+ const character = state.runtime.character ?? {};
1210
+ state.runtime.character = character;
1211
+ if (!character.secrets) {
1212
+ character.secrets = {};
1213
+ }
1214
+ const secrets = character.secrets;
1215
+ delete secrets.ELIZAOS_CLOUD_API_KEY;
1216
+ delete secrets.ELIZAOS_CLOUD_ENABLED;
1217
+ if (typeof state.runtime.updateAgent === "function") {
1218
+ await state.runtime.updateAgent(state.runtime.agentId, {
1219
+ secrets: { ...secrets }
1220
+ });
1221
+ } else {
1222
+ logger.warn("[cloud-disconnect] updateAgent not available — runtime secrets not persisted");
1223
+ }
1224
+ }
1225
+ sendJson(res, { ok: true, status: "disconnected" });
1226
+ return true;
1227
+ }
1228
+ return false;
1229
+ }
1230
+ var UUID_RE, CLOUD_LOGIN_CREATE_TIMEOUT_MS = 1e4, CLOUD_LOGIN_POLL_TIMEOUT_MS = 1e4, CONFIG_ENV_FILENAME2 = "config.env", CONFIG_ENV_BAK_SUFFIX = ".bak", CLOUD_WALLET_ROLLBACK_ENV_KEYS;
1231
+ var init_cloud_routes_autonomous = __esm(() => {
1232
+ init_base_url();
1233
+ init_cloud_wallet();
1234
+ init_validate_url();
1235
+ init_config_env();
1236
+ init_state_paths();
1237
+ UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
1238
+ CLOUD_WALLET_ROLLBACK_ENV_KEYS = [
1239
+ ELIZA_CLOUD_CLIENT_ADDRESS_KEY_ENV,
1240
+ "ELIZA_CLOUD_EVM_ADDRESS",
1241
+ "ELIZA_CLOUD_SOLANA_ADDRESS",
1242
+ "WALLET_SOURCE_EVM",
1243
+ "WALLET_SOURCE_SOLANA"
1244
+ ];
1245
+ });
1246
+ init_cloud_routes_autonomous();
1247
+
1248
+ export {
1249
+ handleCloudRoute
1250
+ };
1251
+
1252
+ //# debugId=8DCC6EACC808486C64756E2164756E21