@elizaos/plugin-elizacloud 2.0.0-alpha.7 → 2.0.0-beta.1

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 (378) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +220 -0
  3. package/auto-enable.ts +17 -0
  4. package/dist/browser/index.browser.js +2 -21
  5. package/dist/browser/index.browser.js.map +5 -37
  6. package/dist/cjs/index.d.ts +2 -2
  7. package/dist/cjs/index.node.cjs +12173 -2271
  8. package/dist/cjs/index.node.js.map +135 -27
  9. package/dist/cloud/auth.d.ts +19 -0
  10. package/dist/cloud/auth.d.ts.map +1 -0
  11. package/dist/cloud/auth.js +330 -0
  12. package/dist/cloud/auth.js.map +12 -0
  13. package/dist/cloud/backup.d.ts +18 -0
  14. package/dist/cloud/backup.d.ts.map +1 -0
  15. package/dist/cloud/backup.js +63 -0
  16. package/dist/cloud/backup.js.map +10 -0
  17. package/dist/cloud/base-url.d.ts +3 -0
  18. package/dist/cloud/base-url.d.ts.map +1 -0
  19. package/dist/cloud/base-url.js +77 -0
  20. package/dist/cloud/base-url.js.map +10 -0
  21. package/dist/cloud/bridge-client.d.ts +126 -0
  22. package/dist/cloud/bridge-client.d.ts.map +1 -0
  23. package/dist/cloud/bridge-client.js +432 -0
  24. package/dist/cloud/bridge-client.js.map +11 -0
  25. package/dist/cloud/cloud-api-key.d.ts +26 -0
  26. package/dist/cloud/cloud-api-key.d.ts.map +1 -0
  27. package/dist/cloud/cloud-api-key.js +60 -0
  28. package/dist/cloud/cloud-api-key.js.map +10 -0
  29. package/dist/cloud/cloud-manager.d.ts +33 -0
  30. package/dist/cloud/cloud-manager.d.ts.map +1 -0
  31. package/dist/cloud/cloud-manager.js +853 -0
  32. package/dist/cloud/cloud-manager.js.map +16 -0
  33. package/dist/cloud/cloud-proxy.d.ts +20 -0
  34. package/dist/cloud/cloud-proxy.d.ts.map +1 -0
  35. package/dist/cloud/cloud-proxy.js +54 -0
  36. package/dist/cloud/cloud-proxy.js.map +10 -0
  37. package/dist/cloud/cloud-wallet.d.ts +94 -0
  38. package/dist/cloud/cloud-wallet.d.ts.map +1 -0
  39. package/dist/cloud/cloud-wallet.js +5195 -0
  40. package/dist/cloud/cloud-wallet.js.map +92 -0
  41. package/dist/cloud/index.d.ts +9 -0
  42. package/dist/cloud/index.d.ts.map +1 -0
  43. package/dist/cloud/index.js +30 -0
  44. package/dist/cloud/index.js.map +9 -0
  45. package/dist/cloud/reconnect.d.ts +26 -0
  46. package/dist/cloud/reconnect.d.ts.map +1 -0
  47. package/dist/cloud/reconnect.js +104 -0
  48. package/dist/cloud/reconnect.js.map +10 -0
  49. package/dist/cloud/validate-url.d.ts +2 -0
  50. package/dist/cloud/validate-url.d.ts.map +1 -0
  51. package/dist/cloud/validate-url.js +174 -0
  52. package/dist/cloud/validate-url.js.map +10 -0
  53. package/dist/cloud-providers/cloud-status.d.ts.map +1 -1
  54. package/dist/cloud-providers/cloud-status.js +78 -0
  55. package/dist/cloud-providers/cloud-status.js.map +10 -0
  56. package/dist/cloud-providers/container-health.d.ts.map +1 -1
  57. package/dist/cloud-providers/container-health.js +74 -0
  58. package/dist/cloud-providers/container-health.js.map +10 -0
  59. package/dist/cloud-providers/credit-balance.d.ts.map +1 -1
  60. package/dist/cloud-providers/credit-balance.js +85 -0
  61. package/dist/cloud-providers/credit-balance.js.map +10 -0
  62. package/dist/cloud-providers/index.d.ts.map +1 -1
  63. package/dist/cloud-providers/index.js +24 -0
  64. package/dist/cloud-providers/index.js.map +9 -0
  65. package/dist/cloud-providers/model-registry.d.ts.map +1 -1
  66. package/dist/cloud-providers/model-registry.js +71 -0
  67. package/dist/cloud-providers/model-registry.js.map +10 -0
  68. package/dist/index.browser.d.ts +4 -2
  69. package/dist/index.browser.d.ts.map +1 -1
  70. package/dist/index.d.ts +18 -0
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +12851 -0
  73. package/dist/index.js.map +145 -0
  74. package/dist/index.node.d.ts +15 -2
  75. package/dist/index.node.d.ts.map +1 -1
  76. package/dist/init.d.ts.map +1 -1
  77. package/dist/init.js +169 -0
  78. package/dist/init.js.map +12 -0
  79. package/dist/lib/cloud-connection.d.ts +78 -0
  80. package/dist/lib/cloud-connection.d.ts.map +1 -0
  81. package/dist/lib/cloud-connection.js +731 -0
  82. package/dist/lib/cloud-connection.js.map +14 -0
  83. package/dist/lib/cloud-secrets.d.ts +23 -0
  84. package/dist/lib/cloud-secrets.d.ts.map +1 -0
  85. package/dist/lib/cloud-secrets.js +64 -0
  86. package/dist/lib/cloud-secrets.js.map +10 -0
  87. package/dist/lib/config-env.d.ts +5 -0
  88. package/dist/lib/config-env.d.ts.map +1 -0
  89. package/dist/lib/config-env.js +191 -0
  90. package/dist/lib/config-env.js.map +11 -0
  91. package/dist/lib/config-like.d.ts +40 -0
  92. package/dist/lib/config-like.d.ts.map +1 -0
  93. package/dist/lib/config-like.js +103 -0
  94. package/dist/lib/config-like.js.map +10 -0
  95. package/dist/lib/credential-type-map.d.ts +53 -0
  96. package/dist/lib/credential-type-map.d.ts.map +1 -0
  97. package/dist/lib/credential-type-map.js +88 -0
  98. package/dist/lib/credential-type-map.js.map +10 -0
  99. package/dist/lib/feature-flags.d.ts +2 -0
  100. package/dist/lib/feature-flags.d.ts.map +1 -0
  101. package/dist/lib/feature-flags.js +40 -0
  102. package/dist/lib/feature-flags.js.map +10 -0
  103. package/dist/lib/http.d.ts +22 -0
  104. package/dist/lib/http.d.ts.map +1 -0
  105. package/dist/lib/http.js +107 -0
  106. package/dist/lib/http.js.map +10 -0
  107. package/dist/lib/server-cloud-tts.d.ts +34 -0
  108. package/dist/lib/server-cloud-tts.d.ts.map +1 -0
  109. package/dist/lib/server-cloud-tts.js +549 -0
  110. package/dist/lib/server-cloud-tts.js.map +13 -0
  111. package/dist/lib/state-paths.d.ts +4 -0
  112. package/dist/lib/state-paths.d.ts.map +1 -0
  113. package/dist/lib/state-paths.js +52 -0
  114. package/dist/lib/state-paths.js.map +10 -0
  115. package/dist/lib/tts-debug.d.ts +4 -0
  116. package/dist/lib/tts-debug.d.ts.map +1 -0
  117. package/dist/lib/tts-debug.js +57 -0
  118. package/dist/lib/tts-debug.js.map +10 -0
  119. package/dist/models/embeddings.d.ts.map +1 -1
  120. package/dist/models/embeddings.js +319 -0
  121. package/dist/models/embeddings.js.map +13 -0
  122. package/dist/models/image.d.ts.map +1 -1
  123. package/dist/models/image.js +374 -0
  124. package/dist/models/image.js.map +14 -0
  125. package/dist/models/index.d.ts +1 -2
  126. package/dist/models/index.d.ts.map +1 -1
  127. package/dist/models/index.js +1386 -0
  128. package/dist/models/index.js.map +20 -0
  129. package/dist/models/research.d.ts.map +1 -1
  130. package/dist/models/research.js +324 -0
  131. package/dist/models/research.js.map +13 -0
  132. package/dist/models/speech.d.ts.map +1 -1
  133. package/dist/models/speech.js +273 -0
  134. package/dist/models/speech.js.map +13 -0
  135. package/dist/models/text.d.ts +5 -2
  136. package/dist/models/text.d.ts.map +1 -1
  137. package/dist/models/text.js +803 -0
  138. package/dist/models/text.js.map +15 -0
  139. package/dist/models/tokenization.d.ts.map +1 -1
  140. package/dist/models/tokenization.js +65 -0
  141. package/dist/models/tokenization.js.map +10 -0
  142. package/dist/models/transcription.d.ts.map +1 -1
  143. package/dist/models/transcription.js +283 -0
  144. package/dist/models/transcription.js.map +13 -0
  145. package/dist/node/index.d.ts +2 -2
  146. package/dist/node/index.node.js +12171 -2266
  147. package/dist/node/index.node.js.map +135 -27
  148. package/dist/onboarding.d.ts +35 -0
  149. package/dist/onboarding.d.ts.map +1 -0
  150. package/dist/onboarding.js +883 -0
  151. package/dist/onboarding.js.map +14 -0
  152. package/dist/plugin.d.ts +20 -0
  153. package/dist/plugin.d.ts.map +1 -0
  154. package/dist/plugin.js +7611 -0
  155. package/dist/plugin.js.map +104 -0
  156. package/dist/providers/openai.d.ts.map +1 -1
  157. package/dist/providers/openai.js +127 -0
  158. package/dist/providers/openai.js.map +11 -0
  159. package/dist/register-routes.d.ts +2 -0
  160. package/dist/register-routes.d.ts.map +1 -0
  161. package/dist/register-routes.js +7612 -0
  162. package/dist/register-routes.js.map +105 -0
  163. package/dist/routes/cloud-billing-routes.d.ts +9 -0
  164. package/dist/routes/cloud-billing-routes.d.ts.map +1 -0
  165. package/dist/routes/cloud-billing-routes.js +807 -0
  166. package/dist/routes/cloud-billing-routes.js.map +14 -0
  167. package/dist/routes/cloud-compat-routes.d.ts +10 -0
  168. package/dist/routes/cloud-compat-routes.d.ts.map +1 -0
  169. package/dist/routes/cloud-compat-routes.js +538 -0
  170. package/dist/routes/cloud-compat-routes.js.map +14 -0
  171. package/dist/routes/cloud-features-routes.d.ts +9 -0
  172. package/dist/routes/cloud-features-routes.d.ts.map +1 -0
  173. package/dist/routes/cloud-features-routes.js +124 -0
  174. package/dist/routes/cloud-features-routes.js.map +11 -0
  175. package/dist/routes/cloud-provisioning.d.ts +14 -0
  176. package/dist/routes/cloud-provisioning.d.ts.map +1 -0
  177. package/dist/routes/cloud-provisioning.js +37 -0
  178. package/dist/routes/cloud-provisioning.js.map +10 -0
  179. package/dist/routes/cloud-relay-routes.d.ts +22 -0
  180. package/dist/routes/cloud-relay-routes.d.ts.map +1 -0
  181. package/dist/routes/cloud-relay-routes.js +60 -0
  182. package/dist/routes/cloud-relay-routes.js.map +10 -0
  183. package/dist/routes/cloud-routes-autonomous.d.ts +83 -0
  184. package/dist/routes/cloud-routes-autonomous.d.ts.map +1 -0
  185. package/dist/routes/cloud-routes-autonomous.js +6134 -0
  186. package/dist/routes/cloud-routes-autonomous.js.map +97 -0
  187. package/dist/routes/cloud-routes.d.ts +35 -0
  188. package/dist/routes/cloud-routes.d.ts.map +1 -0
  189. package/dist/routes/cloud-routes.js +6888 -0
  190. package/dist/routes/cloud-routes.js.map +100 -0
  191. package/dist/routes/cloud-status-routes-autonomous.d.ts +15 -0
  192. package/dist/routes/cloud-status-routes-autonomous.d.ts.map +1 -0
  193. package/dist/routes/cloud-status-routes-autonomous.js +396 -0
  194. package/dist/routes/cloud-status-routes-autonomous.js.map +13 -0
  195. package/dist/routes/cloud-status-routes.d.ts +4 -0
  196. package/dist/routes/cloud-status-routes.d.ts.map +1 -0
  197. package/dist/routes/cloud-status-routes.js +771 -0
  198. package/dist/routes/cloud-status-routes.js.map +15 -0
  199. package/dist/services/cloud-auth.d.ts +140 -5
  200. package/dist/services/cloud-auth.d.ts.map +1 -1
  201. package/dist/services/cloud-auth.js +363 -0
  202. package/dist/services/cloud-auth.js.map +12 -0
  203. package/dist/services/cloud-backup.d.ts.map +1 -1
  204. package/dist/services/cloud-backup.js +176 -0
  205. package/dist/services/cloud-backup.js.map +11 -0
  206. package/dist/services/cloud-bootstrap.d.ts +38 -0
  207. package/dist/services/cloud-bootstrap.d.ts.map +1 -0
  208. package/dist/services/cloud-bootstrap.js +84 -0
  209. package/dist/services/cloud-bootstrap.js.map +10 -0
  210. package/dist/services/cloud-bridge.d.ts +1 -1
  211. package/dist/services/cloud-bridge.d.ts.map +1 -1
  212. package/dist/services/cloud-bridge.js +308 -0
  213. package/dist/services/cloud-bridge.js.map +11 -0
  214. package/dist/services/cloud-container.d.ts.map +1 -1
  215. package/dist/services/cloud-container.js +241 -0
  216. package/dist/services/cloud-container.js.map +11 -0
  217. package/dist/services/cloud-credential-provider.d.ts +55 -0
  218. package/dist/services/cloud-credential-provider.d.ts.map +1 -0
  219. package/dist/services/cloud-credential-provider.js +190 -0
  220. package/dist/services/cloud-credential-provider.js.map +11 -0
  221. package/dist/services/cloud-managed-gateway-relay.d.ts +38 -0
  222. package/dist/services/cloud-managed-gateway-relay.d.ts.map +1 -0
  223. package/dist/services/cloud-managed-gateway-relay.js +479 -0
  224. package/dist/services/cloud-managed-gateway-relay.js.map +10 -0
  225. package/dist/services/cloud-model-registry.d.ts.map +1 -1
  226. package/dist/services/cloud-model-registry.js +175 -0
  227. package/dist/services/cloud-model-registry.js.map +10 -0
  228. package/dist/services/index.d.ts +3 -1
  229. package/dist/services/index.d.ts.map +1 -1
  230. package/dist/services/index.js +29 -0
  231. package/dist/services/index.js.map +9 -0
  232. package/dist/types/cloud.d.ts +41 -19
  233. package/dist/types/cloud.d.ts.map +1 -1
  234. package/dist/types/cloud.js +52 -0
  235. package/dist/types/cloud.js.map +10 -0
  236. package/dist/types/index.d.ts +1 -1
  237. package/dist/types/index.d.ts.map +1 -1
  238. package/dist/types/index.js +24 -0
  239. package/dist/types/index.js.map +9 -0
  240. package/dist/utils/cloud-api.d.ts +2 -27
  241. package/dist/utils/cloud-api.d.ts.map +1 -1
  242. package/dist/utils/cloud-api.js +33 -0
  243. package/dist/utils/cloud-api.js.map +10 -0
  244. package/dist/utils/cloud-sdk/client.d.ts +133 -0
  245. package/dist/utils/cloud-sdk/client.d.ts.map +1 -0
  246. package/dist/utils/cloud-sdk/client.js +3561 -0
  247. package/dist/utils/cloud-sdk/client.js.map +13 -0
  248. package/dist/utils/cloud-sdk/http.d.ts +37 -0
  249. package/dist/utils/cloud-sdk/http.d.ts.map +1 -0
  250. package/dist/utils/cloud-sdk/http.js +237 -0
  251. package/dist/utils/cloud-sdk/http.js.map +11 -0
  252. package/dist/utils/cloud-sdk/index.d.ts +6 -0
  253. package/dist/utils/cloud-sdk/index.d.ts.map +1 -0
  254. package/dist/utils/cloud-sdk/index.js +29 -0
  255. package/dist/utils/cloud-sdk/index.js.map +9 -0
  256. package/dist/utils/cloud-sdk/public-routes.d.ts +5377 -0
  257. package/dist/utils/cloud-sdk/public-routes.d.ts.map +1 -0
  258. package/dist/utils/cloud-sdk/public-routes.js +2950 -0
  259. package/dist/utils/cloud-sdk/public-routes.js.map +10 -0
  260. package/dist/utils/cloud-sdk/types.cloud-api.d.ts +101 -0
  261. package/dist/utils/cloud-sdk/types.cloud-api.d.ts.map +1 -0
  262. package/dist/utils/cloud-sdk/types.cloud-api.js +2 -0
  263. package/dist/utils/cloud-sdk/types.cloud-api.js.map +9 -0
  264. package/dist/utils/cloud-sdk/types.d.ts +655 -0
  265. package/dist/utils/cloud-sdk/types.d.ts.map +1 -0
  266. package/dist/utils/cloud-sdk/types.js +29 -0
  267. package/dist/utils/cloud-sdk/types.js.map +10 -0
  268. package/dist/utils/config.d.ts +7 -3
  269. package/dist/utils/config.d.ts.map +1 -1
  270. package/dist/utils/config.js +137 -0
  271. package/dist/utils/config.js.map +10 -0
  272. package/dist/utils/events.d.ts.map +1 -1
  273. package/dist/utils/events.js +43 -0
  274. package/dist/utils/events.js.map +10 -0
  275. package/dist/utils/helpers.d.ts.map +1 -1
  276. package/dist/utils/helpers.js +103 -0
  277. package/dist/utils/helpers.js.map +10 -0
  278. package/dist/utils/responses-output.d.ts +13 -0
  279. package/dist/utils/responses-output.d.ts.map +1 -0
  280. package/dist/utils/responses-output.js +102 -0
  281. package/dist/utils/responses-output.js.map +10 -0
  282. package/dist/utils/sdk-client.d.ts +5 -0
  283. package/dist/utils/sdk-client.d.ts.map +1 -0
  284. package/dist/utils/sdk-client.js +144 -0
  285. package/dist/utils/sdk-client.js.map +11 -0
  286. package/package.json +108 -19
  287. package/src/cloud/auth.ts +175 -0
  288. package/src/cloud/backup.ts +46 -0
  289. package/src/cloud/base-url.ts +62 -0
  290. package/src/cloud/bridge-client.ts +602 -0
  291. package/src/cloud/cloud-api-key.ts +80 -0
  292. package/src/cloud/cloud-manager.ts +163 -0
  293. package/src/cloud/cloud-proxy.ts +52 -0
  294. package/src/cloud/cloud-wallet.ts +341 -0
  295. package/src/cloud/index.ts +28 -0
  296. package/src/cloud/reconnect.ts +111 -0
  297. package/src/cloud/validate-url.ts +181 -0
  298. package/src/cloud-providers/cloud-status.ts +75 -0
  299. package/src/cloud-providers/container-health.ts +68 -0
  300. package/src/cloud-providers/credit-balance.ts +70 -0
  301. package/src/cloud-providers/index.ts +3 -0
  302. package/src/cloud-providers/model-registry.ts +74 -0
  303. package/src/index.browser.ts +10 -0
  304. package/src/index.node.ts +39 -0
  305. package/src/index.ts +347 -0
  306. package/src/init.ts +39 -0
  307. package/src/lib/cloud-connection.ts +663 -0
  308. package/src/lib/cloud-secrets.ts +58 -0
  309. package/src/lib/config-env.ts +168 -0
  310. package/src/lib/config-like.ts +149 -0
  311. package/src/lib/credential-type-map.ts +130 -0
  312. package/src/lib/feature-flags.ts +26 -0
  313. package/src/lib/http.ts +139 -0
  314. package/src/lib/server-cloud-tts.ts +609 -0
  315. package/src/lib/state-paths.ts +28 -0
  316. package/src/lib/tts-debug.ts +34 -0
  317. package/src/models/embeddings.ts +234 -0
  318. package/src/models/image.ts +219 -0
  319. package/src/models/index.ts +16 -0
  320. package/src/models/research.ts +265 -0
  321. package/src/models/speech.ts +78 -0
  322. package/src/models/text.ts +899 -0
  323. package/src/models/tokenization.ts +67 -0
  324. package/src/models/transcription.ts +97 -0
  325. package/src/onboarding.ts +396 -0
  326. package/src/plugin.ts +243 -0
  327. package/src/providers/openai.ts +16 -0
  328. package/src/register-routes.ts +6 -0
  329. package/src/routes/cloud-billing-routes.ts +754 -0
  330. package/src/routes/cloud-compat-routes.ts +314 -0
  331. package/src/routes/cloud-features-routes.ts +57 -0
  332. package/src/routes/cloud-provisioning.ts +37 -0
  333. package/src/routes/cloud-relay-routes.ts +89 -0
  334. package/src/routes/cloud-routes-autonomous.ts +996 -0
  335. package/src/routes/cloud-routes.ts +576 -0
  336. package/src/routes/cloud-status-routes-autonomous.ts +234 -0
  337. package/src/routes/cloud-status-routes.ts +73 -0
  338. package/src/services/cloud-auth.ts +567 -0
  339. package/src/services/cloud-backup.ts +208 -0
  340. package/src/services/cloud-bootstrap.ts +108 -0
  341. package/src/services/cloud-bridge.ts +386 -0
  342. package/src/services/cloud-container.ts +297 -0
  343. package/src/services/cloud-credential-provider.ts +210 -0
  344. package/src/services/cloud-managed-gateway-relay.ts +663 -0
  345. package/src/services/cloud-model-registry.ts +202 -0
  346. package/src/services/index.ts +17 -0
  347. package/{types → src/types}/cloud.ts +52 -29
  348. package/{types → src/types}/index.ts +6 -0
  349. package/src/utils/cloud-api.ts +10 -0
  350. package/src/utils/cloud-sdk/client.ts +735 -0
  351. package/src/utils/cloud-sdk/http.ts +291 -0
  352. package/src/utils/cloud-sdk/index.ts +23 -0
  353. package/src/utils/cloud-sdk/public-routes.ts +5070 -0
  354. package/src/utils/cloud-sdk/types.cloud-api.ts +120 -0
  355. package/src/utils/cloud-sdk/types.ts +762 -0
  356. package/src/utils/config.ts +174 -0
  357. package/src/utils/events.ts +37 -0
  358. package/src/utils/helpers.ts +107 -0
  359. package/src/utils/responses-output.ts +115 -0
  360. package/src/utils/sdk-client.ts +37 -0
  361. package/dist/actions/check-credits.d.ts +0 -6
  362. package/dist/actions/check-credits.d.ts.map +0 -1
  363. package/dist/actions/freeze-agent.d.ts +0 -9
  364. package/dist/actions/freeze-agent.d.ts.map +0 -1
  365. package/dist/actions/index.d.ts +0 -5
  366. package/dist/actions/index.d.ts.map +0 -1
  367. package/dist/actions/provision-agent.d.ts +0 -8
  368. package/dist/actions/provision-agent.d.ts.map +0 -1
  369. package/dist/actions/resume-agent.d.ts +0 -9
  370. package/dist/actions/resume-agent.d.ts.map +0 -1
  371. package/dist/build.d.ts +0 -3
  372. package/dist/build.d.ts.map +0 -1
  373. package/dist/generated/specs/specs.d.ts +0 -55
  374. package/dist/generated/specs/specs.d.ts.map +0 -1
  375. package/dist/models/object.d.ts +0 -4
  376. package/dist/models/object.d.ts.map +0 -1
  377. package/dist/utils/forwarded-settings.d.ts +0 -8
  378. package/dist/utils/forwarded-settings.d.ts.map +0 -1
@@ -0,0 +1,576 @@
1
+ import type http from "node:http";
2
+ import {
3
+ isCloudInferenceSelectedInConfig,
4
+ migrateLegacyRuntimeConfig,
5
+ } from "@elizaos/core";
6
+ import { type CloudRouteState as AutonomousCloudRouteState, handleCloudRoute as handleAutonomousCloudRoute, } from "./cloud-routes-autonomous.js";
7
+ import { normalizeCloudSiteUrl } from "../cloud/base-url.js";
8
+ import type { CloudManager } from "../cloud/cloud-manager.js";
9
+ import { validateCloudBaseUrl } from "../cloud/validate-url.js";
10
+ import { type AgentRuntime, logger } from "@elizaos/core";
11
+ import {
12
+ clearCloudAuthService,
13
+ disconnectUnifiedCloudConnection,
14
+ getCloudAuth,
15
+ type RuntimeCloudLike,
16
+ } from "../lib/cloud-connection";
17
+ import {
18
+ clearCloudSecrets,
19
+ scrubCloudSecretsFromEnv,
20
+ } from "../lib/cloud-secrets";
21
+ import {
22
+ applyCanonicalOnboardingConfig,
23
+ type ElizaConfig,
24
+ isTimeoutError,
25
+ } from "../lib/config-like";
26
+ import { sendJson, sendJsonError } from "../lib/http";
27
+
28
+ export interface CloudRouteState {
29
+ config: ElizaConfig;
30
+ cloudManager: CloudManager | null;
31
+ /** The running agent runtime — needed to persist cloud credentials to the DB. */
32
+ runtime: AgentRuntime | null;
33
+ restartRuntime?: (reason: string) => Promise<boolean> | boolean;
34
+ services?: Partial<CloudRouteServices>;
35
+ }
36
+
37
+ type CreateIntegrationTelemetrySpan = (meta: {
38
+ boundary: "cloud";
39
+ operation: string;
40
+ timeoutMs?: number;
41
+ }) => TelemetrySpan | null | undefined;
42
+
43
+ export interface CloudRouteServices {
44
+ applyCanonicalOnboardingConfig: typeof applyCanonicalOnboardingConfig;
45
+ createIntegrationTelemetrySpan: CreateIntegrationTelemetrySpan;
46
+ handleAutonomousCloudRoute: typeof handleAutonomousCloudRoute;
47
+ normalizeCloudSiteUrl: typeof normalizeCloudSiteUrl;
48
+ saveElizaConfig: (config: ElizaConfig) => void;
49
+ validateCloudBaseUrl: typeof validateCloudBaseUrl;
50
+ }
51
+
52
+ type CloudRuntimeSecrets = Record<string, string | number | boolean>;
53
+ type ReplaceableCloudManager = NonNullable<CloudRouteState["cloudManager"]> & {
54
+ replaceApiKey?: (apiKey: string) => Promise<void>;
55
+ };
56
+ type StartableCloudRelayService = {
57
+ startRelayLoopIfReady?: () => boolean | Promise<boolean>;
58
+ };
59
+ type RelayStatusService = {
60
+ getSessionInfo?: () => {
61
+ sessionId: string | null;
62
+ organizationId: string | null;
63
+ userId: string | null;
64
+ agentName: string | null;
65
+ platform: string | null;
66
+ lastSeenAt: string | null;
67
+ status: "idle" | "registered" | "polling" | "error" | "stopped";
68
+ };
69
+ };
70
+
71
+ const CLOUD_LOGIN_POLL_TIMEOUT_MS = 10_000;
72
+ const DEFAULT_CLOUD_ROUTE_SERVICES: CloudRouteServices = {
73
+ applyCanonicalOnboardingConfig,
74
+ createIntegrationTelemetrySpan: () => undefined,
75
+ handleAutonomousCloudRoute,
76
+ normalizeCloudSiteUrl,
77
+ saveElizaConfig: () => {
78
+ logger.warn("[cloud-routes] saveConfig unavailable - config not persisted");
79
+ },
80
+ validateCloudBaseUrl,
81
+ };
82
+
83
+ async function readRouteJsonBody(
84
+ req: http.IncomingMessage,
85
+ ): Promise<Record<string, unknown>> {
86
+ const preParsed = (req as http.IncomingMessage & { body?: unknown }).body;
87
+ if (
88
+ preParsed &&
89
+ typeof preParsed === "object" &&
90
+ !Array.isArray(preParsed)
91
+ ) {
92
+ return preParsed as Record<string, unknown>;
93
+ }
94
+
95
+ const chunks: Buffer[] = [];
96
+ for await (const chunk of req) {
97
+ chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
98
+ }
99
+
100
+ const rawBody = Buffer.concat(chunks).toString("utf8").trim();
101
+ if (!rawBody) {
102
+ return {};
103
+ }
104
+
105
+ const parsed = JSON.parse(rawBody) as unknown;
106
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
107
+ throw new Error("Invalid JSON body");
108
+ }
109
+ return parsed as Record<string, unknown>;
110
+ }
111
+
112
+ /**
113
+ * Monotonic counter incremented on every `POST /api/cloud/disconnect`.
114
+ *
115
+ * WHY: We must not persist a stale "authenticated" poll after the user
116
+ * disconnects mid-flight. The previous guard (`cloud.enabled === false`)
117
+ * also matched **first-time** cloud (never enabled), so successful logins
118
+ * were discarded. Comparing epoch before/after the poll preserves the race
119
+ * fix without blocking legitimate first connect.
120
+ */
121
+ let cloudDisconnectEpoch = 0;
122
+
123
+ type TelemetrySpan = {
124
+ success: (meta?: Record<string, unknown>) => void;
125
+ failure: (meta?: Record<string, unknown>) => void;
126
+ };
127
+
128
+ function isRedirectResponse(response: Response): boolean {
129
+ return response.status >= 300 && response.status < 400;
130
+ }
131
+
132
+ function createNoopTelemetrySpan(): TelemetrySpan {
133
+ return {
134
+ success: () => {},
135
+ failure: () => {},
136
+ };
137
+ }
138
+
139
+ function getTelemetrySpan(meta: {
140
+ boundary: "cloud";
141
+ operation: string;
142
+ timeoutMs: number;
143
+ services: CloudRouteServices;
144
+ }): TelemetrySpan {
145
+ return (
146
+ meta.services.createIntegrationTelemetrySpan(meta) ??
147
+ createNoopTelemetrySpan()
148
+ );
149
+ }
150
+
151
+ async function fetchCloudLoginStatus(
152
+ sessionId: string,
153
+ baseUrl: string,
154
+ ): Promise<Response> {
155
+ return fetch(
156
+ `${baseUrl}/api/auth/cli-session/${encodeURIComponent(sessionId)}`,
157
+ {
158
+ redirect: "manual",
159
+ signal: AbortSignal.timeout(CLOUD_LOGIN_POLL_TIMEOUT_MS),
160
+ },
161
+ );
162
+ }
163
+
164
+ async function persistCloudLoginStatus(args: {
165
+ apiKey: string;
166
+ organizationId?: string;
167
+ services: CloudRouteServices;
168
+ state: CloudRouteState;
169
+ userId?: string;
170
+ /**
171
+ * From GET `/api/cloud/login/status`: epoch captured before `fetch` so a
172
+ * disconnect during the poll invalidates this result. Omitted for POST
173
+ * `/api/cloud/login/persist` (direct client push) — no race window.
174
+ */
175
+ epochAtPollStart?: number;
176
+ }): Promise<void> {
177
+ if (
178
+ args.epochAtPollStart !== undefined &&
179
+ args.epochAtPollStart !== cloudDisconnectEpoch
180
+ ) {
181
+ logger.warn(
182
+ "[cloud-login] Skipping login persist: a disconnect occurred while the login poll was in-flight",
183
+ );
184
+ return;
185
+ }
186
+
187
+ migrateLegacyRuntimeConfig(args.state.config as Record<string, unknown>);
188
+ const runtime = args.state.runtime as RuntimeCloudLike | null;
189
+ const cloudAuth = getCloudAuth(runtime);
190
+ await clearCloudAuthService(cloudAuth);
191
+
192
+ const cloud = { ...(args.state.config.cloud ?? {}) } as Record<
193
+ string,
194
+ unknown
195
+ >;
196
+
197
+ cloud.apiKey = args.apiKey;
198
+ const cloudInferenceSelected = isCloudInferenceSelectedInConfig(
199
+ args.state.config as Record<string, unknown>,
200
+ );
201
+
202
+ args.state.config.cloud = cloud as ElizaConfig["cloud"];
203
+ args.services.applyCanonicalOnboardingConfig(args.state.config, {
204
+ linkedAccounts: {
205
+ elizacloud: {
206
+ status: "linked",
207
+ source: "api-key",
208
+ },
209
+ },
210
+ });
211
+ migrateLegacyRuntimeConfig(args.state.config as Record<string, unknown>);
212
+
213
+ try {
214
+ args.services.saveElizaConfig(args.state.config);
215
+ logger.info("[cloud-login] Saved cloud API key to config file");
216
+ logger.warn(
217
+ "[cloud-login] Cloud API key is stored in cleartext in ~/.eliza/eliza.json. " +
218
+ "Ensure this file has restrictive permissions (chmod 600).",
219
+ );
220
+ } catch (saveErr) {
221
+ logger.error(
222
+ `[cloud-login] Failed to save cloud API key to config: ${
223
+ saveErr instanceof Error ? saveErr.message : String(saveErr)
224
+ }`,
225
+ );
226
+ }
227
+
228
+ clearCloudSecrets();
229
+ process.env.ELIZAOS_CLOUD_API_KEY = args.apiKey;
230
+ if (cloudInferenceSelected) {
231
+ process.env.ELIZAOS_CLOUD_ENABLED = "true";
232
+ } else {
233
+ delete process.env.ELIZAOS_CLOUD_ENABLED;
234
+ }
235
+ scrubCloudSecretsFromEnv();
236
+
237
+ const cloudManager = args.state
238
+ .cloudManager as ReplaceableCloudManager | null;
239
+ if (cloudManager && typeof cloudManager.replaceApiKey === "function") {
240
+ await cloudManager.replaceApiKey(args.apiKey);
241
+ } else if (
242
+ cloudManager &&
243
+ !cloudManager.getClient() &&
244
+ typeof cloudManager.init === "function"
245
+ ) {
246
+ await cloudManager.init();
247
+ }
248
+
249
+ if (typeof cloudAuth?.authenticateWithApiKey === "function") {
250
+ cloudAuth.authenticateWithApiKey({
251
+ apiKey: args.apiKey,
252
+ organizationId: args.organizationId,
253
+ userId: args.userId,
254
+ });
255
+ }
256
+ const relayService = (runtime?.getService("CLOUD_MANAGED_GATEWAY_RELAY") ??
257
+ runtime?.getService("cloud-managed-gateway-relay") ??
258
+ runtime?.getService(
259
+ "cloudManagedGatewayRelay",
260
+ )) as StartableCloudRelayService | null;
261
+ if (typeof relayService?.startRelayLoopIfReady === "function") {
262
+ await relayService.startRelayLoopIfReady();
263
+ }
264
+
265
+ if (!runtime || typeof runtime.updateAgent !== "function") {
266
+ return;
267
+ }
268
+
269
+ try {
270
+ const nextSecrets: CloudRuntimeSecrets = {
271
+ ...(runtime.character.secrets ?? {}),
272
+ ELIZAOS_CLOUD_API_KEY: args.apiKey,
273
+ };
274
+ if (args.userId) {
275
+ nextSecrets.ELIZA_CLOUD_USER_ID = args.userId;
276
+ nextSecrets.ELIZAOS_CLOUD_USER_ID = args.userId;
277
+ } else {
278
+ delete nextSecrets.ELIZA_CLOUD_USER_ID;
279
+ delete nextSecrets.ELIZAOS_CLOUD_USER_ID;
280
+ }
281
+ if (args.organizationId) {
282
+ nextSecrets.ELIZA_CLOUD_ORGANIZATION_ID = args.organizationId;
283
+ nextSecrets.ELIZAOS_CLOUD_ORG_ID = args.organizationId;
284
+ } else {
285
+ delete nextSecrets.ELIZA_CLOUD_ORGANIZATION_ID;
286
+ delete nextSecrets.ELIZAOS_CLOUD_ORG_ID;
287
+ }
288
+ if (cloudInferenceSelected) {
289
+ nextSecrets.ELIZAOS_CLOUD_ENABLED = "true";
290
+ } else {
291
+ delete nextSecrets.ELIZAOS_CLOUD_ENABLED;
292
+ }
293
+ runtime.character.secrets = nextSecrets;
294
+ if (typeof runtime.setSetting === "function") {
295
+ runtime.setSetting("ELIZA_CLOUD_USER_ID", args.userId ?? null);
296
+ runtime.setSetting("ELIZAOS_CLOUD_USER_ID", args.userId ?? null);
297
+ runtime.setSetting(
298
+ "ELIZA_CLOUD_ORGANIZATION_ID",
299
+ args.organizationId ?? null,
300
+ );
301
+ runtime.setSetting("ELIZAOS_CLOUD_ORG_ID", args.organizationId ?? null);
302
+ }
303
+ await runtime.updateAgent(runtime.agentId, {
304
+ secrets: { ...nextSecrets },
305
+ });
306
+ } catch (err) {
307
+ // Non-fatal: config/sealed secret persistence is enough for login continuity.
308
+ logger.warn(
309
+ `[cloud-routes] Failed to persist cloud secrets to agent DB: ${String(
310
+ err,
311
+ )}`,
312
+ );
313
+ }
314
+ }
315
+
316
+ function getCloudRouteServices(state: CloudRouteState): CloudRouteServices {
317
+ return {
318
+ ...DEFAULT_CLOUD_ROUTE_SERVICES,
319
+ ...state.services,
320
+ };
321
+ }
322
+
323
+ function toAutonomousState(
324
+ state: CloudRouteState,
325
+ services: CloudRouteServices,
326
+ ): AutonomousCloudRouteState {
327
+ return {
328
+ ...state,
329
+ saveConfig: () => services.saveElizaConfig(state.config),
330
+ createTelemetrySpan: services.createIntegrationTelemetrySpan,
331
+ };
332
+ }
333
+
334
+ export async function handleCloudRoute(
335
+ req: http.IncomingMessage,
336
+ res: http.ServerResponse,
337
+ pathname: string,
338
+ method: string,
339
+ state: CloudRouteState,
340
+ ): Promise<boolean> {
341
+ const services = getCloudRouteServices(state);
342
+
343
+ if (method === "GET" && pathname === "/api/cloud/relay-status") {
344
+ const relayService = (state.runtime?.getService(
345
+ "CLOUD_MANAGED_GATEWAY_RELAY",
346
+ ) ??
347
+ state.runtime?.getService("cloud-managed-gateway-relay") ??
348
+ state.runtime?.getService(
349
+ "cloudManagedGatewayRelay",
350
+ )) as RelayStatusService | null;
351
+
352
+ if (typeof relayService?.getSessionInfo !== "function") {
353
+ sendJson(res, {
354
+ available: false,
355
+ status: "not_registered",
356
+ reason:
357
+ "Gateway relay service not active. Connect to Eliza Cloud in Settings to enable instance routing.",
358
+ });
359
+ return true;
360
+ }
361
+
362
+ try {
363
+ sendJson(res, {
364
+ available: true,
365
+ ...relayService.getSessionInfo(),
366
+ });
367
+ } catch (error) {
368
+ sendJson(res, {
369
+ available: false,
370
+ status: "error",
371
+ reason: error instanceof Error ? error.message : String(error),
372
+ });
373
+ }
374
+ return true;
375
+ }
376
+
377
+ if (method === "POST" && pathname === "/api/cloud/disconnect") {
378
+ // Invalidate any in-flight login poll (see persistCloudLoginStatus).
379
+ cloudDisconnectEpoch++;
380
+ try {
381
+ await disconnectUnifiedCloudConnection({
382
+ cloudManager: state.cloudManager,
383
+ config: state.config,
384
+ runtime: state.runtime,
385
+ saveConfig: services.saveElizaConfig,
386
+ });
387
+ } catch (err) {
388
+ const message = err instanceof Error ? err.message : String(err);
389
+ logger.error(`[cloud/disconnect] failed: ${message}`);
390
+ sendJson(res, { ok: false, error: message }, 500);
391
+ return true;
392
+ }
393
+ sendJson(res, { ok: true, status: "disconnected" });
394
+ return true;
395
+ }
396
+
397
+ // Direct-auth persistence: the frontend authenticated directly with Eliza
398
+ // Cloud (bypassing the backend's login/status handler) and needs to push
399
+ // the API key to the backend so billing/compat routes can authenticate.
400
+ if (method === "POST" && pathname === "/api/cloud/login/persist") {
401
+ try {
402
+ const body = await readRouteJsonBody(req);
403
+ if (typeof body.apiKey !== "string" || !body.apiKey.trim()) {
404
+ sendJson(res, { ok: false, error: "apiKey is required" }, 400);
405
+ return true;
406
+ }
407
+ await persistCloudLoginStatus({
408
+ apiKey: body.apiKey.trim(),
409
+ organizationId:
410
+ typeof body.organizationId === "string"
411
+ ? body.organizationId.trim()
412
+ : undefined,
413
+ services,
414
+ state,
415
+ userId:
416
+ typeof body.userId === "string" ? body.userId.trim() : undefined,
417
+ });
418
+ sendJson(res, { ok: true });
419
+ } catch (err) {
420
+ const msg = err instanceof Error ? err.message : String(err);
421
+ logger.error(`[cloud/login/persist] Failed: ${msg}`);
422
+ sendJson(res, { ok: false, error: msg }, 500);
423
+ }
424
+ return true;
425
+ }
426
+
427
+ if (method === "GET" && pathname.startsWith("/api/cloud/login/status")) {
428
+ const url = new URL(
429
+ req.url ?? "/",
430
+ `http://${req.headers.host ?? "localhost"}`,
431
+ );
432
+ const sessionId = url.searchParams.get("sessionId");
433
+ if (!sessionId) {
434
+ sendJsonError(res, "sessionId query parameter is required", 400);
435
+ return true;
436
+ }
437
+
438
+ const baseUrl = services.normalizeCloudSiteUrl(state.config.cloud?.baseUrl);
439
+ const urlError = await services.validateCloudBaseUrl(baseUrl);
440
+ if (urlError) {
441
+ sendJsonError(res, urlError, 400);
442
+ return true;
443
+ }
444
+
445
+ const epochBeforePoll = cloudDisconnectEpoch;
446
+
447
+ const loginPollSpan = getTelemetrySpan({
448
+ boundary: "cloud",
449
+ operation: "login_poll_status",
450
+ services,
451
+ timeoutMs: CLOUD_LOGIN_POLL_TIMEOUT_MS,
452
+ });
453
+
454
+ let pollRes: Response;
455
+ try {
456
+ pollRes = await fetchCloudLoginStatus(sessionId, baseUrl);
457
+ } catch (fetchErr) {
458
+ if (isTimeoutError(fetchErr)) {
459
+ loginPollSpan.failure({ error: fetchErr, statusCode: 504 });
460
+ sendJson(res, {
461
+ status: "error",
462
+ error: "Eliza Cloud status request timed out",
463
+ }, 504);
464
+ return true;
465
+ }
466
+
467
+ loginPollSpan.failure({ error: fetchErr, statusCode: 502 });
468
+ sendJson(res, {
469
+ status: "error",
470
+ error: "Failed to reach Eliza Cloud",
471
+ }, 502);
472
+ return true;
473
+ }
474
+
475
+ if (isRedirectResponse(pollRes)) {
476
+ loginPollSpan.failure({
477
+ statusCode: pollRes.status,
478
+ errorKind: "redirect_response",
479
+ });
480
+ sendJson(res, {
481
+ status: "error",
482
+ error:
483
+ "Eliza Cloud status request was redirected; redirects are not allowed",
484
+ }, 502);
485
+ return true;
486
+ }
487
+
488
+ if (!pollRes.ok) {
489
+ loginPollSpan.failure({
490
+ statusCode: pollRes.status,
491
+ errorKind: "http_error",
492
+ });
493
+ sendJson(
494
+ res,
495
+ pollRes.status === 404
496
+ ? { status: "expired", error: "Session not found or expired" }
497
+ : {
498
+ status: "error",
499
+ error: `Eliza Cloud returned HTTP ${pollRes.status}`,
500
+ },
501
+ );
502
+ return true;
503
+ }
504
+
505
+ let data: {
506
+ apiKey?: unknown;
507
+ keyPrefix?: unknown;
508
+ organizationId?: unknown;
509
+ status?: unknown;
510
+ userId?: unknown;
511
+ };
512
+ try {
513
+ data = (await pollRes.json()) as {
514
+ apiKey?: unknown;
515
+ keyPrefix?: unknown;
516
+ organizationId?: unknown;
517
+ status?: unknown;
518
+ userId?: unknown;
519
+ };
520
+ } catch (parseErr) {
521
+ loginPollSpan.failure({ error: parseErr, statusCode: pollRes.status });
522
+ sendJson(res, {
523
+ status: "error",
524
+ error: "Eliza Cloud returned invalid JSON",
525
+ }, 502);
526
+ return true;
527
+ }
528
+
529
+ loginPollSpan.success({ statusCode: pollRes.status });
530
+
531
+ if (data.status === "authenticated" && typeof data.apiKey === "string") {
532
+ await persistCloudLoginStatus({
533
+ apiKey: data.apiKey,
534
+ organizationId:
535
+ typeof data.organizationId === "string"
536
+ ? data.organizationId
537
+ : undefined,
538
+ services,
539
+ state,
540
+ epochAtPollStart: epochBeforePoll,
541
+ userId: typeof data.userId === "string" ? data.userId : undefined,
542
+ });
543
+ sendJson(res, {
544
+ status: "authenticated",
545
+ keyPrefix:
546
+ typeof data.keyPrefix === "string" ? data.keyPrefix : undefined,
547
+ organizationId:
548
+ typeof data.organizationId === "string"
549
+ ? data.organizationId
550
+ : undefined,
551
+ token: data.apiKey,
552
+ userId: typeof data.userId === "string" ? data.userId : undefined,
553
+ });
554
+ return true;
555
+ }
556
+
557
+ sendJson(res, {
558
+ status: typeof data.status === "string" ? data.status : "error",
559
+ });
560
+ return true;
561
+ }
562
+
563
+ const result = await services.handleAutonomousCloudRoute(
564
+ req,
565
+ res,
566
+ pathname,
567
+ method,
568
+ toAutonomousState(state, services),
569
+ );
570
+
571
+ // The upstream handler writes secrets to process.env — scrub them
572
+ // immediately so they don't leak to child processes or env dumps.
573
+ scrubCloudSecretsFromEnv();
574
+
575
+ return result;
576
+ }