@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,363 @@
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/types/cloud.ts
20
+ import {
21
+ CloudApiError,
22
+ InsufficientCreditsError
23
+ } from "@elizaos/cloud-sdk";
24
+ var DEFAULT_CLOUD_CONFIG = {
25
+ enabled: false,
26
+ baseUrl: "https://www.elizacloud.ai/api/v1",
27
+ inferenceMode: "cloud",
28
+ autoProvision: false,
29
+ bridge: {
30
+ reconnectIntervalMs: 3000,
31
+ maxReconnectAttempts: 20,
32
+ heartbeatIntervalMs: 30000
33
+ },
34
+ backup: {
35
+ autoBackupIntervalMs: 3600000,
36
+ maxSnapshots: 10
37
+ },
38
+ container: {
39
+ defaultImage: "elizaos/agent:latest",
40
+ defaultArchitecture: "arm64",
41
+ defaultCpu: 1792,
42
+ defaultMemory: 1792,
43
+ defaultPort: 3000
44
+ }
45
+ };
46
+
47
+ // src/utils/cloud-api.ts
48
+ import {
49
+ CloudApiClient,
50
+ CloudApiError as CloudApiError2,
51
+ ElizaCloudHttpClient,
52
+ InsufficientCreditsError as InsufficientCreditsError2
53
+ } from "@elizaos/cloud-sdk";
54
+
55
+ // src/services/cloud-auth.ts
56
+ import {
57
+ logger,
58
+ Service,
59
+ resolveApiSecurityConfig,
60
+ resolveDesktopApiPort
61
+ } from "@elizaos/core";
62
+ import { createRemoteJWKSet, jwtVerify } from "jose";
63
+ async function deriveDeviceId() {
64
+ const os = await import("node:os");
65
+ const crypto = await import("node:crypto");
66
+ const cpus = os.cpus();
67
+ const raw = [
68
+ os.hostname(),
69
+ os.platform(),
70
+ os.arch(),
71
+ cpus[0]?.model ?? "?",
72
+ cpus.length,
73
+ os.totalmem()
74
+ ].join(":");
75
+ return crypto.createHash("sha256").update(raw).digest("hex");
76
+ }
77
+ function detectPlatform() {
78
+ if (typeof process === "undefined")
79
+ return "web";
80
+ const map = {
81
+ darwin: "macos",
82
+ win32: "windows",
83
+ linux: "linux"
84
+ };
85
+ return map[process.platform] ?? "linux";
86
+ }
87
+ function readEnvKey(env, key) {
88
+ const value = env[key];
89
+ if (typeof value !== "string")
90
+ return null;
91
+ const trimmed = value.trim();
92
+ return trimmed.length > 0 ? trimmed : null;
93
+ }
94
+ function processEnv() {
95
+ if (typeof process === "undefined")
96
+ return {};
97
+ return process.env;
98
+ }
99
+ function defaultRedirectUri(env) {
100
+ const security = resolveApiSecurityConfig(env);
101
+ const port = resolveDesktopApiPort(env);
102
+ const scheme = security.isLoopbackBind ? "http" : "https";
103
+ const host = security.bindHost.startsWith("[") ? security.bindHost : security.bindHost.includes(":") && !security.bindHost.startsWith("[") ? `[${security.bindHost}]` : security.bindHost;
104
+ return `${scheme}://${host}:${port}/api/auth/login/sso/callback`;
105
+ }
106
+ function getSsoRedirectUrl(bootstrap, args) {
107
+ const env = args.env ?? processEnv();
108
+ const clientId = args.clientId ?? readEnvKey(env, "ELIZA_CLOUD_CLIENT_ID");
109
+ if (!clientId) {
110
+ throw new Error("ELIZA_CLOUD_CLIENT_ID is not configured — cannot start Eliza Cloud SSO");
111
+ }
112
+ if (args.state.length === 0) {
113
+ throw new Error("getSsoRedirectUrl requires a non-empty state nonce");
114
+ }
115
+ const issuer = bootstrap.getExpectedIssuer();
116
+ const redirectUri = defaultRedirectUri(env);
117
+ const params = new URLSearchParams;
118
+ params.set("response_type", "code");
119
+ params.set("client_id", clientId);
120
+ params.set("redirect_uri", redirectUri);
121
+ params.set("scope", "openid profile");
122
+ params.set("state", args.state);
123
+ if (args.returnTo) {
124
+ params.set("eliza_return_to", args.returnTo);
125
+ }
126
+ return `${issuer}/oauth/authorize?${params.toString()}`;
127
+ }
128
+ function shapeIdTokenClaims(payload) {
129
+ if (typeof payload.iss !== "string" || payload.iss.length === 0) {
130
+ throw new Error("id_token missing issuer claim");
131
+ }
132
+ if (typeof payload.sub !== "string" || payload.sub.length === 0) {
133
+ throw new Error("id_token missing sub claim");
134
+ }
135
+ if (typeof payload.aud !== "string" && !(Array.isArray(payload.aud) && payload.aud.every((value) => typeof value === "string"))) {
136
+ throw new Error("id_token missing or malformed aud claim");
137
+ }
138
+ if (typeof payload.exp !== "number" || !Number.isFinite(payload.exp)) {
139
+ throw new Error("id_token missing exp claim");
140
+ }
141
+ if (typeof payload.iat !== "number" || !Number.isFinite(payload.iat)) {
142
+ throw new Error("id_token missing iat claim");
143
+ }
144
+ if (typeof payload.email !== "string" || payload.email.length === 0) {
145
+ throw new Error("id_token missing email claim — Eliza Cloud SSO requires it");
146
+ }
147
+ if (typeof payload.name !== "string" || payload.name.length === 0) {
148
+ throw new Error("id_token missing name claim — Eliza Cloud SSO requires it");
149
+ }
150
+ const extra = {};
151
+ for (const [key, value] of Object.entries(payload)) {
152
+ if (key !== "iss" && key !== "sub" && key !== "aud" && key !== "exp" && key !== "iat" && key !== "email" && key !== "email_verified" && key !== "name" && key !== "picture") {
153
+ extra[key] = value;
154
+ }
155
+ }
156
+ return {
157
+ iss: payload.iss,
158
+ sub: payload.sub,
159
+ aud: payload.aud,
160
+ exp: payload.exp,
161
+ iat: payload.iat,
162
+ email: payload.email,
163
+ email_verified: typeof payload.email_verified === "boolean" ? payload.email_verified : undefined,
164
+ name: payload.name,
165
+ picture: typeof payload.picture === "string" ? payload.picture : undefined,
166
+ extra
167
+ };
168
+ }
169
+ function shapeTokenResponse(payload) {
170
+ if (!payload || typeof payload !== "object") {
171
+ throw new Error("Eliza Cloud token endpoint returned a non-object body");
172
+ }
173
+ const raw = payload;
174
+ if (typeof raw.id_token !== "string" || raw.id_token.length === 0) {
175
+ throw new Error("Eliza Cloud token endpoint did not return an id_token");
176
+ }
177
+ return { idToken: raw.id_token };
178
+ }
179
+ async function exchangeCodeForSession(args) {
180
+ if (args.code.length === 0) {
181
+ throw new Error("exchangeCodeForSession requires a non-empty code");
182
+ }
183
+ if (!args.state || !args.expectedState || args.state !== args.expectedState) {
184
+ throw new Error("Eliza Cloud SSO state mismatch — refusing to exchange code (possible CSRF)");
185
+ }
186
+ const env = args.env ?? processEnv();
187
+ const clientId = readEnvKey(env, "ELIZA_CLOUD_CLIENT_ID");
188
+ if (!clientId) {
189
+ throw new Error("ELIZA_CLOUD_CLIENT_ID is not configured — cannot complete Eliza Cloud SSO");
190
+ }
191
+ const clientSecret = readEnvKey(env, "ELIZA_CLOUD_CLIENT_SECRET");
192
+ if (!clientSecret) {
193
+ throw new Error("ELIZA_CLOUD_CLIENT_SECRET is not configured — cannot complete Eliza Cloud SSO");
194
+ }
195
+ const issuer = args.bootstrap.getExpectedIssuer();
196
+ const redirectUri = args.redirectUri ?? defaultRedirectUri(env);
197
+ const tokenUrl = `${issuer}/oauth/token`;
198
+ const fetchImpl = args.fetchImpl ?? fetch;
199
+ const body = new URLSearchParams;
200
+ body.set("grant_type", "authorization_code");
201
+ body.set("code", args.code);
202
+ body.set("redirect_uri", redirectUri);
203
+ body.set("client_id", clientId);
204
+ body.set("client_secret", clientSecret);
205
+ const response = await fetchImpl(tokenUrl, {
206
+ method: "POST",
207
+ headers: {
208
+ "content-type": "application/x-www-form-urlencoded",
209
+ accept: "application/json"
210
+ },
211
+ body: body.toString()
212
+ });
213
+ if (!response.ok) {
214
+ throw new Error(`Eliza Cloud token endpoint returned HTTP ${response.status} for code exchange`);
215
+ }
216
+ const payload = await response.json();
217
+ const { idToken } = shapeTokenResponse(payload);
218
+ const jwksUrl = args.bootstrap.getJwksUrl();
219
+ const remoteJwks = createRemoteJWKSet(new URL(jwksUrl));
220
+ const verified = await jwtVerify(idToken, remoteJwks, {
221
+ algorithms: ["RS256"],
222
+ issuer,
223
+ audience: clientId
224
+ });
225
+ const claims = shapeIdTokenClaims(verified.payload);
226
+ return {
227
+ cloudUserId: claims.sub,
228
+ email: claims.email,
229
+ displayName: claims.name,
230
+ claims
231
+ };
232
+ }
233
+
234
+ class CloudAuthService extends Service {
235
+ static serviceType = "CLOUD_AUTH";
236
+ capabilityDescription = "Eliza Cloud device authentication and SSO session helpers";
237
+ client;
238
+ credentials = null;
239
+ constructor(runtime) {
240
+ super(runtime);
241
+ this.client = new CloudApiClient(DEFAULT_CLOUD_CONFIG.baseUrl);
242
+ }
243
+ static async start(runtime) {
244
+ const service = new CloudAuthService(runtime);
245
+ await service.initialize();
246
+ return service;
247
+ }
248
+ async stop() {
249
+ this.credentials = null;
250
+ }
251
+ async initialize() {
252
+ const baseUrl = String(this.runtime.getSetting("ELIZAOS_CLOUD_BASE_URL") ?? DEFAULT_CLOUD_CONFIG.baseUrl);
253
+ this.client.setBaseUrl(baseUrl);
254
+ const existingKey = this.runtime.getSetting("ELIZAOS_CLOUD_API_KEY");
255
+ if (existingKey) {
256
+ const key = String(existingKey);
257
+ this.client.setApiKey(key);
258
+ this.credentials = {
259
+ apiKey: key,
260
+ userId: String(this.runtime.getSetting("ELIZAOS_CLOUD_USER_ID") ?? ""),
261
+ organizationId: String(this.runtime.getSetting("ELIZAOS_CLOUD_ORG_ID") ?? this.runtime.getSetting("ELIZA_CLOUD_ORGANIZATION_ID") ?? ""),
262
+ authenticatedAt: Date.now()
263
+ };
264
+ logger.info("[CloudAuth] Authenticated with saved API key");
265
+ this.validateApiKey(key).then((valid) => {
266
+ if (!valid) {
267
+ logger.warn("[CloudAuth] Saved API key could not be validated (cloud may be unreachable or key revoked) — model calls will use the key anyway");
268
+ }
269
+ }).catch(() => {});
270
+ return;
271
+ }
272
+ const enabled = this.runtime.getSetting("ELIZAOS_CLOUD_ENABLED");
273
+ if (enabled === "true" || enabled === "1") {
274
+ try {
275
+ await this.authenticateWithDevice();
276
+ } catch (err) {
277
+ const msg = err instanceof Error ? err.message : String(err);
278
+ logger.warn(`[CloudAuth] Device auth failed (cloud may be unreachable): ${msg}`);
279
+ logger.info("[CloudAuth] Service will start unauthenticated — cloud features disabled until connectivity is restored");
280
+ }
281
+ } else {
282
+ logger.info("[CloudAuth] Cloud not enabled (set ELIZAOS_CLOUD_ENABLED=true)");
283
+ }
284
+ }
285
+ async validateApiKey(key) {
286
+ try {
287
+ const validationClient = new CloudApiClient(this.client.getBaseUrl(), key);
288
+ await validationClient.get("/models", { timeoutMs: 1e4 });
289
+ return true;
290
+ } catch (err) {
291
+ const msg = err instanceof Error ? err.message : String(err);
292
+ logger.warn(`[CloudAuth] Could not reach cloud API to validate key: ${msg}`);
293
+ return false;
294
+ }
295
+ }
296
+ async authenticateWithDevice() {
297
+ const deviceId = await deriveDeviceId();
298
+ const platform = detectPlatform();
299
+ const appVersion = process.env.ELIZAOS_CLOUD_APP_VERSION ?? "2.0.0-beta.0";
300
+ const os = await import("node:os");
301
+ logger.info(`[CloudAuth] Authenticating device (platform=${platform})`);
302
+ const response = await this.client.postUnauthenticated("/device-auth", {
303
+ deviceId,
304
+ platform,
305
+ appVersion,
306
+ deviceName: os.hostname()
307
+ });
308
+ this.credentials = {
309
+ apiKey: response.data.apiKey,
310
+ userId: response.data.userId,
311
+ organizationId: response.data.organizationId,
312
+ authenticatedAt: Date.now()
313
+ };
314
+ this.client.setApiKey(response.data.apiKey);
315
+ const action = response.data.isNew ? "New account created" : "Authenticated";
316
+ logger.info(`[CloudAuth] ${action} (credits: $${response.data.credits.toFixed(2)})`);
317
+ return this.credentials;
318
+ }
319
+ authenticateWithApiKey(input) {
320
+ const apiKey = input.apiKey.trim();
321
+ if (!apiKey) {
322
+ throw new Error("Eliza Cloud API key is required");
323
+ }
324
+ this.client.setApiKey(apiKey);
325
+ this.credentials = {
326
+ apiKey,
327
+ userId: input.userId ?? "",
328
+ organizationId: input.organizationId ?? "",
329
+ authenticatedAt: Date.now()
330
+ };
331
+ logger.info("[CloudAuth] Authenticated with API key");
332
+ return this.credentials;
333
+ }
334
+ clearAuth() {
335
+ this.credentials = null;
336
+ this.client.setApiKey(undefined);
337
+ }
338
+ isAuthenticated() {
339
+ return this.credentials !== null;
340
+ }
341
+ getCredentials() {
342
+ return this.credentials;
343
+ }
344
+ getApiKey() {
345
+ return this.credentials?.apiKey ?? this.client.getApiKey();
346
+ }
347
+ getClient() {
348
+ return this.client;
349
+ }
350
+ getUserId() {
351
+ return this.credentials?.userId;
352
+ }
353
+ getOrganizationId() {
354
+ return this.credentials?.organizationId;
355
+ }
356
+ }
357
+ export {
358
+ getSsoRedirectUrl,
359
+ exchangeCodeForSession,
360
+ CloudAuthService
361
+ };
362
+
363
+ //# debugId=500754D72B6C3D2B64756E2164756E21
@@ -0,0 +1,12 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/types/cloud.ts", "../src/utils/cloud-api.ts", "../src/services/cloud-auth.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Cloud-specific types for ElizaCloud integration.\n *\n * These types mirror the eliza-cloud-v2 database schemas and API contracts\n * for containers, auth, credits, bridge messaging, and agent state snapshots.\n */\n\n// ─── Container Types ────────────────────────────────────────────────────────\n\nexport type ContainerStatus =\n | \"pending\"\n | \"building\"\n | \"deploying\"\n | \"running\"\n | \"stopped\"\n | \"failed\"\n | \"suspended\";\n\nexport type ContainerBillingStatus =\n | \"active\"\n | \"warning\"\n | \"suspended\"\n | \"shutdown_pending\"\n | \"archived\";\n\nexport type ContainerArchitecture = \"arm64\" | \"x86_64\";\n\nexport interface CloudContainer {\n id: string;\n name: string;\n project_name: string;\n description: string | null;\n organization_id: string;\n user_id: string;\n status: ContainerStatus;\n image_tag: string | null;\n port: number;\n desired_count: number;\n cpu: number;\n memory: number;\n architecture: ContainerArchitecture;\n environment_vars: Record<string, string>;\n health_check_path: string;\n load_balancer_url: string | null;\n ecr_repository_uri: string | null;\n ecr_image_tag: string | null;\n cloudformation_stack_name: string | null;\n billing_status: ContainerBillingStatus;\n total_billed: string;\n last_deployed_at: string | null;\n last_health_check: string | null;\n deployment_log: string | null;\n error_message: string | null;\n metadata: Record<string, unknown>;\n created_at: string;\n updated_at: string;\n}\n\nexport interface CreateContainerRequest {\n name: string;\n project_name: string;\n description?: string;\n port?: number;\n desired_count?: number;\n cpu?: number;\n memory?: number;\n environment_vars?: Record<string, string>;\n health_check_path?: string;\n ecr_image_uri: string;\n ecr_repository_uri?: string;\n image_tag?: string;\n architecture?: ContainerArchitecture;\n}\n\nexport interface CreateContainerResponse {\n success: boolean;\n data: CloudContainer;\n message: string;\n creditsDeducted: number;\n creditsRemaining: number;\n stackName: string;\n polling: {\n endpoint: string;\n intervalMs: number;\n expectedDurationMs: number;\n };\n}\n\nexport interface ContainerListResponse {\n success: boolean;\n data: CloudContainer[];\n}\n\nexport interface ContainerGetResponse {\n success: boolean;\n data: CloudContainer;\n}\n\nexport interface ContainerDeleteResponse {\n success: boolean;\n message?: string;\n}\n\nexport interface ContainerHealthResponse {\n success: boolean;\n data: {\n status: string;\n healthy: boolean;\n lastCheck: string | null;\n uptime: number | null;\n };\n}\n\n// ─── Auth Types ─────────────────────────────────────────────────────────────\n\nexport type DevicePlatform = \"ios\" | \"android\" | \"macos\" | \"windows\" | \"linux\" | \"web\";\n\nexport interface DeviceAuthRequest {\n deviceId: string;\n platform: DevicePlatform;\n appVersion: string;\n deviceName?: string;\n}\n\nexport interface DeviceAuthResponse {\n success: boolean;\n data: {\n apiKey: string;\n userId: string;\n organizationId: string;\n credits: number;\n isNew: boolean;\n };\n}\n\nexport interface CloudCredentials {\n apiKey: string;\n userId: string;\n organizationId: string;\n authenticatedAt: number;\n}\n\n// ─── Credits Types ──────────────────────────────────────────────────────────\n\nexport interface CreditBalanceResponse {\n success: boolean;\n data: {\n balance: number;\n currency: string;\n };\n}\n\nexport interface CreditSummaryResponse {\n success: boolean;\n data: {\n balance: number;\n totalSpent: number;\n totalAdded: number;\n recentTransactions: CreditTransaction[];\n };\n}\n\nexport interface CreditTransaction {\n id: string;\n amount: number;\n description: string;\n type: \"credit\" | \"debit\";\n created_at: string;\n}\n\n// ─── Bridge Types ───────────────────────────────────────────────────────────\n\nexport type BridgeConnectionState = \"disconnected\" | \"connecting\" | \"connected\" | \"reconnecting\";\n\nexport interface BridgeMessage {\n jsonrpc: \"2.0\";\n id?: string | number;\n method?: string;\n params?: Record<string, unknown>;\n result?: unknown;\n error?: BridgeError;\n}\n\nexport interface BridgeError {\n code: number;\n message: string;\n data?: unknown;\n}\n\nexport type BridgeMessageHandler = (message: BridgeMessage) => void;\n\nexport interface BridgeConnection {\n containerId: string;\n state: BridgeConnectionState;\n connectedAt: number | null;\n lastHeartbeat: number | null;\n reconnectAttempts: number;\n}\n\n// ─── Managed Gateway Relay Types ───────────────────────────────────────────\n\nexport interface GatewayRelaySession {\n id: string;\n organizationId: string;\n userId: string;\n runtimeAgentId: string;\n agentName: string | null;\n platform: \"local-runtime\";\n createdAt: string;\n lastSeenAt: string;\n}\n\nexport interface GatewayRelayRequest {\n jsonrpc: \"2.0\";\n id?: string | number;\n method: string;\n params?: Record<string, unknown>;\n}\n\nexport interface GatewayRelayResponse {\n jsonrpc: \"2.0\";\n id?: string | number;\n result?: Record<string, unknown>;\n error?: BridgeError;\n}\n\nexport interface GatewayRelayRequestEnvelope {\n requestId: string;\n rpc: GatewayRelayRequest;\n queuedAt: string;\n}\n\nexport interface RegisterGatewayRelaySessionResponse {\n success: boolean;\n data: {\n session: GatewayRelaySession;\n };\n}\n\nexport interface PollGatewayRelayResponse {\n success: boolean;\n data: {\n request: GatewayRelayRequestEnvelope | null;\n };\n}\n\n// ─── Snapshot / Backup Types ────────────────────────────────────────────────\n\nexport type SnapshotType = \"manual\" | \"auto\" | \"pre-eviction\";\n\nexport interface AgentSnapshot {\n id: string;\n containerId: string;\n organizationId: string;\n snapshotType: SnapshotType;\n storageUrl: string;\n sizeBytes: number;\n agentConfig: Record<string, unknown>;\n metadata: Record<string, unknown>;\n created_at: string;\n}\n\nexport interface CreateSnapshotRequest {\n snapshotType?: SnapshotType;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreateSnapshotResponse {\n success: boolean;\n data: AgentSnapshot;\n}\n\nexport interface SnapshotListResponse {\n success: boolean;\n data: AgentSnapshot[];\n}\n\nexport interface RestoreSnapshotRequest {\n snapshotId: string;\n}\n\nexport interface RestoreSnapshotResponse {\n success: boolean;\n message: string;\n}\n\n// ─── Cloud Config Types ─────────────────────────────────────────────────────\n\nexport type InferenceMode = \"cloud\" | \"byok\" | \"local\";\n\nexport interface CloudPluginConfig {\n /** Enable ElizaCloud integration. */\n enabled: boolean;\n /** ElizaCloud API base URL. */\n baseUrl: string;\n /** Stored API key for authenticated requests. */\n apiKey?: string;\n /** Device ID used for auto-signup authentication. */\n deviceId?: string;\n /** Platform identifier. */\n platform?: DevicePlatform;\n /** Inference mode: cloud (ElizaCloud proxied), byok (user keys), local (no cloud). */\n inferenceMode: InferenceMode;\n /** Auto-deploy agents to cloud on creation. */\n autoProvision: boolean;\n /** Bridge reconnection settings. */\n bridge: {\n reconnectIntervalMs: number;\n maxReconnectAttempts: number;\n heartbeatIntervalMs: number;\n };\n /** Auto-backup settings. */\n backup: {\n autoBackupIntervalMs: number;\n maxSnapshots: number;\n };\n /** Default container settings for new deployments. */\n container: {\n defaultImage: string;\n defaultArchitecture: ContainerArchitecture;\n defaultCpu: number;\n defaultMemory: number;\n defaultPort: number;\n };\n}\n\nexport const DEFAULT_CLOUD_CONFIG: CloudPluginConfig = {\n enabled: false,\n baseUrl: \"https://www.elizacloud.ai/api/v1\",\n inferenceMode: \"cloud\",\n autoProvision: false,\n bridge: {\n reconnectIntervalMs: 3000,\n maxReconnectAttempts: 20,\n heartbeatIntervalMs: 30_000,\n },\n backup: {\n autoBackupIntervalMs: 3_600_000, // 1 hour\n maxSnapshots: 10,\n },\n container: {\n defaultImage: \"elizaos/agent:latest\",\n defaultArchitecture: \"arm64\",\n defaultCpu: 1792,\n defaultMemory: 1792,\n defaultPort: 3000,\n },\n};\n\n// ─── API Error Types ────────────────────────────────────────────────────────\n\nexport type { CloudApiErrorBody } from \"@elizaos/cloud-sdk\";\nexport {\n CloudApiError,\n InsufficientCreditsError,\n} from \"@elizaos/cloud-sdk\";\n",
6
+ "export type {\n CloudApiErrorBody,\n CloudRequestOptions,\n} from \"@elizaos/cloud-sdk\";\nexport {\n CloudApiClient,\n CloudApiError,\n ElizaCloudHttpClient,\n InsufficientCreditsError,\n} from \"@elizaos/cloud-sdk\";\n",
7
+ "/**\n * CloudAuthService — Eliza Cloud authentication entry points.\n *\n * Two distinct auth flows live here:\n *\n * 1. **Device auto-signup** (`authenticateWithDevice`) — convenience-only.\n * Derives a hardware fingerprint and exchanges it for a free-tier API key\n * against the cloud signup endpoint. The result is treated as opaque and\n * is **never** trusted as inbound auth for the local Eliza dashboard.\n * See `docs/security/remote-auth-hardening-plan.md` §7 for the explicit\n * demotion rationale.\n *\n * 2. **Eliza Cloud SSO** (`getSsoRedirectUrl` / `exchangeCodeForSession`) —\n * OAuth-style authorization-code flow against the cloud issuer. The\n * callback handler in `app-core` (`api/auth/cloud-sso.ts`) consumes these\n * methods to bind a verified cloud user to a local Identity. All error\n * paths fail closed: the methods throw and the caller MUST refuse the\n * request. There is no partial-claims fallback.\n */\n\nimport {\n type RuntimeEnvRecord,\n type IAgentRuntime,\n logger,\n Service,\n resolveApiSecurityConfig,\n resolveDesktopApiPort,\n} from \"@elizaos/core\";\nimport { createRemoteJWKSet, jwtVerify } from \"jose\";\nimport type { CloudCredentials, DeviceAuthResponse, DevicePlatform } from \"../types/cloud\";\nimport { DEFAULT_CLOUD_CONFIG } from \"../types/cloud\";\nimport { CloudApiClient } from \"../utils/cloud-api\";\nimport type { CloudBootstrapService } from \"./cloud-bootstrap\";\n\n/** SHA-256 hash of hostname + platform + arch + cpu + memory. */\nasync function deriveDeviceId(): Promise<string> {\n const os = await import(\"node:os\");\n const crypto = await import(\"node:crypto\");\n const cpus = os.cpus();\n const raw = [\n os.hostname(),\n os.platform(),\n os.arch(),\n cpus[0]?.model ?? \"?\",\n cpus.length,\n os.totalmem(),\n ].join(\":\");\n return crypto.createHash(\"sha256\").update(raw).digest(\"hex\");\n}\n\nfunction detectPlatform(): DevicePlatform {\n if (typeof process === \"undefined\") return \"web\";\n const map: Record<string, DevicePlatform> = {\n darwin: \"macos\",\n win32: \"windows\",\n linux: \"linux\",\n };\n return map[process.platform] ?? \"linux\";\n}\n\n// ─── Eliza Cloud SSO ───────────────────────────────────────────────────────\n\n/**\n * Required ID-token claims for an Eliza Cloud SSO exchange.\n *\n * `sub` is the cloud user id (canonical identity key). `email` and `name`\n * are surfaced for UI display and identity provisioning. Anything else the\n * cloud issuer adds is preserved on `extra` for callers that need it but\n * is never required for auth decisions.\n */\nexport interface CloudSsoIdTokenClaims {\n iss: string;\n sub: string;\n aud: string | string[];\n exp: number;\n iat: number;\n email: string;\n email_verified?: boolean;\n name: string;\n picture?: string;\n extra: Record<string, unknown>;\n}\n\nexport interface CloudSsoSession {\n cloudUserId: string;\n email: string;\n displayName: string;\n claims: CloudSsoIdTokenClaims;\n}\n\nexport interface SsoRedirectArgs {\n /**\n * Local URL the user should land on after the SSO round-trip\n * (e.g. `/onboarding/setup`). The dashboard's callback route forwards\n * to this once the session cookie is set; it is NOT sent to the cloud\n * issuer.\n */\n returnTo?: string;\n /**\n * State nonce. The caller is responsible for generating this with\n * `crypto.randomBytes(32)` and storing it server-side keyed by the\n * issued cookie / pending exchange.\n */\n state: string;\n /**\n * Override for `ELIZA_CLOUD_CLIENT_ID`. Falls through to the env when\n * unset; explicitly throws when neither is provided.\n */\n clientId?: string;\n /** Allows tests to inject a synthetic env record. */\n env?: RuntimeEnvRecord;\n}\n\nexport interface ExchangeCodeArgs {\n /** Authorization code returned on the SSO callback. */\n code: string;\n /** State value the cloud issuer echoed back on the callback. */\n state: string;\n /**\n * State value the caller originally issued. Compared with `state` and\n * mismatch causes a fail-closed throw before any network call is made.\n */\n expectedState: string;\n /**\n * Source for `getJwksUrl()`. The caller resolves this from the runtime\n * service registry (`runtime.getService(\"CLOUD_BOOTSTRAP\")`) so this\n * file does not import from `app-core` directly.\n */\n bootstrap: CloudBootstrapService;\n /** Allows tests to inject a fake fetch for the token endpoint. */\n fetchImpl?: typeof fetch;\n /** Allows tests to inject a synthetic env record. */\n env?: RuntimeEnvRecord;\n /** Optional override for the redirect URI; defaults to the local callback. */\n redirectUri?: string;\n}\n\ninterface RawTokenResponse {\n id_token?: unknown;\n access_token?: unknown;\n token_type?: unknown;\n expires_in?: unknown;\n scope?: unknown;\n}\n\ninterface ApiKeyAuthInput {\n apiKey: string;\n organizationId?: string;\n userId?: string;\n}\n\ninterface RawIdTokenPayload {\n iss?: unknown;\n sub?: unknown;\n aud?: unknown;\n exp?: unknown;\n iat?: unknown;\n email?: unknown;\n email_verified?: unknown;\n name?: unknown;\n picture?: unknown;\n [otherProperty: string]: unknown;\n}\n\nfunction readEnvKey(env: RuntimeEnvRecord, key: string): string | null {\n const value = env[key];\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction processEnv(): RuntimeEnvRecord {\n if (typeof process === \"undefined\") return {};\n return process.env as RuntimeEnvRecord;\n}\n\n/**\n * Build the local SSO callback URL the cloud issuer will redirect back to.\n *\n * Reads `ELIZA_API_BIND` and the desktop API port from `@elizaos/core`'s\n * runtime-env helper so the redirect_uri matches whatever the dashboard\n * is actually serving on. Loopback binds default to `http://127.0.0.1:<port>`;\n * non-loopback binds (cloud-provisioned containers) use `https://`.\n */\nfunction defaultRedirectUri(env: RuntimeEnvRecord): string {\n const security = resolveApiSecurityConfig(env);\n const port = resolveDesktopApiPort(env);\n const scheme = security.isLoopbackBind ? \"http\" : \"https\";\n // Strip any IPv6 brackets the bind host might already include.\n const host = security.bindHost.startsWith(\"[\")\n ? security.bindHost\n : security.bindHost.includes(\":\") && !security.bindHost.startsWith(\"[\")\n ? `[${security.bindHost}]`\n : security.bindHost;\n return `${scheme}://${host}:${port}/api/auth/login/sso/callback`;\n}\n\n/**\n * Returns the absolute URL the dashboard should redirect the user to in\n * order to start an Eliza Cloud SSO authorization-code flow.\n *\n * Throws when `ELIZA_CLOUD_CLIENT_ID` is unset and no `clientId` override\n * is provided — there is no built-in default. `ELIZA_CLOUD_ISSUER` is read\n * via the `CloudBootstrapService`'s service-port and must already be set;\n * if not, this method throws via the bootstrap's existing fail-closed\n * behaviour.\n *\n * The `state` argument MUST be generated by the caller with a cryptographic\n * RNG and stored server-side bound to the issued cookie. This method does\n * NOT generate or persist state.\n *\n * @param bootstrap - Service-port that exposes `getExpectedIssuer()`.\n * @param args - Required `state`, optional `clientId` / `returnTo` / `env`.\n */\nexport function getSsoRedirectUrl(bootstrap: CloudBootstrapService, args: SsoRedirectArgs): string {\n const env = args.env ?? processEnv();\n const clientId = args.clientId ?? readEnvKey(env, \"ELIZA_CLOUD_CLIENT_ID\");\n if (!clientId) {\n throw new Error(\"ELIZA_CLOUD_CLIENT_ID is not configured — cannot start Eliza Cloud SSO\");\n }\n if (args.state.length === 0) {\n throw new Error(\"getSsoRedirectUrl requires a non-empty state nonce\");\n }\n const issuer = bootstrap.getExpectedIssuer();\n const redirectUri = defaultRedirectUri(env);\n const params = new URLSearchParams();\n params.set(\"response_type\", \"code\");\n params.set(\"client_id\", clientId);\n params.set(\"redirect_uri\", redirectUri);\n params.set(\"scope\", \"openid profile\");\n params.set(\"state\", args.state);\n if (args.returnTo) {\n // Forwarded through state on the cloud side is not safe (issuer-controlled);\n // we surface it as a separate hint that the local callback honours.\n params.set(\"eliza_return_to\", args.returnTo);\n }\n return `${issuer}/oauth/authorize?${params.toString()}`;\n}\n\nfunction shapeIdTokenClaims(payload: RawIdTokenPayload): CloudSsoIdTokenClaims {\n if (typeof payload.iss !== \"string\" || payload.iss.length === 0) {\n throw new Error(\"id_token missing issuer claim\");\n }\n if (typeof payload.sub !== \"string\" || payload.sub.length === 0) {\n throw new Error(\"id_token missing sub claim\");\n }\n if (\n typeof payload.aud !== \"string\" &&\n !(Array.isArray(payload.aud) && payload.aud.every((value) => typeof value === \"string\"))\n ) {\n throw new Error(\"id_token missing or malformed aud claim\");\n }\n if (typeof payload.exp !== \"number\" || !Number.isFinite(payload.exp)) {\n throw new Error(\"id_token missing exp claim\");\n }\n if (typeof payload.iat !== \"number\" || !Number.isFinite(payload.iat)) {\n throw new Error(\"id_token missing iat claim\");\n }\n if (typeof payload.email !== \"string\" || payload.email.length === 0) {\n throw new Error(\"id_token missing email claim — Eliza Cloud SSO requires it\");\n }\n if (typeof payload.name !== \"string\" || payload.name.length === 0) {\n throw new Error(\"id_token missing name claim — Eliza Cloud SSO requires it\");\n }\n const extra: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(payload)) {\n if (\n key !== \"iss\" &&\n key !== \"sub\" &&\n key !== \"aud\" &&\n key !== \"exp\" &&\n key !== \"iat\" &&\n key !== \"email\" &&\n key !== \"email_verified\" &&\n key !== \"name\" &&\n key !== \"picture\"\n ) {\n extra[key] = value;\n }\n }\n return {\n iss: payload.iss,\n sub: payload.sub,\n aud: payload.aud as string | string[],\n exp: payload.exp,\n iat: payload.iat,\n email: payload.email,\n email_verified:\n typeof payload.email_verified === \"boolean\" ? payload.email_verified : undefined,\n name: payload.name,\n picture: typeof payload.picture === \"string\" ? payload.picture : undefined,\n extra,\n };\n}\n\nfunction shapeTokenResponse(payload: unknown): { idToken: string } {\n if (!payload || typeof payload !== \"object\") {\n throw new Error(\"Eliza Cloud token endpoint returned a non-object body\");\n }\n const raw = payload as RawTokenResponse;\n if (typeof raw.id_token !== \"string\" || raw.id_token.length === 0) {\n throw new Error(\"Eliza Cloud token endpoint did not return an id_token\");\n }\n return { idToken: raw.id_token };\n}\n\n/**\n * Exchange an authorization code for a verified Eliza Cloud session.\n *\n * Steps:\n * 1. Compare `state === expectedState`. Mismatch throws.\n * 2. POST to `${ELIZA_CLOUD_ISSUER}/oauth/token` with the code,\n * `client_id`, and `client_secret` (the latter from\n * `ELIZA_CLOUD_CLIENT_SECRET`).\n * 3. Verify the returned `id_token` against the JWKS exposed by\n * `CloudBootstrapService.getJwksUrl()`. RS256 only.\n * 4. Project the claims onto a `CloudSsoSession`.\n *\n * Any error in fetch / signature verify / claim shape throws — this method\n * NEVER returns a partial or fallback session.\n */\nexport async function exchangeCodeForSession(args: ExchangeCodeArgs): Promise<CloudSsoSession> {\n if (args.code.length === 0) {\n throw new Error(\"exchangeCodeForSession requires a non-empty code\");\n }\n if (!args.state || !args.expectedState || args.state !== args.expectedState) {\n throw new Error(\"Eliza Cloud SSO state mismatch — refusing to exchange code (possible CSRF)\");\n }\n\n const env = args.env ?? processEnv();\n const clientId = readEnvKey(env, \"ELIZA_CLOUD_CLIENT_ID\");\n if (!clientId) {\n throw new Error(\"ELIZA_CLOUD_CLIENT_ID is not configured — cannot complete Eliza Cloud SSO\");\n }\n const clientSecret = readEnvKey(env, \"ELIZA_CLOUD_CLIENT_SECRET\");\n if (!clientSecret) {\n throw new Error(\n \"ELIZA_CLOUD_CLIENT_SECRET is not configured — cannot complete Eliza Cloud SSO\"\n );\n }\n\n const issuer = args.bootstrap.getExpectedIssuer();\n const redirectUri = args.redirectUri ?? defaultRedirectUri(env);\n const tokenUrl = `${issuer}/oauth/token`;\n\n const fetchImpl = args.fetchImpl ?? fetch;\n const body = new URLSearchParams();\n body.set(\"grant_type\", \"authorization_code\");\n body.set(\"code\", args.code);\n body.set(\"redirect_uri\", redirectUri);\n body.set(\"client_id\", clientId);\n body.set(\"client_secret\", clientSecret);\n\n const response = await fetchImpl(tokenUrl, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/x-www-form-urlencoded\",\n accept: \"application/json\",\n },\n body: body.toString(),\n });\n if (!response.ok) {\n throw new Error(\n `Eliza Cloud token endpoint returned HTTP ${response.status} for code exchange`\n );\n }\n const payload: unknown = await response.json();\n const { idToken } = shapeTokenResponse(payload);\n\n const jwksUrl = args.bootstrap.getJwksUrl();\n const remoteJwks = createRemoteJWKSet(new URL(jwksUrl));\n\n const verified = await jwtVerify(idToken, remoteJwks, {\n algorithms: [\"RS256\"],\n issuer,\n audience: clientId,\n });\n\n const claims = shapeIdTokenClaims(verified.payload as RawIdTokenPayload);\n\n return {\n cloudUserId: claims.sub,\n email: claims.email,\n displayName: claims.name,\n claims,\n };\n}\n\n// ─── Service ───────────────────────────────────────────────────────────────\n\nexport class CloudAuthService extends Service {\n static serviceType = \"CLOUD_AUTH\";\n capabilityDescription = \"Eliza Cloud device authentication and SSO session helpers\";\n\n private client: CloudApiClient;\n private credentials: CloudCredentials | null = null;\n\n constructor(runtime?: IAgentRuntime) {\n super(runtime);\n this.client = new CloudApiClient(DEFAULT_CLOUD_CONFIG.baseUrl);\n }\n\n static async start(runtime: IAgentRuntime): Promise<Service> {\n const service = new CloudAuthService(runtime);\n await service.initialize();\n return service;\n }\n\n async stop(): Promise<void> {\n this.credentials = null;\n }\n\n private async initialize(): Promise<void> {\n const baseUrl = String(\n this.runtime.getSetting(\"ELIZAOS_CLOUD_BASE_URL\") ?? DEFAULT_CLOUD_CONFIG.baseUrl\n );\n this.client.setBaseUrl(baseUrl);\n\n // Try existing API key first. If the key is present in settings\n // (persisted via config file or character secrets in the DB), trust it\n // immediately so the agent is functional even when the cloud API is\n // temporarily unreachable. A background validation fires to confirm\n // the key — if it turns out to be revoked the next model call will\n // surface the error, but the agent won't stall on startup.\n const existingKey = this.runtime.getSetting(\"ELIZAOS_CLOUD_API_KEY\");\n if (existingKey) {\n const key = String(existingKey);\n this.client.setApiKey(key);\n\n // Accept the key optimistically — no blocking network call.\n this.credentials = {\n apiKey: key,\n userId: String(this.runtime.getSetting(\"ELIZAOS_CLOUD_USER_ID\") ?? \"\"),\n organizationId: String(\n this.runtime.getSetting(\"ELIZAOS_CLOUD_ORG_ID\") ??\n this.runtime.getSetting(\"ELIZA_CLOUD_ORGANIZATION_ID\") ??\n \"\"\n ),\n authenticatedAt: Date.now(),\n };\n logger.info(\"[CloudAuth] Authenticated with saved API key\");\n\n // Non-blocking validation — if the key is invalid the next model\n // call will surface the error; we just log a warning here.\n this.validateApiKey(key)\n .then((valid) => {\n if (!valid) {\n logger.warn(\n \"[CloudAuth] Saved API key could not be validated (cloud may be unreachable or key revoked) — model calls will use the key anyway\"\n );\n }\n })\n .catch(() => {\n // Swallow — already logged inside validateApiKey\n });\n return;\n }\n\n // Device-based auto-signup when explicitly enabled\n const enabled = this.runtime.getSetting(\"ELIZAOS_CLOUD_ENABLED\");\n if (enabled === \"true\" || enabled === \"1\") {\n try {\n await this.authenticateWithDevice();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.warn(`[CloudAuth] Device auth failed (cloud may be unreachable): ${msg}`);\n logger.info(\n \"[CloudAuth] Service will start unauthenticated — cloud features disabled until connectivity is restored\"\n );\n }\n } else {\n logger.info(\"[CloudAuth] Cloud not enabled (set ELIZAOS_CLOUD_ENABLED=true)\");\n }\n }\n\n private async validateApiKey(key: string): Promise<boolean> {\n try {\n const validationClient = new CloudApiClient(this.client.getBaseUrl(), key);\n await validationClient.get(\"/models\", { timeoutMs: 10_000 });\n return true;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.warn(`[CloudAuth] Could not reach cloud API to validate key: ${msg}`);\n return false;\n }\n }\n\n /**\n * Free-tier device auto-signup. **Convenience only — not a security\n * primitive.** The hardware fingerprint is treated as opaque material the\n * cloud signup endpoint can use to mint a fresh API key + $5 free credit\n * for new installs. The result is usable for outbound LLM calls; it never\n * authorizes inbound dashboard access.\n *\n * See `docs/security/remote-auth-hardening-plan.md` §7.\n */\n async authenticateWithDevice(): Promise<CloudCredentials> {\n const deviceId = await deriveDeviceId();\n const platform = detectPlatform();\n const appVersion = process.env.ELIZAOS_CLOUD_APP_VERSION ?? \"2.0.0-beta.0\";\n const os = await import(\"node:os\");\n\n logger.info(`[CloudAuth] Authenticating device (platform=${platform})`);\n\n const response = await this.client.postUnauthenticated<DeviceAuthResponse>(\"/device-auth\", {\n deviceId,\n platform,\n appVersion,\n deviceName: os.hostname(),\n });\n\n this.credentials = {\n apiKey: response.data.apiKey,\n userId: response.data.userId,\n organizationId: response.data.organizationId,\n authenticatedAt: Date.now(),\n };\n this.client.setApiKey(response.data.apiKey);\n\n const action = response.data.isNew ? \"New account created\" : \"Authenticated\";\n logger.info(`[CloudAuth] ${action} (credits: $${response.data.credits.toFixed(2)})`);\n\n return this.credentials;\n }\n\n authenticateWithApiKey(input: ApiKeyAuthInput): CloudCredentials {\n const apiKey = input.apiKey.trim();\n if (!apiKey) {\n throw new Error(\"Eliza Cloud API key is required\");\n }\n\n this.client.setApiKey(apiKey);\n this.credentials = {\n apiKey,\n userId: input.userId ?? \"\",\n organizationId: input.organizationId ?? \"\",\n authenticatedAt: Date.now(),\n };\n\n logger.info(\"[CloudAuth] Authenticated with API key\");\n return this.credentials;\n }\n\n clearAuth(): void {\n this.credentials = null;\n this.client.setApiKey(undefined);\n }\n\n isAuthenticated(): boolean {\n return this.credentials !== null;\n }\n getCredentials(): CloudCredentials | null {\n return this.credentials;\n }\n getApiKey(): string | undefined {\n return this.credentials?.apiKey ?? this.client.getApiKey();\n }\n getClient(): CloudApiClient {\n return this.client;\n }\n getUserId(): string | undefined {\n return this.credentials?.userId;\n }\n getOrganizationId(): string | undefined {\n return this.credentials?.organizationId;\n }\n}\n"
8
+ ],
9
+ "mappings": "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",
10
+ "debugId": "500754D72B6C3D2B64756E2164756E21",
11
+ "names": []
12
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-backup.d.ts","sourceRoot":"","sources":["../../services/cloud-backup.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,aAAa,EAAU,OAAO,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EACV,aAAa,EAIb,YAAY,EACb,MAAM,gBAAgB,CAAC;AAUxB,qBAAa,kBAAmB,SAAQ,OAAO;IAC7C,MAAM,CAAC,WAAW,SAAkB;IACpC,qBAAqB,SAA+C;IAEpE,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,WAAW,CAA2C;IAC9D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA4C;IACzE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAoD;WAExE,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAMtD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAQb,UAAU;IAYlB,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,YAAY,GAAE,YAAuB,EACrC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,aAAa,CAAC;IAoBnB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAQ5D,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUvE,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAW3E,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAgClE,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAS3C;;;OAGG;IACG,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAU5E;;;OAGG;YACW,cAAc;IAqB5B,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAInD,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAGtD"}
1
+ {"version":3,"file":"cloud-backup.d.ts","sourceRoot":"","sources":["../../src/services/cloud-backup.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,aAAa,EAAU,OAAO,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EACV,aAAa,EAIb,YAAY,EACb,MAAM,gBAAgB,CAAC;AAUxB,qBAAa,kBAAmB,SAAQ,OAAO;IAC7C,MAAM,CAAC,WAAW,SAAkB;IACpC,qBAAqB,SAA+C;IAEpE,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,WAAW,CAA2C;IAC9D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA4C;IACzE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAoD;WAExE,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAMtD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAQb,UAAU;IAYlB,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,YAAY,GAAE,YAAuB,EACrC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,aAAa,CAAC;IAoBnB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAQ5D,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUvE,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAW3E,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAgClE,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAS3C;;;OAGG;IACG,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAU5E;;;OAGG;YACW,cAAc;IAqB5B,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAInD,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAGtD"}
@@ -0,0 +1,176 @@
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/types/cloud.ts
20
+ import {
21
+ CloudApiError,
22
+ InsufficientCreditsError
23
+ } from "@elizaos/cloud-sdk";
24
+ var DEFAULT_CLOUD_CONFIG = {
25
+ enabled: false,
26
+ baseUrl: "https://www.elizacloud.ai/api/v1",
27
+ inferenceMode: "cloud",
28
+ autoProvision: false,
29
+ bridge: {
30
+ reconnectIntervalMs: 3000,
31
+ maxReconnectAttempts: 20,
32
+ heartbeatIntervalMs: 30000
33
+ },
34
+ backup: {
35
+ autoBackupIntervalMs: 3600000,
36
+ maxSnapshots: 10
37
+ },
38
+ container: {
39
+ defaultImage: "elizaos/agent:latest",
40
+ defaultArchitecture: "arm64",
41
+ defaultCpu: 1792,
42
+ defaultMemory: 1792,
43
+ defaultPort: 3000
44
+ }
45
+ };
46
+
47
+ // src/services/cloud-backup.ts
48
+ import { logger, Service } from "@elizaos/core";
49
+ class CloudBackupService extends Service {
50
+ static serviceType = "CLOUD_BACKUP";
51
+ capabilityDescription = "ElizaCloud agent state backup and restore";
52
+ authService;
53
+ autoBackups = new Map;
54
+ maxSnapshots = DEFAULT_CLOUD_CONFIG.backup.maxSnapshots;
55
+ backupIntervalMs = DEFAULT_CLOUD_CONFIG.backup.autoBackupIntervalMs;
56
+ static async start(runtime) {
57
+ const service = new CloudBackupService(runtime);
58
+ await service.initialize();
59
+ return service;
60
+ }
61
+ async stop() {
62
+ for (const [, entry] of this.autoBackups) {
63
+ clearInterval(entry.timer);
64
+ }
65
+ this.autoBackups.clear();
66
+ logger.info("[CloudBackup] Service stopped");
67
+ }
68
+ async initialize() {
69
+ const auth = this.runtime.getService("CLOUD_AUTH");
70
+ if (!auth) {
71
+ logger.debug("[CloudBackup] CloudAuthService not available");
72
+ return;
73
+ }
74
+ this.authService = auth;
75
+ logger.info("[CloudBackup] Service initialized");
76
+ }
77
+ async createSnapshot(containerId, snapshotType = "manual", metadata) {
78
+ const client = this.authService.getClient();
79
+ const response = await client.post(`/agent-state/${containerId}/snapshot`, { snapshotType, metadata });
80
+ logger.info(`[CloudBackup] Created ${snapshotType} snapshot for container ${containerId} (id=${response.data.id}, size=${formatBytes(response.data.sizeBytes)})`);
81
+ const autoEntry = this.autoBackups.get(containerId);
82
+ if (autoEntry) {
83
+ autoEntry.lastBackupAt = Date.now();
84
+ }
85
+ return response.data;
86
+ }
87
+ async listSnapshots(containerId) {
88
+ const client = this.authService.getClient();
89
+ const response = await client.get(`/agent-state/${containerId}/snapshots`);
90
+ return response.data;
91
+ }
92
+ async restoreSnapshot(containerId, snapshotId) {
93
+ const client = this.authService.getClient();
94
+ await client.post(`/agent-state/${containerId}/restore`, {
95
+ snapshotId
96
+ });
97
+ logger.info(`[CloudBackup] Restored snapshot ${snapshotId} for container ${containerId}`);
98
+ }
99
+ async getLatestSnapshot(containerId) {
100
+ const snapshots = await this.listSnapshots(containerId);
101
+ if (snapshots.length === 0)
102
+ return null;
103
+ snapshots.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
104
+ return snapshots[0];
105
+ }
106
+ scheduleAutoBackup(containerId, intervalMs) {
107
+ if (this.autoBackups.has(containerId)) {
108
+ logger.debug(`[CloudBackup] Auto-backup already scheduled for ${containerId}`);
109
+ return;
110
+ }
111
+ const interval = intervalMs ?? this.backupIntervalMs;
112
+ const timer = setInterval(() => {
113
+ logger.debug(`[CloudBackup] Running auto-backup for container ${containerId}`);
114
+ this.createSnapshot(containerId, "auto", {
115
+ trigger: "scheduled",
116
+ scheduledIntervalMs: interval
117
+ }).then(() => this.pruneSnapshots(containerId)).catch((err) => {
118
+ logger.error(`[CloudBackup] Auto-backup failed for ${containerId}: ${err.message}`);
119
+ });
120
+ }, interval);
121
+ this.autoBackups.set(containerId, {
122
+ containerId,
123
+ timer,
124
+ lastBackupAt: null
125
+ });
126
+ logger.info(`[CloudBackup] Scheduled auto-backup for ${containerId} every ${Math.round(interval / 60000)} minutes`);
127
+ }
128
+ cancelAutoBackup(containerId) {
129
+ const entry = this.autoBackups.get(containerId);
130
+ if (!entry)
131
+ return;
132
+ clearInterval(entry.timer);
133
+ this.autoBackups.delete(containerId);
134
+ logger.info(`[CloudBackup] Cancelled auto-backup for ${containerId}`);
135
+ }
136
+ async createPreEvictionSnapshot(containerId) {
137
+ logger.info(`[CloudBackup] Creating pre-eviction snapshot for ${containerId}`);
138
+ return this.createSnapshot(containerId, "pre-eviction", {
139
+ trigger: "billing-eviction",
140
+ createdAt: new Date().toISOString()
141
+ });
142
+ }
143
+ async pruneSnapshots(containerId) {
144
+ const snapshots = await this.listSnapshots(containerId);
145
+ const autoSnapshots = snapshots.filter((s) => s.snapshotType === "auto").sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
146
+ const excess = autoSnapshots.slice(this.maxSnapshots);
147
+ if (excess.length === 0)
148
+ return;
149
+ const client = this.authService.getClient();
150
+ for (const snapshot of excess) {
151
+ await client.delete(`/agent-state/${containerId}/snapshots/${snapshot.id}`);
152
+ logger.debug(`[CloudBackup] Pruned old auto snapshot ${snapshot.id} for ${containerId}`);
153
+ }
154
+ logger.info(`[CloudBackup] Pruned ${excess.length} old auto snapshot(s) for ${containerId}`);
155
+ }
156
+ isAutoBackupScheduled(containerId) {
157
+ return this.autoBackups.has(containerId);
158
+ }
159
+ getLastBackupTime(containerId) {
160
+ return this.autoBackups.get(containerId)?.lastBackupAt ?? null;
161
+ }
162
+ }
163
+ function formatBytes(bytes) {
164
+ if (bytes < 1024)
165
+ return `${bytes} B`;
166
+ if (bytes < 1024 * 1024)
167
+ return `${(bytes / 1024).toFixed(1)} KB`;
168
+ if (bytes < 1024 * 1024 * 1024)
169
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
170
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
171
+ }
172
+ export {
173
+ CloudBackupService
174
+ };
175
+
176
+ //# debugId=3A3130D224AC9DB064756E2164756E21