@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,663 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isCloudInferenceSelectedInConfig,
|
|
3
|
+
isElizaSettingsDebugEnabled,
|
|
4
|
+
migrateLegacyRuntimeConfig,
|
|
5
|
+
settingsDebugCloudSummary,
|
|
6
|
+
} from "@elizaos/core";
|
|
7
|
+
import { resolveCloudApiBaseUrl as resolveCanonicalCloudApiBaseUrl } from "../cloud/base-url.js";
|
|
8
|
+
import { validateCloudBaseUrl } from "../cloud/validate-url.js";
|
|
9
|
+
import type { AgentRuntime } from "@elizaos/core";
|
|
10
|
+
import { logger } from "@elizaos/core";
|
|
11
|
+
import {
|
|
12
|
+
applyCanonicalOnboardingConfig,
|
|
13
|
+
type ElizaConfig,
|
|
14
|
+
normalizeEnvValue,
|
|
15
|
+
} from "./config-like";
|
|
16
|
+
import {
|
|
17
|
+
clearCloudSecrets,
|
|
18
|
+
getCloudSecret,
|
|
19
|
+
scrubCloudSecretsFromEnv,
|
|
20
|
+
} from "./cloud-secrets";
|
|
21
|
+
|
|
22
|
+
const DEFAULT_CLOUD_API_BASE_URL = "https://www.elizacloud.ai/api/v1";
|
|
23
|
+
export const CLOUD_BILLING_URL =
|
|
24
|
+
"https://www.elizacloud.ai/dashboard/settings?tab=billing";
|
|
25
|
+
|
|
26
|
+
const CLOUD_ENV_KEYS = [
|
|
27
|
+
"ELIZAOS_CLOUD_API_KEY",
|
|
28
|
+
"ELIZAOS_CLOUD_ENABLED",
|
|
29
|
+
"ELIZAOS_CLOUD_BASE_URL",
|
|
30
|
+
"ELIZAOS_CLOUD_NANO_MODEL",
|
|
31
|
+
"ELIZAOS_CLOUD_MEDIUM_MODEL",
|
|
32
|
+
"ELIZAOS_CLOUD_SMALL_MODEL",
|
|
33
|
+
"ELIZAOS_CLOUD_LARGE_MODEL",
|
|
34
|
+
"ELIZAOS_CLOUD_MEGA_MODEL",
|
|
35
|
+
"ELIZAOS_CLOUD_RESPONSE_HANDLER_MODEL",
|
|
36
|
+
"ELIZAOS_CLOUD_SHOULD_RESPOND_MODEL",
|
|
37
|
+
"ELIZAOS_CLOUD_ACTION_PLANNER_MODEL",
|
|
38
|
+
"ELIZAOS_CLOUD_PLANNER_MODEL",
|
|
39
|
+
"ELIZAOS_CLOUD_USE_INFERENCE",
|
|
40
|
+
"ELIZAOS_CLOUD_USE_TTS",
|
|
41
|
+
"ELIZAOS_CLOUD_USE_MEDIA",
|
|
42
|
+
"ELIZAOS_CLOUD_USE_EMBEDDINGS",
|
|
43
|
+
"ELIZAOS_CLOUD_USE_RPC",
|
|
44
|
+
] as const;
|
|
45
|
+
|
|
46
|
+
const CLOUD_RUNTIME_SECRET_KEYS = [
|
|
47
|
+
"ELIZAOS_CLOUD_API_KEY",
|
|
48
|
+
"ELIZAOS_CLOUD_ENABLED",
|
|
49
|
+
"ELIZAOS_CLOUD_BASE_URL",
|
|
50
|
+
"ELIZAOS_CLOUD_NANO_MODEL",
|
|
51
|
+
"ELIZAOS_CLOUD_MEDIUM_MODEL",
|
|
52
|
+
"ELIZAOS_CLOUD_SMALL_MODEL",
|
|
53
|
+
"ELIZAOS_CLOUD_LARGE_MODEL",
|
|
54
|
+
"ELIZAOS_CLOUD_MEGA_MODEL",
|
|
55
|
+
"ELIZAOS_CLOUD_RESPONSE_HANDLER_MODEL",
|
|
56
|
+
"ELIZAOS_CLOUD_SHOULD_RESPOND_MODEL",
|
|
57
|
+
"ELIZAOS_CLOUD_ACTION_PLANNER_MODEL",
|
|
58
|
+
"ELIZAOS_CLOUD_PLANNER_MODEL",
|
|
59
|
+
"ELIZA_CLOUD_AUTH_TOKEN",
|
|
60
|
+
"ELIZA_CLOUD_USER_ID",
|
|
61
|
+
"ELIZA_CLOUD_ORGANIZATION_ID",
|
|
62
|
+
] as const;
|
|
63
|
+
|
|
64
|
+
const CLOUD_RUNTIME_SETTING_KEYS = [
|
|
65
|
+
"ELIZA_CLOUD_AUTH_TOKEN",
|
|
66
|
+
"ELIZA_CLOUD_USER_ID",
|
|
67
|
+
"ELIZA_CLOUD_ORGANIZATION_ID",
|
|
68
|
+
] as const;
|
|
69
|
+
|
|
70
|
+
const CLOUD_AUTH_CLEAR_METHODS = [
|
|
71
|
+
"disconnect",
|
|
72
|
+
"logout",
|
|
73
|
+
"signOut",
|
|
74
|
+
"signout",
|
|
75
|
+
"clearSession",
|
|
76
|
+
"clearAuth",
|
|
77
|
+
"resetAuth",
|
|
78
|
+
"reset",
|
|
79
|
+
] as const;
|
|
80
|
+
|
|
81
|
+
type CloudClientLike = {
|
|
82
|
+
get?: (path: string) => Promise<unknown>;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export type CloudAuthLike = {
|
|
86
|
+
authenticateWithApiKey?: (input: {
|
|
87
|
+
apiKey: string;
|
|
88
|
+
organizationId?: string;
|
|
89
|
+
userId?: string;
|
|
90
|
+
}) => unknown;
|
|
91
|
+
isAuthenticated?: () => boolean;
|
|
92
|
+
getUserId?: () => string | undefined;
|
|
93
|
+
getOrganizationId?: () => string | undefined;
|
|
94
|
+
getClient?: () => CloudClientLike | null;
|
|
95
|
+
} & Partial<
|
|
96
|
+
Record<
|
|
97
|
+
(typeof CLOUD_AUTH_CLEAR_METHODS)[number],
|
|
98
|
+
(() => Promise<unknown>) | (() => unknown)
|
|
99
|
+
>
|
|
100
|
+
>;
|
|
101
|
+
|
|
102
|
+
export type RuntimeCloudLike = AgentRuntime & {
|
|
103
|
+
agentId: string;
|
|
104
|
+
character: {
|
|
105
|
+
secrets?: Record<string, string | number | boolean>;
|
|
106
|
+
settings?: Record<string, unknown>;
|
|
107
|
+
};
|
|
108
|
+
updateAgent?: (
|
|
109
|
+
agentId: string,
|
|
110
|
+
update: { secrets: Record<string, string | number | boolean> },
|
|
111
|
+
) => Promise<unknown>;
|
|
112
|
+
setSetting?: (key: string, value: string | null) => unknown;
|
|
113
|
+
getService?: (name: string) => unknown;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
type CloudManagerLike = {
|
|
117
|
+
disconnect?: () => Promise<void>;
|
|
118
|
+
} | null;
|
|
119
|
+
|
|
120
|
+
export type CloudConnectionSnapshot = {
|
|
121
|
+
apiKey: string | undefined;
|
|
122
|
+
authConnected: boolean;
|
|
123
|
+
cloudAuth: CloudAuthLike | null;
|
|
124
|
+
connected: boolean;
|
|
125
|
+
enabled: boolean;
|
|
126
|
+
hasApiKey: boolean;
|
|
127
|
+
organizationId: string | undefined;
|
|
128
|
+
userId: string | undefined;
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
type CloudCreditsResponse = {
|
|
132
|
+
balance: number | null;
|
|
133
|
+
connected: boolean;
|
|
134
|
+
authRejected?: boolean;
|
|
135
|
+
critical?: boolean;
|
|
136
|
+
error?: string;
|
|
137
|
+
low?: boolean;
|
|
138
|
+
topUpUrl?: string;
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
/** Thrown when the credits endpoint returns 401 — same credential path as chat completions. */
|
|
142
|
+
export class CloudCreditsAuthRejectedError extends Error {
|
|
143
|
+
override readonly name = "CloudCreditsAuthRejectedError";
|
|
144
|
+
constructor(message = "Eliza Cloud API key was rejected") {
|
|
145
|
+
super(message);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function cloudCreditsHttpErrorMessage(
|
|
150
|
+
status: number,
|
|
151
|
+
creditResponse: { error?: unknown },
|
|
152
|
+
): string {
|
|
153
|
+
const err = creditResponse.error;
|
|
154
|
+
if (typeof err === "string" && err.trim()) {
|
|
155
|
+
return err.trim();
|
|
156
|
+
}
|
|
157
|
+
if (err && typeof err === "object" && "message" in err) {
|
|
158
|
+
const msg = (err as { message?: unknown }).message;
|
|
159
|
+
if (typeof msg === "string" && msg.trim()) {
|
|
160
|
+
return msg.trim();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return `HTTP ${status}`;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function asRuntimeCloud(runtime: AgentRuntime | null): RuntimeCloudLike | null {
|
|
167
|
+
return runtime as RuntimeCloudLike | null;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export function getCloudAuth(
|
|
171
|
+
runtime: AgentRuntime | null,
|
|
172
|
+
): CloudAuthLike | null {
|
|
173
|
+
const runtimeWithServices = asRuntimeCloud(runtime);
|
|
174
|
+
if (typeof runtimeWithServices?.getService !== "function") {
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const service = runtimeWithServices.getService("CLOUD_AUTH");
|
|
179
|
+
return service && typeof service === "object"
|
|
180
|
+
? (service as CloudAuthLike)
|
|
181
|
+
: null;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function resolvePersistedCloudIdentity(runtime: AgentRuntime | null): {
|
|
185
|
+
organizationId: string | undefined;
|
|
186
|
+
userId: string | undefined;
|
|
187
|
+
} {
|
|
188
|
+
const runtimeWithCloud = asRuntimeCloud(runtime);
|
|
189
|
+
return {
|
|
190
|
+
organizationId:
|
|
191
|
+
normalizeEnvValue(
|
|
192
|
+
runtimeWithCloud?.getSetting?.("ELIZA_CLOUD_ORGANIZATION_ID") as
|
|
193
|
+
| string
|
|
194
|
+
| undefined,
|
|
195
|
+
) ??
|
|
196
|
+
normalizeEnvValue(
|
|
197
|
+
runtimeWithCloud?.character?.secrets?.ELIZA_CLOUD_ORGANIZATION_ID as
|
|
198
|
+
| string
|
|
199
|
+
| undefined,
|
|
200
|
+
),
|
|
201
|
+
userId:
|
|
202
|
+
normalizeEnvValue(
|
|
203
|
+
runtimeWithCloud?.getSetting?.("ELIZA_CLOUD_USER_ID") as
|
|
204
|
+
| string
|
|
205
|
+
| undefined,
|
|
206
|
+
) ??
|
|
207
|
+
normalizeEnvValue(
|
|
208
|
+
runtimeWithCloud?.character?.secrets?.ELIZA_CLOUD_USER_ID as
|
|
209
|
+
| string
|
|
210
|
+
| undefined,
|
|
211
|
+
),
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
export function resolveCloudApiBaseUrl(rawBaseUrl?: string): string {
|
|
216
|
+
return (
|
|
217
|
+
resolveCanonicalCloudApiBaseUrl(rawBaseUrl ?? DEFAULT_CLOUD_API_BASE_URL) ??
|
|
218
|
+
DEFAULT_CLOUD_API_BASE_URL
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export function resolveCloudApiKey(
|
|
223
|
+
config: Pick<ElizaConfig, "cloud"> | Record<string, unknown>,
|
|
224
|
+
runtime?: {
|
|
225
|
+
character?: { secrets?: Record<string, unknown> };
|
|
226
|
+
getSetting?: (key: string) => unknown;
|
|
227
|
+
} | null,
|
|
228
|
+
): string | undefined {
|
|
229
|
+
migrateLegacyRuntimeConfig(config as Record<string, unknown>);
|
|
230
|
+
// 1. Config file (disk)
|
|
231
|
+
const configApiKey = normalizeEnvValue(
|
|
232
|
+
(config as { cloud?: { apiKey?: string } }).cloud?.apiKey,
|
|
233
|
+
);
|
|
234
|
+
if (configApiKey) return configApiKey;
|
|
235
|
+
|
|
236
|
+
if (!isCloudInferenceSelectedInConfig(config as Record<string, unknown>)) {
|
|
237
|
+
// A linked cloud account is represented by the persisted disk key above.
|
|
238
|
+
// Do not resurrect cloud from sealed/env/runtime fallbacks when the
|
|
239
|
+
// canonical connection is local, remote, or unset.
|
|
240
|
+
return undefined;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// 2. Sealed in-process secret store
|
|
244
|
+
const sealedKey = normalizeEnvValue(getCloudSecret("ELIZAOS_CLOUD_API_KEY"));
|
|
245
|
+
if (sealedKey) return sealedKey;
|
|
246
|
+
|
|
247
|
+
// 3. Process environment (may not be scrubbed yet)
|
|
248
|
+
const envKey = normalizeEnvValue(process.env.ELIZAOS_CLOUD_API_KEY);
|
|
249
|
+
if (envKey) return envKey;
|
|
250
|
+
|
|
251
|
+
// 4. Runtime settings (persisted in database, survives restarts)
|
|
252
|
+
const runtimeSettingKey = normalizeEnvValue(
|
|
253
|
+
runtime?.getSetting?.("ELIZAOS_CLOUD_API_KEY") as string | undefined,
|
|
254
|
+
);
|
|
255
|
+
if (runtimeSettingKey) return runtimeSettingKey;
|
|
256
|
+
|
|
257
|
+
// 5. Runtime character secrets (persisted in database, survives restarts)
|
|
258
|
+
const runtimeKey = normalizeEnvValue(
|
|
259
|
+
runtime?.character?.secrets?.ELIZAOS_CLOUD_API_KEY as string | undefined,
|
|
260
|
+
);
|
|
261
|
+
if (runtimeKey) return runtimeKey;
|
|
262
|
+
|
|
263
|
+
return undefined;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
export function resolveCloudConnectionSnapshot(
|
|
267
|
+
config: Partial<ElizaConfig>,
|
|
268
|
+
runtime: AgentRuntime | null,
|
|
269
|
+
): CloudConnectionSnapshot {
|
|
270
|
+
migrateLegacyRuntimeConfig(config as Record<string, unknown>);
|
|
271
|
+
const _cloudRecord =
|
|
272
|
+
config.cloud && typeof config.cloud === "object"
|
|
273
|
+
? (config.cloud as Record<string, unknown>)
|
|
274
|
+
: undefined;
|
|
275
|
+
const enabled = isCloudInferenceSelectedInConfig(
|
|
276
|
+
config as Record<string, unknown>,
|
|
277
|
+
);
|
|
278
|
+
const apiKey = resolveCloudApiKey(config, runtime);
|
|
279
|
+
const cloudAuth = getCloudAuth(runtime);
|
|
280
|
+
const authConnected = Boolean(cloudAuth?.isAuthenticated?.());
|
|
281
|
+
const hasApiKey = Boolean(apiKey);
|
|
282
|
+
const persistedIdentity = resolvePersistedCloudIdentity(runtime);
|
|
283
|
+
const shouldExposeIdentity = authConnected || hasApiKey;
|
|
284
|
+
|
|
285
|
+
return {
|
|
286
|
+
apiKey,
|
|
287
|
+
authConnected,
|
|
288
|
+
cloudAuth,
|
|
289
|
+
connected: authConnected || hasApiKey,
|
|
290
|
+
enabled,
|
|
291
|
+
hasApiKey,
|
|
292
|
+
organizationId: shouldExposeIdentity
|
|
293
|
+
? (normalizeEnvValue(cloudAuth?.getOrganizationId?.()) ??
|
|
294
|
+
persistedIdentity.organizationId)
|
|
295
|
+
: undefined,
|
|
296
|
+
userId: shouldExposeIdentity
|
|
297
|
+
? (normalizeEnvValue(cloudAuth?.getUserId?.()) ??
|
|
298
|
+
persistedIdentity.userId)
|
|
299
|
+
: undefined,
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Coerce an Eliza Cloud `balance` field into a number. The cloud API
|
|
305
|
+
* returns `balance` as `string | number` (per the Bridge client + config
|
|
306
|
+
* type definitions) — string when the upstream is using a fixed-precision
|
|
307
|
+
* decimal, number when it's been arithmetic'd. Treat both as the same
|
|
308
|
+
* dollar amount; reject anything else as an unexpected response.
|
|
309
|
+
*/
|
|
310
|
+
function coerceCloudBalance(value: unknown): number | null {
|
|
311
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
312
|
+
return value;
|
|
313
|
+
}
|
|
314
|
+
if (typeof value === "string") {
|
|
315
|
+
const trimmed = value.trim();
|
|
316
|
+
if (!trimmed) return null;
|
|
317
|
+
const parsed = Number.parseFloat(trimmed);
|
|
318
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
319
|
+
}
|
|
320
|
+
return null;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
async function fetchCloudCreditsByApiKey(
|
|
324
|
+
baseUrl: string,
|
|
325
|
+
apiKey: string,
|
|
326
|
+
): Promise<number | null> {
|
|
327
|
+
const response = await fetch(`${baseUrl}/credits/balance`, {
|
|
328
|
+
headers: {
|
|
329
|
+
Accept: "application/json",
|
|
330
|
+
Authorization: `Bearer ${apiKey}`,
|
|
331
|
+
},
|
|
332
|
+
redirect: "manual",
|
|
333
|
+
signal: AbortSignal.timeout(10_000),
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
if (response.status >= 300 && response.status < 400) {
|
|
337
|
+
throw new Error(
|
|
338
|
+
"Cloud credits request was redirected; redirects are not allowed",
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
const creditResponse = (await response.json().catch((err: unknown) => {
|
|
343
|
+
console.warn(
|
|
344
|
+
"[cloud-connection] Failed to parse credit balance response JSON:",
|
|
345
|
+
err,
|
|
346
|
+
);
|
|
347
|
+
return {};
|
|
348
|
+
})) as {
|
|
349
|
+
balance?: unknown;
|
|
350
|
+
data?: { balance?: unknown };
|
|
351
|
+
error?: unknown;
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
if (response.status === 401) {
|
|
355
|
+
throw new CloudCreditsAuthRejectedError(
|
|
356
|
+
cloudCreditsHttpErrorMessage(401, creditResponse),
|
|
357
|
+
);
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
if (!response.ok) {
|
|
361
|
+
throw new Error(
|
|
362
|
+
cloudCreditsHttpErrorMessage(response.status, creditResponse),
|
|
363
|
+
);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
const balance =
|
|
367
|
+
coerceCloudBalance(creditResponse.balance) ??
|
|
368
|
+
coerceCloudBalance(creditResponse.data?.balance);
|
|
369
|
+
|
|
370
|
+
return balance;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/** Configurable credit thresholds. Override via env vars if defaults don't fit. */
|
|
374
|
+
const CREDIT_LOW_THRESHOLD = Number(
|
|
375
|
+
process.env.ELIZA_CREDIT_LOW_THRESHOLD ?? "2.0",
|
|
376
|
+
);
|
|
377
|
+
const CREDIT_CRITICAL_THRESHOLD = Number(
|
|
378
|
+
process.env.ELIZA_CREDIT_CRITICAL_THRESHOLD ?? "0.5",
|
|
379
|
+
);
|
|
380
|
+
|
|
381
|
+
function withCreditFlags(balance: number): CloudCreditsResponse {
|
|
382
|
+
return {
|
|
383
|
+
connected: true,
|
|
384
|
+
balance,
|
|
385
|
+
low: balance < CREDIT_LOW_THRESHOLD,
|
|
386
|
+
critical: balance < CREDIT_CRITICAL_THRESHOLD,
|
|
387
|
+
topUpUrl: CLOUD_BILLING_URL,
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
export async function fetchCloudCredits(
|
|
392
|
+
config: Partial<ElizaConfig>,
|
|
393
|
+
runtime: AgentRuntime | null,
|
|
394
|
+
): Promise<CloudCreditsResponse> {
|
|
395
|
+
const snapshot = resolveCloudConnectionSnapshot(config, runtime);
|
|
396
|
+
let authenticatedFailure: string | null = null;
|
|
397
|
+
let authenticatedUnexpectedResponse = false;
|
|
398
|
+
|
|
399
|
+
if (!snapshot.connected) {
|
|
400
|
+
return { balance: null, connected: false };
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
const cloudClient = snapshot.cloudAuth?.getClient?.();
|
|
404
|
+
if (snapshot.authConnected && typeof cloudClient?.get === "function") {
|
|
405
|
+
try {
|
|
406
|
+
const creditResponse = (await cloudClient.get("/credits/balance")) as {
|
|
407
|
+
balance?: unknown;
|
|
408
|
+
data?: { balance?: unknown };
|
|
409
|
+
};
|
|
410
|
+
const rawBalance =
|
|
411
|
+
coerceCloudBalance(creditResponse?.balance) ??
|
|
412
|
+
coerceCloudBalance(creditResponse?.data?.balance);
|
|
413
|
+
|
|
414
|
+
if (typeof rawBalance === "number") {
|
|
415
|
+
return withCreditFlags(rawBalance);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
authenticatedUnexpectedResponse = true;
|
|
419
|
+
logger.debug(
|
|
420
|
+
`[cloud/credits] Unexpected authenticated response shape: ${JSON.stringify(creditResponse)}`,
|
|
421
|
+
);
|
|
422
|
+
} catch (err) {
|
|
423
|
+
const msg = err instanceof Error ? err.message : "cloud API unreachable";
|
|
424
|
+
authenticatedFailure = msg;
|
|
425
|
+
logger.debug(
|
|
426
|
+
`[cloud/credits] Authenticated balance fetch failed: ${msg}`,
|
|
427
|
+
);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
if (!snapshot.apiKey) {
|
|
432
|
+
return {
|
|
433
|
+
balance: null,
|
|
434
|
+
connected: snapshot.connected,
|
|
435
|
+
error:
|
|
436
|
+
authenticatedFailure ??
|
|
437
|
+
(authenticatedUnexpectedResponse
|
|
438
|
+
? "unexpected response"
|
|
439
|
+
: "missing cloud api key"),
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
const resolvedBaseUrl = resolveCloudApiBaseUrl(config.cloud?.baseUrl);
|
|
444
|
+
const baseUrlRejection = await validateCloudBaseUrl(resolvedBaseUrl);
|
|
445
|
+
if (baseUrlRejection) {
|
|
446
|
+
return {
|
|
447
|
+
balance: null,
|
|
448
|
+
connected: true,
|
|
449
|
+
error: baseUrlRejection,
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
try {
|
|
454
|
+
const balance = await fetchCloudCreditsByApiKey(
|
|
455
|
+
resolvedBaseUrl,
|
|
456
|
+
snapshot.apiKey,
|
|
457
|
+
);
|
|
458
|
+
|
|
459
|
+
if (typeof balance !== "number") {
|
|
460
|
+
return {
|
|
461
|
+
balance: null,
|
|
462
|
+
connected: true,
|
|
463
|
+
error: "unexpected response",
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
return withCreditFlags(balance);
|
|
468
|
+
} catch (err) {
|
|
469
|
+
if (err instanceof CloudCreditsAuthRejectedError) {
|
|
470
|
+
logger.debug(`[cloud/credits] API key rejected: ${err.message}`);
|
|
471
|
+
return {
|
|
472
|
+
balance: null,
|
|
473
|
+
connected: true,
|
|
474
|
+
authRejected: true,
|
|
475
|
+
error: err.message,
|
|
476
|
+
topUpUrl: CLOUD_BILLING_URL,
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
const msg = err instanceof Error ? err.message : "cloud API unreachable";
|
|
480
|
+
logger.debug(`[cloud/credits] Failed to fetch balance via API key: ${msg}`);
|
|
481
|
+
return {
|
|
482
|
+
balance: null,
|
|
483
|
+
connected: true,
|
|
484
|
+
error: msg,
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
export async function clearCloudAuthService(
|
|
490
|
+
cloudAuth: CloudAuthLike | null,
|
|
491
|
+
): Promise<void> {
|
|
492
|
+
if (!cloudAuth) {
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
const seen = new Set<(...args: never[]) => unknown>();
|
|
497
|
+
for (const methodName of CLOUD_AUTH_CLEAR_METHODS) {
|
|
498
|
+
const method = cloudAuth[methodName];
|
|
499
|
+
if (typeof method !== "function" || seen.has(method)) {
|
|
500
|
+
continue;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
seen.add(method);
|
|
504
|
+
try {
|
|
505
|
+
await method.call(cloudAuth);
|
|
506
|
+
// First successful clear method is sufficient — stop trying remaining ones.
|
|
507
|
+
break;
|
|
508
|
+
} catch (err) {
|
|
509
|
+
logger.warn(
|
|
510
|
+
`[cloud/disconnect] Failed to invoke CLOUD_AUTH.${methodName}: ${
|
|
511
|
+
err instanceof Error ? err.message : String(err)
|
|
512
|
+
}`,
|
|
513
|
+
);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
function clearCloudEnv(): void {
|
|
519
|
+
for (const key of CLOUD_ENV_KEYS) {
|
|
520
|
+
delete process.env[key];
|
|
521
|
+
}
|
|
522
|
+
clearCloudSecrets();
|
|
523
|
+
scrubCloudSecretsFromEnv();
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
async function clearRuntimeCloudState(
|
|
527
|
+
runtime: AgentRuntime | null,
|
|
528
|
+
): Promise<void> {
|
|
529
|
+
const runtimeWithCloud = asRuntimeCloud(runtime);
|
|
530
|
+
if (!runtimeWithCloud) {
|
|
531
|
+
return;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
const existingSecrets = runtimeWithCloud.character.secrets ?? {};
|
|
535
|
+
const nextSecrets = { ...existingSecrets };
|
|
536
|
+
for (const key of CLOUD_RUNTIME_SECRET_KEYS) {
|
|
537
|
+
delete nextSecrets[key];
|
|
538
|
+
}
|
|
539
|
+
runtimeWithCloud.character.secrets = nextSecrets;
|
|
540
|
+
|
|
541
|
+
if (
|
|
542
|
+
runtimeWithCloud.character.settings &&
|
|
543
|
+
typeof runtimeWithCloud.character.settings === "object"
|
|
544
|
+
) {
|
|
545
|
+
for (const key of CLOUD_RUNTIME_SETTING_KEYS) {
|
|
546
|
+
delete runtimeWithCloud.character.settings[key];
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
if (typeof runtimeWithCloud.setSetting === "function") {
|
|
551
|
+
for (const key of CLOUD_RUNTIME_SETTING_KEYS) {
|
|
552
|
+
try {
|
|
553
|
+
runtimeWithCloud.setSetting(key, null);
|
|
554
|
+
} catch (err) {
|
|
555
|
+
logger.warn(
|
|
556
|
+
`[cloud/disconnect] Failed to clear runtime setting ${key}: ${
|
|
557
|
+
err instanceof Error ? err.message : String(err)
|
|
558
|
+
}`,
|
|
559
|
+
);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
if (typeof runtimeWithCloud.updateAgent === "function") {
|
|
565
|
+
try {
|
|
566
|
+
await runtimeWithCloud.updateAgent(runtimeWithCloud.agentId, {
|
|
567
|
+
secrets: { ...nextSecrets },
|
|
568
|
+
});
|
|
569
|
+
} catch (err) {
|
|
570
|
+
logger.warn(
|
|
571
|
+
`[cloud/disconnect] Failed to clear cloud secrets from agent DB: ${
|
|
572
|
+
err instanceof Error ? err.message : String(err)
|
|
573
|
+
}`,
|
|
574
|
+
);
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
export async function disconnectCloudConnection(args: {
|
|
580
|
+
cloudManager?: CloudManagerLike;
|
|
581
|
+
config: Partial<ElizaConfig>;
|
|
582
|
+
runtime: AgentRuntime | null;
|
|
583
|
+
saveConfig?: (config: Partial<ElizaConfig>) => void;
|
|
584
|
+
}): Promise<void> {
|
|
585
|
+
const { cloudManager = null, config, runtime, saveConfig } = args;
|
|
586
|
+
|
|
587
|
+
if (isElizaSettingsDebugEnabled()) {
|
|
588
|
+
const c = config.cloud as Record<string, unknown> | undefined;
|
|
589
|
+
logger.debug(
|
|
590
|
+
`[eliza][settings][cloud] disconnectCloudConnection start cloud=${JSON.stringify(settingsDebugCloudSummary(c))}`,
|
|
591
|
+
);
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
if (typeof cloudManager?.disconnect === "function") {
|
|
595
|
+
try {
|
|
596
|
+
await cloudManager.disconnect();
|
|
597
|
+
} catch (err) {
|
|
598
|
+
logger.warn(
|
|
599
|
+
`[cloud/disconnect] Failed to disconnect cloud manager: ${
|
|
600
|
+
err instanceof Error ? err.message : String(err)
|
|
601
|
+
}`,
|
|
602
|
+
);
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
await clearCloudAuthService(getCloudAuth(runtime));
|
|
607
|
+
|
|
608
|
+
const nextCloud = { ...(config.cloud ?? {}) };
|
|
609
|
+
delete nextCloud.apiKey;
|
|
610
|
+
config.cloud = nextCloud;
|
|
611
|
+
applyCanonicalOnboardingConfig(config as ElizaConfig, {
|
|
612
|
+
deploymentTarget: { runtime: "local" },
|
|
613
|
+
linkedAccounts: {
|
|
614
|
+
elizacloud: {
|
|
615
|
+
status: "unlinked",
|
|
616
|
+
source: "api-key",
|
|
617
|
+
},
|
|
618
|
+
},
|
|
619
|
+
clearRoutes: ["llmText", "tts", "media", "embeddings", "rpc"],
|
|
620
|
+
});
|
|
621
|
+
migrateLegacyRuntimeConfig(config as Record<string, unknown>);
|
|
622
|
+
|
|
623
|
+
try {
|
|
624
|
+
saveConfig?.(config);
|
|
625
|
+
if (isElizaSettingsDebugEnabled()) {
|
|
626
|
+
const c = config.cloud as Record<string, unknown> | undefined;
|
|
627
|
+
logger.debug(
|
|
628
|
+
`[eliza][settings][cloud] disconnectCloudConnection saveConfig OK cloud=${JSON.stringify(settingsDebugCloudSummary(c))}`,
|
|
629
|
+
);
|
|
630
|
+
}
|
|
631
|
+
} catch (err) {
|
|
632
|
+
logger.warn(
|
|
633
|
+
`[cloud/disconnect] Failed to save cloud disconnect state: ${
|
|
634
|
+
err instanceof Error ? err.message : String(err)
|
|
635
|
+
}`,
|
|
636
|
+
);
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
clearCloudEnv();
|
|
640
|
+
await clearRuntimeCloudState(runtime);
|
|
641
|
+
|
|
642
|
+
if (isElizaSettingsDebugEnabled()) {
|
|
643
|
+
logger.debug(
|
|
644
|
+
"[eliza][settings][cloud] disconnectCloudConnection done (env cleared + runtime cloud state cleared)",
|
|
645
|
+
);
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
export const disconnectUnifiedCloudConnection = disconnectCloudConnection;
|
|
650
|
+
|
|
651
|
+
/** Matches `reason` from GET /api/cloud/status when connected via API key without CLOUD_AUTH. */
|
|
652
|
+
const CLOUD_STATUS_API_KEY_ONLY_REASONS: ReadonlySet<string> = new Set([
|
|
653
|
+
"api_key_present_not_authenticated",
|
|
654
|
+
"api_key_present_runtime_not_started",
|
|
655
|
+
]);
|
|
656
|
+
|
|
657
|
+
export function isCloudStatusReasonApiKeyOnly(
|
|
658
|
+
reason: string | null | undefined,
|
|
659
|
+
): boolean {
|
|
660
|
+
return (
|
|
661
|
+
typeof reason === "string" && CLOUD_STATUS_API_KEY_ONLY_REASONS.has(reason)
|
|
662
|
+
);
|
|
663
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sealed in-process secret store for cloud credentials.
|
|
3
|
+
*
|
|
4
|
+
* Cloud API keys are scrubbed from process.env after login and stored
|
|
5
|
+
* here so they are not visible in environment dumps, child processes,
|
|
6
|
+
* or /proc/self/environ.
|
|
7
|
+
*
|
|
8
|
+
* This module has NO external dependencies so it can be imported by
|
|
9
|
+
* any module without pulling in host-layer packages.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const _cloudSecrets: Record<string, string | undefined> = Object.create(null);
|
|
13
|
+
|
|
14
|
+
Object.defineProperty(_cloudSecrets, Symbol.toStringTag, {
|
|
15
|
+
value: "CloudSecrets",
|
|
16
|
+
enumerable: false,
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Read a cloud secret without exposing it in process.env.
|
|
21
|
+
* Falls back to process.env for backwards compatibility with code that
|
|
22
|
+
* sets the key before this module loads (e.g. docker entrypoints).
|
|
23
|
+
*/
|
|
24
|
+
export function getCloudSecret(
|
|
25
|
+
key: "ELIZAOS_CLOUD_API_KEY" | "ELIZAOS_CLOUD_ENABLED",
|
|
26
|
+
): string | undefined {
|
|
27
|
+
return _cloudSecrets[key] ?? process.env[key];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Scrub cloud secrets from process.env and capture into the sealed store. */
|
|
31
|
+
export function scrubCloudSecretsFromEnv(): void {
|
|
32
|
+
for (const key of [
|
|
33
|
+
"ELIZAOS_CLOUD_API_KEY",
|
|
34
|
+
"ELIZAOS_CLOUD_ENABLED",
|
|
35
|
+
] as const) {
|
|
36
|
+
if (process.env[key] !== undefined) {
|
|
37
|
+
_cloudSecrets[key] = process.env[key];
|
|
38
|
+
delete process.env[key];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Clear any sealed cloud secrets after an explicit disconnect. */
|
|
44
|
+
export function clearCloudSecrets(): void {
|
|
45
|
+
for (const key of [
|
|
46
|
+
"ELIZAOS_CLOUD_API_KEY",
|
|
47
|
+
"ELIZAOS_CLOUD_ENABLED",
|
|
48
|
+
] as const) {
|
|
49
|
+
delete _cloudSecrets[key];
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Reset the sealed secret store. Test-only. */
|
|
54
|
+
export function _resetCloudSecretsForTesting(): void {
|
|
55
|
+
for (const key of Object.keys(_cloudSecrets)) {
|
|
56
|
+
delete _cloudSecrets[key];
|
|
57
|
+
}
|
|
58
|
+
}
|