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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (452) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +196 -0
  3. package/auto-enable.ts +22 -0
  4. package/dist/browser/index.browser.js +2 -21
  5. package/dist/browser/index.browser.js.map +5 -38
  6. package/dist/cjs/index.d.ts +2 -2
  7. package/dist/cjs/index.node.cjs +9112 -2265
  8. package/dist/cjs/index.node.js.map +68 -30
  9. package/dist/cloud/auth-service-types.d.ts +8 -0
  10. package/dist/cloud/auth-service-types.d.ts.map +1 -0
  11. package/dist/cloud/auth-service-types.js +36 -0
  12. package/dist/cloud/auth-service-types.js.map +10 -0
  13. package/dist/cloud/auth.d.ts +19 -0
  14. package/dist/cloud/auth.d.ts.map +1 -0
  15. package/dist/cloud/auth.js +283 -0
  16. package/dist/cloud/auth.js.map +12 -0
  17. package/dist/cloud/backup.d.ts +18 -0
  18. package/dist/cloud/backup.d.ts.map +1 -0
  19. package/dist/cloud/backup.js +63 -0
  20. package/dist/cloud/backup.js.map +10 -0
  21. package/dist/cloud/base-url.d.ts +7 -0
  22. package/dist/cloud/base-url.d.ts.map +1 -0
  23. package/dist/cloud/base-url.js +29 -0
  24. package/dist/cloud/base-url.js.map +10 -0
  25. package/dist/cloud/bridge-client.d.ts +126 -0
  26. package/dist/cloud/bridge-client.d.ts.map +1 -0
  27. package/dist/cloud/bridge-client.js +384 -0
  28. package/dist/cloud/bridge-client.js.map +11 -0
  29. package/dist/cloud/clack-observer.d.ts +35 -0
  30. package/dist/cloud/clack-observer.d.ts.map +1 -0
  31. package/dist/cloud/clack-observer.js +143 -0
  32. package/dist/cloud/clack-observer.js.map +10 -0
  33. package/dist/cloud/cloud-api-key.d.ts +26 -0
  34. package/dist/cloud/cloud-api-key.d.ts.map +1 -0
  35. package/dist/cloud/cloud-api-key.js +60 -0
  36. package/dist/cloud/cloud-api-key.js.map +10 -0
  37. package/dist/cloud/cloud-manager.d.ts +33 -0
  38. package/dist/cloud/cloud-manager.d.ts.map +1 -0
  39. package/dist/cloud/cloud-manager.js +806 -0
  40. package/dist/cloud/cloud-manager.js.map +16 -0
  41. package/dist/cloud/cloud-proxy.d.ts +20 -0
  42. package/dist/cloud/cloud-proxy.d.ts.map +1 -0
  43. package/dist/cloud/cloud-proxy.js +54 -0
  44. package/dist/cloud/cloud-proxy.js.map +10 -0
  45. package/dist/cloud/cloud-wallet.d.ts +94 -0
  46. package/dist/cloud/cloud-wallet.d.ts.map +1 -0
  47. package/dist/cloud/cloud-wallet.js +362 -0
  48. package/dist/cloud/cloud-wallet.js.map +13 -0
  49. package/dist/cloud/duffel-client.d.ts +181 -0
  50. package/dist/cloud/duffel-client.d.ts.map +1 -0
  51. package/dist/cloud/duffel-client.js +506 -0
  52. package/dist/cloud/duffel-client.js.map +11 -0
  53. package/dist/cloud/index.d.ts +15 -0
  54. package/dist/cloud/index.d.ts.map +1 -0
  55. package/dist/cloud/index.js +1811 -0
  56. package/dist/cloud/index.js.map +24 -0
  57. package/dist/cloud/lifeops-schedule-sync-client.d.ts +43 -0
  58. package/dist/cloud/lifeops-schedule-sync-client.d.ts.map +1 -0
  59. package/dist/cloud/lifeops-schedule-sync-client.js +180 -0
  60. package/dist/cloud/lifeops-schedule-sync-client.js.map +11 -0
  61. package/dist/cloud/lifeops-schedule-sync-contracts.d.ts +89 -0
  62. package/dist/cloud/lifeops-schedule-sync-contracts.d.ts.map +1 -0
  63. package/dist/cloud/lifeops-schedule-sync-contracts.js +39 -0
  64. package/dist/cloud/lifeops-schedule-sync-contracts.js.map +10 -0
  65. package/dist/cloud/managed-payment-clients.d.ts +166 -0
  66. package/dist/cloud/managed-payment-clients.d.ts.map +1 -0
  67. package/dist/cloud/managed-payment-clients.js +238 -0
  68. package/dist/cloud/managed-payment-clients.js.map +11 -0
  69. package/dist/cloud/null-observer.d.ts +35 -0
  70. package/dist/cloud/null-observer.d.ts.map +1 -0
  71. package/dist/cloud/null-observer.js +45 -0
  72. package/dist/cloud/null-observer.js.map +10 -0
  73. package/dist/cloud/reconnect.d.ts +26 -0
  74. package/dist/cloud/reconnect.d.ts.map +1 -0
  75. package/dist/cloud/reconnect.js +104 -0
  76. package/dist/cloud/reconnect.js.map +10 -0
  77. package/dist/cloud/setup-observer.d.ts +98 -0
  78. package/dist/cloud/setup-observer.d.ts.map +1 -0
  79. package/dist/cloud/setup-observer.js +2 -0
  80. package/dist/cloud/setup-observer.js.map +9 -0
  81. package/dist/cloud/validate-url.d.ts +2 -0
  82. package/dist/cloud/validate-url.d.ts.map +1 -0
  83. package/dist/cloud/validate-url.js +175 -0
  84. package/dist/cloud/validate-url.js.map +10 -0
  85. package/dist/cloud/x402-payment-handler.d.ts +85 -0
  86. package/dist/cloud/x402-payment-handler.d.ts.map +1 -0
  87. package/dist/cloud/x402-payment-handler.js +119 -0
  88. package/dist/cloud/x402-payment-handler.js.map +10 -0
  89. package/dist/cloud-providers/cloud-status.d.ts.map +1 -1
  90. package/dist/cloud-providers/cloud-status.js +78 -0
  91. package/dist/cloud-providers/cloud-status.js.map +10 -0
  92. package/dist/cloud-providers/container-health.d.ts.map +1 -1
  93. package/dist/cloud-providers/container-health.js +74 -0
  94. package/dist/cloud-providers/container-health.js.map +10 -0
  95. package/dist/cloud-providers/credit-balance.d.ts.map +1 -1
  96. package/dist/cloud-providers/credit-balance.js +85 -0
  97. package/dist/cloud-providers/credit-balance.js.map +10 -0
  98. package/dist/cloud-providers/index.d.ts.map +1 -1
  99. package/dist/cloud-providers/index.js +24 -0
  100. package/dist/cloud-providers/index.js.map +9 -0
  101. package/dist/cloud-providers/model-registry.d.ts.map +1 -1
  102. package/dist/cloud-providers/model-registry.js +71 -0
  103. package/dist/cloud-providers/model-registry.js.map +10 -0
  104. package/dist/cloud-setup.d.ts +36 -0
  105. package/dist/cloud-setup.d.ts.map +1 -0
  106. package/dist/cloud-setup.js +883 -0
  107. package/dist/cloud-setup.js.map +14 -0
  108. package/dist/cloud-voice-catalog.d.ts +65 -0
  109. package/dist/cloud-voice-catalog.d.ts.map +1 -0
  110. package/dist/cloud-voice-catalog.js +278 -0
  111. package/dist/cloud-voice-catalog.js.map +12 -0
  112. package/dist/index.browser.d.ts +15 -3
  113. package/dist/index.browser.d.ts.map +1 -1
  114. package/dist/index.d.ts +24 -0
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +9862 -0
  117. package/dist/index.js.map +77 -0
  118. package/dist/index.node.d.ts +21 -2
  119. package/dist/index.node.d.ts.map +1 -1
  120. package/dist/init.d.ts.map +1 -1
  121. package/dist/init.js +182 -0
  122. package/dist/init.js.map +12 -0
  123. package/dist/lib/cloud-connection.d.ts +77 -0
  124. package/dist/lib/cloud-connection.d.ts.map +1 -0
  125. package/dist/lib/cloud-connection.js +654 -0
  126. package/dist/lib/cloud-connection.js.map +14 -0
  127. package/dist/lib/cloud-secrets.d.ts +10 -0
  128. package/dist/lib/cloud-secrets.d.ts.map +1 -0
  129. package/dist/lib/cloud-secrets.js +36 -0
  130. package/dist/lib/cloud-secrets.js.map +10 -0
  131. package/dist/lib/config-env.d.ts +5 -0
  132. package/dist/lib/config-env.d.ts.map +1 -0
  133. package/dist/lib/config-env.js +191 -0
  134. package/dist/lib/config-env.js.map +11 -0
  135. package/dist/lib/config-like.d.ts +40 -0
  136. package/dist/lib/config-like.d.ts.map +1 -0
  137. package/dist/lib/config-like.js +103 -0
  138. package/dist/lib/config-like.js.map +10 -0
  139. package/dist/lib/credential-type-map.d.ts +53 -0
  140. package/dist/lib/credential-type-map.d.ts.map +1 -0
  141. package/dist/lib/credential-type-map.js +88 -0
  142. package/dist/lib/credential-type-map.js.map +10 -0
  143. package/dist/lib/feature-flags.d.ts +2 -0
  144. package/dist/lib/feature-flags.d.ts.map +1 -0
  145. package/dist/lib/feature-flags.js +40 -0
  146. package/dist/lib/feature-flags.js.map +10 -0
  147. package/dist/lib/http.d.ts +11 -0
  148. package/dist/lib/http.d.ts.map +1 -0
  149. package/dist/lib/http.js +107 -0
  150. package/dist/lib/http.js.map +10 -0
  151. package/dist/lib/server-cloud-tts.d.ts +21 -0
  152. package/dist/lib/server-cloud-tts.d.ts.map +1 -0
  153. package/dist/lib/server-cloud-tts.js +251 -0
  154. package/dist/lib/server-cloud-tts.js.map +10 -0
  155. package/dist/lib/state-paths.d.ts +4 -0
  156. package/dist/lib/state-paths.d.ts.map +1 -0
  157. package/dist/lib/state-paths.js +52 -0
  158. package/dist/lib/state-paths.js.map +10 -0
  159. package/dist/lib/tts-debug.d.ts +6 -0
  160. package/dist/lib/tts-debug.d.ts.map +1 -0
  161. package/dist/lib/tts-debug.js +24 -0
  162. package/dist/lib/tts-debug.js.map +9 -0
  163. package/dist/models/embeddings.d.ts.map +1 -1
  164. package/dist/models/embeddings.js +329 -0
  165. package/dist/models/embeddings.js.map +13 -0
  166. package/dist/models/image.d.ts.map +1 -1
  167. package/dist/models/image.js +401 -0
  168. package/dist/models/image.js.map +14 -0
  169. package/dist/models/index.d.ts +1 -2
  170. package/dist/models/index.d.ts.map +1 -1
  171. package/dist/models/index.js +1896 -0
  172. package/dist/models/index.js.map +19 -0
  173. package/dist/models/research.d.ts.map +1 -1
  174. package/dist/models/research.js +341 -0
  175. package/dist/models/research.js.map +13 -0
  176. package/dist/models/speech.d.ts +61 -3
  177. package/dist/models/speech.d.ts.map +1 -1
  178. package/dist/models/speech.js +429 -0
  179. package/dist/models/speech.js.map +13 -0
  180. package/dist/models/text.d.ts +111 -3
  181. package/dist/models/text.d.ts.map +1 -1
  182. package/dist/models/text.js +1173 -0
  183. package/dist/models/text.js.map +14 -0
  184. package/dist/models/tokenization.d.ts.map +1 -1
  185. package/dist/models/tokenization.js +65 -0
  186. package/dist/models/tokenization.js.map +10 -0
  187. package/dist/models/transcription.d.ts.map +1 -1
  188. package/dist/models/transcription.js +297 -0
  189. package/dist/models/transcription.js.map +13 -0
  190. package/dist/node/index.d.ts +2 -2
  191. package/dist/node/index.node.js +9189 -2295
  192. package/dist/node/index.node.js.map +68 -30
  193. package/dist/plugin.d.ts +20 -0
  194. package/dist/plugin.d.ts.map +1 -0
  195. package/dist/plugin.js +2937 -0
  196. package/dist/plugin.js.map +28 -0
  197. package/dist/providers/openai.d.ts.map +1 -1
  198. package/dist/providers/openai.js +136 -0
  199. package/dist/providers/openai.js.map +11 -0
  200. package/dist/register-routes.d.ts +2 -0
  201. package/dist/register-routes.d.ts.map +1 -0
  202. package/dist/register-routes.js +2938 -0
  203. package/dist/register-routes.js.map +29 -0
  204. package/dist/routes/cloud-billing-routes.d.ts +9 -0
  205. package/dist/routes/cloud-billing-routes.d.ts.map +1 -0
  206. package/dist/routes/cloud-billing-routes.js +764 -0
  207. package/dist/routes/cloud-billing-routes.js.map +15 -0
  208. package/dist/routes/cloud-coding-container-routes.d.ts +8 -0
  209. package/dist/routes/cloud-coding-container-routes.d.ts.map +1 -0
  210. package/dist/routes/cloud-coding-container-routes.js +214 -0
  211. package/dist/routes/cloud-coding-container-routes.js.map +11 -0
  212. package/dist/routes/cloud-compat-routes.d.ts +10 -0
  213. package/dist/routes/cloud-compat-routes.d.ts.map +1 -0
  214. package/dist/routes/cloud-compat-routes.js +495 -0
  215. package/dist/routes/cloud-compat-routes.js.map +15 -0
  216. package/dist/routes/cloud-features-routes.d.ts +9 -0
  217. package/dist/routes/cloud-features-routes.d.ts.map +1 -0
  218. package/dist/routes/cloud-features-routes.js +124 -0
  219. package/dist/routes/cloud-features-routes.js.map +11 -0
  220. package/dist/routes/cloud-provisioning.d.ts +14 -0
  221. package/dist/routes/cloud-provisioning.d.ts.map +1 -0
  222. package/dist/routes/cloud-provisioning.js +37 -0
  223. package/dist/routes/cloud-provisioning.js.map +10 -0
  224. package/dist/routes/cloud-relay-routes.d.ts +23 -0
  225. package/dist/routes/cloud-relay-routes.d.ts.map +1 -0
  226. package/dist/routes/cloud-relay-routes.js +142 -0
  227. package/dist/routes/cloud-relay-routes.js.map +11 -0
  228. package/dist/routes/cloud-routes-autonomous.d.ts +82 -0
  229. package/dist/routes/cloud-routes-autonomous.d.ts.map +1 -0
  230. package/dist/routes/cloud-routes-autonomous.js +1252 -0
  231. package/dist/routes/cloud-routes-autonomous.js.map +18 -0
  232. package/dist/routes/cloud-routes.d.ts +35 -0
  233. package/dist/routes/cloud-routes.d.ts.map +1 -0
  234. package/dist/routes/cloud-routes.js +2173 -0
  235. package/dist/routes/cloud-routes.js.map +23 -0
  236. package/dist/routes/cloud-status-routes-autonomous.d.ts +14 -0
  237. package/dist/routes/cloud-status-routes-autonomous.d.ts.map +1 -0
  238. package/dist/routes/cloud-status-routes-autonomous.js +349 -0
  239. package/dist/routes/cloud-status-routes-autonomous.js.map +13 -0
  240. package/dist/routes/cloud-status-routes.d.ts +4 -0
  241. package/dist/routes/cloud-status-routes.d.ts.map +1 -0
  242. package/dist/routes/cloud-status-routes.js +695 -0
  243. package/dist/routes/cloud-status-routes.js.map +15 -0
  244. package/dist/routes/home-remote-runner-access-url.d.ts +16 -0
  245. package/dist/routes/home-remote-runner-access-url.d.ts.map +1 -0
  246. package/dist/routes/home-remote-runner-access-url.js +91 -0
  247. package/dist/routes/home-remote-runner-access-url.js.map +10 -0
  248. package/dist/routes/travel-provider-relay-routes.d.ts +9 -0
  249. package/dist/routes/travel-provider-relay-routes.d.ts.map +1 -0
  250. package/dist/routes/travel-provider-relay-routes.js +358 -0
  251. package/dist/routes/travel-provider-relay-routes.js.map +14 -0
  252. package/dist/services/cloud-auth.d.ts +140 -5
  253. package/dist/services/cloud-auth.d.ts.map +1 -1
  254. package/dist/services/cloud-auth.js +368 -0
  255. package/dist/services/cloud-auth.js.map +12 -0
  256. package/dist/services/cloud-backup.d.ts.map +1 -1
  257. package/dist/services/cloud-backup.js +176 -0
  258. package/dist/services/cloud-backup.js.map +11 -0
  259. package/dist/services/cloud-bootstrap.d.ts +38 -0
  260. package/dist/services/cloud-bootstrap.d.ts.map +1 -0
  261. package/dist/services/cloud-bootstrap.js +84 -0
  262. package/dist/services/cloud-bootstrap.js.map +10 -0
  263. package/dist/services/cloud-bridge.d.ts +1 -1
  264. package/dist/services/cloud-bridge.d.ts.map +1 -1
  265. package/dist/services/cloud-bridge.js +308 -0
  266. package/dist/services/cloud-bridge.js.map +11 -0
  267. package/dist/services/cloud-container.d.ts +5 -1
  268. package/dist/services/cloud-container.d.ts.map +1 -1
  269. package/dist/services/cloud-container.js +292 -0
  270. package/dist/services/cloud-container.js.map +11 -0
  271. package/dist/services/cloud-credential-provider.d.ts +55 -0
  272. package/dist/services/cloud-credential-provider.d.ts.map +1 -0
  273. package/dist/services/cloud-credential-provider.js +190 -0
  274. package/dist/services/cloud-credential-provider.js.map +11 -0
  275. package/dist/services/cloud-managed-gateway-relay.d.ts +38 -0
  276. package/dist/services/cloud-managed-gateway-relay.d.ts.map +1 -0
  277. package/dist/services/cloud-managed-gateway-relay.js +479 -0
  278. package/dist/services/cloud-managed-gateway-relay.js.map +10 -0
  279. package/dist/services/cloud-model-registry.d.ts.map +1 -1
  280. package/dist/services/cloud-model-registry.js +175 -0
  281. package/dist/services/cloud-model-registry.js.map +10 -0
  282. package/dist/services/index.d.ts +3 -1
  283. package/dist/services/index.d.ts.map +1 -1
  284. package/dist/services/index.js +29 -0
  285. package/dist/services/index.js.map +9 -0
  286. package/dist/types/cloud.d.ts +42 -19
  287. package/dist/types/cloud.d.ts.map +1 -1
  288. package/dist/types/cloud.js +52 -0
  289. package/dist/types/cloud.js.map +10 -0
  290. package/dist/types/index.d.ts +1 -1
  291. package/dist/types/index.d.ts.map +1 -1
  292. package/dist/types/index.js +24 -0
  293. package/dist/types/index.js.map +9 -0
  294. package/dist/utils/cloud-api.d.ts +2 -27
  295. package/dist/utils/cloud-api.d.ts.map +1 -1
  296. package/dist/utils/cloud-api.js +33 -0
  297. package/dist/utils/cloud-api.js.map +10 -0
  298. package/dist/utils/cloud-sdk/client.d.ts +133 -0
  299. package/dist/utils/cloud-sdk/client.d.ts.map +1 -0
  300. package/dist/utils/cloud-sdk/client.js +3693 -0
  301. package/dist/utils/cloud-sdk/client.js.map +13 -0
  302. package/dist/utils/cloud-sdk/http.d.ts +37 -0
  303. package/dist/utils/cloud-sdk/http.d.ts.map +1 -0
  304. package/dist/utils/cloud-sdk/http.js +237 -0
  305. package/dist/utils/cloud-sdk/http.js.map +11 -0
  306. package/dist/utils/cloud-sdk/index.d.ts +6 -0
  307. package/dist/utils/cloud-sdk/index.d.ts.map +1 -0
  308. package/dist/utils/cloud-sdk/index.js +29 -0
  309. package/dist/utils/cloud-sdk/index.js.map +9 -0
  310. package/dist/utils/cloud-sdk/public-routes.d.ts +5563 -0
  311. package/dist/utils/cloud-sdk/public-routes.d.ts.map +1 -0
  312. package/dist/utils/cloud-sdk/public-routes.js +3048 -0
  313. package/dist/utils/cloud-sdk/public-routes.js.map +10 -0
  314. package/dist/utils/cloud-sdk/types.cloud-api.d.ts +101 -0
  315. package/dist/utils/cloud-sdk/types.cloud-api.d.ts.map +1 -0
  316. package/dist/utils/cloud-sdk/types.cloud-api.js +2 -0
  317. package/dist/utils/cloud-sdk/types.cloud-api.js.map +9 -0
  318. package/dist/utils/cloud-sdk/types.d.ts +653 -0
  319. package/dist/utils/cloud-sdk/types.d.ts.map +1 -0
  320. package/dist/utils/cloud-sdk/types.js +29 -0
  321. package/dist/utils/cloud-sdk/types.js.map +10 -0
  322. package/dist/utils/config.d.ts +16 -3
  323. package/dist/utils/config.d.ts.map +1 -1
  324. package/dist/utils/config.js +147 -0
  325. package/dist/utils/config.js.map +10 -0
  326. package/dist/utils/events.d.ts +23 -2
  327. package/dist/utils/events.d.ts.map +1 -1
  328. package/dist/utils/events.js +45 -0
  329. package/dist/utils/events.js.map +10 -0
  330. package/dist/utils/helpers.d.ts.map +1 -1
  331. package/dist/utils/helpers.js +103 -0
  332. package/dist/utils/helpers.js.map +10 -0
  333. package/dist/utils/responses-output.d.ts +13 -0
  334. package/dist/utils/responses-output.d.ts.map +1 -0
  335. package/dist/utils/responses-output.js +102 -0
  336. package/dist/utils/responses-output.js.map +10 -0
  337. package/dist/utils/sdk-client.d.ts +5 -0
  338. package/dist/utils/sdk-client.d.ts.map +1 -0
  339. package/dist/utils/sdk-client.js +157 -0
  340. package/dist/utils/sdk-client.js.map +11 -0
  341. package/dist/utils/waifu-metering.d.ts +108 -0
  342. package/dist/utils/waifu-metering.d.ts.map +1 -0
  343. package/dist/utils/waifu-metering.js +166 -0
  344. package/dist/utils/waifu-metering.js.map +10 -0
  345. package/package.json +139 -21
  346. package/src/cloud/auth-service-types.ts +24 -0
  347. package/src/cloud/auth.ts +175 -0
  348. package/src/cloud/backup.ts +46 -0
  349. package/src/cloud/base-url.ts +6 -0
  350. package/src/cloud/bridge-client.ts +602 -0
  351. package/src/cloud/clack-observer.ts +189 -0
  352. package/src/cloud/cloud-api-key.ts +80 -0
  353. package/src/cloud/cloud-manager.ts +163 -0
  354. package/src/cloud/cloud-proxy.ts +52 -0
  355. package/src/cloud/cloud-wallet.ts +341 -0
  356. package/src/cloud/duffel-client.ts +847 -0
  357. package/src/cloud/index.ts +38 -0
  358. package/src/cloud/lifeops-schedule-sync-client.ts +245 -0
  359. package/src/cloud/lifeops-schedule-sync-contracts.ts +124 -0
  360. package/src/cloud/managed-payment-clients.ts +374 -0
  361. package/src/cloud/null-observer.ts +45 -0
  362. package/src/cloud/reconnect.ts +111 -0
  363. package/src/cloud/setup-observer.ts +125 -0
  364. package/src/cloud/validate-url.ts +187 -0
  365. package/src/cloud/x402-payment-handler.ts +215 -0
  366. package/src/cloud-providers/cloud-status.ts +75 -0
  367. package/src/cloud-providers/container-health.ts +68 -0
  368. package/src/cloud-providers/credit-balance.ts +70 -0
  369. package/src/cloud-providers/index.ts +3 -0
  370. package/src/cloud-providers/model-registry.ts +74 -0
  371. package/src/cloud-setup.ts +531 -0
  372. package/src/cloud-voice-catalog.test.ts +254 -0
  373. package/src/cloud-voice-catalog.ts +246 -0
  374. package/src/index.browser.ts +39 -0
  375. package/src/index.node.ts +69 -0
  376. package/src/index.ts +419 -0
  377. package/src/init.ts +39 -0
  378. package/src/lib/cloud-connection.ts +661 -0
  379. package/src/lib/cloud-secrets.ts +14 -0
  380. package/src/lib/config-env.ts +168 -0
  381. package/src/lib/config-like.ts +149 -0
  382. package/src/lib/credential-type-map.ts +130 -0
  383. package/src/lib/feature-flags.ts +26 -0
  384. package/src/lib/http.ts +122 -0
  385. package/src/lib/server-cloud-tts.ts +301 -0
  386. package/src/lib/state-paths.ts +28 -0
  387. package/src/lib/tts-debug.ts +5 -0
  388. package/src/models/embeddings.ts +298 -0
  389. package/src/models/image.ts +234 -0
  390. package/src/models/index.ts +16 -0
  391. package/src/models/research.ts +275 -0
  392. package/src/models/speech.ts +324 -0
  393. package/src/models/text.ts +1493 -0
  394. package/src/models/tokenization.ts +67 -0
  395. package/src/models/transcription.ts +101 -0
  396. package/src/plugin.ts +281 -0
  397. package/src/providers/openai.ts +16 -0
  398. package/src/register-routes.ts +6 -0
  399. package/src/routes/cloud-billing-routes.ts +744 -0
  400. package/src/routes/cloud-coding-container-routes.ts +198 -0
  401. package/src/routes/cloud-compat-routes.ts +304 -0
  402. package/src/routes/cloud-features-routes.ts +57 -0
  403. package/src/routes/cloud-provisioning.ts +37 -0
  404. package/src/routes/cloud-relay-routes.ts +135 -0
  405. package/src/routes/cloud-routes-autonomous.ts +993 -0
  406. package/src/routes/cloud-routes.ts +637 -0
  407. package/src/routes/cloud-status-routes-autonomous.ts +238 -0
  408. package/src/routes/cloud-status-routes.ts +73 -0
  409. package/src/routes/home-remote-runner-access-url.ts +83 -0
  410. package/src/routes/travel-provider-relay-routes.ts +193 -0
  411. package/src/services/cloud-auth.ts +574 -0
  412. package/src/services/cloud-backup.ts +208 -0
  413. package/src/services/cloud-bootstrap.ts +106 -0
  414. package/src/services/cloud-bridge.ts +386 -0
  415. package/src/services/cloud-container.ts +390 -0
  416. package/src/services/cloud-credential-provider.ts +210 -0
  417. package/src/services/cloud-managed-gateway-relay.ts +663 -0
  418. package/src/services/cloud-model-registry.ts +202 -0
  419. package/src/services/index.ts +17 -0
  420. package/{types → src/types}/cloud.ts +74 -29
  421. package/{types → src/types}/index.ts +25 -0
  422. package/src/utils/cloud-api.ts +10 -0
  423. package/src/utils/cloud-sdk/client.ts +774 -0
  424. package/src/utils/cloud-sdk/http.ts +291 -0
  425. package/src/utils/cloud-sdk/index.ts +23 -0
  426. package/src/utils/cloud-sdk/public-routes.ts +5238 -0
  427. package/src/utils/cloud-sdk/types.cloud-api.ts +120 -0
  428. package/src/utils/cloud-sdk/types.ts +760 -0
  429. package/src/utils/config.ts +193 -0
  430. package/src/utils/events.ts +65 -0
  431. package/src/utils/helpers.ts +107 -0
  432. package/src/utils/responses-output.ts +115 -0
  433. package/src/utils/sdk-client.ts +41 -0
  434. package/src/utils/waifu-metering.ts +302 -0
  435. package/dist/actions/check-credits.d.ts +0 -6
  436. package/dist/actions/check-credits.d.ts.map +0 -1
  437. package/dist/actions/freeze-agent.d.ts +0 -9
  438. package/dist/actions/freeze-agent.d.ts.map +0 -1
  439. package/dist/actions/index.d.ts +0 -5
  440. package/dist/actions/index.d.ts.map +0 -1
  441. package/dist/actions/provision-agent.d.ts +0 -8
  442. package/dist/actions/provision-agent.d.ts.map +0 -1
  443. package/dist/actions/resume-agent.d.ts +0 -9
  444. package/dist/actions/resume-agent.d.ts.map +0 -1
  445. package/dist/build.d.ts +0 -3
  446. package/dist/build.d.ts.map +0 -1
  447. package/dist/generated/specs/specs.d.ts +0 -55
  448. package/dist/generated/specs/specs.d.ts.map +0 -1
  449. package/dist/models/object.d.ts +0 -4
  450. package/dist/models/object.d.ts.map +0 -1
  451. package/dist/utils/forwarded-settings.d.ts +0 -8
  452. package/dist/utils/forwarded-settings.d.ts.map +0 -1
@@ -0,0 +1,301 @@
1
+ /**
2
+ * Cloud TTS helpers — proxy to Eliza Cloud (`elizacloud.ai`).
3
+ *
4
+ * Pure / config-driven helpers (TTS API key resolution, base URL resolution,
5
+ * voice / model id normalization, compat header mirroring) live in
6
+ * `@elizaos/shared/elizacloud/server-cloud-tts` so host-layer packages can
7
+ * resolve cloud TTS configuration without reverse-importing this plugin.
8
+ *
9
+ * The HTTP request handler (`handleCloudTtsPreviewRoute`) stays here because
10
+ * it wires together the runtime route system.
11
+ */
12
+ import type http from "node:http";
13
+ import { sanitizeSpeechText } from "@elizaos/core";
14
+ import {
15
+ _internalResolveCloudApiKey,
16
+ ELIZA_CLOUD_TTS_MAX_TEXT_CHARS,
17
+ resolveCloudProxyTtsModel,
18
+ resolveCloudTtsCandidateUrls,
19
+ resolveElizaCloudTtsVoiceId,
20
+ shouldRetryCloudTtsUpstream,
21
+ ttsDebug,
22
+ ttsDebugTextPreview,
23
+ } from "@elizaos/shared";
24
+
25
+ export {
26
+ __resetCloudBaseUrlCache,
27
+ ELIZA_CLOUD_TTS_MAX_TEXT_CHARS,
28
+ ensureCloudTtsApiKeyAlias,
29
+ mirrorCompatHeaders,
30
+ normalizeElizaCloudTtsModelId,
31
+ resolveCloudProxyTtsModel,
32
+ resolveCloudTtsBaseUrl,
33
+ resolveCloudTtsCandidateUrls,
34
+ resolveElevenLabsApiKeyForCloudMode,
35
+ resolveElizaCloudTtsVoiceId,
36
+ shouldRetryCloudTtsUpstream,
37
+ } from "@elizaos/shared";
38
+
39
+ /** Browser → API correlation (never forwarded to Eliza Cloud). */
40
+ export function readTtsDebugClientHeaders(
41
+ req: Pick<http.IncomingMessage, "headers">,
42
+ ): {
43
+ messageId?: string;
44
+ clipSegment?: string;
45
+ hearingFull?: string;
46
+ } {
47
+ const pick = (name: string): string | undefined => {
48
+ const raw = req.headers[name];
49
+ if (raw == null) return undefined;
50
+ const v = Array.isArray(raw) ? raw[0] : raw;
51
+ return typeof v === "string" && v.trim() ? v.trim() : undefined;
52
+ };
53
+ const decode = (enc: string | undefined): string | undefined => {
54
+ if (!enc) return undefined;
55
+ try {
56
+ return decodeURIComponent(enc);
57
+ } catch {
58
+ return enc;
59
+ }
60
+ };
61
+ return {
62
+ messageId: decode(pick("x-elizaos-tts-message-id")),
63
+ clipSegment: decode(pick("x-elizaos-tts-clip-segment")),
64
+ hearingFull: decode(pick("x-elizaos-tts-full-preview")),
65
+ };
66
+ }
67
+
68
+ function ttsClientDbgFields(
69
+ hdr: ReturnType<typeof readTtsDebugClientHeaders>,
70
+ ): Record<string, string> {
71
+ const o: Record<string, string> = {};
72
+ if (hdr.messageId) o.messageId = hdr.messageId;
73
+ if (hdr.clipSegment) o.clipSegment = hdr.clipSegment;
74
+ if (hdr.hearingFull) o.hearingFull = hdr.hearingFull;
75
+ return o;
76
+ }
77
+
78
+ function pickBodyString(
79
+ body: Record<string, unknown>,
80
+ camel: string,
81
+ snake: string,
82
+ ): unknown {
83
+ const a = body[camel];
84
+ if (typeof a === "string" && a.trim()) return a;
85
+ const b = body[snake];
86
+ if (typeof b === "string" && b.trim()) return b;
87
+ return undefined;
88
+ }
89
+
90
+ async function readRawRequestBody(req: http.IncomingMessage): Promise<Buffer> {
91
+ const chunks: Buffer[] = [];
92
+ for await (const chunk of req) {
93
+ chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
94
+ }
95
+ return Buffer.concat(chunks);
96
+ }
97
+
98
+ function sendJsonResponse(
99
+ res: http.ServerResponse,
100
+ status: number,
101
+ body: unknown,
102
+ ): void {
103
+ if (res.headersSent) return;
104
+ res.statusCode = status;
105
+ res.setHeader("content-type", "application/json; charset=utf-8");
106
+ res.end(JSON.stringify(body));
107
+ }
108
+
109
+ function sendJsonErrorResponse(
110
+ res: http.ServerResponse,
111
+ status: number,
112
+ message: string,
113
+ ): void {
114
+ sendJsonResponse(res, status, { error: message });
115
+ }
116
+
117
+ function forwardCloudTtsUpstreamError(
118
+ res: http.ServerResponse,
119
+ status: number,
120
+ bodyText: string,
121
+ ): void {
122
+ if (res.headersSent) return;
123
+ const trimmed = bodyText.trim();
124
+ if (
125
+ (trimmed.startsWith("{") && trimmed.endsWith("}")) ||
126
+ (trimmed.startsWith("[") && trimmed.endsWith("]"))
127
+ ) {
128
+ try {
129
+ const parsed: unknown = JSON.parse(trimmed);
130
+ sendJsonResponse(res, status, parsed);
131
+ return;
132
+ } catch {
133
+ /* fall through */
134
+ }
135
+ }
136
+ res.statusCode = status;
137
+ res.setHeader("content-type", "application/json; charset=utf-8");
138
+ res.end(
139
+ JSON.stringify({ error: trimmed || "Eliza Cloud TTS request failed" }),
140
+ );
141
+ }
142
+
143
+ export async function handleCloudTtsPreviewRoute(
144
+ req: http.IncomingMessage,
145
+ res: http.ServerResponse,
146
+ ): Promise<boolean> {
147
+ const clientTtsDbg = readTtsDebugClientHeaders(req);
148
+ const dbgExtra = ttsClientDbgFields(clientTtsDbg);
149
+
150
+ const cloudApiKey = _internalResolveCloudApiKey();
151
+ if (!cloudApiKey) {
152
+ ttsDebug("server:cloud-tts:reject", {
153
+ reason: "no_api_key",
154
+ ...dbgExtra,
155
+ });
156
+ sendJsonErrorResponse(
157
+ res,
158
+ 401,
159
+ "Eliza Cloud is not connected. Connect your Eliza Cloud account first.",
160
+ );
161
+ return true;
162
+ }
163
+
164
+ const rawBody = await readRawRequestBody(req);
165
+ let body: Record<string, unknown>;
166
+ try {
167
+ body = JSON.parse(rawBody.toString("utf8")) as Record<string, unknown>;
168
+ } catch {
169
+ sendJsonErrorResponse(res, 400, "Invalid JSON request body");
170
+ return true;
171
+ }
172
+
173
+ const text = sanitizeSpeechText(
174
+ typeof body.text === "string" ? body.text : "",
175
+ );
176
+ if (!text) {
177
+ sendJsonErrorResponse(res, 400, "Missing text");
178
+ return true;
179
+ }
180
+
181
+ if (text.length > ELIZA_CLOUD_TTS_MAX_TEXT_CHARS) {
182
+ sendJsonErrorResponse(
183
+ res,
184
+ 400,
185
+ `Text too long. Maximum length is ${ELIZA_CLOUD_TTS_MAX_TEXT_CHARS} characters`,
186
+ );
187
+ return true;
188
+ }
189
+
190
+ const cloudModel = resolveCloudProxyTtsModel(
191
+ pickBodyString(body, "modelId", "model_id"),
192
+ );
193
+ const cloudVoice = resolveElizaCloudTtsVoiceId(
194
+ pickBodyString(body, "voiceId", "voice_id"),
195
+ );
196
+ const cloudUrls = resolveCloudTtsCandidateUrls();
197
+
198
+ const ttsPreview = ttsDebugTextPreview(text);
199
+ ttsDebug("server:cloud-tts:proxy", {
200
+ textChars: text.length,
201
+ preview: ttsPreview,
202
+ modelId: cloudModel,
203
+ voiceId: cloudVoice,
204
+ urlCandidates: cloudUrls.length,
205
+ ...dbgExtra,
206
+ });
207
+
208
+ try {
209
+ let lastStatus = 0;
210
+ let lastDetails = "unknown error";
211
+ let cloudResponse: Response | null = null;
212
+ for (let i = 0; i < cloudUrls.length; i++) {
213
+ const cloudUrl = cloudUrls[i];
214
+ if (cloudUrl === undefined) {
215
+ continue;
216
+ }
217
+ const attempt = await fetch(cloudUrl, {
218
+ method: "POST",
219
+ headers: {
220
+ Authorization: `Bearer ${cloudApiKey}`,
221
+ "x-api-key": cloudApiKey,
222
+ "Content-Type": "application/json",
223
+ Accept: "audio/mpeg",
224
+ },
225
+ body: JSON.stringify({
226
+ text,
227
+ voiceId: cloudVoice,
228
+ modelId: cloudModel,
229
+ }),
230
+ });
231
+
232
+ if (attempt.ok) {
233
+ cloudResponse = attempt;
234
+ ttsDebug("server:cloud-tts:upstream-ok", {
235
+ urlIndex: i,
236
+ status: attempt.status,
237
+ preview: ttsPreview,
238
+ ...dbgExtra,
239
+ });
240
+ break;
241
+ }
242
+
243
+ lastStatus = attempt.status;
244
+ lastDetails = await attempt.text().catch(() => "unknown error");
245
+ ttsDebug("server:cloud-tts:upstream-retry", {
246
+ urlIndex: i,
247
+ status: attempt.status,
248
+ preview: ttsPreview,
249
+ ...dbgExtra,
250
+ });
251
+
252
+ const hasMoreCandidates = i < cloudUrls.length - 1;
253
+ if (!hasMoreCandidates || !shouldRetryCloudTtsUpstream(attempt.status)) {
254
+ break;
255
+ }
256
+ }
257
+ if (!cloudResponse) {
258
+ ttsDebug("server:cloud-tts:reject", {
259
+ reason: "upstream_failed",
260
+ lastStatus,
261
+ preview: ttsPreview,
262
+ ...dbgExtra,
263
+ });
264
+ if (
265
+ lastStatus === 400 ||
266
+ lastStatus === 401 ||
267
+ lastStatus === 402 ||
268
+ lastStatus === 403 ||
269
+ lastStatus === 429
270
+ ) {
271
+ forwardCloudTtsUpstreamError(res, lastStatus, lastDetails);
272
+ return true;
273
+ }
274
+ sendJsonErrorResponse(
275
+ res,
276
+ 502,
277
+ `Eliza Cloud TTS failed (${lastStatus || 502}): ${lastDetails}`,
278
+ );
279
+ return true;
280
+ }
281
+
282
+ const audioBuffer = Buffer.from(await cloudResponse.arrayBuffer());
283
+ ttsDebug("server:cloud-tts:success", {
284
+ bytes: audioBuffer.length,
285
+ preview: ttsPreview,
286
+ ...dbgExtra,
287
+ });
288
+ res.statusCode = 200;
289
+ res.setHeader("Content-Type", "audio/mpeg");
290
+ res.setHeader("Cache-Control", "no-store");
291
+ res.end(audioBuffer);
292
+ return true;
293
+ } catch (err) {
294
+ sendJsonErrorResponse(
295
+ res,
296
+ 502,
297
+ `Eliza Cloud TTS request failed: ${err instanceof Error ? err.message : String(err)}`,
298
+ );
299
+ return true;
300
+ }
301
+ }
@@ -0,0 +1,28 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import {
4
+ getElizaNamespace,
5
+ resolveStateDir,
6
+ resolveUserPath,
7
+ } from "@elizaos/core";
8
+
9
+ export { getElizaNamespace, resolveStateDir, resolveUserPath };
10
+
11
+ export function resolveConfigPath(
12
+ env: NodeJS.ProcessEnv = process.env,
13
+ stateDirPath: string = resolveStateDir(env),
14
+ ): string {
15
+ const override = env.ELIZA_CONFIG_PATH?.trim();
16
+ if (override) return resolveUserPath(override);
17
+
18
+ const namespace = getElizaNamespace(env);
19
+ const primaryPath = path.join(stateDirPath, `${namespace}.json`);
20
+ if (fs.existsSync(primaryPath)) return primaryPath;
21
+
22
+ if (namespace !== "eliza") {
23
+ const legacyPath = path.join(stateDirPath, "eliza.json");
24
+ if (fs.existsSync(legacyPath)) return legacyPath;
25
+ }
26
+
27
+ return primaryPath;
28
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * TTS debug logging. Implementation moved to
3
+ * `@elizaos/shared/elizacloud/tts-debug`.
4
+ */
5
+ export { isTtsDebugEnabled, ttsDebug, ttsDebugTextPreview } from "@elizaos/shared";
@@ -0,0 +1,298 @@
1
+ import type { IAgentRuntime, TextEmbeddingParams } from "@elizaos/core";
2
+ import {
3
+ logger,
4
+ ModelType,
5
+ timeInferenceSpan,
6
+ VECTOR_DIMS,
7
+ } from "@elizaos/core";
8
+ import { getSetting } from "../utils/config";
9
+ import { emitModelUsageEvent } from "../utils/events";
10
+ import { createCloudApiClient } from "../utils/sdk-client";
11
+
12
+ const MAX_BATCH_SIZE = 100;
13
+
14
+ // ── Bounded retry/backoff for the /embeddings round-trip ──────────────────
15
+ // Embeddings are off the turn's critical path (queueEmbeddingGeneration is
16
+ // fire-and-forget), so a stall here delays the embedding QUEUE, not a reply.
17
+ // The old behaviour — one blind 30s (or full retry-after) sleep then a single
18
+ // retry — could park the queue for 30s+ on a transient 429. Replaced with
19
+ // bounded exponential backoff + jitter, a CAP on any single wait (so a large
20
+ // server retry-after can't stall the queue indefinitely), and a per-request
21
+ // client-side timeout (the endpoint had none, so a hung gateway hung the
22
+ // queue forever).
23
+ //
24
+ // Handler retries are deliberately SMALL: the EmbeddingGenerationService
25
+ // BatchQueue already wraps generateEmbedding in its own multi-attempt backoff,
26
+ // so this layer absorbs only a single transient burst (one quick retry) and
27
+ // defers sustained pressure to the queue — otherwise the two backoffs compound.
28
+ const EMBED_MAX_ATTEMPTS = 2;
29
+ const EMBED_BACKOFF_BASE_MS = 1_000;
30
+ const EMBED_BACKOFF_CAP_MS = 8_000;
31
+ const EMBED_REQUEST_TIMEOUT_MS = 60_000;
32
+
33
+ /**
34
+ * Backoff before the next embedding attempt. Exponential (base·2^attempt) as a
35
+ * floor, honoring the server's `retry-after` when present, but never longer
36
+ * than {@link EMBED_BACKOFF_CAP_MS}; ±25% jitter spreads retries from a burst.
37
+ */
38
+ function embeddingBackoffMs(attempt: number, retryAfterSec?: number): number {
39
+ const exp = EMBED_BACKOFF_BASE_MS * 2 ** attempt;
40
+ const serverHint =
41
+ typeof retryAfterSec === "number" && retryAfterSec > 0
42
+ ? retryAfterSec * 1000
43
+ : 0;
44
+ const base = Math.min(EMBED_BACKOFF_CAP_MS, Math.max(exp, serverHint));
45
+ return Math.round(base * (1 + Math.random() * 0.25));
46
+ }
47
+
48
+ function sleep(ms: number): Promise<void> {
49
+ return new Promise((resolve) => setTimeout(resolve, ms));
50
+ }
51
+
52
+ function extractRateLimitInfo(response: Response): {
53
+ remainingRequests?: number;
54
+ remainingTokens?: number;
55
+ limitRequests?: number;
56
+ limitTokens?: number;
57
+ resetRequests?: string;
58
+ resetTokens?: string;
59
+ retryAfter?: number;
60
+ } {
61
+ return {
62
+ remainingRequests:
63
+ parseInt(response.headers.get("x-ratelimit-remaining-requests") || "", 10) || undefined,
64
+ remainingTokens:
65
+ parseInt(response.headers.get("x-ratelimit-remaining-tokens") || "", 10) || undefined,
66
+ limitRequests:
67
+ parseInt(response.headers.get("x-ratelimit-limit-requests") || "", 10) || undefined,
68
+ limitTokens: parseInt(response.headers.get("x-ratelimit-limit-tokens") || "", 10) || undefined,
69
+ resetRequests: response.headers.get("x-ratelimit-reset-requests") || undefined,
70
+ resetTokens: response.headers.get("x-ratelimit-reset-tokens") || undefined,
71
+ retryAfter: parseInt(response.headers.get("retry-after") || "", 10) || undefined,
72
+ };
73
+ }
74
+
75
+ function getEmbeddingConfig(runtime: IAgentRuntime) {
76
+ const embeddingModelName = getSetting(
77
+ runtime,
78
+ "ELIZAOS_CLOUD_EMBEDDING_MODEL",
79
+ "text-embedding-3-small"
80
+ );
81
+ const embeddingDimension = Number.parseInt(
82
+ getSetting(runtime, "ELIZAOS_CLOUD_EMBEDDING_DIMENSIONS", "1536") || "1536",
83
+ 10
84
+ ) as (typeof VECTOR_DIMS)[keyof typeof VECTOR_DIMS];
85
+
86
+ if (!Object.values(VECTOR_DIMS).includes(embeddingDimension)) {
87
+ const errorMsg = `Invalid embedding dimension: ${embeddingDimension}. Must be one of: ${Object.values(VECTOR_DIMS).join(", ")}`;
88
+ logger.error(errorMsg);
89
+ throw new Error(errorMsg);
90
+ }
91
+
92
+ return { embeddingModelName, embeddingDimension };
93
+ }
94
+
95
+ /**
96
+ * The init probe vector. `runtime.ensureEmbeddingDimension()` calls the handler
97
+ * with `null` purely to learn the vector length; it only inspects `.length`, so
98
+ * a deterministic non-zero[0] marker vector is the correct, legitimate response.
99
+ * This is the ONLY place a synthetic vector is returned — every real failure
100
+ * throws so it can never be persisted as a corrupt embedding (Commandment 8).
101
+ */
102
+ function createInitProbeVector(dimension: number): number[] {
103
+ const vector = Array(dimension).fill(0);
104
+ vector[0] = 0.1;
105
+ return vector;
106
+ }
107
+
108
+ export interface BatchEmbeddingParams {
109
+ texts: string[];
110
+ }
111
+
112
+ export async function handleTextEmbedding(
113
+ runtime: IAgentRuntime,
114
+ params: TextEmbeddingParams | string | null
115
+ ): Promise<number[]> {
116
+ const { embeddingDimension } = getEmbeddingConfig(runtime);
117
+
118
+ if (params === null) {
119
+ logger.debug("Creating test embedding for initialization");
120
+ return createInitProbeVector(embeddingDimension);
121
+ }
122
+
123
+ let text: string;
124
+ if (typeof params === "string") {
125
+ text = params;
126
+ } else if (typeof params === "object" && params.text) {
127
+ text = params.text;
128
+ } else {
129
+ // A malformed request is a programming error, not a recoverable runtime
130
+ // state. Throw instead of returning a marker vector that would silently
131
+ // corrupt the embedding store (Commandment 8).
132
+ throw new Error("Invalid input format for embedding: expected string or { text: string }");
133
+ }
134
+
135
+ if (!text.trim()) {
136
+ throw new Error("Cannot generate embedding for empty text");
137
+ }
138
+
139
+ const results = await handleBatchTextEmbedding(runtime, [text]);
140
+ return results[0];
141
+ }
142
+
143
+ export interface BatchEmbeddingResult {
144
+ embedding: number[];
145
+ index: number;
146
+ success: boolean;
147
+ error?: string;
148
+ }
149
+
150
+ export async function handleBatchTextEmbedding(
151
+ runtime: IAgentRuntime,
152
+ texts: string[]
153
+ ): Promise<number[][]> {
154
+ const { embeddingModelName, embeddingDimension } = getEmbeddingConfig(runtime);
155
+ const client = createCloudApiClient(runtime, true);
156
+
157
+ if (!texts || texts.length === 0) {
158
+ return [];
159
+ }
160
+
161
+ // Every text must be non-empty: an empty input cannot produce a meaningful
162
+ // vector, and a marker/zero vector would silently corrupt the store. Surface
163
+ // the bad input to the caller (Commandment 8) instead of papering over it.
164
+ const validTexts: { text: string; originalIndex: number }[] = [];
165
+ for (let i = 0; i < texts.length; i++) {
166
+ const text = texts[i]?.trim();
167
+ if (!text) {
168
+ throw new Error(`Cannot generate embedding for empty text at index ${i}`);
169
+ }
170
+ validTexts.push({ text, originalIndex: i });
171
+ }
172
+
173
+ const results: number[][] = new Array(texts.length);
174
+
175
+ for (let batchStart = 0; batchStart < validTexts.length; batchStart += MAX_BATCH_SIZE) {
176
+ const batchEnd = Math.min(batchStart + MAX_BATCH_SIZE, validTexts.length);
177
+ const batch = validTexts.slice(batchStart, batchEnd);
178
+ const batchTexts = batch.map((b) => b.text);
179
+
180
+ logger.info(
181
+ `[BatchEmbeddings] Processing batch ${Math.floor(batchStart / MAX_BATCH_SIZE) + 1}/${Math.ceil(validTexts.length / MAX_BATCH_SIZE)}: ${batch.length} texts`
182
+ );
183
+
184
+ try {
185
+ // Records a `cloud.embedding` span on the active per-turn timer when an
186
+ // embedding happens to be on a turn's critical path (most are queued /
187
+ // detached, so this is a no-op there — which is exactly what proves they
188
+ // don't add to turn latency). Retries transient throttling/5xx with
189
+ // bounded exponential backoff (see EMBED_* constants) instead of a single
190
+ // 30s blind sleep.
191
+ let response: Response | null = null;
192
+ for (let attempt = 0; attempt < EMBED_MAX_ATTEMPTS; attempt++) {
193
+ const resp = await timeInferenceSpan(
194
+ "cloud.embedding",
195
+ () =>
196
+ client.requestRaw("POST", "/embeddings", {
197
+ json: {
198
+ model: embeddingModelName,
199
+ input: batchTexts,
200
+ },
201
+ timeoutMs: EMBED_REQUEST_TIMEOUT_MS,
202
+ }),
203
+ { batch: batchTexts.length, attempt }
204
+ );
205
+
206
+ const rateLimitInfo = extractRateLimitInfo(resp);
207
+ if (
208
+ rateLimitInfo.remainingRequests !== undefined &&
209
+ rateLimitInfo.remainingRequests < 50
210
+ ) {
211
+ logger.warn(
212
+ `[BatchEmbeddings] Rate limit: ${rateLimitInfo.remainingRequests}/${rateLimitInfo.limitRequests} requests remaining`
213
+ );
214
+ }
215
+
216
+ const transient =
217
+ resp.status === 429 ||
218
+ resp.status === 502 ||
219
+ resp.status === 503 ||
220
+ resp.status === 504;
221
+ if (transient && attempt < EMBED_MAX_ATTEMPTS - 1) {
222
+ const delay = embeddingBackoffMs(attempt, rateLimitInfo.retryAfter);
223
+ logger.warn(
224
+ `[BatchEmbeddings] ${resp.status} (attempt ${attempt + 1}/${EMBED_MAX_ATTEMPTS}) — backing off ${delay}ms`
225
+ );
226
+ // Drain the body so the underlying connection can be reused.
227
+ await resp.text().catch(() => undefined);
228
+ await sleep(delay);
229
+ continue;
230
+ }
231
+ response = resp;
232
+ break;
233
+ }
234
+
235
+ // Type guard: the loop assigns `response` on its final iteration, so this
236
+ // is unreachable in practice.
237
+ if (!response) {
238
+ throw new Error("[BatchEmbeddings] No response after retry loop");
239
+ }
240
+
241
+ if (!response.ok) {
242
+ // Auth errors (401/403) are non-recoverable with the current key.
243
+ // Every other non-OK status is just as fatal for this batch — neither
244
+ // can produce real vectors. Throw in both cases so the router falls
245
+ // through to the next provider (e.g. local inference) instead of
246
+ // silently persisting marker/zero vectors that corrupt the embedding
247
+ // store. Commandment 8: don't hide broken pipelines behind fallbacks.
248
+ if (response.status === 401 || response.status === 403) {
249
+ throw new Error(
250
+ `[BatchEmbeddings] Authentication failed (${response.status}). ` +
251
+ `Check ELIZAOS_CLOUD_API_KEY or ELIZAOS_CLOUD_EMBEDDING_API_KEY — ` +
252
+ `the current key is not authorized for the embedding endpoint.`
253
+ );
254
+ }
255
+ throw new Error(
256
+ `[BatchEmbeddings] API error: ${response.status} ${response.statusText}`
257
+ );
258
+ }
259
+
260
+ const data = (await response.json()) as {
261
+ data?: Array<{ embedding: number[]; index: number }>;
262
+ usage?: { prompt_tokens: number; total_tokens: number };
263
+ };
264
+
265
+ if (!data?.data || !Array.isArray(data.data)) {
266
+ throw new Error("[BatchEmbeddings] API returned invalid response structure");
267
+ }
268
+
269
+ for (const item of data.data) {
270
+ const originalIndex = batch[item.index].originalIndex;
271
+ results[originalIndex] = item.embedding;
272
+ }
273
+
274
+ if (data.usage) {
275
+ const usage = {
276
+ inputTokens: data.usage.prompt_tokens,
277
+ outputTokens: 0,
278
+ totalTokens: data.usage.total_tokens,
279
+ };
280
+ emitModelUsageEvent(runtime, ModelType.TEXT_EMBEDDING, `batch:${batch.length}`, usage);
281
+ }
282
+
283
+ logger.debug(
284
+ `[BatchEmbeddings] Got ${batch.length} embeddings (${embeddingDimension}d)`
285
+ );
286
+ } catch (error) {
287
+ // Any failure in this batch (HTTP error, transport error, malformed body)
288
+ // means we have no real vectors for it. Log context and re-throw so the
289
+ // router can fall through to another provider; never persist marker/zero
290
+ // vectors that would corrupt the embedding store (Commandment 8).
291
+ const message = error instanceof Error ? error.message : String(error);
292
+ logger.error(`[BatchEmbeddings] Batch failed: ${message}`);
293
+ throw error instanceof Error ? error : new Error(message);
294
+ }
295
+ }
296
+
297
+ return results;
298
+ }