@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,297 @@
1
+ /**
2
+ * CloudContainerService — Manages container lifecycle through ElizaCloud API.
3
+ *
4
+ * Handles creation, listing, status polling, health monitoring, and deletion
5
+ * of ECS-backed containers. Deployments are async (CloudFormation takes 8-12
6
+ * minutes), so `waitForDeployment` polls with exponential backoff.
7
+ */
8
+
9
+ import { type IAgentRuntime, logger, Service } from "@elizaos/core";
10
+ import type {
11
+ CloudContainer,
12
+ ContainerDeleteResponse,
13
+ ContainerGetResponse,
14
+ ContainerHealthResponse,
15
+ ContainerListResponse,
16
+ CreateContainerRequest,
17
+ CreateContainerResponse,
18
+ } from "../types/cloud";
19
+ import { DEFAULT_CLOUD_CONFIG } from "../types/cloud";
20
+ import type { CloudApiClient } from "../utils/cloud-api";
21
+ import type { CloudAuthService } from "./cloud-auth";
22
+
23
+ /** Active containers tracked locally for quick access. */
24
+ interface TrackedContainer {
25
+ container: CloudContainer;
26
+ pollingTimer: ReturnType<typeof setTimeout> | null;
27
+ healthTimer: ReturnType<typeof setInterval> | null;
28
+ }
29
+
30
+ export class CloudContainerService extends Service {
31
+ static serviceType = "CLOUD_CONTAINER";
32
+ capabilityDescription = "ElizaCloud container provisioning and lifecycle management";
33
+
34
+ private authService!: CloudAuthService;
35
+ private readonly containerDefaults = DEFAULT_CLOUD_CONFIG.container;
36
+ private tracked: Map<string, TrackedContainer> = new Map();
37
+
38
+ static async start(runtime: IAgentRuntime): Promise<Service> {
39
+ const service = new CloudContainerService(runtime);
40
+ await service.initialize();
41
+ return service;
42
+ }
43
+
44
+ async stop(): Promise<void> {
45
+ for (const [, tracked] of this.tracked) {
46
+ if (tracked.pollingTimer) clearTimeout(tracked.pollingTimer);
47
+ if (tracked.healthTimer) clearInterval(tracked.healthTimer);
48
+ }
49
+ this.tracked.clear();
50
+ }
51
+
52
+ private async initialize(): Promise<void> {
53
+ // Get auth service reference
54
+ const auth = this.runtime.getService("CLOUD_AUTH");
55
+ if (!auth) {
56
+ logger.debug(
57
+ "[CloudContainer] CloudAuthService not available, container operations will fail"
58
+ );
59
+ return;
60
+ }
61
+ this.authService = auth as CloudAuthService;
62
+
63
+ // Load existing containers
64
+ if (this.authService.isAuthenticated()) {
65
+ const containers = await this.listContainers();
66
+ for (const container of containers) {
67
+ this.tracked.set(container.id, {
68
+ container,
69
+ pollingTimer: null,
70
+ healthTimer: null,
71
+ });
72
+
73
+ // Resume polling for containers that are still deploying
74
+ if (
75
+ container.status === "pending" ||
76
+ container.status === "building" ||
77
+ container.status === "deploying"
78
+ ) {
79
+ this.startPolling(container.id);
80
+ }
81
+
82
+ // Start health monitoring for running containers
83
+ if (container.status === "running") {
84
+ this.startHealthMonitoring(container.id);
85
+ }
86
+ }
87
+ logger.info(`[CloudContainer] Loaded ${containers.length} existing container(s)`);
88
+ }
89
+ }
90
+
91
+ private getClient(): CloudApiClient {
92
+ return this.authService.getClient();
93
+ }
94
+
95
+ // ─── CRUD ───────────────────────────────────────────────────────────────
96
+
97
+ async createContainer(request: CreateContainerRequest): Promise<CreateContainerResponse> {
98
+ const client = this.getClient();
99
+ const defaults = this.containerDefaults;
100
+
101
+ const payload: Record<string, unknown> = {
102
+ name: request.name,
103
+ project_name: request.project_name,
104
+ description: request.description,
105
+ port: request.port ?? defaults.defaultPort,
106
+ desired_count: request.desired_count ?? 1,
107
+ cpu: request.cpu ?? defaults.defaultCpu,
108
+ memory: request.memory ?? defaults.defaultMemory,
109
+ environment_vars: request.environment_vars ?? {},
110
+ health_check_path: request.health_check_path ?? "/health",
111
+ ecr_image_uri: request.ecr_image_uri,
112
+ ecr_repository_uri: request.ecr_repository_uri,
113
+ image_tag: request.image_tag,
114
+ architecture: request.architecture ?? defaults.defaultArchitecture,
115
+ };
116
+
117
+ const response = await client.post<CreateContainerResponse>("/containers", payload);
118
+
119
+ // Track the new container
120
+ this.tracked.set(response.data.id, {
121
+ container: response.data,
122
+ pollingTimer: null,
123
+ healthTimer: null,
124
+ });
125
+
126
+ // Start polling for deployment completion
127
+ this.startPolling(response.data.id);
128
+
129
+ logger.info(
130
+ `[CloudContainer] Created container "${request.name}" (id=${response.data.id}, stack=${response.stackName})`
131
+ );
132
+
133
+ return response;
134
+ }
135
+
136
+ async listContainers(): Promise<CloudContainer[]> {
137
+ const client = this.getClient();
138
+ const response = await client.get<ContainerListResponse>("/containers");
139
+ return response.data;
140
+ }
141
+
142
+ async getContainer(containerId: string): Promise<CloudContainer> {
143
+ const client = this.getClient();
144
+ const response = await client.get<ContainerGetResponse>(`/containers/${containerId}`);
145
+
146
+ // Update local tracking
147
+ const existing = this.tracked.get(containerId);
148
+ if (existing) {
149
+ existing.container = response.data;
150
+ }
151
+
152
+ return response.data;
153
+ }
154
+
155
+ async deleteContainer(containerId: string): Promise<void> {
156
+ const client = this.getClient();
157
+ await client.delete<ContainerDeleteResponse>(`/containers/${containerId}`);
158
+
159
+ // Stop tracking
160
+ const tracked = this.tracked.get(containerId);
161
+ if (tracked) {
162
+ if (tracked.pollingTimer) clearTimeout(tracked.pollingTimer);
163
+ if (tracked.healthTimer) clearInterval(tracked.healthTimer);
164
+ this.tracked.delete(containerId);
165
+ }
166
+
167
+ logger.info(`[CloudContainer] Deleted container ${containerId}`);
168
+ }
169
+
170
+ // ─── Deployment Polling ────────────────────────────────────────────────
171
+
172
+ /**
173
+ * Poll container status until it reaches a terminal state (running, failed, stopped).
174
+ * Uses exponential backoff: 5s, 10s, 20s, 30s, 30s, ...
175
+ */
176
+ private startPolling(containerId: string): void {
177
+ const tracked = this.tracked.get(containerId);
178
+ if (!tracked) return;
179
+
180
+ let attempt = 0;
181
+ const maxAttempts = 120; // ~1 hour with backoff
182
+ const baseInterval = 5_000;
183
+ const maxInterval = 30_000;
184
+
185
+ const poll = async () => {
186
+ attempt++;
187
+ if (attempt > maxAttempts) {
188
+ logger.error(
189
+ `[CloudContainer] Polling timed out for container ${containerId} after ${maxAttempts} attempts`
190
+ );
191
+ return;
192
+ }
193
+
194
+ const container = await this.getContainer(containerId);
195
+ const status = container.status;
196
+
197
+ logger.debug(`[CloudContainer] Poll #${attempt} for ${containerId}: status=${status}`);
198
+
199
+ if (status === "running") {
200
+ logger.info(
201
+ `[CloudContainer] Container ${containerId} is now running at ${container.load_balancer_url}`
202
+ );
203
+ this.startHealthMonitoring(containerId);
204
+ return;
205
+ }
206
+
207
+ if (status === "failed" || status === "stopped" || status === "suspended") {
208
+ logger.warn(`[CloudContainer] Container ${containerId} reached terminal state: ${status}`);
209
+ if (container.error_message) {
210
+ logger.error(`[CloudContainer] Error: ${container.error_message}`);
211
+ }
212
+ return;
213
+ }
214
+
215
+ // Schedule next poll with exponential backoff
216
+ const delay = Math.min(baseInterval * 2 ** Math.min(attempt - 1, 3), maxInterval);
217
+ tracked.pollingTimer = setTimeout(poll, delay);
218
+ };
219
+
220
+ tracked.pollingTimer = setTimeout(poll, baseInterval);
221
+ }
222
+
223
+ /**
224
+ * Wait for a container to reach "running" status. Returns the updated container.
225
+ * This is the synchronous API for actions that need to block.
226
+ */
227
+ async waitForDeployment(containerId: string, timeoutMs = 900_000): Promise<CloudContainer> {
228
+ const deadline = Date.now() + timeoutMs;
229
+ let interval = 5_000;
230
+ const maxInterval = 30_000;
231
+
232
+ while (Date.now() < deadline) {
233
+ const container = await this.getContainer(containerId);
234
+
235
+ if (container.status === "running") return container;
236
+ if (container.status === "failed") {
237
+ throw new Error(
238
+ `Container deployment failed: ${container.error_message ?? "unknown error"}`
239
+ );
240
+ }
241
+ if (container.status === "stopped" || container.status === "suspended") {
242
+ throw new Error(`Container reached terminal state: ${container.status}`);
243
+ }
244
+
245
+ await new Promise((resolve) => setTimeout(resolve, interval));
246
+ interval = Math.min(interval * 1.5, maxInterval);
247
+ }
248
+
249
+ throw new Error(`Container deployment timed out after ${Math.round(timeoutMs / 1000)}s`);
250
+ }
251
+
252
+ // ─── Health Monitoring ─────────────────────────────────────────────────
253
+
254
+ private startHealthMonitoring(containerId: string): void {
255
+ const tracked = this.tracked.get(containerId);
256
+ if (!tracked || tracked.healthTimer) return;
257
+
258
+ const interval = 60_000; // Check every 60 seconds
259
+
260
+ tracked.healthTimer = setInterval(() => {
261
+ this.getContainerHealth(containerId)
262
+ .then((health) => {
263
+ if (!health.data.healthy) {
264
+ logger.warn(
265
+ `[CloudContainer] Container ${containerId} unhealthy: ${health.data.status}`
266
+ );
267
+ }
268
+ })
269
+ .catch((err: Error) => {
270
+ logger.error(`[CloudContainer] Health check failed for ${containerId}: ${err.message}`);
271
+ });
272
+ }, interval);
273
+ }
274
+
275
+ async getContainerHealth(containerId: string): Promise<ContainerHealthResponse> {
276
+ const client = this.getClient();
277
+ return client.get<ContainerHealthResponse>(`/containers/${containerId}/health`);
278
+ }
279
+
280
+ // ─── Accessors ─────────────────────────────────────────────────────────
281
+
282
+ getTrackedContainers(): CloudContainer[] {
283
+ return Array.from(this.tracked.values()).map((t) => t.container);
284
+ }
285
+
286
+ getTrackedContainer(containerId: string): CloudContainer | undefined {
287
+ return this.tracked.get(containerId)?.container;
288
+ }
289
+
290
+ isContainerRunning(containerId: string): boolean {
291
+ return this.tracked.get(containerId)?.container.status === "running";
292
+ }
293
+
294
+ getContainerUrl(containerId: string): string | null {
295
+ return this.tracked.get(containerId)?.container.load_balancer_url ?? null;
296
+ }
297
+ }
@@ -0,0 +1,210 @@
1
+ /**
2
+ * CloudCredentialProvider — bridges plugin-workflow's `CredentialProvider`
3
+ * service slot to Eliza Cloud's per-connector OAuth surface.
4
+ *
5
+ * Resolution path on `resolve(userId, credType)`:
6
+ * 1. Look up `credType` in `credTypeToConnector` — return `null` for unmapped.
7
+ * 2. GET `/eliza/<connector>/status` via the authenticated cloud client to
8
+ * check whether the user already has an active connection.
9
+ * 3. When connected → see `RAW_TOKEN_GAP` below; we currently return
10
+ * `needs_auth` because the cloud does not expose raw OAuth tokens.
11
+ * 4. When not connected → POST `/eliza/<connector>/connect/initiate` with
12
+ * the mapped `capabilities`; return `needs_auth` with the authUrl the
13
+ * cloud issued. The workflow plugin surfaces this to the user.
14
+ *
15
+ * RAW_TOKEN_GAP
16
+ * -------------
17
+ * Plugin-workflow's `credential_data` shape requires the actual access token
18
+ * (so the workflow engine can inject it into a node's HTTP calls). The cloud
19
+ * connector endpoints (Google / GitHub / Discord) intentionally do **not**
20
+ * vend raw tokens to the local plugin — they hold the token server-side and
21
+ * proxy connector calls under `/eliza/<connector>/<action>` (e.g.
22
+ * `/eliza/google/gmail/send`). Bridging that proxy model into the workflow
23
+ * engine is a separate piece of work (either: extend the workflow engine to
24
+ * dispatch through cloud proxies, or add a token-vending endpoint cloud-side
25
+ * for clients with a verified pairing). Until then this provider is honest:
26
+ * it confirms the connection exists and either reports it cannot inject
27
+ * (`null` / `needs_auth`) or — once the cloud exposes a vending endpoint —
28
+ * fetches and returns the credential payload.
29
+ *
30
+ * No fallbacks. No fake tokens. The provider fails closed.
31
+ */
32
+
33
+ import { type IAgentRuntime, logger, Service } from "@elizaos/core";
34
+ import { credTypeToConnector, supportedCredTypes } from "../lib/credential-type-map";
35
+ import type { CloudAuthLike } from "../lib/cloud-connection";
36
+
37
+ // Inlined to avoid a hard compile-time dep on @elizaos/plugin-workflow.
38
+ // The runtime duck-types the service via the shared service-type string.
39
+ const WORKFLOW_CREDENTIAL_PROVIDER_TYPE = "workflow_credential_provider";
40
+
41
+ export type CredentialProviderResult =
42
+ | { status: "credential_data"; data: Record<string, unknown> }
43
+ | { status: "needs_auth"; authUrl: string }
44
+ | null;
45
+
46
+ export interface CheckCredentialTypesResult {
47
+ supported: string[];
48
+ unsupported: string[];
49
+ }
50
+
51
+ interface CloudConnectorStatus {
52
+ connected: boolean;
53
+ reason?: string;
54
+ authUrl?: string;
55
+ }
56
+
57
+ interface CloudConnectInitiateResponse {
58
+ authUrl?: string;
59
+ }
60
+
61
+ interface CloudClientLike {
62
+ get?: (path: string) => Promise<unknown>;
63
+ post?: (path: string, body?: unknown) => Promise<unknown>;
64
+ }
65
+
66
+ function isCloudAuthLike(value: unknown): value is CloudAuthLike {
67
+ if (!value || typeof value !== "object") {
68
+ return false;
69
+ }
70
+ return typeof Reflect.get(value, "getClient") === "function";
71
+ }
72
+
73
+ function isCloudClientLike(value: unknown): value is CloudClientLike {
74
+ if (!value || typeof value !== "object") {
75
+ return false;
76
+ }
77
+ const get = Reflect.get(value, "get");
78
+ const post = Reflect.get(value, "post");
79
+ return (
80
+ (get === undefined || typeof get === "function") &&
81
+ (post === undefined || typeof post === "function")
82
+ );
83
+ }
84
+
85
+ export class CloudCredentialProvider extends Service {
86
+ static override readonly serviceType = WORKFLOW_CREDENTIAL_PROVIDER_TYPE;
87
+
88
+ override capabilityDescription =
89
+ "Resolves workflow node credentials via the user's paired Eliza Cloud account.";
90
+
91
+ static async start(runtime: IAgentRuntime): Promise<CloudCredentialProvider> {
92
+ return new CloudCredentialProvider(runtime);
93
+ }
94
+
95
+ override async stop(): Promise<void> {
96
+ // No-op: holds no per-instance state.
97
+ }
98
+
99
+ async resolve(_userId: string, credType: string): Promise<CredentialProviderResult> {
100
+ const mapping = credTypeToConnector.get(credType);
101
+ if (!mapping) {
102
+ return null;
103
+ }
104
+
105
+ const client = this.getCloudClient();
106
+ if (!client) {
107
+ logger.debug(
108
+ { src: "plugin:elizacloud:credential-provider", credType },
109
+ "CLOUD_AUTH unavailable — cannot resolve workflow credentials",
110
+ );
111
+ return null;
112
+ }
113
+
114
+ const status = await this.fetchConnectorStatus(client, mapping.connector);
115
+
116
+ if (!status.connected) {
117
+ const authUrl =
118
+ status.authUrl ??
119
+ (await this.initiateConnectorAuth(client, mapping.connector, mapping.capabilities));
120
+ if (!authUrl) {
121
+ return null;
122
+ }
123
+ return { status: "needs_auth", authUrl };
124
+ }
125
+
126
+ // Connected, but the cloud does not expose raw tokens — see RAW_TOKEN_GAP
127
+ // in the file header. We re-prompt for explicit user-side auth so the
128
+ // workflow plugin reports "missing connection" instead of silently
129
+ // injecting a stale or empty credential. When the cloud adds a token
130
+ // vending endpoint, fetch + return `credential_data` here.
131
+ const reauthUrl = await this.initiateConnectorAuth(
132
+ client,
133
+ mapping.connector,
134
+ mapping.capabilities,
135
+ );
136
+ if (reauthUrl) {
137
+ return { status: "needs_auth", authUrl: reauthUrl };
138
+ }
139
+ return null;
140
+ }
141
+
142
+ checkCredentialTypes(credTypes: string[]): CheckCredentialTypesResult {
143
+ const supported: string[] = [];
144
+ const unsupported: string[] = [];
145
+ for (const t of credTypes) {
146
+ if (supportedCredTypes.has(t)) {
147
+ supported.push(t);
148
+ } else {
149
+ unsupported.push(t);
150
+ }
151
+ }
152
+ return { supported, unsupported };
153
+ }
154
+
155
+ // ─── internals ───────────────────────────────────────────────────────
156
+
157
+ private getCloudClient(): CloudClientLike | null {
158
+ const cloudAuth = this.runtime.getService("CLOUD_AUTH");
159
+ if (!isCloudAuthLike(cloudAuth)) {
160
+ return null;
161
+ }
162
+ const client = cloudAuth.getClient?.();
163
+ if (!isCloudClientLike(client)) {
164
+ return null;
165
+ }
166
+ return client;
167
+ }
168
+
169
+ private async fetchConnectorStatus(
170
+ client: CloudClientLike,
171
+ connector: string,
172
+ ): Promise<CloudConnectorStatus> {
173
+ if (typeof client.get !== "function") {
174
+ return { connected: false };
175
+ }
176
+ const raw = await client.get(`/eliza/${connector}/status`);
177
+ return shapeConnectorStatus(raw);
178
+ }
179
+
180
+ private async initiateConnectorAuth(
181
+ client: CloudClientLike,
182
+ connector: string,
183
+ capabilities: readonly string[] | undefined,
184
+ ): Promise<string | null> {
185
+ if (typeof client.post !== "function") {
186
+ return null;
187
+ }
188
+ const body: Record<string, unknown> = {};
189
+ if (capabilities && capabilities.length > 0) {
190
+ body.capabilities = [...capabilities];
191
+ }
192
+ const raw = (await client.post(
193
+ `/eliza/${connector}/connect/initiate`,
194
+ body,
195
+ )) as CloudConnectInitiateResponse | null;
196
+ const authUrl = raw?.authUrl;
197
+ return typeof authUrl === "string" && authUrl.length > 0 ? authUrl : null;
198
+ }
199
+ }
200
+
201
+ function shapeConnectorStatus(raw: unknown): CloudConnectorStatus {
202
+ if (!raw || typeof raw !== "object") {
203
+ return { connected: false };
204
+ }
205
+ const obj = raw as Record<string, unknown>;
206
+ const connected = obj.connected === true;
207
+ const reason = typeof obj.reason === "string" ? obj.reason : undefined;
208
+ const authUrl = typeof obj.authUrl === "string" ? obj.authUrl : undefined;
209
+ return { connected, reason, authUrl };
210
+ }