@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.
- package/README.md +20 -44
- package/auto-enable.ts +10 -5
- package/dist/browser/index.browser.js +2 -2
- package/dist/browser/index.browser.js.map +4 -4
- package/dist/cjs/index.node.cjs +2874 -5915
- package/dist/cjs/index.node.js.map +47 -116
- package/dist/cloud/auth-service-types.d.ts +8 -0
- package/dist/cloud/auth-service-types.d.ts.map +1 -0
- package/dist/cloud/auth-service-types.js +36 -0
- package/dist/cloud/auth-service-types.js.map +10 -0
- package/dist/cloud/auth.js +4 -51
- package/dist/cloud/auth.js.map +4 -4
- package/dist/cloud/base-url.d.ts +6 -2
- package/dist/cloud/base-url.d.ts.map +1 -1
- package/dist/cloud/base-url.js +3 -51
- package/dist/cloud/base-url.js.map +3 -3
- package/dist/cloud/bridge-client.d.ts +3 -3
- package/dist/cloud/bridge-client.d.ts.map +1 -1
- package/dist/cloud/bridge-client.js +3 -51
- package/dist/cloud/bridge-client.js.map +3 -3
- package/dist/cloud/clack-observer.d.ts +35 -0
- package/dist/cloud/clack-observer.d.ts.map +1 -0
- package/dist/cloud/clack-observer.js +143 -0
- package/dist/cloud/clack-observer.js.map +10 -0
- package/dist/cloud/cloud-manager.js +45 -92
- package/dist/cloud/cloud-manager.js.map +6 -6
- package/dist/cloud/cloud-wallet.js +2 -4835
- package/dist/cloud/cloud-wallet.js.map +3 -82
- package/dist/cloud/duffel-client.d.ts +181 -0
- package/dist/cloud/duffel-client.d.ts.map +1 -0
- package/dist/cloud/duffel-client.js +506 -0
- package/dist/cloud/duffel-client.js.map +11 -0
- package/dist/cloud/index.d.ts +6 -0
- package/dist/cloud/index.d.ts.map +1 -1
- package/dist/cloud/index.js +1782 -1
- package/dist/cloud/index.js.map +18 -3
- package/dist/cloud/lifeops-schedule-sync-client.d.ts +43 -0
- package/dist/cloud/lifeops-schedule-sync-client.d.ts.map +1 -0
- package/dist/cloud/lifeops-schedule-sync-client.js +180 -0
- package/dist/cloud/lifeops-schedule-sync-client.js.map +11 -0
- package/dist/cloud/lifeops-schedule-sync-contracts.d.ts +89 -0
- package/dist/cloud/lifeops-schedule-sync-contracts.d.ts.map +1 -0
- package/dist/cloud/lifeops-schedule-sync-contracts.js +39 -0
- package/dist/cloud/lifeops-schedule-sync-contracts.js.map +10 -0
- package/dist/cloud/managed-payment-clients.d.ts +166 -0
- package/dist/cloud/managed-payment-clients.d.ts.map +1 -0
- package/dist/cloud/managed-payment-clients.js +238 -0
- package/dist/cloud/managed-payment-clients.js.map +11 -0
- package/dist/cloud/null-observer.d.ts +35 -0
- package/dist/cloud/null-observer.d.ts.map +1 -0
- package/dist/cloud/null-observer.js +45 -0
- package/dist/cloud/null-observer.js.map +10 -0
- package/dist/cloud/setup-observer.d.ts +98 -0
- package/dist/cloud/setup-observer.d.ts.map +1 -0
- package/dist/cloud/setup-observer.js +2 -0
- package/dist/cloud/setup-observer.js.map +9 -0
- package/dist/cloud/validate-url.d.ts.map +1 -1
- package/dist/cloud/validate-url.js +2 -1
- package/dist/cloud/validate-url.js.map +3 -3
- package/dist/cloud/x402-payment-handler.d.ts +85 -0
- package/dist/cloud/x402-payment-handler.d.ts.map +1 -0
- package/dist/cloud/x402-payment-handler.js +119 -0
- package/dist/cloud/x402-payment-handler.js.map +10 -0
- package/dist/cloud-setup.d.ts +36 -0
- package/dist/cloud-setup.d.ts.map +1 -0
- package/dist/{onboarding.js → cloud-setup.js} +139 -139
- package/dist/cloud-setup.js.map +14 -0
- package/dist/cloud-voice-catalog.d.ts +65 -0
- package/dist/cloud-voice-catalog.d.ts.map +1 -0
- package/dist/cloud-voice-catalog.js +278 -0
- package/dist/cloud-voice-catalog.js.map +12 -0
- package/dist/index.browser.d.ts +11 -0
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5416 -8405
- package/dist/index.js.map +48 -116
- package/dist/index.node.d.ts +8 -1
- package/dist/index.node.d.ts.map +1 -1
- package/dist/init.js +17 -4
- package/dist/init.js.map +4 -4
- package/dist/lib/cloud-connection.d.ts +0 -1
- package/dist/lib/cloud-connection.d.ts.map +1 -1
- package/dist/lib/cloud-connection.js +14 -91
- package/dist/lib/cloud-connection.js.map +7 -7
- package/dist/lib/cloud-secrets.d.ts +5 -18
- package/dist/lib/cloud-secrets.d.ts.map +1 -1
- package/dist/lib/cloud-secrets.js +8 -36
- package/dist/lib/cloud-secrets.js.map +3 -3
- package/dist/lib/config-like.d.ts +1 -1
- package/dist/lib/config-like.d.ts.map +1 -1
- package/dist/lib/config-like.js +3 -3
- package/dist/lib/config-like.js.map +3 -3
- package/dist/lib/credential-type-map.d.ts +1 -1
- package/dist/lib/credential-type-map.js.map +1 -1
- package/dist/lib/http.d.ts +0 -11
- package/dist/lib/http.d.ts.map +1 -1
- package/dist/lib/http.js.map +2 -2
- package/dist/lib/server-cloud-tts.d.ts +12 -25
- package/dist/lib/server-cloud-tts.d.ts.map +1 -1
- package/dist/lib/server-cloud-tts.js +31 -329
- package/dist/lib/server-cloud-tts.js.map +4 -7
- package/dist/lib/tts-debug.d.ts +5 -3
- package/dist/lib/tts-debug.d.ts.map +1 -1
- package/dist/lib/tts-debug.js +1 -34
- package/dist/lib/tts-debug.js.map +3 -4
- package/dist/models/embeddings.d.ts.map +1 -1
- package/dist/models/embeddings.js +79 -69
- package/dist/models/embeddings.js.map +6 -6
- package/dist/models/image.d.ts.map +1 -1
- package/dist/models/image.js +42 -15
- package/dist/models/image.js.map +6 -6
- package/dist/models/index.js +676 -166
- package/dist/models/index.js.map +11 -12
- package/dist/models/research.d.ts.map +1 -1
- package/dist/models/research.js +24 -7
- package/dist/models/research.js.map +6 -6
- package/dist/models/speech.d.ts +61 -3
- package/dist/models/speech.d.ts.map +1 -1
- package/dist/models/speech.js +173 -17
- package/dist/models/speech.js.map +5 -5
- package/dist/models/text.d.ts +106 -1
- package/dist/models/text.d.ts.map +1 -1
- package/dist/models/text.js +452 -82
- package/dist/models/text.js.map +7 -8
- package/dist/models/tokenization.d.ts.map +1 -1
- package/dist/models/tokenization.js.map +2 -2
- package/dist/models/transcription.d.ts.map +1 -1
- package/dist/models/transcription.js +20 -6
- package/dist/models/transcription.js.map +5 -5
- package/dist/node/index.node.js +2828 -5838
- package/dist/node/index.node.js.map +47 -116
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +376 -5050
- package/dist/plugin.js.map +16 -92
- package/dist/providers/openai.js +11 -2
- package/dist/providers/openai.js.map +3 -3
- package/dist/register-routes.js +376 -5050
- package/dist/register-routes.js.map +16 -92
- package/dist/routes/cloud-billing-routes.d.ts.map +1 -1
- package/dist/routes/cloud-billing-routes.js +17 -60
- package/dist/routes/cloud-billing-routes.js.map +8 -7
- package/dist/routes/cloud-coding-container-routes.d.ts +8 -0
- package/dist/routes/cloud-coding-container-routes.d.ts.map +1 -0
- package/dist/routes/cloud-coding-container-routes.js +214 -0
- package/dist/routes/cloud-coding-container-routes.js.map +11 -0
- package/dist/routes/cloud-compat-routes.d.ts.map +1 -1
- package/dist/routes/cloud-compat-routes.js +17 -60
- package/dist/routes/cloud-compat-routes.js.map +8 -7
- package/dist/routes/cloud-features-routes.js +2 -2
- package/dist/routes/cloud-features-routes.js.map +4 -4
- package/dist/routes/cloud-relay-routes.d.ts +2 -1
- package/dist/routes/cloud-relay-routes.d.ts.map +1 -1
- package/dist/routes/cloud-relay-routes.js +84 -2
- package/dist/routes/cloud-relay-routes.js.map +5 -4
- package/dist/routes/cloud-routes-autonomous.d.ts +3 -4
- package/dist/routes/cloud-routes-autonomous.d.ts.map +1 -1
- package/dist/routes/cloud-routes-autonomous.js +11 -4893
- package/dist/routes/cloud-routes-autonomous.js.map +8 -87
- package/dist/routes/cloud-routes.d.ts +2 -2
- package/dist/routes/cloud-routes.d.ts.map +1 -1
- package/dist/routes/cloud-routes.js +343 -5058
- package/dist/routes/cloud-routes.js.map +13 -90
- package/dist/routes/cloud-status-routes-autonomous.d.ts +1 -2
- package/dist/routes/cloud-status-routes-autonomous.d.ts.map +1 -1
- package/dist/routes/cloud-status-routes-autonomous.js +4 -51
- package/dist/routes/cloud-status-routes-autonomous.js.map +5 -5
- package/dist/routes/cloud-status-routes.js +14 -90
- package/dist/routes/cloud-status-routes.js.map +7 -7
- package/dist/routes/home-remote-runner-access-url.d.ts +16 -0
- package/dist/routes/home-remote-runner-access-url.d.ts.map +1 -0
- package/dist/routes/home-remote-runner-access-url.js +91 -0
- package/dist/routes/home-remote-runner-access-url.js.map +10 -0
- package/dist/routes/travel-provider-relay-routes.d.ts +9 -0
- package/dist/routes/travel-provider-relay-routes.d.ts.map +1 -0
- package/dist/routes/travel-provider-relay-routes.js +358 -0
- package/dist/routes/travel-provider-relay-routes.js.map +14 -0
- package/dist/services/cloud-auth.d.ts +1 -1
- package/dist/services/cloud-auth.d.ts.map +1 -1
- package/dist/services/cloud-auth.js +7 -2
- package/dist/services/cloud-auth.js.map +4 -4
- package/dist/services/cloud-backup.js.map +2 -2
- package/dist/services/cloud-bootstrap.d.ts.map +1 -1
- package/dist/services/cloud-bootstrap.js.map +2 -2
- package/dist/services/cloud-bridge.js.map +3 -3
- package/dist/services/cloud-container.d.ts +5 -1
- package/dist/services/cloud-container.d.ts.map +1 -1
- package/dist/services/cloud-container.js +52 -1
- package/dist/services/cloud-container.js.map +4 -4
- package/dist/services/cloud-credential-provider.js.map +2 -2
- package/dist/services/cloud-model-registry.js.map +2 -2
- package/dist/types/cloud.d.ts +1 -0
- package/dist/types/cloud.d.ts.map +1 -1
- package/dist/types/cloud.js.map +2 -2
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/cloud-sdk/client.d.ts.map +1 -1
- package/dist/utils/cloud-sdk/client.js +136 -4
- package/dist/utils/cloud-sdk/client.js.map +5 -5
- package/dist/utils/cloud-sdk/http.js.map +1 -1
- package/dist/utils/cloud-sdk/public-routes.d.ts +186 -0
- package/dist/utils/cloud-sdk/public-routes.d.ts.map +1 -1
- package/dist/utils/cloud-sdk/public-routes.js +99 -1
- package/dist/utils/cloud-sdk/public-routes.js.map +3 -3
- package/dist/utils/cloud-sdk/types.d.ts +0 -2
- package/dist/utils/cloud-sdk/types.d.ts.map +1 -1
- package/dist/utils/cloud-sdk/types.js.map +1 -1
- package/dist/utils/config.d.ts +10 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +12 -2
- package/dist/utils/config.js.map +3 -3
- package/dist/utils/events.d.ts +23 -2
- package/dist/utils/events.d.ts.map +1 -1
- package/dist/utils/events.js +5 -3
- package/dist/utils/events.js.map +3 -3
- package/dist/utils/sdk-client.d.ts.map +1 -1
- package/dist/utils/sdk-client.js +17 -4
- package/dist/utils/sdk-client.js.map +4 -4
- package/dist/utils/waifu-metering.d.ts +108 -0
- package/dist/utils/waifu-metering.d.ts.map +1 -0
- package/dist/utils/waifu-metering.js +166 -0
- package/dist/utils/waifu-metering.js.map +10 -0
- package/package.json +51 -22
- package/src/cloud/auth-service-types.ts +24 -0
- package/src/cloud/base-url.ts +6 -62
- package/src/cloud/clack-observer.ts +189 -0
- package/src/cloud/duffel-client.ts +847 -0
- package/src/cloud/index.ts +10 -0
- package/src/cloud/lifeops-schedule-sync-client.ts +245 -0
- package/src/cloud/lifeops-schedule-sync-contracts.ts +124 -0
- package/src/cloud/managed-payment-clients.ts +374 -0
- package/src/cloud/null-observer.ts +45 -0
- package/src/cloud/setup-observer.ts +125 -0
- package/src/cloud/validate-url.ts +7 -1
- package/src/cloud/x402-payment-handler.ts +215 -0
- package/src/cloud-setup.ts +531 -0
- package/src/cloud-voice-catalog.test.ts +254 -0
- package/src/cloud-voice-catalog.ts +246 -0
- package/src/index.browser.ts +29 -0
- package/src/index.node.ts +31 -1
- package/src/index.ts +76 -4
- package/src/lib/cloud-connection.ts +2 -4
- package/src/lib/cloud-secrets.ts +10 -54
- package/src/lib/config-like.ts +1 -1
- package/src/lib/credential-type-map.ts +2 -2
- package/src/lib/http.ts +0 -17
- package/src/lib/server-cloud-tts.ts +33 -341
- package/src/lib/tts-debug.ts +5 -34
- package/src/models/embeddings.ts +140 -76
- package/src/models/image.ts +29 -14
- package/src/models/research.ts +11 -1
- package/src/models/speech.ts +269 -23
- package/src/models/text.ts +704 -110
- package/src/models/tokenization.ts +2 -2
- package/src/models/transcription.ts +7 -3
- package/src/plugin.ts +38 -0
- package/src/routes/cloud-billing-routes.ts +4 -14
- package/src/routes/cloud-coding-container-routes.ts +198 -0
- package/src/routes/cloud-compat-routes.ts +4 -14
- package/src/routes/cloud-features-routes.ts +1 -1
- package/src/routes/cloud-relay-routes.ts +47 -1
- package/src/routes/cloud-routes-autonomous.ts +7 -10
- package/src/routes/cloud-routes.ts +68 -7
- package/src/routes/cloud-status-routes-autonomous.ts +6 -2
- package/src/routes/home-remote-runner-access-url.ts +83 -0
- package/src/routes/travel-provider-relay-routes.ts +193 -0
- package/src/services/cloud-auth.ts +9 -2
- package/src/services/cloud-bootstrap.ts +1 -3
- package/src/services/cloud-bridge.ts +1 -1
- package/src/services/cloud-container.ts +93 -0
- package/src/services/cloud-credential-provider.ts +1 -1
- package/src/services/cloud-model-registry.ts +1 -1
- package/src/types/cloud.ts +22 -0
- package/src/types/index.ts +19 -0
- package/src/utils/cloud-sdk/client.ts +42 -3
- package/src/utils/cloud-sdk/public-routes.ts +168 -0
- package/src/utils/cloud-sdk/types.ts +0 -2
- package/src/utils/config.ts +20 -1
- package/src/utils/events.ts +30 -2
- package/src/utils/sdk-client.ts +5 -1
- package/src/utils/waifu-metering.ts +302 -0
- package/dist/onboarding.d.ts +0 -35
- package/dist/onboarding.d.ts.map +0 -1
- package/dist/onboarding.js.map +0 -14
- 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 {
|
|
91
|
-
|
|
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/
|
|
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 "
|
|
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
|
-
|
|
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
|
|
127
|
-
*
|
|
128
|
-
*
|
|
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
|
-
|
|
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 —
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
...
|
|
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
|
|
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 {
|
|
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 =
|