@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
package/src/onboarding.ts DELETED
@@ -1,396 +0,0 @@
1
- /**
2
- * Cloud onboarding flow for Eliza Cloud integration.
3
- *
4
- * Handles availability check → browser-based auth → agent provisioning
5
- * during `runFirstTimeSetup()`. Extracted to keep `eliza.ts` manageable.
6
- *
7
- * @module cloud-onboarding
8
- */
9
-
10
- import { logger } from "@elizaos/core";
11
- import type { StylePreset } from "@elizaos/core";
12
- import { type CloudLoginResult, cloudLogin } from "./cloud/auth.js";
13
- import { normalizeCloudSiteUrl } from "./cloud/base-url.js";
14
- import {
15
- type CloudAgentCreateParams,
16
- ElizaCloudClient,
17
- } from "./cloud/bridge-client.js";
18
-
19
- // ---------------------------------------------------------------------------
20
- // Types
21
- // ---------------------------------------------------------------------------
22
-
23
- /** Lazy-loaded @clack/prompts module type (matches eliza.ts pattern). */
24
- type ClackModule = typeof import("@clack/prompts");
25
-
26
- /** Result of a successful cloud onboarding flow. */
27
- export interface CloudOnboardingResult {
28
- apiKey: string;
29
- agentId: string | undefined;
30
- baseUrl: string;
31
- bridgeUrl?: string;
32
- }
33
-
34
- // ---------------------------------------------------------------------------
35
- // Constants
36
- // ---------------------------------------------------------------------------
37
-
38
- const DEFAULT_CLOUD_BASE_URL = "https://www.elizacloud.ai";
39
- const PROVISION_TIMEOUT_MS = 120_000; // 2 minutes
40
- const PROVISION_POLL_INTERVAL_MS = 3_000;
41
-
42
- // ---------------------------------------------------------------------------
43
- // Availability check
44
- // ---------------------------------------------------------------------------
45
-
46
- /**
47
- * Quick pre-flight check: is Eliza Cloud accepting new agents?
48
- * Returns null if available, or an error message string if not.
49
- */
50
- export async function checkCloudAvailability(
51
- baseUrl: string,
52
- ): Promise<string | null> {
53
- try {
54
- const url = `${normalizeCloudSiteUrl(baseUrl)}/api/compat/availability`;
55
- const res = await fetch(url, {
56
- method: "GET",
57
- headers: { Accept: "application/json" },
58
- signal: AbortSignal.timeout(10_000),
59
- });
60
-
61
- if (!res.ok) {
62
- return `Cloud returned HTTP ${res.status}. It may be temporarily unavailable.`;
63
- }
64
-
65
- const body = (await res.json()) as {
66
- success?: boolean;
67
- data?: { acceptingNewAgents?: boolean; availableSlots?: number };
68
- };
69
-
70
- if (!body.success || !body.data?.acceptingNewAgents) {
71
- return "Eliza Cloud is currently at capacity. Try again later or run locally.";
72
- }
73
-
74
- return null; // Available!
75
- } catch (err) {
76
- const msg = String(err);
77
- if (msg.includes("timed out") || msg.includes("timeout")) {
78
- return "Could not reach Eliza Cloud (request timed out). Check your internet connection.";
79
- }
80
- return `Could not reach Eliza Cloud: ${msg}`;
81
- }
82
- }
83
-
84
- // ---------------------------------------------------------------------------
85
- // Cloud auth wrapper (with clack UI)
86
- // ---------------------------------------------------------------------------
87
-
88
- /**
89
- * Run the Eliza Cloud browser-based login, wrapped with clack spinners.
90
- * Returns the API key/result or null if the user wants to fall back.
91
- */
92
- async function runCloudAuth(
93
- clack: ClackModule,
94
- baseUrl: string,
95
- ): Promise<CloudLoginResult | null> {
96
- const spinner = clack.spinner();
97
- spinner.start("Connecting to Eliza Cloud...");
98
-
99
- try {
100
- const result = await cloudLogin({
101
- baseUrl,
102
- timeoutMs: 300_000, // 5 minutes
103
- onBrowserUrl: (url: string) => {
104
- spinner.stop("Opening your browser to log in...");
105
- clack.log.info(`If the browser didn't open, visit:\n ${url}`);
106
-
107
- // Try to open the browser
108
- openBrowser(url).catch(() => {
109
- // Fallback: user can manually navigate
110
- });
111
-
112
- // Restart spinner for polling
113
- spinner.start("Waiting for login in browser...");
114
- },
115
- onPollStatus: (status: string) => {
116
- if (status === "pending") {
117
- spinner.message("Waiting for login in browser...");
118
- }
119
- },
120
- });
121
-
122
- spinner.stop("✓ Logged in to Eliza Cloud!");
123
- return result;
124
- } catch (err) {
125
- const msg = String(err);
126
- spinner.stop(`Login failed: ${msg}`);
127
- return null;
128
- }
129
- }
130
-
131
- // ---------------------------------------------------------------------------
132
- // Agent provisioning
133
- // ---------------------------------------------------------------------------
134
-
135
- /**
136
- * Create and provision a cloud agent, polling until it's running.
137
- * Returns the agent ID or null if provisioning fails.
138
- */
139
- async function provisionCloudAgent(
140
- clack: ClackModule,
141
- client: ElizaCloudClient,
142
- agentName: string,
143
- preset?: StylePreset,
144
- ): Promise<{ agentId: string; bridgeUrl?: string } | null> {
145
- const spinner = clack.spinner();
146
- spinner.start("Creating your cloud agent...");
147
-
148
- try {
149
- // Build the agent config from the chosen style preset
150
- const agentConfig: Record<string, unknown> = {};
151
- if (preset) {
152
- agentConfig.bio = preset.bio;
153
- agentConfig.system = preset.system;
154
- agentConfig.style = preset.style;
155
- agentConfig.adjectives = preset.adjectives;
156
- agentConfig.topics = preset.topics;
157
- agentConfig.postExamples = preset.postExamples;
158
- agentConfig.messageExamples = preset.messageExamples;
159
- }
160
-
161
- const params: CloudAgentCreateParams = {
162
- agentName,
163
- agentConfig,
164
- };
165
-
166
- const agent = await client.createAgent(params);
167
- const agentId = agent.id;
168
-
169
- spinner.message("Agent created! Provisioning cloud environment...");
170
-
171
- // Poll for running status
172
- const deadline = Date.now() + PROVISION_TIMEOUT_MS;
173
- let lastStatus = agent.status;
174
-
175
- while (Date.now() < deadline) {
176
- await sleep(PROVISION_POLL_INTERVAL_MS);
177
-
178
- try {
179
- const current = await client.getAgent(agentId);
180
- lastStatus = current.status;
181
-
182
- switch (lastStatus) {
183
- case "running":
184
- case "completed":
185
- spinner.stop(`☁️ Cloud agent "${agentName}" is running!`);
186
- return { agentId, bridgeUrl: current.bridgeUrl };
187
-
188
- case "failed":
189
- case "error":
190
- spinner.stop(
191
- `Provisioning failed: ${current.errorMessage ?? "unknown error"}`,
192
- );
193
- return null;
194
-
195
- case "queued":
196
- spinner.message("Queued — waiting for available slot...");
197
- break;
198
-
199
- case "provisioning":
200
- spinner.message("Provisioning cloud environment...");
201
- break;
202
-
203
- default:
204
- spinner.message(`Status: ${lastStatus}...`);
205
- }
206
- } catch (pollErr) {
207
- // Transient polling error — keep trying
208
- logger.debug(`[cloud-onboarding] Poll error: ${String(pollErr)}`);
209
- }
210
- }
211
-
212
- // Timed out
213
- spinner.stop(
214
- `Provisioning timed out (last status: ${lastStatus}). The agent may still be starting up.`,
215
- );
216
- // Return the ID anyway — user can reconnect later
217
- return { agentId };
218
- } catch (err) {
219
- const msg = String(err);
220
- spinner.stop(`Failed to create cloud agent: ${msg}`);
221
- return null;
222
- }
223
- }
224
-
225
- // ---------------------------------------------------------------------------
226
- // Main orchestrator
227
- // ---------------------------------------------------------------------------
228
-
229
- /**
230
- * Run the full cloud onboarding flow:
231
- * 1. Check availability
232
- * 2. Authenticate via browser
233
- * 3. Create + provision agent
234
- *
235
- * Returns the result or null if the user cancels / an error occurs.
236
- * On failure, the caller should fall back to local mode.
237
- */
238
- export async function runCloudOnboarding(
239
- clack: ClackModule,
240
- agentName: string,
241
- preset?: StylePreset,
242
- baseUrl?: string,
243
- ): Promise<CloudOnboardingResult | null> {
244
- const resolvedBaseUrl = normalizeCloudSiteUrl(
245
- baseUrl ?? DEFAULT_CLOUD_BASE_URL,
246
- );
247
-
248
- // ── Step 1: Availability check ──────────────────────────────────────
249
- const unavailableReason = await checkCloudAvailability(resolvedBaseUrl);
250
- if (unavailableReason) {
251
- clack.log.warn(unavailableReason);
252
-
253
- const fallback = await clack.confirm({
254
- message: "Run locally instead?",
255
- initialValue: true,
256
- });
257
-
258
- if (clack.isCancel(fallback) || fallback) {
259
- return null; // Fall back to local
260
- }
261
- // User said "no" to fallback — try auth anyway (maybe availability is
262
- // temporarily wrong).
263
- }
264
-
265
- // ── Step 2: Browser-based auth ──────────────────────────────────────
266
- const authResult = await runCloudAuth(clack, resolvedBaseUrl);
267
- if (!authResult) {
268
- clack.log.warn("Cloud login was not completed.");
269
-
270
- const retry = await clack.confirm({
271
- message: "Try again, or run locally?",
272
- active: "Try again",
273
- inactive: "Run locally",
274
- initialValue: false,
275
- });
276
-
277
- if (clack.isCancel(retry) || !retry) {
278
- return null; // Fall back to local
279
- }
280
-
281
- // Retry auth once
282
- const retryResult = await runCloudAuth(clack, resolvedBaseUrl);
283
- if (!retryResult) {
284
- clack.log.warn("Login was not completed. Falling back to local mode.");
285
- return null;
286
- }
287
-
288
- // Use retry result
289
- return await finishProvisioning(
290
- clack,
291
- resolvedBaseUrl,
292
- retryResult,
293
- agentName,
294
- preset,
295
- );
296
- }
297
-
298
- return await finishProvisioning(
299
- clack,
300
- resolvedBaseUrl,
301
- authResult,
302
- agentName,
303
- preset,
304
- );
305
- }
306
-
307
- /**
308
- * Complete provisioning after successful auth.
309
- */
310
- async function finishProvisioning(
311
- clack: ClackModule,
312
- baseUrl: string,
313
- authResult: CloudLoginResult,
314
- agentName: string,
315
- preset?: StylePreset,
316
- ): Promise<CloudOnboardingResult | null> {
317
- // ── Step 3: Create + provision agent ──────────────────────────────
318
- const client = new ElizaCloudClient(baseUrl, authResult.apiKey);
319
- const provisionResult = await provisionCloudAgent(
320
- clack,
321
- client,
322
- agentName,
323
- preset,
324
- );
325
-
326
- if (!provisionResult) {
327
- clack.log.warn(
328
- "Cloud provisioning did not complete. You can try `eliza cloud connect` later.",
329
- );
330
-
331
- const runLocal = await clack.confirm({
332
- message: "Continue with local setup instead?",
333
- initialValue: true,
334
- });
335
-
336
- if (clack.isCancel(runLocal) || runLocal) {
337
- return null;
338
- }
339
-
340
- // User doesn't want local either — just return the auth result
341
- // so config is saved (they can reconnect later)
342
- return {
343
- apiKey: authResult.apiKey,
344
- agentId: undefined, // No agent provisioned yet
345
- baseUrl,
346
- };
347
- }
348
-
349
- return {
350
- apiKey: authResult.apiKey,
351
- agentId: provisionResult.agentId,
352
- baseUrl,
353
- bridgeUrl: provisionResult.bridgeUrl,
354
- };
355
- }
356
-
357
- // ---------------------------------------------------------------------------
358
- // Helpers
359
- // ---------------------------------------------------------------------------
360
-
361
- function sleep(ms: number): Promise<void> {
362
- return new Promise((resolve) => setTimeout(resolve, ms));
363
- }
364
-
365
- /**
366
- * Try to open a URL in the user's default browser.
367
- * Falls back silently — the URL is also printed to the terminal.
368
- *
369
- * Uses execFile with an args array (not exec with string interpolation)
370
- * to avoid shell injection via crafted URLs.
371
- */
372
- async function openBrowser(url: string): Promise<void> {
373
- const { execFile } = await import("node:child_process");
374
- const { platform } = await import("node:os");
375
-
376
- const p = platform();
377
-
378
- return new Promise((resolve) => {
379
- const onError = (err: Error | null) => {
380
- if (err) {
381
- logger.debug(
382
- `[cloud-onboarding] Failed to open browser: ${err.message}`,
383
- );
384
- }
385
- resolve();
386
- };
387
-
388
- if (p === "darwin") {
389
- execFile("open", [url], onError);
390
- } else if (p === "win32") {
391
- execFile("cmd.exe", ["/c", "start", "", url], onError);
392
- } else {
393
- execFile("xdg-open", [url], onError);
394
- }
395
- });
396
- }