@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,238 @@
1
+ import {
2
+ isCloudInferenceSelectedInConfig,
3
+ isElizaCloudServiceSelectedInConfig,
4
+ migrateLegacyRuntimeConfig,
5
+ } from "@elizaos/core";
6
+ import type {
7
+ AgentRuntime,
8
+ RouteHelpers,
9
+ RouteRequestMeta,
10
+ Service,
11
+ } from "@elizaos/core";
12
+ import { resolveCloudApiBaseUrl as resolveCanonicalCloudApiBaseUrl } from "../cloud/base-url.js";
13
+ import { resolveCloudApiKey } from "../cloud/cloud-api-key.js";
14
+ import { validateCloudBaseUrl } from "../cloud/validate-url.js";
15
+
16
+ const DEFAULT_CLOUD_API_BASE_URL = "https://www.elizacloud.ai/api/v1";
17
+ const CLOUD_BILLING_URL =
18
+ "https://www.elizacloud.ai/dashboard/settings?tab=billing";
19
+
20
+ interface CloudAuthIdentityService {
21
+ isAuthenticated: () => boolean;
22
+ getUserId?: () => string | undefined;
23
+ getOrganizationId?: () => string | undefined;
24
+ }
25
+
26
+ interface CloudAuthCreditsService {
27
+ isAuthenticated: () => boolean;
28
+ getClient: () => { get: <T>(path: string) => Promise<T> };
29
+ }
30
+
31
+ export interface CloudConfigLike {
32
+ cloud?: {
33
+ enabled?: boolean;
34
+ apiKey?: string;
35
+ baseUrl?: string;
36
+ };
37
+ }
38
+
39
+ export interface CloudStatusRouteContext
40
+ extends RouteRequestMeta,
41
+ Pick<RouteHelpers, "json"> {
42
+ config: CloudConfigLike;
43
+ runtime: AgentRuntime | null;
44
+ }
45
+
46
+ function resolveCloudApiBaseUrl(rawBaseUrl?: string): string {
47
+ return resolveCanonicalCloudApiBaseUrl(
48
+ rawBaseUrl ?? DEFAULT_CLOUD_API_BASE_URL,
49
+ );
50
+ }
51
+
52
+ /**
53
+ * Coerce an Eliza Cloud `balance` field into a number. The cloud API
54
+ * returns `balance` as `string | number` — string when upstream is using
55
+ * fixed-precision decimals, number when arithmetic'd. Treat both as the
56
+ * same dollar amount.
57
+ */
58
+ function coerceCloudBalance(value: unknown): number | null {
59
+ if (typeof value === "number" && Number.isFinite(value)) {
60
+ return value;
61
+ }
62
+ if (typeof value === "string") {
63
+ const trimmed = value.trim();
64
+ if (!trimmed) return null;
65
+ const parsed = Number.parseFloat(trimmed);
66
+ return Number.isFinite(parsed) ? parsed : null;
67
+ }
68
+ return null;
69
+ }
70
+
71
+ async function fetchCloudCreditsByApiKey(
72
+ baseUrl: string,
73
+ apiKey: string,
74
+ ): Promise<number | null> {
75
+ const response = await fetch(`${baseUrl}/credits/balance`, {
76
+ headers: {
77
+ Accept: "application/json",
78
+ Authorization: `Bearer ${apiKey}`,
79
+ },
80
+ redirect: "manual",
81
+ signal: AbortSignal.timeout(10_000),
82
+ });
83
+
84
+ if (response.status >= 300 && response.status < 400) {
85
+ throw new Error(
86
+ "Cloud credits request was redirected; redirects are not allowed",
87
+ );
88
+ }
89
+
90
+ const creditResponse = (await response.json().catch(() => ({}))) as Record<
91
+ string,
92
+ unknown
93
+ >;
94
+
95
+ if (!response.ok) {
96
+ const message =
97
+ typeof creditResponse.error === "string" && creditResponse.error.trim()
98
+ ? creditResponse.error
99
+ : `HTTP ${response.status}`;
100
+ throw new Error(message);
101
+ }
102
+
103
+ const balance =
104
+ coerceCloudBalance(creditResponse.balance) ??
105
+ coerceCloudBalance(
106
+ (creditResponse.data as Record<string, unknown> | undefined)?.balance,
107
+ );
108
+ return balance;
109
+ }
110
+
111
+ export async function handleCloudStatusRoutes(
112
+ ctx: CloudStatusRouteContext,
113
+ ): Promise<boolean> {
114
+ const { res, method, pathname, config, runtime, json } = ctx;
115
+
116
+ if (method === "GET" && pathname === "/api/cloud/status") {
117
+ migrateLegacyRuntimeConfig(config as Record<string, unknown>);
118
+ const cloudEnabled = isCloudInferenceSelectedInConfig(
119
+ config as Record<string, unknown>,
120
+ );
121
+ const cloudVoiceProxyAvailable = isElizaCloudServiceSelectedInConfig(
122
+ config as Record<string, unknown>,
123
+ "tts",
124
+ );
125
+ const configApiKey = resolveCloudApiKey(config, runtime);
126
+ const hasApiKey = Boolean(configApiKey);
127
+ const cloudAuth = runtime
128
+ ? runtime.getService<Service & CloudAuthIdentityService>("CLOUD_AUTH")
129
+ : null;
130
+ const authConnected = Boolean(cloudAuth?.isAuthenticated());
131
+
132
+ if (authConnected || hasApiKey) {
133
+ json(res, {
134
+ connected: true,
135
+ enabled: cloudEnabled,
136
+ cloudVoiceProxyAvailable,
137
+ hasApiKey,
138
+ userId: authConnected ? cloudAuth?.getUserId?.() : undefined,
139
+ organizationId: authConnected
140
+ ? cloudAuth?.getOrganizationId?.()
141
+ : undefined,
142
+ topUpUrl: CLOUD_BILLING_URL,
143
+ reason: authConnected
144
+ ? undefined
145
+ : runtime
146
+ ? "api_key_present_not_authenticated"
147
+ : "api_key_present_runtime_not_started",
148
+ });
149
+ return true;
150
+ }
151
+
152
+ if (!runtime) {
153
+ json(res, {
154
+ connected: false,
155
+ enabled: cloudEnabled,
156
+ cloudVoiceProxyAvailable,
157
+ hasApiKey,
158
+ reason: "runtime_not_started",
159
+ });
160
+ return true;
161
+ }
162
+
163
+ json(res, {
164
+ connected: false,
165
+ enabled: cloudEnabled,
166
+ cloudVoiceProxyAvailable,
167
+ hasApiKey,
168
+ reason: "not_authenticated",
169
+ });
170
+ return true;
171
+ }
172
+
173
+ if (method === "GET" && pathname === "/api/cloud/credits") {
174
+ const cloudAuth = runtime
175
+ ? runtime.getService<Service & CloudAuthCreditsService>("CLOUD_AUTH")
176
+ : null;
177
+ const configApiKey = resolveCloudApiKey(config, runtime);
178
+
179
+ if (!cloudAuth?.isAuthenticated()) {
180
+ if (!configApiKey) {
181
+ json(res, { balance: null, connected: false });
182
+ return true;
183
+ }
184
+
185
+ const resolvedBaseUrl = resolveCloudApiBaseUrl(config.cloud?.baseUrl);
186
+ const baseUrlRejection = await validateCloudBaseUrl(resolvedBaseUrl);
187
+ if (baseUrlRejection) {
188
+ json(res, { balance: null, connected: true, error: baseUrlRejection });
189
+ return true;
190
+ }
191
+
192
+ const balance = await fetchCloudCreditsByApiKey(
193
+ resolvedBaseUrl,
194
+ configApiKey,
195
+ );
196
+ if (typeof balance !== "number") {
197
+ throw new Error("unexpected response");
198
+ }
199
+ const low = balance < 2.0;
200
+ const critical = balance < 0.5;
201
+ json(res, {
202
+ connected: true,
203
+ balance,
204
+ low,
205
+ critical,
206
+ topUpUrl: CLOUD_BILLING_URL,
207
+ });
208
+ return true;
209
+ }
210
+
211
+ const client = cloudAuth.getClient();
212
+ const creditResponse =
213
+ await client.get<Record<string, unknown>>("/credits/balance");
214
+ const balance =
215
+ coerceCloudBalance(creditResponse?.balance) ??
216
+ coerceCloudBalance(
217
+ (creditResponse?.data as Record<string, unknown> | undefined)?.balance,
218
+ );
219
+ if (typeof balance !== "number") {
220
+ throw new Error(
221
+ `Unexpected response shape: ${JSON.stringify(creditResponse)}`,
222
+ );
223
+ }
224
+
225
+ const low = balance < 2.0;
226
+ const critical = balance < 0.5;
227
+ json(res, {
228
+ connected: true,
229
+ balance,
230
+ low,
231
+ critical,
232
+ topUpUrl: CLOUD_BILLING_URL,
233
+ });
234
+ return true;
235
+ }
236
+
237
+ return false;
238
+ }
@@ -0,0 +1,73 @@
1
+ import type {
2
+ CloudConfigLike,
3
+ CloudStatusRouteContext,
4
+ } from "./cloud-status-routes-autonomous.js";
5
+ import type { ElizaConfig } from "../lib/config-like";
6
+ import { isElizaCloudServiceSelectedInConfig } from "@elizaos/core";
7
+ import {
8
+ CLOUD_BILLING_URL,
9
+ fetchCloudCredits,
10
+ resolveCloudConnectionSnapshot,
11
+ } from "../lib/cloud-connection";
12
+
13
+ export type { CloudConfigLike, CloudStatusRouteContext };
14
+
15
+ export async function handleCloudStatusRoutes(
16
+ ctx: CloudStatusRouteContext,
17
+ ): Promise<boolean> {
18
+ const { res, method, pathname, config, runtime, json } = ctx;
19
+ const typedConfig = config as ElizaConfig;
20
+
21
+ if (method === "GET" && pathname === "/api/cloud/status") {
22
+ const snapshot = resolveCloudConnectionSnapshot(typedConfig, runtime);
23
+ const cloudVoiceProxyAvailable = isElizaCloudServiceSelectedInConfig(
24
+ typedConfig as Record<string, unknown>,
25
+ "tts",
26
+ );
27
+
28
+ if (snapshot.connected) {
29
+ json(res, {
30
+ connected: true,
31
+ enabled: snapshot.enabled,
32
+ cloudVoiceProxyAvailable,
33
+ hasApiKey: snapshot.hasApiKey,
34
+ userId: snapshot.userId,
35
+ organizationId: snapshot.organizationId,
36
+ topUpUrl: CLOUD_BILLING_URL,
37
+ reason: snapshot.authConnected
38
+ ? undefined
39
+ : runtime
40
+ ? "api_key_present_not_authenticated"
41
+ : "api_key_present_runtime_not_started",
42
+ });
43
+ return true;
44
+ }
45
+
46
+ if (!runtime) {
47
+ json(res, {
48
+ connected: false,
49
+ enabled: snapshot.enabled,
50
+ cloudVoiceProxyAvailable,
51
+ hasApiKey: snapshot.hasApiKey,
52
+ reason: "runtime_not_started",
53
+ });
54
+ return true;
55
+ }
56
+
57
+ json(res, {
58
+ connected: false,
59
+ enabled: snapshot.enabled,
60
+ cloudVoiceProxyAvailable,
61
+ hasApiKey: snapshot.hasApiKey,
62
+ reason: "not_authenticated",
63
+ });
64
+ return true;
65
+ }
66
+
67
+ if (method === "GET" && pathname === "/api/cloud/credits") {
68
+ json(res, await fetchCloudCredits(typedConfig, runtime));
69
+ return true;
70
+ }
71
+
72
+ return false;
73
+ }
@@ -0,0 +1,83 @@
1
+ import { normalizeCloudSiteUrl } from "@elizaos/shared";
2
+
3
+ export const HOME_REMOTE_RUNNER_ACCESS_SESSION_PARAM = "homeRemoteRunnerSession";
4
+
5
+ export interface HomeRemoteRunnerSshTunnel {
6
+ command: string;
7
+ localUrl: string;
8
+ }
9
+
10
+ export function buildHomeRemoteRunnerAccessUrl(input: {
11
+ cloudBaseUrl?: string | null;
12
+ sessionId?: string | null;
13
+ }): string | null {
14
+ const sessionId = input.sessionId?.trim();
15
+ if (!sessionId) return null;
16
+
17
+ try {
18
+ const url = new URL(normalizeCloudSiteUrl(input.cloudBaseUrl ?? undefined));
19
+ url.pathname = "/dashboard/app";
20
+ url.search = "";
21
+ url.hash = "";
22
+ url.searchParams.set(HOME_REMOTE_RUNNER_ACCESS_SESSION_PARAM, sessionId);
23
+ return url.toString();
24
+ } catch {
25
+ return null;
26
+ }
27
+ }
28
+
29
+ export function buildHomeRemoteRunnerSshTunnel(input: {
30
+ remoteBaseUrl?: string | null;
31
+ sshTarget?: string | null;
32
+ sshIdentity?: string | null;
33
+ localPort?: string | number | null;
34
+ }): HomeRemoteRunnerSshTunnel | null {
35
+ const sshTarget = normalizeSshTarget(input.sshTarget);
36
+ if (!sshTarget) return null;
37
+
38
+ let parsed: URL;
39
+ try {
40
+ parsed = new URL(input.remoteBaseUrl?.trim() ?? "");
41
+ } catch {
42
+ return null;
43
+ }
44
+
45
+ if (parsed.protocol !== "http:") {
46
+ return null;
47
+ }
48
+
49
+ const remotePort = parsed.port || "80";
50
+ const localPort = normalizePort(input.localPort) ?? remotePort;
51
+ const remoteHost =
52
+ parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1"
53
+ ? "127.0.0.1"
54
+ : parsed.hostname;
55
+ const identityArg = input.sshIdentity?.trim()
56
+ ? ` -i ${quoteShellArg(input.sshIdentity.trim())}`
57
+ : "";
58
+ const command = `ssh -N${identityArg} -L 127.0.0.1:${localPort}:${remoteHost}:${remotePort} ${sshTarget}`;
59
+ return {
60
+ command,
61
+ localUrl: `${parsed.protocol}//127.0.0.1:${localPort}`,
62
+ };
63
+ }
64
+
65
+ function normalizePort(value: string | number | null | undefined): string | null {
66
+ if (value === null || value === undefined) return null;
67
+ const raw = String(value).trim();
68
+ if (!/^\d+$/.test(raw)) return null;
69
+ const port = Number(raw);
70
+ if (!Number.isInteger(port) || port < 1 || port > 65535) return null;
71
+ return String(port);
72
+ }
73
+
74
+ function normalizeSshTarget(value: string | null | undefined): string | null {
75
+ const target = value?.trim();
76
+ if (!target) return null;
77
+ if (!/^[A-Za-z0-9._~%+-]+@[A-Za-z0-9.-]+$/.test(target)) return null;
78
+ return target;
79
+ }
80
+
81
+ function quoteShellArg(value: string): string {
82
+ return `'${value.replace(/'/g, "'\\''")}'`;
83
+ }
@@ -0,0 +1,193 @@
1
+ import type http from "node:http";
2
+ import {
3
+ type IAgentRuntime,
4
+ type Service,
5
+ sendJson,
6
+ sendJsonError,
7
+ } from "@elizaos/core";
8
+ import {
9
+ isCloudAuthApiKeyService,
10
+ normalizeCloudApiKey,
11
+ } from "../cloud/auth-service-types.js";
12
+ import { normalizeCloudSiteUrl } from "../cloud/base-url.js";
13
+ import { resolveCloudApiKey } from "../cloud/cloud-api-key.js";
14
+ import { validateCloudBaseUrl } from "../cloud/validate-url.js";
15
+ import type { CloudProxyConfigLike } from "../lib/config-like";
16
+
17
+ export interface TravelProviderRelayRouteState {
18
+ config: CloudProxyConfigLike;
19
+ runtime?: IAgentRuntime | null;
20
+ }
21
+
22
+ const PROXY_TIMEOUT_MS = 30_000;
23
+ const MAX_BODY_BYTES = 1_048_576;
24
+ const TRAVEL_PROVIDER_PATH_RE =
25
+ /^\/api\/cloud\/travel-providers\/([a-z0-9][a-z0-9-]*)(\/.*)$/;
26
+
27
+ function resolveProxyApiKey(
28
+ state: TravelProviderRelayRouteState,
29
+ ): string | null {
30
+ const cloudAuth = state.runtime?.getService<Service>("CLOUD_AUTH");
31
+ const runtimeApiKey =
32
+ isCloudAuthApiKeyService(cloudAuth) && cloudAuth.isAuthenticated() === true
33
+ ? normalizeCloudApiKey(cloudAuth.getApiKey?.())
34
+ : null;
35
+ return runtimeApiKey ?? resolveCloudApiKey(state.config, state.runtime);
36
+ }
37
+
38
+ function buildAuthHeaders(
39
+ config: CloudProxyConfigLike,
40
+ apiKey: string,
41
+ ): Record<string, string> {
42
+ const serviceKey = config.cloud?.serviceKey?.trim();
43
+ const headers: Record<string, string> = {
44
+ Accept: "application/json",
45
+ "Content-Type": "application/json",
46
+ Authorization: `Bearer ${apiKey}`,
47
+ };
48
+ if (serviceKey) headers["X-Service-Key"] = serviceKey;
49
+ return headers;
50
+ }
51
+
52
+ function readBody(req: http.IncomingMessage): Promise<string | undefined> {
53
+ return new Promise<string | undefined>((resolve, reject) => {
54
+ const chunks: Buffer[] = [];
55
+ let size = 0;
56
+ req.on("data", (chunk: Buffer) => {
57
+ size += chunk.length;
58
+ if (size > MAX_BODY_BYTES) {
59
+ reject(new Error("Request body too large"));
60
+ return;
61
+ }
62
+ chunks.push(chunk);
63
+ });
64
+ req.on("end", () =>
65
+ resolve(
66
+ chunks.length > 0 ? Buffer.concat(chunks).toString("utf-8") : undefined,
67
+ ),
68
+ );
69
+ req.on("error", reject);
70
+ });
71
+ }
72
+
73
+ async function readJsonResponse(response: Response): Promise<unknown> {
74
+ return response.json().catch(async () => ({
75
+ success: response.ok,
76
+ error: await response
77
+ .text()
78
+ .catch(() => "Travel-provider relay request failed"),
79
+ }));
80
+ }
81
+
82
+ function buildUpstreamPath(localPath: string): string {
83
+ const parsed = parseTravelProviderPath(localPath);
84
+ if (!parsed) {
85
+ throw new Error("Invalid travel-provider relay path");
86
+ }
87
+ return `/api/v1/${parsed.provider}${parsed.providerPath}`;
88
+ }
89
+
90
+ const TRAVEL_PROVIDER_RELAY_ROUTES: ReadonlyArray<{
91
+ method: "GET" | "POST";
92
+ pattern: RegExp;
93
+ }> = [
94
+ { method: "POST", pattern: /^\/offer-requests$/ },
95
+ { method: "GET", pattern: /^\/offers\/[^/]+$/ },
96
+ { method: "POST", pattern: /^\/orders$/ },
97
+ { method: "GET", pattern: /^\/orders\/[^/]+$/ },
98
+ { method: "POST", pattern: /^\/payments$/ },
99
+ ];
100
+
101
+ function parseTravelProviderPath(
102
+ pathname: string,
103
+ ): { provider: string; providerPath: string } | null {
104
+ const match = TRAVEL_PROVIDER_PATH_RE.exec(pathname);
105
+ if (!match) return null;
106
+ const [, provider, providerPath] = match;
107
+ return provider ? { provider, providerPath } : null;
108
+ }
109
+
110
+ function matchRoute(method: string, pathname: string): boolean {
111
+ const parsed = parseTravelProviderPath(pathname);
112
+ if (!parsed) return false;
113
+ return TRAVEL_PROVIDER_RELAY_ROUTES.some(
114
+ (route) => route.method === method && route.pattern.test(parsed.providerPath),
115
+ );
116
+ }
117
+
118
+ export async function handleTravelProviderRelayRoute(
119
+ req: http.IncomingMessage,
120
+ res: http.ServerResponse,
121
+ pathname: string,
122
+ method: string,
123
+ state: TravelProviderRelayRouteState,
124
+ ): Promise<boolean> {
125
+ const parsed = parseTravelProviderPath(pathname);
126
+ if (!parsed) return false;
127
+
128
+ if (!matchRoute(method, pathname)) {
129
+ sendJsonError(res, "Unknown travel-provider relay route", 404);
130
+ return true;
131
+ }
132
+
133
+ const apiKey = resolveProxyApiKey(state);
134
+ if (!apiKey) {
135
+ sendJsonError(
136
+ res,
137
+ "Not connected to Eliza Cloud. Sign in to use travel search.",
138
+ 401,
139
+ );
140
+ return true;
141
+ }
142
+
143
+ const baseUrl = normalizeCloudSiteUrl(state.config.cloud?.baseUrl);
144
+ const urlError = await validateCloudBaseUrl(baseUrl);
145
+ if (urlError) {
146
+ sendJsonError(res, urlError, 502);
147
+ return true;
148
+ }
149
+
150
+ const headers = buildAuthHeaders(state.config, apiKey);
151
+ let body: string | undefined;
152
+ if (method === "POST") {
153
+ try {
154
+ body = await readBody(req);
155
+ } catch (err) {
156
+ const msg = err instanceof Error ? err.message : "Failed to read body";
157
+ sendJsonError(res, msg, 413);
158
+ return true;
159
+ }
160
+ }
161
+
162
+ const fullUrl = new URL(req.url ?? pathname, "http://localhost");
163
+ const upstreamUrl = `${baseUrl}${buildUpstreamPath(pathname)}${fullUrl.search}`;
164
+ const upstreamResponse = await fetch(upstreamUrl, {
165
+ method,
166
+ headers,
167
+ body,
168
+ redirect: "manual",
169
+ signal: AbortSignal.timeout(PROXY_TIMEOUT_MS),
170
+ });
171
+
172
+ if (upstreamResponse.status === 402) {
173
+ await forward402(res, upstreamResponse);
174
+ return true;
175
+ }
176
+
177
+ const payload = await readJsonResponse(upstreamResponse);
178
+ sendJson(res, payload, upstreamResponse.status);
179
+ return true;
180
+ }
181
+
182
+ async function forward402(
183
+ res: http.ServerResponse,
184
+ upstream: Response,
185
+ ): Promise<void> {
186
+ const wwwAuth = upstream.headers.get("www-authenticate");
187
+ const contentType = upstream.headers.get("content-type") ?? "application/json";
188
+ const bodyText = await upstream.text();
189
+ res.statusCode = 402;
190
+ res.setHeader("Content-Type", contentType);
191
+ if (wwwAuth) res.setHeader("WWW-Authenticate", wwwAuth);
192
+ res.end(bodyText);
193
+ }