@elizaos/plugin-elizacloud 2.0.0-alpha.7 → 2.0.0-beta.1
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/LICENSE +21 -0
- package/README.md +220 -0
- package/auto-enable.ts +17 -0
- package/dist/browser/index.browser.js +2 -21
- package/dist/browser/index.browser.js.map +5 -37
- package/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.node.cjs +12173 -2271
- package/dist/cjs/index.node.js.map +135 -27
- package/dist/cloud/auth.d.ts +19 -0
- package/dist/cloud/auth.d.ts.map +1 -0
- package/dist/cloud/auth.js +330 -0
- package/dist/cloud/auth.js.map +12 -0
- package/dist/cloud/backup.d.ts +18 -0
- package/dist/cloud/backup.d.ts.map +1 -0
- package/dist/cloud/backup.js +63 -0
- package/dist/cloud/backup.js.map +10 -0
- package/dist/cloud/base-url.d.ts +3 -0
- package/dist/cloud/base-url.d.ts.map +1 -0
- package/dist/cloud/base-url.js +77 -0
- package/dist/cloud/base-url.js.map +10 -0
- package/dist/cloud/bridge-client.d.ts +126 -0
- package/dist/cloud/bridge-client.d.ts.map +1 -0
- package/dist/cloud/bridge-client.js +432 -0
- package/dist/cloud/bridge-client.js.map +11 -0
- package/dist/cloud/cloud-api-key.d.ts +26 -0
- package/dist/cloud/cloud-api-key.d.ts.map +1 -0
- package/dist/cloud/cloud-api-key.js +60 -0
- package/dist/cloud/cloud-api-key.js.map +10 -0
- package/dist/cloud/cloud-manager.d.ts +33 -0
- package/dist/cloud/cloud-manager.d.ts.map +1 -0
- package/dist/cloud/cloud-manager.js +853 -0
- package/dist/cloud/cloud-manager.js.map +16 -0
- package/dist/cloud/cloud-proxy.d.ts +20 -0
- package/dist/cloud/cloud-proxy.d.ts.map +1 -0
- package/dist/cloud/cloud-proxy.js +54 -0
- package/dist/cloud/cloud-proxy.js.map +10 -0
- package/dist/cloud/cloud-wallet.d.ts +94 -0
- package/dist/cloud/cloud-wallet.d.ts.map +1 -0
- package/dist/cloud/cloud-wallet.js +5195 -0
- package/dist/cloud/cloud-wallet.js.map +92 -0
- package/dist/cloud/index.d.ts +9 -0
- package/dist/cloud/index.d.ts.map +1 -0
- package/dist/cloud/index.js +30 -0
- package/dist/cloud/index.js.map +9 -0
- package/dist/cloud/reconnect.d.ts +26 -0
- package/dist/cloud/reconnect.d.ts.map +1 -0
- package/dist/cloud/reconnect.js +104 -0
- package/dist/cloud/reconnect.js.map +10 -0
- package/dist/cloud/validate-url.d.ts +2 -0
- package/dist/cloud/validate-url.d.ts.map +1 -0
- package/dist/cloud/validate-url.js +174 -0
- package/dist/cloud/validate-url.js.map +10 -0
- package/dist/cloud-providers/cloud-status.d.ts.map +1 -1
- package/dist/cloud-providers/cloud-status.js +78 -0
- package/dist/cloud-providers/cloud-status.js.map +10 -0
- package/dist/cloud-providers/container-health.d.ts.map +1 -1
- package/dist/cloud-providers/container-health.js +74 -0
- package/dist/cloud-providers/container-health.js.map +10 -0
- package/dist/cloud-providers/credit-balance.d.ts.map +1 -1
- package/dist/cloud-providers/credit-balance.js +85 -0
- package/dist/cloud-providers/credit-balance.js.map +10 -0
- package/dist/cloud-providers/index.d.ts.map +1 -1
- package/dist/cloud-providers/index.js +24 -0
- package/dist/cloud-providers/index.js.map +9 -0
- package/dist/cloud-providers/model-registry.d.ts.map +1 -1
- package/dist/cloud-providers/model-registry.js +71 -0
- package/dist/cloud-providers/model-registry.js.map +10 -0
- package/dist/index.browser.d.ts +4 -2
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12851 -0
- package/dist/index.js.map +145 -0
- package/dist/index.node.d.ts +15 -2
- package/dist/index.node.d.ts.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +169 -0
- package/dist/init.js.map +12 -0
- package/dist/lib/cloud-connection.d.ts +78 -0
- package/dist/lib/cloud-connection.d.ts.map +1 -0
- package/dist/lib/cloud-connection.js +731 -0
- package/dist/lib/cloud-connection.js.map +14 -0
- package/dist/lib/cloud-secrets.d.ts +23 -0
- package/dist/lib/cloud-secrets.d.ts.map +1 -0
- package/dist/lib/cloud-secrets.js +64 -0
- package/dist/lib/cloud-secrets.js.map +10 -0
- package/dist/lib/config-env.d.ts +5 -0
- package/dist/lib/config-env.d.ts.map +1 -0
- package/dist/lib/config-env.js +191 -0
- package/dist/lib/config-env.js.map +11 -0
- package/dist/lib/config-like.d.ts +40 -0
- package/dist/lib/config-like.d.ts.map +1 -0
- package/dist/lib/config-like.js +103 -0
- package/dist/lib/config-like.js.map +10 -0
- package/dist/lib/credential-type-map.d.ts +53 -0
- package/dist/lib/credential-type-map.d.ts.map +1 -0
- package/dist/lib/credential-type-map.js +88 -0
- package/dist/lib/credential-type-map.js.map +10 -0
- package/dist/lib/feature-flags.d.ts +2 -0
- package/dist/lib/feature-flags.d.ts.map +1 -0
- package/dist/lib/feature-flags.js +40 -0
- package/dist/lib/feature-flags.js.map +10 -0
- package/dist/lib/http.d.ts +22 -0
- package/dist/lib/http.d.ts.map +1 -0
- package/dist/lib/http.js +107 -0
- package/dist/lib/http.js.map +10 -0
- package/dist/lib/server-cloud-tts.d.ts +34 -0
- package/dist/lib/server-cloud-tts.d.ts.map +1 -0
- package/dist/lib/server-cloud-tts.js +549 -0
- package/dist/lib/server-cloud-tts.js.map +13 -0
- package/dist/lib/state-paths.d.ts +4 -0
- package/dist/lib/state-paths.d.ts.map +1 -0
- package/dist/lib/state-paths.js +52 -0
- package/dist/lib/state-paths.js.map +10 -0
- package/dist/lib/tts-debug.d.ts +4 -0
- package/dist/lib/tts-debug.d.ts.map +1 -0
- package/dist/lib/tts-debug.js +57 -0
- package/dist/lib/tts-debug.js.map +10 -0
- package/dist/models/embeddings.d.ts.map +1 -1
- package/dist/models/embeddings.js +319 -0
- package/dist/models/embeddings.js.map +13 -0
- package/dist/models/image.d.ts.map +1 -1
- package/dist/models/image.js +374 -0
- package/dist/models/image.js.map +14 -0
- package/dist/models/index.d.ts +1 -2
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +1386 -0
- package/dist/models/index.js.map +20 -0
- package/dist/models/research.d.ts.map +1 -1
- package/dist/models/research.js +324 -0
- package/dist/models/research.js.map +13 -0
- package/dist/models/speech.d.ts.map +1 -1
- package/dist/models/speech.js +273 -0
- package/dist/models/speech.js.map +13 -0
- package/dist/models/text.d.ts +5 -2
- package/dist/models/text.d.ts.map +1 -1
- package/dist/models/text.js +803 -0
- package/dist/models/text.js.map +15 -0
- package/dist/models/tokenization.d.ts.map +1 -1
- package/dist/models/tokenization.js +65 -0
- package/dist/models/tokenization.js.map +10 -0
- package/dist/models/transcription.d.ts.map +1 -1
- package/dist/models/transcription.js +283 -0
- package/dist/models/transcription.js.map +13 -0
- package/dist/node/index.d.ts +2 -2
- package/dist/node/index.node.js +12171 -2266
- package/dist/node/index.node.js.map +135 -27
- package/dist/onboarding.d.ts +35 -0
- package/dist/onboarding.d.ts.map +1 -0
- package/dist/onboarding.js +883 -0
- package/dist/onboarding.js.map +14 -0
- package/dist/plugin.d.ts +20 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +7611 -0
- package/dist/plugin.js.map +104 -0
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +127 -0
- package/dist/providers/openai.js.map +11 -0
- package/dist/register-routes.d.ts +2 -0
- package/dist/register-routes.d.ts.map +1 -0
- package/dist/register-routes.js +7612 -0
- package/dist/register-routes.js.map +105 -0
- package/dist/routes/cloud-billing-routes.d.ts +9 -0
- package/dist/routes/cloud-billing-routes.d.ts.map +1 -0
- package/dist/routes/cloud-billing-routes.js +807 -0
- package/dist/routes/cloud-billing-routes.js.map +14 -0
- package/dist/routes/cloud-compat-routes.d.ts +10 -0
- package/dist/routes/cloud-compat-routes.d.ts.map +1 -0
- package/dist/routes/cloud-compat-routes.js +538 -0
- package/dist/routes/cloud-compat-routes.js.map +14 -0
- package/dist/routes/cloud-features-routes.d.ts +9 -0
- package/dist/routes/cloud-features-routes.d.ts.map +1 -0
- package/dist/routes/cloud-features-routes.js +124 -0
- package/dist/routes/cloud-features-routes.js.map +11 -0
- package/dist/routes/cloud-provisioning.d.ts +14 -0
- package/dist/routes/cloud-provisioning.d.ts.map +1 -0
- package/dist/routes/cloud-provisioning.js +37 -0
- package/dist/routes/cloud-provisioning.js.map +10 -0
- package/dist/routes/cloud-relay-routes.d.ts +22 -0
- package/dist/routes/cloud-relay-routes.d.ts.map +1 -0
- package/dist/routes/cloud-relay-routes.js +60 -0
- package/dist/routes/cloud-relay-routes.js.map +10 -0
- package/dist/routes/cloud-routes-autonomous.d.ts +83 -0
- package/dist/routes/cloud-routes-autonomous.d.ts.map +1 -0
- package/dist/routes/cloud-routes-autonomous.js +6134 -0
- package/dist/routes/cloud-routes-autonomous.js.map +97 -0
- package/dist/routes/cloud-routes.d.ts +35 -0
- package/dist/routes/cloud-routes.d.ts.map +1 -0
- package/dist/routes/cloud-routes.js +6888 -0
- package/dist/routes/cloud-routes.js.map +100 -0
- package/dist/routes/cloud-status-routes-autonomous.d.ts +15 -0
- package/dist/routes/cloud-status-routes-autonomous.d.ts.map +1 -0
- package/dist/routes/cloud-status-routes-autonomous.js +396 -0
- package/dist/routes/cloud-status-routes-autonomous.js.map +13 -0
- package/dist/routes/cloud-status-routes.d.ts +4 -0
- package/dist/routes/cloud-status-routes.d.ts.map +1 -0
- package/dist/routes/cloud-status-routes.js +771 -0
- package/dist/routes/cloud-status-routes.js.map +15 -0
- package/dist/services/cloud-auth.d.ts +140 -5
- package/dist/services/cloud-auth.d.ts.map +1 -1
- package/dist/services/cloud-auth.js +363 -0
- package/dist/services/cloud-auth.js.map +12 -0
- package/dist/services/cloud-backup.d.ts.map +1 -1
- package/dist/services/cloud-backup.js +176 -0
- package/dist/services/cloud-backup.js.map +11 -0
- package/dist/services/cloud-bootstrap.d.ts +38 -0
- package/dist/services/cloud-bootstrap.d.ts.map +1 -0
- package/dist/services/cloud-bootstrap.js +84 -0
- package/dist/services/cloud-bootstrap.js.map +10 -0
- package/dist/services/cloud-bridge.d.ts +1 -1
- package/dist/services/cloud-bridge.d.ts.map +1 -1
- package/dist/services/cloud-bridge.js +308 -0
- package/dist/services/cloud-bridge.js.map +11 -0
- package/dist/services/cloud-container.d.ts.map +1 -1
- package/dist/services/cloud-container.js +241 -0
- package/dist/services/cloud-container.js.map +11 -0
- package/dist/services/cloud-credential-provider.d.ts +55 -0
- package/dist/services/cloud-credential-provider.d.ts.map +1 -0
- package/dist/services/cloud-credential-provider.js +190 -0
- package/dist/services/cloud-credential-provider.js.map +11 -0
- package/dist/services/cloud-managed-gateway-relay.d.ts +38 -0
- package/dist/services/cloud-managed-gateway-relay.d.ts.map +1 -0
- package/dist/services/cloud-managed-gateway-relay.js +479 -0
- package/dist/services/cloud-managed-gateway-relay.js.map +10 -0
- package/dist/services/cloud-model-registry.d.ts.map +1 -1
- package/dist/services/cloud-model-registry.js +175 -0
- package/dist/services/cloud-model-registry.js.map +10 -0
- package/dist/services/index.d.ts +3 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +29 -0
- package/dist/services/index.js.map +9 -0
- package/dist/types/cloud.d.ts +41 -19
- package/dist/types/cloud.d.ts.map +1 -1
- package/dist/types/cloud.js +52 -0
- package/dist/types/cloud.js.map +10 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +24 -0
- package/dist/types/index.js.map +9 -0
- package/dist/utils/cloud-api.d.ts +2 -27
- package/dist/utils/cloud-api.d.ts.map +1 -1
- package/dist/utils/cloud-api.js +33 -0
- package/dist/utils/cloud-api.js.map +10 -0
- package/dist/utils/cloud-sdk/client.d.ts +133 -0
- package/dist/utils/cloud-sdk/client.d.ts.map +1 -0
- package/dist/utils/cloud-sdk/client.js +3561 -0
- package/dist/utils/cloud-sdk/client.js.map +13 -0
- package/dist/utils/cloud-sdk/http.d.ts +37 -0
- package/dist/utils/cloud-sdk/http.d.ts.map +1 -0
- package/dist/utils/cloud-sdk/http.js +237 -0
- package/dist/utils/cloud-sdk/http.js.map +11 -0
- package/dist/utils/cloud-sdk/index.d.ts +6 -0
- package/dist/utils/cloud-sdk/index.d.ts.map +1 -0
- package/dist/utils/cloud-sdk/index.js +29 -0
- package/dist/utils/cloud-sdk/index.js.map +9 -0
- package/dist/utils/cloud-sdk/public-routes.d.ts +5377 -0
- package/dist/utils/cloud-sdk/public-routes.d.ts.map +1 -0
- package/dist/utils/cloud-sdk/public-routes.js +2950 -0
- package/dist/utils/cloud-sdk/public-routes.js.map +10 -0
- package/dist/utils/cloud-sdk/types.cloud-api.d.ts +101 -0
- package/dist/utils/cloud-sdk/types.cloud-api.d.ts.map +1 -0
- package/dist/utils/cloud-sdk/types.cloud-api.js +2 -0
- package/dist/utils/cloud-sdk/types.cloud-api.js.map +9 -0
- package/dist/utils/cloud-sdk/types.d.ts +655 -0
- package/dist/utils/cloud-sdk/types.d.ts.map +1 -0
- package/dist/utils/cloud-sdk/types.js +29 -0
- package/dist/utils/cloud-sdk/types.js.map +10 -0
- package/dist/utils/config.d.ts +7 -3
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +137 -0
- package/dist/utils/config.js.map +10 -0
- package/dist/utils/events.d.ts.map +1 -1
- package/dist/utils/events.js +43 -0
- package/dist/utils/events.js.map +10 -0
- package/dist/utils/helpers.d.ts.map +1 -1
- package/dist/utils/helpers.js +103 -0
- package/dist/utils/helpers.js.map +10 -0
- package/dist/utils/responses-output.d.ts +13 -0
- package/dist/utils/responses-output.d.ts.map +1 -0
- package/dist/utils/responses-output.js +102 -0
- package/dist/utils/responses-output.js.map +10 -0
- package/dist/utils/sdk-client.d.ts +5 -0
- package/dist/utils/sdk-client.d.ts.map +1 -0
- package/dist/utils/sdk-client.js +144 -0
- package/dist/utils/sdk-client.js.map +11 -0
- package/package.json +108 -19
- package/src/cloud/auth.ts +175 -0
- package/src/cloud/backup.ts +46 -0
- package/src/cloud/base-url.ts +62 -0
- package/src/cloud/bridge-client.ts +602 -0
- package/src/cloud/cloud-api-key.ts +80 -0
- package/src/cloud/cloud-manager.ts +163 -0
- package/src/cloud/cloud-proxy.ts +52 -0
- package/src/cloud/cloud-wallet.ts +341 -0
- package/src/cloud/index.ts +28 -0
- package/src/cloud/reconnect.ts +111 -0
- package/src/cloud/validate-url.ts +181 -0
- package/src/cloud-providers/cloud-status.ts +75 -0
- package/src/cloud-providers/container-health.ts +68 -0
- package/src/cloud-providers/credit-balance.ts +70 -0
- package/src/cloud-providers/index.ts +3 -0
- package/src/cloud-providers/model-registry.ts +74 -0
- package/src/index.browser.ts +10 -0
- package/src/index.node.ts +39 -0
- package/src/index.ts +347 -0
- package/src/init.ts +39 -0
- package/src/lib/cloud-connection.ts +663 -0
- package/src/lib/cloud-secrets.ts +58 -0
- package/src/lib/config-env.ts +168 -0
- package/src/lib/config-like.ts +149 -0
- package/src/lib/credential-type-map.ts +130 -0
- package/src/lib/feature-flags.ts +26 -0
- package/src/lib/http.ts +139 -0
- package/src/lib/server-cloud-tts.ts +609 -0
- package/src/lib/state-paths.ts +28 -0
- package/src/lib/tts-debug.ts +34 -0
- package/src/models/embeddings.ts +234 -0
- package/src/models/image.ts +219 -0
- package/src/models/index.ts +16 -0
- package/src/models/research.ts +265 -0
- package/src/models/speech.ts +78 -0
- package/src/models/text.ts +899 -0
- package/src/models/tokenization.ts +67 -0
- package/src/models/transcription.ts +97 -0
- package/src/onboarding.ts +396 -0
- package/src/plugin.ts +243 -0
- package/src/providers/openai.ts +16 -0
- package/src/register-routes.ts +6 -0
- package/src/routes/cloud-billing-routes.ts +754 -0
- package/src/routes/cloud-compat-routes.ts +314 -0
- package/src/routes/cloud-features-routes.ts +57 -0
- package/src/routes/cloud-provisioning.ts +37 -0
- package/src/routes/cloud-relay-routes.ts +89 -0
- package/src/routes/cloud-routes-autonomous.ts +996 -0
- package/src/routes/cloud-routes.ts +576 -0
- package/src/routes/cloud-status-routes-autonomous.ts +234 -0
- package/src/routes/cloud-status-routes.ts +73 -0
- package/src/services/cloud-auth.ts +567 -0
- package/src/services/cloud-backup.ts +208 -0
- package/src/services/cloud-bootstrap.ts +108 -0
- package/src/services/cloud-bridge.ts +386 -0
- package/src/services/cloud-container.ts +297 -0
- package/src/services/cloud-credential-provider.ts +210 -0
- package/src/services/cloud-managed-gateway-relay.ts +663 -0
- package/src/services/cloud-model-registry.ts +202 -0
- package/src/services/index.ts +17 -0
- package/{types → src/types}/cloud.ts +52 -29
- package/{types → src/types}/index.ts +6 -0
- package/src/utils/cloud-api.ts +10 -0
- package/src/utils/cloud-sdk/client.ts +735 -0
- package/src/utils/cloud-sdk/http.ts +291 -0
- package/src/utils/cloud-sdk/index.ts +23 -0
- package/src/utils/cloud-sdk/public-routes.ts +5070 -0
- package/src/utils/cloud-sdk/types.cloud-api.ts +120 -0
- package/src/utils/cloud-sdk/types.ts +762 -0
- package/src/utils/config.ts +174 -0
- package/src/utils/events.ts +37 -0
- package/src/utils/helpers.ts +107 -0
- package/src/utils/responses-output.ts +115 -0
- package/src/utils/sdk-client.ts +37 -0
- package/dist/actions/check-credits.d.ts +0 -6
- package/dist/actions/check-credits.d.ts.map +0 -1
- package/dist/actions/freeze-agent.d.ts +0 -9
- package/dist/actions/freeze-agent.d.ts.map +0 -1
- package/dist/actions/index.d.ts +0 -5
- package/dist/actions/index.d.ts.map +0 -1
- package/dist/actions/provision-agent.d.ts +0 -8
- package/dist/actions/provision-agent.d.ts.map +0 -1
- package/dist/actions/resume-agent.d.ts +0 -9
- package/dist/actions/resume-agent.d.ts.map +0 -1
- package/dist/build.d.ts +0 -3
- package/dist/build.d.ts.map +0 -1
- package/dist/generated/specs/specs.d.ts +0 -55
- package/dist/generated/specs/specs.d.ts.map +0 -1
- package/dist/models/object.d.ts +0 -4
- package/dist/models/object.d.ts.map +0 -1
- package/dist/utils/forwarded-settings.d.ts +0 -8
- package/dist/utils/forwarded-settings.d.ts.map +0 -1
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
import type http from "node:http";
|
|
2
|
+
import type { AgentRuntime, Service } from "@elizaos/core";
|
|
3
|
+
import { logger } from "@elizaos/core";
|
|
4
|
+
import { normalizeCloudSiteUrl } from "../cloud/base-url.js";
|
|
5
|
+
import { resolveCloudApiKey } from "../cloud/cloud-api-key.js";
|
|
6
|
+
import { validateCloudBaseUrl } from "../cloud/validate-url.js";
|
|
7
|
+
import type { CloudProxyConfigLike } from "../lib/config-like";
|
|
8
|
+
import { sendJson, sendJsonError } from "../lib/http";
|
|
9
|
+
|
|
10
|
+
export interface CloudCompatRouteState {
|
|
11
|
+
config: CloudProxyConfigLike;
|
|
12
|
+
runtime?: AgentRuntime | null;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const PROXY_TIMEOUT_MS = 15_000;
|
|
16
|
+
const MAX_BODY_BYTES = 1_048_576;
|
|
17
|
+
const JSON_CONTENT_TYPE_RE = /\b(?:application\/json|[^;\s]+\+json)\b/i;
|
|
18
|
+
|
|
19
|
+
interface CloudAuthApiKeyService {
|
|
20
|
+
isAuthenticated: () => boolean;
|
|
21
|
+
getApiKey?: () => string | undefined;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function resolveCloudBaseUrl(config: CloudProxyConfigLike): string {
|
|
25
|
+
return normalizeCloudSiteUrl(config.cloud?.baseUrl);
|
|
26
|
+
}
|
|
27
|
+
|
|
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
|
+
function resolveProxyApiKey(state: CloudCompatRouteState): string | null {
|
|
38
|
+
const cloudAuth = state.runtime
|
|
39
|
+
? state.runtime.getService<Service & CloudAuthApiKeyService>("CLOUD_AUTH")
|
|
40
|
+
: null;
|
|
41
|
+
const runtimeApiKey =
|
|
42
|
+
cloudAuth?.isAuthenticated() === true
|
|
43
|
+
? normalizeCloudApiKey(cloudAuth.getApiKey?.())
|
|
44
|
+
: null;
|
|
45
|
+
|
|
46
|
+
return runtimeApiKey ?? resolveCloudApiKey(state.config, state.runtime);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function buildAuthHeaders(
|
|
50
|
+
config: CloudProxyConfigLike,
|
|
51
|
+
apiKeyOverride?: string | null,
|
|
52
|
+
): Record<string, string> {
|
|
53
|
+
const serviceKey = config.cloud?.serviceKey?.trim();
|
|
54
|
+
const apiKey =
|
|
55
|
+
normalizeCloudApiKey(apiKeyOverride) ?? resolveCloudApiKey(config);
|
|
56
|
+
|
|
57
|
+
const headers: Record<string, string> = {
|
|
58
|
+
"Content-Type": "application/json",
|
|
59
|
+
Accept: "application/json",
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
if (serviceKey) {
|
|
63
|
+
headers["X-Service-Key"] = serviceKey;
|
|
64
|
+
}
|
|
65
|
+
if (apiKey) {
|
|
66
|
+
headers.Authorization = `Bearer ${apiKey}`;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return headers;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function readBody(req: http.IncomingMessage): Promise<string | undefined> {
|
|
73
|
+
return new Promise<string | undefined>((resolve, reject) => {
|
|
74
|
+
const chunks: Buffer[] = [];
|
|
75
|
+
let size = 0;
|
|
76
|
+
req.on("data", (chunk: Buffer) => {
|
|
77
|
+
size += chunk.length;
|
|
78
|
+
if (size > MAX_BODY_BYTES) {
|
|
79
|
+
reject(new Error("Request body too large"));
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
chunks.push(chunk);
|
|
83
|
+
});
|
|
84
|
+
req.on("end", () =>
|
|
85
|
+
resolve(
|
|
86
|
+
chunks.length > 0 ? Buffer.concat(chunks).toString("utf-8") : undefined,
|
|
87
|
+
),
|
|
88
|
+
);
|
|
89
|
+
req.on("error", reject);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async function fetchUpstream(
|
|
94
|
+
url: string,
|
|
95
|
+
method: string,
|
|
96
|
+
headers: Record<string, string>,
|
|
97
|
+
body: string | undefined,
|
|
98
|
+
): Promise<Response> {
|
|
99
|
+
const res = await fetch(url, {
|
|
100
|
+
method,
|
|
101
|
+
headers,
|
|
102
|
+
body,
|
|
103
|
+
redirect: "manual",
|
|
104
|
+
signal: AbortSignal.timeout(PROXY_TIMEOUT_MS),
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
if (res.status >= 300 && res.status < 400) {
|
|
108
|
+
throw Object.assign(new Error("redirect"), { code: "REDIRECT" });
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return res;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function summarizeUpstreamBody(bodyText: string): string {
|
|
115
|
+
const trimmed = bodyText.trim();
|
|
116
|
+
if (!trimmed) return "";
|
|
117
|
+
return trimmed.length > 300 ? `${trimmed.slice(0, 297)}...` : trimmed;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function isResourceCompatPath(pathname: string): boolean {
|
|
121
|
+
return pathname.split("/").filter(Boolean).length >= 5;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function sendUpstreamNotFound(
|
|
125
|
+
res: http.ServerResponse,
|
|
126
|
+
pathname: string,
|
|
127
|
+
upstreamBody?: unknown,
|
|
128
|
+
): void {
|
|
129
|
+
if (isResourceCompatPath(pathname)) {
|
|
130
|
+
sendJson(
|
|
131
|
+
res,
|
|
132
|
+
upstreamBody ?? {
|
|
133
|
+
success: false,
|
|
134
|
+
error: "Eliza Cloud returned 404 for this API route.",
|
|
135
|
+
code: "CLOUD_ROUTE_NOT_FOUND",
|
|
136
|
+
},
|
|
137
|
+
404,
|
|
138
|
+
);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
sendJson(
|
|
143
|
+
res,
|
|
144
|
+
{
|
|
145
|
+
success: false,
|
|
146
|
+
error: "This Cloud feature is not available yet.",
|
|
147
|
+
code: "CLOUD_NOT_READY",
|
|
148
|
+
},
|
|
149
|
+
404,
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
async function parseUpstreamJsonResponse(
|
|
154
|
+
upstreamRes: Response,
|
|
155
|
+
method: string,
|
|
156
|
+
): Promise<
|
|
157
|
+
| { kind: "head" }
|
|
158
|
+
| { kind: "empty" }
|
|
159
|
+
| { kind: "json"; body: unknown }
|
|
160
|
+
| { kind: "invalid-json"; bodyText: string }
|
|
161
|
+
| { kind: "non-json"; bodyText: string }
|
|
162
|
+
> {
|
|
163
|
+
if (method === "HEAD") {
|
|
164
|
+
return { kind: "head" };
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const bodyText = await upstreamRes.text();
|
|
168
|
+
if (bodyText.trim().length === 0) {
|
|
169
|
+
return { kind: "empty" };
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const contentType = upstreamRes.headers.get("content-type");
|
|
173
|
+
const expectsJson = JSON_CONTENT_TYPE_RE.test(contentType ?? "");
|
|
174
|
+
|
|
175
|
+
if (!expectsJson && !/^\s*[[{]/.test(bodyText)) {
|
|
176
|
+
return { kind: "non-json", bodyText };
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
try {
|
|
180
|
+
return { kind: "json", body: JSON.parse(bodyText) };
|
|
181
|
+
} catch {
|
|
182
|
+
return expectsJson
|
|
183
|
+
? { kind: "invalid-json", bodyText }
|
|
184
|
+
: { kind: "non-json", bodyText };
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function handleUpstreamError(error: unknown, res: http.ServerResponse): void {
|
|
189
|
+
if (error instanceof Error) {
|
|
190
|
+
const errorCode = (error as { code?: string }).code;
|
|
191
|
+
if (errorCode === "REDIRECT") {
|
|
192
|
+
sendJsonError(res, "Eliza Cloud returned an unexpected redirect.", 502);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
if (error.name === "TimeoutError" || error.name === "AbortError") {
|
|
196
|
+
sendJsonError(res, "Eliza Cloud request timed out.", 504);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
if (error.message === "Request body too large") {
|
|
200
|
+
sendJsonError(res, error.message, 413);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
sendJsonError(
|
|
204
|
+
res,
|
|
205
|
+
`Failed to reach Eliza Cloud: ${error.message || "Unknown error"}`,
|
|
206
|
+
502,
|
|
207
|
+
);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
sendJsonError(res, "Failed to reach Eliza Cloud.", 502);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/** Paths under /api/cloud/v1/ are forwarded directly as /api/v1/ on the cloud backend. */
|
|
215
|
+
const CLOUD_V1_PREFIX = "/api/cloud/v1/";
|
|
216
|
+
|
|
217
|
+
export async function handleCloudCompatRoute(
|
|
218
|
+
req: http.IncomingMessage,
|
|
219
|
+
res: http.ServerResponse,
|
|
220
|
+
pathname: string,
|
|
221
|
+
method: string,
|
|
222
|
+
state: CloudCompatRouteState,
|
|
223
|
+
): Promise<boolean> {
|
|
224
|
+
const isCompatRoute = pathname.startsWith("/api/cloud/compat/");
|
|
225
|
+
const isV1Route = pathname.startsWith(CLOUD_V1_PREFIX);
|
|
226
|
+
if (!isCompatRoute && !isV1Route) return false;
|
|
227
|
+
|
|
228
|
+
const apiKey = resolveProxyApiKey(state);
|
|
229
|
+
if (!apiKey) {
|
|
230
|
+
sendJsonError(
|
|
231
|
+
res,
|
|
232
|
+
"Not connected to Eliza Cloud. Please log in first.",
|
|
233
|
+
401,
|
|
234
|
+
);
|
|
235
|
+
return true;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const baseUrl = resolveCloudBaseUrl(state.config);
|
|
239
|
+
const urlError = await validateCloudBaseUrl(baseUrl);
|
|
240
|
+
if (urlError) {
|
|
241
|
+
sendJsonError(res, urlError, 502);
|
|
242
|
+
return true;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// /api/cloud/compat/* → /api/compat/* (existing mapping)
|
|
246
|
+
// /api/cloud/v1/* → /api/v1/* (eliza v1 endpoints, e.g. pairing-token)
|
|
247
|
+
// Both branches strip the leading `/api/cloud` and re-prefix `/api`. The
|
|
248
|
+
// earlier v1 branch used `.slice("/api/cloud".length)` which left
|
|
249
|
+
// `/v1/...` (no `/api/` prefix), causing upstream to return 405 for
|
|
250
|
+
// valid POSTs to e.g. /api/v1/app/agents/{id}/provision.
|
|
251
|
+
const compatPath = pathname.replace("/api/cloud", "/api");
|
|
252
|
+
const fullUrl = req.url ?? pathname;
|
|
253
|
+
const qsIndex = fullUrl.indexOf("?");
|
|
254
|
+
const queryString = qsIndex >= 0 ? fullUrl.slice(qsIndex) : "";
|
|
255
|
+
const upstreamUrl = `${baseUrl}${compatPath}${queryString}`;
|
|
256
|
+
const headers = buildAuthHeaders(state.config, apiKey);
|
|
257
|
+
|
|
258
|
+
try {
|
|
259
|
+
let body: string | undefined;
|
|
260
|
+
if (method !== "GET" && method !== "HEAD") {
|
|
261
|
+
body = await readBody(req);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
const upstreamRes = await fetchUpstream(upstreamUrl, method, headers, body);
|
|
265
|
+
const parsed = await parseUpstreamJsonResponse(upstreamRes, method);
|
|
266
|
+
|
|
267
|
+
if (parsed.kind === "head") {
|
|
268
|
+
res.statusCode = upstreamRes.status;
|
|
269
|
+
res.end();
|
|
270
|
+
return true;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
if (parsed.kind === "json") {
|
|
274
|
+
if (upstreamRes.status === 404) {
|
|
275
|
+
sendUpstreamNotFound(res, pathname, parsed.body);
|
|
276
|
+
return true;
|
|
277
|
+
}
|
|
278
|
+
sendJson(res, parsed.body, upstreamRes.status);
|
|
279
|
+
return true;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
if (upstreamRes.status === 404) {
|
|
283
|
+
sendUpstreamNotFound(res, pathname);
|
|
284
|
+
return true;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
const upstreamStatus = upstreamRes.ok ? 502 : upstreamRes.status;
|
|
288
|
+
if (parsed.kind === "empty") {
|
|
289
|
+
const message = upstreamRes.ok
|
|
290
|
+
? "Eliza Cloud returned an empty response."
|
|
291
|
+
: `Eliza Cloud returned HTTP ${upstreamRes.status} with an empty response body.`;
|
|
292
|
+
sendJsonError(res, message, upstreamStatus);
|
|
293
|
+
return true;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
const message =
|
|
297
|
+
parsed.kind === "invalid-json"
|
|
298
|
+
? "Eliza Cloud returned malformed JSON."
|
|
299
|
+
: "Eliza Cloud returned a non-JSON response.";
|
|
300
|
+
const detail = summarizeUpstreamBody(parsed.bodyText);
|
|
301
|
+
logger.warn(
|
|
302
|
+
`[cloud-compat] ${message} ${method} ${compatPath} (${upstreamRes.status})${detail ? `: ${detail}` : ""}`,
|
|
303
|
+
);
|
|
304
|
+
sendJsonError(
|
|
305
|
+
res,
|
|
306
|
+
detail ? `${message} ${detail}` : message,
|
|
307
|
+
upstreamStatus,
|
|
308
|
+
);
|
|
309
|
+
return true;
|
|
310
|
+
} catch (error) {
|
|
311
|
+
handleUpstreamError(error, res);
|
|
312
|
+
return true;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type http from "node:http";
|
|
2
|
+
import type { AgentRuntime } from "@elizaos/core";
|
|
3
|
+
import type { CloudProxyConfigLike } from "../lib/config-like";
|
|
4
|
+
import { sendJsonError } from "../lib/http";
|
|
5
|
+
|
|
6
|
+
const LIFEOPS_CLOUD_FEATURES_MODULE: string =
|
|
7
|
+
"@elizaos/app-lifeops";
|
|
8
|
+
|
|
9
|
+
export interface CloudFeaturesRouteState {
|
|
10
|
+
config: CloudProxyConfigLike;
|
|
11
|
+
runtime?: AgentRuntime | null;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
type CloudFeaturesRoutesModule = {
|
|
15
|
+
handleCloudFeaturesRoute?: (
|
|
16
|
+
req: http.IncomingMessage,
|
|
17
|
+
res: http.ServerResponse,
|
|
18
|
+
pathname: string,
|
|
19
|
+
method: string,
|
|
20
|
+
state: CloudFeaturesRouteState,
|
|
21
|
+
) => Promise<boolean> | boolean;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export async function handleCloudFeaturesRoute(
|
|
25
|
+
req: http.IncomingMessage,
|
|
26
|
+
res: http.ServerResponse,
|
|
27
|
+
pathname: string,
|
|
28
|
+
method: string,
|
|
29
|
+
state: CloudFeaturesRouteState,
|
|
30
|
+
): Promise<boolean> {
|
|
31
|
+
if (
|
|
32
|
+
pathname !== "/api/cloud/features" &&
|
|
33
|
+
pathname !== "/api/cloud/features/sync"
|
|
34
|
+
) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
const loaded = (await import(
|
|
40
|
+
/* @vite-ignore */ LIFEOPS_CLOUD_FEATURES_MODULE
|
|
41
|
+
)) as CloudFeaturesRoutesModule;
|
|
42
|
+
if (typeof loaded.handleCloudFeaturesRoute !== "function") {
|
|
43
|
+
sendJsonError(res, "LifeOps cloud feature routes are not available", 503);
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
return await loaded.handleCloudFeaturesRoute(
|
|
47
|
+
req,
|
|
48
|
+
res,
|
|
49
|
+
pathname,
|
|
50
|
+
method,
|
|
51
|
+
state,
|
|
52
|
+
);
|
|
53
|
+
} catch {
|
|
54
|
+
sendJsonError(res, "LifeOps cloud feature routes are not available", 503);
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
function hasValue(value: string | undefined): boolean {
|
|
2
|
+
return Boolean(value?.trim());
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
function hasCompatApiToken(): boolean {
|
|
6
|
+
return hasValue(process.env.ELIZA_API_TOKEN);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function hasCloudApiKeyProvisioning(): boolean {
|
|
10
|
+
return (
|
|
11
|
+
process.env.ELIZAOS_CLOUD_ENABLED === "true" &&
|
|
12
|
+
hasValue(process.env.ELIZAOS_CLOUD_API_KEY)
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Platform-managed cloud containers should skip local pairing and onboarding UI.
|
|
18
|
+
*
|
|
19
|
+
* In production we may have either:
|
|
20
|
+
* - a Steward sidecar token (older / sidecar-managed path),
|
|
21
|
+
* - an inbound API token injected directly into the container, or
|
|
22
|
+
* - cloud-managed API-key access injected into the runtime environment.
|
|
23
|
+
*
|
|
24
|
+
* Requiring the cloud flag plus one of those credentials keeps accidental local
|
|
25
|
+
* env leakage from triggering cloud behavior, while still matching real deployed
|
|
26
|
+
* cloud containers.
|
|
27
|
+
*/
|
|
28
|
+
export function isCloudProvisionedContainer(): boolean {
|
|
29
|
+
const hasCloudFlag = process.env.ELIZA_CLOUD_PROVISIONED === "1";
|
|
30
|
+
|
|
31
|
+
return (
|
|
32
|
+
hasCloudFlag &&
|
|
33
|
+
(hasValue(process.env.STEWARD_AGENT_TOKEN) ||
|
|
34
|
+
hasCompatApiToken() ||
|
|
35
|
+
hasCloudApiKeyProvisioning())
|
|
36
|
+
);
|
|
37
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloud gateway relay status route.
|
|
3
|
+
*
|
|
4
|
+
* Exposes the current state of the CloudManagedGatewayRelayService
|
|
5
|
+
* so the UI can show whether this local instance is registered with
|
|
6
|
+
* Eliza Cloud and actively receiving routed messages.
|
|
7
|
+
*
|
|
8
|
+
* GET /api/cloud/relay-status
|
|
9
|
+
*
|
|
10
|
+
* The relay service lives in plugin-elizacloud and registers itself
|
|
11
|
+
* as a runtime service named "cloud-managed-gateway-relay". We query
|
|
12
|
+
* it via the runtime.getService interface to avoid a build-time dep.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import type http from "node:http";
|
|
16
|
+
import type { RouteHelpers } from "../lib/http";
|
|
17
|
+
|
|
18
|
+
interface RelayServiceLike {
|
|
19
|
+
getSessionInfo(): {
|
|
20
|
+
sessionId: string | null;
|
|
21
|
+
organizationId: string | null;
|
|
22
|
+
userId: string | null;
|
|
23
|
+
agentName: string | null;
|
|
24
|
+
platform: string | null;
|
|
25
|
+
lastSeenAt: string | null;
|
|
26
|
+
status: "idle" | "registered" | "polling" | "error" | "stopped";
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface CloudRelayRouteState {
|
|
31
|
+
runtime?: {
|
|
32
|
+
getService(type: string): unknown;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export async function handleCloudRelayRoute(
|
|
37
|
+
_req: http.IncomingMessage,
|
|
38
|
+
res: http.ServerResponse,
|
|
39
|
+
pathname: string,
|
|
40
|
+
method: string,
|
|
41
|
+
state: CloudRelayRouteState,
|
|
42
|
+
helpers: RouteHelpers,
|
|
43
|
+
): Promise<boolean> {
|
|
44
|
+
if (method !== "GET" || pathname !== "/api/cloud/relay-status") {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (!state.runtime) {
|
|
49
|
+
helpers.json(res, {
|
|
50
|
+
available: false,
|
|
51
|
+
status: "no_runtime",
|
|
52
|
+
reason: "Runtime not initialized",
|
|
53
|
+
});
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Try known service names used across package boundaries.
|
|
58
|
+
const service = (state.runtime.getService("CLOUD_MANAGED_GATEWAY_RELAY") ??
|
|
59
|
+
state.runtime.getService("cloud-managed-gateway-relay") ??
|
|
60
|
+
state.runtime.getService(
|
|
61
|
+
"cloudManagedGatewayRelay",
|
|
62
|
+
)) as RelayServiceLike | null;
|
|
63
|
+
|
|
64
|
+
if (!service || typeof service.getSessionInfo !== "function") {
|
|
65
|
+
helpers.json(res, {
|
|
66
|
+
available: false,
|
|
67
|
+
status: "not_registered",
|
|
68
|
+
reason:
|
|
69
|
+
"Gateway relay service not active. Connect to Eliza Cloud in Settings to enable instance routing.",
|
|
70
|
+
});
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
try {
|
|
75
|
+
const info = service.getSessionInfo();
|
|
76
|
+
helpers.json(res, {
|
|
77
|
+
available: true,
|
|
78
|
+
...info,
|
|
79
|
+
});
|
|
80
|
+
} catch (err) {
|
|
81
|
+
helpers.json(res, {
|
|
82
|
+
available: false,
|
|
83
|
+
status: "error",
|
|
84
|
+
reason: err instanceof Error ? err.message : String(err),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return true;
|
|
89
|
+
}
|