@elizaos/plugin-elizacloud 2.0.0-beta.1 → 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 (285) hide show
  1. package/README.md +20 -44
  2. package/auto-enable.ts +10 -5
  3. package/dist/browser/index.browser.js +2 -2
  4. package/dist/browser/index.browser.js.map +4 -4
  5. package/dist/cjs/index.node.cjs +2874 -5915
  6. package/dist/cjs/index.node.js.map +47 -116
  7. package/dist/cloud/auth-service-types.d.ts +8 -0
  8. package/dist/cloud/auth-service-types.d.ts.map +1 -0
  9. package/dist/cloud/auth-service-types.js +36 -0
  10. package/dist/cloud/auth-service-types.js.map +10 -0
  11. package/dist/cloud/auth.js +4 -51
  12. package/dist/cloud/auth.js.map +4 -4
  13. package/dist/cloud/base-url.d.ts +6 -2
  14. package/dist/cloud/base-url.d.ts.map +1 -1
  15. package/dist/cloud/base-url.js +3 -51
  16. package/dist/cloud/base-url.js.map +3 -3
  17. package/dist/cloud/bridge-client.d.ts +3 -3
  18. package/dist/cloud/bridge-client.d.ts.map +1 -1
  19. package/dist/cloud/bridge-client.js +3 -51
  20. package/dist/cloud/bridge-client.js.map +3 -3
  21. package/dist/cloud/clack-observer.d.ts +35 -0
  22. package/dist/cloud/clack-observer.d.ts.map +1 -0
  23. package/dist/cloud/clack-observer.js +143 -0
  24. package/dist/cloud/clack-observer.js.map +10 -0
  25. package/dist/cloud/cloud-manager.js +45 -92
  26. package/dist/cloud/cloud-manager.js.map +6 -6
  27. package/dist/cloud/cloud-wallet.js +2 -4835
  28. package/dist/cloud/cloud-wallet.js.map +3 -82
  29. package/dist/cloud/duffel-client.d.ts +181 -0
  30. package/dist/cloud/duffel-client.d.ts.map +1 -0
  31. package/dist/cloud/duffel-client.js +506 -0
  32. package/dist/cloud/duffel-client.js.map +11 -0
  33. package/dist/cloud/index.d.ts +6 -0
  34. package/dist/cloud/index.d.ts.map +1 -1
  35. package/dist/cloud/index.js +1782 -1
  36. package/dist/cloud/index.js.map +18 -3
  37. package/dist/cloud/lifeops-schedule-sync-client.d.ts +43 -0
  38. package/dist/cloud/lifeops-schedule-sync-client.d.ts.map +1 -0
  39. package/dist/cloud/lifeops-schedule-sync-client.js +180 -0
  40. package/dist/cloud/lifeops-schedule-sync-client.js.map +11 -0
  41. package/dist/cloud/lifeops-schedule-sync-contracts.d.ts +89 -0
  42. package/dist/cloud/lifeops-schedule-sync-contracts.d.ts.map +1 -0
  43. package/dist/cloud/lifeops-schedule-sync-contracts.js +39 -0
  44. package/dist/cloud/lifeops-schedule-sync-contracts.js.map +10 -0
  45. package/dist/cloud/managed-payment-clients.d.ts +166 -0
  46. package/dist/cloud/managed-payment-clients.d.ts.map +1 -0
  47. package/dist/cloud/managed-payment-clients.js +238 -0
  48. package/dist/cloud/managed-payment-clients.js.map +11 -0
  49. package/dist/cloud/null-observer.d.ts +35 -0
  50. package/dist/cloud/null-observer.d.ts.map +1 -0
  51. package/dist/cloud/null-observer.js +45 -0
  52. package/dist/cloud/null-observer.js.map +10 -0
  53. package/dist/cloud/setup-observer.d.ts +98 -0
  54. package/dist/cloud/setup-observer.d.ts.map +1 -0
  55. package/dist/cloud/setup-observer.js +2 -0
  56. package/dist/cloud/setup-observer.js.map +9 -0
  57. package/dist/cloud/validate-url.d.ts.map +1 -1
  58. package/dist/cloud/validate-url.js +2 -1
  59. package/dist/cloud/validate-url.js.map +3 -3
  60. package/dist/cloud/x402-payment-handler.d.ts +85 -0
  61. package/dist/cloud/x402-payment-handler.d.ts.map +1 -0
  62. package/dist/cloud/x402-payment-handler.js +119 -0
  63. package/dist/cloud/x402-payment-handler.js.map +10 -0
  64. package/dist/cloud-setup.d.ts +36 -0
  65. package/dist/cloud-setup.d.ts.map +1 -0
  66. package/dist/{onboarding.js → cloud-setup.js} +139 -139
  67. package/dist/cloud-setup.js.map +14 -0
  68. package/dist/cloud-voice-catalog.d.ts +65 -0
  69. package/dist/cloud-voice-catalog.d.ts.map +1 -0
  70. package/dist/cloud-voice-catalog.js +278 -0
  71. package/dist/cloud-voice-catalog.js.map +12 -0
  72. package/dist/index.browser.d.ts +11 -0
  73. package/dist/index.browser.d.ts.map +1 -1
  74. package/dist/index.d.ts +7 -1
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +5416 -8405
  77. package/dist/index.js.map +48 -116
  78. package/dist/index.node.d.ts +8 -1
  79. package/dist/index.node.d.ts.map +1 -1
  80. package/dist/init.js +17 -4
  81. package/dist/init.js.map +4 -4
  82. package/dist/lib/cloud-connection.d.ts +0 -1
  83. package/dist/lib/cloud-connection.d.ts.map +1 -1
  84. package/dist/lib/cloud-connection.js +14 -91
  85. package/dist/lib/cloud-connection.js.map +7 -7
  86. package/dist/lib/cloud-secrets.d.ts +5 -18
  87. package/dist/lib/cloud-secrets.d.ts.map +1 -1
  88. package/dist/lib/cloud-secrets.js +8 -36
  89. package/dist/lib/cloud-secrets.js.map +3 -3
  90. package/dist/lib/config-like.d.ts +1 -1
  91. package/dist/lib/config-like.d.ts.map +1 -1
  92. package/dist/lib/config-like.js +3 -3
  93. package/dist/lib/config-like.js.map +3 -3
  94. package/dist/lib/credential-type-map.d.ts +1 -1
  95. package/dist/lib/credential-type-map.js.map +1 -1
  96. package/dist/lib/http.d.ts +0 -11
  97. package/dist/lib/http.d.ts.map +1 -1
  98. package/dist/lib/http.js.map +2 -2
  99. package/dist/lib/server-cloud-tts.d.ts +12 -25
  100. package/dist/lib/server-cloud-tts.d.ts.map +1 -1
  101. package/dist/lib/server-cloud-tts.js +31 -329
  102. package/dist/lib/server-cloud-tts.js.map +4 -7
  103. package/dist/lib/tts-debug.d.ts +5 -3
  104. package/dist/lib/tts-debug.d.ts.map +1 -1
  105. package/dist/lib/tts-debug.js +1 -34
  106. package/dist/lib/tts-debug.js.map +3 -4
  107. package/dist/models/embeddings.d.ts.map +1 -1
  108. package/dist/models/embeddings.js +79 -69
  109. package/dist/models/embeddings.js.map +6 -6
  110. package/dist/models/image.d.ts.map +1 -1
  111. package/dist/models/image.js +42 -15
  112. package/dist/models/image.js.map +6 -6
  113. package/dist/models/index.js +676 -166
  114. package/dist/models/index.js.map +11 -12
  115. package/dist/models/research.d.ts.map +1 -1
  116. package/dist/models/research.js +24 -7
  117. package/dist/models/research.js.map +6 -6
  118. package/dist/models/speech.d.ts +61 -3
  119. package/dist/models/speech.d.ts.map +1 -1
  120. package/dist/models/speech.js +173 -17
  121. package/dist/models/speech.js.map +5 -5
  122. package/dist/models/text.d.ts +106 -1
  123. package/dist/models/text.d.ts.map +1 -1
  124. package/dist/models/text.js +452 -82
  125. package/dist/models/text.js.map +7 -8
  126. package/dist/models/tokenization.d.ts.map +1 -1
  127. package/dist/models/tokenization.js.map +2 -2
  128. package/dist/models/transcription.d.ts.map +1 -1
  129. package/dist/models/transcription.js +20 -6
  130. package/dist/models/transcription.js.map +5 -5
  131. package/dist/node/index.node.js +2828 -5838
  132. package/dist/node/index.node.js.map +47 -116
  133. package/dist/plugin.d.ts.map +1 -1
  134. package/dist/plugin.js +376 -5050
  135. package/dist/plugin.js.map +16 -92
  136. package/dist/providers/openai.js +11 -2
  137. package/dist/providers/openai.js.map +3 -3
  138. package/dist/register-routes.js +376 -5050
  139. package/dist/register-routes.js.map +16 -92
  140. package/dist/routes/cloud-billing-routes.d.ts.map +1 -1
  141. package/dist/routes/cloud-billing-routes.js +17 -60
  142. package/dist/routes/cloud-billing-routes.js.map +8 -7
  143. package/dist/routes/cloud-coding-container-routes.d.ts +8 -0
  144. package/dist/routes/cloud-coding-container-routes.d.ts.map +1 -0
  145. package/dist/routes/cloud-coding-container-routes.js +214 -0
  146. package/dist/routes/cloud-coding-container-routes.js.map +11 -0
  147. package/dist/routes/cloud-compat-routes.d.ts.map +1 -1
  148. package/dist/routes/cloud-compat-routes.js +17 -60
  149. package/dist/routes/cloud-compat-routes.js.map +8 -7
  150. package/dist/routes/cloud-features-routes.js +2 -2
  151. package/dist/routes/cloud-features-routes.js.map +4 -4
  152. package/dist/routes/cloud-relay-routes.d.ts +2 -1
  153. package/dist/routes/cloud-relay-routes.d.ts.map +1 -1
  154. package/dist/routes/cloud-relay-routes.js +84 -2
  155. package/dist/routes/cloud-relay-routes.js.map +5 -4
  156. package/dist/routes/cloud-routes-autonomous.d.ts +3 -4
  157. package/dist/routes/cloud-routes-autonomous.d.ts.map +1 -1
  158. package/dist/routes/cloud-routes-autonomous.js +11 -4893
  159. package/dist/routes/cloud-routes-autonomous.js.map +8 -87
  160. package/dist/routes/cloud-routes.d.ts +2 -2
  161. package/dist/routes/cloud-routes.d.ts.map +1 -1
  162. package/dist/routes/cloud-routes.js +343 -5058
  163. package/dist/routes/cloud-routes.js.map +13 -90
  164. package/dist/routes/cloud-status-routes-autonomous.d.ts +1 -2
  165. package/dist/routes/cloud-status-routes-autonomous.d.ts.map +1 -1
  166. package/dist/routes/cloud-status-routes-autonomous.js +4 -51
  167. package/dist/routes/cloud-status-routes-autonomous.js.map +5 -5
  168. package/dist/routes/cloud-status-routes.js +14 -90
  169. package/dist/routes/cloud-status-routes.js.map +7 -7
  170. package/dist/routes/home-remote-runner-access-url.d.ts +16 -0
  171. package/dist/routes/home-remote-runner-access-url.d.ts.map +1 -0
  172. package/dist/routes/home-remote-runner-access-url.js +91 -0
  173. package/dist/routes/home-remote-runner-access-url.js.map +10 -0
  174. package/dist/routes/travel-provider-relay-routes.d.ts +9 -0
  175. package/dist/routes/travel-provider-relay-routes.d.ts.map +1 -0
  176. package/dist/routes/travel-provider-relay-routes.js +358 -0
  177. package/dist/routes/travel-provider-relay-routes.js.map +14 -0
  178. package/dist/services/cloud-auth.d.ts +1 -1
  179. package/dist/services/cloud-auth.d.ts.map +1 -1
  180. package/dist/services/cloud-auth.js +7 -2
  181. package/dist/services/cloud-auth.js.map +4 -4
  182. package/dist/services/cloud-backup.js.map +2 -2
  183. package/dist/services/cloud-bootstrap.d.ts.map +1 -1
  184. package/dist/services/cloud-bootstrap.js.map +2 -2
  185. package/dist/services/cloud-bridge.js.map +3 -3
  186. package/dist/services/cloud-container.d.ts +5 -1
  187. package/dist/services/cloud-container.d.ts.map +1 -1
  188. package/dist/services/cloud-container.js +52 -1
  189. package/dist/services/cloud-container.js.map +4 -4
  190. package/dist/services/cloud-credential-provider.js.map +2 -2
  191. package/dist/services/cloud-model-registry.js.map +2 -2
  192. package/dist/types/cloud.d.ts +1 -0
  193. package/dist/types/cloud.d.ts.map +1 -1
  194. package/dist/types/cloud.js.map +2 -2
  195. package/dist/types/index.d.ts +1 -1
  196. package/dist/types/index.d.ts.map +1 -1
  197. package/dist/utils/cloud-sdk/client.d.ts.map +1 -1
  198. package/dist/utils/cloud-sdk/client.js +136 -4
  199. package/dist/utils/cloud-sdk/client.js.map +5 -5
  200. package/dist/utils/cloud-sdk/http.js.map +1 -1
  201. package/dist/utils/cloud-sdk/public-routes.d.ts +186 -0
  202. package/dist/utils/cloud-sdk/public-routes.d.ts.map +1 -1
  203. package/dist/utils/cloud-sdk/public-routes.js +99 -1
  204. package/dist/utils/cloud-sdk/public-routes.js.map +3 -3
  205. package/dist/utils/cloud-sdk/types.d.ts +0 -2
  206. package/dist/utils/cloud-sdk/types.d.ts.map +1 -1
  207. package/dist/utils/cloud-sdk/types.js.map +1 -1
  208. package/dist/utils/config.d.ts +10 -1
  209. package/dist/utils/config.d.ts.map +1 -1
  210. package/dist/utils/config.js +12 -2
  211. package/dist/utils/config.js.map +3 -3
  212. package/dist/utils/events.d.ts +23 -2
  213. package/dist/utils/events.d.ts.map +1 -1
  214. package/dist/utils/events.js +5 -3
  215. package/dist/utils/events.js.map +3 -3
  216. package/dist/utils/sdk-client.d.ts.map +1 -1
  217. package/dist/utils/sdk-client.js +17 -4
  218. package/dist/utils/sdk-client.js.map +4 -4
  219. package/dist/utils/waifu-metering.d.ts +108 -0
  220. package/dist/utils/waifu-metering.d.ts.map +1 -0
  221. package/dist/utils/waifu-metering.js +166 -0
  222. package/dist/utils/waifu-metering.js.map +10 -0
  223. package/package.json +51 -22
  224. package/src/cloud/auth-service-types.ts +24 -0
  225. package/src/cloud/base-url.ts +6 -62
  226. package/src/cloud/clack-observer.ts +189 -0
  227. package/src/cloud/duffel-client.ts +847 -0
  228. package/src/cloud/index.ts +10 -0
  229. package/src/cloud/lifeops-schedule-sync-client.ts +245 -0
  230. package/src/cloud/lifeops-schedule-sync-contracts.ts +124 -0
  231. package/src/cloud/managed-payment-clients.ts +374 -0
  232. package/src/cloud/null-observer.ts +45 -0
  233. package/src/cloud/setup-observer.ts +125 -0
  234. package/src/cloud/validate-url.ts +7 -1
  235. package/src/cloud/x402-payment-handler.ts +215 -0
  236. package/src/cloud-setup.ts +531 -0
  237. package/src/cloud-voice-catalog.test.ts +254 -0
  238. package/src/cloud-voice-catalog.ts +246 -0
  239. package/src/index.browser.ts +29 -0
  240. package/src/index.node.ts +31 -1
  241. package/src/index.ts +76 -4
  242. package/src/lib/cloud-connection.ts +2 -4
  243. package/src/lib/cloud-secrets.ts +10 -54
  244. package/src/lib/config-like.ts +1 -1
  245. package/src/lib/credential-type-map.ts +2 -2
  246. package/src/lib/http.ts +0 -17
  247. package/src/lib/server-cloud-tts.ts +33 -341
  248. package/src/lib/tts-debug.ts +5 -34
  249. package/src/models/embeddings.ts +140 -76
  250. package/src/models/image.ts +29 -14
  251. package/src/models/research.ts +11 -1
  252. package/src/models/speech.ts +269 -23
  253. package/src/models/text.ts +704 -110
  254. package/src/models/tokenization.ts +2 -2
  255. package/src/models/transcription.ts +7 -3
  256. package/src/plugin.ts +38 -0
  257. package/src/routes/cloud-billing-routes.ts +4 -14
  258. package/src/routes/cloud-coding-container-routes.ts +198 -0
  259. package/src/routes/cloud-compat-routes.ts +4 -14
  260. package/src/routes/cloud-features-routes.ts +1 -1
  261. package/src/routes/cloud-relay-routes.ts +47 -1
  262. package/src/routes/cloud-routes-autonomous.ts +7 -10
  263. package/src/routes/cloud-routes.ts +68 -7
  264. package/src/routes/cloud-status-routes-autonomous.ts +6 -2
  265. package/src/routes/home-remote-runner-access-url.ts +83 -0
  266. package/src/routes/travel-provider-relay-routes.ts +193 -0
  267. package/src/services/cloud-auth.ts +9 -2
  268. package/src/services/cloud-bootstrap.ts +1 -3
  269. package/src/services/cloud-bridge.ts +1 -1
  270. package/src/services/cloud-container.ts +93 -0
  271. package/src/services/cloud-credential-provider.ts +1 -1
  272. package/src/services/cloud-model-registry.ts +1 -1
  273. package/src/types/cloud.ts +22 -0
  274. package/src/types/index.ts +19 -0
  275. package/src/utils/cloud-sdk/client.ts +42 -3
  276. package/src/utils/cloud-sdk/public-routes.ts +168 -0
  277. package/src/utils/cloud-sdk/types.ts +0 -2
  278. package/src/utils/config.ts +20 -1
  279. package/src/utils/events.ts +30 -2
  280. package/src/utils/sdk-client.ts +5 -1
  281. package/src/utils/waifu-metering.ts +302 -0
  282. package/dist/onboarding.d.ts +0 -35
  283. package/dist/onboarding.d.ts.map +0 -1
  284. package/dist/onboarding.js.map +0 -14
  285. package/src/onboarding.ts +0 -396
@@ -1,15 +1,15 @@
1
1
  import type {
2
+ ProcessEnvLike,
2
3
  DetokenizeTextParams,
3
4
  IAgentRuntime,
4
5
  ModelTypeName,
5
6
  TokenizeTextParams,
7
+
6
8
  } from "@elizaos/core";
7
9
  import { ModelType } from "@elizaos/core";
8
10
  import { DEFAULT_ELIZA_CLOUD_TEXT_MODEL } from "@elizaos/core";
9
11
  import { encodingForModel, type TiktokenModel } from "js-tiktoken";
10
12
 
11
- type ProcessEnvLike = Record<string, string | undefined>;
12
-
13
13
  function getProcessEnv(): ProcessEnvLike {
14
14
  if (typeof process === "undefined") {
15
15
  return {};
@@ -1,7 +1,7 @@
1
1
  import type { IAgentRuntime } from "@elizaos/core";
2
2
  import { logger } from "@elizaos/core";
3
3
  import type { OpenAITranscriptionParams } from "../types";
4
- import { getSetting } from "../utils/config";
4
+ import { getSetting, resolveCloudTimeoutMs } from "../utils/config";
5
5
  import { detectAudioMimeType } from "../utils/helpers";
6
6
  import { createElizaCloudClient } from "../utils/sdk-client";
7
7
 
@@ -81,14 +81,18 @@ export async function handleTranscription(
81
81
  try {
82
82
  const response = await createElizaCloudClient(runtime).routes.postApiV1VoiceSttRaw({
83
83
  body: formData,
84
+ timeoutMs: resolveCloudTimeoutMs("ELIZAOS_CLOUD_STT_TIMEOUT_MS", 60_000),
84
85
  });
85
86
 
86
87
  if (!response.ok) {
87
88
  throw new Error(`Failed to transcribe audio: ${response.status} ${response.statusText}`);
88
89
  }
89
90
 
90
- const data = (await response.json()) as { text: string };
91
- return data.text || "";
91
+ const data = (await response.json()) as {
92
+ text?: string;
93
+ transcript?: string;
94
+ };
95
+ return data.text ?? data.transcript ?? "";
92
96
  } catch (error) {
93
97
  const message = error instanceof Error ? error.message : String(error);
94
98
  logger.error(`TRANSCRIPTION error: ${message}`);
package/src/plugin.ts CHANGED
@@ -171,6 +171,24 @@ const cloudRoutes: Route[] = [
171
171
  rawPath: true,
172
172
  handler: cloudRouteHandler,
173
173
  },
174
+ {
175
+ type: "POST",
176
+ path: "/api/cloud/coding-containers/promotions",
177
+ rawPath: true,
178
+ handler: cloudRouteHandler,
179
+ },
180
+ {
181
+ type: "POST",
182
+ path: "/api/cloud/coding-containers",
183
+ rawPath: true,
184
+ handler: cloudRouteHandler,
185
+ },
186
+ {
187
+ type: "POST",
188
+ path: "/api/cloud/coding-containers/:containerId/sync",
189
+ rawPath: true,
190
+ handler: cloudRouteHandler,
191
+ },
174
192
  ...(["GET", "POST", "PUT", "PATCH", "DELETE"] as const).map((type) => ({
175
193
  type,
176
194
  path: "/api/cloud/billing/:path*",
@@ -231,6 +249,24 @@ const cloudRoutes: Route[] = [
231
249
  rawPath: true,
232
250
  handler: cloudRouteHandler,
233
251
  },
252
+ {
253
+ type: "POST",
254
+ path: "/api/cloud/coding-containers/promotions",
255
+ rawPath: true,
256
+ handler: cloudRouteHandler,
257
+ },
258
+ {
259
+ type: "POST",
260
+ path: "/api/cloud/coding-containers",
261
+ rawPath: true,
262
+ handler: cloudRouteHandler,
263
+ },
264
+ {
265
+ type: "POST",
266
+ path: "/api/cloud/coding-containers/:containerId/sync",
267
+ rawPath: true,
268
+ handler: cloudRouteHandler,
269
+ },
234
270
  ];
235
271
 
236
272
  export const elizaCloudRoutePlugin: Plugin = {
@@ -238,6 +274,8 @@ export const elizaCloudRoutePlugin: Plugin = {
238
274
  description:
239
275
  "Eliza Cloud connection, login, status, credit, and relay routes (extracted from app-core/server.ts)",
240
276
  routes: cloudRoutes,
277
+ // Routes-only plugin — no services or persistent resources to dispose.
278
+ dispose: async (_runtime) => {},
241
279
  };
242
280
 
243
281
  export default elizaCloudRoutePlugin;
@@ -1,6 +1,10 @@
1
1
  import type http from "node:http";
2
2
  import type { AgentRuntime, Service } from "@elizaos/core";
3
3
  import { normalizeCloudSiteUrl } from "../cloud/base-url.js";
4
+ import {
5
+ type CloudAuthApiKeyService,
6
+ normalizeCloudApiKey,
7
+ } from "../cloud/auth-service-types";
4
8
  import { resolveCloudApiKey } from "../cloud/cloud-api-key.js";
5
9
  import { validateCloudBaseUrl } from "../cloud/validate-url.js";
6
10
  import type { CloudProxyConfigLike } from "../lib/config-like";
@@ -64,24 +68,10 @@ async function fetchCryptoStatusCached(
64
68
  return value;
65
69
  }
66
70
 
67
- interface CloudAuthApiKeyService {
68
- isAuthenticated: () => boolean;
69
- getApiKey?: () => string | undefined;
70
- }
71
-
72
71
  function resolveCloudBaseUrl(config: CloudProxyConfigLike): string {
73
72
  return normalizeCloudSiteUrl(config.cloud?.baseUrl);
74
73
  }
75
74
 
76
- function normalizeCloudApiKey(value: string | null | undefined): string | null {
77
- if (typeof value !== "string") return null;
78
- const trimmed = value.trim();
79
- if (!trimmed || trimmed.toUpperCase() === "[REDACTED]") {
80
- return null;
81
- }
82
- return trimmed;
83
- }
84
-
85
75
  function resolveProxyApiKey(state: CloudBillingRouteState): string | null {
86
76
  const cloudAuth = state.runtime
87
77
  ? state.runtime.getService<Service & CloudAuthApiKeyService>("CLOUD_AUTH")
@@ -0,0 +1,198 @@
1
+ import type http from "node:http";
2
+ import {
3
+ PromoteVfsToCloudContainerRequestSchema,
4
+ RequestCodingAgentContainerRequestSchema,
5
+ SyncCloudCodingContainerRequestSchema,
6
+ } from "@elizaos/shared";
7
+ import type {
8
+ PromoteVfsToCloudContainerRequest,
9
+ PromoteVfsToCloudContainerResponse,
10
+ RequestCodingAgentContainerRequest,
11
+ RequestCodingAgentContainerResponse,
12
+ SyncCloudCodingContainerRequest,
13
+ SyncCloudCodingContainerResponse,
14
+ } from "../types/cloud";
15
+ import { sendJson, sendJsonError } from "../lib/http";
16
+
17
+ export interface CloudCodingContainerRouteState {
18
+ runtime: {
19
+ getService?: (name: string) => unknown;
20
+ } | null;
21
+ }
22
+
23
+ interface CodingContainerServiceLike {
24
+ promoteVfsToCloudContainer(
25
+ request: PromoteVfsToCloudContainerRequest,
26
+ ): Promise<PromoteVfsToCloudContainerResponse>;
27
+ requestCodingAgentContainer(
28
+ request: RequestCodingAgentContainerRequest,
29
+ ): Promise<RequestCodingAgentContainerResponse>;
30
+ syncCodingContainerChanges(
31
+ containerId: string,
32
+ request: SyncCloudCodingContainerRequest,
33
+ ): Promise<SyncCloudCodingContainerResponse>;
34
+ }
35
+
36
+ export async function handleCloudCodingContainerRoute(
37
+ req: http.IncomingMessage,
38
+ res: http.ServerResponse,
39
+ pathname: string,
40
+ method: string,
41
+ state: CloudCodingContainerRouteState,
42
+ ): Promise<boolean> {
43
+ if (
44
+ method === "POST" &&
45
+ pathname === "/api/cloud/coding-containers/promotions"
46
+ ) {
47
+ const service = getCloudContainerService(state);
48
+ if (!service) {
49
+ sendJsonError(res, "Cloud container service is not available", 503);
50
+ return true;
51
+ }
52
+ const body = await readJsonBody(req, res);
53
+ if (!body) return true;
54
+ const parsed = PromoteVfsToCloudContainerRequestSchema.safeParse(body);
55
+ if (!parsed.success) {
56
+ sendJsonError(
57
+ res,
58
+ parsed.error.issues[0]?.message ?? "Invalid promotion request",
59
+ 400,
60
+ );
61
+ return true;
62
+ }
63
+ await sendServiceResponse(res, () =>
64
+ service.promoteVfsToCloudContainer(
65
+ parsed.data as PromoteVfsToCloudContainerRequest,
66
+ ),
67
+ );
68
+ return true;
69
+ }
70
+
71
+ if (method === "POST" && pathname === "/api/cloud/coding-containers") {
72
+ const service = getCloudContainerService(state);
73
+ if (!service) {
74
+ sendJsonError(res, "Cloud container service is not available", 503);
75
+ return true;
76
+ }
77
+ const body = await readJsonBody(req, res);
78
+ if (!body) return true;
79
+ const parsed = RequestCodingAgentContainerRequestSchema.safeParse(body);
80
+ if (!parsed.success) {
81
+ sendJsonError(
82
+ res,
83
+ parsed.error.issues[0]?.message ?? "Invalid coding container request",
84
+ 400,
85
+ );
86
+ return true;
87
+ }
88
+ await sendServiceResponse(res, () =>
89
+ service.requestCodingAgentContainer(
90
+ parsed.data as RequestCodingAgentContainerRequest,
91
+ ),
92
+ );
93
+ return true;
94
+ }
95
+
96
+ const syncMatch = /^\/api\/cloud\/coding-containers\/([^/]+)\/sync$/.exec(
97
+ pathname,
98
+ );
99
+ if (method === "POST" && syncMatch) {
100
+ const service = getCloudContainerService(state);
101
+ if (!service) {
102
+ sendJsonError(res, "Cloud container service is not available", 503);
103
+ return true;
104
+ }
105
+ const containerId = decodeURIComponent(syncMatch[1]);
106
+ const body = await readJsonBody(req, res);
107
+ if (!body) return true;
108
+ const parsed = SyncCloudCodingContainerRequestSchema.safeParse(body);
109
+ if (!parsed.success) {
110
+ sendJsonError(
111
+ res,
112
+ parsed.error.issues[0]?.message ?? "Invalid sync request",
113
+ 400,
114
+ );
115
+ return true;
116
+ }
117
+ await sendServiceResponse(res, () =>
118
+ service.syncCodingContainerChanges(
119
+ containerId,
120
+ parsed.data as SyncCloudCodingContainerRequest,
121
+ ),
122
+ );
123
+ return true;
124
+ }
125
+
126
+ return false;
127
+ }
128
+
129
+ function getCloudContainerService(
130
+ state: CloudCodingContainerRouteState,
131
+ ): CodingContainerServiceLike | null {
132
+ const service =
133
+ state.runtime?.getService?.("CLOUD_CONTAINER") ??
134
+ state.runtime?.getService?.("cloud-container") ??
135
+ state.runtime?.getService?.("cloudContainer");
136
+ if (!service || typeof service !== "object") return null;
137
+ const candidate = service as Partial<CodingContainerServiceLike>;
138
+ if (
139
+ typeof candidate.promoteVfsToCloudContainer === "function" &&
140
+ typeof candidate.requestCodingAgentContainer === "function" &&
141
+ typeof candidate.syncCodingContainerChanges === "function"
142
+ ) {
143
+ return candidate as CodingContainerServiceLike;
144
+ }
145
+ return null;
146
+ }
147
+
148
+ async function readJsonBody(
149
+ req: http.IncomingMessage,
150
+ res: http.ServerResponse,
151
+ ): Promise<Record<string, unknown> | null> {
152
+ const preParsed = (req as http.IncomingMessage & { body?: unknown }).body;
153
+ if (
154
+ preParsed &&
155
+ typeof preParsed === "object" &&
156
+ !Array.isArray(preParsed)
157
+ ) {
158
+ return preParsed as Record<string, unknown>;
159
+ }
160
+
161
+ const chunks: Buffer[] = [];
162
+ for await (const chunk of req) {
163
+ chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
164
+ }
165
+ const raw = Buffer.concat(chunks).toString("utf8").trim();
166
+ if (!raw) return {};
167
+ let parsed: unknown;
168
+ try {
169
+ parsed = JSON.parse(raw) as unknown;
170
+ } catch {
171
+ sendJsonError(res, "Invalid JSON body", 400);
172
+ return null;
173
+ }
174
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
175
+ sendJsonError(res, "Invalid JSON body", 400);
176
+ return null;
177
+ }
178
+ return parsed as Record<string, unknown>;
179
+ }
180
+
181
+ async function sendServiceResponse(
182
+ res: http.ServerResponse,
183
+ fn: () => Promise<unknown>,
184
+ ): Promise<void> {
185
+ try {
186
+ sendJson(res, await fn());
187
+ } catch (error) {
188
+ const status =
189
+ typeof (error as { statusCode?: unknown })?.statusCode === "number"
190
+ ? (error as { statusCode: number }).statusCode
191
+ : 500;
192
+ sendJsonError(
193
+ res,
194
+ error instanceof Error ? error.message : String(error),
195
+ status,
196
+ );
197
+ }
198
+ }
@@ -2,6 +2,10 @@ import type http from "node:http";
2
2
  import type { AgentRuntime, Service } from "@elizaos/core";
3
3
  import { logger } from "@elizaos/core";
4
4
  import { normalizeCloudSiteUrl } from "../cloud/base-url.js";
5
+ import {
6
+ type CloudAuthApiKeyService,
7
+ normalizeCloudApiKey,
8
+ } from "../cloud/auth-service-types";
5
9
  import { resolveCloudApiKey } from "../cloud/cloud-api-key.js";
6
10
  import { validateCloudBaseUrl } from "../cloud/validate-url.js";
7
11
  import type { CloudProxyConfigLike } from "../lib/config-like";
@@ -16,24 +20,10 @@ const PROXY_TIMEOUT_MS = 15_000;
16
20
  const MAX_BODY_BYTES = 1_048_576;
17
21
  const JSON_CONTENT_TYPE_RE = /\b(?:application\/json|[^;\s]+\+json)\b/i;
18
22
 
19
- interface CloudAuthApiKeyService {
20
- isAuthenticated: () => boolean;
21
- getApiKey?: () => string | undefined;
22
- }
23
-
24
23
  export function resolveCloudBaseUrl(config: CloudProxyConfigLike): string {
25
24
  return normalizeCloudSiteUrl(config.cloud?.baseUrl);
26
25
  }
27
26
 
28
- function normalizeCloudApiKey(value: string | null | undefined): string | null {
29
- if (typeof value !== "string") return null;
30
- const trimmed = value.trim();
31
- if (!trimmed || trimmed.toUpperCase() === "[REDACTED]") {
32
- return null;
33
- }
34
- return trimmed;
35
- }
36
-
37
27
  function resolveProxyApiKey(state: CloudCompatRouteState): string | null {
38
28
  const cloudAuth = state.runtime
39
29
  ? state.runtime.getService<Service & CloudAuthApiKeyService>("CLOUD_AUTH")
@@ -4,7 +4,7 @@ import type { CloudProxyConfigLike } from "../lib/config-like";
4
4
  import { sendJsonError } from "../lib/http";
5
5
 
6
6
  const LIFEOPS_CLOUD_FEATURES_MODULE: string =
7
- "@elizaos/app-lifeops";
7
+ "@elizaos/plugin-personal-assistant/routes/cloud-features-routes";
8
8
 
9
9
  export interface CloudFeaturesRouteState {
10
10
  config: CloudProxyConfigLike;
@@ -13,7 +13,11 @@
13
13
  */
14
14
 
15
15
  import type http from "node:http";
16
- import type { RouteHelpers } from "../lib/http";
16
+ import type { RouteHelpers } from "@elizaos/core";
17
+ import {
18
+ buildHomeRemoteRunnerAccessUrl,
19
+ buildHomeRemoteRunnerSshTunnel,
20
+ } from "./home-remote-runner-access-url";
17
21
 
18
22
  interface RelayServiceLike {
19
23
  getSessionInfo(): {
@@ -30,6 +34,7 @@ interface RelayServiceLike {
30
34
  export interface CloudRelayRouteState {
31
35
  runtime?: {
32
36
  getService(type: string): unknown;
37
+ getSetting?: (key: string) => string | boolean | number | null;
33
38
  };
34
39
  }
35
40
 
@@ -76,6 +81,37 @@ export async function handleCloudRelayRoute(
76
81
  helpers.json(res, {
77
82
  available: true,
78
83
  ...info,
84
+ accessUrl: buildHomeRemoteRunnerAccessUrl({
85
+ sessionId: info.sessionId,
86
+ }),
87
+ ssh: buildHomeRemoteRunnerSshTunnel({
88
+ remoteBaseUrl:
89
+ readRuntimeSetting(state.runtime, "ELIZA_HOME_REMOTE_RUNNER_URL") ??
90
+ process.env.ELIZA_HOME_REMOTE_RUNNER_URL ??
91
+ readRuntimeSetting(state.runtime, "ELIZA_HOME_RUNNER_URL") ??
92
+ process.env.ELIZA_HOME_RUNNER_URL,
93
+ sshTarget:
94
+ readRuntimeSetting(
95
+ state.runtime,
96
+ "ELIZA_HOME_REMOTE_RUNNER_SSH_TARGET",
97
+ ) ??
98
+ process.env.ELIZA_HOME_REMOTE_RUNNER_SSH_TARGET ??
99
+ readRuntimeSetting(state.runtime, "ELIZA_HOME_SSH_TARGET") ??
100
+ process.env.ELIZA_HOME_SSH_TARGET,
101
+ sshIdentity:
102
+ readRuntimeSetting(
103
+ state.runtime,
104
+ "ELIZA_HOME_REMOTE_RUNNER_SSH_IDENTITY",
105
+ ) ??
106
+ process.env.ELIZA_HOME_REMOTE_RUNNER_SSH_IDENTITY ??
107
+ readRuntimeSetting(state.runtime, "ELIZA_HOME_SSH_IDENTITY") ??
108
+ process.env.ELIZA_HOME_SSH_IDENTITY,
109
+ localPort:
110
+ readRuntimeSetting(
111
+ state.runtime,
112
+ "ELIZA_HOME_REMOTE_RUNNER_SSH_LOCAL_PORT",
113
+ ) ?? process.env.ELIZA_HOME_REMOTE_RUNNER_SSH_LOCAL_PORT,
114
+ }),
79
115
  });
80
116
  } catch (err) {
81
117
  helpers.json(res, {
@@ -87,3 +123,13 @@ export async function handleCloudRelayRoute(
87
123
 
88
124
  return true;
89
125
  }
126
+
127
+ function readRuntimeSetting(
128
+ runtime: CloudRelayRouteState["runtime"],
129
+ key: string,
130
+ ): string | null {
131
+ const value = runtime?.getSetting?.(key);
132
+ if (typeof value !== "string") return null;
133
+ const trimmed = value.trim();
134
+ return trimmed ? trimmed : null;
135
+ }
@@ -21,7 +21,7 @@ import {
21
21
  import { validateCloudBaseUrl } from "../cloud/validate-url.js";
22
22
  import { persistConfigEnv } from "../lib/config-env";
23
23
  import {
24
- applyCanonicalOnboardingConfig,
24
+ applyCanonicalSetupConfig,
25
25
  isTimeoutError,
26
26
  } from "../lib/config-like";
27
27
  import { isCloudWalletEnabled } from "../lib/feature-flags";
@@ -123,10 +123,9 @@ export interface CloudRouteState {
123
123
  saveConfig?: (config: CloudConfigLike) => void;
124
124
  createTelemetrySpan?: CreateTelemetrySpanLike;
125
125
  /**
126
- * Optional runtime restart hook. When Phase 8 lands the cloud-wallet
127
- * provisioning integration, the cloud-login handler will call this to
128
- * rebind plugin-wallet to the cloud provider. Threaded
129
- * from server.ts the same way provider-switch-routes does.
126
+ * Optional runtime restart hook used after cloud-login provisioning to
127
+ * rebind plugin-wallet to the cloud provider. Threaded from server.ts the
128
+ * same way provider-switch-routes does.
130
129
  */
131
130
  restartRuntime?: (reason: string) => Promise<boolean> | boolean;
132
131
  }
@@ -142,7 +141,6 @@ const CLOUD_WALLET_ROLLBACK_ENV_KEYS = [
142
141
  ELIZA_CLOUD_CLIENT_ADDRESS_KEY_ENV,
143
142
  "ELIZA_CLOUD_EVM_ADDRESS",
144
143
  "ELIZA_CLOUD_SOLANA_ADDRESS",
145
- "ENABLE_EVM_PLUGIN",
146
144
  "WALLET_SOURCE_EVM",
147
145
  "WALLET_SOURCE_SOLANA",
148
146
  ] as const;
@@ -502,7 +500,7 @@ export async function handleCloudRoute(
502
500
  >;
503
501
  cloud.apiKey = data.apiKey;
504
502
  (state.config as Record<string, unknown>).cloud = cloud;
505
- applyCanonicalOnboardingConfig(state.config as never, {
503
+ applyCanonicalSetupConfig(state.config as never, {
506
504
  linkedAccounts: {
507
505
  elizacloud: {
508
506
  status: "linked",
@@ -667,7 +665,6 @@ export async function handleCloudRoute(
667
665
  );
668
666
  }
669
667
 
670
- await persistConfigEnv("ENABLE_EVM_PLUGIN", "1");
671
668
  if (descriptors.evm) {
672
669
  await persistConfigEnv("WALLET_SOURCE_EVM", "cloud");
673
670
  }
@@ -733,7 +730,7 @@ export async function handleCloudRoute(
733
730
  // path (`/api/v1/eliza/agents`) for agent creation/provisioning.
734
731
  // Without this, every cloud op falls back to the proxy compat path,
735
732
  // which creates agents in a namespace whose queue never drains
736
- // (agents stay `status: "queued"` forever — onboarding hangs).
733
+ // (agents stay `status: "queued"` forever — setup hangs).
737
734
  //
738
735
  // ## Security trade-off — token in HTTP response body
739
736
  //
@@ -930,7 +927,7 @@ export async function handleCloudRoute(
930
927
  >;
931
928
  delete cloud.apiKey;
932
929
  (state.config as Record<string, unknown>).cloud = cloud;
933
- applyCanonicalOnboardingConfig(state.config as never, {
930
+ applyCanonicalSetupConfig(state.config as never, {
934
931
  deploymentTarget: { runtime: "local" },
935
932
  linkedAccounts: {
936
933
  elizacloud: {
@@ -4,13 +4,18 @@ import {
4
4
  migrateLegacyRuntimeConfig,
5
5
  } from "@elizaos/core";
6
6
  import { type CloudRouteState as AutonomousCloudRouteState, handleCloudRoute as handleAutonomousCloudRoute, } from "./cloud-routes-autonomous.js";
7
+ import {
8
+ buildHomeRemoteRunnerAccessUrl,
9
+ buildHomeRemoteRunnerSshTunnel,
10
+ } from "./home-remote-runner-access-url";
7
11
  import { normalizeCloudSiteUrl } from "../cloud/base-url.js";
8
12
  import type { CloudManager } from "../cloud/cloud-manager.js";
9
13
  import { validateCloudBaseUrl } from "../cloud/validate-url.js";
10
14
  import { type AgentRuntime, logger } from "@elizaos/core";
15
+ import { handleCloudCodingContainerRoute } from "./cloud-coding-container-routes";
11
16
  import {
12
17
  clearCloudAuthService,
13
- disconnectUnifiedCloudConnection,
18
+ disconnectCloudConnection,
14
19
  getCloudAuth,
15
20
  type RuntimeCloudLike,
16
21
  } from "../lib/cloud-connection";
@@ -19,7 +24,7 @@ import {
19
24
  scrubCloudSecretsFromEnv,
20
25
  } from "../lib/cloud-secrets";
21
26
  import {
22
- applyCanonicalOnboardingConfig,
27
+ applyCanonicalSetupConfig,
23
28
  type ElizaConfig,
24
29
  isTimeoutError,
25
30
  } from "../lib/config-like";
@@ -41,7 +46,7 @@ type CreateIntegrationTelemetrySpan = (meta: {
41
46
  }) => TelemetrySpan | null | undefined;
42
47
 
43
48
  export interface CloudRouteServices {
44
- applyCanonicalOnboardingConfig: typeof applyCanonicalOnboardingConfig;
49
+ applyCanonicalSetupConfig: typeof applyCanonicalSetupConfig;
45
50
  createIntegrationTelemetrySpan: CreateIntegrationTelemetrySpan;
46
51
  handleAutonomousCloudRoute: typeof handleAutonomousCloudRoute;
47
52
  normalizeCloudSiteUrl: typeof normalizeCloudSiteUrl;
@@ -70,7 +75,7 @@ type RelayStatusService = {
70
75
 
71
76
  const CLOUD_LOGIN_POLL_TIMEOUT_MS = 10_000;
72
77
  const DEFAULT_CLOUD_ROUTE_SERVICES: CloudRouteServices = {
73
- applyCanonicalOnboardingConfig,
78
+ applyCanonicalSetupConfig,
74
79
  createIntegrationTelemetrySpan: () => undefined,
75
80
  handleAutonomousCloudRoute,
76
81
  normalizeCloudSiteUrl,
@@ -200,7 +205,7 @@ async function persistCloudLoginStatus(args: {
200
205
  );
201
206
 
202
207
  args.state.config.cloud = cloud as ElizaConfig["cloud"];
203
- args.services.applyCanonicalOnboardingConfig(args.state.config, {
208
+ args.services.applyCanonicalSetupConfig(args.state.config, {
204
209
  linkedAccounts: {
205
210
  elizacloud: {
206
211
  status: "linked",
@@ -320,6 +325,16 @@ function getCloudRouteServices(state: CloudRouteState): CloudRouteServices {
320
325
  };
321
326
  }
322
327
 
328
+ function readRuntimeSetting(
329
+ runtime: AgentRuntime | null,
330
+ key: string,
331
+ ): string | null {
332
+ const value = runtime?.getSetting(key);
333
+ if (typeof value !== "string") return null;
334
+ const trimmed = value.trim();
335
+ return trimmed ? trimmed : null;
336
+ }
337
+
323
338
  function toAutonomousState(
324
339
  state: CloudRouteState,
325
340
  services: CloudRouteServices,
@@ -340,6 +355,17 @@ export async function handleCloudRoute(
340
355
  ): Promise<boolean> {
341
356
  const services = getCloudRouteServices(state);
342
357
 
358
+ const codingContainerHandled = await handleCloudCodingContainerRoute(
359
+ req,
360
+ res,
361
+ pathname,
362
+ method,
363
+ { runtime: state.runtime },
364
+ );
365
+ if (codingContainerHandled) {
366
+ return true;
367
+ }
368
+
343
369
  if (method === "GET" && pathname === "/api/cloud/relay-status") {
344
370
  const relayService = (state.runtime?.getService(
345
371
  "CLOUD_MANAGED_GATEWAY_RELAY",
@@ -360,9 +386,44 @@ export async function handleCloudRoute(
360
386
  }
361
387
 
362
388
  try {
389
+ const info = relayService.getSessionInfo();
363
390
  sendJson(res, {
364
391
  available: true,
365
- ...relayService.getSessionInfo(),
392
+ ...info,
393
+ accessUrl: buildHomeRemoteRunnerAccessUrl({
394
+ cloudBaseUrl: services.normalizeCloudSiteUrl(
395
+ state.config.cloud?.baseUrl,
396
+ ),
397
+ sessionId: info.sessionId,
398
+ }),
399
+ ssh: buildHomeRemoteRunnerSshTunnel({
400
+ remoteBaseUrl:
401
+ readRuntimeSetting(state.runtime, "ELIZA_HOME_REMOTE_RUNNER_URL") ??
402
+ process.env.ELIZA_HOME_REMOTE_RUNNER_URL ??
403
+ readRuntimeSetting(state.runtime, "ELIZA_HOME_RUNNER_URL") ??
404
+ process.env.ELIZA_HOME_RUNNER_URL,
405
+ sshTarget:
406
+ readRuntimeSetting(
407
+ state.runtime,
408
+ "ELIZA_HOME_REMOTE_RUNNER_SSH_TARGET",
409
+ ) ??
410
+ process.env.ELIZA_HOME_REMOTE_RUNNER_SSH_TARGET ??
411
+ readRuntimeSetting(state.runtime, "ELIZA_HOME_SSH_TARGET") ??
412
+ process.env.ELIZA_HOME_SSH_TARGET,
413
+ sshIdentity:
414
+ readRuntimeSetting(
415
+ state.runtime,
416
+ "ELIZA_HOME_REMOTE_RUNNER_SSH_IDENTITY",
417
+ ) ??
418
+ process.env.ELIZA_HOME_REMOTE_RUNNER_SSH_IDENTITY ??
419
+ readRuntimeSetting(state.runtime, "ELIZA_HOME_SSH_IDENTITY") ??
420
+ process.env.ELIZA_HOME_SSH_IDENTITY,
421
+ localPort:
422
+ readRuntimeSetting(
423
+ state.runtime,
424
+ "ELIZA_HOME_REMOTE_RUNNER_SSH_LOCAL_PORT",
425
+ ) ?? process.env.ELIZA_HOME_REMOTE_RUNNER_SSH_LOCAL_PORT,
426
+ }),
366
427
  });
367
428
  } catch (error) {
368
429
  sendJson(res, {
@@ -378,7 +439,7 @@ export async function handleCloudRoute(
378
439
  // Invalidate any in-flight login poll (see persistCloudLoginStatus).
379
440
  cloudDisconnectEpoch++;
380
441
  try {
381
- await disconnectUnifiedCloudConnection({
442
+ await disconnectCloudConnection({
382
443
  cloudManager: state.cloudManager,
383
444
  config: state.config,
384
445
  runtime: state.runtime,
@@ -3,11 +3,15 @@ import {
3
3
  isElizaCloudServiceSelectedInConfig,
4
4
  migrateLegacyRuntimeConfig,
5
5
  } from "@elizaos/core";
6
- import type { AgentRuntime, Service } from "@elizaos/core";
6
+ import type {
7
+ AgentRuntime,
8
+ RouteHelpers,
9
+ RouteRequestMeta,
10
+ Service,
11
+ } from "@elizaos/core";
7
12
  import { resolveCloudApiBaseUrl as resolveCanonicalCloudApiBaseUrl } from "../cloud/base-url.js";
8
13
  import { resolveCloudApiKey } from "../cloud/cloud-api-key.js";
9
14
  import { validateCloudBaseUrl } from "../cloud/validate-url.js";
10
- import type { RouteHelpers, RouteRequestMeta } from "../lib/http";
11
15
 
12
16
  const DEFAULT_CLOUD_API_BASE_URL = "https://www.elizacloud.ai/api/v1";
13
17
  const CLOUD_BILLING_URL =