@elizaos/plugin-elizacloud 2.0.0-alpha.8 → 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/LICENSE +21 -0
- package/README.md +196 -0
- package/auto-enable.ts +22 -0
- package/dist/browser/index.browser.js +2 -21
- package/dist/browser/index.browser.js.map +5 -38
- package/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.node.cjs +9112 -2265
- package/dist/cjs/index.node.js.map +68 -30
- 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.d.ts +19 -0
- package/dist/cloud/auth.d.ts.map +1 -0
- package/dist/cloud/auth.js +283 -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 +7 -0
- package/dist/cloud/base-url.d.ts.map +1 -0
- package/dist/cloud/base-url.js +29 -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 +384 -0
- package/dist/cloud/bridge-client.js.map +11 -0
- 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-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 +806 -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 +362 -0
- package/dist/cloud/cloud-wallet.js.map +13 -0
- 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 +15 -0
- package/dist/cloud/index.d.ts.map +1 -0
- package/dist/cloud/index.js +1811 -0
- package/dist/cloud/index.js.map +24 -0
- 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/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/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 +2 -0
- package/dist/cloud/validate-url.d.ts.map +1 -0
- package/dist/cloud/validate-url.js +175 -0
- package/dist/cloud/validate-url.js.map +10 -0
- 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-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/cloud-setup.d.ts +36 -0
- package/dist/cloud-setup.d.ts.map +1 -0
- package/dist/cloud-setup.js +883 -0
- 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 +15 -3
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9862 -0
- package/dist/index.js.map +77 -0
- package/dist/index.node.d.ts +21 -2
- package/dist/index.node.d.ts.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +182 -0
- package/dist/init.js.map +12 -0
- package/dist/lib/cloud-connection.d.ts +77 -0
- package/dist/lib/cloud-connection.d.ts.map +1 -0
- package/dist/lib/cloud-connection.js +654 -0
- package/dist/lib/cloud-connection.js.map +14 -0
- package/dist/lib/cloud-secrets.d.ts +10 -0
- package/dist/lib/cloud-secrets.d.ts.map +1 -0
- package/dist/lib/cloud-secrets.js +36 -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 +11 -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 +21 -0
- package/dist/lib/server-cloud-tts.d.ts.map +1 -0
- package/dist/lib/server-cloud-tts.js +251 -0
- package/dist/lib/server-cloud-tts.js.map +10 -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 +6 -0
- package/dist/lib/tts-debug.d.ts.map +1 -0
- package/dist/lib/tts-debug.js +24 -0
- package/dist/lib/tts-debug.js.map +9 -0
- package/dist/models/embeddings.d.ts.map +1 -1
- package/dist/models/embeddings.js +329 -0
- package/dist/models/embeddings.js.map +13 -0
- package/dist/models/image.d.ts.map +1 -1
- package/dist/models/image.js +401 -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 +1896 -0
- package/dist/models/index.js.map +19 -0
- package/dist/models/research.d.ts.map +1 -1
- package/dist/models/research.js +341 -0
- package/dist/models/research.js.map +13 -0
- package/dist/models/speech.d.ts +61 -3
- package/dist/models/speech.d.ts.map +1 -1
- package/dist/models/speech.js +429 -0
- package/dist/models/speech.js.map +13 -0
- package/dist/models/text.d.ts +111 -3
- package/dist/models/text.d.ts.map +1 -1
- package/dist/models/text.js +1173 -0
- package/dist/models/text.js.map +14 -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 +297 -0
- package/dist/models/transcription.js.map +13 -0
- package/dist/node/index.d.ts +2 -2
- package/dist/node/index.node.js +9189 -2295
- package/dist/node/index.node.js.map +68 -30
- package/dist/plugin.d.ts +20 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +2937 -0
- package/dist/plugin.js.map +28 -0
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +136 -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 +2938 -0
- package/dist/register-routes.js.map +29 -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 +764 -0
- package/dist/routes/cloud-billing-routes.js.map +15 -0
- 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 +10 -0
- package/dist/routes/cloud-compat-routes.d.ts.map +1 -0
- package/dist/routes/cloud-compat-routes.js +495 -0
- package/dist/routes/cloud-compat-routes.js.map +15 -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 +23 -0
- package/dist/routes/cloud-relay-routes.d.ts.map +1 -0
- package/dist/routes/cloud-relay-routes.js +142 -0
- package/dist/routes/cloud-relay-routes.js.map +11 -0
- package/dist/routes/cloud-routes-autonomous.d.ts +82 -0
- package/dist/routes/cloud-routes-autonomous.d.ts.map +1 -0
- package/dist/routes/cloud-routes-autonomous.js +1252 -0
- package/dist/routes/cloud-routes-autonomous.js.map +18 -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 +2173 -0
- package/dist/routes/cloud-routes.js.map +23 -0
- package/dist/routes/cloud-status-routes-autonomous.d.ts +14 -0
- package/dist/routes/cloud-status-routes-autonomous.d.ts.map +1 -0
- package/dist/routes/cloud-status-routes-autonomous.js +349 -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 +695 -0
- package/dist/routes/cloud-status-routes.js.map +15 -0
- 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 +140 -5
- package/dist/services/cloud-auth.d.ts.map +1 -1
- package/dist/services/cloud-auth.js +368 -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 +5 -1
- package/dist/services/cloud-container.d.ts.map +1 -1
- package/dist/services/cloud-container.js +292 -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 +42 -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 +3693 -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 +5563 -0
- package/dist/utils/cloud-sdk/public-routes.d.ts.map +1 -0
- package/dist/utils/cloud-sdk/public-routes.js +3048 -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 +653 -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 +16 -3
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +147 -0
- package/dist/utils/config.js.map +10 -0
- package/dist/utils/events.d.ts +23 -2
- package/dist/utils/events.d.ts.map +1 -1
- package/dist/utils/events.js +45 -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 +157 -0
- package/dist/utils/sdk-client.js.map +11 -0
- 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 +139 -21
- package/src/cloud/auth-service-types.ts +24 -0
- package/src/cloud/auth.ts +175 -0
- package/src/cloud/backup.ts +46 -0
- package/src/cloud/base-url.ts +6 -0
- package/src/cloud/bridge-client.ts +602 -0
- package/src/cloud/clack-observer.ts +189 -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/duffel-client.ts +847 -0
- package/src/cloud/index.ts +38 -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/reconnect.ts +111 -0
- package/src/cloud/setup-observer.ts +125 -0
- package/src/cloud/validate-url.ts +187 -0
- package/src/cloud/x402-payment-handler.ts +215 -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/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 +39 -0
- package/src/index.node.ts +69 -0
- package/src/index.ts +419 -0
- package/src/init.ts +39 -0
- package/src/lib/cloud-connection.ts +661 -0
- package/src/lib/cloud-secrets.ts +14 -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 +122 -0
- package/src/lib/server-cloud-tts.ts +301 -0
- package/src/lib/state-paths.ts +28 -0
- package/src/lib/tts-debug.ts +5 -0
- package/src/models/embeddings.ts +298 -0
- package/src/models/image.ts +234 -0
- package/src/models/index.ts +16 -0
- package/src/models/research.ts +275 -0
- package/src/models/speech.ts +324 -0
- package/src/models/text.ts +1493 -0
- package/src/models/tokenization.ts +67 -0
- package/src/models/transcription.ts +101 -0
- package/src/plugin.ts +281 -0
- package/src/providers/openai.ts +16 -0
- package/src/register-routes.ts +6 -0
- package/src/routes/cloud-billing-routes.ts +744 -0
- package/src/routes/cloud-coding-container-routes.ts +198 -0
- package/src/routes/cloud-compat-routes.ts +304 -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 +135 -0
- package/src/routes/cloud-routes-autonomous.ts +993 -0
- package/src/routes/cloud-routes.ts +637 -0
- package/src/routes/cloud-status-routes-autonomous.ts +238 -0
- package/src/routes/cloud-status-routes.ts +73 -0
- 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 +574 -0
- package/src/services/cloud-backup.ts +208 -0
- package/src/services/cloud-bootstrap.ts +106 -0
- package/src/services/cloud-bridge.ts +386 -0
- package/src/services/cloud-container.ts +390 -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 +74 -29
- package/{types → src/types}/index.ts +25 -0
- package/src/utils/cloud-api.ts +10 -0
- package/src/utils/cloud-sdk/client.ts +774 -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 +5238 -0
- package/src/utils/cloud-sdk/types.cloud-api.ts +120 -0
- package/src/utils/cloud-sdk/types.ts +760 -0
- package/src/utils/config.ts +193 -0
- package/src/utils/events.ts +65 -0
- package/src/utils/helpers.ts +107 -0
- package/src/utils/responses-output.ts +115 -0
- package/src/utils/sdk-client.ts +41 -0
- package/src/utils/waifu-metering.ts +302 -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
|
@@ -1,38 +1,76 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../
|
|
3
|
+
"sources": ["../../src/cloud/base-url.ts", "../../src/cloud/auth-service-types.ts", "../../src/cloud/cloud-api-key.ts", "../../src/cloud/validate-url.ts", "../../src/lib/http.ts", "../../src/routes/cloud-billing-routes.ts", "../../src/routes/home-remote-runner-access-url.ts", "../../src/lib/state-paths.ts", "../../src/lib/config-env.ts", "../../src/lib/feature-flags.ts", "../../src/cloud/cloud-wallet.ts", "../../src/lib/config-like.ts", "../../src/routes/cloud-routes-autonomous.ts", "../../src/lib/cloud-secrets.ts", "../../src/lib/cloud-connection.ts", "../../src/routes/cloud-status-routes.ts", "../../src/routes/cloud-coding-container-routes.ts", "../../src/routes/cloud-routes.ts", "../../src/plugin.ts", "../../src/index.ts", "../../src/cloud-providers/cloud-status.ts", "../../src/cloud-providers/container-health.ts", "../../src/cloud-providers/credit-balance.ts", "../../src/cloud-providers/model-registry.ts", "../../src/init.ts", "../../src/utils/config.ts", "../../src/utils/sdk-client.ts", "../../src/models/embeddings.ts", "../../src/utils/events.ts", "../../src/models/image.ts", "../../src/utils/helpers.ts", "../../src/models/research.ts", "../../src/models/speech.ts", "../../src/models/text.ts", "../../src/utils/responses-output.ts", "../../src/services/cloud-auth.ts", "../../src/types/cloud.ts", "../../src/utils/cloud-api.ts", "../../src/services/cloud-backup.ts", "../../src/services/cloud-bootstrap.ts", "../../src/services/cloud-bridge.ts", "../../src/services/cloud-container.ts", "../../src/services/cloud-credential-provider.ts", "../../src/lib/credential-type-map.ts", "../../src/services/cloud-managed-gateway-relay.ts", "../../src/services/cloud-model-registry.ts", "../../src/utils/waifu-metering.ts", "../../src/routes/cloud-provisioning.ts", "../../src/routes/cloud-compat-routes.ts", "../../src/routes/cloud-relay-routes.ts", "../../src/cloud-setup.ts", "../../src/cloud/auth.ts", "../../src/cloud/bridge-client.ts", "../../src/cloud/clack-observer.ts", "../../src/cloud/null-observer.ts", "../../src/cloud/cloud-manager.ts", "../../src/cloud/backup.ts", "../../src/cloud/cloud-proxy.ts", "../../src/cloud/reconnect.ts", "../../src/lib/server-cloud-tts.ts", "../../src/cloud-voice-catalog.ts", "../../src/cloud/duffel-client.ts", "../../src/cloud/x402-payment-handler.ts", "../../src/cloud/lifeops-schedule-sync-client.ts", "../../src/cloud/lifeops-schedule-sync-contracts.ts", "../../src/cloud/managed-payment-clients.ts", "../../src/index.node.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { IAgentRuntime, Plugin } from \"@elizaos/core\";\nimport { logger, ModelType } from \"@elizaos/core\";\nimport { checkCloudCreditsAction } from \"./actions/check-credits\";\nimport { freezeCloudAgentAction } from \"./actions/freeze-agent\";\n// Cloud actions\nimport { provisionCloudAgentAction } from \"./actions/provision-agent\";\nimport { resumeCloudAgentAction } from \"./actions/resume-agent\";\n// Cloud providers\nimport { cloudStatusProvider } from \"./cloud-providers/cloud-status\";\nimport { containerHealthProvider } from \"./cloud-providers/container-health\";\nimport { creditBalanceProvider } from \"./cloud-providers/credit-balance\";\nimport { modelRegistryProvider } from \"./cloud-providers/model-registry\";\nimport { initializeOpenAI } from \"./init\";\nimport {\n fetchTextToSpeech,\n handleImageDescription,\n handleImageGeneration,\n handleObjectLarge,\n handleObjectSmall,\n handleResearch,\n handleTextEmbedding,\n handleTextLarge,\n handleTextReasoningLarge,\n handleTextReasoningSmall,\n handleTextSmall,\n} from \"./models\";\n// Cloud services\nimport { CloudAuthService } from \"./services/cloud-auth\";\nimport { CloudBackupService } from \"./services/cloud-backup\";\nimport { CloudBridgeService } from \"./services/cloud-bridge\";\nimport { CloudContainerService } from \"./services/cloud-container\";\nimport { CloudModelRegistryService } from \"./services/cloud-model-registry\";\nimport { getApiKey, getBaseURL } from \"./utils/config\";\n\ntype ProcessEnvLike = Record<string, string | undefined>;\n\nfunction getProcessEnv(): ProcessEnvLike {\n if (typeof process === \"undefined\") {\n return {};\n }\n return process.env as ProcessEnvLike;\n}\n\nconst env = getProcessEnv();\n\nexport const elizaOSCloudPlugin: Plugin = {\n name: \"elizaOSCloud\",\n description:\n \"ElizaOS Cloud plugin — Multi-model AI generation, container provisioning, agent bridge, and billing management\",\n\n config: {\n ELIZAOS_CLOUD_API_KEY: env.ELIZAOS_CLOUD_API_KEY ?? null,\n ELIZAOS_CLOUD_BASE_URL: env.ELIZAOS_CLOUD_BASE_URL ?? null,\n ELIZAOS_CLOUD_ENABLED: env.ELIZAOS_CLOUD_ENABLED ?? null,\n // Text models\n ELIZAOS_CLOUD_SMALL_MODEL: env.ELIZAOS_CLOUD_SMALL_MODEL ?? null,\n ELIZAOS_CLOUD_LARGE_MODEL: env.ELIZAOS_CLOUD_LARGE_MODEL ?? null,\n SMALL_MODEL: env.SMALL_MODEL ?? null,\n LARGE_MODEL: env.LARGE_MODEL ?? null,\n // Reasoning models\n ELIZAOS_CLOUD_REASONING_SMALL_MODEL: env.ELIZAOS_CLOUD_REASONING_SMALL_MODEL ?? null,\n ELIZAOS_CLOUD_REASONING_LARGE_MODEL: env.ELIZAOS_CLOUD_REASONING_LARGE_MODEL ?? null,\n REASONING_SMALL_MODEL: env.REASONING_SMALL_MODEL ?? null,\n REASONING_LARGE_MODEL: env.REASONING_LARGE_MODEL ?? null,\n // Research model\n ELIZAOS_CLOUD_RESEARCH_MODEL: env.ELIZAOS_CLOUD_RESEARCH_MODEL ?? null,\n RESEARCH_MODEL: env.RESEARCH_MODEL ?? null,\n // Embedding\n ELIZAOS_CLOUD_EMBEDDING_MODEL: env.ELIZAOS_CLOUD_EMBEDDING_MODEL ?? null,\n ELIZAOS_CLOUD_EMBEDDING_API_KEY: env.ELIZAOS_CLOUD_EMBEDDING_API_KEY ?? null,\n ELIZAOS_CLOUD_EMBEDDING_URL: env.ELIZAOS_CLOUD_EMBEDDING_URL ?? null,\n ELIZAOS_CLOUD_EMBEDDING_DIMENSIONS: env.ELIZAOS_CLOUD_EMBEDDING_DIMENSIONS ?? null,\n // Image\n ELIZAOS_CLOUD_IMAGE_DESCRIPTION_MODEL: env.ELIZAOS_CLOUD_IMAGE_DESCRIPTION_MODEL ?? null,\n ELIZAOS_CLOUD_IMAGE_DESCRIPTION_MAX_TOKENS:\n env.ELIZAOS_CLOUD_IMAGE_DESCRIPTION_MAX_TOKENS ?? null,\n ELIZAOS_CLOUD_IMAGE_GENERATION_MODEL: env.ELIZAOS_CLOUD_IMAGE_GENERATION_MODEL ?? null,\n // Audio\n ELIZAOS_CLOUD_TTS_MODEL: env.ELIZAOS_CLOUD_TTS_MODEL ?? null,\n ELIZAOS_CLOUD_TRANSCRIPTION_MODEL: env.ELIZAOS_CLOUD_TRANSCRIPTION_MODEL ?? null,\n // Telemetry\n ELIZAOS_CLOUD_EXPERIMENTAL_TELEMETRY: env.ELIZAOS_CLOUD_EXPERIMENTAL_TELEMETRY ?? null,\n },\n\n async init(config, runtime) {\n // Initialize inference (OpenAI-compatible client)\n initializeOpenAI(config, runtime);\n },\n\n // ─── Cloud Services ──────────────────────────────────────────────────\n // Services are registered in dependency order:\n // 1. CloudAuthService — must start first (other services depend on it)\n // 2. CloudContainerService — needs auth to list/create containers\n // 3. CloudBridgeService — needs auth for WebSocket connections\n // 4. CloudBackupService — needs auth for snapshot API calls\n services: [\n CloudAuthService,\n CloudModelRegistryService,\n CloudContainerService,\n CloudBridgeService,\n CloudBackupService,\n ],\n\n // ─── Cloud Actions ───────────────────────────────────────────────────\n actions: [\n provisionCloudAgentAction,\n freezeCloudAgentAction,\n resumeCloudAgentAction,\n checkCloudCreditsAction,\n ],\n\n // ─── Cloud Providers ─────────────────────────────────────────────────\n providers: [\n cloudStatusProvider,\n creditBalanceProvider,\n containerHealthProvider,\n modelRegistryProvider,\n ],\n\n // ─── Inference Model Handlers ────────────────────────────────────────\n models: {\n [ModelType.TEXT_EMBEDDING]: handleTextEmbedding,\n [ModelType.TEXT_SMALL]: handleTextSmall,\n [ModelType.TEXT_LARGE]: handleTextLarge,\n [ModelType.TEXT_REASONING_SMALL]: handleTextReasoningSmall,\n [ModelType.TEXT_REASONING_LARGE]: handleTextReasoningLarge,\n [ModelType.RESEARCH]: handleResearch,\n [ModelType.IMAGE]: handleImageGeneration,\n [ModelType.IMAGE_DESCRIPTION]: handleImageDescription,\n [ModelType.OBJECT_SMALL]: handleObjectSmall,\n [ModelType.OBJECT_LARGE]: handleObjectLarge,\n },\n\n tests: [\n {\n name: \"ELIZAOS_CLOUD_plugin_tests\",\n tests: [\n {\n name: \"ELIZAOS_CLOUD_test_url_and_api_key_validation\",\n fn: async (runtime: IAgentRuntime) => {\n const baseURL = getBaseURL(runtime);\n const response = await fetch(`${baseURL}/models`, {\n headers: {\n Authorization: `Bearer ${getApiKey(runtime)}`,\n },\n });\n const data = await response.json();\n logger.log(\n {\n data: (data as { data?: Array<Record<string, never>> })?.data?.length ?? \"N/A\",\n },\n \"Models Available\"\n );\n if (!response.ok) {\n throw new Error(`Failed to validate OpenAI API key: ${response.statusText}`);\n }\n },\n },\n {\n name: \"ELIZAOS_CLOUD_test_text_embedding\",\n fn: async (runtime: IAgentRuntime) => {\n const embedding = await runtime.useModel(ModelType.TEXT_EMBEDDING, {\n text: \"Hello, world!\",\n });\n logger.log({ embedding }, \"embedding\");\n },\n },\n {\n name: \"ELIZAOS_CLOUD_test_text_large\",\n fn: async (runtime: IAgentRuntime) => {\n const text = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: \"What is the nature of reality in 10 words?\",\n });\n if (text.length === 0) {\n throw new Error(\"Failed to generate text\");\n }\n logger.log({ text }, \"generated with test_text_large\");\n },\n },\n {\n name: \"ELIZAOS_CLOUD_test_text_small\",\n fn: async (runtime: IAgentRuntime) => {\n const text = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt: \"What is the nature of reality in 10 words?\",\n });\n if (text.length === 0) {\n throw new Error(\"Failed to generate text\");\n }\n logger.log({ text }, \"generated with test_text_small\");\n },\n },\n {\n name: \"ELIZAOS_CLOUD_test_image_generation\",\n fn: async (runtime: IAgentRuntime) => {\n logger.log(\"ELIZAOS_CLOUD_test_image_generation\");\n const image = await runtime.useModel(ModelType.IMAGE, {\n prompt: \"A beautiful sunset over a calm ocean\",\n count: 1,\n size: \"1024x1024\",\n });\n logger.log({ image }, \"generated with test_image_generation\");\n },\n },\n {\n name: \"image-description\",\n fn: async (runtime: IAgentRuntime) => {\n logger.log(\"ELIZAOS_CLOUD_test_image_description\");\n const result = await runtime.useModel(\n ModelType.IMAGE_DESCRIPTION,\n \"https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Vitalik_Buterin_TechCrunch_London_2015_%28cropped%29.jpg/537px-Vitalik_Buterin_TechCrunch_London_2015_%28cropped%29.jpg\"\n );\n\n if (\n result &&\n typeof result === \"object\" &&\n \"title\" in result &&\n \"description\" in result\n ) {\n logger.log({ result }, \"Image description\");\n } else {\n logger.error(`Invalid image description result format: ${JSON.stringify(result)}`);\n }\n },\n },\n {\n name: \"ELIZAOS_CLOUD_test_transcription\",\n fn: async (runtime: IAgentRuntime) => {\n logger.log(\"ELIZAOS_CLOUD_test_transcription\");\n const response = await fetch(\n \"https://upload.wikimedia.org/wikipedia/en/4/40/Chris_Benoit_Voice_Message.ogg\"\n );\n const arrayBuffer = await response.arrayBuffer();\n const transcription = await runtime.useModel(\n ModelType.TRANSCRIPTION,\n Buffer.from(new Uint8Array(arrayBuffer))\n );\n logger.log({ transcription }, \"generated with test_transcription\");\n },\n },\n {\n name: \"ELIZAOS_CLOUD_test_text_tokenizer_encode\",\n fn: async (runtime: IAgentRuntime) => {\n const prompt = \"Hello tokenizer encode!\";\n const tokens = await runtime.useModel(ModelType.TEXT_TOKENIZER_ENCODE, {\n prompt,\n modelType: ModelType.TEXT_SMALL,\n });\n if (!Array.isArray(tokens) || tokens.length === 0) {\n throw new Error(\"Failed to tokenize text: expected non-empty array of tokens\");\n }\n logger.log({ tokens }, \"Tokenized output\");\n },\n },\n {\n name: \"ELIZAOS_CLOUD_test_text_tokenizer_decode\",\n fn: async (runtime: IAgentRuntime) => {\n const prompt = \"Hello tokenizer decode!\";\n const tokens = await runtime.useModel(ModelType.TEXT_TOKENIZER_ENCODE, {\n prompt,\n modelType: ModelType.TEXT_SMALL,\n });\n const decodedText = await runtime.useModel(ModelType.TEXT_TOKENIZER_DECODE, {\n tokens,\n modelType: ModelType.TEXT_SMALL,\n });\n if (decodedText !== prompt) {\n throw new Error(\n `Decoded text does not match original. Expected \"${prompt}\", got \"${decodedText}\"`\n );\n }\n logger.log({ decodedText }, \"Decoded text\");\n },\n },\n {\n name: \"ELIZAOS_CLOUD_test_text_to_speech\",\n fn: async (runtime: IAgentRuntime) => {\n const response = await fetchTextToSpeech(runtime, {\n text: \"Hello, this is a test for text-to-speech.\",\n });\n if (!response) {\n throw new Error(\"Failed to generate speech\");\n }\n logger.log(\"Generated speech successfully\");\n },\n },\n ],\n },\n ],\n};\n\nexport default elizaOSCloudPlugin;\n",
|
|
6
|
-
"
|
|
7
|
-
"/**\n *
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"/**\n * Runtime settings keys forwarded into cloud containers as environment\n * variables. Used by both PROVISION_CLOUD_AGENT and RESUME_CLOUD_AGENT.\n */\n\nimport type { IAgentRuntime } from \"@elizaos/core\";\n\nexport const FORWARDED_SETTINGS = [\n \"OPENAI_API_KEY\",\n \"ANTHROPIC_API_KEY\",\n \"GROQ_API_KEY\",\n \"ELIZAOS_CLOUD_API_KEY\",\n \"SMALL_MODEL\",\n \"LARGE_MODEL\",\n \"ELIZAOS_CLOUD_SMALL_MODEL\",\n \"ELIZAOS_CLOUD_LARGE_MODEL\",\n] as const;\n\nexport function collectEnvVars(runtime: IAgentRuntime): Record<string, string> {\n const vars: Record<string, string> = {};\n for (const key of FORWARDED_SETTINGS) {\n const val = runtime.getSetting(key);\n if (val) vars[key] = String(val);\n }\n return vars;\n}\n",
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"/** Exposes available cloud models in agent state. */\n\nimport type { IAgentRuntime, Memory, Provider, ProviderResult, State } from \"@elizaos/core\";\nimport type { CloudModelRegistryService, ModelsByProvider } from \"../services/cloud-model-registry\";\n\nconst TTL = 300_000; // 5 minutes\n\n/**\n * Per-runtime cache using a WeakMap keyed by the runtime object.\n * This avoids sharing stale model data between different agent instances\n * running in the same process.\n */\nconst runtimeCaches = new WeakMap<IAgentRuntime, { value: ModelsByProvider; at: number }>();\n\nexport const modelRegistryProvider: Provider = {\n name: \"elizacloud_models\",\n description: \"Available AI models from ElizaCloud grouped by provider\",\n dynamic: true,\n position: 92,\n async get(runtime: IAgentRuntime, _message: Memory, _state: State): Promise<ProviderResult> {\n const registry = runtime.getService(\"CLOUD_MODEL_REGISTRY\") as\n | CloudModelRegistryService\n | undefined;\n\n if (!registry) return { text: \"\" };\n\n const cached = runtimeCaches.get(runtime);\n if (cached && Date.now() - cached.at < TTL) {\n return formatModels(cached.value);\n }\n\n const byProvider = await registry.getModelsByProvider();\n\n if (Object.keys(byProvider).length === 0) {\n return { text: \"\" };\n }\n\n runtimeCaches.set(runtime, { value: byProvider, at: Date.now() });\n return formatModels(byProvider);\n },\n};\n\nfunction formatModels(byProvider: ModelsByProvider): ProviderResult {\n const providers = Object.keys(byProvider).sort();\n const total = Object.values(byProvider).reduce((n, m) => n + m.length, 0);\n\n return {\n text: `ElizaCloud: ${total} models (${providers.join(\", \")})`,\n values: {\n cloudModelProviders: providers.join(\",\"),\n cloudModelCount: total,\n },\n };\n}\n",
|
|
16
|
-
"import
|
|
17
|
-
"import type { IAgentRuntime } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\n\nfunction getEnvValue(key: string): string | undefined {\n if (typeof process === \"undefined\") {\n return undefined;\n }\n const value = process.env[key];\n return value === undefined ? undefined : String(value);\n}\n\nexport function getSetting(\n runtime: IAgentRuntime,\n key: string,\n defaultValue?: string\n): string | undefined {\n const value = runtime.getSetting(key);\n if (value !== undefined && value !== null) {\n return String(value);\n }\n return getEnvValue(key) ?? defaultValue;\n}\n\nexport function isBrowser(): boolean {\n return (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as { document?: Document }).document !== \"undefined\"\n );\n}\n\nexport function isProxyMode(runtime: IAgentRuntime): boolean {\n return isBrowser() && !!getSetting(runtime, \"ELIZAOS_CLOUD_BROWSER_BASE_URL\");\n}\n\nexport function getAuthHeader(\n runtime: IAgentRuntime,\n forEmbedding = false\n): Record<string, string> {\n if (isBrowser()) return {};\n const key = forEmbedding ? getEmbeddingApiKey(runtime) : getApiKey(runtime);\n return key ? { Authorization: `Bearer ${key}` } : {};\n}\n\nexport function getBaseURL(runtime: IAgentRuntime): string {\n const browserURL = getSetting(runtime, \"ELIZAOS_CLOUD_BROWSER_BASE_URL\");\n const baseURL = (\n isBrowser() && browserURL\n ? browserURL\n : getSetting(runtime, \"ELIZAOS_CLOUD_BASE_URL\", \"https://www.elizacloud.ai/api/v1\")\n ) as string;\n return baseURL;\n}\n\nexport function getEmbeddingBaseURL(runtime: IAgentRuntime): string {\n const embeddingURL = isBrowser()\n ? getSetting(runtime, \"ELIZAOS_CLOUD_BROWSER_EMBEDDING_URL\") ||\n getSetting(runtime, \"ELIZAOS_CLOUD_BROWSER_BASE_URL\")\n : getSetting(runtime, \"ELIZAOS_CLOUD_EMBEDDING_URL\");\n if (embeddingURL) {\n logger.debug(`[ELIZAOS_CLOUD] Using specific embedding base URL: ${embeddingURL}`);\n return embeddingURL;\n }\n logger.debug(\"[ELIZAOS_CLOUD] Falling back to general base URL for embeddings.\");\n return getBaseURL(runtime);\n}\n\nexport function getApiKey(runtime: IAgentRuntime): string | undefined {\n return getSetting(runtime, \"ELIZAOS_CLOUD_API_KEY\");\n}\n\nexport function getEmbeddingApiKey(runtime: IAgentRuntime): string | undefined {\n const embeddingApiKey = getSetting(runtime, \"ELIZAOS_CLOUD_EMBEDDING_API_KEY\");\n if (embeddingApiKey) {\n logger.debug(\"[ELIZAOS_CLOUD] Using specific embedding API key (present)\");\n return embeddingApiKey;\n }\n logger.debug(\"[ELIZAOS_CLOUD] Falling back to general API key for embeddings.\");\n return getApiKey(runtime);\n}\n\nexport function getSmallModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_SMALL_MODEL\") ??\n (getSetting(runtime, \"SMALL_MODEL\", \"openai/gpt-5-mini\") as string)\n );\n}\n\nexport function getLargeModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_LARGE_MODEL\") ??\n (getSetting(runtime, \"LARGE_MODEL\", \"anthropic/claude-sonnet-4.5\") as string)\n );\n}\n\nexport function getImageDescriptionModel(runtime: IAgentRuntime): string {\n return getSetting(runtime, \"ELIZAOS_CLOUD_IMAGE_DESCRIPTION_MODEL\", \"gpt-5-mini\") as string;\n}\n\nexport function getImageGenerationModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_IMAGE_GENERATION_MODEL\", \"google/gemini-2.5-flash-image\") ??\n \"google/gemini-2.5-flash-image\"\n );\n}\n\nexport function getReasoningSmallModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_REASONING_SMALL_MODEL\") ??\n (getSetting(runtime, \"REASONING_SMALL_MODEL\", \"deepseek/deepseek-r1\") as string)\n );\n}\n\nexport function getReasoningLargeModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_REASONING_LARGE_MODEL\") ??\n (getSetting(runtime, \"REASONING_LARGE_MODEL\", \"anthropic/claude-opus-4.5\") as string)\n );\n}\n\nexport function getResearchModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_RESEARCH_MODEL\") ??\n (getSetting(runtime, \"RESEARCH_MODEL\", \"o3-deep-research\") as string)\n );\n}\n\nexport function getTTSModel(runtime: IAgentRuntime): string {\n return getSetting(runtime, \"ELIZAOS_CLOUD_TTS_MODEL\", \"gpt-5-mini-tts\") as string;\n}\n\nexport function getTranscriptionModel(runtime: IAgentRuntime): string {\n return getSetting(\n runtime,\n \"ELIZAOS_CLOUD_TRANSCRIPTION_MODEL\",\n \"gpt-5-mini-transcribe\"\n ) as string;\n}\n\nexport function getExperimentalTelemetry(runtime: IAgentRuntime): boolean {\n const setting = getSetting(runtime, \"ELIZAOS_CLOUD_EXPERIMENTAL_TELEMETRY\", \"false\");\n return String(setting).toLowerCase() === \"true\";\n}\n",
|
|
18
|
-
"
|
|
19
|
-
"import { EventType, type IAgentRuntime, type ModelTypeName } from \"@elizaos/core\";\nimport type { LanguageModelUsage } from \"ai\";\n\nexport function emitModelUsageEvent(\n runtime: IAgentRuntime,\n type: ModelTypeName,\n _prompt: string,\n usage: Partial<LanguageModelUsage> & {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n }\n) {\n const inputTokens = Number(usage.inputTokens || 0);\n const outputTokens = Number(usage.outputTokens || 0);\n const totalTokens = Number(\n usage.totalTokens != null ? usage.totalTokens : inputTokens + outputTokens\n );\n\n runtime.emitEvent(EventType.MODEL_USED, {\n runtime,\n source: \"elizacloud\",\n type,\n tokens: {\n prompt: inputTokens,\n completion: outputTokens,\n total: totalTokens,\n },\n });\n}\n",
|
|
20
|
-
"import type {
|
|
5
|
+
"/**\n * Cloud site/API URL normalizer. The implementation moved to\n * `@elizaos/shared/elizacloud/base-url` so host-layer packages can normalize\n * URLs without reverse-importing this plugin.\n */\nexport { normalizeCloudSiteUrl, resolveCloudApiBaseUrl } from \"@elizaos/shared\";\n",
|
|
6
|
+
"import type { Service } from \"@elizaos/core\";\n\nexport interface CloudAuthApiKeyService {\n isAuthenticated: () => boolean;\n getApiKey?: () => string | undefined;\n}\n\nexport function isCloudAuthApiKeyService(\n value: Service | null | undefined,\n): value is Service & CloudAuthApiKeyService {\n return (\n value !== null &&\n value !== undefined &&\n typeof (value as Partial<CloudAuthApiKeyService>).isAuthenticated ===\n \"function\"\n );\n}\n\nexport function normalizeCloudApiKey(value: string | null | undefined): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n if (!trimmed || trimmed.toUpperCase() === \"[REDACTED]\") return null;\n return trimmed;\n}\n",
|
|
7
|
+
"/**\n * Cloud API key + base URL resolution.\n *\n * Resolves the Eliza Cloud API key and base URL from (in priority order):\n * 1. Explicit `config.cloud.apiKey` / `config.cloud.baseUrl`\n * 2. Runtime settings + character secrets (`ELIZAOS_CLOUD_API_KEY`)\n * 3. Process env (`ELIZAOS_CLOUD_API_KEY`, `ELIZAOS_CLOUD_BASE_URL`)\n *\n * Previously these helpers lived in `packages/agent/src/api/wallet-rpc.ts`\n * because the wallet uses Cloud RPC proxies. They are NOT wallet-specific —\n * cloud auth is consumed by cloud-status, cloud-billing, cloud-compat,\n * health, x-relay, and travel-provider-relay routes. Hosting them under\n * `cloud/` matches their actual ownership.\n */\n\nimport type { ElizaConfig } from \"../lib/config-like\";\n\nexport const DEFAULT_CLOUD_API_BASE_URL = \"https://elizacloud.ai/api/v1\";\n\nexport type CloudApiKeyRuntimeLike = {\n getSetting?: (key: string) => unknown;\n character?: {\n secrets?: Record<string, unknown>;\n } | null;\n} | null;\n\nexport function normalizeCloudSecret(\n value: string | null | undefined,\n): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction resolveRuntimeCloudApiKey(\n runtime?: CloudApiKeyRuntimeLike,\n): string | null {\n const fromSetting = runtime?.getSetting?.(\"ELIZAOS_CLOUD_API_KEY\");\n if (typeof fromSetting === \"string\") {\n return normalizeCloudSecret(fromSetting);\n }\n\n const fromSecrets = runtime?.character?.secrets?.ELIZAOS_CLOUD_API_KEY;\n return typeof fromSecrets === \"string\"\n ? normalizeCloudSecret(fromSecrets)\n : null;\n}\n\nexport function resolveCloudApiBaseUrl(\n rawBaseUrl?: string | null,\n): string | null {\n const candidate =\n normalizeCloudSecret(rawBaseUrl ?? process.env.ELIZAOS_CLOUD_BASE_URL) ??\n DEFAULT_CLOUD_API_BASE_URL;\n try {\n const parsed = new URL(candidate);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n return null;\n }\n parsed.hash = \"\";\n parsed.search = \"\";\n const normalizedBase = parsed.toString().replace(/\\/+$/, \"\");\n return normalizedBase.endsWith(\"/api/v1\")\n ? normalizedBase\n : `${normalizedBase}/api/v1`;\n } catch {\n return null;\n }\n}\n\nexport function resolveCloudApiKey(\n config?: Pick<ElizaConfig, \"cloud\"> | null,\n runtime?: CloudApiKeyRuntimeLike,\n): string | null {\n return normalizeCloudSecret(\n config?.cloud?.apiKey ??\n resolveRuntimeCloudApiKey(runtime) ??\n process.env.ELIZAOS_CLOUD_API_KEY,\n );\n}\n",
|
|
8
|
+
"import dns from \"node:dns\";\nimport net from \"node:net\";\nimport { promisify } from \"node:util\";\n\nconst dnsLookupAll = promisify(dns.lookup);\n\nconst BLOCKED_IPV4_CIDRS: Array<{ base: number; mask: number }> = [\n cidrV4(\"0.0.0.0\", 8),\n cidrV4(\"10.0.0.0\", 8),\n cidrV4(\"172.16.0.0\", 12),\n cidrV4(\"192.168.0.0\", 16),\n cidrV4(\"100.64.0.0\", 10),\n cidrV4(\"127.0.0.0\", 8),\n cidrV4(\"169.254.0.0\", 16),\n cidrV4(\"192.0.0.0\", 24),\n cidrV4(\"198.18.0.0\", 15),\n cidrV4(\"192.0.2.0\", 24),\n cidrV4(\"198.51.100.0\", 24),\n cidrV4(\"203.0.113.0\", 24),\n cidrV4(\"224.0.0.0\", 4),\n cidrV4(\"240.0.0.0\", 4),\n];\n\nfunction normalizeHostLike(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/^\\[|\\]$/g, \"\");\n}\n\nfunction decodeIpv6MappedHex(mapped: string): string | null {\n const parts = mapped.split(\":\");\n if (parts.length < 1 || parts.length > 2) return null;\n\n const parsed = parts.map((part) => {\n if (!/^[0-9a-f]{1,4}$/i.test(part)) return Number.NaN;\n return Number.parseInt(part, 16);\n });\n if (parsed.some((value) => !Number.isFinite(value))) return null;\n\n const [hi, lo] = parsed.length === 1 ? [0, parsed[0]] : parsed;\n const octets = [hi >> 8, hi & 0xff, lo >> 8, lo & 0xff];\n return octets.join(\".\");\n}\n\nfunction canonicalizeIpv6(ip: string): string | null {\n try {\n return new URL(`http://[${ip}]/`).hostname.replace(/^\\[|\\]$/g, \"\");\n } catch {\n return null;\n }\n}\n\nfunction normalizeIpForPolicy(ip: string): string {\n const base = normalizeHostLike(ip).split(\"%\")[0];\n if (!base) return base;\n\n let normalized = base;\n if (net.isIP(normalized) === 6) {\n normalized = canonicalizeIpv6(normalized) ?? normalized;\n }\n\n let mapped: string | null = null;\n if (normalized.startsWith(\"::ffff:\")) {\n mapped = normalized.slice(\"::ffff:\".length);\n } else if (normalized.startsWith(\"0:0:0:0:0:ffff:\")) {\n mapped = normalized.slice(\"0:0:0:0:0:ffff:\".length);\n }\n if (!mapped) return normalized;\n\n if (net.isIP(mapped) === 4) return mapped;\n return decodeIpv6MappedHex(mapped) ?? normalized;\n}\n\nfunction cidrV4(base: string, prefix: number): { base: number; mask: number } {\n const parsed = parseIpv4ToInt(base);\n if (parsed === null) {\n throw new Error(`Invalid CIDR base IPv4 address: ${base}`);\n }\n const shift = 32 - prefix;\n const mask = shift === 32 ? 0 : (0xffffffff << shift) >>> 0;\n return { base: parsed & mask, mask };\n}\n\nfunction parseIpv4ToInt(ip: string): number | null {\n const parts = ip.split(\".\");\n if (parts.length !== 4) return null;\n\n let value = 0;\n for (const part of parts) {\n if (!/^\\d{1,3}$/.test(part)) return null;\n const octet = Number.parseInt(part, 10);\n if (!Number.isInteger(octet) || octet < 0 || octet > 255) return null;\n value = (value << 8) | octet;\n }\n\n return value >>> 0;\n}\n\nfunction isBlockedIpv4(ip: string): boolean {\n const asInt = parseIpv4ToInt(ip);\n if (asInt === null) return true;\n return BLOCKED_IPV4_CIDRS.some((cidr) => (asInt & cidr.mask) === cidr.base);\n}\n\nfunction isBlockedIpv6(ip: string): boolean {\n const normalized = ip.toLowerCase();\n return (\n normalized === \"::\" ||\n normalized === \"::1\" ||\n /^fe[89ab][0-9a-f]:/.test(normalized) ||\n /^f[cd][0-9a-f]{2}:/i.test(normalized) ||\n normalized.startsWith(\"ff\")\n );\n}\n\nfunction isBlockedIp(ip: string): boolean {\n const normalized = normalizeIpForPolicy(ip);\n const family = net.isIP(normalized);\n if (family === 4) return isBlockedIpv4(normalized);\n if (family === 6) return isBlockedIpv6(normalized);\n return false;\n}\n\nexport async function validateCloudBaseUrl(\n rawUrl: string,\n): Promise<string | null> {\n let parsed: URL;\n try {\n parsed = new URL(rawUrl);\n } catch {\n return `Invalid cloud base URL: \"${rawUrl}\"`;\n }\n\n if (parsed.protocol !== \"https:\") {\n return `Cloud base URL must use HTTPS, got \"${parsed.protocol}\" in \"${rawUrl}\"`;\n }\n\n const hostname = normalizeHostLike(parsed.hostname);\n if (!hostname) {\n return `Invalid cloud base URL: \"${rawUrl}\"`;\n }\n\n if (\n hostname === \"localhost\" ||\n hostname.endsWith(\".localhost\") ||\n hostname.endsWith(\".local\")\n ) {\n return `Cloud base URL \"${rawUrl}\" points to a blocked local hostname.`;\n }\n\n // Dev-mode bypass: skip IP-range blocking but keep URL format checks above.\n const elizaDev = process.env.ELIZA_DEV?.trim().toLowerCase();\n if (\n process.env.NODE_ENV === \"development\" ||\n elizaDev === \"1\" ||\n elizaDev === \"true\" ||\n elizaDev === \"yes\"\n ) {\n return null;\n }\n\n if (isBlockedIp(hostname)) {\n return `Cloud base URL \"${rawUrl}\" points to a blocked address.`;\n }\n\n try {\n const results = await dnsLookupAll(hostname, { all: true });\n const addresses = Array.isArray(results) ? results : [results];\n for (const entry of addresses) {\n const ip =\n typeof entry === \"string\"\n ? entry\n : (entry as { address: string }).address;\n if (isBlockedIp(ip)) {\n return (\n `Cloud base URL \"${rawUrl}\" resolves to ${ip}, ` +\n \"which is a blocked internal/metadata address.\"\n );\n }\n }\n } catch {\n return `Cloud base URL \"${rawUrl}\" could not be resolved via DNS.`;\n }\n\n return null;\n}\n",
|
|
9
|
+
"import type http from \"node:http\";\n\nexport interface ReadJsonBodyOptions {\n maxBytes?: number;\n tooLargeMessage?: string;\n destroyOnTooLarge?: boolean;\n requireObject?: boolean;\n}\n\nfunction scrubStackFields(value: unknown): unknown {\n if (value instanceof Error) {\n return { error: value.message || \"Internal error\" };\n }\n if (Array.isArray(value)) {\n return value.map(scrubStackFields);\n }\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [key, nested] of Object.entries(value)) {\n if (key === \"stack\" || key === \"stackTrace\") continue;\n out[key] = scrubStackFields(nested);\n }\n return out;\n }\n return value;\n}\n\nexport function sendJson(\n res: http.ServerResponse,\n body: unknown,\n status = 200,\n): void {\n if (res.headersSent) return;\n res.statusCode = status;\n res.setHeader(\"content-type\", \"application/json; charset=utf-8\");\n res.end(JSON.stringify(scrubStackFields(body)));\n}\n\nexport function sendJsonError(\n res: http.ServerResponse,\n message: string,\n status = 400,\n): void {\n sendJson(res, { error: message }, status);\n}\n\nasync function readRequestBody(\n req: http.IncomingMessage,\n options: ReadJsonBodyOptions,\n): Promise<string | null> {\n const maxBytes = options.maxBytes ?? 1_048_576;\n const chunks: Buffer[] = [];\n let size = 0;\n\n for await (const chunk of req) {\n const buffer = typeof chunk === \"string\" ? Buffer.from(chunk) : chunk;\n size += buffer.length;\n if (size > maxBytes) {\n if (options.destroyOnTooLarge) req.destroy();\n throw new Error(options.tooLargeMessage ?? \"Request body too large\");\n }\n chunks.push(buffer);\n }\n\n if (chunks.length === 0) return null;\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n\nexport async function readJsonBody<T extends object = Record<string, unknown>>(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n options: ReadJsonBodyOptions = {},\n): Promise<T | null> {\n const cached = (req as http.IncomingMessage & { body?: unknown }).body;\n if (cached !== undefined) {\n if (\n options.requireObject !== false &&\n (!cached || typeof cached !== \"object\" || Array.isArray(cached))\n ) {\n sendJsonError(res, \"Request body must be a JSON object\", 400);\n return null;\n }\n return cached as T;\n }\n\n let raw: string | null;\n try {\n raw = await readRequestBody(req, options);\n } catch (error) {\n sendJsonError(\n res,\n error instanceof Error ? error.message : \"Failed to read request body\",\n 413,\n );\n return null;\n }\n\n if (!raw?.trim()) {\n const empty = {} as T;\n (req as http.IncomingMessage & { body?: unknown }).body = empty;\n return empty;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n sendJsonError(res, \"Invalid JSON in request body\", 400);\n return null;\n }\n\n if (\n options.requireObject !== false &&\n (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed))\n ) {\n sendJsonError(res, \"Request body must be a JSON object\", 400);\n return null;\n }\n\n (req as http.IncomingMessage & { body?: unknown }).body = parsed;\n return parsed as T;\n}\n",
|
|
10
|
+
"import type http from \"node:http\";\nimport type { AgentRuntime, Service } from \"@elizaos/core\";\nimport { normalizeCloudSiteUrl } from \"../cloud/base-url.js\";\nimport {\n type CloudAuthApiKeyService,\n normalizeCloudApiKey,\n} from \"../cloud/auth-service-types\";\nimport { resolveCloudApiKey } from \"../cloud/cloud-api-key.js\";\nimport { validateCloudBaseUrl } from \"../cloud/validate-url.js\";\nimport type { CloudProxyConfigLike } from \"../lib/config-like\";\nimport { sendJson, sendJsonError } from \"../lib/http\";\n\nexport interface CloudBillingRouteState {\n config: CloudProxyConfigLike;\n runtime?: AgentRuntime | null;\n}\n\nconst PROXY_TIMEOUT_MS = 15_000;\nconst MAX_BODY_BYTES = 1_048_576;\nconst MAX_REDIRECTS = 4;\n/**\n * crypto/status changes rarely (it advertises whether crypto top-ups are\n * enabled and which networks). Caching it amortises the second upstream call\n * `forwardSummary` makes per dashboard refresh against the per-key rate limit.\n *\n * Keyed by `(baseUrl, Authorization header)` so multi-account hosts (or hosts\n * that switch keys via re-login) never serve one account's cached status to\n * another. The Authorization header is already present in process memory at\n * the time of caching, so this introduces no new exposure.\n */\nconst CRYPTO_STATUS_CACHE_MS = 60_000;\nconst cryptoStatusCache = new Map<\n string,\n { value: unknown; expiresAt: number }\n>();\n\nfunction cryptoStatusCacheKey(\n baseUrl: string,\n headers: Record<string, string>,\n): string {\n return `${baseUrl}|${headers.Authorization ?? \"\"}`;\n}\n\nasync function fetchCryptoStatusCached(\n baseUrl: string,\n headers: Record<string, string>,\n): Promise<unknown> {\n const now = Date.now();\n const cacheKey = cryptoStatusCacheKey(baseUrl, headers);\n const cached = cryptoStatusCache.get(cacheKey);\n if (cached && cached.expiresAt > now) {\n return cached.value;\n }\n const response = await fetchUpstream(\n `${baseUrl}/api/crypto/status`,\n \"GET\",\n headers,\n undefined,\n ).catch(() => null);\n if (!response?.ok) {\n return cached?.value ?? null;\n }\n const value = await readJsonResponse(response).catch(() => ({}));\n cryptoStatusCache.set(cacheKey, {\n value,\n expiresAt: now + CRYPTO_STATUS_CACHE_MS,\n });\n return value;\n}\n\nfunction resolveCloudBaseUrl(config: CloudProxyConfigLike): string {\n return normalizeCloudSiteUrl(config.cloud?.baseUrl);\n}\n\nfunction resolveProxyApiKey(state: CloudBillingRouteState): string | null {\n const cloudAuth = state.runtime\n ? state.runtime.getService<Service & CloudAuthApiKeyService>(\"CLOUD_AUTH\")\n : null;\n const runtimeApiKey =\n cloudAuth?.isAuthenticated() === true\n ? normalizeCloudApiKey(cloudAuth.getApiKey?.())\n : null;\n\n return runtimeApiKey ?? resolveCloudApiKey(state.config, state.runtime);\n}\n\nfunction buildAuthHeaders(\n config: CloudProxyConfigLike,\n apiKeyOverride?: string | null,\n): Record<string, string> {\n const serviceKey = config.cloud?.serviceKey?.trim();\n const apiKey =\n normalizeCloudApiKey(apiKeyOverride) ?? resolveCloudApiKey(config);\n\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n };\n\n if (serviceKey) {\n headers[\"X-Service-Key\"] = serviceKey;\n }\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n\n return headers;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction readNumber(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nfunction readBoolean(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction readBody(req: http.IncomingMessage): Promise<string | undefined> {\n const preParsedBody = (req as http.IncomingMessage & { body?: unknown }).body;\n if (preParsedBody !== undefined) {\n return Promise.resolve(\n typeof preParsedBody === \"string\"\n ? preParsedBody\n : JSON.stringify(preParsedBody),\n );\n }\n\n if (req.readableEnded) {\n return Promise.resolve(undefined);\n }\n\n return new Promise<string | undefined>((resolve, reject) => {\n const chunks: Buffer[] = [];\n let size = 0;\n\n req.on(\"data\", (chunk: Buffer) => {\n size += chunk.length;\n if (size > MAX_BODY_BYTES) {\n reject(new Error(\"Request body too large\"));\n return;\n }\n chunks.push(chunk);\n });\n req.on(\"end\", () =>\n resolve(\n chunks.length > 0 ? Buffer.concat(chunks).toString(\"utf-8\") : undefined,\n ),\n );\n req.on(\"error\", reject);\n });\n}\n\nasync function fetchUpstream(\n url: string,\n method: string,\n headers: Record<string, string>,\n body: string | undefined,\n): Promise<Response> {\n let currentUrl = url;\n let currentMethod = method;\n let currentBody = body;\n\n for (\n let redirectCount = 0;\n redirectCount <= MAX_REDIRECTS;\n redirectCount += 1\n ) {\n const response = await fetch(currentUrl, {\n method: currentMethod,\n headers,\n body: currentBody,\n redirect: \"manual\",\n signal: AbortSignal.timeout(PROXY_TIMEOUT_MS),\n });\n\n if (response.status < 300 || response.status >= 400) {\n return response;\n }\n\n const location = response.headers.get(\"location\");\n if (!location) {\n throw Object.assign(new Error(\"redirect\"), { code: \"REDIRECT\" });\n }\n\n const nextUrl = new URL(location, currentUrl).toString();\n const currentOrigin = normalizeCloudSiteUrl(new URL(currentUrl).origin);\n const nextOrigin = normalizeCloudSiteUrl(new URL(nextUrl).origin);\n if (\n new URL(currentUrl).origin !== new URL(nextUrl).origin &&\n currentOrigin !== nextOrigin\n ) {\n throw Object.assign(new Error(\"redirect\"), { code: \"REDIRECT\" });\n }\n\n currentUrl = nextUrl;\n if (\n currentMethod !== \"GET\" &&\n currentMethod !== \"HEAD\" &&\n (response.status === 301 ||\n response.status === 302 ||\n response.status === 303)\n ) {\n currentMethod = \"GET\";\n currentBody = undefined;\n }\n }\n\n throw Object.assign(new Error(\"redirect\"), { code: \"REDIRECT\" });\n}\n\nasync function readJsonResponse(response: Response): Promise<unknown> {\n return response.json().catch(async () => ({\n success: response.ok,\n error: await response.text().catch(() => \"Billing request failed\"),\n }));\n}\n\nfunction buildRedirectUrl(\n baseUrl: string,\n pathname: string,\n params: Record<string, string>,\n): string {\n const url = new URL(pathname, `${baseUrl}/`);\n for (const [key, value] of Object.entries(params)) {\n url.searchParams.set(key, value);\n }\n return url.toString();\n}\n\nfunction normalizeCryptoNetwork(value: string | undefined): string | undefined {\n if (!value) return undefined;\n\n const normalized = value.trim().toUpperCase();\n switch (normalized) {\n case \"BSC\":\n case \"BEP20\":\n return \"BEP20\";\n case \"ETH\":\n case \"ERC20\":\n return \"ERC20\";\n case \"MATIC\":\n case \"POLYGON\":\n return \"POLYGON\";\n case \"SOL\":\n case \"SOLANA\":\n return \"SOL\";\n case \"BASE\":\n return \"BASE\";\n case \"ARB\":\n case \"ARBITRUM\":\n return \"ARB\";\n case \"OP\":\n case \"OPTIMISM\":\n return \"OP\";\n case \"TRON\":\n case \"TRC20\":\n return \"TRC20\";\n default:\n return undefined;\n }\n}\n\nfunction mapBillingSummary(\n payload: unknown,\n baseUrl: string,\n cryptoStatus: unknown,\n): Record<string, unknown> {\n const source = isRecord(payload) ? payload : {};\n const organization = isRecord(source.organization) ? source.organization : {};\n const pricing = isRecord(source.pricing) ? source.pricing : {};\n const crypto = isRecord(cryptoStatus) ? cryptoStatus : {};\n const balance = readNumber(organization.creditBalance) ?? 0;\n\n return {\n success: source.success ?? true,\n balance,\n currency: \"USD\",\n topUpUrl: `${baseUrl}/dashboard/settings?tab=billing`,\n embeddedCheckoutEnabled: false,\n hostedCheckoutEnabled: true,\n cryptoEnabled:\n readBoolean(crypto.enabled) ?? readBoolean(pricing.x402Enabled) ?? false,\n low: balance < 2,\n critical: balance < 0.5,\n hasPaymentMethod: readBoolean(organization.hasPaymentMethod) ?? false,\n autoTopUpEnabled: readBoolean(organization.autoTopUpEnabled) ?? false,\n autoTopUpAmount: readNumber(organization.autoTopUpAmount),\n autoTopUpThreshold: readNumber(organization.autoTopUpThreshold),\n minimumTopUp: readNumber(pricing.minimumTopUp),\n };\n}\n\nfunction mapPaymentMethods(payload: unknown): Record<string, unknown> {\n const source = isRecord(payload) ? payload : {};\n const organization = isRecord(source.organization) ? source.organization : {};\n const hasPaymentMethod = readBoolean(organization.hasPaymentMethod) ?? false;\n\n return {\n success: true,\n data: hasPaymentMethod\n ? [\n {\n id: \"stripe-default\",\n type: \"card\",\n label: \"Saved payment method\",\n brand: \"Card\",\n isDefault: true,\n },\n ]\n : [],\n };\n}\n\nfunction mapBillingHistory(payload: unknown): Record<string, unknown> {\n const source = isRecord(payload) ? payload : {};\n const rawTransactions = Array.isArray(source.transactions)\n ? source.transactions\n : [];\n\n return {\n success: true,\n data: rawTransactions.filter(isRecord).map((item, index) => ({\n id: readString(item.id) ?? `txn-${index}`,\n kind: readString(item.type),\n provider: readString(item.stripe_payment_intent_id)\n ? \"stripe\"\n : undefined,\n status: (readNumber(item.amount) ?? 0) >= 0 ? \"credited\" : \"usage\",\n amount: readNumber(item.amount) ?? 0,\n currency: \"USD\",\n description: readString(item.description),\n createdAt: readString(item.created_at) ?? new Date().toISOString(),\n })),\n total: readNumber(source.total),\n period: source.period,\n };\n}\n\nfunction mapCheckoutResponse(payload: unknown): Record<string, unknown> {\n const source = isRecord(payload) ? payload : {};\n return {\n success: true,\n provider: \"stripe\",\n mode: \"hosted\",\n checkoutUrl: readString(source.url) ?? readString(source.checkoutUrl),\n sessionId: readString(source.sessionId),\n };\n}\n\nfunction mapCryptoQuoteResponse(\n payload: unknown,\n amountUsd: number,\n payCurrency: string,\n network: string | undefined,\n): Record<string, unknown> {\n const source = isRecord(payload) ? payload : {};\n return {\n success: true,\n provider: \"oxapay\",\n invoiceId: readString(source.paymentId) ?? readString(source.trackId),\n trackId: readString(source.trackId),\n network,\n currency: payCurrency,\n amount: readString(source.creditsToAdd) ?? String(amountUsd),\n amountUsd,\n paymentLinkUrl: readString(source.payLink),\n expiresAt: readString(source.expiresAt),\n };\n}\n\nfunction parseJsonBody(body: string | undefined): Record<string, unknown> {\n if (!body) return {};\n const parsed = JSON.parse(body);\n return isRecord(parsed) ? parsed : {};\n}\n\nasync function forwardSummary(\n baseUrl: string,\n headers: Record<string, string>,\n): Promise<{ status: number; payload: Record<string, unknown> | unknown }> {\n const summaryResponse = await fetchUpstream(\n `${baseUrl}/api/v1/credits/summary`,\n \"GET\",\n headers,\n undefined,\n );\n const summaryPayload = await readJsonResponse(summaryResponse);\n if (!summaryResponse.ok) {\n return { status: summaryResponse.status, payload: summaryPayload };\n }\n\n // Fetch crypto/status only when summary succeeded; cache it across requests\n // so we don't burn a per-key rate-limit slot every time the dashboard\n // refreshes (it changes rarely).\n const cryptoPayload = (await fetchCryptoStatusCached(baseUrl, headers)) ?? {};\n\n return {\n status: summaryResponse.status,\n payload: mapBillingSummary(summaryPayload, baseUrl, cryptoPayload),\n };\n}\n\n/**\n * Wraps `sendJson` to also set the HTTP `Retry-After` header when the upstream\n * payload describes a rate-limit (status 429 + `retryAfter` in the body).\n * The body's `retryAfter` field is preserved for clients that read JSON.\n */\nfunction sendJsonWithRetry(\n res: http.ServerResponse,\n payload: unknown,\n status: number,\n): void {\n if (status === 429 && isRecord(payload)) {\n const retryAfter = readNumber(payload.retryAfter);\n if (retryAfter && retryAfter > 0) {\n res.setHeader(\"Retry-After\", String(Math.ceil(retryAfter)));\n }\n }\n sendJson(res, payload, status);\n}\n\nfunction mirrorPaymentHeaders(\n res: http.ServerResponse,\n upstreamResponse: Response,\n): void {\n for (const header of [\n \"PAYMENT-REQUIRED\",\n \"Payment-Required\",\n \"PAYMENT-RESPONSE\",\n \"Payment-Response\",\n \"Access-Control-Expose-Headers\",\n ]) {\n const value = upstreamResponse.headers.get(header);\n if (value) {\n res.setHeader(header, value);\n }\n }\n}\n\nfunction isAllowedAppMoneyPath(pathname: string): boolean {\n const appMoneyPath =\n /^\\/api\\/cloud\\/billing\\/apps\\/[^/]+\\/(charges|earnings|monetization)(?:\\/|$)/;\n return appMoneyPath.test(pathname);\n}\n\nfunction mapBillingProxyPath(pathname: string): string | null {\n if (pathname === \"/api/cloud/billing/x402\") return \"/api/v1/x402\";\n if (pathname.startsWith(\"/api/cloud/billing/x402/\")) {\n return pathname.replace(\"/api/cloud/billing/x402\", \"/api/v1/x402\");\n }\n\n if (pathname === \"/api/cloud/billing/app-credits\") {\n return \"/api/v1/app-credits\";\n }\n if (pathname.startsWith(\"/api/cloud/billing/app-credits/\")) {\n return pathname.replace(\n \"/api/cloud/billing/app-credits\",\n \"/api/v1/app-credits\",\n );\n }\n\n if (pathname === \"/api/cloud/billing/affiliates\") {\n return \"/api/v1/affiliates\";\n }\n if (pathname.startsWith(\"/api/cloud/billing/affiliates/\")) {\n return pathname.replace(\n \"/api/cloud/billing/affiliates\",\n \"/api/v1/affiliates\",\n );\n }\n\n if (pathname === \"/api/cloud/billing/redemptions\") {\n return \"/api/v1/redemptions\";\n }\n if (pathname.startsWith(\"/api/cloud/billing/redemptions/\")) {\n return pathname.replace(\n \"/api/cloud/billing/redemptions\",\n \"/api/v1/redemptions\",\n );\n }\n\n if (isAllowedAppMoneyPath(pathname)) {\n return pathname.replace(\"/api/cloud/billing/apps\", \"/api/v1/apps\");\n }\n\n return null;\n}\n\nasync function forwardBillingProxy(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n method: string,\n baseUrl: string,\n headers: Record<string, string>,\n upstreamPath: string,\n search: string,\n): Promise<void> {\n let body: string | undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n body = await readBody(req);\n }\n\n const upstreamResponse = await fetchUpstream(\n `${baseUrl}${upstreamPath}${search}`,\n method,\n headers,\n body,\n );\n const responseData = await readJsonResponse(upstreamResponse);\n mirrorPaymentHeaders(res, upstreamResponse);\n sendJsonWithRetry(res, responseData, upstreamResponse.status);\n}\n\nexport async function handleCloudBillingRoute(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string,\n method: string,\n state: CloudBillingRouteState,\n): Promise<boolean> {\n if (!pathname.startsWith(\"/api/cloud/billing\")) return false;\n\n const apiKey = resolveProxyApiKey(state);\n if (!apiKey) {\n sendJsonError(\n res,\n \"Not connected to Eliza Cloud. Please log in first.\",\n 401,\n );\n return true;\n }\n\n const baseUrl = resolveCloudBaseUrl(state.config);\n const urlError = await validateCloudBaseUrl(baseUrl);\n if (urlError) {\n sendJsonError(res, urlError, 502);\n return true;\n }\n\n const headers = buildAuthHeaders(state.config, apiKey);\n\n const fullUrl = new URL(req.url ?? pathname, \"http://localhost\");\n const proxiedMoneyPath = mapBillingProxyPath(pathname);\n if (proxiedMoneyPath) {\n await forwardBillingProxy(\n req,\n res,\n method,\n baseUrl,\n headers,\n proxiedMoneyPath,\n fullUrl.search,\n );\n return true;\n }\n\n if (pathname === \"/api/cloud/billing/summary\" && method === \"GET\") {\n const { status, payload } = await forwardSummary(baseUrl, headers);\n sendJsonWithRetry(res, payload, status);\n return true;\n }\n\n if (pathname === \"/api/cloud/billing/payment-methods\" && method === \"GET\") {\n const summaryResponse = await fetchUpstream(\n `${baseUrl}/api/v1/credits/summary`,\n \"GET\",\n headers,\n undefined,\n );\n const summaryPayload = await readJsonResponse(summaryResponse);\n sendJsonWithRetry(\n res,\n summaryResponse.ok ? mapPaymentMethods(summaryPayload) : summaryPayload,\n summaryResponse.status,\n );\n return true;\n }\n\n if (pathname === \"/api/cloud/billing/history\" && method === \"GET\") {\n const upstreamUrl = `${baseUrl}/api/credits/transactions${fullUrl.search}`;\n const historyResponse = await fetchUpstream(\n upstreamUrl,\n \"GET\",\n headers,\n undefined,\n );\n const historyPayload = await readJsonResponse(historyResponse);\n sendJsonWithRetry(\n res,\n historyResponse.ok ? mapBillingHistory(historyPayload) : historyPayload,\n historyResponse.status,\n );\n return true;\n }\n\n if (pathname === \"/api/cloud/billing/checkout\" && method === \"POST\") {\n const body = await readBody(req);\n const requestBody = parseJsonBody(body);\n const amountUsd = readNumber(requestBody.amountUsd);\n\n if (!amountUsd || amountUsd <= 0) {\n sendJsonError(res, \"Invalid top-up amount\", 400);\n return true;\n }\n\n const upstreamBody = JSON.stringify({\n credits: amountUsd,\n success_url: buildRedirectUrl(baseUrl, \"/dashboard/billing/success\", {\n from: \"eliza\",\n }),\n cancel_url: buildRedirectUrl(baseUrl, \"/dashboard/settings\", {\n from: \"eliza\",\n tab: \"billing\",\n canceled: \"1\",\n }),\n });\n\n const checkoutResponse = await fetchUpstream(\n `${baseUrl}/api/v1/credits/checkout`,\n \"POST\",\n headers,\n upstreamBody,\n );\n const checkoutPayload = await readJsonResponse(checkoutResponse);\n sendJsonWithRetry(\n res,\n checkoutResponse.ok\n ? mapCheckoutResponse(checkoutPayload)\n : checkoutPayload,\n checkoutResponse.status,\n );\n return true;\n }\n\n if (pathname === \"/api/cloud/billing/crypto/quote\" && method === \"POST\") {\n const body = await readBody(req);\n const requestBody = parseJsonBody(body);\n const amountUsd = readNumber(requestBody.amountUsd);\n\n if (!amountUsd || amountUsd <= 0) {\n sendJsonError(res, \"Invalid top-up amount\", 400);\n return true;\n }\n\n const payCurrency =\n readString(requestBody.currency)?.trim().toUpperCase() ?? \"USDC\";\n const network = normalizeCryptoNetwork(readString(requestBody.network));\n const upstreamBody = JSON.stringify({\n amount: amountUsd,\n payCurrency,\n network,\n });\n\n const cryptoResponse = await fetchUpstream(\n `${baseUrl}/api/crypto/payments`,\n \"POST\",\n headers,\n upstreamBody,\n );\n const cryptoPayload = await readJsonResponse(cryptoResponse);\n sendJsonWithRetry(\n res,\n cryptoResponse.ok\n ? mapCryptoQuoteResponse(cryptoPayload, amountUsd, payCurrency, network)\n : cryptoPayload,\n cryptoResponse.status,\n );\n return true;\n }\n\n if (pathname.startsWith(\"/api/cloud/billing/credits/\")) {\n let body: string | undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n body = await readBody(req);\n }\n\n const upstreamPath = pathname.replace(\n \"/api/cloud/billing/credits\",\n \"/api/v1/credits\",\n );\n const upstreamResponse = await fetchUpstream(\n `${baseUrl}${upstreamPath}${fullUrl.search}`,\n method,\n headers,\n body,\n );\n const responseData = await readJsonResponse(upstreamResponse);\n sendJsonWithRetry(res, responseData, upstreamResponse.status);\n return true;\n }\n\n if (\n pathname.startsWith(\"/api/cloud/billing/crypto/\") &&\n pathname !== \"/api/cloud/billing/crypto/quote\"\n ) {\n let body: string | undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n body = await readBody(req);\n }\n\n const upstreamPath = pathname.replace(\n \"/api/cloud/billing/crypto\",\n \"/api/crypto\",\n );\n const upstreamResponse = await fetchUpstream(\n `${baseUrl}${upstreamPath}${fullUrl.search}`,\n method,\n headers,\n body,\n );\n const responseData = await readJsonResponse(upstreamResponse);\n sendJsonWithRetry(res, responseData, upstreamResponse.status);\n return true;\n }\n\n let body: string | undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n body = await readBody(req);\n }\n\n const billingPath = pathname.replace(\"/api/cloud/billing\", \"/api/v1/billing\");\n const upstreamResponse = await fetchUpstream(\n `${baseUrl}${billingPath}${fullUrl.search}`,\n method,\n headers,\n body,\n );\n const responseData = await readJsonResponse(upstreamResponse);\n sendJsonWithRetry(res, responseData, upstreamResponse.status);\n return true;\n}\n",
|
|
11
|
+
"import { normalizeCloudSiteUrl } from \"@elizaos/shared\";\n\nexport const HOME_REMOTE_RUNNER_ACCESS_SESSION_PARAM = \"homeRemoteRunnerSession\";\n\nexport interface HomeRemoteRunnerSshTunnel {\n command: string;\n localUrl: string;\n}\n\nexport function buildHomeRemoteRunnerAccessUrl(input: {\n cloudBaseUrl?: string | null;\n sessionId?: string | null;\n}): string | null {\n const sessionId = input.sessionId?.trim();\n if (!sessionId) return null;\n\n try {\n const url = new URL(normalizeCloudSiteUrl(input.cloudBaseUrl ?? undefined));\n url.pathname = \"/dashboard/app\";\n url.search = \"\";\n url.hash = \"\";\n url.searchParams.set(HOME_REMOTE_RUNNER_ACCESS_SESSION_PARAM, sessionId);\n return url.toString();\n } catch {\n return null;\n }\n}\n\nexport function buildHomeRemoteRunnerSshTunnel(input: {\n remoteBaseUrl?: string | null;\n sshTarget?: string | null;\n sshIdentity?: string | null;\n localPort?: string | number | null;\n}): HomeRemoteRunnerSshTunnel | null {\n const sshTarget = normalizeSshTarget(input.sshTarget);\n if (!sshTarget) return null;\n\n let parsed: URL;\n try {\n parsed = new URL(input.remoteBaseUrl?.trim() ?? \"\");\n } catch {\n return null;\n }\n\n if (parsed.protocol !== \"http:\") {\n return null;\n }\n\n const remotePort = parsed.port || \"80\";\n const localPort = normalizePort(input.localPort) ?? remotePort;\n const remoteHost =\n parsed.hostname === \"localhost\" || parsed.hostname === \"127.0.0.1\"\n ? \"127.0.0.1\"\n : parsed.hostname;\n const identityArg = input.sshIdentity?.trim()\n ? ` -i ${quoteShellArg(input.sshIdentity.trim())}`\n : \"\";\n const command = `ssh -N${identityArg} -L 127.0.0.1:${localPort}:${remoteHost}:${remotePort} ${sshTarget}`;\n return {\n command,\n localUrl: `${parsed.protocol}//127.0.0.1:${localPort}`,\n };\n}\n\nfunction normalizePort(value: string | number | null | undefined): string | null {\n if (value === null || value === undefined) return null;\n const raw = String(value).trim();\n if (!/^\\d+$/.test(raw)) return null;\n const port = Number(raw);\n if (!Number.isInteger(port) || port < 1 || port > 65535) return null;\n return String(port);\n}\n\nfunction normalizeSshTarget(value: string | null | undefined): string | null {\n const target = value?.trim();\n if (!target) return null;\n if (!/^[A-Za-z0-9._~%+-]+@[A-Za-z0-9.-]+$/.test(target)) return null;\n return target;\n}\n\nfunction quoteShellArg(value: string): string {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n",
|
|
12
|
+
"import fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n getElizaNamespace,\n resolveStateDir,\n resolveUserPath,\n} from \"@elizaos/core\";\n\nexport { getElizaNamespace, resolveStateDir, resolveUserPath };\n\nexport function resolveConfigPath(\n env: NodeJS.ProcessEnv = process.env,\n stateDirPath: string = resolveStateDir(env),\n): string {\n const override = env.ELIZA_CONFIG_PATH?.trim();\n if (override) return resolveUserPath(override);\n\n const namespace = getElizaNamespace(env);\n const primaryPath = path.join(stateDirPath, `${namespace}.json`);\n if (fs.existsSync(primaryPath)) return primaryPath;\n\n if (namespace !== \"eliza\") {\n const legacyPath = path.join(stateDirPath, \"eliza.json\");\n if (fs.existsSync(legacyPath)) return legacyPath;\n }\n\n return primaryPath;\n}\n",
|
|
13
|
+
"import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { resolveStateDir } from \"./state-paths\";\n\nconst CONFIG_ENV_FILENAME = \"config.env\";\nconst BAK_SUFFIX = \".bak\";\nconst TMP_SUFFIX = \".tmp\";\nconst KEY_PATTERN = /^[A-Z][A-Z0-9_]*$/;\n\nconst BLOCKED_CONFIG_ENV_KEYS: ReadonlySet<string> = new Set([\n \"NODE_OPTIONS\",\n \"NODE_EXTRA_CA_CERTS\",\n \"NODE_TLS_REJECT_UNAUTHORIZED\",\n \"NODE_PATH\",\n \"LD_PRELOAD\",\n \"LD_LIBRARY_PATH\",\n \"DYLD_INSERT_LIBRARIES\",\n \"DYLD_LIBRARY_PATH\",\n \"DYLD_FRAMEWORK_PATH\",\n \"DYLD_FALLBACK_FRAMEWORK_PATH\",\n \"DYLD_FALLBACK_LIBRARY_PATH\",\n \"PATH\",\n \"HOME\",\n \"SHELL\",\n \"HTTP_PROXY\",\n \"HTTPS_PROXY\",\n \"ALL_PROXY\",\n \"NO_PROXY\",\n \"SSL_CERT_FILE\",\n \"SSL_CERT_DIR\",\n \"CURL_CA_BUNDLE\",\n]);\n\nexport interface PersistConfigEnvOptions {\n stateDir?: string;\n}\n\ninterface ParsedConfigEnv {\n lines: string[];\n index: Map<string, number>;\n}\n\nfunction parseConfigEnv(contents: string): ParsedConfigEnv {\n const lines = contents.length === 0 ? [] : contents.split(/\\r?\\n/);\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n const index = new Map<string, number>();\n for (let i = 0; i < lines.length; i += 1) {\n const line = lines[i] ?? \"\";\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eq = line.indexOf(\"=\");\n if (eq <= 0) continue;\n const key = line.slice(0, eq).trim();\n if (KEY_PATTERN.test(key)) index.set(key, i);\n }\n return { lines, index };\n}\n\nfunction serialiseConfigEnv(parsed: ParsedConfigEnv): string {\n return parsed.lines.length === 0 ? \"\" : `${parsed.lines.join(\"\\n\")}\\n`;\n}\n\nfunction encodeValue(value: string): string {\n if (value === \"\") return \"\";\n const needsQuoting = /[\\s#\"'\\\\]|^\\s|\\s$/.test(value) || /\\n|\\r/.test(value);\n if (!needsQuoting) return value;\n const escaped = value\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\");\n return `\"${escaped}\"`;\n}\n\nfunction validateKey(key: string): void {\n if (!KEY_PATTERN.test(key)) {\n throw new Error(\n `persistConfigEnv: invalid key \"${key}\" - must match /^[A-Z][A-Z0-9_]*$/`,\n );\n }\n if (BLOCKED_CONFIG_ENV_KEYS.has(key)) {\n throw new Error(\n `persistConfigEnv: key \"${key}\" is a shell/runtime hijack vector and cannot be written`,\n );\n }\n}\n\nasync function readIfExists(filePath: string): Promise<string | null> {\n try {\n return await fs.readFile(filePath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n }\n}\n\nasync function writeAtomic(filePath: string, contents: string): Promise<void> {\n const tmpPath = `${filePath}${TMP_SUFFIX}`;\n const handle = await fs.open(tmpPath, \"w\", 0o600);\n try {\n await handle.writeFile(contents, \"utf8\");\n await handle.sync();\n } finally {\n await handle.close();\n }\n await fs.rename(tmpPath, filePath);\n}\n\nlet writeChain: Promise<unknown> = Promise.resolve();\n\nfunction serialise<T>(fn: () => Promise<T>): Promise<T> {\n const next = writeChain.then(fn, fn);\n writeChain = next.catch(() => undefined);\n return next;\n}\n\nfunction resolveConfigEnvPath(stateDir?: string): string {\n return path.join(stateDir ?? resolveStateDir(), CONFIG_ENV_FILENAME);\n}\n\nexport async function persistConfigEnv(\n key: string,\n value: string,\n opts: PersistConfigEnvOptions = {},\n): Promise<void> {\n validateKey(key);\n\n await serialise(async () => {\n const filePath = resolveConfigEnvPath(opts.stateDir);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n\n const existing = (await readIfExists(filePath)) ?? \"\";\n const parsed = parseConfigEnv(existing);\n const existingIdx = parsed.index.get(key);\n const isDelete = value === \"\";\n\n if (isDelete) {\n if (existingIdx === undefined) {\n delete process.env[key];\n return;\n }\n parsed.lines.splice(existingIdx, 1);\n } else {\n const encoded = `${key}=${encodeValue(value)}`;\n if (existingIdx === undefined) {\n parsed.lines.push(encoded);\n } else {\n parsed.lines[existingIdx] = encoded;\n }\n }\n\n if (existing.length > 0) {\n await fs.writeFile(`${filePath}${BAK_SUFFIX}`, existing, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n }\n\n await writeAtomic(filePath, serialiseConfigEnv(parsed));\n if (isDelete) {\n delete process.env[key];\n } else {\n process.env[key] = value;\n }\n });\n}\n",
|
|
14
|
+
"function readBoolFlag(name: string, fallback = false): boolean {\n const raw = process.env[name];\n if (raw === undefined || raw === null || raw === \"\") return fallback;\n const trimmed = String(raw).trim().toLowerCase();\n if (\n trimmed === \"1\" ||\n trimmed === \"true\" ||\n trimmed === \"yes\" ||\n trimmed === \"on\"\n ) {\n return true;\n }\n if (\n trimmed === \"0\" ||\n trimmed === \"false\" ||\n trimmed === \"no\" ||\n trimmed === \"off\"\n ) {\n return false;\n }\n return fallback;\n}\n\nexport function isCloudWalletEnabled(): boolean {\n return readBoolFlag(\"ENABLE_CLOUD_WALLET\");\n}\n",
|
|
15
|
+
"/**\n * Cloud wallet provisioning + client-address key management.\n *\n * Gated by ENABLE_CLOUD_WALLET. Every export short-circuits when the flag\n * is off so no cloud code paths run in legacy builds.\n *\n * Responsibilities:\n * 1. Generate + persist ELIZA_CLOUD_CLIENT_ADDRESS_KEY (the local secp256k1\n * key whose address ties this install to cloud-custodied wallets).\n * 2. Provision EVM + Solana cloud wallets for an agent, guarded by a\n * single-flight mutex keyed on (agentId, chainType) to prevent duplicate\n * provision under concurrent cloud-login triggers.\n * 3. Write the resulting descriptors into the in-memory config under\n * wallet.cloud.{evm,solana}; caller persists via saveConfig().\n */\n\nimport { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\nimport type {\n CloudBridgeError,\n CloudChainType,\n CloudWalletDescriptor,\n CloudWalletProvider,\n} from \"./bridge-client.js\";\nimport { persistConfigEnv } from \"../lib/config-env\";\nimport { isCloudWalletEnabled } from \"../lib/feature-flags\";\n\nexport const ELIZA_CLOUD_CLIENT_ADDRESS_KEY_ENV =\n \"ELIZA_CLOUD_CLIENT_ADDRESS_KEY\";\n\nexport class CloudWalletFlagDisabledError extends Error {\n constructor() {\n super(\"ENABLE_CLOUD_WALLET is off; cloud wallet code paths are inactive\");\n this.name = \"CloudWalletFlagDisabledError\";\n }\n}\n\nfunction ensureFlag(): void {\n if (!isCloudWalletEnabled()) {\n throw new CloudWalletFlagDisabledError();\n }\n}\n\n/**\n * Normalize a hex private key to the 0x-prefixed form viem expects.\n */\nfunction normalizePrivateKey(raw: string): `0x${string}` {\n const trimmed = raw.trim();\n const hex = trimmed.startsWith(\"0x\") ? trimmed.slice(2) : trimmed;\n if (!/^[0-9a-fA-F]{64}$/.test(hex)) {\n throw new Error(\n `Malformed ${ELIZA_CLOUD_CLIENT_ADDRESS_KEY_ENV}: expected 32-byte hex`,\n );\n }\n return `0x${hex.toLowerCase()}`;\n}\n\nexport interface GetOrCreateKeyOptions {\n /** Override state dir for config.env persistence. Used by tests. */\n stateDir?: string;\n}\n\nexport interface CloudWalletProvisionBridge {\n getAgentWallet(\n agentId: string,\n chain: CloudChainType,\n ): Promise<CloudWalletDescriptor>;\n provisionWallet(input: {\n chainType: CloudChainType;\n clientAddress: string;\n }): Promise<{\n walletId: string;\n address: string;\n chainType: CloudChainType;\n provider: CloudWalletProvider;\n }>;\n}\n\n/**\n * Read or mint the local client-address secp256k1 key.\n *\n * Priority:\n * 1. process.env[ELIZA_CLOUD_CLIENT_ADDRESS_KEY] — respected as-is.\n * 2. Generate a fresh key, write to `process.env` AND disk (`config.env`)\n * so it survives restart.\n *\n * The key is in `BLOCKED_STARTUP_ENV_KEYS` so it never syncs into\n * `eliza.json` — `config.env` is the designated disk home for it.\n */\nexport async function getOrCreateClientAddressKey(\n opts: GetOrCreateKeyOptions = {},\n): Promise<{\n privateKey: `0x${string}`;\n address: `0x${string}`;\n minted: boolean;\n}> {\n ensureFlag();\n\n const existing = process.env[ELIZA_CLOUD_CLIENT_ADDRESS_KEY_ENV];\n if (existing && existing.trim().length > 0) {\n const privateKey = normalizePrivateKey(existing);\n const account = privateKeyToAccount(privateKey);\n return { privateKey, address: account.address, minted: false };\n }\n\n const privateKey = generatePrivateKey();\n const account = privateKeyToAccount(privateKey);\n\n process.env[ELIZA_CLOUD_CLIENT_ADDRESS_KEY_ENV] = privateKey;\n await persistConfigEnv(ELIZA_CLOUD_CLIENT_ADDRESS_KEY_ENV, privateKey, {\n stateDir: opts.stateDir,\n });\n\n return { privateKey, address: account.address, minted: true };\n}\n\n// ---------------------------------------------------------------------------\n// Single-flight provisioning\n// ---------------------------------------------------------------------------\n\nconst inflight = new Map<string, Promise<CloudWalletDescriptor>>();\n\nfunction inflightKey(agentId: string, chain: CloudChainType): string {\n return `${agentId}::${chain}`;\n}\n\nasync function provisionOne(\n bridge: CloudWalletProvisionBridge,\n agentId: string,\n chain: CloudChainType,\n clientAddress: string,\n): Promise<CloudWalletDescriptor> {\n try {\n return await bridge.getAgentWallet(agentId, chain);\n } catch (error) {\n if (!isMissingCloudWalletError(error, chain)) {\n throw error;\n }\n }\n\n const provisioned = await bridge.provisionWallet({\n chainType: chain,\n clientAddress,\n });\n\n return {\n agentWalletId: provisioned.walletId,\n walletAddress: provisioned.address,\n walletProvider: provisioned.provider,\n chainType: chain,\n };\n}\n\nfunction isMissingCloudWalletError(\n error: unknown,\n chain: CloudChainType,\n): boolean {\n if (\n error instanceof Error &&\n new RegExp(`no cloud ${chain} wallet provisioned`, \"i\").test(error.message)\n ) {\n return true;\n }\n\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"name\" in error &&\n error.name === \"CloudBridgeError\" &&\n typeof (error as CloudBridgeError).status === \"number\" &&\n (error as CloudBridgeError).status === 404\n );\n}\n\nexport interface ProvisionOptions {\n agentId: string;\n clientAddress: string;\n chains?: CloudChainType[];\n}\n\nexport interface CloudWalletDescriptors {\n evm: CloudWalletDescriptor;\n solana: CloudWalletDescriptor;\n}\n\nexport interface CloudWalletProvisionFailure {\n chain: CloudChainType;\n error: unknown;\n}\n\nexport interface CloudWalletProvisionResult {\n descriptors: Partial<CloudWalletDescriptors>;\n failures: CloudWalletProvisionFailure[];\n warnings: string[];\n}\n\nfunction formatProvisionWarning(chain: CloudChainType, error: unknown): string {\n const message = error instanceof Error ? error.message : String(error);\n return `Cloud ${chain} wallet import failed: ${message}`;\n}\n\n/**\n * Provision EVM + Solana cloud wallets idempotently.\n *\n * Concurrent callers for the same (agentId, chain) share a single in-flight\n * promise so we never send duplicate provision requests.\n */\nexport async function provisionCloudWalletsBestEffort(\n bridge: CloudWalletProvisionBridge,\n opts: ProvisionOptions,\n): Promise<CloudWalletProvisionResult> {\n ensureFlag();\n\n const chains: CloudChainType[] = opts.chains ?? [\"evm\", \"solana\"];\n\n const results = await Promise.all(\n chains.map((chain) => {\n const key = inflightKey(opts.agentId, chain);\n const pending = inflight.get(key);\n if (pending) {\n return pending.then(\n (descriptor) =>\n ({\n chain,\n ok: true as const,\n descriptor,\n }) as const,\n (error) =>\n ({\n chain,\n ok: false as const,\n error,\n }) as const,\n );\n }\n\n const p = provisionOne(\n bridge,\n opts.agentId,\n chain,\n opts.clientAddress,\n ).finally(() => {\n inflight.delete(key);\n });\n inflight.set(key, p);\n return p.then(\n (descriptor) =>\n ({\n chain,\n ok: true as const,\n descriptor,\n }) as const,\n (error) =>\n ({\n chain,\n ok: false as const,\n error,\n }) as const,\n );\n }),\n );\n\n const out: Partial<CloudWalletDescriptors> = {};\n const failures: CloudWalletProvisionFailure[] = [];\n for (const result of results) {\n if (\"descriptor\" in result) {\n out[result.chain] = result.descriptor;\n continue;\n }\n failures.push({ chain: result.chain, error: result.error });\n }\n\n return {\n descriptors: out,\n failures,\n warnings: failures.map(({ chain, error }) =>\n formatProvisionWarning(chain, error),\n ),\n };\n}\n\nexport async function provisionCloudWallets(\n bridge: CloudWalletProvisionBridge,\n opts: ProvisionOptions,\n): Promise<Partial<CloudWalletDescriptors>> {\n const result = await provisionCloudWalletsBestEffort(bridge, opts);\n if (\n result.failures.length > 0 &&\n Object.keys(result.descriptors).length === 0\n ) {\n const firstFailure = result.failures[0];\n if (firstFailure?.error instanceof Error) {\n throw firstFailure.error;\n }\n throw new Error(result.warnings[0] ?? \"Failed to provision cloud wallets\");\n }\n\n return result.descriptors;\n}\n\n// ---------------------------------------------------------------------------\n// Config cache write\n// ---------------------------------------------------------------------------\n\nexport interface CloudWalletCacheTarget {\n wallet?: {\n cloud?: Partial<Record<CloudChainType, CloudWalletDescriptor>>;\n [k: string]: unknown;\n };\n [k: string]: unknown;\n}\n\n/**\n * Write the descriptors into the provided config object under\n * `wallet.cloud.{evm,solana}`. Caller is responsible for persisting\n * (state.saveConfig()).\n */\nexport function persistCloudWalletCache(\n config: CloudWalletCacheTarget,\n descriptors: Partial<CloudWalletDescriptors>,\n): void {\n ensureFlag();\n\n const wallet = (config.wallet ?? {}) as NonNullable<\n CloudWalletCacheTarget[\"wallet\"]\n >;\n const cloud = { ...(wallet.cloud ?? {}) };\n if (descriptors.evm) cloud.evm = descriptors.evm;\n if (descriptors.solana) cloud.solana = descriptors.solana;\n wallet.cloud = cloud;\n config.wallet = wallet;\n}\n\n// ---------------------------------------------------------------------------\n// Test hooks\n// ---------------------------------------------------------------------------\n\n/** @internal — exposed for tests to reset state between cases. */\nexport function __resetCloudWalletModuleForTests(): void {\n inflight.clear();\n delete process.env[ELIZA_CLOUD_CLIENT_ADDRESS_KEY_ENV];\n}\n",
|
|
16
|
+
"import type {\n DeploymentTargetConfig,\n LinkedAccountFlagsConfig,\n ServiceCapability,\n ServiceRoutingConfig,\n} from \"@elizaos/core\";\n\nexport interface CloudProxyConfigLike {\n cloud?: {\n apiKey?: string;\n baseUrl?: string;\n enabled?: boolean;\n serviceKey?: string;\n backup?: {\n autoBackupIntervalMs?: number;\n };\n bridge?: {\n heartbeatIntervalMs?: number;\n };\n };\n}\n\nexport type CloudConfig = NonNullable<CloudProxyConfigLike[\"cloud\"]>;\n\nexport type ElizaConfig = Record<string, unknown> &\n CloudProxyConfigLike & {\n deploymentTarget?: DeploymentTargetConfig;\n linkedAccounts?: LinkedAccountFlagsConfig;\n serviceRouting?: ServiceRoutingConfig;\n };\n\nexport interface AutonomousConfigLike {\n [key: string]: unknown;\n}\n\ntype MutableElizaConfig = Partial<ElizaConfig> & {\n cloud?: Record<string, unknown>;\n deploymentTarget?: DeploymentTargetConfig;\n linkedAccounts?: LinkedAccountFlagsConfig;\n serviceRouting?: ServiceRoutingConfig;\n};\n\nfunction ensureLinkedAccounts(\n config: MutableElizaConfig,\n): LinkedAccountFlagsConfig {\n config.linkedAccounts ??= {};\n return config.linkedAccounts;\n}\n\nfunction ensureServiceRouting(\n config: MutableElizaConfig,\n): ServiceRoutingConfig {\n config.serviceRouting ??= {};\n return config.serviceRouting;\n}\n\nfunction persistDeploymentTarget(\n config: MutableElizaConfig,\n deploymentTarget: DeploymentTargetConfig | null | undefined,\n): void {\n if (!deploymentTarget) {\n delete config.deploymentTarget;\n return;\n }\n config.deploymentTarget = { ...deploymentTarget };\n}\n\nfunction persistLinkedAccounts(\n config: MutableElizaConfig,\n linkedAccounts: LinkedAccountFlagsConfig | null | undefined,\n): void {\n if (!linkedAccounts) return;\n\n const existing = ensureLinkedAccounts(config);\n for (const [accountId, account] of Object.entries(linkedAccounts)) {\n if (!account || Object.keys(account).length === 0) {\n delete existing[accountId];\n continue;\n }\n existing[accountId] = {\n ...existing[accountId],\n ...account,\n };\n }\n\n if (Object.keys(existing).length === 0) {\n delete config.linkedAccounts;\n }\n}\n\nfunction persistServiceRouting(\n config: MutableElizaConfig,\n serviceRouting: ServiceRoutingConfig | null | undefined,\n clearRoutes: readonly ServiceCapability[] = [],\n): void {\n const existing = ensureServiceRouting(config);\n\n for (const capability of clearRoutes) {\n delete existing[capability];\n }\n\n if (serviceRouting) {\n for (const [capability, route] of Object.entries(serviceRouting)) {\n const serviceKey = capability as ServiceCapability;\n if (!route || Object.keys(route).length === 0) {\n delete existing[serviceKey];\n continue;\n }\n existing[serviceKey] = { ...route };\n }\n }\n\n if (Object.keys(existing).length === 0) {\n delete config.serviceRouting;\n }\n}\n\nexport function applyCanonicalSetupConfig(\n config: MutableElizaConfig,\n args: {\n deploymentTarget?: DeploymentTargetConfig | null;\n linkedAccounts?: LinkedAccountFlagsConfig | null;\n serviceRouting?: ServiceRoutingConfig | null;\n clearRoutes?: readonly ServiceCapability[];\n },\n): void {\n if (args.deploymentTarget !== undefined) {\n persistDeploymentTarget(config, args.deploymentTarget);\n }\n if (args.linkedAccounts !== undefined) {\n persistLinkedAccounts(config, args.linkedAccounts);\n }\n if (args.serviceRouting !== undefined || args.clearRoutes?.length) {\n persistServiceRouting(config, args.serviceRouting, args.clearRoutes);\n }\n}\n\nexport function normalizeEnvValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed || undefined;\n}\n\nexport function isTimeoutError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n if (error.name === \"TimeoutError\" || error.name === \"AbortError\") return true;\n const message = error.message.toLowerCase();\n return message.includes(\"timed out\") || message.includes(\"timeout\");\n}\n",
|
|
17
|
+
"import fs from \"node:fs/promises\";\nimport type http from \"node:http\";\nimport path from \"node:path\";\nimport {\n isCloudInferenceSelectedInConfig,\n migrateLegacyRuntimeConfig,\n} from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport { normalizeCloudSiteUrl } from \"../cloud/base-url.js\";\nimport type {\n CloudChainType,\n CloudWalletDescriptor,\n CloudWalletProvider,\n} from \"../cloud/bridge-client.js\";\nimport {\n ELIZA_CLOUD_CLIENT_ADDRESS_KEY_ENV,\n getOrCreateClientAddressKey,\n persistCloudWalletCache,\n provisionCloudWallets,\n} from \"../cloud/cloud-wallet.js\";\nimport { validateCloudBaseUrl } from \"../cloud/validate-url.js\";\nimport { persistConfigEnv } from \"../lib/config-env\";\nimport {\n applyCanonicalSetupConfig,\n isTimeoutError,\n} from \"../lib/config-like\";\nimport { isCloudWalletEnabled } from \"../lib/feature-flags\";\nimport {\n readJsonBody as parseJsonBody,\n sendJson,\n sendJsonError,\n} from \"../lib/http\";\nimport { resolveStateDir } from \"../lib/state-paths\";\n\nexport interface CloudConfigLike {\n cloud?: {\n enabled?: boolean;\n apiKey?: string;\n baseUrl?: string;\n };\n}\n\ninterface CloudClientLike {\n listAgents: () => Promise<unknown>;\n createAgent: (args: {\n agentName: string;\n agentConfig?: Record<string, unknown>;\n environmentVars?: Record<string, string>;\n }) => Promise<unknown>;\n deleteAgent: (agentId: string) => Promise<unknown>;\n getAgentWallet: (\n agentId: string,\n chain: CloudChainType,\n ) => Promise<CloudWalletDescriptor>;\n provisionWallet: (input: {\n chainType: CloudChainType;\n clientAddress: string;\n }) => Promise<{\n walletId: string;\n address: string;\n chainType: CloudChainType;\n provider: CloudWalletProvider;\n }>;\n}\n\ninterface ConnectedCloudAgentLike {\n agentName: string;\n}\n\ninterface CloudManagerLike {\n init?: () => Promise<void>;\n replaceApiKey?: (apiKey: string) => Promise<void>;\n getClient: () => CloudClientLike | null;\n connect: (agentId: string) => Promise<ConnectedCloudAgentLike>;\n disconnect: () => Promise<void>;\n getStatus: () => unknown;\n getActiveAgentId: () => string | null;\n}\n\ninterface RuntimeLike {\n agentId: string;\n character?: {\n secrets?: Record<string, string | number | boolean>;\n };\n getService?: (name: string) => unknown;\n setSetting?: (key: string, value: string | null) => unknown;\n updateAgent?: (\n agentId: string,\n update: {\n secrets: Record<string, string | number | boolean>;\n },\n ) => Promise<unknown>;\n}\n\ninterface IntegrationTelemetrySpanLike {\n success: (args?: { statusCode?: number }) => void;\n failure: (args?: {\n statusCode?: number;\n error?: unknown;\n errorKind?: string;\n }) => void;\n}\n\ninterface CloudAuthLike {\n authenticateWithApiKey?: (input: {\n apiKey: string;\n organizationId?: string;\n userId?: string;\n }) => unknown;\n clearAuth?: () => unknown;\n}\n\ntype CreateTelemetrySpanLike = (meta: {\n boundary: \"cloud\";\n operation: string;\n timeoutMs?: number;\n}) => IntegrationTelemetrySpanLike | null | undefined;\n\nexport interface CloudRouteState {\n config: CloudConfigLike;\n cloudManager: CloudManagerLike | null;\n runtime: RuntimeLike | null;\n saveConfig?: (config: CloudConfigLike) => void;\n createTelemetrySpan?: CreateTelemetrySpanLike;\n /**\n * Optional runtime restart hook used after cloud-login provisioning to\n * rebind plugin-wallet to the cloud provider. Threaded from server.ts the\n * same way provider-switch-routes does.\n */\n restartRuntime?: (reason: string) => Promise<boolean> | boolean;\n}\n\nconst UUID_RE =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nconst CLOUD_LOGIN_CREATE_TIMEOUT_MS = 10_000;\nconst CLOUD_LOGIN_POLL_TIMEOUT_MS = 10_000;\nconst CONFIG_ENV_FILENAME = \"config.env\";\nconst CONFIG_ENV_BAK_SUFFIX = \".bak\";\nconst CLOUD_WALLET_ROLLBACK_ENV_KEYS = [\n ELIZA_CLOUD_CLIENT_ADDRESS_KEY_ENV,\n \"ELIZA_CLOUD_EVM_ADDRESS\",\n \"ELIZA_CLOUD_SOLANA_ADDRESS\",\n \"WALLET_SOURCE_EVM\",\n \"WALLET_SOURCE_SOLANA\",\n] as const;\n\ntype CloudWalletRollbackEnvKey =\n (typeof CLOUD_WALLET_ROLLBACK_ENV_KEYS)[number];\n\ninterface ConfigEnvRollbackSnapshot {\n bakPath: string;\n filePath: string;\n originalRaw: string | null;\n previousEnv: Partial<Record<CloudWalletRollbackEnvKey, string>>;\n}\n\nfunction extractAgentId(pathname: string): string | null {\n const id = pathname.split(\"/\")[4];\n return id && UUID_RE.test(id) ? id : null;\n}\n\nfunction replaceMutableRoot<T extends object>(target: T, snapshot: T): void {\n const targetRecord = target as Record<string, unknown>;\n for (const key of Object.keys(targetRecord)) {\n delete targetRecord[key];\n }\n Object.assign(\n targetRecord,\n structuredClone(snapshot as Record<string, unknown>),\n );\n}\n\nfunction getCloudAuth(runtime: RuntimeLike | null): CloudAuthLike | null {\n if (typeof runtime?.getService !== \"function\") {\n return null;\n }\n const service = runtime.getService(\"CLOUD_AUTH\");\n return service && typeof service === \"object\"\n ? (service as CloudAuthLike)\n : null;\n}\n\nfunction clearCloudAuth(runtime: RuntimeLike | null): CloudAuthLike | null {\n const cloudAuth = getCloudAuth(runtime);\n if (typeof cloudAuth?.clearAuth === \"function\") {\n cloudAuth.clearAuth();\n }\n return cloudAuth;\n}\n\nasync function captureConfigEnvRollbackSnapshot(): Promise<ConfigEnvRollbackSnapshot> {\n const filePath = path.join(resolveStateDir(), CONFIG_ENV_FILENAME);\n const bakPath = `${filePath}${CONFIG_ENV_BAK_SUFFIX}`;\n\n let originalRaw: string | null = null;\n try {\n originalRaw = await fs.readFile(filePath, \"utf8\");\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw err;\n }\n }\n\n const previousEnv = Object.fromEntries(\n CLOUD_WALLET_ROLLBACK_ENV_KEYS.flatMap((key) => {\n const value = process.env[key];\n return typeof value === \"string\" ? ([[key, value]] as const) : [];\n }),\n ) as Partial<Record<CloudWalletRollbackEnvKey, string>>;\n\n return {\n bakPath,\n filePath,\n originalRaw,\n previousEnv,\n };\n}\n\nasync function restoreConfigEnvRollbackSnapshot(\n snapshot: ConfigEnvRollbackSnapshot,\n): Promise<void> {\n await fs.mkdir(path.dirname(snapshot.filePath), { recursive: true });\n\n if (snapshot.originalRaw === null) {\n await fs.rm(snapshot.filePath, { force: true });\n await fs.rm(snapshot.bakPath, { force: true });\n } else {\n await fs.writeFile(snapshot.filePath, snapshot.originalRaw, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n await fs.writeFile(snapshot.bakPath, snapshot.originalRaw, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n }\n\n for (const key of CLOUD_WALLET_ROLLBACK_ENV_KEYS) {\n const previousValue = snapshot.previousEnv[key];\n if (typeof previousValue === \"string\") {\n process.env[key] = previousValue;\n } else {\n delete process.env[key];\n }\n }\n}\n\nfunction saveConfigOrThrow(state: CloudRouteState): void {\n if (!state.saveConfig) {\n throw new Error(\"saveConfig not available\");\n }\n state.saveConfig(state.config);\n}\n\nasync function readJsonBody<T = Record<string, unknown>>(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n): Promise<T | null> {\n return (await parseJsonBody(req, res, {\n maxBytes: 1_048_576,\n tooLargeMessage: \"Request body too large\",\n destroyOnTooLarge: true,\n })) as T | null;\n}\n\nfunction isRedirectResponse(response: Response): boolean {\n return response.status >= 300 && response.status < 400;\n}\n\nfunction createNoopTelemetrySpan(): IntegrationTelemetrySpanLike {\n return {\n success: () => {},\n failure: () => {},\n };\n}\n\nfunction getTelemetrySpan(\n state: CloudRouteState,\n meta: {\n boundary: \"cloud\";\n operation: string;\n timeoutMs?: number;\n },\n): IntegrationTelemetrySpanLike {\n return state.createTelemetrySpan?.(meta) ?? createNoopTelemetrySpan();\n}\n\nasync function fetchWithTimeout(\n input: string,\n init: RequestInit,\n timeoutMs: number,\n): Promise<Response> {\n return fetch(input, {\n ...init,\n redirect: \"manual\",\n signal: AbortSignal.timeout(timeoutMs),\n });\n}\n\nexport async function handleCloudRoute(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string,\n method: string,\n state: CloudRouteState,\n): Promise<boolean> {\n if (method === \"POST\" && pathname === \"/api/cloud/login\") {\n const baseUrl = normalizeCloudSiteUrl(state.config.cloud?.baseUrl);\n const urlError = await validateCloudBaseUrl(baseUrl);\n if (urlError) {\n sendJsonError(res, urlError);\n return true;\n }\n const sessionId = crypto.randomUUID();\n const loginCreateSpan = getTelemetrySpan(state, {\n boundary: \"cloud\",\n operation: \"login_create_session\",\n timeoutMs: CLOUD_LOGIN_CREATE_TIMEOUT_MS,\n });\n\n let createRes: Response;\n try {\n createRes = await fetchWithTimeout(\n `${baseUrl}/api/auth/cli-session`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ sessionId }),\n },\n CLOUD_LOGIN_CREATE_TIMEOUT_MS,\n );\n } catch (err) {\n if (isTimeoutError(err)) {\n loginCreateSpan.failure({ error: err, statusCode: 504 });\n sendJsonError(res, \"Eliza Cloud login request timed out\", 504);\n return true;\n }\n loginCreateSpan.failure({ error: err, statusCode: 502 });\n sendJsonError(res, \"Failed to reach Eliza Cloud\", 502);\n return true;\n }\n\n if (isRedirectResponse(createRes)) {\n loginCreateSpan.failure({\n statusCode: createRes.status,\n errorKind: \"redirect_response\",\n });\n sendJsonError(\n res,\n \"Eliza Cloud login request was redirected; redirects are not allowed\",\n 502,\n );\n return true;\n }\n\n if (!createRes.ok) {\n loginCreateSpan.failure({\n statusCode: createRes.status,\n errorKind: \"http_error\",\n });\n sendJsonError(res, \"Failed to create auth session with Eliza Cloud\", 502);\n return true;\n }\n\n loginCreateSpan.success({ statusCode: createRes.status });\n sendJson(res, {\n ok: true,\n sessionId,\n browserUrl: `${baseUrl}/auth/cli-login?session=${encodeURIComponent(sessionId)}`,\n });\n return true;\n }\n\n if (method === \"GET\" && pathname.startsWith(\"/api/cloud/login/status\")) {\n const url = new URL(\n req.url ?? \"/\",\n `http://${req.headers.host ?? \"localhost\"}`,\n );\n const sessionId = url.searchParams.get(\"sessionId\");\n if (!sessionId) {\n sendJsonError(res, \"sessionId query parameter is required\");\n return true;\n }\n\n const baseUrl = normalizeCloudSiteUrl(state.config.cloud?.baseUrl);\n const urlError = await validateCloudBaseUrl(baseUrl);\n if (urlError) {\n sendJsonError(res, urlError);\n return true;\n }\n const loginPollSpan = getTelemetrySpan(state, {\n boundary: \"cloud\",\n operation: \"login_poll_status\",\n timeoutMs: CLOUD_LOGIN_POLL_TIMEOUT_MS,\n });\n let pollRes: Response;\n try {\n pollRes = await fetchWithTimeout(\n `${baseUrl}/api/auth/cli-session/${encodeURIComponent(sessionId)}`,\n {},\n CLOUD_LOGIN_POLL_TIMEOUT_MS,\n );\n } catch (err) {\n if (isTimeoutError(err)) {\n loginPollSpan.failure({ error: err, statusCode: 504 });\n sendJson(\n res,\n {\n status: \"error\",\n error: \"Eliza Cloud status request timed out\",\n },\n 504,\n );\n return true;\n }\n loginPollSpan.failure({ error: err, statusCode: 502 });\n sendJson(\n res,\n {\n status: \"error\",\n error: \"Failed to reach Eliza Cloud\",\n },\n 502,\n );\n return true;\n }\n\n if (isRedirectResponse(pollRes)) {\n loginPollSpan.failure({\n statusCode: pollRes.status,\n errorKind: \"redirect_response\",\n });\n sendJson(\n res,\n {\n status: \"error\",\n error:\n \"Eliza Cloud status request was redirected; redirects are not allowed\",\n },\n 502,\n );\n return true;\n }\n\n if (!pollRes.ok) {\n loginPollSpan.failure({\n statusCode: pollRes.status,\n errorKind: \"http_error\",\n });\n sendJson(\n res,\n pollRes.status === 404\n ? { status: \"expired\", error: \"Session not found or expired\" }\n : {\n status: \"error\",\n error: `Eliza Cloud returned HTTP ${pollRes.status}`,\n },\n );\n return true;\n }\n\n let data: {\n status: string;\n apiKey?: string;\n keyPrefix?: string;\n organizationId?: string;\n userId?: string;\n };\n try {\n data = (await pollRes.json()) as {\n status: string;\n apiKey?: string;\n keyPrefix?: string;\n organizationId?: string;\n userId?: string;\n };\n } catch (parseErr) {\n loginPollSpan.failure({ error: parseErr, statusCode: pollRes.status });\n sendJson(\n res,\n { status: \"error\", error: \"Eliza Cloud returned invalid JSON\" },\n 502,\n );\n return true;\n }\n loginPollSpan.success({ statusCode: pollRes.status });\n\n if (data.status === \"authenticated\" && data.apiKey) {\n const organizationId =\n typeof data.organizationId === \"string\"\n ? data.organizationId.trim()\n : undefined;\n const userId =\n typeof data.userId === \"string\" ? data.userId.trim() : undefined;\n const cloudAuth = clearCloudAuth(state.runtime);\n migrateLegacyRuntimeConfig(state.config as Record<string, unknown>);\n const cloud = (state.config.cloud ?? {}) as NonNullable<\n CloudConfigLike[\"cloud\"]\n >;\n cloud.apiKey = data.apiKey;\n (state.config as Record<string, unknown>).cloud = cloud;\n applyCanonicalSetupConfig(state.config as never, {\n linkedAccounts: {\n elizacloud: {\n status: \"linked\",\n source: \"api-key\",\n },\n },\n });\n const cloudInferenceSelected = isCloudInferenceSelectedInConfig(\n state.config as Record<string, unknown>,\n );\n migrateLegacyRuntimeConfig(state.config as Record<string, unknown>);\n try {\n if (state.saveConfig) {\n state.saveConfig(state.config);\n } else {\n logger.warn(\n \"[cloud-login] saveConfig not available — config not persisted\",\n );\n }\n logger.info(\"[cloud-login] API key saved to config file\");\n } catch (saveErr) {\n logger.error(`[cloud-login] Failed to save config: ${String(saveErr)}`);\n sendJson(\n res,\n { status: \"error\", error: \"Authenticated but failed to save config\" },\n 500,\n );\n return true;\n }\n\n process.env.ELIZAOS_CLOUD_API_KEY = data.apiKey;\n if (cloudInferenceSelected) {\n process.env.ELIZAOS_CLOUD_ENABLED = \"true\";\n } else {\n delete process.env.ELIZAOS_CLOUD_ENABLED;\n }\n\n if (state.runtime) {\n const character = state.runtime.character ?? {};\n state.runtime.character = character;\n if (!character.secrets) {\n character.secrets = {};\n }\n const secrets = character.secrets as Record<string, string>;\n secrets.ELIZAOS_CLOUD_API_KEY = data.apiKey;\n if (userId) {\n secrets.ELIZA_CLOUD_USER_ID = userId;\n } else {\n delete secrets.ELIZA_CLOUD_USER_ID;\n }\n if (organizationId) {\n secrets.ELIZA_CLOUD_ORGANIZATION_ID = organizationId;\n } else {\n delete secrets.ELIZA_CLOUD_ORGANIZATION_ID;\n }\n if (cloudInferenceSelected) {\n secrets.ELIZAOS_CLOUD_ENABLED = \"true\";\n } else {\n delete secrets.ELIZAOS_CLOUD_ENABLED;\n }\n\n if (typeof state.runtime.setSetting === \"function\") {\n state.runtime.setSetting(\"ELIZA_CLOUD_USER_ID\", userId ?? null);\n state.runtime.setSetting(\n \"ELIZA_CLOUD_ORGANIZATION_ID\",\n organizationId ?? null,\n );\n }\n\n if (typeof state.runtime.updateAgent === \"function\") {\n await state.runtime.updateAgent(state.runtime.agentId, {\n secrets: { ...secrets },\n });\n logger.info(\"[cloud-login] API key persisted to agent DB record\");\n } else {\n logger.warn(\n \"[cloud-login] runtime.updateAgent not available — agent DB secrets not persisted\",\n );\n }\n }\n\n if (\n state.cloudManager &&\n typeof state.cloudManager.replaceApiKey === \"function\"\n ) {\n await state.cloudManager.replaceApiKey(data.apiKey);\n } else if (\n state.cloudManager &&\n !state.cloudManager.getClient() &&\n typeof state.cloudManager.init === \"function\"\n ) {\n await state.cloudManager.init();\n }\n\n if (typeof cloudAuth?.authenticateWithApiKey === \"function\") {\n cloudAuth.authenticateWithApiKey({\n apiKey: data.apiKey,\n organizationId,\n userId,\n });\n }\n\n // Cloud-wallet remote-signing bridge (gated by ENABLE_CLOUD_WALLET).\n // Failures here do NOT abort the cloud-login response — the API key\n // is already saved. We log, rollback the partial wallet bind, and\n // fall through so the user stays logged in.\n if (isCloudWalletEnabled()) {\n const rollbackConfigSnapshot = structuredClone(\n state.config as Record<string, unknown>,\n ) as CloudConfigLike;\n const rollbackEnvSnapshot = await captureConfigEnvRollbackSnapshot();\n\n try {\n const bridge = state.cloudManager?.getClient();\n const agentId = state.runtime?.agentId;\n if (!bridge) {\n throw new Error(\"cloud-wallet bridge unavailable\");\n }\n if (!agentId) {\n throw new Error(\"cloud-wallet runtime agentId missing\");\n }\n\n const { address: clientAddress, minted } =\n await getOrCreateClientAddressKey();\n if (minted) {\n logger.info(\n `[cloud-login] cloud-wallet: minted client_address ${clientAddress}`,\n );\n }\n\n const descriptors = await provisionCloudWallets(bridge, {\n agentId,\n clientAddress,\n });\n\n persistCloudWalletCache(\n state.config as Record<string, unknown>,\n descriptors,\n );\n\n const cloudCfg = (state.config.cloud ?? {}) as Record<\n string,\n unknown\n >;\n cloudCfg.clientAddressPublicKey = clientAddress;\n (state.config as Record<string, unknown>).cloud = cloudCfg;\n saveConfigOrThrow(state);\n\n if (descriptors.evm?.walletAddress) {\n process.env.ELIZA_CLOUD_EVM_ADDRESS = descriptors.evm.walletAddress;\n await persistConfigEnv(\n \"ELIZA_CLOUD_EVM_ADDRESS\",\n descriptors.evm.walletAddress,\n );\n }\n if (descriptors.solana?.walletAddress) {\n process.env.ELIZA_CLOUD_SOLANA_ADDRESS =\n descriptors.solana.walletAddress;\n await persistConfigEnv(\n \"ELIZA_CLOUD_SOLANA_ADDRESS\",\n descriptors.solana.walletAddress,\n );\n }\n\n if (descriptors.evm) {\n await persistConfigEnv(\"WALLET_SOURCE_EVM\", \"cloud\");\n }\n if (descriptors.solana) {\n await persistConfigEnv(\"WALLET_SOURCE_SOLANA\", \"cloud\");\n }\n\n const wallet = ((state.config as Record<string, unknown>).wallet ??\n {}) as Record<string, unknown>;\n const primary = {\n ...((wallet.primary ?? {}) as Record<string, string>),\n };\n if (descriptors.evm) primary.evm = \"cloud\";\n if (descriptors.solana) primary.solana = \"cloud\";\n wallet.primary = primary;\n (state.config as Record<string, unknown>).wallet = wallet;\n saveConfigOrThrow(state);\n\n logger.info(\n `[cloud-login] cloud-wallet: provisioned ${Object.keys(descriptors).join(\", \")} — applying runtime reload`,\n );\n\n const restarted = state.restartRuntime\n ? await Promise.resolve(state.restartRuntime(\"cloud-wallet-bound\"))\n : false;\n if (!restarted) {\n logger.warn(\n \"[cloud-login] cloud-wallet: restartRuntime not wired or restart declined — user must restart manually\",\n );\n }\n } catch (cloudWalletErr) {\n try {\n await restoreConfigEnvRollbackSnapshot(rollbackEnvSnapshot);\n } catch (rollbackErr) {\n logger.error(\n `[cloud-login] cloud-wallet rollback failed: ${String(\n rollbackErr,\n )}`,\n );\n }\n\n replaceMutableRoot(state.config, rollbackConfigSnapshot);\n try {\n saveConfigOrThrow(state);\n } catch (saveRollbackErr) {\n logger.error(\n `[cloud-login] cloud-wallet config rollback failed: ${String(\n saveRollbackErr,\n )}`,\n );\n }\n\n logger.error(\n `[cloud-login] cloud-wallet provision failed: ${String(\n cloudWalletErr,\n )}`,\n );\n }\n }\n\n // Return the cloud API key to the renderer so it can populate\n // `globalThis.__ELIZA_CLOUD_AUTH_TOKEN__` and use the direct cloud\n // path (`/api/v1/eliza/agents`) for agent creation/provisioning.\n // Without this, every cloud op falls back to the proxy compat path,\n // which creates agents in a namespace whose queue never drains\n // (agents stay `status: \"queued\"` forever — setup hangs).\n //\n // ## Security trade-off — token in HTTP response body\n //\n // Sending an API key in the response body is a deliberate choice\n // for our architecture, NOT an oversight:\n // - The agent process and the renderer (Electrobun WebView) live\n // on the same machine. They communicate over loopback HTTP\n // (`127.0.0.1`). Any process that can sniff the loopback\n // interface (tcpdump, attached debugger) already has the\n // ambient privilege to read the renderer's memory or the\n // vault directly — the HTTP body is not the weakest link.\n // - The key IS the user's own secret (not server-owned), and\n // the response only goes to the renderer the user is\n // actively using.\n // - Returning a short-lived \"handle\" that the renderer\n // exchanges for the real token would just shift the same\n // cleartext transit one hop, not eliminate it.\n //\n // The principled fix is to push the token over an Electrobun RPC\n // channel (the same IPC the api-base-owner module uses for\n // `pushApiBaseToRenderer`). That requires routing the cloud\n // login outcome from the agent process to the Electrobun main\n // process and back to the renderer — three-process choreography\n // that doesn't fit this PR. Tracked as a follow-up.\n logger.info(\n `[cloud-login] sending API key to loopback renderer (single-user desktop trust model)`,\n );\n sendJson(res, {\n status: \"authenticated\",\n token: data.apiKey,\n keyPrefix: data.keyPrefix,\n organizationId,\n userId,\n });\n } else {\n sendJson(res, { status: data.status });\n }\n return true;\n }\n\n if (method === \"GET\" && pathname === \"/api/cloud/agents\") {\n const client = state.cloudManager?.getClient();\n if (!client) {\n sendJsonError(res, \"Not connected to Eliza Cloud\", 401);\n return true;\n }\n sendJson(res, { ok: true, agents: await client.listAgents() });\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/cloud/agents\") {\n const client = state.cloudManager?.getClient();\n if (!client) {\n sendJsonError(res, \"Not connected to Eliza Cloud\", 401);\n return true;\n }\n\n const body = await readJsonBody<{\n agentName?: string;\n agentConfig?: Record<string, unknown>;\n environmentVars?: Record<string, string>;\n }>(req, res);\n if (!body) return true;\n\n if (!body.agentName?.trim()) {\n sendJsonError(res, \"agentName is required\");\n return true;\n }\n\n let agent: unknown;\n try {\n agent = await client.createAgent({\n agentName: body.agentName,\n agentConfig: body.agentConfig,\n environmentVars: body.environmentVars,\n });\n } catch (err) {\n logger.error(`[cloud] createAgent failed: ${String(err)}`);\n sendJson(\n res,\n { ok: false, error: `Cloud createAgent failed: ${String(err)}` },\n 502,\n );\n return true;\n }\n sendJson(res, { ok: true, agent }, 201);\n return true;\n }\n\n if (\n method === \"POST\" &&\n pathname.startsWith(\"/api/cloud/agents/\") &&\n pathname.endsWith(\"/provision\")\n ) {\n const agentId = extractAgentId(pathname);\n if (!agentId || !state.cloudManager) {\n sendJsonError(res, \"Invalid agent ID or cloud not connected\", 400);\n return true;\n }\n let proxy: { agentName?: string };\n try {\n proxy = await state.cloudManager.connect(agentId);\n } catch (err) {\n logger.error(`[cloud] provision/connect failed: ${String(err)}`);\n sendJson(\n res,\n { ok: false, error: `Cloud provision failed: ${String(err)}` },\n 502,\n );\n return true;\n }\n sendJson(res, {\n ok: true,\n agentId,\n agentName: proxy.agentName,\n status: state.cloudManager.getStatus(),\n });\n return true;\n }\n\n if (\n method === \"POST\" &&\n pathname.startsWith(\"/api/cloud/agents/\") &&\n pathname.endsWith(\"/shutdown\")\n ) {\n const agentId = extractAgentId(pathname);\n if (!agentId || !state.cloudManager) {\n sendJsonError(res, \"Invalid agent ID or cloud not connected\", 400);\n return true;\n }\n const client = state.cloudManager.getClient();\n if (!client) {\n sendJsonError(res, \"Not connected to Eliza Cloud\", 401);\n return true;\n }\n try {\n if (state.cloudManager.getActiveAgentId() === agentId) {\n await state.cloudManager.disconnect();\n }\n await client.deleteAgent(agentId);\n } catch (err) {\n logger.error(`[cloud] shutdown/deleteAgent failed: ${String(err)}`);\n sendJson(\n res,\n { ok: false, error: `Cloud shutdown failed: ${String(err)}` },\n 502,\n );\n return true;\n }\n sendJson(res, { ok: true, agentId, status: \"stopped\" });\n return true;\n }\n\n if (\n method === \"POST\" &&\n pathname.startsWith(\"/api/cloud/agents/\") &&\n pathname.endsWith(\"/connect\")\n ) {\n const agentId = extractAgentId(pathname);\n if (!agentId || !state.cloudManager) {\n sendJsonError(res, \"Invalid agent ID or cloud not connected\", 400);\n return true;\n }\n let proxy: { agentName?: string };\n try {\n if (state.cloudManager.getActiveAgentId()) {\n await state.cloudManager.disconnect();\n }\n proxy = await state.cloudManager.connect(agentId);\n } catch (err) {\n logger.error(`[cloud] connect failed: ${String(err)}`);\n sendJson(\n res,\n { ok: false, error: `Cloud connect failed: ${String(err)}` },\n 502,\n );\n return true;\n }\n sendJson(res, {\n ok: true,\n agentId,\n agentName: proxy.agentName,\n status: state.cloudManager.getStatus(),\n });\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/cloud/disconnect\") {\n if (state.cloudManager) {\n await state.cloudManager.disconnect();\n }\n const cloud = (state.config.cloud ?? {}) as NonNullable<\n CloudConfigLike[\"cloud\"]\n >;\n delete cloud.apiKey;\n (state.config as Record<string, unknown>).cloud = cloud;\n applyCanonicalSetupConfig(state.config as never, {\n deploymentTarget: { runtime: \"local\" },\n linkedAccounts: {\n elizacloud: {\n status: \"unlinked\",\n source: \"api-key\",\n },\n },\n clearRoutes: [\"llmText\", \"tts\", \"media\", \"embeddings\", \"rpc\"],\n });\n migrateLegacyRuntimeConfig(state.config as Record<string, unknown>);\n\n try {\n if (state.saveConfig) {\n state.saveConfig(state.config);\n } else {\n logger.warn(\n \"[cloud-disconnect] saveConfig not available — config not persisted\",\n );\n }\n } catch (saveErr) {\n logger.error(\n `[cloud-disconnect] Failed to save config: ${String(saveErr)}`,\n );\n sendJson(\n res,\n { ok: false, error: \"Disconnected but failed to save config\" },\n 500,\n );\n return true;\n }\n\n delete process.env.ELIZAOS_CLOUD_API_KEY;\n delete process.env.ELIZAOS_CLOUD_ENABLED;\n\n if (state.runtime) {\n const character = state.runtime.character ?? {};\n state.runtime.character = character;\n if (!character.secrets) {\n character.secrets = {};\n }\n const secrets = character.secrets as Record<\n string,\n string | number | boolean\n >;\n delete secrets.ELIZAOS_CLOUD_API_KEY;\n delete secrets.ELIZAOS_CLOUD_ENABLED;\n if (typeof state.runtime.updateAgent === \"function\") {\n await state.runtime.updateAgent(state.runtime.agentId, {\n secrets: { ...secrets },\n });\n } else {\n logger.warn(\n \"[cloud-disconnect] updateAgent not available — runtime secrets not persisted\",\n );\n }\n }\n\n sendJson(res, { ok: true, status: \"disconnected\" });\n return true;\n }\n\n return false;\n}\n",
|
|
18
|
+
"/**\n * Sealed in-process secret store for cloud credentials.\n *\n * The implementation moved to `@elizaos/shared/elizacloud/cloud-secrets` so\n * app-core and other host-layer packages can read sealed cloud secrets without\n * reverse-importing this plugin. This module remains for backwards\n * compatibility with plugin-internal callers.\n */\nexport {\n clearCloudSecrets,\n getCloudSecret,\n scrubCloudSecretsFromEnv,\n _resetCloudSecretsForTesting,\n} from \"@elizaos/shared\";\n",
|
|
19
|
+
"import {\n isCloudInferenceSelectedInConfig,\n isElizaSettingsDebugEnabled,\n migrateLegacyRuntimeConfig,\n settingsDebugCloudSummary,\n} from \"@elizaos/core\";\nimport { resolveCloudApiBaseUrl as resolveCanonicalCloudApiBaseUrl } from \"../cloud/base-url.js\";\nimport { validateCloudBaseUrl } from \"../cloud/validate-url.js\";\nimport type { AgentRuntime } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport {\n applyCanonicalSetupConfig,\n type ElizaConfig,\n normalizeEnvValue,\n} from \"./config-like\";\nimport {\n clearCloudSecrets,\n getCloudSecret,\n scrubCloudSecretsFromEnv,\n} from \"./cloud-secrets\";\n\nconst DEFAULT_CLOUD_API_BASE_URL = \"https://www.elizacloud.ai/api/v1\";\nexport const CLOUD_BILLING_URL =\n \"https://www.elizacloud.ai/dashboard/settings?tab=billing\";\n\nconst CLOUD_ENV_KEYS = [\n \"ELIZAOS_CLOUD_API_KEY\",\n \"ELIZAOS_CLOUD_ENABLED\",\n \"ELIZAOS_CLOUD_BASE_URL\",\n \"ELIZAOS_CLOUD_NANO_MODEL\",\n \"ELIZAOS_CLOUD_MEDIUM_MODEL\",\n \"ELIZAOS_CLOUD_SMALL_MODEL\",\n \"ELIZAOS_CLOUD_LARGE_MODEL\",\n \"ELIZAOS_CLOUD_MEGA_MODEL\",\n \"ELIZAOS_CLOUD_RESPONSE_HANDLER_MODEL\",\n \"ELIZAOS_CLOUD_SHOULD_RESPOND_MODEL\",\n \"ELIZAOS_CLOUD_ACTION_PLANNER_MODEL\",\n \"ELIZAOS_CLOUD_PLANNER_MODEL\",\n \"ELIZAOS_CLOUD_USE_INFERENCE\",\n \"ELIZAOS_CLOUD_USE_TTS\",\n \"ELIZAOS_CLOUD_USE_MEDIA\",\n \"ELIZAOS_CLOUD_USE_EMBEDDINGS\",\n \"ELIZAOS_CLOUD_USE_RPC\",\n] as const;\n\nconst CLOUD_RUNTIME_SECRET_KEYS = [\n \"ELIZAOS_CLOUD_API_KEY\",\n \"ELIZAOS_CLOUD_ENABLED\",\n \"ELIZAOS_CLOUD_BASE_URL\",\n \"ELIZAOS_CLOUD_NANO_MODEL\",\n \"ELIZAOS_CLOUD_MEDIUM_MODEL\",\n \"ELIZAOS_CLOUD_SMALL_MODEL\",\n \"ELIZAOS_CLOUD_LARGE_MODEL\",\n \"ELIZAOS_CLOUD_MEGA_MODEL\",\n \"ELIZAOS_CLOUD_RESPONSE_HANDLER_MODEL\",\n \"ELIZAOS_CLOUD_SHOULD_RESPOND_MODEL\",\n \"ELIZAOS_CLOUD_ACTION_PLANNER_MODEL\",\n \"ELIZAOS_CLOUD_PLANNER_MODEL\",\n \"ELIZA_CLOUD_AUTH_TOKEN\",\n \"ELIZA_CLOUD_USER_ID\",\n \"ELIZA_CLOUD_ORGANIZATION_ID\",\n] as const;\n\nconst CLOUD_RUNTIME_SETTING_KEYS = [\n \"ELIZA_CLOUD_AUTH_TOKEN\",\n \"ELIZA_CLOUD_USER_ID\",\n \"ELIZA_CLOUD_ORGANIZATION_ID\",\n] as const;\n\nconst CLOUD_AUTH_CLEAR_METHODS = [\n \"disconnect\",\n \"logout\",\n \"signOut\",\n \"signout\",\n \"clearSession\",\n \"clearAuth\",\n \"resetAuth\",\n \"reset\",\n] as const;\n\ntype CloudClientLike = {\n get?: (path: string) => Promise<unknown>;\n};\n\nexport type CloudAuthLike = {\n authenticateWithApiKey?: (input: {\n apiKey: string;\n organizationId?: string;\n userId?: string;\n }) => unknown;\n isAuthenticated?: () => boolean;\n getUserId?: () => string | undefined;\n getOrganizationId?: () => string | undefined;\n getClient?: () => CloudClientLike | null;\n} & Partial<\n Record<\n (typeof CLOUD_AUTH_CLEAR_METHODS)[number],\n (() => Promise<unknown>) | (() => unknown)\n >\n>;\n\nexport type RuntimeCloudLike = AgentRuntime & {\n agentId: string;\n character: {\n secrets?: Record<string, string | number | boolean>;\n settings?: Record<string, unknown>;\n };\n updateAgent?: (\n agentId: string,\n update: { secrets: Record<string, string | number | boolean> },\n ) => Promise<unknown>;\n setSetting?: (key: string, value: string | null) => unknown;\n getService?: (name: string) => unknown;\n};\n\ntype CloudManagerLike = {\n disconnect?: () => Promise<void>;\n} | null;\n\nexport type CloudConnectionSnapshot = {\n apiKey: string | undefined;\n authConnected: boolean;\n cloudAuth: CloudAuthLike | null;\n connected: boolean;\n enabled: boolean;\n hasApiKey: boolean;\n organizationId: string | undefined;\n userId: string | undefined;\n};\n\ntype CloudCreditsResponse = {\n balance: number | null;\n connected: boolean;\n authRejected?: boolean;\n critical?: boolean;\n error?: string;\n low?: boolean;\n topUpUrl?: string;\n};\n\n/** Thrown when the credits endpoint returns 401 — same credential path as chat completions. */\nexport class CloudCreditsAuthRejectedError extends Error {\n override readonly name = \"CloudCreditsAuthRejectedError\";\n constructor(message = \"Eliza Cloud API key was rejected\") {\n super(message);\n }\n}\n\nfunction cloudCreditsHttpErrorMessage(\n status: number,\n creditResponse: { error?: unknown },\n): string {\n const err = creditResponse.error;\n if (typeof err === \"string\" && err.trim()) {\n return err.trim();\n }\n if (err && typeof err === \"object\" && \"message\" in err) {\n const msg = (err as { message?: unknown }).message;\n if (typeof msg === \"string\" && msg.trim()) {\n return msg.trim();\n }\n }\n return `HTTP ${status}`;\n}\n\nfunction asRuntimeCloud(runtime: AgentRuntime | null): RuntimeCloudLike | null {\n return runtime as RuntimeCloudLike | null;\n}\n\nexport function getCloudAuth(\n runtime: AgentRuntime | null,\n): CloudAuthLike | null {\n const runtimeWithServices = asRuntimeCloud(runtime);\n if (typeof runtimeWithServices?.getService !== \"function\") {\n return null;\n }\n\n const service = runtimeWithServices.getService(\"CLOUD_AUTH\");\n return service && typeof service === \"object\"\n ? (service as CloudAuthLike)\n : null;\n}\n\nfunction resolvePersistedCloudIdentity(runtime: AgentRuntime | null): {\n organizationId: string | undefined;\n userId: string | undefined;\n} {\n const runtimeWithCloud = asRuntimeCloud(runtime);\n return {\n organizationId:\n normalizeEnvValue(\n runtimeWithCloud?.getSetting?.(\"ELIZA_CLOUD_ORGANIZATION_ID\") as\n | string\n | undefined,\n ) ??\n normalizeEnvValue(\n runtimeWithCloud?.character?.secrets?.ELIZA_CLOUD_ORGANIZATION_ID as\n | string\n | undefined,\n ),\n userId:\n normalizeEnvValue(\n runtimeWithCloud?.getSetting?.(\"ELIZA_CLOUD_USER_ID\") as\n | string\n | undefined,\n ) ??\n normalizeEnvValue(\n runtimeWithCloud?.character?.secrets?.ELIZA_CLOUD_USER_ID as\n | string\n | undefined,\n ),\n };\n}\n\nexport function resolveCloudApiBaseUrl(rawBaseUrl?: string): string {\n return (\n resolveCanonicalCloudApiBaseUrl(rawBaseUrl ?? DEFAULT_CLOUD_API_BASE_URL) ??\n DEFAULT_CLOUD_API_BASE_URL\n );\n}\n\nexport function resolveCloudApiKey(\n config: Pick<ElizaConfig, \"cloud\"> | Record<string, unknown>,\n runtime?: {\n character?: { secrets?: Record<string, unknown> };\n getSetting?: (key: string) => unknown;\n } | null,\n): string | undefined {\n migrateLegacyRuntimeConfig(config as Record<string, unknown>);\n // 1. Config file (disk)\n const configApiKey = normalizeEnvValue(\n (config as { cloud?: { apiKey?: string } }).cloud?.apiKey,\n );\n if (configApiKey) return configApiKey;\n\n if (!isCloudInferenceSelectedInConfig(config as Record<string, unknown>)) {\n // A linked cloud account is represented by the persisted disk key above.\n // Do not resurrect cloud from sealed/env/runtime fallbacks when the\n // canonical connection is local, remote, or unset.\n return undefined;\n }\n\n // 2. Sealed in-process secret store\n const sealedKey = normalizeEnvValue(getCloudSecret(\"ELIZAOS_CLOUD_API_KEY\"));\n if (sealedKey) return sealedKey;\n\n // 3. Process environment (may not be scrubbed yet)\n const envKey = normalizeEnvValue(process.env.ELIZAOS_CLOUD_API_KEY);\n if (envKey) return envKey;\n\n // 4. Runtime settings (persisted in database, survives restarts)\n const runtimeSettingKey = normalizeEnvValue(\n runtime?.getSetting?.(\"ELIZAOS_CLOUD_API_KEY\") as string | undefined,\n );\n if (runtimeSettingKey) return runtimeSettingKey;\n\n // 5. Runtime character secrets (persisted in database, survives restarts)\n const runtimeKey = normalizeEnvValue(\n runtime?.character?.secrets?.ELIZAOS_CLOUD_API_KEY as string | undefined,\n );\n if (runtimeKey) return runtimeKey;\n\n return undefined;\n}\n\nexport function resolveCloudConnectionSnapshot(\n config: Partial<ElizaConfig>,\n runtime: AgentRuntime | null,\n): CloudConnectionSnapshot {\n migrateLegacyRuntimeConfig(config as Record<string, unknown>);\n const _cloudRecord =\n config.cloud && typeof config.cloud === \"object\"\n ? (config.cloud as Record<string, unknown>)\n : undefined;\n const enabled = isCloudInferenceSelectedInConfig(\n config as Record<string, unknown>,\n );\n const apiKey = resolveCloudApiKey(config, runtime);\n const cloudAuth = getCloudAuth(runtime);\n const authConnected = Boolean(cloudAuth?.isAuthenticated?.());\n const hasApiKey = Boolean(apiKey);\n const persistedIdentity = resolvePersistedCloudIdentity(runtime);\n const shouldExposeIdentity = authConnected || hasApiKey;\n\n return {\n apiKey,\n authConnected,\n cloudAuth,\n connected: authConnected || hasApiKey,\n enabled,\n hasApiKey,\n organizationId: shouldExposeIdentity\n ? (normalizeEnvValue(cloudAuth?.getOrganizationId?.()) ??\n persistedIdentity.organizationId)\n : undefined,\n userId: shouldExposeIdentity\n ? (normalizeEnvValue(cloudAuth?.getUserId?.()) ??\n persistedIdentity.userId)\n : undefined,\n };\n}\n\n/**\n * Coerce an Eliza Cloud `balance` field into a number. The cloud API\n * returns `balance` as `string | number` (per the Bridge client + config\n * type definitions) — string when the upstream is using a fixed-precision\n * decimal, number when it's been arithmetic'd. Treat both as the same\n * dollar amount; reject anything else as an unexpected response.\n */\nfunction coerceCloudBalance(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!trimmed) return null;\n const parsed = Number.parseFloat(trimmed);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nasync function fetchCloudCreditsByApiKey(\n baseUrl: string,\n apiKey: string,\n): Promise<number | null> {\n const response = await fetch(`${baseUrl}/credits/balance`, {\n headers: {\n Accept: \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n redirect: \"manual\",\n signal: AbortSignal.timeout(10_000),\n });\n\n if (response.status >= 300 && response.status < 400) {\n throw new Error(\n \"Cloud credits request was redirected; redirects are not allowed\",\n );\n }\n\n const creditResponse = (await response.json().catch((err: unknown) => {\n console.warn(\n \"[cloud-connection] Failed to parse credit balance response JSON:\",\n err,\n );\n return {};\n })) as {\n balance?: unknown;\n data?: { balance?: unknown };\n error?: unknown;\n };\n\n if (response.status === 401) {\n throw new CloudCreditsAuthRejectedError(\n cloudCreditsHttpErrorMessage(401, creditResponse),\n );\n }\n\n if (!response.ok) {\n throw new Error(\n cloudCreditsHttpErrorMessage(response.status, creditResponse),\n );\n }\n\n const balance =\n coerceCloudBalance(creditResponse.balance) ??\n coerceCloudBalance(creditResponse.data?.balance);\n\n return balance;\n}\n\n/** Configurable credit thresholds. Override via env vars if defaults don't fit. */\nconst CREDIT_LOW_THRESHOLD = Number(\n process.env.ELIZA_CREDIT_LOW_THRESHOLD ?? \"2.0\",\n);\nconst CREDIT_CRITICAL_THRESHOLD = Number(\n process.env.ELIZA_CREDIT_CRITICAL_THRESHOLD ?? \"0.5\",\n);\n\nfunction withCreditFlags(balance: number): CloudCreditsResponse {\n return {\n connected: true,\n balance,\n low: balance < CREDIT_LOW_THRESHOLD,\n critical: balance < CREDIT_CRITICAL_THRESHOLD,\n topUpUrl: CLOUD_BILLING_URL,\n };\n}\n\nexport async function fetchCloudCredits(\n config: Partial<ElizaConfig>,\n runtime: AgentRuntime | null,\n): Promise<CloudCreditsResponse> {\n const snapshot = resolveCloudConnectionSnapshot(config, runtime);\n let authenticatedFailure: string | null = null;\n let authenticatedUnexpectedResponse = false;\n\n if (!snapshot.connected) {\n return { balance: null, connected: false };\n }\n\n const cloudClient = snapshot.cloudAuth?.getClient?.();\n if (snapshot.authConnected && typeof cloudClient?.get === \"function\") {\n try {\n const creditResponse = (await cloudClient.get(\"/credits/balance\")) as {\n balance?: unknown;\n data?: { balance?: unknown };\n };\n const rawBalance =\n coerceCloudBalance(creditResponse?.balance) ??\n coerceCloudBalance(creditResponse?.data?.balance);\n\n if (typeof rawBalance === \"number\") {\n return withCreditFlags(rawBalance);\n }\n\n authenticatedUnexpectedResponse = true;\n logger.debug(\n `[cloud/credits] Unexpected authenticated response shape: ${JSON.stringify(creditResponse)}`,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"cloud API unreachable\";\n authenticatedFailure = msg;\n logger.debug(\n `[cloud/credits] Authenticated balance fetch failed: ${msg}`,\n );\n }\n }\n\n if (!snapshot.apiKey) {\n return {\n balance: null,\n connected: snapshot.connected,\n error:\n authenticatedFailure ??\n (authenticatedUnexpectedResponse\n ? \"unexpected response\"\n : \"missing cloud api key\"),\n };\n }\n\n const resolvedBaseUrl = resolveCloudApiBaseUrl(config.cloud?.baseUrl);\n const baseUrlRejection = await validateCloudBaseUrl(resolvedBaseUrl);\n if (baseUrlRejection) {\n return {\n balance: null,\n connected: true,\n error: baseUrlRejection,\n };\n }\n\n try {\n const balance = await fetchCloudCreditsByApiKey(\n resolvedBaseUrl,\n snapshot.apiKey,\n );\n\n if (typeof balance !== \"number\") {\n return {\n balance: null,\n connected: true,\n error: \"unexpected response\",\n };\n }\n\n return withCreditFlags(balance);\n } catch (err) {\n if (err instanceof CloudCreditsAuthRejectedError) {\n logger.debug(`[cloud/credits] API key rejected: ${err.message}`);\n return {\n balance: null,\n connected: true,\n authRejected: true,\n error: err.message,\n topUpUrl: CLOUD_BILLING_URL,\n };\n }\n const msg = err instanceof Error ? err.message : \"cloud API unreachable\";\n logger.debug(`[cloud/credits] Failed to fetch balance via API key: ${msg}`);\n return {\n balance: null,\n connected: true,\n error: msg,\n };\n }\n}\n\nexport async function clearCloudAuthService(\n cloudAuth: CloudAuthLike | null,\n): Promise<void> {\n if (!cloudAuth) {\n return;\n }\n\n const seen = new Set<(...args: never[]) => unknown>();\n for (const methodName of CLOUD_AUTH_CLEAR_METHODS) {\n const method = cloudAuth[methodName];\n if (typeof method !== \"function\" || seen.has(method)) {\n continue;\n }\n\n seen.add(method);\n try {\n await method.call(cloudAuth);\n // First successful clear method is sufficient — stop trying remaining ones.\n break;\n } catch (err) {\n logger.warn(\n `[cloud/disconnect] Failed to invoke CLOUD_AUTH.${methodName}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n }\n}\n\nfunction clearCloudEnv(): void {\n for (const key of CLOUD_ENV_KEYS) {\n delete process.env[key];\n }\n clearCloudSecrets();\n scrubCloudSecretsFromEnv();\n}\n\nasync function clearRuntimeCloudState(\n runtime: AgentRuntime | null,\n): Promise<void> {\n const runtimeWithCloud = asRuntimeCloud(runtime);\n if (!runtimeWithCloud) {\n return;\n }\n\n const existingSecrets = runtimeWithCloud.character.secrets ?? {};\n const nextSecrets = { ...existingSecrets };\n for (const key of CLOUD_RUNTIME_SECRET_KEYS) {\n delete nextSecrets[key];\n }\n runtimeWithCloud.character.secrets = nextSecrets;\n\n if (\n runtimeWithCloud.character.settings &&\n typeof runtimeWithCloud.character.settings === \"object\"\n ) {\n for (const key of CLOUD_RUNTIME_SETTING_KEYS) {\n delete runtimeWithCloud.character.settings[key];\n }\n }\n\n if (typeof runtimeWithCloud.setSetting === \"function\") {\n for (const key of CLOUD_RUNTIME_SETTING_KEYS) {\n try {\n runtimeWithCloud.setSetting(key, null);\n } catch (err) {\n logger.warn(\n `[cloud/disconnect] Failed to clear runtime setting ${key}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n }\n }\n\n if (typeof runtimeWithCloud.updateAgent === \"function\") {\n try {\n await runtimeWithCloud.updateAgent(runtimeWithCloud.agentId, {\n secrets: { ...nextSecrets },\n });\n } catch (err) {\n logger.warn(\n `[cloud/disconnect] Failed to clear cloud secrets from agent DB: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n }\n}\n\nexport async function disconnectCloudConnection(args: {\n cloudManager?: CloudManagerLike;\n config: Partial<ElizaConfig>;\n runtime: AgentRuntime | null;\n saveConfig?: (config: Partial<ElizaConfig>) => void;\n}): Promise<void> {\n const { cloudManager = null, config, runtime, saveConfig } = args;\n\n if (isElizaSettingsDebugEnabled()) {\n const c = config.cloud as Record<string, unknown> | undefined;\n logger.debug(\n `[eliza][settings][cloud] disconnectCloudConnection start cloud=${JSON.stringify(settingsDebugCloudSummary(c))}`,\n );\n }\n\n if (typeof cloudManager?.disconnect === \"function\") {\n try {\n await cloudManager.disconnect();\n } catch (err) {\n logger.warn(\n `[cloud/disconnect] Failed to disconnect cloud manager: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n }\n\n await clearCloudAuthService(getCloudAuth(runtime));\n\n const nextCloud = { ...(config.cloud ?? {}) };\n delete nextCloud.apiKey;\n config.cloud = nextCloud;\n applyCanonicalSetupConfig(config as ElizaConfig, {\n deploymentTarget: { runtime: \"local\" },\n linkedAccounts: {\n elizacloud: {\n status: \"unlinked\",\n source: \"api-key\",\n },\n },\n clearRoutes: [\"llmText\", \"tts\", \"media\", \"embeddings\", \"rpc\"],\n });\n migrateLegacyRuntimeConfig(config as Record<string, unknown>);\n\n try {\n saveConfig?.(config);\n if (isElizaSettingsDebugEnabled()) {\n const c = config.cloud as Record<string, unknown> | undefined;\n logger.debug(\n `[eliza][settings][cloud] disconnectCloudConnection saveConfig OK cloud=${JSON.stringify(settingsDebugCloudSummary(c))}`,\n );\n }\n } catch (err) {\n logger.warn(\n `[cloud/disconnect] Failed to save cloud disconnect state: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n\n clearCloudEnv();\n await clearRuntimeCloudState(runtime);\n\n if (isElizaSettingsDebugEnabled()) {\n logger.debug(\n \"[eliza][settings][cloud] disconnectCloudConnection done (env cleared + runtime cloud state cleared)\",\n );\n }\n}\n\n/** Matches `reason` from GET /api/cloud/status when connected via API key without CLOUD_AUTH. */\nconst CLOUD_STATUS_API_KEY_ONLY_REASONS: ReadonlySet<string> = new Set([\n \"api_key_present_not_authenticated\",\n \"api_key_present_runtime_not_started\",\n]);\n\nexport function isCloudStatusReasonApiKeyOnly(\n reason: string | null | undefined,\n): boolean {\n return (\n typeof reason === \"string\" && CLOUD_STATUS_API_KEY_ONLY_REASONS.has(reason)\n );\n}\n",
|
|
20
|
+
"import type {\n CloudConfigLike,\n CloudStatusRouteContext,\n} from \"./cloud-status-routes-autonomous.js\";\nimport type { ElizaConfig } from \"../lib/config-like\";\nimport { isElizaCloudServiceSelectedInConfig } from \"@elizaos/core\";\nimport {\n CLOUD_BILLING_URL,\n fetchCloudCredits,\n resolveCloudConnectionSnapshot,\n} from \"../lib/cloud-connection\";\n\nexport type { CloudConfigLike, CloudStatusRouteContext };\n\nexport async function handleCloudStatusRoutes(\n ctx: CloudStatusRouteContext,\n): Promise<boolean> {\n const { res, method, pathname, config, runtime, json } = ctx;\n const typedConfig = config as ElizaConfig;\n\n if (method === \"GET\" && pathname === \"/api/cloud/status\") {\n const snapshot = resolveCloudConnectionSnapshot(typedConfig, runtime);\n const cloudVoiceProxyAvailable = isElizaCloudServiceSelectedInConfig(\n typedConfig as Record<string, unknown>,\n \"tts\",\n );\n\n if (snapshot.connected) {\n json(res, {\n connected: true,\n enabled: snapshot.enabled,\n cloudVoiceProxyAvailable,\n hasApiKey: snapshot.hasApiKey,\n userId: snapshot.userId,\n organizationId: snapshot.organizationId,\n topUpUrl: CLOUD_BILLING_URL,\n reason: snapshot.authConnected\n ? undefined\n : runtime\n ? \"api_key_present_not_authenticated\"\n : \"api_key_present_runtime_not_started\",\n });\n return true;\n }\n\n if (!runtime) {\n json(res, {\n connected: false,\n enabled: snapshot.enabled,\n cloudVoiceProxyAvailable,\n hasApiKey: snapshot.hasApiKey,\n reason: \"runtime_not_started\",\n });\n return true;\n }\n\n json(res, {\n connected: false,\n enabled: snapshot.enabled,\n cloudVoiceProxyAvailable,\n hasApiKey: snapshot.hasApiKey,\n reason: \"not_authenticated\",\n });\n return true;\n }\n\n if (method === \"GET\" && pathname === \"/api/cloud/credits\") {\n json(res, await fetchCloudCredits(typedConfig, runtime));\n return true;\n }\n\n return false;\n}\n",
|
|
21
|
+
"import type http from \"node:http\";\nimport {\n PromoteVfsToCloudContainerRequestSchema,\n RequestCodingAgentContainerRequestSchema,\n SyncCloudCodingContainerRequestSchema,\n} from \"@elizaos/shared\";\nimport type {\n PromoteVfsToCloudContainerRequest,\n PromoteVfsToCloudContainerResponse,\n RequestCodingAgentContainerRequest,\n RequestCodingAgentContainerResponse,\n SyncCloudCodingContainerRequest,\n SyncCloudCodingContainerResponse,\n} from \"../types/cloud\";\nimport { sendJson, sendJsonError } from \"../lib/http\";\n\nexport interface CloudCodingContainerRouteState {\n runtime: {\n getService?: (name: string) => unknown;\n } | null;\n}\n\ninterface CodingContainerServiceLike {\n promoteVfsToCloudContainer(\n request: PromoteVfsToCloudContainerRequest,\n ): Promise<PromoteVfsToCloudContainerResponse>;\n requestCodingAgentContainer(\n request: RequestCodingAgentContainerRequest,\n ): Promise<RequestCodingAgentContainerResponse>;\n syncCodingContainerChanges(\n containerId: string,\n request: SyncCloudCodingContainerRequest,\n ): Promise<SyncCloudCodingContainerResponse>;\n}\n\nexport async function handleCloudCodingContainerRoute(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string,\n method: string,\n state: CloudCodingContainerRouteState,\n): Promise<boolean> {\n if (\n method === \"POST\" &&\n pathname === \"/api/cloud/coding-containers/promotions\"\n ) {\n const service = getCloudContainerService(state);\n if (!service) {\n sendJsonError(res, \"Cloud container service is not available\", 503);\n return true;\n }\n const body = await readJsonBody(req, res);\n if (!body) return true;\n const parsed = PromoteVfsToCloudContainerRequestSchema.safeParse(body);\n if (!parsed.success) {\n sendJsonError(\n res,\n parsed.error.issues[0]?.message ?? \"Invalid promotion request\",\n 400,\n );\n return true;\n }\n await sendServiceResponse(res, () =>\n service.promoteVfsToCloudContainer(\n parsed.data as PromoteVfsToCloudContainerRequest,\n ),\n );\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/cloud/coding-containers\") {\n const service = getCloudContainerService(state);\n if (!service) {\n sendJsonError(res, \"Cloud container service is not available\", 503);\n return true;\n }\n const body = await readJsonBody(req, res);\n if (!body) return true;\n const parsed = RequestCodingAgentContainerRequestSchema.safeParse(body);\n if (!parsed.success) {\n sendJsonError(\n res,\n parsed.error.issues[0]?.message ?? \"Invalid coding container request\",\n 400,\n );\n return true;\n }\n await sendServiceResponse(res, () =>\n service.requestCodingAgentContainer(\n parsed.data as RequestCodingAgentContainerRequest,\n ),\n );\n return true;\n }\n\n const syncMatch = /^\\/api\\/cloud\\/coding-containers\\/([^/]+)\\/sync$/.exec(\n pathname,\n );\n if (method === \"POST\" && syncMatch) {\n const service = getCloudContainerService(state);\n if (!service) {\n sendJsonError(res, \"Cloud container service is not available\", 503);\n return true;\n }\n const containerId = decodeURIComponent(syncMatch[1]);\n const body = await readJsonBody(req, res);\n if (!body) return true;\n const parsed = SyncCloudCodingContainerRequestSchema.safeParse(body);\n if (!parsed.success) {\n sendJsonError(\n res,\n parsed.error.issues[0]?.message ?? \"Invalid sync request\",\n 400,\n );\n return true;\n }\n await sendServiceResponse(res, () =>\n service.syncCodingContainerChanges(\n containerId,\n parsed.data as SyncCloudCodingContainerRequest,\n ),\n );\n return true;\n }\n\n return false;\n}\n\nfunction getCloudContainerService(\n state: CloudCodingContainerRouteState,\n): CodingContainerServiceLike | null {\n const service =\n state.runtime?.getService?.(\"CLOUD_CONTAINER\") ??\n state.runtime?.getService?.(\"cloud-container\") ??\n state.runtime?.getService?.(\"cloudContainer\");\n if (!service || typeof service !== \"object\") return null;\n const candidate = service as Partial<CodingContainerServiceLike>;\n if (\n typeof candidate.promoteVfsToCloudContainer === \"function\" &&\n typeof candidate.requestCodingAgentContainer === \"function\" &&\n typeof candidate.syncCodingContainerChanges === \"function\"\n ) {\n return candidate as CodingContainerServiceLike;\n }\n return null;\n}\n\nasync function readJsonBody(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n): Promise<Record<string, unknown> | null> {\n const preParsed = (req as http.IncomingMessage & { body?: unknown }).body;\n if (\n preParsed &&\n typeof preParsed === \"object\" &&\n !Array.isArray(preParsed)\n ) {\n return preParsed as Record<string, unknown>;\n }\n\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n }\n const raw = Buffer.concat(chunks).toString(\"utf8\").trim();\n if (!raw) return {};\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw) as unknown;\n } catch {\n sendJsonError(res, \"Invalid JSON body\", 400);\n return null;\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n sendJsonError(res, \"Invalid JSON body\", 400);\n return null;\n }\n return parsed as Record<string, unknown>;\n}\n\nasync function sendServiceResponse(\n res: http.ServerResponse,\n fn: () => Promise<unknown>,\n): Promise<void> {\n try {\n sendJson(res, await fn());\n } catch (error) {\n const status =\n typeof (error as { statusCode?: unknown })?.statusCode === \"number\"\n ? (error as { statusCode: number }).statusCode\n : 500;\n sendJsonError(\n res,\n error instanceof Error ? error.message : String(error),\n status,\n );\n }\n}\n",
|
|
22
|
+
"import type http from \"node:http\";\nimport {\n isCloudInferenceSelectedInConfig,\n migrateLegacyRuntimeConfig,\n} from \"@elizaos/core\";\nimport { type CloudRouteState as AutonomousCloudRouteState, handleCloudRoute as handleAutonomousCloudRoute, } from \"./cloud-routes-autonomous.js\";\nimport {\n buildHomeRemoteRunnerAccessUrl,\n buildHomeRemoteRunnerSshTunnel,\n} from \"./home-remote-runner-access-url\";\nimport { normalizeCloudSiteUrl } from \"../cloud/base-url.js\";\nimport type { CloudManager } from \"../cloud/cloud-manager.js\";\nimport { validateCloudBaseUrl } from \"../cloud/validate-url.js\";\nimport { type AgentRuntime, logger } from \"@elizaos/core\";\nimport { handleCloudCodingContainerRoute } from \"./cloud-coding-container-routes\";\nimport {\n clearCloudAuthService,\n disconnectCloudConnection,\n getCloudAuth,\n type RuntimeCloudLike,\n} from \"../lib/cloud-connection\";\nimport {\n clearCloudSecrets,\n scrubCloudSecretsFromEnv,\n} from \"../lib/cloud-secrets\";\nimport {\n applyCanonicalSetupConfig,\n type ElizaConfig,\n isTimeoutError,\n} from \"../lib/config-like\";\nimport { sendJson, sendJsonError } from \"../lib/http\";\n\nexport interface CloudRouteState {\n config: ElizaConfig;\n cloudManager: CloudManager | null;\n /** The running agent runtime — needed to persist cloud credentials to the DB. */\n runtime: AgentRuntime | null;\n restartRuntime?: (reason: string) => Promise<boolean> | boolean;\n services?: Partial<CloudRouteServices>;\n}\n\ntype CreateIntegrationTelemetrySpan = (meta: {\n boundary: \"cloud\";\n operation: string;\n timeoutMs?: number;\n}) => TelemetrySpan | null | undefined;\n\nexport interface CloudRouteServices {\n applyCanonicalSetupConfig: typeof applyCanonicalSetupConfig;\n createIntegrationTelemetrySpan: CreateIntegrationTelemetrySpan;\n handleAutonomousCloudRoute: typeof handleAutonomousCloudRoute;\n normalizeCloudSiteUrl: typeof normalizeCloudSiteUrl;\n saveElizaConfig: (config: ElizaConfig) => void;\n validateCloudBaseUrl: typeof validateCloudBaseUrl;\n}\n\ntype CloudRuntimeSecrets = Record<string, string | number | boolean>;\ntype ReplaceableCloudManager = NonNullable<CloudRouteState[\"cloudManager\"]> & {\n replaceApiKey?: (apiKey: string) => Promise<void>;\n};\ntype StartableCloudRelayService = {\n startRelayLoopIfReady?: () => boolean | Promise<boolean>;\n};\ntype RelayStatusService = {\n getSessionInfo?: () => {\n sessionId: string | null;\n organizationId: string | null;\n userId: string | null;\n agentName: string | null;\n platform: string | null;\n lastSeenAt: string | null;\n status: \"idle\" | \"registered\" | \"polling\" | \"error\" | \"stopped\";\n };\n};\n\nconst CLOUD_LOGIN_POLL_TIMEOUT_MS = 10_000;\nconst DEFAULT_CLOUD_ROUTE_SERVICES: CloudRouteServices = {\n applyCanonicalSetupConfig,\n createIntegrationTelemetrySpan: () => undefined,\n handleAutonomousCloudRoute,\n normalizeCloudSiteUrl,\n saveElizaConfig: () => {\n logger.warn(\"[cloud-routes] saveConfig unavailable - config not persisted\");\n },\n validateCloudBaseUrl,\n};\n\nasync function readRouteJsonBody(\n req: http.IncomingMessage,\n): Promise<Record<string, unknown>> {\n const preParsed = (req as http.IncomingMessage & { body?: unknown }).body;\n if (\n preParsed &&\n typeof preParsed === \"object\" &&\n !Array.isArray(preParsed)\n ) {\n return preParsed as Record<string, unknown>;\n }\n\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n }\n\n const rawBody = Buffer.concat(chunks).toString(\"utf8\").trim();\n if (!rawBody) {\n return {};\n }\n\n const parsed = JSON.parse(rawBody) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"Invalid JSON body\");\n }\n return parsed as Record<string, unknown>;\n}\n\n/**\n * Monotonic counter incremented on every `POST /api/cloud/disconnect`.\n *\n * WHY: We must not persist a stale \"authenticated\" poll after the user\n * disconnects mid-flight. The previous guard (`cloud.enabled === false`)\n * also matched **first-time** cloud (never enabled), so successful logins\n * were discarded. Comparing epoch before/after the poll preserves the race\n * fix without blocking legitimate first connect.\n */\nlet cloudDisconnectEpoch = 0;\n\ntype TelemetrySpan = {\n success: (meta?: Record<string, unknown>) => void;\n failure: (meta?: Record<string, unknown>) => void;\n};\n\nfunction isRedirectResponse(response: Response): boolean {\n return response.status >= 300 && response.status < 400;\n}\n\nfunction createNoopTelemetrySpan(): TelemetrySpan {\n return {\n success: () => {},\n failure: () => {},\n };\n}\n\nfunction getTelemetrySpan(meta: {\n boundary: \"cloud\";\n operation: string;\n timeoutMs: number;\n services: CloudRouteServices;\n}): TelemetrySpan {\n return (\n meta.services.createIntegrationTelemetrySpan(meta) ??\n createNoopTelemetrySpan()\n );\n}\n\nasync function fetchCloudLoginStatus(\n sessionId: string,\n baseUrl: string,\n): Promise<Response> {\n return fetch(\n `${baseUrl}/api/auth/cli-session/${encodeURIComponent(sessionId)}`,\n {\n redirect: \"manual\",\n signal: AbortSignal.timeout(CLOUD_LOGIN_POLL_TIMEOUT_MS),\n },\n );\n}\n\nasync function persistCloudLoginStatus(args: {\n apiKey: string;\n organizationId?: string;\n services: CloudRouteServices;\n state: CloudRouteState;\n userId?: string;\n /**\n * From GET `/api/cloud/login/status`: epoch captured before `fetch` so a\n * disconnect during the poll invalidates this result. Omitted for POST\n * `/api/cloud/login/persist` (direct client push) — no race window.\n */\n epochAtPollStart?: number;\n}): Promise<void> {\n if (\n args.epochAtPollStart !== undefined &&\n args.epochAtPollStart !== cloudDisconnectEpoch\n ) {\n logger.warn(\n \"[cloud-login] Skipping login persist: a disconnect occurred while the login poll was in-flight\",\n );\n return;\n }\n\n migrateLegacyRuntimeConfig(args.state.config as Record<string, unknown>);\n const runtime = args.state.runtime as RuntimeCloudLike | null;\n const cloudAuth = getCloudAuth(runtime);\n await clearCloudAuthService(cloudAuth);\n\n const cloud = { ...(args.state.config.cloud ?? {}) } as Record<\n string,\n unknown\n >;\n\n cloud.apiKey = args.apiKey;\n const cloudInferenceSelected = isCloudInferenceSelectedInConfig(\n args.state.config as Record<string, unknown>,\n );\n\n args.state.config.cloud = cloud as ElizaConfig[\"cloud\"];\n args.services.applyCanonicalSetupConfig(args.state.config, {\n linkedAccounts: {\n elizacloud: {\n status: \"linked\",\n source: \"api-key\",\n },\n },\n });\n migrateLegacyRuntimeConfig(args.state.config as Record<string, unknown>);\n\n try {\n args.services.saveElizaConfig(args.state.config);\n logger.info(\"[cloud-login] Saved cloud API key to config file\");\n logger.warn(\n \"[cloud-login] Cloud API key is stored in cleartext in ~/.eliza/eliza.json. \" +\n \"Ensure this file has restrictive permissions (chmod 600).\",\n );\n } catch (saveErr) {\n logger.error(\n `[cloud-login] Failed to save cloud API key to config: ${\n saveErr instanceof Error ? saveErr.message : String(saveErr)\n }`,\n );\n }\n\n clearCloudSecrets();\n process.env.ELIZAOS_CLOUD_API_KEY = args.apiKey;\n if (cloudInferenceSelected) {\n process.env.ELIZAOS_CLOUD_ENABLED = \"true\";\n } else {\n delete process.env.ELIZAOS_CLOUD_ENABLED;\n }\n scrubCloudSecretsFromEnv();\n\n const cloudManager = args.state\n .cloudManager as ReplaceableCloudManager | null;\n if (cloudManager && typeof cloudManager.replaceApiKey === \"function\") {\n await cloudManager.replaceApiKey(args.apiKey);\n } else if (\n cloudManager &&\n !cloudManager.getClient() &&\n typeof cloudManager.init === \"function\"\n ) {\n await cloudManager.init();\n }\n\n if (typeof cloudAuth?.authenticateWithApiKey === \"function\") {\n cloudAuth.authenticateWithApiKey({\n apiKey: args.apiKey,\n organizationId: args.organizationId,\n userId: args.userId,\n });\n }\n const relayService = (runtime?.getService(\"CLOUD_MANAGED_GATEWAY_RELAY\") ??\n runtime?.getService(\"cloud-managed-gateway-relay\") ??\n runtime?.getService(\n \"cloudManagedGatewayRelay\",\n )) as StartableCloudRelayService | null;\n if (typeof relayService?.startRelayLoopIfReady === \"function\") {\n await relayService.startRelayLoopIfReady();\n }\n\n if (!runtime || typeof runtime.updateAgent !== \"function\") {\n return;\n }\n\n try {\n const nextSecrets: CloudRuntimeSecrets = {\n ...(runtime.character.secrets ?? {}),\n ELIZAOS_CLOUD_API_KEY: args.apiKey,\n };\n if (args.userId) {\n nextSecrets.ELIZA_CLOUD_USER_ID = args.userId;\n nextSecrets.ELIZAOS_CLOUD_USER_ID = args.userId;\n } else {\n delete nextSecrets.ELIZA_CLOUD_USER_ID;\n delete nextSecrets.ELIZAOS_CLOUD_USER_ID;\n }\n if (args.organizationId) {\n nextSecrets.ELIZA_CLOUD_ORGANIZATION_ID = args.organizationId;\n nextSecrets.ELIZAOS_CLOUD_ORG_ID = args.organizationId;\n } else {\n delete nextSecrets.ELIZA_CLOUD_ORGANIZATION_ID;\n delete nextSecrets.ELIZAOS_CLOUD_ORG_ID;\n }\n if (cloudInferenceSelected) {\n nextSecrets.ELIZAOS_CLOUD_ENABLED = \"true\";\n } else {\n delete nextSecrets.ELIZAOS_CLOUD_ENABLED;\n }\n runtime.character.secrets = nextSecrets;\n if (typeof runtime.setSetting === \"function\") {\n runtime.setSetting(\"ELIZA_CLOUD_USER_ID\", args.userId ?? null);\n runtime.setSetting(\"ELIZAOS_CLOUD_USER_ID\", args.userId ?? null);\n runtime.setSetting(\n \"ELIZA_CLOUD_ORGANIZATION_ID\",\n args.organizationId ?? null,\n );\n runtime.setSetting(\"ELIZAOS_CLOUD_ORG_ID\", args.organizationId ?? null);\n }\n await runtime.updateAgent(runtime.agentId, {\n secrets: { ...nextSecrets },\n });\n } catch (err) {\n // Non-fatal: config/sealed secret persistence is enough for login continuity.\n logger.warn(\n `[cloud-routes] Failed to persist cloud secrets to agent DB: ${String(\n err,\n )}`,\n );\n }\n}\n\nfunction getCloudRouteServices(state: CloudRouteState): CloudRouteServices {\n return {\n ...DEFAULT_CLOUD_ROUTE_SERVICES,\n ...state.services,\n };\n}\n\nfunction readRuntimeSetting(\n runtime: AgentRuntime | null,\n key: string,\n): string | null {\n const value = runtime?.getSetting(key);\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n\nfunction toAutonomousState(\n state: CloudRouteState,\n services: CloudRouteServices,\n): AutonomousCloudRouteState {\n return {\n ...state,\n saveConfig: () => services.saveElizaConfig(state.config),\n createTelemetrySpan: services.createIntegrationTelemetrySpan,\n };\n}\n\nexport async function handleCloudRoute(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string,\n method: string,\n state: CloudRouteState,\n): Promise<boolean> {\n const services = getCloudRouteServices(state);\n\n const codingContainerHandled = await handleCloudCodingContainerRoute(\n req,\n res,\n pathname,\n method,\n { runtime: state.runtime },\n );\n if (codingContainerHandled) {\n return true;\n }\n\n if (method === \"GET\" && pathname === \"/api/cloud/relay-status\") {\n const relayService = (state.runtime?.getService(\n \"CLOUD_MANAGED_GATEWAY_RELAY\",\n ) ??\n state.runtime?.getService(\"cloud-managed-gateway-relay\") ??\n state.runtime?.getService(\n \"cloudManagedGatewayRelay\",\n )) as RelayStatusService | null;\n\n if (typeof relayService?.getSessionInfo !== \"function\") {\n sendJson(res, {\n available: false,\n status: \"not_registered\",\n reason:\n \"Gateway relay service not active. Connect to Eliza Cloud in Settings to enable instance routing.\",\n });\n return true;\n }\n\n try {\n const info = relayService.getSessionInfo();\n sendJson(res, {\n available: true,\n ...info,\n accessUrl: buildHomeRemoteRunnerAccessUrl({\n cloudBaseUrl: services.normalizeCloudSiteUrl(\n state.config.cloud?.baseUrl,\n ),\n sessionId: info.sessionId,\n }),\n ssh: buildHomeRemoteRunnerSshTunnel({\n remoteBaseUrl:\n readRuntimeSetting(state.runtime, \"ELIZA_HOME_REMOTE_RUNNER_URL\") ??\n process.env.ELIZA_HOME_REMOTE_RUNNER_URL ??\n readRuntimeSetting(state.runtime, \"ELIZA_HOME_RUNNER_URL\") ??\n process.env.ELIZA_HOME_RUNNER_URL,\n sshTarget:\n readRuntimeSetting(\n state.runtime,\n \"ELIZA_HOME_REMOTE_RUNNER_SSH_TARGET\",\n ) ??\n process.env.ELIZA_HOME_REMOTE_RUNNER_SSH_TARGET ??\n readRuntimeSetting(state.runtime, \"ELIZA_HOME_SSH_TARGET\") ??\n process.env.ELIZA_HOME_SSH_TARGET,\n sshIdentity:\n readRuntimeSetting(\n state.runtime,\n \"ELIZA_HOME_REMOTE_RUNNER_SSH_IDENTITY\",\n ) ??\n process.env.ELIZA_HOME_REMOTE_RUNNER_SSH_IDENTITY ??\n readRuntimeSetting(state.runtime, \"ELIZA_HOME_SSH_IDENTITY\") ??\n process.env.ELIZA_HOME_SSH_IDENTITY,\n localPort:\n readRuntimeSetting(\n state.runtime,\n \"ELIZA_HOME_REMOTE_RUNNER_SSH_LOCAL_PORT\",\n ) ?? process.env.ELIZA_HOME_REMOTE_RUNNER_SSH_LOCAL_PORT,\n }),\n });\n } catch (error) {\n sendJson(res, {\n available: false,\n status: \"error\",\n reason: error instanceof Error ? error.message : String(error),\n });\n }\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/cloud/disconnect\") {\n // Invalidate any in-flight login poll (see persistCloudLoginStatus).\n cloudDisconnectEpoch++;\n try {\n await disconnectCloudConnection({\n cloudManager: state.cloudManager,\n config: state.config,\n runtime: state.runtime,\n saveConfig: services.saveElizaConfig,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n logger.error(`[cloud/disconnect] failed: ${message}`);\n sendJson(res, { ok: false, error: message }, 500);\n return true;\n }\n sendJson(res, { ok: true, status: \"disconnected\" });\n return true;\n }\n\n // Direct-auth persistence: the frontend authenticated directly with Eliza\n // Cloud (bypassing the backend's login/status handler) and needs to push\n // the API key to the backend so billing/compat routes can authenticate.\n if (method === \"POST\" && pathname === \"/api/cloud/login/persist\") {\n try {\n const body = await readRouteJsonBody(req);\n if (typeof body.apiKey !== \"string\" || !body.apiKey.trim()) {\n sendJson(res, { ok: false, error: \"apiKey is required\" }, 400);\n return true;\n }\n await persistCloudLoginStatus({\n apiKey: body.apiKey.trim(),\n organizationId:\n typeof body.organizationId === \"string\"\n ? body.organizationId.trim()\n : undefined,\n services,\n state,\n userId:\n typeof body.userId === \"string\" ? body.userId.trim() : undefined,\n });\n sendJson(res, { ok: true });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.error(`[cloud/login/persist] Failed: ${msg}`);\n sendJson(res, { ok: false, error: msg }, 500);\n }\n return true;\n }\n\n if (method === \"GET\" && pathname.startsWith(\"/api/cloud/login/status\")) {\n const url = new URL(\n req.url ?? \"/\",\n `http://${req.headers.host ?? \"localhost\"}`,\n );\n const sessionId = url.searchParams.get(\"sessionId\");\n if (!sessionId) {\n sendJsonError(res, \"sessionId query parameter is required\", 400);\n return true;\n }\n\n const baseUrl = services.normalizeCloudSiteUrl(state.config.cloud?.baseUrl);\n const urlError = await services.validateCloudBaseUrl(baseUrl);\n if (urlError) {\n sendJsonError(res, urlError, 400);\n return true;\n }\n\n const epochBeforePoll = cloudDisconnectEpoch;\n\n const loginPollSpan = getTelemetrySpan({\n boundary: \"cloud\",\n operation: \"login_poll_status\",\n services,\n timeoutMs: CLOUD_LOGIN_POLL_TIMEOUT_MS,\n });\n\n let pollRes: Response;\n try {\n pollRes = await fetchCloudLoginStatus(sessionId, baseUrl);\n } catch (fetchErr) {\n if (isTimeoutError(fetchErr)) {\n loginPollSpan.failure({ error: fetchErr, statusCode: 504 });\n sendJson(res, {\n status: \"error\",\n error: \"Eliza Cloud status request timed out\",\n }, 504);\n return true;\n }\n\n loginPollSpan.failure({ error: fetchErr, statusCode: 502 });\n sendJson(res, {\n status: \"error\",\n error: \"Failed to reach Eliza Cloud\",\n }, 502);\n return true;\n }\n\n if (isRedirectResponse(pollRes)) {\n loginPollSpan.failure({\n statusCode: pollRes.status,\n errorKind: \"redirect_response\",\n });\n sendJson(res, {\n status: \"error\",\n error:\n \"Eliza Cloud status request was redirected; redirects are not allowed\",\n }, 502);\n return true;\n }\n\n if (!pollRes.ok) {\n loginPollSpan.failure({\n statusCode: pollRes.status,\n errorKind: \"http_error\",\n });\n sendJson(\n res,\n pollRes.status === 404\n ? { status: \"expired\", error: \"Session not found or expired\" }\n : {\n status: \"error\",\n error: `Eliza Cloud returned HTTP ${pollRes.status}`,\n },\n );\n return true;\n }\n\n let data: {\n apiKey?: unknown;\n keyPrefix?: unknown;\n organizationId?: unknown;\n status?: unknown;\n userId?: unknown;\n };\n try {\n data = (await pollRes.json()) as {\n apiKey?: unknown;\n keyPrefix?: unknown;\n organizationId?: unknown;\n status?: unknown;\n userId?: unknown;\n };\n } catch (parseErr) {\n loginPollSpan.failure({ error: parseErr, statusCode: pollRes.status });\n sendJson(res, {\n status: \"error\",\n error: \"Eliza Cloud returned invalid JSON\",\n }, 502);\n return true;\n }\n\n loginPollSpan.success({ statusCode: pollRes.status });\n\n if (data.status === \"authenticated\" && typeof data.apiKey === \"string\") {\n await persistCloudLoginStatus({\n apiKey: data.apiKey,\n organizationId:\n typeof data.organizationId === \"string\"\n ? data.organizationId\n : undefined,\n services,\n state,\n epochAtPollStart: epochBeforePoll,\n userId: typeof data.userId === \"string\" ? data.userId : undefined,\n });\n sendJson(res, {\n status: \"authenticated\",\n keyPrefix:\n typeof data.keyPrefix === \"string\" ? data.keyPrefix : undefined,\n organizationId:\n typeof data.organizationId === \"string\"\n ? data.organizationId\n : undefined,\n token: data.apiKey,\n userId: typeof data.userId === \"string\" ? data.userId : undefined,\n });\n return true;\n }\n\n sendJson(res, {\n status: typeof data.status === \"string\" ? data.status : \"error\",\n });\n return true;\n }\n\n const result = await services.handleAutonomousCloudRoute(\n req,\n res,\n pathname,\n method,\n toAutonomousState(state, services),\n );\n\n // The upstream handler writes secrets to process.env — scrub them\n // immediately so they don't leak to child processes or env dumps.\n scrubCloudSecretsFromEnv();\n\n return result;\n}\n",
|
|
23
|
+
"/**\n * Eliza Cloud route plugin — registers `/api/cloud/*` route handlers with the\n * elizaOS runtime plugin route system.\n *\n * All routes use `rawPath: true` to preserve the legacy `/api/cloud/*` paths\n * without a plugin-name prefix. This module is node-only — the main plugin\n * (services, actions, providers, model handlers) lives in `index.node.ts`\n * and is browser-safe; this `plugin.ts` is loaded only on the server via\n * `register-routes.ts`.\n *\n * Migrated from packages/app-core/src/api/cloud-routes.ts and\n * cloud-status-routes.ts. The login/persist, login/status and disconnect\n * paths each carry a small loopback-PUT that previously lived inline in\n * server.ts; that orchestration moved here so server.ts no longer needs\n * to import the cloud handlers directly.\n */\n\nimport type http from \"node:http\";\nimport { logger } from \"@elizaos/core\";\nimport type { Plugin, Route } from \"@elizaos/core\";\nimport { getRuntimeRouteHostContext } from \"@elizaos/core\";\nimport type { ElizaConfig } from \"./lib/config-like\";\nimport { sendJson } from \"./lib/http\";\nimport {\n type CloudBillingRouteState,\n handleCloudBillingRoute,\n} from \"./routes/cloud-billing-routes\";\nimport {\n type CloudRouteState,\n handleCloudRoute,\n} from \"./routes/cloud-routes\";\nimport { handleCloudStatusRoutes } from \"./routes/cloud-status-routes\";\n\ntype AnyRuntime = Parameters<typeof handleCloudStatusRoutes>[0][\"runtime\"];\n\nfunction getHostContext(runtime: unknown) {\n return getRuntimeRouteHostContext<Record<string, unknown>>(\n runtime && typeof runtime === \"object\" ? runtime : null,\n );\n}\n\nfunction getRuntimeConfig(runtime: unknown): ElizaConfig {\n return (getHostContext(runtime)?.config ?? {}) as ElizaConfig;\n}\n\nfunction makeStatusHandler() {\n return async (\n req: unknown,\n res: unknown,\n runtime: unknown,\n ): Promise<void> => {\n const httpReq = req as http.IncomingMessage;\n const httpRes = res as http.ServerResponse;\n const url = new URL(httpReq.url ?? \"/\", \"http://localhost\");\n const method = (httpReq.method ?? \"GET\").toUpperCase();\n const runtimeRef = runtime as AnyRuntime;\n const config = getRuntimeConfig(runtime);\n\n await handleCloudStatusRoutes({\n req: httpReq,\n res: httpRes,\n method,\n pathname: url.pathname,\n config,\n runtime: runtimeRef,\n json: (_res, body, status = 200) => {\n sendJson(httpRes, body, status);\n },\n });\n };\n}\n\n/**\n * Generic handler for the rest of `/api/cloud/*` (login, disconnect,\n * relay-status, …). Carries the post-dispatch loopback sync that\n * previously lived inline in server.ts.\n */\nfunction makeCloudRouteHandler() {\n return async (\n req: unknown,\n res: unknown,\n runtime: unknown,\n ): Promise<void> => {\n const httpReq = req as http.IncomingMessage;\n const httpRes = res as http.ServerResponse;\n const url = new URL(httpReq.url ?? \"/\", \"http://localhost\");\n const method = (httpReq.method ?? \"GET\").toUpperCase();\n const hostContext = getHostContext(runtime);\n\n if (!hostContext?.config) {\n logger.warn(\"[eliza-cloud-routes] host config unavailable\");\n }\n const config = (hostContext?.config ?? {}) as ElizaConfig;\n const cloudState: CloudRouteState = {\n config,\n runtime: runtime as CloudRouteState[\"runtime\"],\n cloudManager: null,\n restartRuntime: hostContext?.restartRuntime,\n services: {\n createIntegrationTelemetrySpan: hostContext?.createTelemetrySpan,\n saveElizaConfig: (nextConfig) => {\n hostContext?.saveConfig?.(\n nextConfig as Record<string, unknown>,\n );\n },\n },\n };\n\n const handled = await handleCloudRoute(\n httpReq,\n httpRes,\n url.pathname,\n method,\n cloudState,\n );\n\n if (!handled) {\n return;\n }\n };\n}\n\nfunction makeBillingRouteHandler() {\n return async (\n req: unknown,\n res: unknown,\n runtime: unknown,\n ): Promise<void> => {\n const httpReq = req as http.IncomingMessage;\n const httpRes = res as http.ServerResponse;\n const url = new URL(httpReq.url ?? \"/\", \"http://localhost\");\n const method = (httpReq.method ?? \"GET\").toUpperCase();\n const hostContext = getHostContext(runtime);\n const state: CloudBillingRouteState = {\n config: (hostContext?.config ?? {}) as ElizaConfig,\n runtime: runtime as CloudBillingRouteState[\"runtime\"],\n };\n\n await handleCloudBillingRoute(\n httpReq,\n httpRes,\n url.pathname,\n method,\n state,\n );\n };\n}\n\nconst cloudStatusHandler = makeStatusHandler();\nconst cloudRouteHandler = makeCloudRouteHandler();\nconst cloudBillingRouteHandler = makeBillingRouteHandler();\n\nconst cloudRoutes: Route[] = [\n // Status surface (read-only). Note: server.ts may exempt this from auth on\n // cloud-provisioned containers BEFORE the plugin route system fires.\n {\n type: \"GET\",\n path: \"/api/cloud/status\",\n rawPath: true,\n handler: cloudStatusHandler,\n },\n {\n type: \"GET\",\n path: \"/api/cloud/credits\",\n rawPath: true,\n handler: cloudStatusHandler,\n },\n {\n type: \"GET\",\n path: \"/api/cloud/relay-status\",\n rawPath: true,\n handler: cloudRouteHandler,\n },\n {\n type: \"POST\",\n path: \"/api/cloud/coding-containers/promotions\",\n rawPath: true,\n handler: cloudRouteHandler,\n },\n {\n type: \"POST\",\n path: \"/api/cloud/coding-containers\",\n rawPath: true,\n handler: cloudRouteHandler,\n },\n {\n type: \"POST\",\n path: \"/api/cloud/coding-containers/:containerId/sync\",\n rawPath: true,\n handler: cloudRouteHandler,\n },\n ...([\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"] as const).map((type) => ({\n type,\n path: \"/api/cloud/billing/:path*\",\n rawPath: true,\n handler: cloudBillingRouteHandler,\n })),\n {\n type: \"POST\",\n path: \"/api/cloud/disconnect\",\n rawPath: true,\n handler: cloudRouteHandler,\n },\n {\n type: \"POST\",\n path: \"/api/cloud/login\",\n rawPath: true,\n handler: cloudRouteHandler,\n },\n {\n type: \"POST\",\n path: \"/api/cloud/login/persist\",\n rawPath: true,\n handler: cloudRouteHandler,\n },\n {\n type: \"GET\",\n path: \"/api/cloud/login/status\",\n rawPath: true,\n handler: cloudRouteHandler,\n },\n {\n type: \"GET\",\n path: \"/api/cloud/agents\",\n rawPath: true,\n handler: cloudRouteHandler,\n },\n {\n type: \"POST\",\n path: \"/api/cloud/agents\",\n rawPath: true,\n handler: cloudRouteHandler,\n },\n {\n type: \"POST\",\n path: \"/api/cloud/agents/:agentId/provision\",\n rawPath: true,\n handler: cloudRouteHandler,\n },\n {\n type: \"POST\",\n path: \"/api/cloud/agents/:agentId/connect\",\n rawPath: true,\n handler: cloudRouteHandler,\n },\n {\n type: \"POST\",\n path: \"/api/cloud/agents/:agentId/shutdown\",\n rawPath: true,\n handler: cloudRouteHandler,\n },\n {\n type: \"POST\",\n path: \"/api/cloud/coding-containers/promotions\",\n rawPath: true,\n handler: cloudRouteHandler,\n },\n {\n type: \"POST\",\n path: \"/api/cloud/coding-containers\",\n rawPath: true,\n handler: cloudRouteHandler,\n },\n {\n type: \"POST\",\n path: \"/api/cloud/coding-containers/:containerId/sync\",\n rawPath: true,\n handler: cloudRouteHandler,\n },\n];\n\nexport const elizaCloudRoutePlugin: Plugin = {\n name: \"@elizaos/plugin-elizacloud:routes\",\n description:\n \"Eliza Cloud connection, login, status, credit, and relay routes (extracted from app-core/server.ts)\",\n routes: cloudRoutes,\n // Routes-only plugin — no services or persistent resources to dispose.\n dispose: async (_runtime) => {},\n};\n\nexport default elizaCloudRoutePlugin;\n",
|
|
24
|
+
"import type { IAgentRuntime, Plugin, ProcessEnvLike } from \"@elizaos/core\";\nimport { logger, ModelType } from \"@elizaos/core\";\n// Cloud providers\nimport { cloudStatusProvider } from \"./cloud-providers/cloud-status\";\nimport { containerHealthProvider } from \"./cloud-providers/container-health\";\nimport { creditBalanceProvider } from \"./cloud-providers/credit-balance\";\nimport { modelRegistryProvider } from \"./cloud-providers/model-registry\";\nimport { initializeOpenAI } from \"./init\";\nimport {\n fetchTextToSpeech,\n handleActionPlanner,\n handleImageDescription,\n handleImageGeneration,\n handleResearch,\n handleResponseHandler,\n handleTextEmbedding,\n handleTextLarge,\n handleTextMedium,\n handleTextMega,\n handleTextNano,\n handleTextSmall,\n handleTextToSpeech,\n} from \"./models\";\n// Cloud services\nimport { CloudAuthService } from \"./services/cloud-auth\";\nimport { CloudBackupService } from \"./services/cloud-backup\";\nimport { CloudBootstrapServiceImpl } from \"./services/cloud-bootstrap\";\nimport { CloudBridgeService } from \"./services/cloud-bridge\";\nimport { CloudContainerService } from \"./services/cloud-container\";\nimport { CloudCredentialProvider } from \"./services/cloud-credential-provider\";\nimport { CloudManagedGatewayRelayService } from \"./services/cloud-managed-gateway-relay\";\nimport { CloudModelRegistryService } from \"./services/cloud-model-registry\";\nimport { createCloudApiClient } from \"./utils/sdk-client\";\nimport { createWaifuMeteringHandler } from \"./utils/waifu-metering\";\n\nconst TEXT_NANO_MODEL_TYPE = (ModelType.TEXT_NANO ?? \"TEXT_NANO\") as string;\nconst TEXT_MEDIUM_MODEL_TYPE = (ModelType.TEXT_MEDIUM ?? \"TEXT_MEDIUM\") as string;\nconst TEXT_MEGA_MODEL_TYPE = (ModelType.TEXT_MEGA ?? \"TEXT_MEGA\") as string;\nconst RESPONSE_HANDLER_MODEL_TYPE = (ModelType.RESPONSE_HANDLER ?? \"RESPONSE_HANDLER\") as string;\nconst ACTION_PLANNER_MODEL_TYPE = (ModelType.ACTION_PLANNER ?? \"ACTION_PLANNER\") as string;\n\nfunction getProcessEnv(): ProcessEnvLike {\n if (typeof process === \"undefined\") {\n return {};\n }\n return process.env as ProcessEnvLike;\n}\n\nconst env = getProcessEnv();\n\nexport const elizaOSCloudPlugin: Plugin = {\n name: \"elizaOSCloud\",\n description:\n \"ElizaOS Cloud plugin — Multi-model AI generation, container provisioning, agent bridge, and billing management\",\n autoEnable: {\n envKeys: [\"ELIZAOS_CLOUD_API_KEY\", \"ELIZAOS_CLOUD_ENABLED\"],\n },\n\n // Plugin-wide registration priority. Applied to every model handler in\n // the `models` map below. Higher numbers win the native runtime priority\n // sort.\n //\n // Why 50: in `manual` routing mode (`routing-preferences.ts`) with no\n // `preferredProvider` set for a slot, the runtime falls through to the\n // native priority order. Putting cloud above the default-0 of other\n // direct provider plugins (anthropic, openai, groq, elevenlabs) means\n // Eliza Cloud wins the \"user has paired Cloud but hasn't picked anything\n // specific\" case — which is the desired text-generation default.\n //\n // **TTS routing precedence is governed by the router-handler**\n // (`plugin-local-inference/src/services/router-handler.ts`) at\n // MAX_SAFE_INTEGER priority, which reads the per-slot `RoutingPolicy`\n // (default `prefer-local`) and dispatches to local first when available.\n // This plugin's priority does NOT control whether local TTS wins; the\n // router does. See `plugin-local-inference/native/AGENTS.md` §1 for the\n // canonical voice/ASR routing contract.\n //\n // Cloud TTS still works as a fallback when local is unavailable: the\n // handler throws `CloudTtsUnavailableError` when cloud isn't connected\n // and the router's per-pick retry loop falls through to the next\n // eligible provider (local kokoro / omnivoice, plugin-elevenlabs, ...).\n priority: 50,\n\n config: {\n ELIZAOS_CLOUD_API_KEY: env.ELIZAOS_CLOUD_API_KEY ?? null,\n ELIZAOS_CLOUD_BASE_URL: env.ELIZAOS_CLOUD_BASE_URL ?? null,\n ELIZAOS_CLOUD_ENABLED: env.ELIZAOS_CLOUD_ENABLED ?? null,\n // Text models\n ELIZAOS_CLOUD_NANO_MODEL: env.ELIZAOS_CLOUD_NANO_MODEL ?? null,\n ELIZAOS_CLOUD_MEDIUM_MODEL: env.ELIZAOS_CLOUD_MEDIUM_MODEL ?? null,\n ELIZAOS_CLOUD_SMALL_MODEL: env.ELIZAOS_CLOUD_SMALL_MODEL ?? null,\n ELIZAOS_CLOUD_LARGE_MODEL: env.ELIZAOS_CLOUD_LARGE_MODEL ?? null,\n ELIZAOS_CLOUD_MEGA_MODEL: env.ELIZAOS_CLOUD_MEGA_MODEL ?? null,\n ELIZAOS_CLOUD_RESPONSE_HANDLER_MODEL: env.ELIZAOS_CLOUD_RESPONSE_HANDLER_MODEL ?? null,\n ELIZAOS_CLOUD_SHOULD_RESPOND_MODEL: env.ELIZAOS_CLOUD_SHOULD_RESPOND_MODEL ?? null,\n ELIZAOS_CLOUD_ACTION_PLANNER_MODEL: env.ELIZAOS_CLOUD_ACTION_PLANNER_MODEL ?? null,\n ELIZAOS_CLOUD_PLANNER_MODEL: env.ELIZAOS_CLOUD_PLANNER_MODEL ?? null,\n ELIZAOS_CLOUD_RESPONSE_MODEL: env.ELIZAOS_CLOUD_RESPONSE_MODEL ?? null,\n NANO_MODEL: env.NANO_MODEL ?? null,\n MEDIUM_MODEL: env.MEDIUM_MODEL ?? null,\n SMALL_MODEL: env.SMALL_MODEL ?? null,\n LARGE_MODEL: env.LARGE_MODEL ?? null,\n MEGA_MODEL: env.MEGA_MODEL ?? null,\n RESPONSE_HANDLER_MODEL: env.RESPONSE_HANDLER_MODEL ?? null,\n SHOULD_RESPOND_MODEL: env.SHOULD_RESPOND_MODEL ?? null,\n ACTION_PLANNER_MODEL: env.ACTION_PLANNER_MODEL ?? null,\n PLANNER_MODEL: env.PLANNER_MODEL ?? null,\n RESPONSE_MODEL: env.RESPONSE_MODEL ?? null,\n // Research model\n ELIZAOS_CLOUD_RESEARCH_MODEL: env.ELIZAOS_CLOUD_RESEARCH_MODEL ?? null,\n RESEARCH_MODEL: env.RESEARCH_MODEL ?? null,\n // Embedding\n ELIZAOS_CLOUD_EMBEDDING_MODEL: env.ELIZAOS_CLOUD_EMBEDDING_MODEL ?? null,\n ELIZAOS_CLOUD_EMBEDDING_API_KEY: env.ELIZAOS_CLOUD_EMBEDDING_API_KEY ?? null,\n ELIZAOS_CLOUD_EMBEDDING_URL: env.ELIZAOS_CLOUD_EMBEDDING_URL ?? null,\n ELIZAOS_CLOUD_EMBEDDING_DIMENSIONS: env.ELIZAOS_CLOUD_EMBEDDING_DIMENSIONS ?? null,\n // Image\n ELIZAOS_CLOUD_IMAGE_DESCRIPTION_MODEL: env.ELIZAOS_CLOUD_IMAGE_DESCRIPTION_MODEL ?? null,\n ELIZAOS_CLOUD_IMAGE_DESCRIPTION_MAX_TOKENS:\n env.ELIZAOS_CLOUD_IMAGE_DESCRIPTION_MAX_TOKENS ?? null,\n ELIZAOS_CLOUD_IMAGE_GENERATION_MODEL: env.ELIZAOS_CLOUD_IMAGE_GENERATION_MODEL ?? null,\n // Audio\n ELIZAOS_CLOUD_TTS_MODEL: env.ELIZAOS_CLOUD_TTS_MODEL ?? null,\n ELIZAOS_CLOUD_TRANSCRIPTION_MODEL: env.ELIZAOS_CLOUD_TRANSCRIPTION_MODEL ?? null,\n // Telemetry\n ELIZAOS_CLOUD_EXPERIMENTAL_TELEMETRY: env.ELIZAOS_CLOUD_EXPERIMENTAL_TELEMETRY ?? null,\n },\n\n async init(config, runtime) {\n // Initialize inference (OpenAI-compatible client)\n initializeOpenAI(config, runtime);\n },\n\n // ─── Runtime Event Handlers ──────────────────────────────────────────\n // Forwards per-inference token + USD spend to waifu's burn meter when the\n // container is provisioned as a hosted waifu agent (inactive otherwise). See\n // utils/waifu-metering.ts for the honest-meter rationale.\n events: {\n MODEL_USED: [createWaifuMeteringHandler()],\n },\n\n // ─── Cloud Services ──────────────────────────────────────────────────\n // Services are registered in dependency order:\n // 1. CloudAuthService — must start first (other services depend on it)\n // 2. CloudBootstrapServiceImpl — pure trust-anchor accessor; no deps\n // 3. CloudManagedGatewayRelayService — optional local-runtime relay via shared cloud ingress\n // 4. CloudContainerService — needs auth to list/create containers\n // 5. CloudBridgeService — needs auth for WebSocket connections\n // 6. CloudBackupService — needs auth for snapshot API calls\n services: [\n CloudAuthService,\n CloudBootstrapServiceImpl,\n CloudManagedGatewayRelayService,\n CloudModelRegistryService,\n CloudContainerService,\n CloudBridgeService,\n CloudBackupService,\n // Bridges plugin-workflow's `workflow_credential_provider` slot to the\n // cloud's per-connector OAuth surface. Must start after CloudAuthService\n // because it reads the authenticated client via getService(\"CLOUD_AUTH\").\n CloudCredentialProvider,\n ],\n\n // ─── Cloud Providers ─────────────────────────────────────────────────\n providers: [\n cloudStatusProvider,\n creditBalanceProvider,\n containerHealthProvider,\n modelRegistryProvider,\n ],\n\n // ─── Inference Model Handlers ────────────────────────────────────────\n models: {\n [ModelType.TEXT_EMBEDDING]: handleTextEmbedding,\n [TEXT_NANO_MODEL_TYPE]: handleTextNano,\n [TEXT_MEDIUM_MODEL_TYPE]: handleTextMedium,\n [ModelType.TEXT_SMALL]: handleTextSmall,\n [ModelType.TEXT_LARGE]: handleTextLarge,\n [TEXT_MEGA_MODEL_TYPE]: handleTextMega,\n [RESPONSE_HANDLER_MODEL_TYPE]: handleResponseHandler,\n [ACTION_PLANNER_MODEL_TYPE]: handleActionPlanner,\n [ModelType.RESEARCH]: handleResearch,\n [ModelType.IMAGE]: handleImageGeneration,\n [ModelType.IMAGE_DESCRIPTION]: handleImageDescription,\n [ModelType.TEXT_TO_SPEECH]: handleTextToSpeech,\n },\n\n tests: [\n {\n name: \"ELIZAOS_CLOUD_plugin_tests\",\n tests: [\n {\n name: \"ELIZAOS_CLOUD_test_url_and_api_key_validation\",\n fn: async (runtime: IAgentRuntime) => {\n const data = await createCloudApiClient(runtime).get<{\n data?: Array<Record<string, never>>;\n }>(\"/models\");\n logger.log(\n {\n data: data.data?.length ?? \"N/A\",\n },\n \"Models Available\"\n );\n },\n },\n {\n name: \"ELIZAOS_CLOUD_test_text_embedding\",\n fn: async (runtime: IAgentRuntime) => {\n const embedding = await runtime.useModel(ModelType.TEXT_EMBEDDING, {\n text: \"Hello, world!\",\n });\n logger.log({ embedding }, \"embedding\");\n },\n },\n {\n name: \"ELIZAOS_CLOUD_test_text_large\",\n fn: async (runtime: IAgentRuntime) => {\n const text = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: \"What is the nature of reality in 10 words?\",\n });\n if (text.length === 0) {\n throw new Error(\"Failed to generate text\");\n }\n logger.log({ text }, \"generated with test_text_large\");\n },\n },\n {\n name: \"ELIZAOS_CLOUD_test_text_small\",\n fn: async (runtime: IAgentRuntime) => {\n const text = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt: \"What is the nature of reality in 10 words?\",\n });\n if (text.length === 0) {\n throw new Error(\"Failed to generate text\");\n }\n logger.log({ text }, \"generated with test_text_small\");\n },\n },\n {\n name: \"ELIZAOS_CLOUD_test_image_generation\",\n fn: async (runtime: IAgentRuntime) => {\n logger.log(\"ELIZAOS_CLOUD_test_image_generation\");\n const image = await runtime.useModel(ModelType.IMAGE, {\n prompt: \"A beautiful sunset over a calm ocean\",\n count: 1,\n size: \"1024x1024\",\n });\n logger.log({ image }, \"generated with test_image_generation\");\n },\n },\n {\n name: \"image-description\",\n fn: async (runtime: IAgentRuntime) => {\n logger.log(\"ELIZAOS_CLOUD_test_image_description\");\n const result = await runtime.useModel(\n ModelType.IMAGE_DESCRIPTION,\n \"https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Vitalik_Buterin_TechCrunch_London_2015_%28cropped%29.jpg/537px-Vitalik_Buterin_TechCrunch_London_2015_%28cropped%29.jpg\"\n );\n\n if (\n result &&\n typeof result === \"object\" &&\n \"title\" in result &&\n \"description\" in result\n ) {\n logger.log({ result }, \"Image description\");\n } else {\n logger.error(`Invalid image description result format: ${JSON.stringify(result)}`);\n }\n },\n },\n {\n name: \"ELIZAOS_CLOUD_test_transcription\",\n fn: async (runtime: IAgentRuntime) => {\n logger.log(\"ELIZAOS_CLOUD_test_transcription\");\n const response = await fetch(\n \"https://upload.wikimedia.org/wikipedia/en/4/40/Chris_Benoit_Voice_Message.ogg\"\n );\n const arrayBuffer = await response.arrayBuffer();\n const transcription = await runtime.useModel(\n ModelType.TRANSCRIPTION,\n Buffer.from(new Uint8Array(arrayBuffer))\n );\n logger.log({ transcription }, \"generated with test_transcription\");\n },\n },\n {\n name: \"ELIZAOS_CLOUD_test_text_tokenizer_encode\",\n fn: async (runtime: IAgentRuntime) => {\n const prompt = \"Hello tokenizer encode!\";\n const tokens = await runtime.useModel(ModelType.TEXT_TOKENIZER_ENCODE, {\n prompt,\n modelType: ModelType.TEXT_SMALL,\n });\n if (!Array.isArray(tokens) || tokens.length === 0) {\n throw new Error(\"Failed to tokenize text: expected non-empty array of tokens\");\n }\n logger.log({ tokens }, \"Tokenized output\");\n },\n },\n {\n name: \"ELIZAOS_CLOUD_test_text_tokenizer_decode\",\n fn: async (runtime: IAgentRuntime) => {\n const prompt = \"Hello tokenizer decode!\";\n const tokens = await runtime.useModel(ModelType.TEXT_TOKENIZER_ENCODE, {\n prompt,\n modelType: ModelType.TEXT_SMALL,\n });\n const decodedText = await runtime.useModel(ModelType.TEXT_TOKENIZER_DECODE, {\n tokens,\n modelType: ModelType.TEXT_SMALL,\n });\n if (decodedText !== prompt) {\n throw new Error(\n `Decoded text does not match original. Expected \"${prompt}\", got \"${decodedText}\"`\n );\n }\n logger.log({ decodedText }, \"Decoded text\");\n },\n },\n {\n name: \"ELIZAOS_CLOUD_test_text_to_speech\",\n fn: async (runtime: IAgentRuntime) => {\n const response = await fetchTextToSpeech(runtime, {\n text: \"Hello, this is a test for text-to-speech.\",\n });\n if (!response) {\n throw new Error(\"Failed to generate speech\");\n }\n logger.log(\"Generated speech successfully\");\n },\n },\n ],\n },\n ],\n\n async dispose(runtime) {\n // Stop in reverse dependency order (auth last since others depend on it).\n await runtime.getService(CloudCredentialProvider.serviceType)?.stop();\n await runtime.getService(CloudBackupService.serviceType)?.stop();\n await runtime.getService(CloudBridgeService.serviceType)?.stop();\n await runtime.getService(CloudContainerService.serviceType)?.stop();\n await runtime.getService(CloudModelRegistryService.serviceType)?.stop();\n await runtime.getService(CloudManagedGatewayRelayService.serviceType)?.stop();\n await runtime.getService(CloudBootstrapServiceImpl.serviceType)?.stop();\n await runtime.getService(CloudAuthService.serviceType)?.stop();\n },\n};\n\nexport default elizaOSCloudPlugin;\n\nexport { isCloudProvisionedContainer } from \"./routes/cloud-provisioning\";\nexport { handleCloudBillingRoute } from \"./routes/cloud-billing-routes\";\nexport { handleCloudCompatRoute } from \"./routes/cloud-compat-routes\";\nexport { handleCloudRelayRoute } from \"./routes/cloud-relay-routes\";\nexport {\n type CloudRouteState,\n handleCloudRoute,\n} from \"./routes/cloud-routes-autonomous\";\nexport type { CloudConfigLike } from \"./routes/cloud-routes-autonomous\";\nexport { handleCloudStatusRoutes } from \"./routes/cloud-status-routes\";\nexport { runCloudSetup, type CloudSetupResult } from \"./cloud-setup\";\nexport { ClackObserver } from \"./cloud/clack-observer\";\nexport { NullCloudSetupObserver } from \"./cloud/null-observer\";\nexport type {\n AvailabilityResult,\n CloudSetupObserver,\n ConfirmPrompt,\n ProvisionSuccessInfo,\n SelectChoiceOption,\n SelectChoicePrompt,\n} from \"./cloud/setup-observer\";\nexport { CloudManager, type CloudManagerCallbacks } from \"./cloud/cloud-manager\";\nexport {\n type CloudWalletDescriptor,\n type CloudWalletProvider,\n ElizaCloudClient,\n} from \"./cloud/bridge-client\";\nexport {\n normalizeCloudSecret,\n resolveCloudApiKey,\n} from \"./cloud/cloud-api-key\";\nexport {\n clearCloudSecrets,\n getCloudSecret,\n scrubCloudSecretsFromEnv,\n} from \"./lib/cloud-secrets\";\nexport {\n __resetCloudBaseUrlCache,\n ensureCloudTtsApiKeyAlias,\n handleCloudTtsPreviewRoute,\n mirrorCompatHeaders,\n resolveCloudTtsBaseUrl,\n resolveElevenLabsApiKeyForCloudMode,\n} from \"./lib/server-cloud-tts\";\nexport {\n fetchCloudVoiceCatalog,\n resetCloudVoiceCatalogCacheForTesting,\n setCloudVoiceClientFactoryForTesting,\n type CloudVoiceCatalogEntry,\n type CloudVoiceClient,\n} from \"./cloud-voice-catalog\";\nexport {\n CloudTtsUnavailableError,\n type CloudTextToSpeechParams,\n} from \"./models/speech\";\nexport {\n normalizeCloudSiteUrl,\n resolveCloudApiBaseUrl,\n} from \"./cloud/base-url\";\nexport {\n isCloudAuthApiKeyService,\n normalizeCloudApiKey,\n type CloudAuthApiKeyService,\n} from \"./cloud/auth-service-types\";\nexport { validateCloudBaseUrl } from \"./cloud/validate-url\";\nexport * from \"./plugin\";\nexport * from \"./register-routes\";\nexport * from \"./cloud\";\n",
|
|
25
|
+
"/**\n * cloudStatusProvider — Container and connection status in agent state.\n */\n\nimport type { IAgentRuntime, Memory, Provider, ProviderResult, State } from \"@elizaos/core\";\nimport type { CloudAuthService } from \"../services/cloud-auth\";\nimport type { CloudBridgeService } from \"../services/cloud-bridge\";\nimport type { CloudContainerService } from \"../services/cloud-container\";\n\nconst MAX_CONTAINER_SUMMARIES = 10;\n\nexport const cloudStatusProvider: Provider = {\n name: \"elizacloud_status\",\n description: \"ElizaCloud container and connection status\",\n descriptionCompressed: \"ElizaCloud container/connection status.\",\n dynamic: true,\n position: 90,\n contexts: [\"settings\", \"finance\"],\n contextGate: { anyOf: [\"settings\", \"finance\"] },\n cacheStable: false,\n cacheScope: \"turn\",\n async get(runtime: IAgentRuntime, _message: Memory, _state: State): Promise<ProviderResult> {\n try {\n const auth = runtime.getService(\"CLOUD_AUTH\") as CloudAuthService | undefined;\n if (!auth?.isAuthenticated()) {\n return {\n text: \"ElizaCloud: Not authenticated\",\n values: { cloudAuthenticated: false },\n };\n }\n\n const containerSvc = runtime.getService(\"CLOUD_CONTAINER\") as\n | CloudContainerService\n | undefined;\n const bridgeSvc = runtime.getService(\"CLOUD_BRIDGE\") as CloudBridgeService | undefined;\n const containers = containerSvc?.getTrackedContainers() ?? [];\n const connected = bridgeSvc?.getConnectedContainerIds() ?? [];\n\n const running = containers.filter((c) => c.status === \"running\").length;\n const deploying = containers.filter(\n (c) => c.status === \"pending\" || c.status === \"building\" || c.status === \"deploying\"\n ).length;\n\n const summaries = containers.slice(0, MAX_CONTAINER_SUMMARIES).map((c) => ({\n id: c.id,\n name: c.name,\n status: c.status,\n url: c.load_balancer_url,\n billing: c.billing_status,\n bridged: connected.includes(c.id),\n }));\n\n const lines = [\n `ElizaCloud: ${containers.length} container(s), ${running} running, ${connected.length} bridged`,\n ...summaries.map(\n (c) =>\n ` - ${c.name} [${c.status}]${c.url ? ` @ ${c.url}` : \"\"}${c.bridged ? \" (bridged)\" : \"\"}`\n ),\n ];\n\n return {\n text: lines.join(\"\\n\"),\n values: {\n cloudAuthenticated: true,\n totalContainers: containers.length,\n runningContainers: running,\n deployingContainers: deploying,\n },\n data: { containers: summaries, truncated: containers.length > summaries.length },\n };\n } catch {\n return { text: \"\", values: {}, data: {} };\n }\n },\n};\n",
|
|
26
|
+
"/**\n * containerHealthProvider — Container health in agent state (private, on-demand).\n */\n\nimport type { IAgentRuntime, Memory, Provider, ProviderResult, State } from \"@elizaos/core\";\nimport type { CloudAuthService } from \"../services/cloud-auth\";\nimport type { CloudContainerService } from \"../services/cloud-container\";\n\nconst MAX_HEALTH_REPORTS = 10;\n\nexport const containerHealthProvider: Provider = {\n name: \"elizacloud_health\",\n description: \"ElizaCloud container health\",\n descriptionCompressed: \"ElizaCloud container health.\",\n dynamic: true,\n position: 92,\n private: true,\n contexts: [\"settings\", \"finance\"],\n contextGate: { anyOf: [\"settings\", \"finance\"] },\n cacheStable: false,\n cacheScope: \"turn\",\n async get(runtime: IAgentRuntime, _message: Memory, _state: State): Promise<ProviderResult> {\n try {\n const auth = runtime.getService(\"CLOUD_AUTH\") as CloudAuthService | undefined;\n if (!auth?.isAuthenticated()) return { text: \"\" };\n\n const svc = runtime.getService(\"CLOUD_CONTAINER\") as CloudContainerService | undefined;\n const running = svc?.getTrackedContainers().filter((c) => c.status === \"running\") ?? [];\n if (running.length === 0)\n return {\n text: \"No running containers.\",\n values: { healthyContainers: 0 },\n };\n\n // NOTE: True health would require hitting each container's health_check_path\n // endpoint over the network. We approximate here using locally-cached state:\n // a container is considered healthy when it is running, billing is active,\n // and there is no recorded error message.\n const reports = running.slice(0, MAX_HEALTH_REPORTS).map((c) => ({\n id: c.id,\n name: c.name,\n healthy: c.status === \"running\" && c.billing_status === \"active\" && !c.error_message,\n status: c.status,\n billing: c.billing_status,\n }));\n\n const healthy = reports.filter((r) => r.healthy).length;\n const text = [\n `Health: ${healthy}/${reports.length} healthy`,\n ...reports.map(\n (r) =>\n ` - ${r.name}: ${r.healthy ? \"OK\" : \"UNHEALTHY\"} (status=${r.status}, billing=${r.billing})`\n ),\n ].join(\"\\n\");\n\n return {\n text,\n values: {\n healthyContainers: healthy,\n unhealthyContainers: reports.length - healthy,\n },\n data: { reports, truncated: running.length > reports.length },\n };\n } catch {\n return { text: \"\", values: {}, data: {} };\n }\n },\n};\n",
|
|
27
|
+
"/** Credit balance in agent state (60s cache). */\n\nimport type { IAgentRuntime, Memory, Provider, ProviderResult, State } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport type { CloudAuthService } from \"../services/cloud-auth\";\nimport type { CreditBalanceResponse } from \"../types/cloud\";\n\nconst TOP_UP_URL = \"https://www.elizacloud.ai/dashboard/settings?tab=billing\";\nconst creditCaches = new WeakMap<IAgentRuntime, { value: number; at: number }>();\nconst TTL = 60_000;\nconst MAX_CREDIT_TEXT_CHARS = 240;\n\nexport const creditBalanceProvider: Provider = {\n name: \"elizacloud_credits\",\n description: \"ElizaCloud credit balance\",\n descriptionCompressed: \"ElizaCloud credit balance.\",\n dynamic: true,\n contexts: [\"settings\", \"finance\"],\n contextGate: { anyOf: [\"settings\", \"finance\"] },\n cacheStable: false,\n cacheScope: \"turn\",\n position: 91,\n async get(runtime: IAgentRuntime, _message: Memory, _state: State): Promise<ProviderResult> {\n const auth = runtime.getService(\"CLOUD_AUTH\") as CloudAuthService | undefined;\n if (!auth?.isAuthenticated()) return { text: \"\" };\n\n const cached = creditCaches.get(runtime);\n if (cached && Date.now() - cached.at < TTL) {\n const result = format(cached.value);\n return { ...result, text: (result.text ?? \"\").slice(0, MAX_CREDIT_TEXT_CHARS) };\n }\n\n let balance: number;\n try {\n const { data } = await auth.getClient().get<CreditBalanceResponse>(\"/credits/balance\");\n balance = data.balance;\n } catch (err) {\n logger.warn(\n `[CloudCredits] Failed to fetch balance: ${err instanceof Error ? err.message : err}`\n );\n if (cached) {\n const result = format(cached.value);\n return { ...result, text: (result.text ?? \"\").slice(0, MAX_CREDIT_TEXT_CHARS) };\n }\n return { text: \"\", values: { cloudCreditsUnavailable: true }, data: {} };\n }\n creditCaches.set(runtime, { value: balance, at: Date.now() });\n\n if (balance < 1.0) logger.warn(`[CloudCredits] Low balance: $${balance.toFixed(2)}`);\n const result = format(balance);\n return { ...result, text: (result.text ?? \"\").slice(0, MAX_CREDIT_TEXT_CHARS) };\n },\n};\n\nfunction format(balance: number): ProviderResult {\n const low = balance < 2.0;\n const critical = balance < 0.5;\n let text = `ElizaCloud credits: $${balance.toFixed(2)}`;\n if (critical) text += ` (CRITICAL — top up at ${TOP_UP_URL})`;\n else if (low) text += ` (LOW — top up at ${TOP_UP_URL})`;\n return {\n text,\n values: {\n cloudCredits: balance,\n cloudCreditsLow: low,\n cloudCreditsCritical: critical,\n cloudTopUpUrl: TOP_UP_URL,\n },\n };\n}\n",
|
|
28
|
+
"/** Exposes available cloud models in agent state. */\n\nimport type { IAgentRuntime, Memory, Provider, ProviderResult, State } from \"@elizaos/core\";\nimport type { CloudModelRegistryService, ModelsByProvider } from \"../services/cloud-model-registry\";\n\nconst TTL = 300_000; // 5 minutes\nconst MAX_MODEL_PROVIDERS = 12;\nconst MAX_MODELS_PER_PROVIDER = 50;\n\n/**\n * Per-runtime cache using a WeakMap keyed by the runtime object.\n * This avoids sharing stale model data between different agent instances\n * running in the same process.\n */\nconst runtimeCaches = new WeakMap<IAgentRuntime, { value: ModelsByProvider; at: number }>();\n\nexport const modelRegistryProvider: Provider = {\n name: \"elizacloud_models\",\n description: \"Available AI models from ElizaCloud grouped by provider\",\n descriptionCompressed: \"Available AI models from ElizaCloud by provider.\",\n dynamic: true,\n contexts: [\"settings\", \"finance\"],\n contextGate: { anyOf: [\"settings\", \"finance\"] },\n cacheStable: false,\n cacheScope: \"turn\",\n position: 92,\n async get(runtime: IAgentRuntime, _message: Memory, _state: State): Promise<ProviderResult> {\n try {\n const registry = runtime.getService(\"CLOUD_MODEL_REGISTRY\") as\n | CloudModelRegistryService\n | undefined;\n\n if (!registry) return { text: \"\" };\n\n const cached = runtimeCaches.get(runtime);\n if (cached && Date.now() - cached.at < TTL) {\n const cachedValue = Object.fromEntries(\n Object.entries(cached.value).slice(0, MAX_MODEL_PROVIDERS)\n ) as ModelsByProvider;\n return formatModels(cachedValue);\n }\n\n const byProvider = await registry.getModelsByProvider();\n\n if (Object.keys(byProvider).length === 0) {\n return { text: \"\" };\n }\n\n runtimeCaches.set(runtime, { value: byProvider, at: Date.now() });\n const capped = Object.fromEntries(\n Object.entries(byProvider).slice(0, MAX_MODEL_PROVIDERS)\n ) as ModelsByProvider;\n return formatModels(capped);\n } catch {\n return { text: \"\", values: {}, data: {} };\n }\n },\n};\n\nfunction formatModels(byProvider: ModelsByProvider): ProviderResult {\n const providers = Object.keys(byProvider).sort().slice(0, MAX_MODEL_PROVIDERS);\n const total = providers.reduce(\n (n, provider) => n + byProvider[provider].slice(0, MAX_MODELS_PER_PROVIDER).length,\n 0\n );\n\n return {\n text: `ElizaCloud: ${total} models (${providers.join(\", \")})`,\n values: {\n cloudModelProviders: providers.join(\",\"),\n cloudModelCount: total,\n },\n };\n}\n",
|
|
29
|
+
"import { type IAgentRuntime, logger } from \"@elizaos/core\";\nimport { getApiKey, isBrowser } from \"./utils/config\";\nimport { createCloudApiClient } from \"./utils/sdk-client\";\n\nexport function initializeOpenAI(\n _config: Record<string, string | null>,\n runtime: IAgentRuntime\n): void {\n void (async () => {\n try {\n if (!getApiKey(runtime) && !isBrowser()) {\n logger.warn(\n \"ELIZAOS_CLOUD_API_KEY is not set in environment - ElizaOS Cloud functionality will be limited\"\n );\n logger.info(\"Get your API key from https://www.elizacloud.ai/dashboard/api-keys\");\n return;\n }\n try {\n await createCloudApiClient(runtime).get(\"/models\");\n logger.log(\"ElizaOS Cloud API key validated successfully\");\n } catch (fetchError) {\n const message = fetchError instanceof Error ? fetchError.message : String(fetchError);\n logger.warn(`ElizaOS Cloud API key validation failed: ${message}`);\n logger.warn(\n \"ElizaOS Cloud functionality will be limited until a valid API key is provided\"\n );\n }\n } catch (error) {\n const message =\n (error as { errors?: Array<{ message: string }> })?.errors\n ?.map((e) => e.message)\n .join(\", \") || (error instanceof Error ? error.message : String(error));\n logger.warn(\n `ElizaOS Cloud plugin configuration issue: ${message} - You need to configure the ELIZAOS_CLOUD_API_KEY in your environment variables`\n );\n logger.info(\"Get your API key from https://www.elizacloud.ai/dashboard/api-keys\");\n }\n })();\n}\n",
|
|
30
|
+
"import type { IAgentRuntime } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport { DEFAULT_ELIZA_CLOUD_TEXT_MODEL } from \"@elizaos/core\";\n\nexport const DEFAULT_ELIZA_CLOUD_LARGE_MODEL = \"zai-glm-4.7\";\n\nfunction getEnvValue(key: string): string | undefined {\n if (typeof process === \"undefined\") {\n return undefined;\n }\n const value = process.env[key];\n return value === undefined ? undefined : String(value);\n}\n\nexport function getSetting(\n runtime: IAgentRuntime,\n key: string,\n defaultValue?: string\n): string | undefined {\n const value = runtime.getSetting(key);\n if (value !== undefined && value !== null) {\n return String(value);\n }\n return getEnvValue(key) ?? defaultValue;\n}\n\nexport function isBrowser(): boolean {\n return (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as { document?: Document }).document !== \"undefined\"\n );\n}\n\nexport function isProxyMode(runtime: IAgentRuntime): boolean {\n return isBrowser() && !!getSetting(runtime, \"ELIZAOS_CLOUD_BROWSER_BASE_URL\");\n}\n\nexport function getBaseURL(runtime: IAgentRuntime): string {\n const browserURL = getSetting(runtime, \"ELIZAOS_CLOUD_BROWSER_BASE_URL\");\n const baseURL = (\n isBrowser() && browserURL\n ? browserURL\n : getSetting(runtime, \"ELIZAOS_CLOUD_BASE_URL\", \"https://www.elizacloud.ai/api/v1\")\n ) as string;\n return baseURL;\n}\n\nexport function getEmbeddingBaseURL(runtime: IAgentRuntime): string {\n const embeddingURL = isBrowser()\n ? getSetting(runtime, \"ELIZAOS_CLOUD_BROWSER_EMBEDDING_URL\") ||\n getSetting(runtime, \"ELIZAOS_CLOUD_BROWSER_BASE_URL\")\n : getSetting(runtime, \"ELIZAOS_CLOUD_EMBEDDING_URL\");\n if (embeddingURL) {\n logger.debug(`[ELIZAOS_CLOUD] Using specific embedding base URL: ${embeddingURL}`);\n return embeddingURL;\n }\n logger.debug(\"[ELIZAOS_CLOUD] Falling back to general base URL for embeddings.\");\n return getBaseURL(runtime);\n}\n\nexport function getApiKey(runtime: IAgentRuntime): string | undefined {\n return getSetting(runtime, \"ELIZAOS_CLOUD_API_KEY\");\n}\n\nexport function getEmbeddingApiKey(runtime: IAgentRuntime): string | undefined {\n const embeddingApiKey = getSetting(runtime, \"ELIZAOS_CLOUD_EMBEDDING_API_KEY\");\n if (embeddingApiKey) {\n logger.debug(\"[ELIZAOS_CLOUD] Using specific embedding API key (present)\");\n return embeddingApiKey;\n }\n logger.debug(\"[ELIZAOS_CLOUD] Falling back to general API key for embeddings.\");\n return getApiKey(runtime);\n}\n\nexport function getSmallModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_SMALL_MODEL\") ??\n (getSetting(runtime, \"SMALL_MODEL\", DEFAULT_ELIZA_CLOUD_TEXT_MODEL) as string)\n );\n}\n\nexport function getNanoModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_NANO_MODEL\") ??\n getSetting(runtime, \"NANO_MODEL\") ??\n getSmallModel(runtime)\n );\n}\n\nexport function getMediumModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_MEDIUM_MODEL\") ??\n getSetting(runtime, \"MEDIUM_MODEL\") ??\n getSmallModel(runtime)\n );\n}\n\nexport function getLargeModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_LARGE_MODEL\") ??\n (getSetting(runtime, \"LARGE_MODEL\", DEFAULT_ELIZA_CLOUD_LARGE_MODEL) as string)\n );\n}\n\nexport function getMegaModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_MEGA_MODEL\") ??\n getSetting(runtime, \"MEGA_MODEL\") ??\n getLargeModel(runtime)\n );\n}\n\nexport function getResponseHandlerModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_RESPONSE_HANDLER_MODEL\") ??\n getSetting(runtime, \"ELIZAOS_CLOUD_SHOULD_RESPOND_MODEL\") ??\n getSetting(runtime, \"RESPONSE_HANDLER_MODEL\") ??\n getSetting(runtime, \"SHOULD_RESPOND_MODEL\") ??\n getSmallModel(runtime)\n );\n}\n\nexport function getActionPlannerModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_ACTION_PLANNER_MODEL\") ??\n getSetting(runtime, \"ELIZAOS_CLOUD_PLANNER_MODEL\") ??\n getSetting(runtime, \"ACTION_PLANNER_MODEL\") ??\n getSetting(runtime, \"PLANNER_MODEL\") ??\n getLargeModel(runtime)\n );\n}\n\nexport function getResponseModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_RESPONSE_MODEL\") ??\n getSetting(runtime, \"RESPONSE_MODEL\") ??\n getLargeModel(runtime)\n );\n}\n\nexport function getImageDescriptionModel(runtime: IAgentRuntime): string {\n return getSetting(runtime, \"ELIZAOS_CLOUD_IMAGE_DESCRIPTION_MODEL\", \"gpt-5.4-mini\") as string;\n}\n\nexport function getImageGenerationModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_IMAGE_GENERATION_MODEL\", \"google/gemini-2.5-flash-image\") ??\n \"google/gemini-2.5-flash-image\"\n );\n}\n\nexport function getResearchModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_RESEARCH_MODEL\") ??\n (getSetting(runtime, \"RESEARCH_MODEL\", \"o3-deep-research\") as string)\n );\n}\n\nexport function getTTSModel(runtime: IAgentRuntime): string {\n return getSetting(runtime, \"ELIZAOS_CLOUD_TTS_MODEL\", \"gpt-5-mini-tts\") as string;\n}\n\nexport function getTranscriptionModel(runtime: IAgentRuntime): string {\n return getSetting(\n runtime,\n \"ELIZAOS_CLOUD_TRANSCRIPTION_MODEL\",\n \"gpt-5-mini-transcribe\"\n ) as string;\n}\n\nexport function getExperimentalTelemetry(runtime: IAgentRuntime): boolean {\n const setting = getSetting(runtime, \"ELIZAOS_CLOUD_EXPERIMENTAL_TELEMETRY\", \"false\");\n return String(setting).toLowerCase() === \"true\";\n}\n\n/**\n * Resolve a client-side timeout (ms) for a cloud model round-trip from `envKey`,\n * falling back to `defaultMs`. `0`/negative/non-numeric → undefined (opt out).\n *\n * cloud-sdk applies NO default timeout (a fetch with no signal hangs until the\n * platform default), so turn-blocking calls (TTS/STT in a voice turn, deep\n * research) need an explicit ceiling or a stalled gateway hangs the turn.\n */\nexport function resolveCloudTimeoutMs(\n envKey: string,\n defaultMs: number\n): number | undefined {\n const raw = typeof process !== \"undefined\" ? process.env[envKey] : undefined;\n if (raw === undefined || raw.trim() === \"\") return defaultMs;\n const parsed = Number.parseInt(raw, 10);\n if (!Number.isFinite(parsed)) return defaultMs;\n return parsed <= 0 ? undefined : parsed;\n}\n",
|
|
31
|
+
"import { CloudApiClient, ElizaCloudClient } from \"@elizaos/cloud-sdk\";\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport {\n getApiKey,\n getBaseURL,\n getEmbeddingApiKey,\n getEmbeddingBaseURL,\n isBrowser,\n} from \"./config\";\n\nfunction trimTrailingSlash(value: string): string {\n return value.replace(/\\/+$/, \"\");\n}\n\nfunction apiBaseToSiteBaseUrl(apiBaseUrl: string): string {\n const trimmed = trimTrailingSlash(apiBaseUrl);\n return trimmed.endsWith(\"/api/v1\") ? trimmed.slice(0, -\"/api/v1\".length) : trimmed;\n}\n\nfunction apiKeyForRuntime(runtime: IAgentRuntime, embedding = false): string | undefined {\n if (isBrowser()) return undefined;\n return embedding ? getEmbeddingApiKey(runtime) : getApiKey(runtime);\n}\n\nexport function createCloudApiClient(runtime: IAgentRuntime, embedding = false): CloudApiClient {\n const baseUrl = embedding ? getEmbeddingBaseURL(runtime) : getBaseURL(runtime);\n return new ElizaCloudClient({\n apiBaseUrl: trimTrailingSlash(baseUrl),\n baseUrl: apiBaseToSiteBaseUrl(baseUrl),\n apiKey: apiKeyForRuntime(runtime, embedding),\n }).v1;\n}\n\nexport function createElizaCloudClient(runtime: IAgentRuntime): ElizaCloudClient {\n const apiBaseUrl = trimTrailingSlash(getBaseURL(runtime));\n return new ElizaCloudClient({\n apiBaseUrl,\n baseUrl: apiBaseToSiteBaseUrl(apiBaseUrl),\n apiKey: apiKeyForRuntime(runtime),\n });\n}\n",
|
|
32
|
+
"import type { IAgentRuntime, TextEmbeddingParams } from \"@elizaos/core\";\nimport {\n logger,\n ModelType,\n timeInferenceSpan,\n VECTOR_DIMS,\n} from \"@elizaos/core\";\nimport { getSetting } from \"../utils/config\";\nimport { emitModelUsageEvent } from \"../utils/events\";\nimport { createCloudApiClient } from \"../utils/sdk-client\";\n\nconst MAX_BATCH_SIZE = 100;\n\n// ── Bounded retry/backoff for the /embeddings round-trip ──────────────────\n// Embeddings are off the turn's critical path (queueEmbeddingGeneration is\n// fire-and-forget), so a stall here delays the embedding QUEUE, not a reply.\n// The old behaviour — one blind 30s (or full retry-after) sleep then a single\n// retry — could park the queue for 30s+ on a transient 429. Replaced with\n// bounded exponential backoff + jitter, a CAP on any single wait (so a large\n// server retry-after can't stall the queue indefinitely), and a per-request\n// client-side timeout (the endpoint had none, so a hung gateway hung the\n// queue forever).\n//\n// Handler retries are deliberately SMALL: the EmbeddingGenerationService\n// BatchQueue already wraps generateEmbedding in its own multi-attempt backoff,\n// so this layer absorbs only a single transient burst (one quick retry) and\n// defers sustained pressure to the queue — otherwise the two backoffs compound.\nconst EMBED_MAX_ATTEMPTS = 2;\nconst EMBED_BACKOFF_BASE_MS = 1_000;\nconst EMBED_BACKOFF_CAP_MS = 8_000;\nconst EMBED_REQUEST_TIMEOUT_MS = 60_000;\n\n/**\n * Backoff before the next embedding attempt. Exponential (base·2^attempt) as a\n * floor, honoring the server's `retry-after` when present, but never longer\n * than {@link EMBED_BACKOFF_CAP_MS}; ±25% jitter spreads retries from a burst.\n */\nfunction embeddingBackoffMs(attempt: number, retryAfterSec?: number): number {\n const exp = EMBED_BACKOFF_BASE_MS * 2 ** attempt;\n const serverHint =\n typeof retryAfterSec === \"number\" && retryAfterSec > 0\n ? retryAfterSec * 1000\n : 0;\n const base = Math.min(EMBED_BACKOFF_CAP_MS, Math.max(exp, serverHint));\n return Math.round(base * (1 + Math.random() * 0.25));\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction extractRateLimitInfo(response: Response): {\n remainingRequests?: number;\n remainingTokens?: number;\n limitRequests?: number;\n limitTokens?: number;\n resetRequests?: string;\n resetTokens?: string;\n retryAfter?: number;\n} {\n return {\n remainingRequests:\n parseInt(response.headers.get(\"x-ratelimit-remaining-requests\") || \"\", 10) || undefined,\n remainingTokens:\n parseInt(response.headers.get(\"x-ratelimit-remaining-tokens\") || \"\", 10) || undefined,\n limitRequests:\n parseInt(response.headers.get(\"x-ratelimit-limit-requests\") || \"\", 10) || undefined,\n limitTokens: parseInt(response.headers.get(\"x-ratelimit-limit-tokens\") || \"\", 10) || undefined,\n resetRequests: response.headers.get(\"x-ratelimit-reset-requests\") || undefined,\n resetTokens: response.headers.get(\"x-ratelimit-reset-tokens\") || undefined,\n retryAfter: parseInt(response.headers.get(\"retry-after\") || \"\", 10) || undefined,\n };\n}\n\nfunction getEmbeddingConfig(runtime: IAgentRuntime) {\n const embeddingModelName = getSetting(\n runtime,\n \"ELIZAOS_CLOUD_EMBEDDING_MODEL\",\n \"text-embedding-3-small\"\n );\n const embeddingDimension = Number.parseInt(\n getSetting(runtime, \"ELIZAOS_CLOUD_EMBEDDING_DIMENSIONS\", \"1536\") || \"1536\",\n 10\n ) as (typeof VECTOR_DIMS)[keyof typeof VECTOR_DIMS];\n\n if (!Object.values(VECTOR_DIMS).includes(embeddingDimension)) {\n const errorMsg = `Invalid embedding dimension: ${embeddingDimension}. Must be one of: ${Object.values(VECTOR_DIMS).join(\", \")}`;\n logger.error(errorMsg);\n throw new Error(errorMsg);\n }\n\n return { embeddingModelName, embeddingDimension };\n}\n\n/**\n * The init probe vector. `runtime.ensureEmbeddingDimension()` calls the handler\n * with `null` purely to learn the vector length; it only inspects `.length`, so\n * a deterministic non-zero[0] marker vector is the correct, legitimate response.\n * This is the ONLY place a synthetic vector is returned — every real failure\n * throws so it can never be persisted as a corrupt embedding (Commandment 8).\n */\nfunction createInitProbeVector(dimension: number): number[] {\n const vector = Array(dimension).fill(0);\n vector[0] = 0.1;\n return vector;\n}\n\nexport interface BatchEmbeddingParams {\n texts: string[];\n}\n\nexport async function handleTextEmbedding(\n runtime: IAgentRuntime,\n params: TextEmbeddingParams | string | null\n): Promise<number[]> {\n const { embeddingDimension } = getEmbeddingConfig(runtime);\n\n if (params === null) {\n logger.debug(\"Creating test embedding for initialization\");\n return createInitProbeVector(embeddingDimension);\n }\n\n let text: string;\n if (typeof params === \"string\") {\n text = params;\n } else if (typeof params === \"object\" && params.text) {\n text = params.text;\n } else {\n // A malformed request is a programming error, not a recoverable runtime\n // state. Throw instead of returning a marker vector that would silently\n // corrupt the embedding store (Commandment 8).\n throw new Error(\"Invalid input format for embedding: expected string or { text: string }\");\n }\n\n if (!text.trim()) {\n throw new Error(\"Cannot generate embedding for empty text\");\n }\n\n const results = await handleBatchTextEmbedding(runtime, [text]);\n return results[0];\n}\n\nexport interface BatchEmbeddingResult {\n embedding: number[];\n index: number;\n success: boolean;\n error?: string;\n}\n\nexport async function handleBatchTextEmbedding(\n runtime: IAgentRuntime,\n texts: string[]\n): Promise<number[][]> {\n const { embeddingModelName, embeddingDimension } = getEmbeddingConfig(runtime);\n const client = createCloudApiClient(runtime, true);\n\n if (!texts || texts.length === 0) {\n return [];\n }\n\n // Every text must be non-empty: an empty input cannot produce a meaningful\n // vector, and a marker/zero vector would silently corrupt the store. Surface\n // the bad input to the caller (Commandment 8) instead of papering over it.\n const validTexts: { text: string; originalIndex: number }[] = [];\n for (let i = 0; i < texts.length; i++) {\n const text = texts[i]?.trim();\n if (!text) {\n throw new Error(`Cannot generate embedding for empty text at index ${i}`);\n }\n validTexts.push({ text, originalIndex: i });\n }\n\n const results: number[][] = new Array(texts.length);\n\n for (let batchStart = 0; batchStart < validTexts.length; batchStart += MAX_BATCH_SIZE) {\n const batchEnd = Math.min(batchStart + MAX_BATCH_SIZE, validTexts.length);\n const batch = validTexts.slice(batchStart, batchEnd);\n const batchTexts = batch.map((b) => b.text);\n\n logger.info(\n `[BatchEmbeddings] Processing batch ${Math.floor(batchStart / MAX_BATCH_SIZE) + 1}/${Math.ceil(validTexts.length / MAX_BATCH_SIZE)}: ${batch.length} texts`\n );\n\n try {\n // Records a `cloud.embedding` span on the active per-turn timer when an\n // embedding happens to be on a turn's critical path (most are queued /\n // detached, so this is a no-op there — which is exactly what proves they\n // don't add to turn latency). Retries transient throttling/5xx with\n // bounded exponential backoff (see EMBED_* constants) instead of a single\n // 30s blind sleep.\n let response: Response | null = null;\n for (let attempt = 0; attempt < EMBED_MAX_ATTEMPTS; attempt++) {\n const resp = await timeInferenceSpan(\n \"cloud.embedding\",\n () =>\n client.requestRaw(\"POST\", \"/embeddings\", {\n json: {\n model: embeddingModelName,\n input: batchTexts,\n },\n timeoutMs: EMBED_REQUEST_TIMEOUT_MS,\n }),\n { batch: batchTexts.length, attempt }\n );\n\n const rateLimitInfo = extractRateLimitInfo(resp);\n if (\n rateLimitInfo.remainingRequests !== undefined &&\n rateLimitInfo.remainingRequests < 50\n ) {\n logger.warn(\n `[BatchEmbeddings] Rate limit: ${rateLimitInfo.remainingRequests}/${rateLimitInfo.limitRequests} requests remaining`\n );\n }\n\n const transient =\n resp.status === 429 ||\n resp.status === 502 ||\n resp.status === 503 ||\n resp.status === 504;\n if (transient && attempt < EMBED_MAX_ATTEMPTS - 1) {\n const delay = embeddingBackoffMs(attempt, rateLimitInfo.retryAfter);\n logger.warn(\n `[BatchEmbeddings] ${resp.status} (attempt ${attempt + 1}/${EMBED_MAX_ATTEMPTS}) — backing off ${delay}ms`\n );\n // Drain the body so the underlying connection can be reused.\n await resp.text().catch(() => undefined);\n await sleep(delay);\n continue;\n }\n response = resp;\n break;\n }\n\n // Type guard: the loop assigns `response` on its final iteration, so this\n // is unreachable in practice.\n if (!response) {\n throw new Error(\"[BatchEmbeddings] No response after retry loop\");\n }\n\n if (!response.ok) {\n // Auth errors (401/403) are non-recoverable with the current key.\n // Every other non-OK status is just as fatal for this batch — neither\n // can produce real vectors. Throw in both cases so the router falls\n // through to the next provider (e.g. local inference) instead of\n // silently persisting marker/zero vectors that corrupt the embedding\n // store. Commandment 8: don't hide broken pipelines behind fallbacks.\n if (response.status === 401 || response.status === 403) {\n throw new Error(\n `[BatchEmbeddings] Authentication failed (${response.status}). ` +\n `Check ELIZAOS_CLOUD_API_KEY or ELIZAOS_CLOUD_EMBEDDING_API_KEY — ` +\n `the current key is not authorized for the embedding endpoint.`\n );\n }\n throw new Error(\n `[BatchEmbeddings] API error: ${response.status} ${response.statusText}`\n );\n }\n\n const data = (await response.json()) as {\n data?: Array<{ embedding: number[]; index: number }>;\n usage?: { prompt_tokens: number; total_tokens: number };\n };\n\n if (!data?.data || !Array.isArray(data.data)) {\n throw new Error(\"[BatchEmbeddings] API returned invalid response structure\");\n }\n\n for (const item of data.data) {\n const originalIndex = batch[item.index].originalIndex;\n results[originalIndex] = item.embedding;\n }\n\n if (data.usage) {\n const usage = {\n inputTokens: data.usage.prompt_tokens,\n outputTokens: 0,\n totalTokens: data.usage.total_tokens,\n };\n emitModelUsageEvent(runtime, ModelType.TEXT_EMBEDDING, `batch:${batch.length}`, usage);\n }\n\n logger.debug(\n `[BatchEmbeddings] Got ${batch.length} embeddings (${embeddingDimension}d)`\n );\n } catch (error) {\n // Any failure in this batch (HTTP error, transport error, malformed body)\n // means we have no real vectors for it. Log context and re-throw so the\n // router can fall through to another provider; never persist marker/zero\n // vectors that would corrupt the embedding store (Commandment 8).\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`[BatchEmbeddings] Batch failed: ${message}`);\n throw error instanceof Error ? error : new Error(message);\n }\n }\n\n return results;\n}\n",
|
|
33
|
+
"import {\n EventType,\n type IAgentRuntime,\n type ModelEventPayload,\n type ModelTypeName,\n} from \"@elizaos/core\";\nimport type { LanguageModelUsage } from \"ai\";\n\n/**\n * Extra metadata that rides along with a {@link ModelEventPayload} so that\n * downstream consumers (e.g. the waifu metering bridge) can attribute spend\n * to a concrete model id and, when the cloud surfaces it, the authoritative\n * post-markup USD cost it just debited from the org's credit balance.\n *\n * These are additive fields layered onto the standard payload — the core\n * {@link ModelEventPayload} shape is unchanged for every other listener.\n */\nexport interface ModelUsageEventMeta {\n /** Resolved provider model id, e.g. \"anthropic/claude-opus-4.7\". */\n modelName?: string;\n /**\n * Authoritative USD cost the metered gateway charged for this call, when\n * available (e.g. from a `usage.cost_usd` field or `X-Eliza-Cost-Usd`\n * response header). Undefined when the cloud does not surface it; consumers\n * then fall back to a token-based estimate.\n */\n costUsd?: number;\n}\n\nexport type ModelUsageEventPayload = ModelEventPayload & ModelUsageEventMeta;\n\nexport function emitModelUsageEvent(\n runtime: IAgentRuntime,\n type: ModelTypeName,\n _prompt: string,\n usage: Partial<LanguageModelUsage> & {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n },\n meta: ModelUsageEventMeta = {}\n) {\n const inputTokens = Number(usage.inputTokens || 0);\n const outputTokens = Number(usage.outputTokens || 0);\n const totalTokens = Number(\n usage.totalTokens != null ? usage.totalTokens : inputTokens + outputTokens\n );\n\n const payload: ModelUsageEventPayload = {\n runtime,\n source: \"elizacloud\",\n type,\n tokens: {\n prompt: inputTokens,\n completion: outputTokens,\n total: totalTokens,\n },\n ...(meta.modelName ? { modelName: meta.modelName } : {}),\n ...(typeof meta.costUsd === \"number\" && Number.isFinite(meta.costUsd)\n ? { costUsd: meta.costUsd }\n : {}),\n };\n\n runtime.emitEvent(EventType.MODEL_USED, payload);\n}\n",
|
|
34
|
+
"import type { IAgentRuntime, ImageDescriptionParams, ImageGenerationParams } from \"@elizaos/core\";\nimport { logger, ModelType } from \"@elizaos/core\";\nimport {\n getImageDescriptionModel,\n getImageGenerationModel,\n getSetting,\n resolveCloudTimeoutMs,\n} from \"../utils/config\";\nimport { emitModelUsageEvent } from \"../utils/events\";\nimport { parseImageDescriptionResponse } from \"../utils/helpers\";\nimport { createElizaCloudClient } from \"../utils/sdk-client\";\n\nexport async function handleImageGeneration(\n runtime: IAgentRuntime,\n params: ImageGenerationParams\n): Promise<{ url: string }[]> {\n const numImages = params.count || 1;\n const size = params.size || \"1024x1024\";\n const prompt = params.prompt;\n const modelName = getImageGenerationModel(runtime);\n logger.log(`[ELIZAOS_CLOUD] Using IMAGE model: ${modelName}`);\n\n const aspectRatioMap: Record<string, string> = {\n \"1024x1024\": \"1:1\",\n \"1792x1024\": \"16:9\",\n \"1024x1792\": \"9:16\",\n };\n const aspectRatio = aspectRatioMap[size] || \"1:1\";\n\n try {\n const requestBody = {\n prompt: prompt,\n numImages: numImages,\n aspectRatio: aspectRatio,\n model: modelName,\n };\n\n const typedData = await createElizaCloudClient(runtime).generateImage(requestBody);\n\n const result = typedData.images.map((img: { url?: string; image?: string }) => ({\n url: img.url ?? img.image ?? \"\",\n }));\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`[ELIZAOS_CLOUD] Image generation error: ${message}`);\n throw error;\n }\n}\n\nexport async function handleImageDescription(\n runtime: IAgentRuntime,\n params: ImageDescriptionParams | string\n): Promise<{ title: string; description: string }> {\n // Honour `DISABLE_IMAGE_DESCRIPTION` (set by the runtime when\n // `features.vision === false`). The runtime exposes it via getSetting; some\n // hosts only set it in process.env. Check both before burning a quota slot.\n // The docs (`docs/runtime/core.md`) already promise this behaviour, but\n // historically only `plugin-discord` honoured it at the call site, leaving\n // every other caller (agent-orchestrator's task validator, vision, lifeops,\n // farcaster, telegram) free to spend the rate-limit budget.\n const disableSetting = getSetting(runtime, \"DISABLE_IMAGE_DESCRIPTION\", \"\");\n const disabled = [disableSetting, process.env.DISABLE_IMAGE_DESCRIPTION].some((value) => {\n const normalized = value?.trim().toLowerCase();\n return normalized === \"1\" || normalized === \"true\" || normalized === \"yes\" || normalized === \"on\";\n });\n if (disabled) {\n logger.debug(\"[ELIZAOS_CLOUD] IMAGE_DESCRIPTION skipped — DISABLE_IMAGE_DESCRIPTION is set\");\n return {\n title: \"Image description disabled\",\n description: \"Image description is disabled by configuration.\",\n };\n }\n\n let imageUrl: string;\n let promptText: string | undefined;\n const modelName = getImageDescriptionModel(runtime);\n logger.log(`[ELIZAOS_CLOUD] Using IMAGE_DESCRIPTION model: ${modelName}`);\n const maxTokens = Number.parseInt(\n getSetting(runtime, \"ELIZAOS_CLOUD_IMAGE_DESCRIPTION_MAX_TOKENS\", \"8192\") || \"8192\",\n 10\n );\n\n if (typeof params === \"string\") {\n imageUrl = params;\n promptText = \"Please analyze this image and provide a title and detailed description.\";\n } else {\n imageUrl = params.imageUrl;\n promptText =\n params.prompt || \"Please analyze this image and provide a title and detailed description.\";\n }\n\n const messages = [\n {\n role: \"user\",\n content: [\n { type: \"text\", text: promptText },\n { type: \"image_url\", image_url: { url: imageUrl } },\n ],\n },\n ];\n\n const client = createElizaCloudClient(runtime);\n\n try {\n const requestBody: Record<string, unknown> = {\n model: modelName,\n messages: messages,\n max_tokens: maxTokens,\n };\n\n // On 429, honour the upstream's `retryAfter` instead of retrying on a\n // hardcoded backoff. Hardcoded retries inside the rate-limit window add\n // wasted requests to the same bucket and make the problem worse — see\n // #7374's billing render-loop fix and S33's dashboard 429-aware UX.\n // Strategy: only retry once, only if the upstream signals a short wait\n // (≤5s, i.e. transient burst). Anything longer, bail immediately and let\n // the caller fail fast.\n let response: Response | null = null;\n let attemptedRetry = false;\n for (let attempt = 0; attempt < 2; attempt++) {\n const attemptResponse = await client.routes.postApiV1ChatCompletionsRaw({\n json: requestBody,\n timeoutMs: resolveCloudTimeoutMs(\"ELIZAOS_CLOUD_IMAGE_TIMEOUT_MS\", 120_000),\n });\n if (!attemptResponse) {\n continue;\n }\n response = attemptResponse;\n if (attemptResponse.status !== 429 || attemptedRetry) break;\n\n // `Number(null) === 0`, so guard against a missing header before\n // calling `Number(...)` — otherwise the header path always wins with a\n // bogus `0` and the body fallback becomes unreachable.\n const headerValue = attemptResponse.headers.get(\"retry-after\");\n const headerRetryAfter =\n headerValue !== null && Number.isFinite(Number(headerValue))\n ? Number(headerValue)\n : undefined;\n let bodyRetryAfter: number | undefined;\n try {\n const peek = (await attemptResponse.clone().json()) as {\n retryAfter?: unknown;\n };\n bodyRetryAfter =\n typeof peek?.retryAfter === \"number\" && Number.isFinite(peek.retryAfter)\n ? peek.retryAfter\n : undefined;\n } catch {\n // Body wasn't JSON — fall through to header value.\n }\n const retryAfter = headerRetryAfter ?? bodyRetryAfter ?? 0;\n\n if (retryAfter > 0 && retryAfter <= 5) {\n logger.warn(\n `[ELIZAOS_CLOUD] Image analysis rate-limited (429), retrying once after ${retryAfter}s...`\n );\n await new Promise((r) => setTimeout(r, retryAfter * 1000));\n attemptedRetry = true;\n continue;\n }\n // Long rate-limit window: don't burn another bucket slot retrying inside it.\n logger.warn(\n `[ELIZAOS_CLOUD] Image analysis rate-limited (429); upstream retryAfter=${retryAfter || \"unknown\"}s — failing fast`\n );\n break;\n }\n\n if (!response) {\n throw new Error(\"ElizaOS Cloud API did not return a response\");\n }\n\n const finalResponse = response;\n\n if (!finalResponse.ok) {\n const status = finalResponse.status;\n if (status === 402) {\n throw new Error(\n \"Eliza Cloud credits exhausted — top up at https://www.elizacloud.ai/dashboard/settings?tab=billing\"\n );\n }\n if (status === 429) {\n throw new Error(\n \"Eliza Cloud rate limit exceeded for image description — try again in a minute\"\n );\n }\n throw new Error(`ElizaOS Cloud API error: ${status}`);\n }\n\n type OpenAIResponseType = {\n choices?: Array<{\n message?: { content?: string };\n finish_reason?: string;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n };\n\n const typedResult = (await finalResponse.json()) as OpenAIResponseType;\n const content = typedResult.choices?.[0]?.message?.content;\n\n if (typedResult.usage) {\n emitModelUsageEvent(\n runtime,\n ModelType.IMAGE_DESCRIPTION,\n typeof params === \"string\" ? params : params.prompt || \"\",\n {\n inputTokens: typedResult.usage.prompt_tokens,\n outputTokens: typedResult.usage.completion_tokens,\n totalTokens: typedResult.usage.total_tokens,\n }\n );\n }\n\n if (!content) {\n return {\n title: \"Failed to analyze image\",\n description: \"No response from API\",\n };\n }\n\n return parseImageDescriptionResponse(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Error analyzing image: ${message}`);\n return {\n title: \"Failed to analyze image\",\n description: `Error: ${message}`,\n };\n }\n}\n",
|
|
21
35
|
"import { logger } from \"@elizaos/core\";\nimport { JSONParseError } from \"ai\";\nimport type { ImageDescriptionResult } from \"../types\";\n\nexport function getJsonRepairFunction(): (params: {\n text: string;\n error: unknown;\n}) => Promise<string | null> {\n return async ({ text, error }: { text: string; error: unknown }) => {\n try {\n if (error instanceof JSONParseError) {\n const cleanedText = text.replace(/```json\\n|\\n```|```/g, \"\");\n JSON.parse(cleanedText);\n return cleanedText;\n }\n return null;\n } catch (jsonError) {\n const message = jsonError instanceof Error ? jsonError.message : String(jsonError);\n logger.warn(`Failed to repair JSON text: ${message}`);\n return null;\n }\n };\n}\n\nexport function detectAudioMimeType(buffer: Buffer): string {\n if (buffer.length < 12) {\n return \"application/octet-stream\";\n }\n\n if (\n buffer[0] === 0x52 &&\n buffer[1] === 0x49 &&\n buffer[2] === 0x46 &&\n buffer[3] === 0x46 &&\n buffer[8] === 0x57 &&\n buffer[9] === 0x41 &&\n buffer[10] === 0x56 &&\n buffer[11] === 0x45\n ) {\n return \"audio/wav\";\n }\n\n if (\n (buffer[0] === 0x49 && buffer[1] === 0x44 && buffer[2] === 0x33) || // ID3\n (buffer[0] === 0xff && (buffer[1] & 0xe0) === 0xe0) // MPEG sync\n ) {\n return \"audio/mpeg\";\n }\n\n if (buffer[0] === 0x4f && buffer[1] === 0x67 && buffer[2] === 0x67 && buffer[3] === 0x53) {\n return \"audio/ogg\";\n }\n\n if (buffer[0] === 0x66 && buffer[1] === 0x4c && buffer[2] === 0x61 && buffer[3] === 0x43) {\n return \"audio/flac\";\n }\n\n if (buffer[4] === 0x66 && buffer[5] === 0x74 && buffer[6] === 0x79 && buffer[7] === 0x70) {\n return \"audio/mp4\";\n }\n\n if (buffer[0] === 0x1a && buffer[1] === 0x45 && buffer[2] === 0xdf && buffer[3] === 0xa3) {\n return \"audio/webm\";\n }\n\n logger.warn(\"Could not detect audio format from buffer, using generic binary type\");\n return \"application/octet-stream\";\n}\n\nexport async function webStreamToNodeStream(webStream: ReadableStream<Uint8Array>) {\n try {\n const { Readable } = await import(\"node:stream\");\n const reader = webStream.getReader();\n\n return new Readable({\n async read() {\n try {\n const { done, value } = await reader.read();\n if (done) {\n this.push(null);\n } else {\n this.push(value);\n }\n } catch (error) {\n this.destroy(error as Error);\n }\n },\n destroy(error, callback) {\n reader.cancel().finally(() => callback(error));\n },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Failed to load node:stream module: ${message}`);\n throw new Error(\n `Cannot convert stream: node:stream module unavailable. This feature requires a Node.js environment.`\n );\n }\n}\n\nexport function parseImageDescriptionResponse(responseText: string): ImageDescriptionResult {\n const titleMatch = responseText.match(/title[:\\s]+(.+?)(?:\\n|$)/i);\n const title = titleMatch?.[1]?.trim() || \"Image Analysis\";\n const description = responseText.replace(/title[:\\s]+(.+?)(?:\\n|$)/i, \"\").trim();\n\n return { title, description };\n}\n",
|
|
22
|
-
"
|
|
23
|
-
"import { createOpenAI } from \"@ai-sdk/openai\";\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport { getApiKey, getBaseURL, isProxyMode } from \"../utils/config\";\n\nexport function createOpenAIClient(runtime: IAgentRuntime) {\n const baseURL = getBaseURL(runtime);\n const apiKey = getApiKey(runtime) ?? (isProxyMode(runtime) ? \"eliza-proxy\" : undefined);\n // NOTE: Callers must use openai.chat(modelName) instead of openai(modelName)\n // to force the Chat Completions API. The default openai(modelName) routes\n // to the Responses API which does not support presencePenalty,\n // frequencyPenalty, or stopSequences and emits noisy warnings.\n return createOpenAI({\n apiKey: (apiKey ?? \"\") as string,\n baseURL,\n });\n}\n",
|
|
24
|
-
"/** Research model handler — calls /responses for deep-research models. */\n\nimport type {\n IAgentRuntime,\n ResearchAnnotation,\n ResearchOutputItem,\n ResearchParams,\n ResearchResult,\n} from \"@elizaos/core\";\nimport { logger, ModelType } from \"@elizaos/core\";\nimport { getAuthHeader, getBaseURL, getResearchModel } from \"../utils/config\";\nimport { emitModelUsageEvent } from \"../utils/events\";\n\ninterface ResponsesAPIOutput {\n id: string;\n status: string;\n output: Array<{\n type: string;\n id?: string;\n status?: string;\n content?: Array<{\n type: string;\n text?: string;\n annotations?: Array<{\n type: string;\n url?: string;\n title?: string;\n start_index?: number;\n end_index?: number;\n }>;\n }>;\n action?: {\n type: string;\n query?: string;\n url?: string;\n };\n query?: string;\n results?: Array<{\n file_id: string;\n file_name: string;\n score: number;\n }>;\n code?: string;\n output?: string;\n server_label?: string;\n tool_name?: string;\n arguments?: Record<string, unknown>;\n result?: unknown;\n }>;\n usage?: {\n input_tokens: number;\n output_tokens: number;\n total_tokens: number;\n };\n}\n\nfunction parseAnnotations(\n raw: Array<{\n type: string;\n url?: string;\n title?: string;\n start_index?: number;\n end_index?: number;\n }>\n): ResearchAnnotation[] {\n return raw\n .filter((a) => a.url !== undefined)\n .map((a) => ({\n url: a.url as string,\n title: a.title ?? \"\",\n startIndex: a.start_index ?? 0,\n endIndex: a.end_index ?? 0,\n }));\n}\n\nfunction parseOutputItems(raw: ResponsesAPIOutput[\"output\"]): ResearchOutputItem[] {\n const items: ResearchOutputItem[] = [];\n\n for (const item of raw) {\n switch (item.type) {\n case \"web_search_call\":\n items.push({\n id: item.id ?? \"\",\n type: \"web_search_call\",\n status: (item.status as \"completed\" | \"failed\") ?? \"completed\",\n action: {\n type: (item.action?.type as \"search\" | \"open_page\" | \"find_in_page\") ?? \"search\",\n query: item.action?.query,\n url: item.action?.url,\n },\n });\n break;\n case \"file_search_call\":\n items.push({\n id: item.id ?? \"\",\n type: \"file_search_call\",\n status: (item.status as \"completed\" | \"failed\") ?? \"completed\",\n query: item.query ?? \"\",\n results: item.results?.map((r) => ({\n fileId: r.file_id,\n fileName: r.file_name,\n score: r.score,\n })),\n });\n break;\n case \"code_interpreter_call\":\n items.push({\n id: item.id ?? \"\",\n type: \"code_interpreter_call\",\n status: (item.status as \"completed\" | \"failed\") ?? \"completed\",\n code: item.code ?? \"\",\n output: item.output,\n });\n break;\n case \"mcp_tool_call\":\n items.push({\n id: item.id ?? \"\",\n type: \"mcp_tool_call\",\n status: (item.status as \"completed\" | \"failed\") ?? \"completed\",\n serverLabel: item.server_label ?? \"\",\n toolName: item.tool_name ?? \"\",\n arguments: (item.arguments ?? {}) as Record<string, import(\"@elizaos/core\").JsonValue>,\n result: item.result as import(\"@elizaos/core\").JsonValue | undefined,\n });\n break;\n case \"message\": {\n const content = item.content ?? [];\n items.push({\n type: \"message\",\n content: content\n .filter((c) => c.type === \"output_text\")\n .map((c) => ({\n type: \"output_text\" as const,\n text: c.text ?? \"\",\n annotations: parseAnnotations(c.annotations ?? []),\n })),\n });\n break;\n }\n }\n }\n\n return items;\n}\n\nexport async function handleResearch(\n runtime: IAgentRuntime,\n params: ResearchParams\n): Promise<ResearchResult> {\n const modelName = params.model ?? getResearchModel(runtime);\n logger.log(`[ELIZAOS_CLOUD] Using RESEARCH model: ${modelName}`);\n\n const baseURL = getBaseURL(runtime);\n\n const tools = params.tools ?? [{ type: \"web_search_preview\" }];\n\n const requestBody: Record<string, unknown> = {\n model: modelName,\n input: params.input,\n tools: tools,\n };\n\n if (params.instructions) {\n requestBody.instructions = params.instructions;\n }\n if (params.background !== undefined) {\n requestBody.background = params.background;\n }\n if (params.maxToolCalls !== undefined) {\n requestBody.max_tool_calls = params.maxToolCalls;\n }\n if (params.reasoningSummary) {\n requestBody.reasoning = { summary: params.reasoningSummary };\n }\n\n const response = await fetch(`${baseURL}/responses`, {\n method: \"POST\",\n headers: {\n ...getAuthHeader(runtime),\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Research API error: ${response.status} ${errorText}`);\n }\n\n const data = (await response.json()) as ResponsesAPIOutput;\n\n if (data.usage) {\n emitModelUsageEvent(runtime, ModelType.RESEARCH, params.input, {\n inputTokens: data.usage.input_tokens,\n outputTokens: data.usage.output_tokens,\n totalTokens: data.usage.total_tokens,\n });\n }\n\n const outputItems = parseOutputItems(data.output);\n\n // Extract final text and annotations from the last message output\n let text = \"\";\n const annotations: ResearchAnnotation[] = [];\n\n for (const item of outputItems) {\n if (item.type === \"message\") {\n for (const content of item.content) {\n if (content.type === \"output_text\") {\n text += content.text;\n annotations.push(...content.annotations);\n }\n }\n }\n }\n\n return {\n id: data.id,\n text,\n annotations,\n outputItems,\n status: data.status as ResearchResult[\"status\"],\n };\n}\n",
|
|
25
|
-
"
|
|
26
|
-
"import type {\n GenerateTextParams,\n IAgentRuntime,\n ModelTypeName,\n TextStreamResult,\n} from \"@elizaos/core\";\nimport { logger, ModelType } from \"@elizaos/core\";\nimport type { LanguageModel } from \"ai\";\nimport { generateText, streamText } from \"ai\";\nimport { createOpenAIClient } from \"../providers/openai\";\nimport {\n getExperimentalTelemetry,\n getLargeModel,\n getReasoningLargeModel,\n getReasoningSmallModel,\n getSmallModel,\n} from \"../utils/config\";\nimport { emitModelUsageEvent } from \"../utils/events\";\n\n/**\n * Models that are known to be reasoning-class and don't support temperature.\n * These are models that use chain-of-thought internally and reject\n */\nconst REASONING_MODEL_PATTERNS = [\n \"o1\",\n \"o3\",\n \"o4\",\n \"deepseek-r1\",\n \"deepseek-reasoner\",\n \"claude-opus-4.5\",\n \"claude-opus-4\",\n \"gpt-5-mini\",\n \"gpt-5\",\n] as const;\nconst RESPONSES_ROUTED_PREFIXES = [\"openai/\", \"anthropic/\"] as const;\ntype ChatAttachment = {\n data: string | Uint8Array | URL;\n mediaType: string;\n filename?: string;\n};\n\ntype GenerateTextParamsWithAttachments = GenerateTextParams & {\n attachments?: ChatAttachment[];\n};\n\nfunction buildUserContent(params: GenerateTextParamsWithAttachments) {\n const content: Array<\n | { type: \"text\"; text: string }\n | {\n type: \"file\";\n data: string | Uint8Array | URL;\n mediaType: string;\n filename?: string;\n }\n > = [{ type: \"text\", text: params.prompt }];\n\n for (const attachment of params.attachments ?? []) {\n content.push({\n type: \"file\",\n data: attachment.data,\n mediaType: attachment.mediaType,\n ...(attachment.filename ? { filename: attachment.filename } : {}),\n });\n }\n\n return content;\n}\n\nfunction isReasoningModel(modelName: string): boolean {\n const lower = modelName.toLowerCase();\n return REASONING_MODEL_PATTERNS.some((pattern) => lower.includes(pattern));\n}\n\nfunction supportsStopSequences(modelName: string): boolean {\n const lower = modelName.toLowerCase();\n return !RESPONSES_ROUTED_PREFIXES.some((prefix) => lower.startsWith(prefix));\n}\n\ntype TextModelType =\n | typeof ModelType.TEXT_SMALL\n | typeof ModelType.TEXT_LARGE\n | typeof ModelType.TEXT_REASONING_SMALL\n | typeof ModelType.TEXT_REASONING_LARGE;\n\nfunction getModelNameForType(runtime: IAgentRuntime, modelType: TextModelType): string {\n switch (modelType) {\n case ModelType.TEXT_SMALL:\n return getSmallModel(runtime);\n case ModelType.TEXT_LARGE:\n return getLargeModel(runtime);\n case ModelType.TEXT_REASONING_SMALL:\n return getReasoningSmallModel(runtime);\n case ModelType.TEXT_REASONING_LARGE:\n return getReasoningLargeModel(runtime);\n default:\n return getLargeModel(runtime);\n }\n}\n\nfunction buildGenerateParams(\n runtime: IAgentRuntime,\n modelType: TextModelType,\n params: GenerateTextParams\n) {\n const paramsWithAttachments = params as GenerateTextParamsWithAttachments;\n const { prompt } = params;\n const maxTokens = params.maxTokens ?? 8192;\n\n const openai = createOpenAIClient(runtime);\n const modelName = getModelNameForType(runtime, modelType);\n const experimentalTelemetry = getExperimentalTelemetry(runtime);\n const userContent =\n (paramsWithAttachments.attachments?.length ?? 0) > 0\n ? buildUserContent(paramsWithAttachments)\n : undefined;\n\n // Use openai.chat() (Chat Completions API) instead of openai.languageModel()\n // (Responses API). The Responses API unconditionally rejects presencePenalty,\n // frequencyPenalty, and stopSequences for ALL models, emitting noisy warnings.\n // The Chat Completions API supports these features natively and handles\n // reasoning models gracefully when the params are omitted.\n const model = openai.chat(modelName) as LanguageModel;\n\n // Reasoning models don't support temperature, frequency/presence penalties,\n // or stopSequences. Detect via model name patterns OR explicit reasoning model types.\n const reasoning =\n isReasoningModel(modelName) ||\n modelType === ModelType.TEXT_REASONING_SMALL ||\n modelType === ModelType.TEXT_REASONING_LARGE;\n const stopSequences =\n !reasoning &&\n supportsStopSequences(modelName) &&\n Array.isArray(params.stopSequences) &&\n params.stopSequences.length > 0\n ? params.stopSequences\n : undefined;\n\n const generateParams = {\n model,\n ...(userContent\n ? { messages: [{ role: \"user\" as const, content: userContent }] }\n : { prompt: prompt }),\n system: runtime.character.system ?? undefined,\n ...(stopSequences ? { stopSequences } : {}),\n maxOutputTokens: maxTokens,\n experimental_telemetry: {\n isEnabled: experimentalTelemetry,\n },\n };\n\n return { generateParams, modelName, modelType, prompt };\n}\n\nfunction handleStreamingGeneration(\n runtime: IAgentRuntime,\n modelType: ModelTypeName,\n generateParams: Parameters<typeof streamText>[0],\n prompt: string\n): TextStreamResult {\n logger.debug(`[ELIZAOS_CLOUD] Streaming text with ${modelType} model`);\n\n const streamResult = streamText(generateParams);\n\n return {\n textStream: streamResult.textStream,\n text: Promise.resolve(streamResult.text),\n usage: Promise.resolve(streamResult.usage).then((usage) => {\n if (usage) {\n emitModelUsageEvent(runtime, modelType, prompt, usage);\n const inputTokens = usage.inputTokens ?? 0;\n const outputTokens = usage.outputTokens ?? 0;\n return {\n promptTokens: inputTokens,\n completionTokens: outputTokens,\n totalTokens: inputTokens + outputTokens,\n };\n }\n return undefined;\n }),\n finishReason: Promise.resolve(streamResult.finishReason) as Promise<string | undefined>,\n };\n}\n\nasync function generateTextWithModel(\n runtime: IAgentRuntime,\n modelType: TextModelType,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n const { generateParams, modelName, prompt } = buildGenerateParams(runtime, modelType, params);\n\n logger.debug(`[ELIZAOS_CLOUD] Generating text with ${modelType} model: ${modelName}`);\n\n if (params.stream) {\n return handleStreamingGeneration(runtime, modelType, generateParams, prompt);\n }\n\n logger.log(`[ELIZAOS_CLOUD] Using ${modelType} model: ${modelName}`);\n logger.log(prompt);\n\n const response = await generateText(generateParams);\n\n if (response.usage) {\n emitModelUsageEvent(runtime, modelType, prompt, response.usage);\n }\n\n return response.text;\n}\n\nexport async function handleTextSmall(\n runtime: IAgentRuntime,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n return generateTextWithModel(runtime, ModelType.TEXT_SMALL, params);\n}\n\nexport async function handleTextLarge(\n runtime: IAgentRuntime,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n return generateTextWithModel(runtime, ModelType.TEXT_LARGE, params);\n}\n\nexport async function handleTextReasoningSmall(\n runtime: IAgentRuntime,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n return generateTextWithModel(runtime, ModelType.TEXT_REASONING_SMALL, params);\n}\n\nexport async function handleTextReasoningLarge(\n runtime: IAgentRuntime,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n return generateTextWithModel(runtime, ModelType.TEXT_REASONING_LARGE, params);\n}\n",
|
|
27
|
-
"/**\n *
|
|
28
|
-
"
|
|
36
|
+
"/** Research model handler — calls /responses for deep-research models. */\n\nimport type {\n IAgentRuntime,\n ResearchAnnotation,\n ResearchOutputItem,\n ResearchParams,\n ResearchResult,\n} from \"@elizaos/core\";\nimport { logger, ModelType } from \"@elizaos/core\";\nimport { getResearchModel, resolveCloudTimeoutMs } from \"../utils/config\";\nimport { emitModelUsageEvent } from \"../utils/events\";\nimport { createCloudApiClient } from \"../utils/sdk-client\";\n\n// Deep research is a long-running, TURN-BLOCKING call; without a timeout a\n// stalled gateway hangs the turn forever (cloud-sdk applies no default). The\n// default is deliberately generous (10 min) so a legitimately slow run isn't\n// aborted; `ELIZAOS_CLOUD_RESEARCH_TIMEOUT_MS=0` opts out.\nconst DEFAULT_RESEARCH_TIMEOUT_MS = 600_000;\n\ninterface ResponsesAPIOutput {\n id: string;\n status: string;\n output: Array<{\n type: string;\n id?: string;\n status?: string;\n content?: Array<{\n type: string;\n text?: string;\n annotations?: Array<{\n type: string;\n url?: string;\n title?: string;\n start_index?: number;\n end_index?: number;\n }>;\n }>;\n action?: {\n type: string;\n query?: string;\n url?: string;\n };\n query?: string;\n results?: Array<{\n file_id: string;\n file_name: string;\n score: number;\n }>;\n code?: string;\n output?: string;\n server_label?: string;\n tool_name?: string;\n arguments?: Record<string, unknown>;\n result?: unknown;\n }>;\n usage?: {\n input_tokens: number;\n output_tokens: number;\n total_tokens: number;\n };\n}\n\ntype ResponsesAPIInput =\n | string\n | Array<{\n role: \"user\" | \"system\" | \"assistant\";\n content: Array<{\n type: \"input_text\";\n text: string;\n }>;\n }>;\n\nfunction normalizeInput(input: ResearchParams[\"input\"]): ResponsesAPIInput {\n if (typeof input !== \"string\") {\n return input as ResponsesAPIInput;\n }\n\n return [\n {\n role: \"user\",\n content: [\n {\n type: \"input_text\",\n text: input,\n },\n ],\n },\n ];\n}\n\nfunction buildResearchApiError(status: number, errorText: string): Error {\n try {\n const parsed = JSON.parse(errorText) as {\n error?: { message?: string; param?: string; code?: string };\n };\n const message = parsed.error?.message;\n const param = parsed.error?.param;\n if (param === \"tools.0.type\" && message?.includes('expected \"function\"')) {\n return new Error(\n `Research API error: ${status} Eliza Cloud /responses rejected deep-research tool types; the provider currently only accepts function tools on this route`\n );\n }\n } catch {\n // Fall through to the raw error text.\n }\n\n return new Error(`Research API error: ${status} ${errorText}`);\n}\n\nfunction parseAnnotations(\n raw: Array<{\n type: string;\n url?: string;\n title?: string;\n start_index?: number;\n end_index?: number;\n }>\n): ResearchAnnotation[] {\n return raw\n .filter((a) => a.url !== undefined)\n .map((a) => ({\n url: a.url as string,\n title: a.title ?? \"\",\n startIndex: a.start_index ?? 0,\n endIndex: a.end_index ?? 0,\n }));\n}\n\nfunction parseOutputItems(raw: ResponsesAPIOutput[\"output\"]): ResearchOutputItem[] {\n const items: ResearchOutputItem[] = [];\n\n for (const item of raw) {\n switch (item.type) {\n case \"web_search_call\":\n items.push({\n id: item.id ?? \"\",\n type: \"web_search_call\",\n status: (item.status as \"completed\" | \"failed\") ?? \"completed\",\n action: {\n type: (item.action?.type as \"search\" | \"open_page\" | \"find_in_page\") ?? \"search\",\n query: item.action?.query,\n url: item.action?.url,\n },\n });\n break;\n case \"file_search_call\":\n items.push({\n id: item.id ?? \"\",\n type: \"file_search_call\",\n status: (item.status as \"completed\" | \"failed\") ?? \"completed\",\n query: item.query ?? \"\",\n results: item.results?.map((r) => ({\n fileId: r.file_id,\n fileName: r.file_name,\n score: r.score,\n })),\n });\n break;\n case \"code_interpreter_call\":\n items.push({\n id: item.id ?? \"\",\n type: \"code_interpreter_call\",\n status: (item.status as \"completed\" | \"failed\") ?? \"completed\",\n code: item.code ?? \"\",\n output: item.output,\n });\n break;\n case \"mcp_tool_call\":\n items.push({\n id: item.id ?? \"\",\n type: \"mcp_tool_call\",\n status: (item.status as \"completed\" | \"failed\") ?? \"completed\",\n serverLabel: item.server_label ?? \"\",\n toolName: item.tool_name ?? \"\",\n arguments: (item.arguments ?? {}) as Record<string, import(\"@elizaos/core\").JsonValue>,\n result: item.result as import(\"@elizaos/core\").JsonValue | undefined,\n });\n break;\n case \"message\": {\n const content = item.content ?? [];\n items.push({\n type: \"message\",\n content: content\n .filter((c) => c.type === \"output_text\")\n .map((c) => ({\n type: \"output_text\" as const,\n text: c.text ?? \"\",\n annotations: parseAnnotations(c.annotations ?? []),\n })),\n });\n break;\n }\n }\n }\n\n return items;\n}\n\nexport async function handleResearch(\n runtime: IAgentRuntime,\n params: ResearchParams\n): Promise<ResearchResult> {\n const modelName = params.model ?? getResearchModel(runtime);\n logger.log(`[ELIZAOS_CLOUD] Using RESEARCH model: ${modelName}`);\n\n const tools = params.tools ?? [{ type: \"web_search_preview\" }];\n\n const requestBody: Record<string, unknown> = {\n model: modelName,\n input: normalizeInput(params.input),\n tools: tools,\n };\n\n if (params.instructions) {\n requestBody.instructions = params.instructions;\n }\n if (params.background !== undefined) {\n requestBody.background = params.background;\n }\n if (params.maxToolCalls !== undefined) {\n requestBody.max_tool_calls = params.maxToolCalls;\n }\n if (params.reasoningSummary) {\n requestBody.reasoning = { summary: params.reasoningSummary };\n }\n\n const response = await createCloudApiClient(runtime).requestRaw(\"POST\", \"/responses\", {\n json: requestBody,\n timeoutMs: resolveCloudTimeoutMs(\n \"ELIZAOS_CLOUD_RESEARCH_TIMEOUT_MS\",\n DEFAULT_RESEARCH_TIMEOUT_MS\n ),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw buildResearchApiError(response.status, errorText);\n }\n\n const data = (await response.json()) as ResponsesAPIOutput;\n\n if (data.usage) {\n emitModelUsageEvent(runtime, ModelType.RESEARCH, params.input, {\n inputTokens: data.usage.input_tokens,\n outputTokens: data.usage.output_tokens,\n totalTokens: data.usage.total_tokens,\n });\n }\n\n const outputItems = parseOutputItems(data.output);\n\n // Extract final text and annotations from the last message output\n let text = \"\";\n const annotations: ResearchAnnotation[] = [];\n\n for (const item of outputItems) {\n if (item.type === \"message\") {\n for (const content of item.content) {\n if (content.type === \"output_text\") {\n text += content.text;\n annotations.push(...content.annotations);\n }\n }\n }\n }\n\n return {\n id: data.id,\n text,\n annotations,\n outputItems,\n status: data.status as ResearchResult[\"status\"],\n };\n}\n",
|
|
37
|
+
"import type { Readable } from \"node:stream\";\nimport type { AudioStreamResult, IAgentRuntime } from \"@elizaos/core\";\nimport { isCloudConnected, logger, toRuntimeSettings } from \"@elizaos/core\";\nimport type { OpenAITextToSpeechParams } from \"../types\";\nimport { getSetting, isBrowser, resolveCloudTimeoutMs } from \"../utils/config\";\nimport { webStreamToNodeStream } from \"../utils/helpers\";\nimport { createElizaCloudClient } from \"../utils/sdk-client\";\n\n/**\n * Narrow client interface the speech handler actually exercises. Lets tests\n * substitute a fake without rebuilding the full SDK surface.\n */\nexport interface CloudTtsClient {\n routes: {\n postApiV1VoiceTts<T = unknown>(options: {\n headers?: Record<string, unknown>;\n json: { text: string; voiceId?: string; modelId?: string };\n timeoutMs?: number;\n }): Promise<T>;\n };\n}\n\ntype CloudTtsClientFactory = (runtime: IAgentRuntime) => CloudTtsClient;\n\nlet cloudTtsClientFactory: CloudTtsClientFactory = (runtime) =>\n createElizaCloudClient(runtime) as unknown as CloudTtsClient;\n\n/**\n * Test seam: substitute the SDK client factory used by `handleTextToSpeech`.\n * Pass `null` to reset to the real `createElizaCloudClient`. Production code\n * should never call this.\n */\nexport function setCloudTtsClientFactoryForTesting(\n factory: CloudTtsClientFactory | null,\n): void {\n if (factory === null) {\n cloudTtsClientFactory = (runtime) =>\n createElizaCloudClient(runtime) as unknown as CloudTtsClient;\n } else {\n cloudTtsClientFactory = factory;\n }\n}\n\n/**\n * Extended TTS params accepted by the cloud handler.\n *\n * The runtime canonical type (`TextToSpeechParams`) only carries `text`, but\n * the cloud TTS upstream maps to ElevenLabs and therefore accepts arbitrary\n * ElevenLabs `voiceId` + `modelId`. We accept those via either OpenAI-style\n * (`voice`, `model`) or ElevenLabs-style (`voiceId`, `modelId`) fields and\n * normalize them to the upstream shape.\n */\nexport interface CloudTextToSpeechParams extends OpenAITextToSpeechParams {\n voiceId?: string;\n modelId?: string;\n}\n\n/**\n * Marker error used so the runtime can fall through to the next TTS handler\n * (e.g. local omnivoice) when Eliza Cloud is not connected.\n */\nexport class CloudTtsUnavailableError extends Error {\n constructor(message = \"Eliza Cloud is not connected\") {\n super(message);\n this.name = \"CloudTtsUnavailableError\";\n }\n}\n\nfunction normalizeTextInput(\n input: string | CloudTextToSpeechParams | OpenAITextToSpeechParams,\n): CloudTextToSpeechParams {\n if (typeof input === \"string\") return { text: input };\n return input as CloudTextToSpeechParams;\n}\n\n/**\n * Pull an ElevenLabs `modelId` out of (in order):\n * 1. options.modelId — explicit ElevenLabs model id\n * 2. options.model with `elevenlabs/` prefix or `eleven_*` shape\n *\n * Returns `undefined` when nothing usable was provided so the upstream\n * can apply its own default (currently `eleven_flash_v2_5`).\n */\nfunction resolveModelId(\n options: CloudTextToSpeechParams,\n): string | undefined {\n if (options.modelId && options.modelId.trim()) {\n return options.modelId.trim();\n }\n const model = options.model?.trim();\n if (!model) return undefined;\n if (model.startsWith(\"elevenlabs/\")) {\n return model.split(\"/\").slice(1).join(\"/\");\n }\n if (model.startsWith(\"eleven_\")) {\n return model;\n }\n return undefined;\n}\n\n/**\n * Pull an ElevenLabs `voiceId` out of (in order):\n * 1. options.voiceId — explicit ElevenLabs voice id (preferred)\n * 2. options.voice — OpenAI-style voice name (rejected unless it looks\n * like an ElevenLabs id, i.e. neither an OpenAI alias nor \"nova\")\n *\n * Returns `undefined` when nothing usable was provided so the upstream\n * can apply its own default voice.\n */\nfunction resolveVoiceId(\n options: CloudTextToSpeechParams,\n): string | undefined {\n if (options.voiceId && options.voiceId.trim()) {\n return options.voiceId.trim();\n }\n const voice = options.voice?.trim();\n if (!voice) return undefined;\n // \"nova\" is the OpenAI default — treat as unset so the upstream falls back\n // to the cloud default voice instead of being forwarded as an opaque alias.\n if (voice === \"nova\") return undefined;\n return voice;\n}\n\nasync function fetchTextToSpeech(\n runtime: IAgentRuntime,\n options: CloudTextToSpeechParams,\n): Promise<ReadableStream<Uint8Array> | Readable> {\n const format = options.format || \"mp3\";\n const modelId = resolveModelId(options);\n const voiceId = resolveVoiceId(options);\n\n try {\n const res = (await cloudTtsClientFactory(runtime).routes.postApiV1VoiceTts({\n headers: {\n ...(format === \"mp3\" ? { Accept: \"audio/mpeg\" } : {}),\n },\n json: {\n text: options.text,\n ...(voiceId ? { voiceId } : {}),\n ...(modelId ? { modelId } : {}),\n },\n timeoutMs: resolveCloudTimeoutMs(\"ELIZAOS_CLOUD_TTS_TIMEOUT_MS\", 60_000),\n })) as Response;\n\n if (!res.ok) {\n const err = await res.text();\n throw new Error(`ElizaOS Cloud TTS error ${res.status}: ${err}`);\n }\n\n if (!res.body) {\n throw new Error(\"ElizaOS Cloud TTS response body is null\");\n }\n\n if (!isBrowser()) {\n return await webStreamToNodeStream(res.body);\n }\n\n return res.body;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new Error(`Failed to fetch speech from ElizaOS Cloud TTS: ${message}`);\n }\n}\n\nfunction toUint8Array(chunk: unknown): Uint8Array {\n if (chunk instanceof Uint8Array) return chunk;\n if (chunk instanceof ArrayBuffer) return new Uint8Array(chunk);\n if (typeof chunk === \"string\") return new TextEncoder().encode(chunk);\n throw new TypeError(`Unexpected TTS chunk type: ${typeof chunk}`);\n}\n\nfunction concatChunks(chunks: Uint8Array[]): Uint8Array {\n const total = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);\n const out = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n out.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return out;\n}\n\nasync function webStreamToUint8Array(\n stream: ReadableStream<Uint8Array>,\n): Promise<Uint8Array> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n try {\n while (true) {\n const result = await reader.read();\n if (result.done) break;\n chunks.push(toUint8Array(result.value));\n }\n } finally {\n reader.releaseLock();\n }\n return concatChunks(chunks);\n}\n\nasync function nodeStreamToUint8Array(stream: Readable): Promise<Uint8Array> {\n const chunks: Uint8Array[] = [];\n for await (const chunk of stream) {\n chunks.push(toUint8Array(chunk));\n }\n return concatChunks(chunks);\n}\n\nfunction isReadableStream(\n stream: ReadableStream<Uint8Array> | Readable,\n): stream is ReadableStream<Uint8Array> {\n return typeof (stream as { getReader?: unknown }).getReader === \"function\";\n}\n\nasync function ttsStreamToBytes(\n stream: ReadableStream<Uint8Array> | Readable,\n): Promise<Uint8Array> {\n if (isReadableStream(stream)) {\n return webStreamToUint8Array(stream);\n }\n return nodeStreamToUint8Array(stream);\n}\n\n/**\n * Wrap the upstream TTS byte stream as an {@link AudioStreamResult}: `audioStream`\n * yields each chunk as it arrives (so playback can start on the first byte\n * instead of draining the whole clip via {@link ttsStreamToBytes}), and `bytes`\n * resolves to the full concatenated audio once the stream is consumed.\n */\nfunction buildAudioStreamResult(\n stream: ReadableStream<Uint8Array> | Readable,\n mimeType: string,\n): AudioStreamResult {\n const collected: Uint8Array[] = [];\n let resolveBytes!: (value: Uint8Array) => void;\n let rejectBytes!: (reason: unknown) => void;\n const bytes = new Promise<Uint8Array>((resolve, reject) => {\n resolveBytes = resolve;\n rejectBytes = reject;\n });\n async function* generate(): AsyncGenerator<Uint8Array> {\n try {\n if (isReadableStream(stream)) {\n const reader = stream.getReader();\n try {\n for (;;) {\n const { value, done } = await reader.read();\n if (done) break;\n const chunk = toUint8Array(value);\n collected.push(chunk);\n yield chunk;\n }\n } finally {\n reader.releaseLock();\n }\n } else {\n for await (const value of stream) {\n const chunk = toUint8Array(value);\n collected.push(chunk);\n yield chunk;\n }\n }\n resolveBytes(concatChunks(collected));\n } catch (err) {\n rejectBytes(err);\n throw err;\n }\n }\n return { audioStream: generate(), bytes, mimeType };\n}\n\n/**\n * TEXT_TO_SPEECH handler for plugin-elizacloud.\n *\n * Behavior:\n * - When Eliza Cloud is **not** connected, throws `CloudTtsUnavailableError`\n * so the runtime's model-handler fallback chain can pick the next\n * provider (e.g. local omnivoice, ElevenLabs direct, etc.).\n * - When connected, forwards `text`, `voiceId`, and `modelId` to the\n * upstream cloud TTS proxy and returns the audio stream.\n *\n * Accepts both OpenAI-style (`voice` / `model`) and ElevenLabs-style\n * (`voiceId` / `modelId`) input fields. ElevenLabs-style wins when both are\n * present.\n */\nexport async function handleTextToSpeech(\n runtime: IAgentRuntime,\n input: string | CloudTextToSpeechParams | OpenAITextToSpeechParams,\n): Promise<Uint8Array | AudioStreamResult> {\n if (!isCloudConnected(toRuntimeSettings(runtime))) {\n throw new CloudTtsUnavailableError(\n \"Eliza Cloud is not connected — falling through to next TTS handler\",\n );\n }\n\n const options = normalizeTextInput(input);\n // Explicit opt-in only (NOT the generic `stream` that useModel auto-injects\n // from an ambient text-streaming turn) so byte-expecting callers like the\n // GENERATE_MEDIA action keep getting a buffer.\n const wantsStream =\n typeof input === \"object\" &&\n input !== null &&\n (input as { audioStream?: boolean }).audioStream === true;\n\n const resolvedModel =\n options.modelId ||\n options.model ||\n (getSetting(runtime, \"ELIZAOS_CLOUD_TTS_MODEL\", \"eleven_flash_v2_5\") as string);\n logger.log(`[ELIZAOS_CLOUD] Using TEXT_TO_SPEECH model: ${resolvedModel}`);\n try {\n const speechStream = await fetchTextToSpeech(runtime, options);\n if (wantsStream) {\n const format = options.format || \"mp3\";\n const mimeType = format === \"mp3\" ? \"audio/mpeg\" : `audio/${format}`;\n return buildAudioStreamResult(speechStream, mimeType);\n }\n return ttsStreamToBytes(speechStream);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Error in TEXT_TO_SPEECH: ${message}`);\n throw error;\n }\n}\n\nexport { fetchTextToSpeech };\n",
|
|
38
|
+
"import type {\n GenerateTextParams,\n IAgentRuntime,\n ModelTypeName,\n TextStreamResult,\n TokenUsage,\n} from \"@elizaos/core\";\nimport {\n buildCanonicalSystemPrompt,\n logger,\n ModelType,\n recordInferenceSpan,\n renderChatMessagesForPrompt,\n resolveEffectiveSystemPrompt,\n Semaphore,\n timeInferenceSpan,\n} from \"@elizaos/core\";\nimport {\n getActionPlannerModel,\n getLargeModel,\n getMediumModel,\n getMegaModel,\n getNanoModel,\n getResponseHandlerModel,\n getSmallModel,\n} from \"../utils/config\";\nimport { emitModelUsageEvent } from \"../utils/events\";\nimport { extractResponsesOutputText } from \"../utils/responses-output\";\nimport { createCloudApiClient } from \"../utils/sdk-client\";\n\nconst TEXT_NANO_MODEL_TYPE = (ModelType.TEXT_NANO ?? \"TEXT_NANO\") as ModelTypeName;\nconst TEXT_MEDIUM_MODEL_TYPE = (ModelType.TEXT_MEDIUM ?? \"TEXT_MEDIUM\") as ModelTypeName;\nconst TEXT_SMALL_MODEL_TYPE = ModelType.TEXT_SMALL;\nconst TEXT_LARGE_MODEL_TYPE = ModelType.TEXT_LARGE;\nconst TEXT_MEGA_MODEL_TYPE = (ModelType.TEXT_MEGA ?? \"TEXT_MEGA\") as ModelTypeName;\nconst RESPONSE_HANDLER_MODEL_TYPE = (ModelType.RESPONSE_HANDLER ??\n \"RESPONSE_HANDLER\") as ModelTypeName;\nconst ACTION_PLANNER_MODEL_TYPE = (ModelType.ACTION_PLANNER ?? \"ACTION_PLANNER\") as ModelTypeName;\n\n/**\n * Per-process cap on CONCURRENT native cloud text calls.\n *\n * Covers BOTH native cloud text routes that share the one cerebras key:\n * the `/chat/completions` round-trip (native-transport callers) AND the\n * `/responses` round-trip (bare-`{ prompt }` callers, incl. the primary reply\n * action). Same model name -> same shared key -> same concurrency budget, so\n * both routes must funnel through this one semaphore or a bare-prompt call can\n * still push the key over its limit.\n *\n * The per-turn burst that triggers the 429 comes from the prompt BATCHER\n * (`dynamicPromptExecFromState`, which always sets providerOptions -> native\n * `/chat/completions`) and the merged evaluator call — NOT from composeState\n * providers (no provider calls `useModel` during composeState). Firing those\n * at once overruns the ONE shared cerebras key's concurrent-request limit\n * -> 429 -> 3 retries x backoff -> 30-63s of latency. Capping in-flight calls\n * through a small semaphore keeps each call ~3s with no 429, without needing\n * more keys or backend changes.\n *\n * Default is a SAFETY CEILING, not full serialization: the paid cerebras key\n * (1000 req/min) and leaner per-turn call counts make the 429 risk small, so\n * the default of 8 leaves the typical 1-3 concurrent calls/turn untouched while\n * still bounding a pathological burst. The limiter is process-global and keys\n * on native transport, not the model, so it also bounds non-cerebras native\n * calls (e.g. zai-glm-4.7) — a high default avoids serializing those. Set\n * `ELIZAOS_CLOUD_NATIVE_CONCURRENCY` (positive integer) to tighten it (1 = fully\n * serialize) on a cerebras-bottlenecked single-key deployment, or raise it for\n * more parallelism. Embeddings use a SEPARATE `/embeddings` route\n * (embeddings.ts) and are intentionally NOT gated here.\n */\nconst NATIVE_CONCURRENCY_ENV = \"ELIZAOS_CLOUD_NATIVE_CONCURRENCY\";\nconst DEFAULT_NATIVE_CONCURRENCY = 8;\n\n/**\n * Client-side timeout for cloud text round-trips. Without this the handler\n * passes no `timeoutMs`/`signal` to `requestRaw`, so a hung/slow gateway holds\n * the concurrency permit AND stalls the whole turn until fetch's own (very\n * long) default. `ELIZAOS_CLOUD_TEXT_TIMEOUT_MS` overrides; `0`/negative opts\n * out (no client-side timeout).\n */\nconst TEXT_TIMEOUT_ENV = \"ELIZAOS_CLOUD_TEXT_TIMEOUT_MS\";\nconst DEFAULT_TEXT_TIMEOUT_MS = 120_000;\n\nexport function resolveTextTimeoutMs(): number | undefined {\n const raw =\n typeof process !== \"undefined\" ? process.env[TEXT_TIMEOUT_ENV] : undefined;\n if (raw === undefined || raw.trim() === \"\") return DEFAULT_TEXT_TIMEOUT_MS;\n const parsed = Number.parseInt(raw, 10);\n if (!Number.isFinite(parsed)) return DEFAULT_TEXT_TIMEOUT_MS;\n return parsed <= 0 ? undefined : parsed;\n}\n\n/**\n * Token-by-token streaming of the native `/chat/completions` round-trip. On by\n * default so the user-visible reply renders from the first token instead of\n * waiting for the whole generation. `ELIZAOS_CLOUD_STREAMING=0`/`false`/`off`\n * forces the buffered path (kill-switch). Streaming only engages when the\n * runtime actually requests it (`params.stream`), so non-streaming callers\n * (connectors with no UI stream) are unaffected.\n */\nconst STREAMING_ENV = \"ELIZAOS_CLOUD_STREAMING\";\n\nexport function resolveStreamingEnabled(): boolean {\n const raw = typeof process !== \"undefined\" ? process.env[STREAMING_ENV] : undefined;\n if (raw === undefined) return true;\n const v = raw.trim().toLowerCase();\n return v !== \"0\" && v !== \"false\" && v !== \"off\";\n}\n\n/**\n * Combine the runtime's abort signal with the client-side timeout into one\n * signal for `requestRaw`. A stream is long-lived, so it should abort on EITHER\n * a caller cancel OR the timeout — `requestRaw` honors only a single signal, so\n * merge them here.\n */\nfunction buildStreamAbortSignal(\n abortSignal: AbortSignal | undefined,\n timeoutMs: number | undefined\n): AbortSignal | undefined {\n const timeoutSig =\n typeof timeoutMs === \"number\" && timeoutMs > 0\n ? AbortSignal.timeout(timeoutMs)\n : undefined;\n if (abortSignal && timeoutSig) return AbortSignal.any([abortSignal, timeoutSig]);\n return abortSignal ?? timeoutSig;\n}\n\nlet nativeChatLimiter: Semaphore | null = null;\n\nfunction resolveNativeConcurrency(): number {\n const raw =\n typeof process !== \"undefined\" ? process.env[NATIVE_CONCURRENCY_ENV] : undefined;\n const parsed = raw ? Number.parseInt(raw, 10) : Number.NaN;\n return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_NATIVE_CONCURRENCY;\n}\n\nfunction getNativeChatLimiter(): Semaphore {\n if (!nativeChatLimiter) {\n nativeChatLimiter = new Semaphore(resolveNativeConcurrency());\n }\n return nativeChatLimiter;\n}\n\n/**\n * Run a single cerebras-bound network round-trip under the shared per-process\n * concurrency cap. Hold the permit only across `fn` (the `requestRaw` call);\n * release the instant the server responds so response-body parsing runs\n * unguarded. `finally` frees the permit even on throw so a failed call never\n * starves the queue. Used by BOTH native text routes (`/chat/completions` and\n * `/responses`) so every cerebras text call shares one budget.\n *\n * Exported for unit tests that drive the shared cap directly.\n *\n * `label` (e.g. `responses` / `chat/completions`) tags the latency spans this\n * records on the active per-turn inference timer: `cloud.semaphore-wait` (time\n * spent queued for a permit — non-zero means the cap is serializing) and\n * `cloud.http:<label>` (the network round-trip). Both are no-ops when no turn\n * timer is active.\n */\nexport async function withNativeChatLimit<T>(\n fn: () => Promise<T>,\n label = \"native\"\n): Promise<T> {\n const limiter = getNativeChatLimiter();\n const waitStartedAt = Date.now();\n await limiter.acquire();\n recordInferenceSpan(\"cloud.semaphore-wait\", Date.now() - waitStartedAt, {\n route: label,\n });\n try {\n return await timeInferenceSpan(`cloud.http:${label}`, fn, { route: label });\n } finally {\n limiter.release();\n }\n}\n\n/**\n * Test-only: discard the cached limiter so the next call re-reads the env knob.\n * Production code never needs this — the knob is read once per process.\n */\nexport function __resetNativeChatLimiterForTests(): void {\n nativeChatLimiter = null;\n}\n\ntype ResponsesApiResponse = Record<string, unknown> & {\n error?: {\n message?: string;\n };\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n total_tokens?: number;\n } & Record<string, unknown>;\n};\n\n/**\n * Models that are known to be reasoning-class and don't support temperature.\n * These are models that use chain-of-thought internally and reject\n */\nconst REASONING_MODEL_PATTERNS = [\n \"o1\",\n \"o3\",\n \"o4\",\n \"deepseek-r1\",\n \"deepseek-reasoner\",\n \"claude-opus-4.7\",\n \"claude-opus-4-7\",\n \"gpt-5\",\n] as const;\ntype ChatAttachment = {\n data: string | Uint8Array | URL;\n mediaType: string;\n filename?: string;\n};\n\ntype GenerateTextParamsWithAttachments = GenerateTextParams & {\n attachments?: ChatAttachment[];\n};\n\ntype GenerateTextParamsWithNativeOptions = GenerateTextParamsWithAttachments & {\n messages?: unknown[];\n tools?: unknown;\n toolChoice?: unknown;\n responseSchema?: unknown;\n providerOptions?: Record<string, unknown>;\n};\n\ntype NativeTokenUsage = {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n cachedPromptTokens?: number;\n cacheReadInputTokens?: number;\n cacheCreationInputTokens?: number;\n};\n\ntype NativeGenerateTextResult = {\n text: string;\n toolCalls: unknown[];\n finishReason?: string;\n usage?: NativeTokenUsage;\n providerMetadata?: unknown;\n};\n\ntype NativeGenerateTextModelResult = NativeGenerateTextResult & string;\n\ntype NativeToolCall = {\n type: \"tool-call\";\n toolCallId: string;\n toolName: string;\n input: unknown;\n};\n\ntype ChatCompletionsResponse = Record<string, unknown> & {\n error?: {\n message?: string;\n };\n choices?: Array<{\n text?: string;\n finish_reason?: string;\n message?: {\n content?: unknown;\n tool_calls?: unknown[];\n };\n }>;\n usage?: Record<string, unknown>;\n};\n\n/**\n * Eliza-Cloud-hosted `eliza-1` model ids that run a fork of llama-server (or\n * vLLM with the eliza1 parsers) capable of honoring the `x-eliza-span-samplers`\n * header. Other upstreams (OpenAI / Anthropic / generic OpenRouter) strip\n * unknown headers safely, but to keep the wire surface narrow we only attach\n * the per-span sampler plan when the resolved model is one we know honors it.\n *\n * The \"we know\" bound is conservative — extend the prefix list when a new\n * fork-built deployment lands. The fallback is \"do not send the header\" which\n * preserves today's behavior on every other provider.\n */\nconst SPAN_SAMPLER_HONORING_MODEL_PREFIXES = [\n \"vast/eliza-1-\",\n \"elizaos/eliza-1-\",\n \"eliza-1-\",\n] as const;\n\nfunction isSpanSamplerHonoringModel(modelName: string): boolean {\n const lower = modelName.toLowerCase();\n return SPAN_SAMPLER_HONORING_MODEL_PREFIXES.some((prefix) =>\n lower.startsWith(prefix),\n );\n}\n\n/**\n * Build the `x-eliza-span-samplers` HTTP header value from a {@link SpanSamplerPlan}.\n * Returns `undefined` when there is no plan or no overrides — narrow the wire\n * surface so non-eliza providers never see a stray fork-extension header.\n *\n * Wire schema (snake_case):\n * { overrides: [{ span_index, temperature, top_k?, top_p? }, ...], strict?: boolean }\n */\nfunction buildSpanSamplerHeader(\n plan: GenerateTextParams[\"spanSamplerPlan\"],\n): string | undefined {\n if (!plan || plan.overrides.length === 0) return undefined;\n const overrides = plan.overrides.map((o) => {\n const wire: Record<string, unknown> = {\n span_index: o.spanIndex,\n temperature: o.temperature,\n };\n if (typeof o.topK === \"number\") wire.top_k = o.topK;\n if (typeof o.topP === \"number\") wire.top_p = o.topP;\n return wire;\n });\n const body: Record<string, unknown> = { overrides };\n if (plan.strict === true) body.strict = true;\n return JSON.stringify(body);\n}\n\n/**\n * Extract the authoritative USD cost the metered cloud gateway charged for a\n * request, when it surfaces one. The gateway is the only honest source of USD\n * (it owns the model-pricing table + platform markup); we prefer it over any\n * client-side token estimate. Checks the response body `usage.cost_usd` first,\n * then the `X-Eliza-Cost-Usd` response header. Returns undefined when neither\n * is present so consumers fall back to a token-based estimate.\n */\nfunction extractCostUsd(\n usage: unknown,\n response?: { headers?: { get?: (name: string) => string | null } }\n): number | undefined {\n const fromBody = firstNumber(\n asRecord(usage).cost_usd,\n asRecord(usage).costUsd,\n asRecord(usage).cost\n );\n if (typeof fromBody === \"number\" && Number.isFinite(fromBody)) {\n return fromBody;\n }\n const header = response?.headers?.get?.(\"X-Eliza-Cost-Usd\");\n if (header) {\n const parsed = Number(header);\n if (Number.isFinite(parsed)) return parsed;\n }\n return undefined;\n}\n\nfunction isReasoningModel(modelName: string): boolean {\n const lower = modelName.toLowerCase();\n return REASONING_MODEL_PATTERNS.some((pattern) => lower.includes(pattern));\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return isRecord(value) ? value : {};\n}\n\nfunction recordAt(value: Record<string, unknown>, key: string): Record<string, unknown> {\n return asRecord(value[key]);\n}\n\nfunction firstString(...values: unknown[]): string | undefined {\n for (const value of values) {\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value.trim();\n }\n }\n return undefined;\n}\n\nfunction firstNumber(...values: unknown[]): number | undefined {\n for (const value of values) {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === \"string\" && value.trim().length > 0) {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n }\n return undefined;\n}\n\nfunction parseJsonIfPossible(value: unknown): unknown {\n if (typeof value !== \"string\") {\n return value ?? {};\n }\n try {\n return JSON.parse(value) as unknown;\n } catch {\n return value;\n }\n}\n\nfunction stringifyMessageContent(content: unknown): string {\n if (typeof content === \"string\") {\n return content;\n }\n if (content == null) {\n return \"\";\n }\n return typeof content === \"object\" ? JSON.stringify(content) : String(content);\n}\n\nfunction hasNativeTransportOptions(params: GenerateTextParamsWithNativeOptions): boolean {\n return Boolean(\n params.messages ||\n params.tools ||\n params.toolChoice ||\n params.responseSchema ||\n params.providerOptions\n );\n}\n\nfunction shouldReturnNativeResult(params: GenerateTextParamsWithNativeOptions): boolean {\n return Boolean(params.messages || params.tools || params.toolChoice || params.responseSchema);\n}\n\nfunction buildNativeMessages(\n params: GenerateTextParamsWithNativeOptions,\n promptText: string,\n systemPrompt?: string\n): Array<Record<string, unknown>> {\n if (Array.isArray(params.messages) && params.messages.length > 0) {\n const messages = params.messages.map((message) =>\n isRecord(message)\n ? { ...message }\n : { role: \"user\", content: stringifyMessageContent(message) }\n );\n const first = asRecord(messages[0]);\n if (systemPrompt && first.role !== \"system\") {\n return [{ role: \"system\", content: systemPrompt }, ...messages];\n }\n return messages;\n }\n\n const messages: Array<Record<string, unknown>> = [];\n if (systemPrompt) {\n messages.push({ role: \"system\", content: systemPrompt });\n }\n messages.push({ role: \"user\", content: promptText });\n return messages;\n}\n\nfunction unwrapJsonSchema(value: unknown): unknown {\n const record = asRecord(value);\n return record.schema ?? record.jsonSchema ?? value;\n}\n\n// Normalize a single tool entry into the OpenAI `{ type, function }` wire\n// shape. Accepts BOTH the already-nested form (`{ type: \"function\", function:\n// { name, parameters } }`) and core's FLAT `ToolDefinition` envelope\n// (`{ name, type: \"function\", parameters }`, e.g. createHandleResponseTool /\n// the action planner). Returning the flat form verbatim made the cloud gateway\n// read `tool.function.name` on an undefined `function` → \"Cannot read\n// properties of undefined (reading 'name')\". Returns undefined for entries with\n// no resolvable name so they are dropped rather than crashing downstream.\nfunction normalizeNativeToolEntry(\n rawTool: unknown,\n fallbackName?: string\n): Record<string, unknown> | undefined {\n const tool = asRecord(rawTool);\n const nested = asRecord(tool.function);\n const name = firstString(nested.name, tool.name, fallbackName);\n if (!name) {\n return undefined;\n }\n const description = firstString(nested.description, tool.description);\n const inputSchema = unwrapJsonSchema(\n nested.parameters ??\n tool.inputSchema ??\n tool.parameters ??\n tool.schema ?? { type: \"object\" }\n );\n return {\n type: \"function\",\n function: {\n name,\n ...(description ? { description } : {}),\n parameters: inputSchema,\n },\n };\n}\n\nexport function normalizeNativeTools(tools: unknown): unknown[] | undefined {\n if (!tools) {\n return undefined;\n }\n\n if (Array.isArray(tools)) {\n const normalized = tools\n .map((tool) => normalizeNativeToolEntry(tool))\n .filter((tool): tool is Record<string, unknown> => tool !== undefined);\n return normalized.length > 0 ? normalized : undefined;\n }\n\n const toolSet = asRecord(tools);\n const normalized: unknown[] = [];\n for (const [name, rawTool] of Object.entries(toolSet)) {\n const entry = normalizeNativeToolEntry(rawTool, name);\n if (entry) {\n normalized.push(entry);\n }\n }\n\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction normalizeNativeToolChoice(toolChoice: unknown): unknown {\n if (!toolChoice) {\n return undefined;\n }\n\n if (\n typeof toolChoice === \"string\" &&\n (toolChoice === \"auto\" || toolChoice === \"none\" || toolChoice === \"required\")\n ) {\n return toolChoice;\n }\n\n const choice = asRecord(toolChoice);\n if (choice.type === \"function\") {\n return toolChoice;\n }\n if (choice.type === \"tool\") {\n const toolName = firstString(choice.toolName, choice.name);\n return toolName ? { type: \"function\", function: { name: toolName } } : toolChoice;\n }\n\n const functionChoice = asRecord(choice.function);\n const toolName = firstString(choice.toolName, choice.name, functionChoice.name);\n return toolName ? { type: \"function\", function: { name: toolName } } : toolChoice;\n}\n\nfunction buildNativeResponseFormat(responseSchema: unknown): unknown {\n if (!responseSchema) {\n return undefined;\n }\n\n const schemaRecord = asRecord(responseSchema);\n if (schemaRecord.responseFormat) {\n return schemaRecord.responseFormat;\n }\n\n const schemaOptions =\n \"schema\" in schemaRecord\n ? {\n schema: schemaRecord.schema,\n name: firstString(schemaRecord.name) ?? \"structured_response\",\n description: firstString(schemaRecord.description),\n }\n : { schema: responseSchema, name: \"structured_response\", description: undefined };\n\n return {\n type: \"json_schema\",\n json_schema: {\n name: schemaOptions.name,\n ...(schemaOptions.description ? { description: schemaOptions.description } : {}),\n schema: schemaOptions.schema,\n },\n };\n}\n\nfunction resolvePromptCacheKey(providerOptions: Record<string, unknown>): string | undefined {\n const eliza = recordAt(providerOptions, \"eliza\");\n const openrouter = recordAt(providerOptions, \"openrouter\");\n const openai = recordAt(providerOptions, \"openai\");\n const cerebras = recordAt(providerOptions, \"cerebras\");\n\n return firstString(\n providerOptions.promptCacheKey,\n providerOptions.prompt_cache_key,\n eliza.promptCacheKey,\n eliza.prompt_cache_key,\n openrouter.promptCacheKey,\n openrouter.prompt_cache_key,\n openai.promptCacheKey,\n openai.prompt_cache_key,\n cerebras.promptCacheKey,\n cerebras.prompt_cache_key\n );\n}\n\nfunction resolveNativeProviderOptions(\n params: GenerateTextParamsWithNativeOptions\n): Record<string, unknown> | undefined {\n const raw = asRecord(params.providerOptions);\n if (Object.keys(raw).length === 0) {\n return undefined;\n }\n\n const { agentName: _agentName, eliza: _eliza, ...rest } = raw;\n const providerOptions: Record<string, unknown> = { ...rest };\n const promptCacheKey = resolvePromptCacheKey(raw);\n\n if (promptCacheKey) {\n providerOptions.openai = {\n ...recordAt(providerOptions, \"openai\"),\n promptCacheKey,\n prompt_cache_key: promptCacheKey,\n };\n providerOptions.openrouter = {\n ...recordAt(providerOptions, \"openrouter\"),\n promptCacheKey,\n prompt_cache_key: promptCacheKey,\n };\n providerOptions.cerebras = {\n ...recordAt(providerOptions, \"cerebras\"),\n prompt_cache_key: promptCacheKey,\n };\n }\n\n return Object.keys(providerOptions).length > 0 ? providerOptions : undefined;\n}\n\nfunction applyOpenRouterPassthroughFields(\n requestBody: Record<string, unknown>,\n providerOptions: Record<string, unknown> | undefined\n): void {\n if (!providerOptions) {\n return;\n }\n\n const openrouter = recordAt(providerOptions, \"openrouter\");\n if (Object.keys(openrouter).length > 0) {\n const provider = openrouter.provider;\n if (provider !== undefined) {\n requestBody.provider = provider;\n }\n for (const key of [\"models\", \"route\", \"transforms\", \"reasoning\"] as const) {\n if (openrouter[key] !== undefined) {\n requestBody[key] = openrouter[key];\n }\n }\n }\n\n const gateway = providerOptions.gateway;\n if (gateway !== undefined) {\n requestBody.gateway = gateway;\n }\n}\n\nfunction buildNativeRequestBody(\n params: GenerateTextParamsWithNativeOptions,\n modelName: string,\n promptText: string,\n systemPrompt?: string\n): Record<string, unknown> {\n const providerOptions = resolveNativeProviderOptions(params);\n const promptCacheKey = providerOptions ? resolvePromptCacheKey(providerOptions) : undefined;\n const tools = normalizeNativeTools(params.tools);\n const toolChoice = normalizeNativeToolChoice(params.toolChoice);\n const responseFormat = buildNativeResponseFormat(params.responseSchema);\n const requestBody: Record<string, unknown> = {\n model: modelName,\n messages: buildNativeMessages(params, promptText, systemPrompt),\n max_tokens: params.maxTokens ?? 8192,\n };\n\n if (!isReasoningModel(modelName) && typeof params.temperature === \"number\") {\n requestBody.temperature = params.temperature;\n }\n if (tools) {\n requestBody.tools = tools;\n }\n if (toolChoice) {\n requestBody.tool_choice = toolChoice;\n }\n if (responseFormat) {\n requestBody.response_format = responseFormat;\n }\n if (providerOptions) {\n requestBody.providerOptions = providerOptions;\n requestBody.provider_options = providerOptions;\n }\n if (promptCacheKey) {\n requestBody.promptCacheKey = promptCacheKey;\n requestBody.prompt_cache_key = promptCacheKey;\n }\n\n applyOpenRouterPassthroughFields(requestBody, providerOptions);\n return requestBody;\n}\n\nfunction extractTextFromContent(content: unknown): string {\n if (typeof content === \"string\") {\n return content;\n }\n if (!Array.isArray(content)) {\n return \"\";\n }\n return content\n .map((item) => {\n if (typeof item === \"string\") return item;\n const record = asRecord(item);\n return firstString(record.text, record.output_text, record.content) ?? \"\";\n })\n .join(\"\");\n}\n\nfunction extractChatCompletionText(data: ChatCompletionsResponse): string {\n const firstChoice = data.choices?.[0];\n if (!firstChoice) {\n return \"\";\n }\n return firstString(firstChoice.text, extractTextFromContent(firstChoice.message?.content)) ?? \"\";\n}\n\nfunction extractNativeToolCalls(data: ChatCompletionsResponse): NativeToolCall[] {\n const rawCalls = data.choices?.[0]?.message?.tool_calls ?? [];\n if (!Array.isArray(rawCalls)) {\n return [];\n }\n\n return rawCalls\n .map<NativeToolCall | undefined>((rawCall) => {\n const call = asRecord(rawCall);\n const fn = recordAt(call, \"function\");\n const toolName = firstString(call.name, call.toolName, fn.name);\n if (!toolName) {\n return undefined;\n }\n return {\n type: \"tool-call\",\n toolCallId: firstString(call.id, call.toolCallId) ?? `call_${toolName}`,\n toolName,\n input: parseJsonIfPossible(call.input ?? call.arguments ?? fn.arguments ?? {}),\n };\n })\n .filter((call): call is NativeToolCall => call !== undefined);\n}\n\nfunction convertNativeUsage(usage: unknown): NativeTokenUsage | undefined {\n const root = asRecord(usage);\n if (Object.keys(root).length === 0) {\n return undefined;\n }\n\n const inputTokenDetails = recordAt(root, \"inputTokenDetails\");\n const promptTokenDetails = recordAt(root, \"prompt_tokens_details\");\n const inputTokenDetailsSnake = recordAt(root, \"input_tokens_details\");\n const promptTokens =\n firstNumber(root.inputTokens, root.input_tokens, root.promptTokens, root.prompt_tokens) ?? 0;\n const completionTokens =\n firstNumber(\n root.outputTokens,\n root.output_tokens,\n root.completionTokens,\n root.completion_tokens\n ) ?? 0;\n const cacheReadInputTokens = firstNumber(\n root.cacheReadInputTokens,\n root.cache_read_input_tokens,\n root.cachedInputTokens,\n root.cached_input_tokens,\n root.cachedTokens,\n root.cached_tokens,\n inputTokenDetails.cacheReadTokens,\n inputTokenDetails.cachedInputTokens,\n inputTokenDetails.cachedTokens,\n promptTokenDetails.cached_tokens,\n inputTokenDetailsSnake.cache_read_input_tokens,\n inputTokenDetailsSnake.cached_tokens\n );\n const cacheCreationInputTokens = firstNumber(\n root.cacheCreationInputTokens,\n root.cache_creation_input_tokens,\n root.cacheWriteInputTokens,\n root.cache_write_input_tokens,\n inputTokenDetails.cacheCreationInputTokens,\n inputTokenDetails.cacheCreationTokens,\n inputTokenDetails.cacheWriteTokens,\n inputTokenDetailsSnake.cache_creation_input_tokens\n );\n\n return {\n promptTokens,\n completionTokens,\n totalTokens:\n firstNumber(root.totalTokens, root.total_tokens) ?? promptTokens + completionTokens,\n cachedPromptTokens: cacheReadInputTokens,\n cacheReadInputTokens,\n cacheCreationInputTokens,\n };\n}\n\ntype TextModelType =\n | typeof TEXT_NANO_MODEL_TYPE\n | typeof TEXT_MEDIUM_MODEL_TYPE\n | typeof TEXT_SMALL_MODEL_TYPE\n | typeof TEXT_LARGE_MODEL_TYPE\n | typeof TEXT_MEGA_MODEL_TYPE\n | typeof RESPONSE_HANDLER_MODEL_TYPE\n | typeof ACTION_PLANNER_MODEL_TYPE;\n\nfunction getPurposeForModelType(modelType: TextModelType): string {\n switch (modelType) {\n case RESPONSE_HANDLER_MODEL_TYPE:\n return \"should_respond\";\n case ACTION_PLANNER_MODEL_TYPE:\n return \"action_planner\";\n default:\n return \"response\";\n }\n}\n\nfunction getModelNameForType(runtime: IAgentRuntime, modelType: TextModelType): string {\n switch (modelType) {\n case TEXT_NANO_MODEL_TYPE:\n return getNanoModel(runtime);\n case TEXT_MEDIUM_MODEL_TYPE:\n return getMediumModel(runtime);\n case TEXT_SMALL_MODEL_TYPE:\n return getSmallModel(runtime);\n case TEXT_LARGE_MODEL_TYPE:\n return getLargeModel(runtime);\n case TEXT_MEGA_MODEL_TYPE:\n return getMegaModel(runtime);\n case RESPONSE_HANDLER_MODEL_TYPE:\n return getResponseHandlerModel(runtime);\n case ACTION_PLANNER_MODEL_TYPE:\n return getActionPlannerModel(runtime);\n default:\n return getLargeModel(runtime);\n }\n}\n\n/**\n * Resolve the model name, rendered prompt, and effective system prompt for a\n * cloud text call.\n *\n * This used to also construct a Vercel AI-SDK `LanguageModel` (`openai.chat()`)\n * plus a full `generateParams` object — but the handlers below call the cloud\n * HTTP API directly (`requestRaw` → `/responses` / `/chat/completions`), so that\n * AI-SDK client + params object was built and immediately discarded on every\n * single text generation. Removed: it was pure per-call overhead and a\n * misleading code path when reasoning about which transport actually runs.\n */\nfunction buildGenerateParams(\n runtime: IAgentRuntime,\n modelType: TextModelType,\n params: GenerateTextParams\n) {\n const prompt = params.prompt ?? \"\";\n const modelName = getModelNameForType(runtime, modelType);\n const systemPrompt = resolveEffectiveSystemPrompt({\n params,\n fallback: buildCanonicalSystemPrompt({ character: runtime.character }),\n });\n const promptText =\n renderChatMessagesForPrompt(params.messages, {\n omitDuplicateSystem: systemPrompt,\n }) ?? prompt;\n\n return { modelName, modelType, prompt: promptText, systemPrompt };\n}\n\nasync function generateTextWithModel(\n runtime: IAgentRuntime,\n modelType: TextModelType,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n const { modelName, prompt, systemPrompt } = buildGenerateParams(runtime, modelType, params);\n const paramsWithNative = params as GenerateTextParamsWithNativeOptions;\n\n logger.debug(`[ELIZAOS_CLOUD] Generating text with ${modelType} model: ${modelName}`);\n\n // Stream the user-visible reply token-by-token. Gated to the structured\n // reply path (`streamStructured`, set only by the RESPONSE_HANDLER stage-1\n // call): that call carries a responseSkeleton, so the runtime's field\n // extractor surfaces `replyText` incrementally to the UI. Planner/other\n // native calls (no responseSkeleton) stay buffered — streaming their raw\n // envelope would leak internals to the UI stream. The bare `/responses`\n // route stays buffered too (different SSE schema, not on the reply path).\n const paramsStreaming = params as {\n stream?: boolean;\n streamStructured?: boolean;\n };\n const wantsStream =\n Boolean(paramsStreaming.stream) &&\n paramsStreaming.streamStructured === true &&\n resolveStreamingEnabled();\n\n logger.log(`[ELIZAOS_CLOUD] Using ${modelType} model: ${modelName}`);\n logger.log(prompt);\n\n if (hasNativeTransportOptions(paramsWithNative)) {\n if (wantsStream) {\n return streamNativeChatCompletion(runtime, modelType, paramsWithNative, {\n modelName,\n prompt,\n systemPrompt,\n });\n }\n const nativeResult = await generateNativeChatCompletion(runtime, modelType, paramsWithNative, {\n modelName,\n prompt,\n systemPrompt,\n });\n return shouldReturnNativeResult(paramsWithNative)\n ? (nativeResult as NativeGenerateTextModelResult)\n : nativeResult.text;\n }\n\n const reasoning = isReasoningModel(modelName);\n const input: Array<{\n role: \"system\" | \"user\";\n content: Array<{ type: \"input_text\"; text: string }>;\n }> = [];\n if (systemPrompt) {\n input.push({\n role: \"system\",\n content: [{ type: \"input_text\", text: systemPrompt }],\n });\n }\n input.push({\n role: \"user\",\n content: [{ type: \"input_text\", text: prompt }],\n });\n\n const requestBody: Record<string, unknown> = {\n model: modelName,\n input,\n max_output_tokens: params.maxTokens ?? 8192,\n };\n if (!reasoning && typeof params.temperature === \"number\") {\n requestBody.temperature = params.temperature;\n }\n\n const responsesHeaders: Record<string, string> = {\n \"X-Eliza-Llm-Purpose\": getPurposeForModelType(modelType),\n \"X-Eliza-Model-Type\": modelType,\n };\n if (isSpanSamplerHonoringModel(modelName)) {\n const samplerHeader = buildSpanSamplerHeader(params.spanSamplerPlan);\n if (samplerHeader) {\n responsesHeaders[\"x-eliza-span-samplers\"] = samplerHeader;\n }\n }\n // Same shared cerebras key as the /chat/completions route, so gate this\n // bare-prompt round-trip through the SAME limiter (parsing stays unguarded).\n const response = await withNativeChatLimit(\n () =>\n createCloudApiClient(runtime).requestRaw(\"POST\", \"/responses\", {\n headers: responsesHeaders,\n json: requestBody,\n timeoutMs: resolveTextTimeoutMs(),\n }),\n \"responses\"\n );\n const responseText = await response.text();\n let data: ResponsesApiResponse = {};\n if (responseText) {\n try {\n data = JSON.parse(responseText) as ResponsesApiResponse;\n } catch (parseErr) {\n logger.error(\n `[ELIZAOS_CLOUD] Failed to parse responses JSON: ${\n parseErr instanceof Error ? parseErr.message : String(parseErr)\n }`\n );\n }\n }\n\n if (!response.ok) {\n const errorBody = typeof data === \"object\" && data ? data.error : undefined;\n const errorMessage =\n typeof errorBody?.message === \"string\" && errorBody.message.trim()\n ? errorBody.message.trim()\n : `elizaOS Cloud error ${response.status}`;\n const requestError = new Error(errorMessage) as Error & {\n status?: number;\n error?: unknown;\n };\n requestError.status = response.status;\n if (errorBody) {\n requestError.error = errorBody;\n }\n throw requestError;\n }\n\n if (data.usage) {\n emitModelUsageEvent(\n runtime,\n modelType,\n prompt,\n {\n inputTokens: data.usage.input_tokens ?? 0,\n outputTokens: data.usage.output_tokens ?? 0,\n totalTokens: data.usage.total_tokens ?? 0,\n },\n {\n modelName: getModelNameForType(runtime, modelType),\n ...(() => {\n const costUsd = extractCostUsd(data.usage, response);\n return typeof costUsd === \"number\" ? { costUsd } : {};\n })(),\n }\n );\n }\n\n const text = extractResponsesOutputText(data);\n if (!text.trim()) {\n throw new Error(\"elizaOS Cloud returned no text response\");\n }\n\n return text;\n}\n\n// Exported for unit tests (the concurrency limiter wrapper). Not part of the\n// plugin's public model-handler surface.\nexport async function generateNativeChatCompletion(\n runtime: IAgentRuntime,\n modelType: TextModelType,\n params: GenerateTextParamsWithNativeOptions,\n context: {\n modelName: string;\n prompt: string;\n systemPrompt?: string;\n }\n): Promise<NativeGenerateTextResult> {\n const requestBody = buildNativeRequestBody(\n params,\n context.modelName,\n context.prompt,\n context.systemPrompt\n );\n const headers: Record<string, string> = {\n \"X-Eliza-Llm-Purpose\": getPurposeForModelType(modelType),\n \"X-Eliza-Model-Type\": modelType,\n };\n // Per-span sampler overrides only ride along when the resolved model is a\n // fork-built eliza-1 deployment that knows how to honor the header. Other\n // upstreams (OpenAI / Anthropic / generic OpenRouter) strip unknown headers\n // safely, but we keep the wire surface narrow until the cloud honor path\n // lands in Wave 3.\n if (isSpanSamplerHonoringModel(context.modelName)) {\n const samplerHeader = buildSpanSamplerHeader(params.spanSamplerPlan);\n if (samplerHeader) {\n headers[\"x-eliza-span-samplers\"] = samplerHeader;\n }\n }\n // Serialize the per-turn batcher/evaluator burst through the SAME shared\n // semaphore the /responses route uses, so N simultaneous native cloud text\n // calls don't overrun the one shared cerebras key's concurrent limit (-> 429\n // -> retries -> 30-63s). The permit is held only across the network\n // round-trip; the text()/JSON parse below runs unguarded.\n const response = await withNativeChatLimit(\n () =>\n createCloudApiClient(runtime).requestRaw(\"POST\", \"/chat/completions\", {\n headers,\n json: requestBody,\n timeoutMs: resolveTextTimeoutMs(),\n }),\n \"chat/completions\"\n );\n const responseText = await response.text();\n let data: ChatCompletionsResponse = {};\n if (responseText) {\n try {\n data = JSON.parse(responseText) as ChatCompletionsResponse;\n } catch (parseErr) {\n logger.error(\n `[ELIZAOS_CLOUD] Failed to parse chat completions JSON: ${\n parseErr instanceof Error ? parseErr.message : String(parseErr)\n }`\n );\n }\n }\n\n if (!response.ok) {\n const errorBody = typeof data === \"object\" && data ? data.error : undefined;\n const errorMessage =\n typeof errorBody?.message === \"string\" && errorBody.message.trim()\n ? errorBody.message.trim()\n : `elizaOS Cloud error ${response.status}`;\n const requestError = new Error(errorMessage) as Error & {\n status?: number;\n error?: unknown;\n };\n requestError.status = response.status;\n if (errorBody) {\n requestError.error = errorBody;\n }\n throw requestError;\n }\n\n const usage = convertNativeUsage(data.usage);\n if (usage) {\n emitModelUsageEvent(runtime, modelType, context.prompt, usage, {\n modelName: context.modelName,\n ...(() => {\n const costUsd = extractCostUsd(data.usage, response);\n return typeof costUsd === \"number\" ? { costUsd } : {};\n })(),\n });\n }\n\n const text = extractChatCompletionText(data);\n const toolCalls = extractNativeToolCalls(data);\n if (!text.trim() && toolCalls.length === 0) {\n throw new Error(\"elizaOS Cloud returned no text or tool calls\");\n }\n\n return {\n text,\n toolCalls,\n finishReason: data.choices?.[0]?.finish_reason,\n usage,\n providerMetadata: {\n modelName: context.modelName,\n usage: data.usage,\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Streaming native /chat/completions (token-by-token, OpenAI-compatible SSE)\n// ---------------------------------------------------------------------------\n\ninterface Deferred<T> {\n promise: Promise<T>;\n resolve: (value: T) => void;\n}\n\nfunction deferred<T>(): Deferred<T> {\n let resolve!: (value: T) => void;\n const promise = new Promise<T>((r) => {\n resolve = r;\n });\n return { promise, resolve };\n}\n\n/**\n * Parse an OpenAI-compatible SSE byte stream into the decoded JSON frame of\n * each `data:` line. Yields one object per frame; stops at `data: [DONE]`.\n * Tolerates partial reads (buffers across chunk boundaries) and ignores\n * non-`data:` lines (comments, blank separators). Exported for unit tests.\n */\nexport async function* parseOpenAiSseStream(\n body: ReadableStream<Uint8Array>\n): AsyncGenerator<Record<string, unknown>> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n const handle = (line: string): Record<string, unknown> | \"DONE\" | null => {\n const trimmed = line.trimStart();\n if (!trimmed.startsWith(\"data:\")) return null;\n const payload = trimmed.slice(5).trim();\n if (payload === \"\") return null;\n if (payload === \"[DONE]\") return \"DONE\";\n try {\n return JSON.parse(payload) as Record<string, unknown>;\n } catch {\n return null;\n }\n };\n try {\n for (;;) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n let nl: number;\n while ((nl = buffer.indexOf(\"\\n\")) >= 0) {\n const line = buffer.slice(0, nl);\n buffer = buffer.slice(nl + 1);\n const frame = handle(line);\n if (frame === \"DONE\") return;\n if (frame) yield frame;\n }\n }\n const tail = handle(buffer);\n if (tail && tail !== \"DONE\") yield tail;\n } finally {\n // cancel() (not just releaseLock()) tears down the underlying connection,\n // so an EARLY consumer break (runtime abort / turn-supersede / a downstream\n // throw closes this generator via .return()) stops the upstream generation\n // instead of letting it run to its natural end and bill tokens nobody reads.\n // On natural completion the stream is already done, so this is a no-op; it\n // also releases the lock. Not threading the abort signal into the fetch on\n // purpose — cancel() gets the teardown without rejecting an in-flight read\n // with AbortError and changing the runtime's quiet-stop semantics.\n try {\n await reader.cancel();\n } catch {\n // Reader already cancelled/released by an upstream abort — nothing to do.\n }\n }\n}\n\ninterface StreamingToolCallAcc {\n id?: string;\n name?: string;\n args: string;\n}\n\n/** Fold one SSE `delta.tool_calls[]` array into the per-index accumulator. */\nexport function accumulateToolCallDeltas(\n acc: Map<number, StreamingToolCallAcc>,\n deltas: unknown\n): void {\n if (!Array.isArray(deltas)) return;\n for (const raw of deltas) {\n const d = asRecord(raw);\n const index = typeof d.index === \"number\" ? d.index : 0;\n const cur = acc.get(index) ?? { args: \"\" };\n const id = firstString(d.id);\n if (id) cur.id = id;\n const fn = recordAt(d, \"function\");\n const name = firstString(fn.name);\n if (name) cur.name = name;\n if (typeof fn.arguments === \"string\") cur.args += fn.arguments;\n acc.set(index, cur);\n }\n}\n\n/** Materialize accumulated tool-call deltas into the buffered-path shape. */\nexport function finalizeStreamedToolCalls(\n acc: Map<number, StreamingToolCallAcc>\n): NativeToolCall[] {\n const out: NativeToolCall[] = [];\n for (const [index, c] of [...acc.entries()].sort((a, b) => a[0] - b[0])) {\n if (!c.name) continue;\n out.push({\n type: \"tool-call\",\n toolCallId: c.id ?? `call_${c.name}_${index}`,\n toolName: c.name,\n input: parseJsonIfPossible(c.args.trim() === \"\" ? \"{}\" : c.args),\n });\n }\n return out;\n}\n\n/**\n * Streaming variant of {@link generateNativeChatCompletion}: returns a\n * {@link TextStreamResult} whose `textStream` yields `delta.content` as it\n * arrives, so `useModel`'s for-await loop streams it to the UI from the first\n * token. Falls back to a single-chunk buffered result if the gateway answers\n * non-SSE (self-healing). The shared concurrency permit is held for the whole\n * stream lifetime (released in the generator's `finally`), not just until\n * headers arrive — otherwise the cap would under-count in-flight requests.\n */\nexport async function streamNativeChatCompletion(\n runtime: IAgentRuntime,\n modelType: TextModelType,\n params: GenerateTextParamsWithNativeOptions,\n context: { modelName: string; prompt: string; systemPrompt?: string }\n): Promise<TextStreamResult> {\n const requestBody = buildNativeRequestBody(\n params,\n context.modelName,\n context.prompt,\n context.systemPrompt\n );\n requestBody.stream = true;\n // OpenAI-compatible: ask the server to include a final usage-only frame so we\n // can meter the streamed call accurately.\n requestBody.stream_options = { include_usage: true };\n\n const headers: Record<string, string> = {\n \"X-Eliza-Llm-Purpose\": getPurposeForModelType(modelType),\n \"X-Eliza-Model-Type\": modelType,\n };\n if (isSpanSamplerHonoringModel(context.modelName)) {\n const samplerHeader = buildSpanSamplerHeader(params.spanSamplerPlan);\n if (samplerHeader) {\n headers[\"x-eliza-span-samplers\"] = samplerHeader;\n }\n }\n\n const abortSignal = (params as { signal?: AbortSignal }).signal;\n const signal = buildStreamAbortSignal(abortSignal, resolveTextTimeoutMs());\n\n const limiter = getNativeChatLimiter();\n const waitStartedAt = Date.now();\n await limiter.acquire();\n recordInferenceSpan(\"cloud.semaphore-wait\", Date.now() - waitStartedAt, {\n route: \"chat/completions:stream\",\n });\n let permitReleased = false;\n const releasePermit = (): void => {\n if (!permitReleased) {\n permitReleased = true;\n limiter.release();\n }\n };\n\n let response: Response;\n try {\n response = await createCloudApiClient(runtime).requestRaw(\"POST\", \"/chat/completions\", {\n headers,\n json: requestBody,\n ...(signal ? { signal } : {}),\n });\n } catch (err) {\n releasePermit();\n throw err;\n }\n\n if (!response.ok) {\n let errorBody: { message?: string } | undefined;\n try {\n const errText = await response.text();\n if (errText) {\n errorBody = (JSON.parse(errText) as ChatCompletionsResponse).error;\n }\n } catch {\n // Non-JSON error body — fall through to the status-coded message.\n }\n releasePermit();\n const message =\n typeof errorBody?.message === \"string\" && errorBody.message.trim()\n ? errorBody.message.trim()\n : `elizaOS Cloud error ${response.status}`;\n const requestError = new Error(message) as Error & {\n status?: number;\n error?: unknown;\n };\n requestError.status = response.status;\n if (errorBody) requestError.error = errorBody;\n throw requestError;\n }\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const isSse = contentType.includes(\"text/event-stream\") && response.body !== null;\n\n // Self-healing fallback: gateway answered with a buffered JSON body despite\n // the stream request. Yield it as a single chunk so the streaming contract\n // (and the structured-field extractor downstream) still works.\n if (!isSse) {\n const bufferedText = await response.text();\n releasePermit();\n let data: ChatCompletionsResponse = {};\n if (bufferedText) {\n try {\n data = JSON.parse(bufferedText) as ChatCompletionsResponse;\n } catch (parseErr) {\n logger.error(\n `[ELIZAOS_CLOUD] Failed to parse buffered chat completions JSON: ${\n parseErr instanceof Error ? parseErr.message : String(parseErr)\n }`\n );\n }\n }\n const text = extractChatCompletionText(data);\n const toolCalls = extractNativeToolCalls(data);\n const usage = convertNativeUsage(data.usage);\n if (usage) {\n emitModelUsageEvent(runtime, modelType, context.prompt, usage, {\n modelName: context.modelName,\n ...(() => {\n const costUsd = extractCostUsd(data.usage, response);\n return typeof costUsd === \"number\" ? { costUsd } : {};\n })(),\n });\n }\n if (!text.trim() && toolCalls.length === 0) {\n throw new Error(\"elizaOS Cloud returned no text or tool calls\");\n }\n async function* single(): AsyncGenerator<string> {\n if (text) yield text;\n }\n return {\n textStream: single(),\n text: Promise.resolve(text),\n usage: Promise.resolve(usage),\n finishReason: Promise.resolve(data.choices?.[0]?.finish_reason),\n toolCalls: Promise.resolve(toolCalls),\n providerMetadata: { modelName: context.modelName, usage: data.usage },\n };\n }\n\n const body = response.body as ReadableStream<Uint8Array>;\n const toolAcc = new Map<number, StreamingToolCallAcc>();\n let accumulated = \"\";\n let nativeUsage: NativeTokenUsage | undefined;\n let rawUsage: unknown;\n let finishReason: string | undefined;\n\n const textD = deferred<string>();\n const usageD = deferred<TokenUsage | undefined>();\n const finishD = deferred<string | undefined>();\n const toolCallsD = deferred<NativeToolCall[]>();\n\n async function* generate(): AsyncGenerator<string> {\n try {\n for await (const frame of parseOpenAiSseStream(body)) {\n if (frame.error) {\n const message = asRecord(frame.error).message;\n throw new Error(\n typeof message === \"string\" && message.trim()\n ? message.trim()\n : \"elizaOS Cloud stream error\"\n );\n }\n const choices = Array.isArray(frame.choices) ? frame.choices : [];\n const choice = asRecord(choices[0]);\n const delta = recordAt(choice, \"delta\");\n // Raw (un-trimmed) content — inter-token whitespace is significant.\n if (typeof delta.content === \"string\" && delta.content.length > 0) {\n accumulated += delta.content;\n yield delta.content;\n }\n if (delta.tool_calls) {\n accumulateToolCallDeltas(toolAcc, delta.tool_calls);\n }\n const fr = firstString(choice.finish_reason);\n if (fr) finishReason = fr;\n if (frame.usage) {\n rawUsage = frame.usage;\n nativeUsage = convertNativeUsage(frame.usage);\n }\n }\n } finally {\n releasePermit();\n const toolCalls = finalizeStreamedToolCalls(toolAcc);\n textD.resolve(accumulated);\n usageD.resolve(nativeUsage);\n finishD.resolve(finishReason);\n toolCallsD.resolve(toolCalls);\n if (nativeUsage) {\n emitModelUsageEvent(runtime, modelType, context.prompt, nativeUsage, {\n modelName: context.modelName,\n ...(() => {\n const costUsd = extractCostUsd(rawUsage, response);\n return typeof costUsd === \"number\" ? { costUsd } : {};\n })(),\n });\n }\n }\n }\n\n return {\n textStream: generate(),\n text: textD.promise,\n usage: usageD.promise,\n finishReason: finishD.promise,\n toolCalls: toolCallsD.promise,\n providerMetadata: { modelName: context.modelName },\n };\n}\n\nexport async function handleTextSmall(\n runtime: IAgentRuntime,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n return generateTextWithModel(runtime, TEXT_SMALL_MODEL_TYPE, params);\n}\n\nexport async function handleTextNano(\n runtime: IAgentRuntime,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n return generateTextWithModel(runtime, TEXT_NANO_MODEL_TYPE, params);\n}\n\nexport async function handleTextMedium(\n runtime: IAgentRuntime,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n return generateTextWithModel(runtime, TEXT_MEDIUM_MODEL_TYPE, params);\n}\n\nexport async function handleTextLarge(\n runtime: IAgentRuntime,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n return generateTextWithModel(runtime, TEXT_LARGE_MODEL_TYPE, params);\n}\n\nexport async function handleTextMega(\n runtime: IAgentRuntime,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n return generateTextWithModel(runtime, TEXT_MEGA_MODEL_TYPE, params);\n}\n\nexport async function handleResponseHandler(\n runtime: IAgentRuntime,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n return generateTextWithModel(runtime, RESPONSE_HANDLER_MODEL_TYPE, params);\n}\n\nexport async function handleActionPlanner(\n runtime: IAgentRuntime,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n return generateTextWithModel(runtime, ACTION_PLANNER_MODEL_TYPE, params);\n}\n",
|
|
39
|
+
"type JsonRecord = Record<string, unknown>;\n\nfunction asRecord(value: unknown): JsonRecord | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n return value as JsonRecord;\n}\n\nfunction normalizeContentItems(value: unknown): unknown[] {\n if (Array.isArray(value)) return value;\n if (typeof value === \"string\") return [{ type: \"text\", text: value }];\n return value && typeof value === \"object\" ? [value] : [];\n}\n\nfunction extractTextFromContentItem(value: unknown): string[] {\n if (typeof value === \"string\") {\n return [value];\n }\n\n const record = asRecord(value);\n if (!record) return [];\n\n const text =\n typeof record.text === \"string\"\n ? record.text\n : typeof record.output_text === \"string\"\n ? record.output_text\n : typeof record.content === \"string\"\n ? record.content\n : \"\";\n const type = typeof record.type === \"string\" ? record.type : undefined;\n\n if (text && (!type || type === \"output_text\" || type === \"text\")) {\n return [text];\n }\n\n return [];\n}\n\nfunction extractTextFromOutputItem(value: unknown): string[] {\n const record = asRecord(value);\n if (!record) return [];\n\n const directContent = normalizeContentItems(record.content);\n if (directContent.length > 0) {\n return directContent.flatMap(extractTextFromContentItem);\n }\n\n const nestedMessage = asRecord(record.message);\n if (nestedMessage) {\n return normalizeContentItems(nestedMessage.content).flatMap(extractTextFromContentItem);\n }\n\n const type = typeof record.type === \"string\" ? record.type : undefined;\n const text =\n typeof record.text === \"string\"\n ? record.text\n : typeof record.output_text === \"string\"\n ? record.output_text\n : \"\";\n if (text && (type === \"output_text\" || type === \"text\")) {\n return [text];\n }\n\n return [];\n}\n\nfunction extractTextFromChoice(value: unknown): string[] {\n const record = asRecord(value);\n if (!record) return [];\n\n if (typeof record.text === \"string\" && record.text) {\n return [record.text];\n }\n\n const message = asRecord(record.message);\n if (!message) {\n return [];\n }\n\n return normalizeContentItems(message.content).flatMap(extractTextFromContentItem);\n}\n\n/**\n * Recover text from Responses-style payloads, tolerating both the documented\n * `output_text` field and the common structured `output` item variants.\n *\n * Cloud responses sometimes carry the same body in BOTH `output_text` AND\n * `output[]`/`choices[]`. Joining segments in that case duplicates the model\n * output downstream (caller sees `…json{…}\\n``````json{…}…`), which then\n * trips JSON.parse with \"Unrecognized token '`'\" because of the run of\n * backticks where the two copies meet. Prefer the first non-empty source\n * instead of joining.\n */\nexport function extractResponsesOutputText(data: unknown): string {\n const record = asRecord(data);\n if (!record) return \"\";\n\n if (typeof record.output_text === \"string\" && record.output_text.trim()) {\n return record.output_text;\n }\n\n if (Array.isArray(record.output)) {\n const fromOutput = record.output.flatMap(extractTextFromOutputItem).join(\"\");\n if (fromOutput.trim()) return fromOutput;\n }\n\n if (Array.isArray(record.choices)) {\n const fromChoices = record.choices.flatMap(extractTextFromChoice).join(\"\");\n if (fromChoices.trim()) return fromChoices;\n }\n\n return \"\";\n}\n",
|
|
40
|
+
"/**\n * CloudAuthService — Eliza Cloud authentication entry points.\n *\n * Two distinct auth flows live here:\n *\n * 1. **Device auto-signup** (`authenticateWithDevice`) — convenience-only.\n * Derives a hardware fingerprint and exchanges it for a free-tier API key\n * against the cloud signup endpoint. The result is treated as opaque and\n * is **never** trusted as inbound auth for the local Eliza dashboard.\n * See `docs/security/remote-auth-hardening-plan.md` §7 for the explicit\n * demotion rationale.\n *\n * 2. **Eliza Cloud SSO** (`getSsoRedirectUrl` / `exchangeCodeForSession`) —\n * OAuth-style authorization-code flow against the cloud issuer. The\n * callback handler in `app-core` (`api/auth/cloud-sso.ts`) consumes these\n * methods to bind a verified cloud user to a local Identity. All error\n * paths fail closed: the methods throw and the caller MUST refuse the\n * request. There is no partial-claims fallback.\n */\n\nimport {\n type RuntimeEnvRecord,\n type IAgentRuntime,\n logger,\n Service,\n resolveApiSecurityConfig,\n resolveDesktopApiPort,\n} from \"@elizaos/core\";\nimport { isCloudReachable } from \"@elizaos/shared\";\nimport { createRemoteJWKSet, jwtVerify } from \"jose\";\nimport type { CloudCredentials, DeviceAuthResponse, DevicePlatform } from \"../types/cloud\";\nimport { DEFAULT_CLOUD_CONFIG } from \"../types/cloud\";\nimport { CloudApiClient } from \"../utils/cloud-api\";\nimport type { CloudBootstrapService } from \"./cloud-bootstrap\";\n\n/** SHA-256 hash of hostname + platform + arch + cpu + memory. */\nasync function deriveDeviceId(): Promise<string> {\n const os = await import(\"node:os\");\n const crypto = await import(\"node:crypto\");\n const cpus = os.cpus();\n const raw = [\n os.hostname(),\n os.platform(),\n os.arch(),\n cpus[0]?.model ?? \"?\",\n cpus.length,\n os.totalmem(),\n ].join(\":\");\n return crypto.createHash(\"sha256\").update(raw).digest(\"hex\");\n}\n\nfunction detectPlatform(): DevicePlatform {\n if (typeof process === \"undefined\") return \"web\";\n const map: Record<string, DevicePlatform> = {\n darwin: \"macos\",\n win32: \"windows\",\n linux: \"linux\",\n };\n return map[process.platform] ?? \"linux\";\n}\n\n// ─── Eliza Cloud SSO ───────────────────────────────────────────────────────\n\n/**\n * Required ID-token claims for an Eliza Cloud SSO exchange.\n *\n * `sub` is the cloud user id (canonical identity key). `email` and `name`\n * are surfaced for UI display and identity provisioning. Anything else the\n * cloud issuer adds is preserved on `extra` for callers that need it but\n * is never required for auth decisions.\n */\nexport interface CloudSsoIdTokenClaims {\n iss: string;\n sub: string;\n aud: string | string[];\n exp: number;\n iat: number;\n email: string;\n email_verified?: boolean;\n name: string;\n picture?: string;\n extra: Record<string, unknown>;\n}\n\nexport interface CloudSsoSession {\n cloudUserId: string;\n email: string;\n displayName: string;\n claims: CloudSsoIdTokenClaims;\n}\n\nexport interface SsoRedirectArgs {\n /**\n * Local URL the user should land on after the SSO round-trip\n * (e.g. `/first-run/setup`). The dashboard's callback route forwards\n * to this once the session cookie is set; it is NOT sent to the cloud\n * issuer.\n */\n returnTo?: string;\n /**\n * State nonce. The caller is responsible for generating this with\n * `crypto.randomBytes(32)` and storing it server-side keyed by the\n * issued cookie / pending exchange.\n */\n state: string;\n /**\n * Override for `ELIZA_CLOUD_CLIENT_ID`. Falls through to the env when\n * unset; explicitly throws when neither is provided.\n */\n clientId?: string;\n /** Allows tests to inject a synthetic env record. */\n env?: RuntimeEnvRecord;\n}\n\nexport interface ExchangeCodeArgs {\n /** Authorization code returned on the SSO callback. */\n code: string;\n /** State value the cloud issuer echoed back on the callback. */\n state: string;\n /**\n * State value the caller originally issued. Compared with `state` and\n * mismatch causes a fail-closed throw before any network call is made.\n */\n expectedState: string;\n /**\n * Source for `getJwksUrl()`. The caller resolves this from the runtime\n * service registry (`runtime.getService(\"CLOUD_BOOTSTRAP\")`) so this\n * file does not import from `app-core` directly.\n */\n bootstrap: CloudBootstrapService;\n /** Allows tests to inject a fake fetch for the token endpoint. */\n fetchImpl?: typeof fetch;\n /** Allows tests to inject a synthetic env record. */\n env?: RuntimeEnvRecord;\n /** Optional override for the redirect URI; defaults to the local callback. */\n redirectUri?: string;\n}\n\ninterface RawTokenResponse {\n id_token?: unknown;\n access_token?: unknown;\n token_type?: unknown;\n expires_in?: unknown;\n scope?: unknown;\n}\n\ninterface ApiKeyAuthInput {\n apiKey: string;\n organizationId?: string;\n userId?: string;\n}\n\ninterface RawIdTokenPayload {\n iss?: unknown;\n sub?: unknown;\n aud?: unknown;\n exp?: unknown;\n iat?: unknown;\n email?: unknown;\n email_verified?: unknown;\n name?: unknown;\n picture?: unknown;\n [otherProperty: string]: unknown;\n}\n\nfunction readEnvKey(env: RuntimeEnvRecord, key: string): string | null {\n const value = env[key];\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction processEnv(): RuntimeEnvRecord {\n if (typeof process === \"undefined\") return {};\n return process.env as RuntimeEnvRecord;\n}\n\n/**\n * Build the local SSO callback URL the cloud issuer will redirect back to.\n *\n * Reads `ELIZA_API_BIND` and the desktop API port from `@elizaos/core`'s\n * runtime-env helper so the redirect_uri matches whatever the dashboard\n * is actually serving on. Loopback binds default to `http://127.0.0.1:<port>`;\n * non-loopback binds (cloud-provisioned containers) use `https://`.\n */\nfunction defaultRedirectUri(env: RuntimeEnvRecord): string {\n const security = resolveApiSecurityConfig(env);\n const port = resolveDesktopApiPort(env);\n const scheme = security.isLoopbackBind ? \"http\" : \"https\";\n // Strip any IPv6 brackets the bind host might already include.\n const host = security.bindHost.startsWith(\"[\")\n ? security.bindHost\n : security.bindHost.includes(\":\") && !security.bindHost.startsWith(\"[\")\n ? `[${security.bindHost}]`\n : security.bindHost;\n return `${scheme}://${host}:${port}/api/auth/login/sso/callback`;\n}\n\n/**\n * Returns the absolute URL the dashboard should redirect the user to in\n * order to start an Eliza Cloud SSO authorization-code flow.\n *\n * Throws when `ELIZA_CLOUD_CLIENT_ID` is unset and no `clientId` override\n * is provided — there is no built-in default. `ELIZA_CLOUD_ISSUER` is read\n * via the `CloudBootstrapService`'s service-port and must already be set;\n * if not, this method throws via the bootstrap's existing fail-closed\n * behaviour.\n *\n * The `state` argument MUST be generated by the caller with a cryptographic\n * RNG and stored server-side bound to the issued cookie. This method does\n * NOT generate or persist state.\n *\n * @param bootstrap - Service-port that exposes `getExpectedIssuer()`.\n * @param args - Required `state`, optional `clientId` / `returnTo` / `env`.\n */\nexport function getSsoRedirectUrl(bootstrap: CloudBootstrapService, args: SsoRedirectArgs): string {\n const env = args.env ?? processEnv();\n const clientId = args.clientId ?? readEnvKey(env, \"ELIZA_CLOUD_CLIENT_ID\");\n if (!clientId) {\n throw new Error(\"ELIZA_CLOUD_CLIENT_ID is not configured — cannot start Eliza Cloud SSO\");\n }\n if (args.state.length === 0) {\n throw new Error(\"getSsoRedirectUrl requires a non-empty state nonce\");\n }\n const issuer = bootstrap.getExpectedIssuer();\n const redirectUri = defaultRedirectUri(env);\n const params = new URLSearchParams();\n params.set(\"response_type\", \"code\");\n params.set(\"client_id\", clientId);\n params.set(\"redirect_uri\", redirectUri);\n params.set(\"scope\", \"openid profile\");\n params.set(\"state\", args.state);\n if (args.returnTo) {\n // Forwarded through state on the cloud side is not safe (issuer-controlled);\n // we surface it as a separate hint that the local callback honours.\n params.set(\"eliza_return_to\", args.returnTo);\n }\n return `${issuer}/oauth/authorize?${params.toString()}`;\n}\n\nfunction shapeIdTokenClaims(payload: RawIdTokenPayload): CloudSsoIdTokenClaims {\n if (typeof payload.iss !== \"string\" || payload.iss.length === 0) {\n throw new Error(\"id_token missing issuer claim\");\n }\n if (typeof payload.sub !== \"string\" || payload.sub.length === 0) {\n throw new Error(\"id_token missing sub claim\");\n }\n if (\n typeof payload.aud !== \"string\" &&\n !(Array.isArray(payload.aud) && payload.aud.every((value) => typeof value === \"string\"))\n ) {\n throw new Error(\"id_token missing or malformed aud claim\");\n }\n if (typeof payload.exp !== \"number\" || !Number.isFinite(payload.exp)) {\n throw new Error(\"id_token missing exp claim\");\n }\n if (typeof payload.iat !== \"number\" || !Number.isFinite(payload.iat)) {\n throw new Error(\"id_token missing iat claim\");\n }\n if (typeof payload.email !== \"string\" || payload.email.length === 0) {\n throw new Error(\"id_token missing email claim — Eliza Cloud SSO requires it\");\n }\n if (typeof payload.name !== \"string\" || payload.name.length === 0) {\n throw new Error(\"id_token missing name claim — Eliza Cloud SSO requires it\");\n }\n const extra: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(payload)) {\n if (\n key !== \"iss\" &&\n key !== \"sub\" &&\n key !== \"aud\" &&\n key !== \"exp\" &&\n key !== \"iat\" &&\n key !== \"email\" &&\n key !== \"email_verified\" &&\n key !== \"name\" &&\n key !== \"picture\"\n ) {\n extra[key] = value;\n }\n }\n return {\n iss: payload.iss,\n sub: payload.sub,\n aud: payload.aud as string | string[],\n exp: payload.exp,\n iat: payload.iat,\n email: payload.email,\n email_verified:\n typeof payload.email_verified === \"boolean\" ? payload.email_verified : undefined,\n name: payload.name,\n picture: typeof payload.picture === \"string\" ? payload.picture : undefined,\n extra,\n };\n}\n\nfunction shapeTokenResponse(payload: unknown): { idToken: string } {\n if (!payload || typeof payload !== \"object\") {\n throw new Error(\"Eliza Cloud token endpoint returned a non-object body\");\n }\n const raw = payload as RawTokenResponse;\n if (typeof raw.id_token !== \"string\" || raw.id_token.length === 0) {\n throw new Error(\"Eliza Cloud token endpoint did not return an id_token\");\n }\n return { idToken: raw.id_token };\n}\n\n/**\n * Exchange an authorization code for a verified Eliza Cloud session.\n *\n * Steps:\n * 1. Compare `state === expectedState`. Mismatch throws.\n * 2. POST to `${ELIZA_CLOUD_ISSUER}/oauth/token` with the code,\n * `client_id`, and `client_secret` (the latter from\n * `ELIZA_CLOUD_CLIENT_SECRET`).\n * 3. Verify the returned `id_token` against the JWKS exposed by\n * `CloudBootstrapService.getJwksUrl()`. RS256 only.\n * 4. Project the claims onto a `CloudSsoSession`.\n *\n * Any error in fetch / signature verify / claim shape throws — this method\n * NEVER returns a partial or fallback session.\n */\nexport async function exchangeCodeForSession(args: ExchangeCodeArgs): Promise<CloudSsoSession> {\n if (args.code.length === 0) {\n throw new Error(\"exchangeCodeForSession requires a non-empty code\");\n }\n if (!args.state || !args.expectedState || args.state !== args.expectedState) {\n throw new Error(\"Eliza Cloud SSO state mismatch — refusing to exchange code (possible CSRF)\");\n }\n\n const env = args.env ?? processEnv();\n const clientId = readEnvKey(env, \"ELIZA_CLOUD_CLIENT_ID\");\n if (!clientId) {\n throw new Error(\"ELIZA_CLOUD_CLIENT_ID is not configured — cannot complete Eliza Cloud SSO\");\n }\n const clientSecret = readEnvKey(env, \"ELIZA_CLOUD_CLIENT_SECRET\");\n if (!clientSecret) {\n throw new Error(\n \"ELIZA_CLOUD_CLIENT_SECRET is not configured — cannot complete Eliza Cloud SSO\"\n );\n }\n\n const issuer = args.bootstrap.getExpectedIssuer();\n const redirectUri = args.redirectUri ?? defaultRedirectUri(env);\n const tokenUrl = `${issuer}/oauth/token`;\n\n const fetchImpl = args.fetchImpl ?? fetch;\n const body = new URLSearchParams();\n body.set(\"grant_type\", \"authorization_code\");\n body.set(\"code\", args.code);\n body.set(\"redirect_uri\", redirectUri);\n body.set(\"client_id\", clientId);\n body.set(\"client_secret\", clientSecret);\n\n const response = await fetchImpl(tokenUrl, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/x-www-form-urlencoded\",\n accept: \"application/json\",\n },\n body: body.toString(),\n });\n if (!response.ok) {\n throw new Error(\n `Eliza Cloud token endpoint returned HTTP ${response.status} for code exchange`\n );\n }\n const payload: unknown = await response.json();\n const { idToken } = shapeTokenResponse(payload);\n\n const jwksUrl = args.bootstrap.getJwksUrl();\n const remoteJwks = createRemoteJWKSet(new URL(jwksUrl));\n\n const verified = await jwtVerify(idToken, remoteJwks, {\n algorithms: [\"RS256\"],\n issuer,\n audience: clientId,\n });\n\n const claims = shapeIdTokenClaims(verified.payload as RawIdTokenPayload);\n\n return {\n cloudUserId: claims.sub,\n email: claims.email,\n displayName: claims.name,\n claims,\n };\n}\n\n// ─── Service ───────────────────────────────────────────────────────────────\n\nexport class CloudAuthService extends Service {\n static serviceType = \"CLOUD_AUTH\";\n capabilityDescription = \"Eliza Cloud device authentication and SSO session helpers\";\n\n private client: CloudApiClient;\n private credentials: CloudCredentials | null = null;\n\n constructor(runtime?: IAgentRuntime) {\n super(runtime);\n this.client = new CloudApiClient(DEFAULT_CLOUD_CONFIG.baseUrl);\n }\n\n static async start(runtime: IAgentRuntime): Promise<Service> {\n const service = new CloudAuthService(runtime);\n await service.initialize();\n return service;\n }\n\n async stop(): Promise<void> {\n this.credentials = null;\n }\n\n private async initialize(): Promise<void> {\n const baseUrl = String(\n this.runtime.getSetting(\"ELIZAOS_CLOUD_BASE_URL\") ?? DEFAULT_CLOUD_CONFIG.baseUrl\n );\n this.client.setBaseUrl(baseUrl);\n\n // Try existing API key first. If the key is present in settings\n // (persisted via config file or character secrets in the DB), trust it\n // immediately so the agent is functional even when the cloud API is\n // temporarily unreachable. A background validation fires to confirm\n // the key — if it turns out to be revoked the next model call will\n // surface the error, but the agent won't stall on startup.\n const existingKey = this.runtime.getSetting(\"ELIZAOS_CLOUD_API_KEY\");\n if (existingKey) {\n const key = String(existingKey);\n this.client.setApiKey(key);\n\n // Accept the key optimistically — no blocking network call.\n this.credentials = {\n apiKey: key,\n userId: String(this.runtime.getSetting(\"ELIZAOS_CLOUD_USER_ID\") ?? \"\"),\n organizationId: String(\n this.runtime.getSetting(\"ELIZAOS_CLOUD_ORG_ID\") ??\n this.runtime.getSetting(\"ELIZA_CLOUD_ORGANIZATION_ID\") ??\n \"\"\n ),\n authenticatedAt: Date.now(),\n };\n logger.info(\"[CloudAuth] Authenticated with saved API key\");\n\n // Non-blocking validation — if the key is invalid the next model\n // call will surface the error; we just log a warning here.\n this.validateApiKey(key)\n .then((valid) => {\n if (!valid) {\n logger.warn(\n \"[CloudAuth] Saved API key could not be validated (cloud may be unreachable or key revoked) — model calls will use the key anyway\"\n );\n }\n })\n .catch(() => {\n // Swallow — already logged inside validateApiKey\n });\n return;\n }\n\n // Device-based auto-signup when explicitly enabled\n const enabled = this.runtime.getSetting(\"ELIZAOS_CLOUD_ENABLED\");\n if (enabled === \"true\" || enabled === \"1\") {\n try {\n await this.authenticateWithDevice();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.warn(`[CloudAuth] Device auth failed (cloud may be unreachable): ${msg}`);\n logger.info(\n \"[CloudAuth] Service will start unauthenticated — cloud features disabled until connectivity is restored\"\n );\n }\n } else {\n logger.info(\"[CloudAuth] Cloud not enabled (set ELIZAOS_CLOUD_ENABLED=true)\");\n }\n }\n\n private async validateApiKey(key: string): Promise<boolean> {\n if (!(await isCloudReachable())) {\n logger.warn(\n \"[CloudAuth] Cloud unreachable at boot — skipping API key validation; key will be used as-is\"\n );\n return false;\n }\n try {\n const validationClient = new CloudApiClient(this.client.getBaseUrl(), key);\n await validationClient.get(\"/models\", { timeoutMs: 2_500 });\n return true;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.warn(`[CloudAuth] Could not reach cloud API to validate key: ${msg}`);\n return false;\n }\n }\n\n /**\n * Free-tier device auto-signup. **Convenience only — not a security\n * primitive.** The hardware fingerprint is treated as opaque material the\n * cloud signup endpoint can use to mint a fresh API key + $5 free credit\n * for new installs. The result is usable for outbound LLM calls; it never\n * authorizes inbound dashboard access.\n *\n * See `docs/security/remote-auth-hardening-plan.md` §7.\n */\n async authenticateWithDevice(): Promise<CloudCredentials> {\n const deviceId = await deriveDeviceId();\n const platform = detectPlatform();\n const appVersion = process.env.ELIZAOS_CLOUD_APP_VERSION ?? \"2.0.0-beta.0\";\n const os = await import(\"node:os\");\n\n logger.info(`[CloudAuth] Authenticating device (platform=${platform})`);\n\n const response = await this.client.postUnauthenticated<DeviceAuthResponse>(\"/device-auth\", {\n deviceId,\n platform,\n appVersion,\n deviceName: os.hostname(),\n });\n\n this.credentials = {\n apiKey: response.data.apiKey,\n userId: response.data.userId,\n organizationId: response.data.organizationId,\n authenticatedAt: Date.now(),\n };\n this.client.setApiKey(response.data.apiKey);\n\n const action = response.data.isNew ? \"New account created\" : \"Authenticated\";\n logger.info(`[CloudAuth] ${action} (credits: $${response.data.credits.toFixed(2)})`);\n\n return this.credentials;\n }\n\n authenticateWithApiKey(input: ApiKeyAuthInput): CloudCredentials {\n const apiKey = input.apiKey.trim();\n if (!apiKey) {\n throw new Error(\"Eliza Cloud API key is required\");\n }\n\n this.client.setApiKey(apiKey);\n this.credentials = {\n apiKey,\n userId: input.userId ?? \"\",\n organizationId: input.organizationId ?? \"\",\n authenticatedAt: Date.now(),\n };\n\n logger.info(\"[CloudAuth] Authenticated with API key\");\n return this.credentials;\n }\n\n clearAuth(): void {\n this.credentials = null;\n this.client.setApiKey(undefined);\n }\n\n isAuthenticated(): boolean {\n return this.credentials !== null;\n }\n getCredentials(): CloudCredentials | null {\n return this.credentials;\n }\n getApiKey(): string | undefined {\n return this.credentials?.apiKey ?? this.client.getApiKey();\n }\n getClient(): CloudApiClient {\n return this.client;\n }\n getUserId(): string | undefined {\n return this.credentials?.userId;\n }\n getOrganizationId(): string | undefined {\n return this.credentials?.organizationId;\n }\n}\n",
|
|
41
|
+
"/**\n * Cloud-specific types for ElizaCloud integration.\n *\n * These types mirror the eliza-cloud-v2 database schemas and API contracts\n * for containers, auth, credits, bridge messaging, and agent state snapshots.\n */\n\nexport type {\n CloudCodingAgent,\n CloudCodingContainerSession,\n CloudCodingContainerStatus,\n CloudCodingPatch,\n CloudCodingPatchFormat,\n CloudCodingPromotion,\n CloudCodingSyncDirection,\n CloudCodingSyncResult,\n CloudVfsBundle,\n CloudVfsDeletedFile,\n CloudVfsFile,\n CloudVfsFileEncoding,\n CloudVfsSourceKind,\n PromoteVfsToCloudContainerRequest,\n PromoteVfsToCloudContainerResponse,\n RequestCodingAgentContainerRequest,\n RequestCodingAgentContainerResponse,\n SyncCloudCodingContainerRequest,\n SyncCloudCodingContainerResponse,\n} from \"@elizaos/shared\";\n\n// ─── Container Types ────────────────────────────────────────────────────────\n\nexport type ContainerStatus =\n | \"pending\"\n | \"building\"\n | \"deploying\"\n | \"running\"\n | \"stopped\"\n | \"failed\"\n | \"suspended\";\n\nexport type ContainerBillingStatus =\n | \"active\"\n | \"warning\"\n | \"suspended\"\n | \"shutdown_pending\"\n | \"archived\";\n\nexport type ContainerArchitecture = \"arm64\" | \"x86_64\";\n\nexport interface CloudContainer {\n id: string;\n name: string;\n project_name: string;\n description: string | null;\n organization_id: string;\n user_id: string;\n status: ContainerStatus;\n image_tag: string | null;\n port: number;\n desired_count: number;\n cpu: number;\n memory: number;\n architecture: ContainerArchitecture;\n environment_vars: Record<string, string>;\n health_check_path: string;\n load_balancer_url: string | null;\n ecr_repository_uri: string | null;\n ecr_image_tag: string | null;\n cloudformation_stack_name: string | null;\n billing_status: ContainerBillingStatus;\n total_billed: string;\n last_deployed_at: string | null;\n last_health_check: string | null;\n deployment_log: string | null;\n error_message: string | null;\n metadata: Record<string, unknown>;\n created_at: string;\n updated_at: string;\n}\n\nexport interface CreateContainerRequest {\n name: string;\n project_name: string;\n description?: string;\n port?: number;\n desired_count?: number;\n cpu?: number;\n memory?: number;\n environment_vars?: Record<string, string>;\n health_check_path?: string;\n ecr_image_uri: string;\n ecr_repository_uri?: string;\n image_tag?: string;\n architecture?: ContainerArchitecture;\n}\n\nexport interface CreateContainerResponse {\n success: boolean;\n data: CloudContainer;\n message: string;\n creditsDeducted: number;\n creditsRemaining: number;\n stackName: string;\n polling: {\n endpoint: string;\n intervalMs: number;\n expectedDurationMs: number;\n };\n}\n\nexport interface ContainerListResponse {\n success: boolean;\n data: CloudContainer[];\n}\n\nexport interface ContainerGetResponse {\n success: boolean;\n data: CloudContainer;\n}\n\nexport interface ContainerDeleteResponse {\n success: boolean;\n message?: string;\n}\n\nexport interface ContainerHealthResponse {\n success: boolean;\n data: {\n status: string;\n healthy: boolean;\n lastCheck: string | null;\n uptime: number | null;\n };\n}\n\n// ─── Auth Types ─────────────────────────────────────────────────────────────\n\nexport type DevicePlatform = \"ios\" | \"android\" | \"macos\" | \"windows\" | \"linux\" | \"web\";\n\nexport interface DeviceAuthRequest {\n deviceId: string;\n platform: DevicePlatform;\n appVersion: string;\n deviceName?: string;\n}\n\nexport interface DeviceAuthResponse {\n success: boolean;\n data: {\n apiKey: string;\n userId: string;\n organizationId: string;\n credits: number;\n isNew: boolean;\n };\n}\n\nexport interface CloudCredentials {\n apiKey: string;\n userId: string;\n organizationId: string;\n authenticatedAt: number;\n}\n\n// ─── Credits Types ──────────────────────────────────────────────────────────\n\nexport interface CreditBalanceResponse {\n success: boolean;\n data: {\n balance: number;\n currency: string;\n };\n}\n\nexport interface CreditSummaryResponse {\n success: boolean;\n data: {\n balance: number;\n totalSpent: number;\n totalAdded: number;\n recentTransactions: CreditTransaction[];\n };\n}\n\nexport interface CreditTransaction {\n id: string;\n amount: number;\n description: string;\n type: \"credit\" | \"debit\";\n created_at: string;\n}\n\n// ─── Bridge Types ───────────────────────────────────────────────────────────\n\nexport type BridgeConnectionState = \"disconnected\" | \"connecting\" | \"connected\" | \"reconnecting\";\n\nexport interface BridgeMessage {\n jsonrpc: \"2.0\";\n id?: string | number;\n method?: string;\n params?: Record<string, unknown>;\n result?: unknown;\n error?: BridgeError;\n}\n\nexport interface BridgeError {\n code: number;\n message: string;\n data?: unknown;\n}\n\nexport type BridgeMessageHandler = (message: BridgeMessage) => void;\n\nexport interface BridgeConnection {\n containerId: string;\n state: BridgeConnectionState;\n connectedAt: number | null;\n lastHeartbeat: number | null;\n reconnectAttempts: number;\n}\n\n// ─── Managed Gateway Relay Types ───────────────────────────────────────────\n\nexport interface GatewayRelaySession {\n id: string;\n organizationId: string;\n userId: string;\n runtimeAgentId: string;\n agentName: string | null;\n platform: \"local-runtime\";\n createdAt: string;\n lastSeenAt: string;\n}\n\nexport interface GatewayRelayRequest {\n jsonrpc: \"2.0\";\n id?: string | number;\n method: string;\n params?: Record<string, unknown>;\n}\n\nexport interface GatewayRelayResponse {\n jsonrpc: \"2.0\";\n id?: string | number;\n result?: Record<string, unknown>;\n error?: BridgeError;\n}\n\nexport interface GatewayRelayRequestEnvelope {\n requestId: string;\n rpc: GatewayRelayRequest;\n queuedAt: string;\n}\n\nexport interface RegisterGatewayRelaySessionResponse {\n success: boolean;\n data: {\n session: GatewayRelaySession;\n };\n}\n\nexport interface PollGatewayRelayResponse {\n success: boolean;\n data: {\n request: GatewayRelayRequestEnvelope | null;\n };\n}\n\n// ─── Snapshot / Backup Types ────────────────────────────────────────────────\n\nexport type SnapshotType = \"manual\" | \"auto\" | \"pre-eviction\";\n\nexport interface AgentSnapshot {\n id: string;\n containerId: string;\n organizationId: string;\n snapshotType: SnapshotType;\n storageUrl: string;\n sizeBytes: number;\n agentConfig: Record<string, unknown>;\n metadata: Record<string, unknown>;\n created_at: string;\n}\n\nexport interface CreateSnapshotRequest {\n snapshotType?: SnapshotType;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreateSnapshotResponse {\n success: boolean;\n data: AgentSnapshot;\n}\n\nexport interface SnapshotListResponse {\n success: boolean;\n data: AgentSnapshot[];\n}\n\nexport interface RestoreSnapshotRequest {\n snapshotId: string;\n}\n\nexport interface RestoreSnapshotResponse {\n success: boolean;\n message: string;\n}\n\n// ─── Cloud Config Types ─────────────────────────────────────────────────────\n\nexport type InferenceMode = \"cloud\" | \"byok\" | \"local\";\n\nexport interface CloudPluginConfig {\n /** Enable ElizaCloud integration. */\n enabled: boolean;\n /** ElizaCloud API base URL. */\n baseUrl: string;\n /** Stored API key for authenticated requests. */\n apiKey?: string;\n /** Device ID used for auto-signup authentication. */\n deviceId?: string;\n /** Platform identifier. */\n platform?: DevicePlatform;\n /** Inference mode: cloud (ElizaCloud proxied), byok (user keys), local (no cloud). */\n inferenceMode: InferenceMode;\n /** Auto-deploy agents to cloud on creation. */\n autoProvision: boolean;\n /** Bridge reconnection settings. */\n bridge: {\n reconnectIntervalMs: number;\n maxReconnectAttempts: number;\n heartbeatIntervalMs: number;\n };\n /** Auto-backup settings. */\n backup: {\n autoBackupIntervalMs: number;\n maxSnapshots: number;\n };\n /** Default container settings for new deployments. */\n container: {\n defaultImage: string;\n defaultArchitecture: ContainerArchitecture;\n defaultCpu: number;\n defaultMemory: number;\n defaultPort: number;\n };\n}\n\nexport const DEFAULT_CLOUD_CONFIG: CloudPluginConfig = {\n enabled: false,\n baseUrl: \"https://www.elizacloud.ai/api/v1\",\n inferenceMode: \"cloud\",\n autoProvision: false,\n bridge: {\n reconnectIntervalMs: 3000,\n maxReconnectAttempts: 20,\n heartbeatIntervalMs: 30_000,\n },\n backup: {\n autoBackupIntervalMs: 3_600_000, // 1 hour\n maxSnapshots: 10,\n },\n container: {\n defaultImage: \"elizaos/agent:latest\",\n defaultArchitecture: \"arm64\",\n defaultCpu: 1792,\n defaultMemory: 1792,\n defaultPort: 3000,\n },\n};\n\n// ─── API Error Types ────────────────────────────────────────────────────────\n\nexport type { CloudApiErrorBody } from \"@elizaos/cloud-sdk\";\nexport {\n CloudApiError,\n InsufficientCreditsError,\n} from \"@elizaos/cloud-sdk\";\n",
|
|
42
|
+
"export type {\n CloudApiErrorBody,\n CloudRequestOptions,\n} from \"@elizaos/cloud-sdk\";\nexport {\n CloudApiClient,\n CloudApiError,\n ElizaCloudHttpClient,\n InsufficientCreditsError,\n} from \"@elizaos/cloud-sdk\";\n",
|
|
29
43
|
"/**\n * CloudBackupService — Agent state snapshots and restore.\n *\n * Creates, lists, and restores agent state snapshots through the ElizaCloud\n * API. Supports manual snapshots, periodic auto-backup, and pre-eviction\n * snapshots triggered by the billing system's low-credit warning.\n */\n\nimport { type IAgentRuntime, logger, Service } from \"@elizaos/core\";\nimport type {\n AgentSnapshot,\n CreateSnapshotResponse,\n RestoreSnapshotResponse,\n SnapshotListResponse,\n SnapshotType,\n} from \"../types/cloud\";\nimport { DEFAULT_CLOUD_CONFIG } from \"../types/cloud\";\nimport type { CloudAuthService } from \"./cloud-auth\";\n\ninterface AutoBackupEntry {\n containerId: string;\n timer: ReturnType<typeof setInterval>;\n lastBackupAt: number | null;\n}\n\nexport class CloudBackupService extends Service {\n static serviceType = \"CLOUD_BACKUP\";\n capabilityDescription = \"ElizaCloud agent state backup and restore\";\n\n private authService!: CloudAuthService;\n private autoBackups: Map<string, AutoBackupEntry> = new Map();\n private readonly maxSnapshots = DEFAULT_CLOUD_CONFIG.backup.maxSnapshots;\n private readonly backupIntervalMs = DEFAULT_CLOUD_CONFIG.backup.autoBackupIntervalMs;\n\n static async start(runtime: IAgentRuntime): Promise<Service> {\n const service = new CloudBackupService(runtime);\n await service.initialize();\n return service;\n }\n\n async stop(): Promise<void> {\n for (const [, entry] of this.autoBackups) {\n clearInterval(entry.timer);\n }\n this.autoBackups.clear();\n logger.info(\"[CloudBackup] Service stopped\");\n }\n\n private async initialize(): Promise<void> {\n const auth = this.runtime.getService(\"CLOUD_AUTH\");\n if (!auth) {\n logger.debug(\"[CloudBackup] CloudAuthService not available\");\n return;\n }\n this.authService = auth as CloudAuthService;\n logger.info(\"[CloudBackup] Service initialized\");\n }\n\n // ─── Snapshot CRUD ─────────────────────────────────────────────────────\n\n async createSnapshot(\n containerId: string,\n snapshotType: SnapshotType = \"manual\",\n metadata?: Record<string, unknown>\n ): Promise<AgentSnapshot> {\n const client = this.authService.getClient();\n const response = await client.post<CreateSnapshotResponse>(\n `/agent-state/${containerId}/snapshot`,\n { snapshotType, metadata }\n );\n\n logger.info(\n `[CloudBackup] Created ${snapshotType} snapshot for container ${containerId} (id=${response.data.id}, size=${formatBytes(response.data.sizeBytes)})`\n );\n\n // Update last backup timestamp for auto-backup tracking\n const autoEntry = this.autoBackups.get(containerId);\n if (autoEntry) {\n autoEntry.lastBackupAt = Date.now();\n }\n\n return response.data;\n }\n\n async listSnapshots(containerId: string): Promise<AgentSnapshot[]> {\n const client = this.authService.getClient();\n const response = await client.get<SnapshotListResponse>(\n `/agent-state/${containerId}/snapshots`\n );\n return response.data;\n }\n\n async restoreSnapshot(containerId: string, snapshotId: string): Promise<void> {\n const client = this.authService.getClient();\n\n await client.post<RestoreSnapshotResponse>(`/agent-state/${containerId}/restore`, {\n snapshotId,\n });\n\n logger.info(`[CloudBackup] Restored snapshot ${snapshotId} for container ${containerId}`);\n }\n\n async getLatestSnapshot(containerId: string): Promise<AgentSnapshot | null> {\n const snapshots = await this.listSnapshots(containerId);\n if (snapshots.length === 0) return null;\n\n // Sort by created_at descending and return the most recent\n snapshots.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());\n return snapshots[0];\n }\n\n // ─── Auto-Backup Scheduling ────────────────────────────────────────────\n\n scheduleAutoBackup(containerId: string, intervalMs?: number): void {\n // Don't double-schedule\n if (this.autoBackups.has(containerId)) {\n logger.debug(`[CloudBackup] Auto-backup already scheduled for ${containerId}`);\n return;\n }\n\n const interval = intervalMs ?? this.backupIntervalMs;\n\n const timer = setInterval(() => {\n logger.debug(`[CloudBackup] Running auto-backup for container ${containerId}`);\n this.createSnapshot(containerId, \"auto\", {\n trigger: \"scheduled\",\n scheduledIntervalMs: interval,\n })\n .then(() => this.pruneSnapshots(containerId))\n .catch((err: Error) => {\n logger.error(`[CloudBackup] Auto-backup failed for ${containerId}: ${err.message}`);\n });\n }, interval);\n\n this.autoBackups.set(containerId, {\n containerId,\n timer,\n lastBackupAt: null,\n });\n\n logger.info(\n `[CloudBackup] Scheduled auto-backup for ${containerId} every ${Math.round(interval / 60_000)} minutes`\n );\n }\n\n cancelAutoBackup(containerId: string): void {\n const entry = this.autoBackups.get(containerId);\n if (!entry) return;\n\n clearInterval(entry.timer);\n this.autoBackups.delete(containerId);\n logger.info(`[CloudBackup] Cancelled auto-backup for ${containerId}`);\n }\n\n /**\n * Create a pre-eviction snapshot. Called when the billing system sends\n * a low-credit warning before shutting down the container.\n */\n async createPreEvictionSnapshot(containerId: string): Promise<AgentSnapshot> {\n logger.info(`[CloudBackup] Creating pre-eviction snapshot for ${containerId}`);\n return this.createSnapshot(containerId, \"pre-eviction\", {\n trigger: \"billing-eviction\",\n createdAt: new Date().toISOString(),\n });\n }\n\n // ─── Snapshot Pruning ──────────────────────────────────────────────────\n\n /**\n * Remove the oldest auto snapshots beyond maxSnapshots limit.\n * Manual and pre-eviction snapshots are never pruned.\n */\n private async pruneSnapshots(containerId: string): Promise<void> {\n const snapshots = await this.listSnapshots(containerId);\n\n const autoSnapshots = snapshots\n .filter((s) => s.snapshotType === \"auto\")\n .sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());\n\n const excess = autoSnapshots.slice(this.maxSnapshots);\n if (excess.length === 0) return;\n\n const client = this.authService.getClient();\n for (const snapshot of excess) {\n await client.delete(`/agent-state/${containerId}/snapshots/${snapshot.id}`);\n logger.debug(`[CloudBackup] Pruned old auto snapshot ${snapshot.id} for ${containerId}`);\n }\n\n logger.info(`[CloudBackup] Pruned ${excess.length} old auto snapshot(s) for ${containerId}`);\n }\n\n // ─── Accessors ─────────────────────────────────────────────────────────\n\n isAutoBackupScheduled(containerId: string): boolean {\n return this.autoBackups.has(containerId);\n }\n\n getLastBackupTime(containerId: string): number | null {\n return this.autoBackups.get(containerId)?.lastBackupAt ?? null;\n }\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n",
|
|
30
|
-
"/**\n * CloudBridgeService — WebSocket bridge to cloud-hosted agents.\n *\n * Establishes a JSON-RPC 2.0 WebSocket connection per container, allowing\n * the local milady client to send messages to and receive events from\n * cloud-hosted ElizaOS agents. Handles reconnection with exponential\n * backoff and heartbeat keepalive.\n */\n\nimport { type IAgentRuntime, logger, Service } from \"@elizaos/core\";\nimport { WebSocket } from \"undici\";\nimport type {\n BridgeConnection,\n BridgeConnectionState,\n BridgeMessage,\n BridgeMessageHandler,\n} from \"../types/cloud\";\nimport { DEFAULT_CLOUD_CONFIG } from \"../types/cloud\";\nimport type { CloudAuthService } from \"./cloud-auth\";\n\ninterface ActiveConnection {\n ws: WebSocket;\n state: BridgeConnectionState;\n connectedAt: number | null;\n lastHeartbeat: number | null;\n reconnectAttempts: number;\n heartbeatTimer: ReturnType<typeof setInterval> | null;\n reconnectTimer: ReturnType<typeof setTimeout> | null;\n handlers: Set<BridgeMessageHandler>;\n pendingRequests: Map<\n string | number,\n {\n resolve: (value: unknown) => void;\n reject: (reason: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }\n >;\n nextRequestId: number;\n}\n\nexport class CloudBridgeService extends Service {\n static serviceType = \"CLOUD_BRIDGE\";\n capabilityDescription = \"WebSocket bridge to cloud-hosted ElizaOS agents\";\n\n private authService!: CloudAuthService;\n private readonly bridgeConfig = DEFAULT_CLOUD_CONFIG.bridge;\n private connections: Map<string, ActiveConnection> = new Map();\n\n static async start(runtime: IAgentRuntime): Promise<Service> {\n const service = new CloudBridgeService(runtime);\n await service.initialize();\n return service;\n }\n\n async stop(): Promise<void> {\n for (const [containerId] of this.connections) {\n await this.disconnect(containerId);\n }\n logger.info(\"[CloudBridge] Service stopped\");\n }\n\n private async initialize(): Promise<void> {\n const auth = this.runtime.getService(\"CLOUD_AUTH\");\n if (!auth) {\n logger.debug(\"[CloudBridge] CloudAuthService not available\");\n return;\n }\n this.authService = auth as CloudAuthService;\n logger.info(\"[CloudBridge] Service initialized\");\n }\n\n // ─── Connection Management ─────────────────────────────────────────────\n\n async connect(containerId: string): Promise<void> {\n if (this.connections.has(containerId)) {\n const existing = this.connections.get(containerId)!;\n if (existing.state === \"connected\" || existing.state === \"connecting\") {\n logger.debug(`[CloudBridge] Already connected/connecting to ${containerId}`);\n return;\n }\n }\n\n await this.establishConnection(containerId, 0);\n }\n\n async disconnect(containerId: string): Promise<void> {\n const conn = this.connections.get(containerId);\n if (!conn) return;\n\n if (conn.heartbeatTimer) clearInterval(conn.heartbeatTimer);\n if (conn.reconnectTimer) clearTimeout(conn.reconnectTimer);\n\n // Reject all pending requests\n for (const [, pending] of conn.pendingRequests) {\n clearTimeout(pending.timeout);\n pending.reject(new Error(\"Bridge disconnected\"));\n }\n conn.pendingRequests.clear();\n\n if (conn.ws.readyState === WebSocket.OPEN || conn.ws.readyState === WebSocket.CONNECTING) {\n conn.ws.close(1000, \"Client disconnect\");\n }\n\n this.connections.delete(containerId);\n logger.info(`[CloudBridge] Disconnected from ${containerId}`);\n }\n\n private async establishConnection(containerId: string, reconnectAttempts: number): Promise<void> {\n const client = this.authService.getClient();\n const apiKey = this.authService.getApiKey();\n const wsUrl = client.buildWsUrl(`/agent-bridge/${containerId}`);\n\n // Append API key as query parameter for WebSocket auth\n const authUrl = apiKey ? `${wsUrl}?token=${encodeURIComponent(apiKey)}` : wsUrl;\n\n const conn: ActiveConnection = {\n ws: new WebSocket(authUrl),\n state: \"connecting\",\n connectedAt: null,\n lastHeartbeat: null,\n reconnectAttempts,\n heartbeatTimer: null,\n reconnectTimer: null,\n handlers: this.connections.get(containerId)?.handlers ?? new Set(),\n pendingRequests: new Map(),\n nextRequestId: 1,\n };\n\n this.connections.set(containerId, conn);\n\n conn.ws.addEventListener(\"open\", () => {\n conn.state = \"connected\";\n conn.connectedAt = Date.now();\n conn.reconnectAttempts = 0;\n logger.info(`[CloudBridge] Connected to agent ${containerId}`);\n\n // Start heartbeat\n conn.heartbeatTimer = setInterval(() => {\n this.sendHeartbeat(containerId);\n }, this.bridgeConfig.heartbeatIntervalMs);\n });\n\n conn.ws.addEventListener(\"message\", (event) => {\n const raw = event.data;\n const data =\n typeof raw === \"string\" ? raw : raw instanceof Buffer ? raw.toString(\"utf-8\") : String(raw);\n const message = JSON.parse(data) as BridgeMessage;\n\n // Handle heartbeat responses\n if (message.method === \"heartbeat.ack\") {\n conn.lastHeartbeat = Date.now();\n return;\n }\n\n // Handle responses to pending requests\n if (message.id !== undefined && !message.method) {\n const pending = conn.pendingRequests.get(message.id);\n if (pending) {\n clearTimeout(pending.timeout);\n conn.pendingRequests.delete(message.id);\n if (message.error) {\n pending.reject(new Error(message.error.message));\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n }\n\n // Dispatch to handlers\n for (const handler of conn.handlers) {\n handler(message);\n }\n });\n\n conn.ws.addEventListener(\"close\", (event: CloseEvent) => {\n conn.state = \"disconnected\";\n if (conn.heartbeatTimer) clearInterval(conn.heartbeatTimer);\n\n // Don't reconnect on clean close\n if (event.code === 1000) {\n logger.info(`[CloudBridge] Clean disconnect from ${containerId}`);\n return;\n }\n\n logger.warn(\n `[CloudBridge] Connection lost to ${containerId} (code=${event.code}, reason=${event.reason})`\n );\n this.scheduleReconnect(containerId, conn.reconnectAttempts + 1);\n });\n\n conn.ws.addEventListener(\"error\", () => {\n logger.error(`[CloudBridge] WebSocket error for ${containerId}`);\n });\n }\n\n private scheduleReconnect(containerId: string, attempt: number): void {\n if (attempt > this.bridgeConfig.maxReconnectAttempts) {\n logger.error(\n `[CloudBridge] Max reconnect attempts (${this.bridgeConfig.maxReconnectAttempts}) reached for ${containerId}`\n );\n this.connections.delete(containerId);\n return;\n }\n\n // Exponential backoff with jitter: base * 2^attempt + random jitter\n const base = this.bridgeConfig.reconnectIntervalMs;\n const delay = Math.min(base * 2 ** Math.min(attempt, 5), 120_000);\n const jitter = Math.floor(Math.random() * 1000);\n\n logger.info(\n `[CloudBridge] Reconnecting to ${containerId} in ${Math.round((delay + jitter) / 1000)}s (attempt ${attempt})`\n );\n\n const conn = this.connections.get(containerId);\n if (conn) {\n conn.state = \"reconnecting\";\n conn.reconnectTimer = setTimeout(() => {\n this.establishConnection(containerId, attempt);\n }, delay + jitter);\n }\n }\n\n private sendHeartbeat(containerId: string): void {\n const conn = this.connections.get(containerId);\n if (!conn || conn.state !== \"connected\") return;\n\n const message: BridgeMessage = {\n jsonrpc: \"2.0\",\n method: \"heartbeat\",\n params: { timestamp: Date.now() },\n };\n\n conn.ws.send(JSON.stringify(message));\n }\n\n // ─── Messaging ─────────────────────────────────────────────────────────\n\n /**\n * Send a JSON-RPC request and wait for a response.\n */\n async sendRequest(\n containerId: string,\n method: string,\n params: Record<string, unknown>,\n timeoutMs = 60_000\n ): Promise<unknown> {\n const conn = this.connections.get(containerId);\n if (!conn || conn.state !== \"connected\") {\n throw new Error(`Not connected to container ${containerId}`);\n }\n\n const id = conn.nextRequestId++;\n const message: BridgeMessage = {\n jsonrpc: \"2.0\",\n id,\n method,\n params,\n };\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n conn.pendingRequests.delete(id);\n reject(new Error(`Request ${method} timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n conn.pendingRequests.set(id, { resolve, reject, timeout });\n conn.ws.send(JSON.stringify(message));\n });\n }\n\n /**\n * Send a one-way notification (no response expected).\n */\n sendNotification(containerId: string, method: string, params: Record<string, unknown>): void {\n const conn = this.connections.get(containerId);\n if (!conn || conn.state !== \"connected\") {\n throw new Error(`Not connected to container ${containerId}`);\n }\n\n const message: BridgeMessage = {\n jsonrpc: \"2.0\",\n method,\n params,\n };\n\n conn.ws.send(JSON.stringify(message));\n }\n\n /**\n * Send a chat message to the cloud agent and get the response.\n */\n async sendChatMessage(\n containerId: string,\n text: string,\n roomId?: string,\n metadata?: Record<string, unknown>\n ): Promise<{ text: string; metadata?: Record<string, unknown> }> {\n const result = await this.sendRequest(containerId, \"message.send\", {\n text,\n roomId,\n metadata,\n });\n return result as { text: string; metadata?: Record<string, unknown> };\n }\n\n /**\n * Request the cloud agent's current status.\n */\n async getAgentStatus(containerId: string): Promise<Record<string, unknown>> {\n const result = await this.sendRequest(containerId, \"status.get\", {});\n return result as Record<string, unknown>;\n }\n\n /**\n * Update the cloud agent's configuration.\n */\n async updateAgentConfig(containerId: string, config: Record<string, unknown>): Promise<void> {\n await this.sendRequest(containerId, \"config.update\", config);\n }\n\n // ─── Event Handlers ────────────────────────────────────────────────────\n\n onMessage(containerId: string, handler: BridgeMessageHandler): () => void {\n let conn = this.connections.get(containerId);\n if (!conn) {\n // Pre-register handler before connection is established\n conn = {\n ws: null as unknown as WebSocket,\n state: \"disconnected\",\n connectedAt: null,\n lastHeartbeat: null,\n reconnectAttempts: 0,\n heartbeatTimer: null,\n reconnectTimer: null,\n handlers: new Set(),\n pendingRequests: new Map(),\n nextRequestId: 1,\n };\n this.connections.set(containerId, conn);\n }\n\n conn.handlers.add(handler);\n\n // Return unsubscribe function\n return () => {\n conn.handlers.delete(handler);\n };\n }\n\n // ─── Accessors ─────────────────────────────────────────────────────────\n\n getConnectionState(containerId: string): BridgeConnectionState {\n return this.connections.get(containerId)?.state ?? \"disconnected\";\n }\n\n getConnectionInfo(containerId: string): BridgeConnection | null {\n const conn = this.connections.get(containerId);\n if (!conn) return null;\n\n return {\n containerId,\n state: conn.state,\n connectedAt: conn.connectedAt,\n lastHeartbeat: conn.lastHeartbeat,\n reconnectAttempts: conn.reconnectAttempts,\n };\n }\n\n getConnectedContainerIds(): string[] {\n const ids: string[] = [];\n for (const [id, conn] of this.connections) {\n if (conn.state === \"connected\") ids.push(id);\n }\n return ids;\n }\n}\n",
|
|
31
|
-
"/**\n * CloudContainerService — Manages container lifecycle through ElizaCloud API.\n *\n * Handles creation, listing, status polling, health monitoring, and deletion\n * of ECS-backed containers. Deployments are async (CloudFormation takes 8-12\n * minutes), so `waitForDeployment` polls with exponential backoff.\n */\n\nimport { type IAgentRuntime, logger, Service } from \"@elizaos/core\";\nimport type {\n CloudContainer,\n ContainerDeleteResponse,\n ContainerGetResponse,\n ContainerHealthResponse,\n ContainerListResponse,\n CreateContainerRequest,\n CreateContainerResponse,\n} from \"../types/cloud\";\nimport { DEFAULT_CLOUD_CONFIG } from \"../types/cloud\";\nimport type { CloudApiClient } from \"../utils/cloud-api\";\nimport type { CloudAuthService } from \"./cloud-auth\";\n\n/** Active containers tracked locally for quick access. */\ninterface TrackedContainer {\n container: CloudContainer;\n pollingTimer: ReturnType<typeof setTimeout> | null;\n healthTimer: ReturnType<typeof setInterval> | null;\n}\n\nexport class CloudContainerService extends Service {\n static serviceType = \"CLOUD_CONTAINER\";\n capabilityDescription = \"ElizaCloud container provisioning and lifecycle management\";\n\n private authService!: CloudAuthService;\n private readonly containerDefaults = DEFAULT_CLOUD_CONFIG.container;\n private tracked: Map<string, TrackedContainer> = new Map();\n\n static async start(runtime: IAgentRuntime): Promise<Service> {\n const service = new CloudContainerService(runtime);\n await service.initialize();\n return service;\n }\n\n async stop(): Promise<void> {\n for (const [, tracked] of this.tracked) {\n if (tracked.pollingTimer) clearTimeout(tracked.pollingTimer);\n if (tracked.healthTimer) clearInterval(tracked.healthTimer);\n }\n this.tracked.clear();\n }\n\n private async initialize(): Promise<void> {\n // Get auth service reference\n const auth = this.runtime.getService(\"CLOUD_AUTH\");\n if (!auth) {\n logger.debug(\n \"[CloudContainer] CloudAuthService not available, container operations will fail\"\n );\n return;\n }\n this.authService = auth as CloudAuthService;\n\n // Load existing containers\n if (this.authService.isAuthenticated()) {\n const containers = await this.listContainers();\n for (const container of containers) {\n this.tracked.set(container.id, {\n container,\n pollingTimer: null,\n healthTimer: null,\n });\n\n // Resume polling for containers that are still deploying\n if (\n container.status === \"pending\" ||\n container.status === \"building\" ||\n container.status === \"deploying\"\n ) {\n this.startPolling(container.id);\n }\n\n // Start health monitoring for running containers\n if (container.status === \"running\") {\n this.startHealthMonitoring(container.id);\n }\n }\n logger.info(`[CloudContainer] Loaded ${containers.length} existing container(s)`);\n }\n }\n\n private getClient(): CloudApiClient {\n return this.authService.getClient();\n }\n\n // ─── CRUD ───────────────────────────────────────────────────────────────\n\n async createContainer(request: CreateContainerRequest): Promise<CreateContainerResponse> {\n const client = this.getClient();\n const defaults = this.containerDefaults;\n\n const payload: Record<string, unknown> = {\n name: request.name,\n project_name: request.project_name,\n description: request.description,\n port: request.port ?? defaults.defaultPort,\n desired_count: request.desired_count ?? 1,\n cpu: request.cpu ?? defaults.defaultCpu,\n memory: request.memory ?? defaults.defaultMemory,\n environment_vars: request.environment_vars ?? {},\n health_check_path: request.health_check_path ?? \"/health\",\n ecr_image_uri: request.ecr_image_uri,\n ecr_repository_uri: request.ecr_repository_uri,\n image_tag: request.image_tag,\n architecture: request.architecture ?? defaults.defaultArchitecture,\n };\n\n const response = await client.post<CreateContainerResponse>(\"/containers\", payload);\n\n // Track the new container\n this.tracked.set(response.data.id, {\n container: response.data,\n pollingTimer: null,\n healthTimer: null,\n });\n\n // Start polling for deployment completion\n this.startPolling(response.data.id);\n\n logger.info(\n `[CloudContainer] Created container \"${request.name}\" (id=${response.data.id}, stack=${response.stackName})`\n );\n\n return response;\n }\n\n async listContainers(): Promise<CloudContainer[]> {\n const client = this.getClient();\n const response = await client.get<ContainerListResponse>(\"/containers\");\n return response.data;\n }\n\n async getContainer(containerId: string): Promise<CloudContainer> {\n const client = this.getClient();\n const response = await client.get<ContainerGetResponse>(`/containers/${containerId}`);\n\n // Update local tracking\n const existing = this.tracked.get(containerId);\n if (existing) {\n existing.container = response.data;\n }\n\n return response.data;\n }\n\n async deleteContainer(containerId: string): Promise<void> {\n const client = this.getClient();\n await client.delete<ContainerDeleteResponse>(`/containers/${containerId}`);\n\n // Stop tracking\n const tracked = this.tracked.get(containerId);\n if (tracked) {\n if (tracked.pollingTimer) clearTimeout(tracked.pollingTimer);\n if (tracked.healthTimer) clearInterval(tracked.healthTimer);\n this.tracked.delete(containerId);\n }\n\n logger.info(`[CloudContainer] Deleted container ${containerId}`);\n }\n\n // ─── Deployment Polling ────────────────────────────────────────────────\n\n /**\n * Poll container status until it reaches a terminal state (running, failed, stopped).\n * Uses exponential backoff: 5s, 10s, 20s, 30s, 30s, ...\n */\n private startPolling(containerId: string): void {\n const tracked = this.tracked.get(containerId);\n if (!tracked) return;\n\n let attempt = 0;\n const maxAttempts = 120; // ~1 hour with backoff\n const baseInterval = 5_000;\n const maxInterval = 30_000;\n\n const poll = async () => {\n attempt++;\n if (attempt > maxAttempts) {\n logger.error(\n `[CloudContainer] Polling timed out for container ${containerId} after ${maxAttempts} attempts`\n );\n return;\n }\n\n const container = await this.getContainer(containerId);\n const status = container.status;\n\n logger.debug(`[CloudContainer] Poll #${attempt} for ${containerId}: status=${status}`);\n\n if (status === \"running\") {\n logger.info(\n `[CloudContainer] Container ${containerId} is now running at ${container.load_balancer_url}`\n );\n this.startHealthMonitoring(containerId);\n return;\n }\n\n if (status === \"failed\" || status === \"stopped\" || status === \"suspended\") {\n logger.warn(`[CloudContainer] Container ${containerId} reached terminal state: ${status}`);\n if (container.error_message) {\n logger.error(`[CloudContainer] Error: ${container.error_message}`);\n }\n return;\n }\n\n // Schedule next poll with exponential backoff\n const delay = Math.min(baseInterval * 2 ** Math.min(attempt - 1, 3), maxInterval);\n tracked.pollingTimer = setTimeout(poll, delay);\n };\n\n tracked.pollingTimer = setTimeout(poll, baseInterval);\n }\n\n /**\n * Wait for a container to reach \"running\" status. Returns the updated container.\n * This is the synchronous API for actions that need to block.\n */\n async waitForDeployment(containerId: string, timeoutMs = 900_000): Promise<CloudContainer> {\n const deadline = Date.now() + timeoutMs;\n let interval = 5_000;\n const maxInterval = 30_000;\n\n while (Date.now() < deadline) {\n const container = await this.getContainer(containerId);\n\n if (container.status === \"running\") return container;\n if (container.status === \"failed\") {\n throw new Error(\n `Container deployment failed: ${container.error_message ?? \"unknown error\"}`\n );\n }\n if (container.status === \"stopped\" || container.status === \"suspended\") {\n throw new Error(`Container reached terminal state: ${container.status}`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, interval));\n interval = Math.min(interval * 1.5, maxInterval);\n }\n\n throw new Error(`Container deployment timed out after ${Math.round(timeoutMs / 1000)}s`);\n }\n\n // ─── Health Monitoring ─────────────────────────────────────────────────\n\n private startHealthMonitoring(containerId: string): void {\n const tracked = this.tracked.get(containerId);\n if (!tracked || tracked.healthTimer) return;\n\n const interval = 60_000; // Check every 60 seconds\n\n tracked.healthTimer = setInterval(() => {\n this.getContainerHealth(containerId)\n .then((health) => {\n if (!health.data.healthy) {\n logger.warn(\n `[CloudContainer] Container ${containerId} unhealthy: ${health.data.status}`\n );\n }\n })\n .catch((err: Error) => {\n logger.error(`[CloudContainer] Health check failed for ${containerId}: ${err.message}`);\n });\n }, interval);\n }\n\n async getContainerHealth(containerId: string): Promise<ContainerHealthResponse> {\n const client = this.getClient();\n return client.get<ContainerHealthResponse>(`/containers/${containerId}/health`);\n }\n\n // ─── Accessors ─────────────────────────────────────────────────────────\n\n getTrackedContainers(): CloudContainer[] {\n return Array.from(this.tracked.values()).map((t) => t.container);\n }\n\n getTrackedContainer(containerId: string): CloudContainer | undefined {\n return this.tracked.get(containerId)?.container;\n }\n\n isContainerRunning(containerId: string): boolean {\n return this.tracked.get(containerId)?.container.status === \"running\";\n }\n\n getContainerUrl(containerId: string): string | null {\n return this.tracked.get(containerId)?.container.load_balancer_url ?? null;\n }\n}\n",
|
|
32
|
-
"/** Fetches and caches available models from ElizaCloud. */\n\nimport { type IAgentRuntime, logger, Service } from \"@elizaos/core\";\nimport type { CloudAuthService } from \"./cloud-auth\";\n\ninterface ModelListEntry {\n id: string;\n object: string;\n created: number;\n owned_by: string;\n}\n\ninterface ModelListResponse {\n object: string;\n data: ModelListEntry[];\n}\n\nexport interface AvailableModel {\n id: string;\n provider: string;\n name: string;\n createdAt: number;\n}\n\nexport interface ModelsByProvider {\n [provider: string]: AvailableModel[];\n}\n\nconst CACHE_TTL_MS = 30 * 60 * 1000; // 30 minutes\n\nconst PROVIDER_PREFIXES: ReadonlyArray<[string, string]> = [\n [\"gpt-\", \"openai\"],\n [\"o1\", \"openai\"],\n [\"o3\", \"openai\"],\n [\"o4\", \"openai\"],\n [\"dall-e\", \"openai\"],\n [\"whisper\", \"openai\"],\n [\"tts\", \"openai\"],\n [\"claude-\", \"anthropic\"],\n [\"gemini-\", \"google\"],\n [\"llama\", \"meta\"],\n [\"deepseek\", \"deepseek\"],\n [\"grok\", \"xai\"],\n [\"kimi\", \"moonshot\"],\n];\n\nfunction extractProvider(modelId: string): string {\n if (modelId.includes(\"/\")) return modelId.split(\"/\")[0];\n const lower = modelId.toLowerCase();\n for (const [prefix, provider] of PROVIDER_PREFIXES) {\n if (lower.startsWith(prefix)) return provider;\n }\n return \"unknown\";\n}\n\nfunction stripProvider(modelId: string): string {\n if (modelId.includes(\"/\")) {\n return modelId.split(\"/\").slice(1).join(\"/\");\n }\n return modelId;\n}\n\nexport class CloudModelRegistryService extends Service {\n static serviceType = \"CLOUD_MODEL_REGISTRY\";\n capabilityDescription = \"Discovers and caches available AI models from ElizaCloud\";\n\n private models: AvailableModel[] = [];\n private byProvider: ModelsByProvider = {};\n private lastFetchedAt = 0;\n private fetchPromise: Promise<void> | null = null;\n\n static async start(runtime: IAgentRuntime): Promise<Service> {\n const service = new CloudModelRegistryService(runtime);\n await service.initialize();\n return service;\n }\n\n async stop(): Promise<void> {\n this.models = [];\n this.byProvider = {};\n this.lastFetchedAt = 0;\n }\n\n private async initialize(): Promise<void> {\n const auth = this.runtime.getService(\"CLOUD_AUTH\") as CloudAuthService | undefined;\n\n if (!auth?.isAuthenticated()) {\n logger.info(\"[CloudModelRegistry] Auth not available, will fetch models on first access\");\n return;\n }\n\n await this.fetchModels();\n this.validateConfiguredModels();\n }\n\n private async fetchModels(): Promise<void> {\n if (this.fetchPromise) {\n await this.fetchPromise;\n return;\n }\n\n this.fetchPromise = this.doFetchModels();\n await this.fetchPromise;\n this.fetchPromise = null;\n }\n\n private async doFetchModels(): Promise<void> {\n const auth = this.runtime.getService(\"CLOUD_AUTH\") as CloudAuthService | undefined;\n if (!auth?.isAuthenticated()) return;\n\n const client = auth.getClient();\n\n const response = await client.get<ModelListResponse>(\"/models\");\n const entries = response.data ?? [];\n\n this.models = entries.map((entry) => ({\n id: entry.id,\n provider: extractProvider(entry.id),\n name: stripProvider(entry.id),\n createdAt: entry.created,\n }));\n\n this.byProvider = {};\n for (const model of this.models) {\n if (!this.byProvider[model.provider]) {\n this.byProvider[model.provider] = [];\n }\n this.byProvider[model.provider].push(model);\n }\n\n this.lastFetchedAt = Date.now();\n logger.info(\n `[CloudModelRegistry] Loaded ${this.models.length} models from ${Object.keys(this.byProvider).length} providers`\n );\n }\n\n private validateConfiguredModels(): void {\n if (this.models.length === 0) return;\n\n const modelIds = new Set(this.models.map((m) => m.id));\n const nameSet = new Set(this.models.map((m) => m.name));\n\n const settingsToCheck = [\n { key: \"ELIZAOS_CLOUD_SMALL_MODEL\", label: \"small model\" },\n { key: \"ELIZAOS_CLOUD_LARGE_MODEL\", label: \"large model\" },\n {\n key: \"ELIZAOS_CLOUD_REASONING_SMALL_MODEL\",\n label: \"reasoning small model\",\n },\n {\n key: \"ELIZAOS_CLOUD_REASONING_LARGE_MODEL\",\n label: \"reasoning large model\",\n },\n { key: \"ELIZAOS_CLOUD_RESEARCH_MODEL\", label: \"research model\" },\n { key: \"ELIZAOS_CLOUD_EMBEDDING_MODEL\", label: \"embedding model\" },\n {\n key: \"ELIZAOS_CLOUD_IMAGE_DESCRIPTION_MODEL\",\n label: \"image description model\",\n },\n {\n key: \"ELIZAOS_CLOUD_IMAGE_GENERATION_MODEL\",\n label: \"image generation model\",\n },\n { key: \"ELIZAOS_CLOUD_TTS_MODEL\", label: \"TTS model\" },\n {\n key: \"ELIZAOS_CLOUD_TRANSCRIPTION_MODEL\",\n label: \"transcription model\",\n },\n ];\n\n for (const { key, label } of settingsToCheck) {\n const value = this.runtime.getSetting(key);\n if (value && typeof value === \"string\") {\n const found = modelIds.has(value) || nameSet.has(value);\n if (!found) {\n logger.warn(\n `[CloudModelRegistry] Configured ${label} \"${value}\" not found in available models. ` +\n \"It may still work if the gateway supports it, but check your configuration.\"\n );\n }\n }\n }\n }\n\n async getAvailableModels(): Promise<AvailableModel[]> {\n if (Date.now() - this.lastFetchedAt > CACHE_TTL_MS) {\n await this.fetchModels();\n }\n return this.models;\n }\n\n async getModelsByProvider(): Promise<ModelsByProvider> {\n if (Date.now() - this.lastFetchedAt > CACHE_TTL_MS) {\n await this.fetchModels();\n }\n return this.byProvider;\n }\n}\n",
|
|
33
|
-
"
|
|
44
|
+
"/**\n * CloudBootstrapService — service-port that exposes Eliza Cloud bootstrap\n * verification endpoints to `app-core` via the runtime service registry.\n *\n * The actual JWKS fetch / cache and bootstrap-token verify path lives in\n * `app-core` (`services/cloud-jwks-store.ts` and `api/auth/bootstrap-token.ts`).\n * This service intentionally has a minimal surface: it answers questions\n * about the cloud trust anchor (issuer, JWKS URL, revocation list URL,\n * expected container id) so that `app-core` does not need to import\n * directly from `@elizaos/plugin-elizacloud`.\n *\n * Hard rule (per remote-auth-hardening-plan §3.2): no fail-open. If the\n * cloud issuer is not configured, `getExpectedIssuer()` throws and the\n * consumer must reject the bootstrap exchange — the runtime never silently\n * trusts a default URL.\n */\n\nimport { type IAgentRuntime, logger, type ProcessEnvLike, Service } from \"@elizaos/core\";\n\nexport interface CloudBootstrapService {\n /** Returns `${ELIZA_CLOUD_ISSUER}/.well-known/jwks.json`. */\n getJwksUrl(): string;\n /** Returns `${ELIZA_CLOUD_ISSUER}/.well-known/revocations.json`. */\n getRevocationListUrl(): string;\n /** Returns the configured `ELIZA_CLOUD_ISSUER`. Throws when unset. */\n getExpectedIssuer(): string;\n /** Returns the configured `ELIZA_CLOUD_CONTAINER_ID`, or `null` when unset. */\n getExpectedContainerId(): string | null;\n}\n\nfunction readEnv(): ProcessEnvLike {\n if (typeof process === \"undefined\") {\n return {};\n }\n return process.env as ProcessEnvLike;\n}\n\nfunction readSetting(runtime: IAgentRuntime | undefined, key: string): string | null {\n if (runtime && typeof runtime.getSetting === \"function\") {\n const value = runtime.getSetting(key);\n if (typeof value === \"string\" && value.length > 0) {\n return value;\n }\n }\n const fromEnv = readEnv()[key];\n if (typeof fromEnv === \"string\" && fromEnv.length > 0) {\n return fromEnv;\n }\n return null;\n}\n\nfunction trimTrailingSlash(input: string): string {\n let end = input.length;\n while (end > 0 && input.charCodeAt(end - 1) === 0x2f) {\n end -= 1;\n }\n return end === input.length ? input : input.slice(0, end);\n}\n\nexport class CloudBootstrapServiceImpl extends Service implements CloudBootstrapService {\n static serviceType = \"CLOUD_BOOTSTRAP\";\n capabilityDescription =\n \"Exposes Eliza Cloud bootstrap-token trust anchor (issuer, JWKS URL, revocation list URL, expected container id) to app-core\";\n\n static async start(runtime: IAgentRuntime): Promise<Service> {\n const service = new CloudBootstrapServiceImpl(runtime);\n const issuer = readSetting(runtime, \"ELIZA_CLOUD_ISSUER\");\n const containerId = readSetting(runtime, \"ELIZA_CLOUD_CONTAINER_ID\");\n if (issuer) {\n logger.info(\n `[CloudBootstrap] Trust anchor configured (issuer=${issuer}, containerId=${containerId ?? \"<unset>\"})`\n );\n } else {\n logger.debug(\n \"[CloudBootstrap] ELIZA_CLOUD_ISSUER unset — bootstrap-token verification will reject until configured\"\n );\n }\n return service;\n }\n\n async stop(): Promise<void> {\n // No persistent state to tear down.\n }\n\n getExpectedIssuer(): string {\n const issuer = readSetting(this.runtime, \"ELIZA_CLOUD_ISSUER\");\n if (!issuer) {\n throw new Error(\n \"ELIZA_CLOUD_ISSUER is not configured — bootstrap-token verification cannot proceed\"\n );\n }\n return trimTrailingSlash(issuer);\n }\n\n getJwksUrl(): string {\n return `${this.getExpectedIssuer()}/.well-known/jwks.json`;\n }\n\n getRevocationListUrl(): string {\n return `${this.getExpectedIssuer()}/.well-known/revocations.json`;\n }\n\n getExpectedContainerId(): string | null {\n return readSetting(this.runtime, \"ELIZA_CLOUD_CONTAINER_ID\");\n }\n}\n",
|
|
45
|
+
"/**\n * CloudBridgeService — WebSocket bridge to cloud-hosted agents.\n *\n * Establishes a JSON-RPC 2.0 WebSocket connection per container, allowing\n * the local eliza client to send messages to and receive events from\n * cloud-hosted ElizaOS agents. Handles reconnection with exponential\n * backoff and heartbeat keepalive.\n */\n\nimport { type IAgentRuntime, logger, Service } from \"@elizaos/core\";\nimport { WebSocket } from \"undici\";\nimport type {\n BridgeConnection,\n BridgeConnectionState,\n BridgeMessage,\n BridgeMessageHandler,\n} from \"../types/cloud\";\nimport { DEFAULT_CLOUD_CONFIG } from \"../types/cloud\";\nimport type { CloudAuthService } from \"./cloud-auth\";\n\ninterface ActiveConnection {\n ws: WebSocket | null;\n state: BridgeConnectionState;\n connectedAt: number | null;\n lastHeartbeat: number | null;\n reconnectAttempts: number;\n heartbeatTimer: ReturnType<typeof setInterval> | null;\n reconnectTimer: ReturnType<typeof setTimeout> | null;\n handlers: Set<BridgeMessageHandler>;\n pendingRequests: Map<\n string | number,\n {\n resolve: (value: unknown) => void;\n reject: (reason: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }\n >;\n nextRequestId: number;\n}\n\nfunction requireWebSocket(conn: ActiveConnection, containerId: string): WebSocket {\n if (!conn.ws) {\n throw new Error(`WebSocket not connected for container ${containerId}`);\n }\n return conn.ws;\n}\n\nexport class CloudBridgeService extends Service {\n static serviceType = \"CLOUD_BRIDGE\";\n capabilityDescription = \"WebSocket bridge to cloud-hosted ElizaOS agents\";\n\n private authService!: CloudAuthService;\n private readonly bridgeConfig = DEFAULT_CLOUD_CONFIG.bridge;\n private connections: Map<string, ActiveConnection> = new Map();\n\n static async start(runtime: IAgentRuntime): Promise<Service> {\n const service = new CloudBridgeService(runtime);\n await service.initialize();\n return service;\n }\n\n async stop(): Promise<void> {\n for (const [containerId] of this.connections) {\n await this.disconnect(containerId);\n }\n logger.info(\"[CloudBridge] Service stopped\");\n }\n\n private async initialize(): Promise<void> {\n const auth = this.runtime.getService(\"CLOUD_AUTH\");\n if (!auth) {\n logger.debug(\"[CloudBridge] CloudAuthService not available\");\n return;\n }\n this.authService = auth as CloudAuthService;\n logger.info(\"[CloudBridge] Service initialized\");\n }\n\n // ─── Connection Management ─────────────────────────────────────────────\n\n async connect(containerId: string): Promise<void> {\n const existing = this.connections.get(containerId);\n if (existing) {\n if (existing.state === \"connected\" || existing.state === \"connecting\") {\n logger.debug(`[CloudBridge] Already connected/connecting to ${containerId}`);\n return;\n }\n }\n\n await this.establishConnection(containerId, 0);\n }\n\n async disconnect(containerId: string): Promise<void> {\n const conn = this.connections.get(containerId);\n if (!conn) return;\n\n if (conn.heartbeatTimer) clearInterval(conn.heartbeatTimer);\n if (conn.reconnectTimer) clearTimeout(conn.reconnectTimer);\n\n // Reject all pending requests\n for (const [, pending] of conn.pendingRequests) {\n clearTimeout(pending.timeout);\n pending.reject(new Error(\"Bridge disconnected\"));\n }\n conn.pendingRequests.clear();\n\n const ws = conn.ws;\n if (ws && (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING)) {\n ws.close(1000, \"Client disconnect\");\n }\n\n this.connections.delete(containerId);\n logger.info(`[CloudBridge] Disconnected from ${containerId}`);\n }\n\n private async establishConnection(containerId: string, reconnectAttempts: number): Promise<void> {\n const client = this.authService.getClient();\n const apiKey = this.authService.getApiKey();\n const wsUrl = client.buildWsUrl(`/agent-bridge/${containerId}`);\n\n // Append API key as query parameter for WebSocket auth\n const authUrl = apiKey ? `${wsUrl}?token=${encodeURIComponent(apiKey)}` : wsUrl;\n const ws = new WebSocket(authUrl);\n\n const conn: ActiveConnection = {\n ws,\n state: \"connecting\",\n connectedAt: null,\n lastHeartbeat: null,\n reconnectAttempts,\n heartbeatTimer: null,\n reconnectTimer: null,\n handlers: this.connections.get(containerId)?.handlers ?? new Set(),\n pendingRequests: new Map(),\n nextRequestId: 1,\n };\n\n this.connections.set(containerId, conn);\n\n ws.addEventListener(\"open\", () => {\n conn.state = \"connected\";\n conn.connectedAt = Date.now();\n conn.reconnectAttempts = 0;\n logger.info(`[CloudBridge] Connected to agent ${containerId}`);\n\n // Start heartbeat\n conn.heartbeatTimer = setInterval(() => {\n this.sendHeartbeat(containerId);\n }, this.bridgeConfig.heartbeatIntervalMs);\n });\n\n ws.addEventListener(\"message\", (event) => {\n const raw = event.data;\n const data =\n typeof raw === \"string\" ? raw : raw instanceof Buffer ? raw.toString(\"utf-8\") : String(raw);\n const message = JSON.parse(data) as BridgeMessage;\n\n // Handle heartbeat responses\n if (message.method === \"heartbeat.ack\") {\n conn.lastHeartbeat = Date.now();\n return;\n }\n\n // Handle responses to pending requests\n if (message.id !== undefined && !message.method) {\n const pending = conn.pendingRequests.get(message.id);\n if (pending) {\n clearTimeout(pending.timeout);\n conn.pendingRequests.delete(message.id);\n if (message.error) {\n pending.reject(new Error(message.error.message));\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n }\n\n // Dispatch to handlers\n for (const handler of conn.handlers) {\n handler(message);\n }\n });\n\n ws.addEventListener(\"close\", (event) => {\n conn.state = \"disconnected\";\n if (conn.heartbeatTimer) clearInterval(conn.heartbeatTimer);\n\n // Don't reconnect on clean close\n if (event.code === 1000) {\n logger.info(`[CloudBridge] Clean disconnect from ${containerId}`);\n return;\n }\n\n logger.warn(\n `[CloudBridge] Connection lost to ${containerId} (code=${event.code}, reason=${event.reason})`\n );\n this.scheduleReconnect(containerId, conn.reconnectAttempts + 1);\n });\n\n ws.addEventListener(\"error\", () => {\n logger.error(`[CloudBridge] WebSocket error for ${containerId}`);\n });\n }\n\n private scheduleReconnect(containerId: string, attempt: number): void {\n if (attempt > this.bridgeConfig.maxReconnectAttempts) {\n logger.error(\n `[CloudBridge] Max reconnect attempts (${this.bridgeConfig.maxReconnectAttempts}) reached for ${containerId}`\n );\n this.connections.delete(containerId);\n return;\n }\n\n // Exponential backoff with jitter: base * 2^attempt + random jitter\n const base = this.bridgeConfig.reconnectIntervalMs;\n const delay = Math.min(base * 2 ** Math.min(attempt, 5), 120_000);\n const jitter = Math.floor(Math.random() * 1000);\n\n logger.info(\n `[CloudBridge] Reconnecting to ${containerId} in ${Math.round((delay + jitter) / 1000)}s (attempt ${attempt})`\n );\n\n const conn = this.connections.get(containerId);\n if (conn) {\n conn.state = \"reconnecting\";\n conn.reconnectTimer = setTimeout(() => {\n this.establishConnection(containerId, attempt);\n }, delay + jitter);\n }\n }\n\n private sendHeartbeat(containerId: string): void {\n const conn = this.connections.get(containerId);\n if (!conn || conn.state !== \"connected\") return;\n\n const message: BridgeMessage = {\n jsonrpc: \"2.0\",\n method: \"heartbeat\",\n params: { timestamp: Date.now() },\n };\n\n requireWebSocket(conn, containerId).send(JSON.stringify(message));\n }\n\n // ─── Messaging ─────────────────────────────────────────────────────────\n\n /**\n * Send a JSON-RPC request and wait for a response.\n */\n async sendRequest(\n containerId: string,\n method: string,\n params: Record<string, unknown>,\n timeoutMs = 60_000\n ): Promise<unknown> {\n const conn = this.connections.get(containerId);\n if (!conn || conn.state !== \"connected\") {\n throw new Error(`Not connected to container ${containerId}`);\n }\n\n const id = conn.nextRequestId++;\n const message: BridgeMessage = {\n jsonrpc: \"2.0\",\n id,\n method,\n params,\n };\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n conn.pendingRequests.delete(id);\n reject(new Error(`Request ${method} timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n conn.pendingRequests.set(id, { resolve, reject, timeout });\n requireWebSocket(conn, containerId).send(JSON.stringify(message));\n });\n }\n\n /**\n * Send a one-way notification (no response expected).\n */\n sendNotification(containerId: string, method: string, params: Record<string, unknown>): void {\n const conn = this.connections.get(containerId);\n if (!conn || conn.state !== \"connected\") {\n throw new Error(`Not connected to container ${containerId}`);\n }\n\n const message: BridgeMessage = {\n jsonrpc: \"2.0\",\n method,\n params,\n };\n\n requireWebSocket(conn, containerId).send(JSON.stringify(message));\n }\n\n /**\n * Send a chat message to the cloud agent and get the response.\n */\n async sendChatMessage(\n containerId: string,\n text: string,\n roomId?: string,\n metadata?: Record<string, unknown>\n ): Promise<{ text: string; metadata?: Record<string, unknown> }> {\n const result = await this.sendRequest(containerId, \"message.send\", {\n text,\n roomId,\n metadata,\n });\n return result as { text: string; metadata?: Record<string, unknown> };\n }\n\n /**\n * Request the cloud agent's current status.\n */\n async getAgentStatus(containerId: string): Promise<Record<string, unknown>> {\n const result = await this.sendRequest(containerId, \"status.get\", {});\n return result as Record<string, unknown>;\n }\n\n /**\n * Update the cloud agent's configuration.\n */\n async updateAgentConfig(containerId: string, config: Record<string, unknown>): Promise<void> {\n await this.sendRequest(containerId, \"config.update\", config);\n }\n\n // ─── Event Handlers ────────────────────────────────────────────────────\n\n onMessage(containerId: string, handler: BridgeMessageHandler): () => void {\n let conn = this.connections.get(containerId);\n if (!conn) {\n // Pre-register handler before connection is established\n conn = {\n ws: null,\n state: \"disconnected\",\n connectedAt: null,\n lastHeartbeat: null,\n reconnectAttempts: 0,\n heartbeatTimer: null,\n reconnectTimer: null,\n handlers: new Set(),\n pendingRequests: new Map(),\n nextRequestId: 1,\n };\n this.connections.set(containerId, conn);\n }\n\n conn.handlers.add(handler);\n\n // Return unsubscribe function\n return () => {\n conn.handlers.delete(handler);\n };\n }\n\n // ─── Accessors ─────────────────────────────────────────────────────────\n\n getConnectionState(containerId: string): BridgeConnectionState {\n return this.connections.get(containerId)?.state ?? \"disconnected\";\n }\n\n getConnectionInfo(containerId: string): BridgeConnection | null {\n const conn = this.connections.get(containerId);\n if (!conn) return null;\n\n return {\n containerId,\n state: conn.state,\n connectedAt: conn.connectedAt,\n lastHeartbeat: conn.lastHeartbeat,\n reconnectAttempts: conn.reconnectAttempts,\n };\n }\n\n getConnectedContainerIds(): string[] {\n const ids: string[] = [];\n for (const [id, conn] of this.connections) {\n if (conn.state === \"connected\") ids.push(id);\n }\n return ids;\n }\n}\n",
|
|
46
|
+
"/**\n * CloudContainerService — Manages container lifecycle through ElizaCloud API.\n *\n * Handles creation, listing, status polling, health monitoring, and deletion\n * of ECS-backed containers. Deployments are async (CloudFormation takes 8-12\n * minutes), so `waitForDeployment` polls with exponential backoff.\n */\n\nimport { type IAgentRuntime, logger, Service } from \"@elizaos/core\";\nimport type {\n CloudContainer,\n ContainerDeleteResponse,\n ContainerGetResponse,\n ContainerHealthResponse,\n ContainerListResponse,\n CreateContainerRequest,\n CreateContainerResponse,\n PromoteVfsToCloudContainerRequest,\n PromoteVfsToCloudContainerResponse,\n RequestCodingAgentContainerRequest,\n RequestCodingAgentContainerResponse,\n SyncCloudCodingContainerRequest,\n SyncCloudCodingContainerResponse,\n} from \"../types/cloud\";\nimport { DEFAULT_CLOUD_CONFIG } from \"../types/cloud\";\nimport type { CloudApiClient } from \"../utils/cloud-api\";\nimport type { CloudAuthService } from \"./cloud-auth\";\n\n/** Active containers tracked locally for quick access. */\ninterface TrackedContainer {\n container: CloudContainer;\n pollingTimer: ReturnType<typeof setTimeout> | null;\n healthTimer: ReturnType<typeof setInterval> | null;\n}\n\nexport class CloudContainerService extends Service {\n static serviceType = \"CLOUD_CONTAINER\";\n capabilityDescription = \"ElizaCloud container provisioning and lifecycle management\";\n\n private authService!: CloudAuthService;\n private readonly containerDefaults = DEFAULT_CLOUD_CONFIG.container;\n private tracked: Map<string, TrackedContainer> = new Map();\n\n static async start(runtime: IAgentRuntime): Promise<Service> {\n const service = new CloudContainerService(runtime);\n await service.initialize();\n return service;\n }\n\n async stop(): Promise<void> {\n for (const [, tracked] of this.tracked) {\n if (tracked.pollingTimer) clearTimeout(tracked.pollingTimer);\n if (tracked.healthTimer) clearInterval(tracked.healthTimer);\n }\n this.tracked.clear();\n }\n\n private async initialize(): Promise<void> {\n // Get auth service reference\n const auth = this.runtime.getService(\"CLOUD_AUTH\");\n if (!auth) {\n logger.debug(\n \"[CloudContainer] CloudAuthService not available, container operations will fail\"\n );\n return;\n }\n this.authService = auth as CloudAuthService;\n\n // Load existing containers\n if (this.authService.isAuthenticated()) {\n const containers = await this.listContainers();\n for (const container of containers) {\n this.tracked.set(container.id, {\n container,\n pollingTimer: null,\n healthTimer: null,\n });\n\n // Resume polling for containers that are still deploying\n if (\n container.status === \"pending\" ||\n container.status === \"building\" ||\n container.status === \"deploying\"\n ) {\n this.startPolling(container.id);\n }\n\n // Start health monitoring for running containers\n if (container.status === \"running\") {\n this.startHealthMonitoring(container.id);\n }\n }\n logger.info(`[CloudContainer] Loaded ${containers.length} existing container(s)`);\n }\n }\n\n private getClient(): CloudApiClient {\n return this.authService.getClient();\n }\n\n // ─── CRUD ───────────────────────────────────────────────────────────────\n\n async createContainer(request: CreateContainerRequest): Promise<CreateContainerResponse> {\n const client = this.getClient();\n const defaults = this.containerDefaults;\n\n const payload: Record<string, unknown> = {\n name: request.name,\n project_name: request.project_name,\n description: request.description,\n port: request.port ?? defaults.defaultPort,\n desired_count: request.desired_count ?? 1,\n cpu: request.cpu ?? defaults.defaultCpu,\n memory: request.memory ?? defaults.defaultMemory,\n environment_vars: request.environment_vars ?? {},\n health_check_path: request.health_check_path ?? \"/health\",\n ecr_image_uri: request.ecr_image_uri,\n ecr_repository_uri: request.ecr_repository_uri,\n image_tag: request.image_tag,\n architecture: request.architecture ?? defaults.defaultArchitecture,\n };\n\n const response = await client.post<CreateContainerResponse>(\"/containers\", payload);\n\n // Track the new container\n this.tracked.set(response.data.id, {\n container: response.data,\n pollingTimer: null,\n healthTimer: null,\n });\n\n // Start polling for deployment completion\n this.startPolling(response.data.id);\n\n logger.info(\n `[CloudContainer] Created container \"${request.name}\" (id=${response.data.id}, stack=${response.stackName})`\n );\n\n return response;\n }\n\n async listContainers(): Promise<CloudContainer[]> {\n const client = this.getClient();\n const response = await client.get<ContainerListResponse>(\"/containers\");\n return response.data;\n }\n\n async getContainer(containerId: string): Promise<CloudContainer> {\n const client = this.getClient();\n const response = await client.get<ContainerGetResponse>(`/containers/${containerId}`);\n\n // Update local tracking\n const existing = this.tracked.get(containerId);\n if (existing) {\n existing.container = response.data;\n }\n\n return response.data;\n }\n\n async deleteContainer(containerId: string): Promise<void> {\n const client = this.getClient();\n await client.delete<ContainerDeleteResponse>(`/containers/${containerId}`);\n\n // Stop tracking\n const tracked = this.tracked.get(containerId);\n if (tracked) {\n if (tracked.pollingTimer) clearTimeout(tracked.pollingTimer);\n if (tracked.healthTimer) clearInterval(tracked.healthTimer);\n this.tracked.delete(containerId);\n }\n\n logger.info(`[CloudContainer] Deleted container ${containerId}`);\n }\n\n // ─── Deployment Polling ────────────────────────────────────────────────\n\n /**\n * Poll container status until it reaches a terminal state (running, failed, stopped).\n * Uses exponential backoff: 5s, 10s, 20s, 30s, 30s, ...\n */\n private startPolling(containerId: string): void {\n const tracked = this.tracked.get(containerId);\n if (!tracked) return;\n\n let attempt = 0;\n const maxAttempts = 120; // ~1 hour with backoff\n const baseInterval = 5_000;\n const maxInterval = 30_000;\n\n const poll = async () => {\n attempt++;\n if (attempt > maxAttempts) {\n logger.error(\n `[CloudContainer] Polling timed out for container ${containerId} after ${maxAttempts} attempts`\n );\n return;\n }\n\n const container = await this.getContainer(containerId);\n const status = container.status;\n\n logger.debug(`[CloudContainer] Poll #${attempt} for ${containerId}: status=${status}`);\n\n if (status === \"running\") {\n logger.info(\n `[CloudContainer] Container ${containerId} is now running at ${container.load_balancer_url}`\n );\n this.startHealthMonitoring(containerId);\n return;\n }\n\n if (status === \"failed\" || status === \"stopped\" || status === \"suspended\") {\n logger.warn(`[CloudContainer] Container ${containerId} reached terminal state: ${status}`);\n if (container.error_message) {\n logger.error(`[CloudContainer] Error: ${container.error_message}`);\n }\n return;\n }\n\n // Schedule next poll with exponential backoff\n const delay = Math.min(baseInterval * 2 ** Math.min(attempt - 1, 3), maxInterval);\n tracked.pollingTimer = setTimeout(poll, delay);\n };\n\n tracked.pollingTimer = setTimeout(poll, baseInterval);\n }\n\n /**\n * Wait for a container to reach \"running\" status. Returns the updated container.\n * This is the synchronous API for actions that need to block.\n */\n async waitForDeployment(containerId: string, timeoutMs = 900_000): Promise<CloudContainer> {\n const deadline = Date.now() + timeoutMs;\n let interval = 5_000;\n const maxInterval = 30_000;\n\n while (Date.now() < deadline) {\n const container = await this.getContainer(containerId);\n\n if (container.status === \"running\") return container;\n if (container.status === \"failed\") {\n throw new Error(\n `Container deployment failed: ${container.error_message ?? \"unknown error\"}`\n );\n }\n if (container.status === \"stopped\" || container.status === \"suspended\") {\n throw new Error(`Container reached terminal state: ${container.status}`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, interval));\n interval = Math.min(interval * 1.5, maxInterval);\n }\n\n throw new Error(`Container deployment timed out after ${Math.round(timeoutMs / 1000)}s`);\n }\n\n // ─── Health Monitoring ─────────────────────────────────────────────────\n\n private startHealthMonitoring(containerId: string): void {\n const tracked = this.tracked.get(containerId);\n if (!tracked || tracked.healthTimer) return;\n\n const interval = 60_000; // Check every 60 seconds\n\n tracked.healthTimer = setInterval(() => {\n this.getContainerHealth(containerId)\n .then((health) => {\n if (!health.data.healthy) {\n logger.warn(\n `[CloudContainer] Container ${containerId} unhealthy: ${health.data.status}`\n );\n }\n })\n .catch((err: Error) => {\n logger.error(`[CloudContainer] Health check failed for ${containerId}: ${err.message}`);\n });\n }, interval);\n }\n\n async getContainerHealth(containerId: string): Promise<ContainerHealthResponse> {\n const client = this.getClient();\n return client.get<ContainerHealthResponse>(`/containers/${containerId}/health`);\n }\n\n // ─── Coding Containers / VFS Promotion ────────────────────────────────\n\n async promoteVfsToCloudContainer(\n request: PromoteVfsToCloudContainerRequest,\n ): Promise<PromoteVfsToCloudContainerResponse> {\n if (!this.isAuthenticated()) {\n throw cloudCodingUnavailable(\"Cloud auth is not connected\");\n }\n\n try {\n return await this.getClient().post<PromoteVfsToCloudContainerResponse>(\n \"/coding-containers/promotions\",\n request,\n );\n } catch (error) {\n if (isMissingCloudCodingEndpoint(error)) {\n throw cloudCodingUnavailable(\n \"Eliza Cloud coding-container promotion endpoint is not deployed yet\",\n );\n }\n throw error;\n }\n }\n\n async requestCodingAgentContainer(\n request: RequestCodingAgentContainerRequest,\n ): Promise<RequestCodingAgentContainerResponse> {\n if (!this.isAuthenticated()) {\n throw cloudCodingUnavailable(\"Cloud auth is not connected\");\n }\n\n try {\n return await this.getClient().post<RequestCodingAgentContainerResponse>(\n \"/coding-containers\",\n request,\n );\n } catch (error) {\n if (isMissingCloudCodingEndpoint(error)) {\n throw cloudCodingUnavailable(\n \"Eliza Cloud coding-container endpoint is not deployed yet\",\n );\n }\n throw error;\n }\n }\n\n async syncCodingContainerChanges(\n containerId: string,\n request: SyncCloudCodingContainerRequest,\n ): Promise<SyncCloudCodingContainerResponse> {\n if (!this.isAuthenticated()) {\n throw cloudCodingUnavailable(\"Cloud auth is not connected\");\n }\n\n try {\n return await this.getClient().post<SyncCloudCodingContainerResponse>(\n `/coding-containers/${encodeURIComponent(containerId)}/sync`,\n request,\n );\n } catch (error) {\n if (isMissingCloudCodingEndpoint(error)) {\n throw cloudCodingUnavailable(\n \"Eliza Cloud coding-container sync endpoint is not deployed yet\",\n );\n }\n throw error;\n }\n }\n\n // ─── Accessors ─────────────────────────────────────────────────────────\n\n getTrackedContainers(): CloudContainer[] {\n return Array.from(this.tracked.values()).map((t) => t.container);\n }\n\n getTrackedContainer(containerId: string): CloudContainer | undefined {\n return this.tracked.get(containerId)?.container;\n }\n\n isContainerRunning(containerId: string): boolean {\n return this.tracked.get(containerId)?.container.status === \"running\";\n }\n\n getContainerUrl(containerId: string): string | null {\n return this.tracked.get(containerId)?.container.load_balancer_url ?? null;\n }\n\n private isAuthenticated(): boolean {\n return this.authService?.isAuthenticated?.() === true;\n }\n}\n\nfunction isMissingCloudCodingEndpoint(error: unknown): boolean {\n const statusCode =\n typeof (error as { statusCode?: unknown })?.statusCode === \"number\"\n ? (error as { statusCode: number }).statusCode\n : undefined;\n return statusCode === 404 || statusCode === 501;\n}\n\nfunction cloudCodingUnavailable(message: string): Error & { statusCode: number } {\n const error = new Error(message) as Error & { statusCode: number };\n error.statusCode = 503;\n return error;\n}\n",
|
|
47
|
+
"/**\n * CloudCredentialProvider — bridges plugin-workflow's `CredentialProvider`\n * service slot to Eliza Cloud's per-connector OAuth surface.\n *\n * Resolution path on `resolve(userId, credType)`:\n * 1. Look up `credType` in `credTypeToConnector` — return `null` for unmapped.\n * 2. GET `/eliza/<connector>/status` via the authenticated cloud client to\n * check whether the user already has an active connection.\n * 3. When connected → see `RAW_TOKEN_GAP` below; we currently return\n * `needs_auth` because the cloud does not expose raw OAuth tokens.\n * 4. When not connected → POST `/eliza/<connector>/connect/initiate` with\n * the mapped `capabilities`; return `needs_auth` with the authUrl the\n * cloud issued. The workflow plugin surfaces this to the user.\n *\n * RAW_TOKEN_GAP\n * -------------\n * Plugin-workflow's `credential_data` shape requires the actual access token\n * (so the workflow engine can inject it into a node's HTTP calls). The cloud\n * connector endpoints (Google / GitHub / Discord) intentionally do **not**\n * vend raw tokens to the local plugin — they hold the token server-side and\n * proxy connector calls under `/eliza/<connector>/<action>` (e.g.\n * `/eliza/google/gmail/send`). Bridging that proxy model into the workflow\n * engine is a separate piece of work (either: extend the workflow engine to\n * dispatch through cloud proxies, or add a token-vending endpoint cloud-side\n * for clients with a verified pairing). Until then this provider is honest:\n * it confirms the connection exists and either reports it cannot inject\n * (`null` / `needs_auth`) or — once the cloud exposes a vending endpoint —\n * fetches and returns the credential payload.\n *\n * No fallbacks. No fake tokens. The provider fails closed.\n */\n\nimport { type IAgentRuntime, logger, Service } from \"@elizaos/core\";\nimport { credTypeToConnector, supportedCredTypes } from \"../lib/credential-type-map\";\nimport type { CloudAuthLike } from \"../lib/cloud-connection\";\n\n// Inlined to avoid a hard compile-time dep on @elizaos/plugin-workflow.\n// The runtime duck-types the service via the shared service-type string.\nconst WORKFLOW_CREDENTIAL_PROVIDER_TYPE = \"workflow_credential_provider\";\n\nexport type CredentialProviderResult =\n | { status: \"credential_data\"; data: Record<string, unknown> }\n | { status: \"needs_auth\"; authUrl: string }\n | null;\n\nexport interface CheckCredentialTypesResult {\n supported: string[];\n unsupported: string[];\n}\n\ninterface CloudConnectorStatus {\n connected: boolean;\n reason?: string;\n authUrl?: string;\n}\n\ninterface CloudConnectInitiateResponse {\n authUrl?: string;\n}\n\ninterface CloudClientLike {\n get?: (path: string) => Promise<unknown>;\n post?: (path: string, body?: unknown) => Promise<unknown>;\n}\n\nfunction isCloudAuthLike(value: unknown): value is CloudAuthLike {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n return typeof Reflect.get(value, \"getClient\") === \"function\";\n}\n\nfunction isCloudClientLike(value: unknown): value is CloudClientLike {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n const get = Reflect.get(value, \"get\");\n const post = Reflect.get(value, \"post\");\n return (\n (get === undefined || typeof get === \"function\") &&\n (post === undefined || typeof post === \"function\")\n );\n}\n\nexport class CloudCredentialProvider extends Service {\n static override readonly serviceType = WORKFLOW_CREDENTIAL_PROVIDER_TYPE;\n\n override capabilityDescription =\n \"Resolves workflow node credentials via the user's paired Eliza Cloud account.\";\n\n static async start(runtime: IAgentRuntime): Promise<CloudCredentialProvider> {\n return new CloudCredentialProvider(runtime);\n }\n\n override async stop(): Promise<void> {\n // Holds no per-instance state.\n }\n\n async resolve(_userId: string, credType: string): Promise<CredentialProviderResult> {\n const mapping = credTypeToConnector.get(credType);\n if (!mapping) {\n return null;\n }\n\n const client = this.getCloudClient();\n if (!client) {\n logger.debug(\n { src: \"plugin:elizacloud:credential-provider\", credType },\n \"CLOUD_AUTH unavailable — cannot resolve workflow credentials\",\n );\n return null;\n }\n\n const status = await this.fetchConnectorStatus(client, mapping.connector);\n\n if (!status.connected) {\n const authUrl =\n status.authUrl ??\n (await this.initiateConnectorAuth(client, mapping.connector, mapping.capabilities));\n if (!authUrl) {\n return null;\n }\n return { status: \"needs_auth\", authUrl };\n }\n\n // Connected, but the cloud does not expose raw tokens — see RAW_TOKEN_GAP\n // in the file header. We re-prompt for explicit user-side auth so the\n // workflow plugin reports \"missing connection\" instead of silently\n // injecting a stale or empty credential. When the cloud adds a token\n // vending endpoint, fetch + return `credential_data` here.\n const reauthUrl = await this.initiateConnectorAuth(\n client,\n mapping.connector,\n mapping.capabilities,\n );\n if (reauthUrl) {\n return { status: \"needs_auth\", authUrl: reauthUrl };\n }\n return null;\n }\n\n checkCredentialTypes(credTypes: string[]): CheckCredentialTypesResult {\n const supported: string[] = [];\n const unsupported: string[] = [];\n for (const t of credTypes) {\n if (supportedCredTypes.has(t)) {\n supported.push(t);\n } else {\n unsupported.push(t);\n }\n }\n return { supported, unsupported };\n }\n\n // ─── internals ───────────────────────────────────────────────────────\n\n private getCloudClient(): CloudClientLike | null {\n const cloudAuth = this.runtime.getService(\"CLOUD_AUTH\");\n if (!isCloudAuthLike(cloudAuth)) {\n return null;\n }\n const client = cloudAuth.getClient?.();\n if (!isCloudClientLike(client)) {\n return null;\n }\n return client;\n }\n\n private async fetchConnectorStatus(\n client: CloudClientLike,\n connector: string,\n ): Promise<CloudConnectorStatus> {\n if (typeof client.get !== \"function\") {\n return { connected: false };\n }\n const raw = await client.get(`/eliza/${connector}/status`);\n return shapeConnectorStatus(raw);\n }\n\n private async initiateConnectorAuth(\n client: CloudClientLike,\n connector: string,\n capabilities: readonly string[] | undefined,\n ): Promise<string | null> {\n if (typeof client.post !== \"function\") {\n return null;\n }\n const body: Record<string, unknown> = {};\n if (capabilities && capabilities.length > 0) {\n body.capabilities = [...capabilities];\n }\n const raw = (await client.post(\n `/eliza/${connector}/connect/initiate`,\n body,\n )) as CloudConnectInitiateResponse | null;\n const authUrl = raw?.authUrl;\n return typeof authUrl === \"string\" && authUrl.length > 0 ? authUrl : null;\n }\n}\n\nfunction shapeConnectorStatus(raw: unknown): CloudConnectorStatus {\n if (!raw || typeof raw !== \"object\") {\n return { connected: false };\n }\n const obj = raw as Record<string, unknown>;\n const connected = obj.connected === true;\n const reason = typeof obj.reason === \"string\" ? obj.reason : undefined;\n const authUrl = typeof obj.authUrl === \"string\" ? obj.authUrl : undefined;\n return { connected, reason, authUrl };\n}\n",
|
|
48
|
+
"/**\n * Mapping from workflow-plugin credential type names → Eliza Cloud connector slugs.\n *\n * The workflow plugin's LLM emits credential type strings (e.g. `gmailOAuth2`,\n * `slackOAuth2Api`) on each node that needs an external account. The cloud\n * exposes per-connector OAuth flows under `/api/v1/eliza/<connector>/...`.\n *\n * This map is the single source of truth for which workflow credential type\n * resolves through which cloud connector + with which OAuth scopes. Add new\n * entries when the cloud gains support for additional connectors; do not\n * scatter cred-type → connector logic elsewhere.\n *\n * Cloud-side endpoint convention (see packages/cloud-api/v1/eliza/<connector>/):\n * POST /api/v1/eliza/<connector>/connect/initiate → { authUrl }\n * GET /api/v1/eliza/<connector>/status → { connected, ... }\n *\n * Not every connector below has a fully-implemented cloud endpoint yet — the\n * provider returns `null` for unmapped types and `needs_auth` (with the\n * cloud-issued OAuth URL) for mapped-but-not-connected accounts. See\n * `cloud-credential-provider.ts` for the resolution logic.\n */\n\nexport interface CredentialTypeMapping {\n /**\n * Cloud connector slug used in the URL path\n * (`/api/v1/eliza/<connector>/connect/initiate`).\n */\n connector: string;\n /**\n * Optional capability tokens passed to the cloud's `connect/initiate`\n * endpoint. The cloud translates these to provider-specific OAuth scopes\n * (e.g. Google's `google.gmail.send` → `https://www.googleapis.com/auth/gmail.send`).\n */\n capabilities?: string[];\n /**\n * Friendly description used in `needs_auth` UI prompts. The runtime may\n * surface this verbatim to the end-user.\n */\n friendlyName: string;\n}\n\n/**\n * Workflow credential type → cloud connector mapping.\n *\n * Names mirror the n8n / workflows-plugin convention used by the LLM in\n * `plugins/plugin-workflow/src/utils/workflow-prompts/workflowGeneration.ts`.\n * Both `gmailOAuth2` and `gmailOAuth2Api` map to the same connector — the\n * workflow resolver does fuzzy `Api`-suffix matching upstream, but we keep\n * both keys here so `checkCredentialTypes` answers truthfully without the\n * caller having to know about that fuzziness.\n */\nexport const credTypeToConnector: ReadonlyMap<string, CredentialTypeMapping> = new Map([\n // ─── Google ──────────────────────────────────────────────────────────\n // Cloud endpoint: /api/v1/eliza/google/{connect/initiate,status,disconnect}\n // The cloud's capability tokens are documented in\n // packages/cloud-api/v1/eliza/google/connect/initiate/route.ts.\n [\n \"gmailOAuth2\",\n {\n connector: \"google\",\n capabilities: [\"google.gmail.triage\", \"google.gmail.send\", \"google.gmail.manage\"],\n friendlyName: \"Gmail\",\n },\n ],\n [\n \"gmailOAuth2Api\",\n {\n connector: \"google\",\n capabilities: [\"google.gmail.triage\", \"google.gmail.send\", \"google.gmail.manage\"],\n friendlyName: \"Gmail\",\n },\n ],\n [\n \"googleCalendarOAuth2Api\",\n {\n connector: \"google\",\n capabilities: [\"google.calendar.read\", \"google.calendar.write\"],\n friendlyName: \"Google Calendar\",\n },\n ],\n [\n \"googleSheetsOAuth2Api\",\n {\n connector: \"google\",\n capabilities: [\"google.basic_identity\"],\n friendlyName: \"Google Sheets\",\n },\n ],\n\n // ─── GitHub ──────────────────────────────────────────────────────────\n // Cloud endpoint: /api/v1/eliza/github-oauth-complete/ (callback only).\n // The initiate flow is host-driven; the provider returns `needs_auth`\n // pointing at the cloud's GitHub install URL when not connected.\n [\n \"githubOAuth2Api\",\n {\n connector: \"github\",\n friendlyName: \"GitHub\",\n },\n ],\n [\n \"githubApi\",\n {\n connector: \"github\",\n friendlyName: \"GitHub\",\n },\n ],\n\n // ─── Discord ─────────────────────────────────────────────────────────\n // Cloud endpoint: /api/v1/eliza/discord/gateway-agent/ (gateway pairing).\n // No OAuth-token-issuance flow yet — provider returns `null` so the\n // workflow resolver falls back to its default missing-connection report.\n [\n \"discordApi\",\n {\n connector: \"discord\",\n friendlyName: \"Discord\",\n },\n ],\n [\n \"discordBotApi\",\n {\n connector: \"discord\",\n friendlyName: \"Discord (Bot)\",\n },\n ],\n]);\n\n/** Set used by `checkCredentialTypes` for O(1) supported-set membership. */\nexport const supportedCredTypes: ReadonlySet<string> = new Set(credTypeToConnector.keys());\n",
|
|
49
|
+
"import {\n ChannelType,\n type Content,\n ContentType,\n createMessageMemory,\n createUniqueUuid,\n type HandlerCallback,\n type IAgentRuntime,\n type JsonValue,\n logger,\n type Memory,\n Service,\n type UUID,\n} from \"@elizaos/core\";\nimport type {\n GatewayRelayRequest,\n GatewayRelayRequestEnvelope,\n GatewayRelayResponse,\n PollGatewayRelayResponse,\n RegisterGatewayRelaySessionResponse,\n} from \"../types/cloud\";\nimport type { CloudAuthService } from \"./cloud-auth\";\n\nconst POLL_TIMEOUT_MS = 25_000;\nconst REQUEST_TIMEOUT_MS = POLL_TIMEOUT_MS + 5_000;\nconst RETRY_DELAY_MS = 2_000;\nconst IDLE_DELAY_MS = 250;\n\ntype RelayRequestMethod = \"GET\" | \"POST\" | \"DELETE\";\ntype RelayRuntimeStatus = \"idle\" | \"registered\" | \"polling\" | \"error\" | \"stopped\";\n\ninterface RelayRequestJsonOptions {\n method: RelayRequestMethod;\n json?: unknown;\n query?: Record<string, string | number | boolean>;\n timeoutMs?: number;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isUuidLike(value: string): value is UUID {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);\n}\n\nfunction asTrimmedString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction resolveChannelType(value: unknown): ChannelType {\n const candidate = asTrimmedString(value)?.toUpperCase();\n return candidate && candidate in ChannelType\n ? ChannelType[candidate as keyof typeof ChannelType]\n : ChannelType.DM;\n}\n\nfunction isCloudProvisionedRuntime(): boolean {\n if (typeof process === \"undefined\") {\n return false;\n }\n return process.env.ELIZA_CLOUD_PROVISIONED === \"1\";\n}\n\nfunction isNodeHost(): boolean {\n return typeof process !== \"undefined\" && typeof process.versions?.node === \"string\";\n}\n\nfunction normalizeAttachments(value: unknown): Content[\"attachments\"] | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n\n const attachments = value\n .map((entry, index) => {\n if (!isRecord(entry)) {\n return null;\n }\n\n const url = asTrimmedString(entry.url);\n if (!url) {\n return null;\n }\n\n const type = asTrimmedString(entry.type)?.toLowerCase();\n return {\n id: asTrimmedString(entry.id) ?? `${index}:${url}`,\n url,\n source: asTrimmedString(entry.source),\n title: asTrimmedString(entry.title),\n description: asTrimmedString(entry.description),\n text: asTrimmedString(entry.text),\n contentType:\n type === \"image\"\n ? ContentType.IMAGE\n : type === \"video\"\n ? ContentType.VIDEO\n : type === \"audio\"\n ? ContentType.AUDIO\n : type === \"document\"\n ? ContentType.DOCUMENT\n : undefined,\n };\n })\n .filter((entry): entry is NonNullable<typeof entry> => entry !== null);\n\n return attachments.length > 0 ? attachments : undefined;\n}\n\nfunction toJsonRecord(value: unknown): Record<string, unknown> | undefined {\n return isRecord(value) ? value : undefined;\n}\n\nfunction toJsonMetadataRecord(value: unknown): Record<string, JsonValue> | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n\n return JSON.parse(JSON.stringify(value)) as Record<string, JsonValue>;\n}\n\ntype GatewayMessagePayload = {\n text: string;\n roomKey: string;\n channelType: ChannelType;\n source: string;\n senderId: string;\n senderUserName: string;\n senderName: string;\n attachments?: Content[\"attachments\"];\n senderMetadata?: Record<string, unknown>;\n transportMetadata?: Record<string, unknown>;\n};\n\nfunction buildGatewayMessagePayload(\n runtime: IAgentRuntime,\n rpc: GatewayRelayRequest\n): GatewayMessagePayload | null {\n const params = toJsonRecord(rpc.params);\n const sender = toJsonRecord(params?.sender);\n\n const source = asTrimmedString(params?.source) ?? \"eliza_cloud_gateway\";\n const text = typeof params?.text === \"string\" ? params.text : \"\";\n const senderId = asTrimmedString(sender?.id) ?? `${source}:anonymous`;\n const senderUserName = asTrimmedString(sender?.username) ?? senderId;\n const senderName =\n asTrimmedString(sender?.displayName) ?? asTrimmedString(sender?.name) ?? senderUserName;\n const roomKey =\n asTrimmedString(params?.roomId) ??\n `${source}:${senderId}:${String(rpc.id ?? Date.now())}:${runtime.agentId}`;\n\n if (!text.trim() && !normalizeAttachments(params?.attachments)?.length) {\n return null;\n }\n\n return {\n text: text.trim() || \" \",\n roomKey,\n channelType: resolveChannelType(params?.channelType),\n source,\n senderId,\n senderUserName,\n senderName,\n attachments: normalizeAttachments(params?.attachments),\n senderMetadata: toJsonRecord(sender?.metadata),\n transportMetadata: toJsonRecord(params?.metadata),\n };\n}\n\nfunction buildWorldKey(\n source: string,\n metadata: Record<string, unknown> | undefined,\n roomKey: string\n): string {\n const discord = toJsonRecord(metadata?.discord);\n const guildId = asTrimmedString(discord?.guildId);\n if (guildId) {\n return `gateway:${source}:guild:${guildId}`;\n }\n\n const threadId = asTrimmedString(metadata?.threadId);\n if (threadId) {\n return `gateway:${source}:thread:${threadId}`;\n }\n\n return `gateway:${source}:room:${roomKey}`;\n}\n\nclass SessionMissingError extends Error {\n constructor() {\n super(\"Gateway relay session missing\");\n this.name = \"SessionMissingError\";\n }\n}\n\nexport class CloudManagedGatewayRelayService extends Service {\n static serviceType = \"CLOUD_MANAGED_GATEWAY_RELAY\";\n capabilityDescription =\n \"Registers a local Eliza runtime with the cloud managed gateway and handles inbound relay traffic\";\n\n private authService: CloudAuthService | null = null;\n private loopPromise: Promise<void> | null = null;\n private currentSessionId: string | null = null;\n private stopping = false;\n private activeAbortController: AbortController | null = null;\n private relayStatus: RelayRuntimeStatus = \"idle\";\n private lastSeenAt: string | null = null;\n\n static async start(runtime: IAgentRuntime): Promise<Service> {\n const service = new CloudManagedGatewayRelayService(runtime);\n await service.initialize();\n return service;\n }\n\n async stop(): Promise<void> {\n this.stopping = true;\n this.relayStatus = \"stopped\";\n this.activeAbortController?.abort();\n\n if (this.loopPromise) {\n await this.loopPromise.catch((error) => {\n logger.debug(\n `[CloudManagedGatewayRelay] Ignoring relay loop shutdown error: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n });\n }\n\n const sessionId = this.currentSessionId;\n this.currentSessionId = null;\n if (sessionId) {\n await this.disconnectSession(sessionId);\n }\n }\n\n private async initialize(): Promise<void> {\n if (!isNodeHost()) {\n logger.debug(\"[CloudManagedGatewayRelay] Skipping gateway relay outside Node.js runtime\");\n this.relayStatus = \"stopped\";\n return;\n }\n\n if (isCloudProvisionedRuntime()) {\n logger.debug(\n \"[CloudManagedGatewayRelay] Skipping local relay inside provisioned cloud runtime\"\n );\n this.relayStatus = \"stopped\";\n return;\n }\n\n if (!this.runtime.messageService) {\n logger.debug(\"[CloudManagedGatewayRelay] Skipping gateway relay without message service\");\n this.relayStatus = \"idle\";\n return;\n }\n\n const auth = this.runtime.getService(\"CLOUD_AUTH\");\n if (!auth) {\n logger.debug(\"[CloudManagedGatewayRelay] CloudAuthService not available\");\n this.relayStatus = \"idle\";\n return;\n }\n\n this.authService = auth as CloudAuthService;\n if (!this.authService.isAuthenticated()) {\n logger.debug(\n \"[CloudManagedGatewayRelay] Skipping gateway relay while cloud auth is inactive\"\n );\n this.relayStatus = \"idle\";\n return;\n }\n\n this.startRelayLoopIfReady();\n }\n\n getSessionInfo(): {\n sessionId: string | null;\n organizationId: string | null;\n userId: string | null;\n agentName: string | null;\n platform: string | null;\n lastSeenAt: string | null;\n status: RelayRuntimeStatus;\n } {\n const auth = this.authService;\n const status =\n this.stopping || this.relayStatus === \"stopped\"\n ? \"stopped\"\n : auth?.isAuthenticated() === false\n ? \"idle\"\n : this.relayStatus;\n\n return {\n sessionId: this.currentSessionId,\n organizationId: auth?.getOrganizationId() ?? null,\n userId: auth?.getUserId() ?? null,\n agentName: this.getAgentName(),\n platform: \"local-runtime\",\n lastSeenAt: this.lastSeenAt,\n status,\n };\n }\n\n startRelayLoopIfReady(): boolean {\n if (this.loopPromise && !this.stopping) {\n return true;\n }\n\n const auth =\n this.authService ?? (this.runtime.getService(\"CLOUD_AUTH\") as CloudAuthService | null);\n if (!auth?.isAuthenticated() || !this.runtime.messageService) {\n this.relayStatus = \"idle\";\n return false;\n }\n\n this.authService = auth;\n this.stopping = false;\n this.relayStatus = \"idle\";\n this.loopPromise = this.runLoop();\n logger.info(\"[CloudManagedGatewayRelay] Local gateway relay loop started\");\n return true;\n }\n\n private async runLoop(): Promise<void> {\n while (!this.stopping) {\n try {\n if (!this.currentSessionId) {\n this.currentSessionId = await this.registerSession();\n this.relayStatus = \"registered\";\n this.lastSeenAt = new Date().toISOString();\n continue;\n }\n\n this.relayStatus = \"polling\";\n const request = await this.pollNextRequest(this.currentSessionId);\n this.lastSeenAt = new Date().toISOString();\n if (!request) {\n this.relayStatus = \"registered\";\n await sleep(IDLE_DELAY_MS);\n continue;\n }\n\n const response = await this.handleRequest(request.rpc);\n await this.submitResponse(this.currentSessionId, request.requestId, response);\n this.relayStatus = \"registered\";\n } catch (error) {\n if (this.stopping) {\n return;\n }\n\n if (error instanceof SessionMissingError) {\n this.currentSessionId = null;\n this.relayStatus = \"idle\";\n await sleep(IDLE_DELAY_MS);\n continue;\n }\n\n this.relayStatus = \"error\";\n logger.warn(\n `[CloudManagedGatewayRelay] Relay loop error: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n await sleep(RETRY_DELAY_MS);\n }\n }\n }\n\n private getAgentName(): string {\n return this.runtime.character?.name?.trim() || \"Eliza\";\n }\n\n private getClient() {\n const client = this.authService?.getClient();\n if (!client) {\n throw new Error(\"Cloud API client is unavailable\");\n }\n return client;\n }\n\n private async requestJson<T>(\n path: string,\n options: RelayRequestJsonOptions\n ): Promise<{ status: number; body: T }> {\n const timeoutMs = options.timeoutMs ?? REQUEST_TIMEOUT_MS;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n this.activeAbortController = controller;\n\n try {\n const response = await this.getClient().requestRaw(options.method, path, {\n headers: {\n Accept: \"application/json\",\n },\n json: options.json,\n query: options.query,\n signal: controller.signal,\n });\n\n const body = (await response.json().catch(() => ({}))) as T;\n return { status: response.status, body };\n } finally {\n clearTimeout(timeoutId);\n if (this.activeAbortController === controller) {\n this.activeAbortController = null;\n }\n }\n }\n\n private async registerSession(): Promise<string> {\n const { status, body } = await this.requestJson<RegisterGatewayRelaySessionResponse>(\n \"/eliza/gateway-relay/sessions\",\n {\n method: \"POST\",\n json: {\n runtimeAgentId: this.runtime.agentId,\n agentName: this.getAgentName(),\n },\n }\n );\n\n if (status >= 400 || !body?.success || !body.data?.session?.id) {\n throw new Error(`Failed to register gateway relay session (status=${status})`);\n }\n\n logger.info(\n `[CloudManagedGatewayRelay] Registered local runtime for managed gateway (${body.data.session.id})`\n );\n return body.data.session.id;\n }\n\n private async disconnectSession(sessionId: string): Promise<void> {\n try {\n await this.requestJson<{ success?: boolean }>(\n `/eliza/gateway-relay/sessions/${encodeURIComponent(sessionId)}`,\n {\n method: \"DELETE\",\n timeoutMs: 10_000,\n }\n );\n } catch (error) {\n logger.debug(\n `[CloudManagedGatewayRelay] Failed to disconnect relay session ${sessionId}: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n private async pollNextRequest(sessionId: string): Promise<GatewayRelayRequestEnvelope | null> {\n const { status, body } = await this.requestJson<PollGatewayRelayResponse>(\n `/eliza/gateway-relay/sessions/${encodeURIComponent(sessionId)}/next`,\n {\n method: \"GET\",\n query: { timeoutMs: POLL_TIMEOUT_MS },\n timeoutMs: POLL_TIMEOUT_MS + 5_000,\n }\n );\n\n if (status === 404) {\n throw new SessionMissingError();\n }\n\n if (status >= 400 || !body?.success) {\n throw new Error(`Failed to poll gateway relay session ${sessionId} (status=${status})`);\n }\n\n return body.data?.request ?? null;\n }\n\n private async submitResponse(\n sessionId: string,\n requestId: string,\n response: GatewayRelayResponse\n ): Promise<void> {\n const { status, body } = await this.requestJson<{ success?: boolean }>(\n `/eliza/gateway-relay/sessions/${encodeURIComponent(sessionId)}/responses`,\n {\n method: \"POST\",\n json: { requestId, response },\n }\n );\n\n if (status === 404) {\n throw new SessionMissingError();\n }\n\n if (status >= 400 || body?.success === false) {\n throw new Error(`Failed to submit gateway relay response (status=${status})`);\n }\n }\n\n private async handleRequest(rpc: GatewayRelayRequest): Promise<GatewayRelayResponse> {\n switch (rpc.method) {\n case \"heartbeat\":\n return {\n jsonrpc: \"2.0\",\n id: rpc.id,\n result: { timestamp: Date.now() },\n };\n case \"status.get\":\n return {\n jsonrpc: \"2.0\",\n id: rpc.id,\n result: {\n status: \"running\",\n runtimeAgentId: this.runtime.agentId,\n agentName: this.getAgentName(),\n },\n };\n case \"message.send\":\n return this.handleMessageSend(rpc);\n default:\n return {\n jsonrpc: \"2.0\",\n id: rpc.id,\n error: {\n code: -32601,\n message: `Unsupported relay method: ${rpc.method}`,\n },\n };\n }\n }\n\n private async handleMessageSend(rpc: GatewayRelayRequest): Promise<GatewayRelayResponse> {\n if (!this.runtime.messageService) {\n return {\n jsonrpc: \"2.0\",\n id: rpc.id,\n error: { code: -32603, message: \"Message service is not available\" },\n };\n }\n\n const payload = buildGatewayMessagePayload(this.runtime, rpc);\n if (!payload) {\n return {\n jsonrpc: \"2.0\",\n id: rpc.id,\n error: { code: -32602, message: \"Invalid message relay payload\" },\n };\n }\n\n const roomId = isUuidLike(payload.roomKey)\n ? payload.roomKey\n : createUniqueUuid(this.runtime, payload.roomKey);\n const worldId = createUniqueUuid(\n this.runtime,\n buildWorldKey(payload.source, payload.transportMetadata, payload.roomKey)\n );\n const entityId = createUniqueUuid(this.runtime, `${payload.source}:${payload.senderId}`);\n const messageServerId = createUniqueUuid(this.runtime, `eliza-cloud-gateway:${payload.source}`);\n const messageId = createUniqueUuid(\n this.runtime,\n `${payload.source}:${payload.roomKey}:${String(rpc.id ?? Date.now())}:inbound`\n );\n\n const transportMetadata = toJsonMetadataRecord(payload.transportMetadata);\n\n await this.runtime.ensureConnection({\n entityId,\n roomId,\n roomName: payload.roomKey,\n worldId,\n worldName: payload.source,\n userName: payload.senderUserName,\n name: payload.senderName,\n source: payload.source,\n channelId: payload.roomKey,\n type: payload.channelType,\n messageServerId,\n metadata: transportMetadata,\n });\n\n const message = createMessageMemory({\n id: messageId,\n entityId,\n agentId: this.runtime.agentId,\n roomId,\n content: {\n text: payload.text,\n source: payload.source,\n channelType: payload.channelType,\n ...(payload.attachments ? { attachments: payload.attachments } : {}),\n },\n });\n\n message.metadata = {\n ...(message.metadata as Record<string, JsonValue>),\n entityName: payload.senderName,\n entityUserName: payload.senderUserName,\n ...(payload.senderMetadata\n ? { gatewaySender: toJsonMetadataRecord(payload.senderMetadata) }\n : {}),\n ...(payload.transportMetadata ? { gatewayMetadata: transportMetadata } : {}),\n } as typeof message.metadata;\n\n const callbackTexts: string[] = [];\n const callback: HandlerCallback = async (content: Content) => {\n const responseText = typeof content.text === \"string\" ? content.text : \"\";\n if (responseText.trim()) {\n callbackTexts.push(responseText);\n }\n\n const responseMemory = createMessageMemory({\n id: createUniqueUuid(\n this.runtime,\n `${payload.source}:${payload.roomKey}:${String(\n rpc.id ?? Date.now()\n )}:response:${callbackTexts.length}`\n ),\n entityId: this.runtime.agentId,\n agentId: this.runtime.agentId,\n roomId,\n content: {\n ...content,\n text: responseText,\n source: payload.source,\n channelType: payload.channelType,\n },\n });\n\n await this.runtime.createMemory(responseMemory, \"messages\");\n return [responseMemory as Memory];\n };\n\n try {\n const result = await this.runtime.messageService.handleMessage(\n this.runtime,\n message,\n callback\n );\n const replyText =\n callbackTexts[callbackTexts.length - 1] ??\n (typeof result.responseContent?.text === \"string\"\n ? result.responseContent.text\n : undefined);\n\n return {\n jsonrpc: \"2.0\",\n id: rpc.id,\n result: {\n didRespond: result.didRespond,\n ...(replyText ? { text: replyText } : {}),\n runtimeAgentId: this.runtime.agentId,\n },\n };\n } catch (error) {\n return {\n jsonrpc: \"2.0\",\n id: rpc.id,\n error: {\n code: -32603,\n message: error instanceof Error ? error.message : String(error),\n },\n };\n }\n }\n}\n",
|
|
50
|
+
"/** Fetches and caches available models from ElizaCloud. */\n\nimport { type IAgentRuntime, logger, Service } from \"@elizaos/core\";\nimport type { CloudAuthService } from \"./cloud-auth\";\n\ninterface ModelListEntry {\n id: string;\n object: string;\n created: number;\n owned_by: string;\n}\n\ninterface ModelListResponse {\n object: string;\n data: ModelListEntry[];\n}\n\nexport interface AvailableModel {\n id: string;\n provider: string;\n name: string;\n createdAt: number;\n}\n\nexport interface ModelsByProvider {\n [provider: string]: AvailableModel[];\n}\n\nconst CACHE_TTL_MS = 30 * 60 * 1000; // 30 minutes\n\nconst PROVIDER_PREFIXES: ReadonlyArray<[string, string]> = [\n [\"gpt-\", \"openai\"],\n [\"o1\", \"openai\"],\n [\"o3\", \"openai\"],\n [\"o4\", \"openai\"],\n [\"dall-e\", \"openai\"],\n [\"whisper\", \"openai\"],\n [\"tts\", \"openai\"],\n [\"claude-\", \"anthropic\"],\n [\"gemini-\", \"google\"],\n [\"llama\", \"meta\"],\n [\"deepseek\", \"deepseek\"],\n [\"grok\", \"xai\"],\n [\"kimi\", \"moonshot\"],\n];\n\nfunction extractProvider(modelId: string): string {\n if (modelId.includes(\"/\")) return modelId.split(\"/\")[0];\n const lower = modelId.toLowerCase();\n for (const [prefix, provider] of PROVIDER_PREFIXES) {\n if (lower.startsWith(prefix)) return provider;\n }\n return \"unknown\";\n}\n\nfunction stripProvider(modelId: string): string {\n if (modelId.includes(\"/\")) {\n return modelId.split(\"/\").slice(1).join(\"/\");\n }\n return modelId;\n}\n\nexport class CloudModelRegistryService extends Service {\n static serviceType = \"CLOUD_MODEL_REGISTRY\";\n capabilityDescription = \"Discovers and caches available AI models from ElizaCloud\";\n\n private models: AvailableModel[] = [];\n private byProvider: ModelsByProvider = {};\n private lastFetchedAt = 0;\n private fetchPromise: Promise<void> | null = null;\n\n static async start(runtime: IAgentRuntime): Promise<Service> {\n const service = new CloudModelRegistryService(runtime);\n await service.initialize();\n return service;\n }\n\n async stop(): Promise<void> {\n this.models = [];\n this.byProvider = {};\n this.lastFetchedAt = 0;\n }\n\n private async initialize(): Promise<void> {\n const auth = this.runtime.getService(\"CLOUD_AUTH\") as CloudAuthService | undefined;\n\n if (!auth?.isAuthenticated()) {\n logger.info(\"[CloudModelRegistry] Auth not available, will fetch models on first access\");\n return;\n }\n\n await this.fetchModels();\n this.validateConfiguredModels();\n }\n\n private async fetchModels(): Promise<void> {\n if (this.fetchPromise) {\n await this.fetchPromise;\n return;\n }\n\n this.fetchPromise = this.doFetchModels();\n await this.fetchPromise;\n this.fetchPromise = null;\n }\n\n private async doFetchModels(): Promise<void> {\n const auth = this.runtime.getService(\"CLOUD_AUTH\") as CloudAuthService | undefined;\n if (!auth?.isAuthenticated()) return;\n\n const client = auth.getClient();\n\n const response = await client.get<ModelListResponse>(\"/models\");\n const entries: ModelListEntry[] = response.data ?? [];\n\n this.models = entries.map((entry) => ({\n id: entry.id,\n provider: extractProvider(entry.id),\n name: stripProvider(entry.id),\n createdAt: entry.created,\n }));\n\n this.byProvider = {};\n for (const model of this.models) {\n if (!this.byProvider[model.provider]) {\n this.byProvider[model.provider] = [];\n }\n this.byProvider[model.provider].push(model);\n }\n\n this.lastFetchedAt = Date.now();\n logger.info(\n `[CloudModelRegistry] Loaded ${this.models.length} models from ${Object.keys(this.byProvider).length} providers`\n );\n }\n\n private validateConfiguredModels(): void {\n if (this.models.length === 0) return;\n\n const modelIds = new Set(this.models.map((m) => m.id));\n const nameSet = new Set(this.models.map((m) => m.name));\n\n const settingsToCheck = [\n { key: \"ELIZAOS_CLOUD_NANO_MODEL\", label: \"nano model\" },\n { key: \"ELIZAOS_CLOUD_MEDIUM_MODEL\", label: \"medium model\" },\n { key: \"ELIZAOS_CLOUD_SMALL_MODEL\", label: \"small model\" },\n { key: \"ELIZAOS_CLOUD_LARGE_MODEL\", label: \"large model\" },\n { key: \"ELIZAOS_CLOUD_MEGA_MODEL\", label: \"mega model\" },\n {\n key: \"ELIZAOS_CLOUD_RESPONSE_HANDLER_MODEL\",\n label: \"response handler model\",\n },\n {\n key: \"ELIZAOS_CLOUD_ACTION_PLANNER_MODEL\",\n label: \"action planner model\",\n },\n { key: \"ELIZAOS_CLOUD_RESPONSE_MODEL\", label: \"response model\" },\n { key: \"ELIZAOS_CLOUD_RESEARCH_MODEL\", label: \"research model\" },\n { key: \"ELIZAOS_CLOUD_EMBEDDING_MODEL\", label: \"embedding model\" },\n {\n key: \"ELIZAOS_CLOUD_IMAGE_DESCRIPTION_MODEL\",\n label: \"image description model\",\n },\n {\n key: \"ELIZAOS_CLOUD_IMAGE_GENERATION_MODEL\",\n label: \"image generation model\",\n },\n { key: \"ELIZAOS_CLOUD_TTS_MODEL\", label: \"TTS model\" },\n {\n key: \"ELIZAOS_CLOUD_TRANSCRIPTION_MODEL\",\n label: \"transcription model\",\n },\n ];\n\n for (const { key, label } of settingsToCheck) {\n const value = this.runtime.getSetting(key);\n if (value && typeof value === \"string\") {\n const found = modelIds.has(value) || nameSet.has(value);\n if (!found) {\n logger.warn(\n `[CloudModelRegistry] Configured ${label} \"${value}\" not found in available models. ` +\n \"It may still work if the gateway supports it, but check your configuration.\"\n );\n }\n }\n }\n }\n\n async getAvailableModels(): Promise<AvailableModel[]> {\n if (Date.now() - this.lastFetchedAt > CACHE_TTL_MS) {\n await this.fetchModels();\n }\n return this.models;\n }\n\n async getModelsByProvider(): Promise<ModelsByProvider> {\n if (Date.now() - this.lastFetchedAt > CACHE_TTL_MS) {\n await this.fetchModels();\n }\n return this.byProvider;\n }\n}\n",
|
|
51
|
+
"/**\n * Waifu metering bridge.\n *\n * A hosted waifu agent runs as a sandboxed container whose model inference is\n * routed through the Eliza Cloud metered inference gateway. The gateway is the\n * honest meter: it owns the per-model pricing table and the platform markup,\n * and it debits the organization's credit balance on every call. That debit is\n * authoritative and already happens server-side.\n *\n * What was missing is the *signal back to waifu*: waifu's burn rollup\n * (`apps/worker/src/processors/agent-rollup.ts`) reads `inference.spent`\n * agent_events to compute `agentDailyBurnUsd` / `agentRunwayDays`, but falls\n * back to a $5/day default estimate when no such events exist. Nothing emitted them.\n *\n * This bridge listens for the runtime `MODEL_USED` event (emitted by the cloud\n * model handlers after each inference) and POSTs a signed `inference.spent`\n * webhook to waifu's receiver (`POST /webhooks/eliza-cloud/inference`). It is\n * inactive unless the container is provisioned with the waifu metering env knobs,\n * so it never fires for non-hosted (local dev / standalone) agents.\n *\n * Token counts are exact (reported by the gateway). USD is the authoritative\n * post-markup cost when the gateway surfaces it (`usage.cost_usd` /\n * `X-Eliza-Cost-Usd`); otherwise a conservative token-based estimate is used,\n * configurable per-model via WAIFU_METER_USD_PER_1K_INPUT / _OUTPUT. The credit\n * debit itself is always the cloud's authoritative number; the estimate only\n * affects waifu's burn display until the cloud cost is wired through.\n */\n\nimport crypto from \"node:crypto\";\nimport { type IAgentRuntime, logger } from \"@elizaos/core\";\nimport type { ModelUsageEventPayload } from \"./events\";\n\nconst DEFAULT_USD_PER_1K_INPUT = 0.003;\nconst DEFAULT_USD_PER_1K_OUTPUT = 0.015;\n\n/**\n * The MODEL_USED event `source` set by the Eliza Cloud metered inference path\n * (see ./events.ts emitModelUsageEvent). ElizaOS event dispatch is global: every\n * MODEL_USED handler receives every MODEL_USED event regardless of which plugin\n * emitted it. Only inference that actually went through the cloud metered\n * gateway debits real credits, so we must meter only those events. Other model\n * providers (e.g. plugin-local-inference emits source \"local-ai\" for free CPU\n * inference, plugin-openrouter emits \"openrouter\", etc.) must never be metered\n * as cloud burn.\n */\nexport const CLOUD_INFERENCE_SOURCE = \"elizacloud\";\n\nexport interface WaifuMeteringConfig {\n webhookUrl: string;\n secret: string;\n agentId: string;\n usdPer1kInput: number;\n usdPer1kOutput: number;\n}\n\nfunction readEnv(runtime: IAgentRuntime, key: string): string | undefined {\n const fromSettings =\n typeof runtime.getSetting === \"function\" ? runtime.getSetting(key) : undefined;\n const value =\n (typeof fromSettings === \"string\" && fromSettings) ||\n (typeof process !== \"undefined\" ? process.env?.[key] : undefined);\n const trimmed = typeof value === \"string\" ? value.trim() : \"\";\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction readNumberEnv(\n runtime: IAgentRuntime,\n key: string,\n fallback: number\n): number {\n const raw = readEnv(runtime, key);\n if (!raw) return fallback;\n const parsed = Number(raw);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : fallback;\n}\n\n/**\n * Resolve the metering config from the container environment. Returns null\n * (bridge disabled) when the required knobs are absent, which is the case for\n * any agent that is not a hosted waifu agent.\n */\nexport function resolveWaifuMeteringConfig(\n runtime: IAgentRuntime\n): WaifuMeteringConfig | null {\n const webhookUrl = resolveInferenceWebhookUrl(runtime);\n const secret =\n readEnv(runtime, \"WAIFU_WEBHOOK_SECRET\") ?? readEnv(runtime, \"WAIFU_INFERENCE_WEBHOOK_SECRET\");\n const agentId = readEnv(runtime, \"WAIFU_AGENT_ID\") ?? readEnv(runtime, \"WAIFU_CORE_AGENT_ID\");\n\n if (!webhookUrl || !secret || !agentId) {\n return null;\n }\n\n return {\n webhookUrl,\n secret,\n agentId,\n usdPer1kInput: readNumberEnv(runtime, \"WAIFU_METER_USD_PER_1K_INPUT\", DEFAULT_USD_PER_1K_INPUT),\n usdPer1kOutput: readNumberEnv(\n runtime,\n \"WAIFU_METER_USD_PER_1K_OUTPUT\",\n DEFAULT_USD_PER_1K_OUTPUT\n ),\n };\n}\n\n/**\n * Resolve the inference webhook URL from the container environment.\n *\n * Prefers the explicit WAIFU_INFERENCE_WEBHOOK_URL. If that is absent but a\n * credits webhook URL (WAIFU_WEBHOOK_URL) is present, derive the sibling\n * `/inference` receiver path from the known `/credits` path. We NEVER post\n * inference events to the credits receiver: the credits mapper defaults unknown\n * payloads to `credits.topped_up`, which would corrupt credit state. If we\n * cannot safely derive an inference URL, return undefined so the bridge stays\n * disabled.\n */\nexport function resolveInferenceWebhookUrl(runtime: IAgentRuntime): string | undefined {\n const explicit = readEnv(runtime, \"WAIFU_INFERENCE_WEBHOOK_URL\");\n if (explicit) return explicit;\n\n const creditsUrl = readEnv(runtime, \"WAIFU_WEBHOOK_URL\");\n if (!creditsUrl) return undefined;\n\n // Only derive when the credits URL ends in a recognizable `/credits` segment.\n // Replacing the trailing `/credits` with `/inference` keeps the same host,\n // base path, and query string. Anything we cannot confidently map is treated\n // as unsafe and skipped, never reused as-is for inference.\n const derived = deriveInferenceUrlFromCredits(creditsUrl);\n if (derived) return derived;\n\n return undefined;\n}\n\n/**\n * Map a known `/credits` webhook URL to its sibling `/inference` URL. Returns\n * undefined when the input does not contain a `/credits` path segment, so we\n * never accidentally post inference to a non-inference endpoint.\n */\nexport function deriveInferenceUrlFromCredits(creditsUrl: string): string | undefined {\n try {\n const url = new URL(creditsUrl);\n if (!/\\/credits\\/?$/.test(url.pathname)) {\n return undefined;\n }\n url.pathname = url.pathname.replace(/\\/credits(\\/?)$/, \"/inference$1\");\n return url.toString();\n } catch {\n // Fall back to a string replacement for non-absolute URLs, still requiring\n // an explicit `/credits` segment so we cannot mis-route.\n if (/\\/credits\\/?$/.test(creditsUrl)) {\n return creditsUrl.replace(/\\/credits(\\/?)$/, \"/inference$1\");\n }\n return undefined;\n }\n}\n\n/**\n * HMAC signature compatible with waifu's webhook receiver:\n * `sha256=` + HMAC-SHA256 over `${timestamp}.${rawBody}`.\n */\nexport function signWaifuWebhook(rawBody: string, timestamp: string, secret: string): string {\n return `sha256=${crypto.createHmac(\"sha256\", secret).update(`${timestamp}.${rawBody}`).digest(\"hex\")}`;\n}\n\nexport function estimateUsd(\n config: WaifuMeteringConfig,\n inputTokens: number,\n outputTokens: number\n): number {\n const usd =\n (inputTokens / 1000) * config.usdPer1kInput +\n (outputTokens / 1000) * config.usdPer1kOutput;\n return Number.isFinite(usd) && usd > 0 ? usd : 0;\n}\n\nexport interface InferenceSpentPayload {\n agentId: string;\n modelType: string;\n modelName?: string;\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n usd: number;\n costSource: \"gateway\" | \"estimate\";\n timestamp: string;\n idempotencyKey: string;\n source: \"elizacloud\";\n}\n\nexport function buildInferenceSpentPayload(\n config: WaifuMeteringConfig,\n event: ModelUsageEventPayload,\n now: Date = new Date()\n): InferenceSpentPayload | null {\n const promptTokens = Math.max(0, Math.round(Number(event.tokens?.prompt ?? 0)));\n const completionTokens = Math.max(0, Math.round(Number(event.tokens?.completion ?? 0)));\n const totalTokens = Math.max(\n 0,\n Math.round(Number(event.tokens?.total ?? promptTokens + completionTokens))\n );\n\n // Nothing was actually spent (e.g. a cached/short-circuited call with no\n // tokens). Skip so we never inflate the burn with empty events.\n if (totalTokens === 0 && promptTokens === 0 && completionTokens === 0) {\n return null;\n }\n\n const gatewayCost =\n typeof event.costUsd === \"number\" && Number.isFinite(event.costUsd) && event.costUsd >= 0\n ? event.costUsd\n : undefined;\n const usd = gatewayCost ?? estimateUsd(config, promptTokens, completionTokens);\n\n const timestamp = now.toISOString();\n return {\n agentId: config.agentId,\n modelType: String(event.type ?? \"unknown\"),\n ...(event.modelName ? { modelName: event.modelName } : {}),\n promptTokens,\n completionTokens,\n totalTokens,\n usd,\n costSource: gatewayCost !== undefined ? \"gateway\" : \"estimate\",\n timestamp,\n idempotencyKey: `inference:${config.agentId}:${crypto.randomUUID()}`,\n source: \"elizacloud\",\n };\n}\n\nconst POST_TIMEOUT_MS = 10000;\n\n/**\n * POST a signed `inference.spent` webhook to waifu. Best-effort: failures are\n * logged but never thrown, so metering never blocks or breaks an agent reply.\n * A 10s AbortSignal bounds the request so a stuck receiver can never leave a\n * background fetch hanging.\n */\nexport async function postInferenceSpent(\n config: WaifuMeteringConfig,\n payload: InferenceSpentPayload,\n fetchImpl: typeof fetch = fetch\n): Promise<{ ok: boolean; status?: number }> {\n const body = JSON.stringify(payload);\n const signature = signWaifuWebhook(body, payload.timestamp, config.secret);\n try {\n const res = await fetchImpl(config.webhookUrl, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"X-Waifu-Webhook-Signature\": signature,\n },\n body,\n signal: AbortSignal.timeout(POST_TIMEOUT_MS),\n });\n if (!res.ok) {\n logger.warn(\n `[waifu-metering] inference.spent POST returned ${res.status} for agent ${config.agentId}`\n );\n return { ok: false, status: res.status };\n }\n logger.debug(\n `[waifu-metering] inference.spent posted (agent=${config.agentId} tokens=${payload.totalTokens} usd=${payload.usd.toFixed(6)} src=${payload.costSource})`\n );\n return { ok: true, status: res.status };\n } catch (err) {\n const aborted = err instanceof Error && err.name === \"TimeoutError\";\n const detail = aborted\n ? `timed out after ${POST_TIMEOUT_MS}ms`\n : err instanceof Error\n ? err.message\n : String(err);\n logger.warn(\n `[waifu-metering] inference.spent POST failed for agent ${config.agentId}: ${detail}`\n );\n return { ok: false };\n }\n}\n\n/**\n * Build the MODEL_USED event handler that forwards inference spend to waifu.\n * Resolves config lazily per-event so it stays inactive until the metering env\n * is present, and so config changes (rare) are picked up without a restart.\n */\nexport function createWaifuMeteringHandler(\n fetchImpl: typeof fetch = fetch\n): (payload: ModelUsageEventPayload) => Promise<void> {\n return async (payload: ModelUsageEventPayload): Promise<void> => {\n const runtime = payload?.runtime;\n if (!runtime) return;\n // ElizaOS dispatches MODEL_USED globally to every registered handler, so we\n // also receive events from other model providers (local-ai, openrouter,\n // etc.). Only cloud-metered inference debits real credits; meter only that\n // source so we never bill free/local inference as cloud burn.\n if (payload?.source !== CLOUD_INFERENCE_SOURCE) return;\n const config = resolveWaifuMeteringConfig(runtime);\n if (!config) return;\n const spent = buildInferenceSpentPayload(config, payload);\n if (!spent) return;\n await postInferenceSpent(config, spent, fetchImpl);\n };\n}\n",
|
|
52
|
+
"function hasValue(value: string | undefined): boolean {\n return Boolean(value?.trim());\n}\n\nfunction hasCompatApiToken(): boolean {\n return hasValue(process.env.ELIZA_API_TOKEN);\n}\n\nfunction hasCloudApiKeyProvisioning(): boolean {\n return (\n process.env.ELIZAOS_CLOUD_ENABLED === \"true\" &&\n hasValue(process.env.ELIZAOS_CLOUD_API_KEY)\n );\n}\n\n/**\n * Platform-managed cloud containers should skip local pairing and onboarding UI.\n *\n * In production we may have either:\n * - a Steward sidecar token (older / sidecar-managed path),\n * - an inbound API token injected directly into the container, or\n * - cloud-managed API-key access injected into the runtime environment.\n *\n * Requiring the cloud flag plus one of those credentials keeps accidental local\n * env leakage from triggering cloud behavior, while still matching real deployed\n * cloud containers.\n */\nexport function isCloudProvisionedContainer(): boolean {\n const hasCloudFlag = process.env.ELIZA_CLOUD_PROVISIONED === \"1\";\n\n return (\n hasCloudFlag &&\n (hasValue(process.env.STEWARD_AGENT_TOKEN) ||\n hasCompatApiToken() ||\n hasCloudApiKeyProvisioning())\n );\n}\n",
|
|
53
|
+
"import type http from \"node:http\";\nimport type { AgentRuntime, Service } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport { normalizeCloudSiteUrl } from \"../cloud/base-url.js\";\nimport {\n type CloudAuthApiKeyService,\n normalizeCloudApiKey,\n} from \"../cloud/auth-service-types\";\nimport { resolveCloudApiKey } from \"../cloud/cloud-api-key.js\";\nimport { validateCloudBaseUrl } from \"../cloud/validate-url.js\";\nimport type { CloudProxyConfigLike } from \"../lib/config-like\";\nimport { sendJson, sendJsonError } from \"../lib/http\";\n\nexport interface CloudCompatRouteState {\n config: CloudProxyConfigLike;\n runtime?: AgentRuntime | null;\n}\n\nconst PROXY_TIMEOUT_MS = 15_000;\nconst MAX_BODY_BYTES = 1_048_576;\nconst JSON_CONTENT_TYPE_RE = /\\b(?:application\\/json|[^;\\s]+\\+json)\\b/i;\n\nexport function resolveCloudBaseUrl(config: CloudProxyConfigLike): string {\n return normalizeCloudSiteUrl(config.cloud?.baseUrl);\n}\n\nfunction resolveProxyApiKey(state: CloudCompatRouteState): string | null {\n const cloudAuth = state.runtime\n ? state.runtime.getService<Service & CloudAuthApiKeyService>(\"CLOUD_AUTH\")\n : null;\n const runtimeApiKey =\n cloudAuth?.isAuthenticated() === true\n ? normalizeCloudApiKey(cloudAuth.getApiKey?.())\n : null;\n\n return runtimeApiKey ?? resolveCloudApiKey(state.config, state.runtime);\n}\n\nfunction buildAuthHeaders(\n config: CloudProxyConfigLike,\n apiKeyOverride?: string | null,\n): Record<string, string> {\n const serviceKey = config.cloud?.serviceKey?.trim();\n const apiKey =\n normalizeCloudApiKey(apiKeyOverride) ?? resolveCloudApiKey(config);\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n };\n\n if (serviceKey) {\n headers[\"X-Service-Key\"] = serviceKey;\n }\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n\n return headers;\n}\n\nfunction readBody(req: http.IncomingMessage): Promise<string | undefined> {\n return new Promise<string | undefined>((resolve, reject) => {\n const chunks: Buffer[] = [];\n let size = 0;\n req.on(\"data\", (chunk: Buffer) => {\n size += chunk.length;\n if (size > MAX_BODY_BYTES) {\n reject(new Error(\"Request body too large\"));\n return;\n }\n chunks.push(chunk);\n });\n req.on(\"end\", () =>\n resolve(\n chunks.length > 0 ? Buffer.concat(chunks).toString(\"utf-8\") : undefined,\n ),\n );\n req.on(\"error\", reject);\n });\n}\n\nasync function fetchUpstream(\n url: string,\n method: string,\n headers: Record<string, string>,\n body: string | undefined,\n): Promise<Response> {\n const res = await fetch(url, {\n method,\n headers,\n body,\n redirect: \"manual\",\n signal: AbortSignal.timeout(PROXY_TIMEOUT_MS),\n });\n\n if (res.status >= 300 && res.status < 400) {\n throw Object.assign(new Error(\"redirect\"), { code: \"REDIRECT\" });\n }\n\n return res;\n}\n\nfunction summarizeUpstreamBody(bodyText: string): string {\n const trimmed = bodyText.trim();\n if (!trimmed) return \"\";\n return trimmed.length > 300 ? `${trimmed.slice(0, 297)}...` : trimmed;\n}\n\nfunction isResourceCompatPath(pathname: string): boolean {\n return pathname.split(\"/\").filter(Boolean).length >= 5;\n}\n\nfunction sendUpstreamNotFound(\n res: http.ServerResponse,\n pathname: string,\n upstreamBody?: unknown,\n): void {\n if (isResourceCompatPath(pathname)) {\n sendJson(\n res,\n upstreamBody ?? {\n success: false,\n error: \"Eliza Cloud returned 404 for this API route.\",\n code: \"CLOUD_ROUTE_NOT_FOUND\",\n },\n 404,\n );\n return;\n }\n\n sendJson(\n res,\n {\n success: false,\n error: \"This Cloud feature is not available yet.\",\n code: \"CLOUD_NOT_READY\",\n },\n 404,\n );\n}\n\nasync function parseUpstreamJsonResponse(\n upstreamRes: Response,\n method: string,\n): Promise<\n | { kind: \"head\" }\n | { kind: \"empty\" }\n | { kind: \"json\"; body: unknown }\n | { kind: \"invalid-json\"; bodyText: string }\n | { kind: \"non-json\"; bodyText: string }\n> {\n if (method === \"HEAD\") {\n return { kind: \"head\" };\n }\n\n const bodyText = await upstreamRes.text();\n if (bodyText.trim().length === 0) {\n return { kind: \"empty\" };\n }\n\n const contentType = upstreamRes.headers.get(\"content-type\");\n const expectsJson = JSON_CONTENT_TYPE_RE.test(contentType ?? \"\");\n\n if (!expectsJson && !/^\\s*[[{]/.test(bodyText)) {\n return { kind: \"non-json\", bodyText };\n }\n\n try {\n return { kind: \"json\", body: JSON.parse(bodyText) };\n } catch {\n return expectsJson\n ? { kind: \"invalid-json\", bodyText }\n : { kind: \"non-json\", bodyText };\n }\n}\n\nfunction handleUpstreamError(error: unknown, res: http.ServerResponse): void {\n if (error instanceof Error) {\n const errorCode = (error as { code?: string }).code;\n if (errorCode === \"REDIRECT\") {\n sendJsonError(res, \"Eliza Cloud returned an unexpected redirect.\", 502);\n return;\n }\n if (error.name === \"TimeoutError\" || error.name === \"AbortError\") {\n sendJsonError(res, \"Eliza Cloud request timed out.\", 504);\n return;\n }\n if (error.message === \"Request body too large\") {\n sendJsonError(res, error.message, 413);\n return;\n }\n sendJsonError(\n res,\n `Failed to reach Eliza Cloud: ${error.message || \"Unknown error\"}`,\n 502,\n );\n return;\n }\n\n sendJsonError(res, \"Failed to reach Eliza Cloud.\", 502);\n}\n\n/** Paths under /api/cloud/v1/ are forwarded directly as /api/v1/ on the cloud backend. */\nconst CLOUD_V1_PREFIX = \"/api/cloud/v1/\";\n\nexport async function handleCloudCompatRoute(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string,\n method: string,\n state: CloudCompatRouteState,\n): Promise<boolean> {\n const isCompatRoute = pathname.startsWith(\"/api/cloud/compat/\");\n const isV1Route = pathname.startsWith(CLOUD_V1_PREFIX);\n if (!isCompatRoute && !isV1Route) return false;\n\n const apiKey = resolveProxyApiKey(state);\n if (!apiKey) {\n sendJsonError(\n res,\n \"Not connected to Eliza Cloud. Please log in first.\",\n 401,\n );\n return true;\n }\n\n const baseUrl = resolveCloudBaseUrl(state.config);\n const urlError = await validateCloudBaseUrl(baseUrl);\n if (urlError) {\n sendJsonError(res, urlError, 502);\n return true;\n }\n\n // /api/cloud/compat/* → /api/compat/* (existing mapping)\n // /api/cloud/v1/* → /api/v1/* (eliza v1 endpoints, e.g. pairing-token)\n // Both branches strip the leading `/api/cloud` and re-prefix `/api`. The\n // earlier v1 branch used `.slice(\"/api/cloud\".length)` which left\n // `/v1/...` (no `/api/` prefix), causing upstream to return 405 for\n // valid POSTs to e.g. /api/v1/app/agents/{id}/provision.\n const compatPath = pathname.replace(\"/api/cloud\", \"/api\");\n const fullUrl = req.url ?? pathname;\n const qsIndex = fullUrl.indexOf(\"?\");\n const queryString = qsIndex >= 0 ? fullUrl.slice(qsIndex) : \"\";\n const upstreamUrl = `${baseUrl}${compatPath}${queryString}`;\n const headers = buildAuthHeaders(state.config, apiKey);\n\n try {\n let body: string | undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n body = await readBody(req);\n }\n\n const upstreamRes = await fetchUpstream(upstreamUrl, method, headers, body);\n const parsed = await parseUpstreamJsonResponse(upstreamRes, method);\n\n if (parsed.kind === \"head\") {\n res.statusCode = upstreamRes.status;\n res.end();\n return true;\n }\n\n if (parsed.kind === \"json\") {\n if (upstreamRes.status === 404) {\n sendUpstreamNotFound(res, pathname, parsed.body);\n return true;\n }\n sendJson(res, parsed.body, upstreamRes.status);\n return true;\n }\n\n if (upstreamRes.status === 404) {\n sendUpstreamNotFound(res, pathname);\n return true;\n }\n\n const upstreamStatus = upstreamRes.ok ? 502 : upstreamRes.status;\n if (parsed.kind === \"empty\") {\n const message = upstreamRes.ok\n ? \"Eliza Cloud returned an empty response.\"\n : `Eliza Cloud returned HTTP ${upstreamRes.status} with an empty response body.`;\n sendJsonError(res, message, upstreamStatus);\n return true;\n }\n\n const message =\n parsed.kind === \"invalid-json\"\n ? \"Eliza Cloud returned malformed JSON.\"\n : \"Eliza Cloud returned a non-JSON response.\";\n const detail = summarizeUpstreamBody(parsed.bodyText);\n logger.warn(\n `[cloud-compat] ${message} ${method} ${compatPath} (${upstreamRes.status})${detail ? `: ${detail}` : \"\"}`,\n );\n sendJsonError(\n res,\n detail ? `${message} ${detail}` : message,\n upstreamStatus,\n );\n return true;\n } catch (error) {\n handleUpstreamError(error, res);\n return true;\n }\n}\n",
|
|
54
|
+
"/**\n * Cloud gateway relay status route.\n *\n * Exposes the current state of the CloudManagedGatewayRelayService\n * so the UI can show whether this local instance is registered with\n * Eliza Cloud and actively receiving routed messages.\n *\n * GET /api/cloud/relay-status\n *\n * The relay service lives in plugin-elizacloud and registers itself\n * as a runtime service named \"cloud-managed-gateway-relay\". We query\n * it via the runtime.getService interface to avoid a build-time dep.\n */\n\nimport type http from \"node:http\";\nimport type { RouteHelpers } from \"@elizaos/core\";\nimport {\n buildHomeRemoteRunnerAccessUrl,\n buildHomeRemoteRunnerSshTunnel,\n} from \"./home-remote-runner-access-url\";\n\ninterface RelayServiceLike {\n getSessionInfo(): {\n sessionId: string | null;\n organizationId: string | null;\n userId: string | null;\n agentName: string | null;\n platform: string | null;\n lastSeenAt: string | null;\n status: \"idle\" | \"registered\" | \"polling\" | \"error\" | \"stopped\";\n };\n}\n\nexport interface CloudRelayRouteState {\n runtime?: {\n getService(type: string): unknown;\n getSetting?: (key: string) => string | boolean | number | null;\n };\n}\n\nexport async function handleCloudRelayRoute(\n _req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string,\n method: string,\n state: CloudRelayRouteState,\n helpers: RouteHelpers,\n): Promise<boolean> {\n if (method !== \"GET\" || pathname !== \"/api/cloud/relay-status\") {\n return false;\n }\n\n if (!state.runtime) {\n helpers.json(res, {\n available: false,\n status: \"no_runtime\",\n reason: \"Runtime not initialized\",\n });\n return true;\n }\n\n // Try known service names used across package boundaries.\n const service = (state.runtime.getService(\"CLOUD_MANAGED_GATEWAY_RELAY\") ??\n state.runtime.getService(\"cloud-managed-gateway-relay\") ??\n state.runtime.getService(\n \"cloudManagedGatewayRelay\",\n )) as RelayServiceLike | null;\n\n if (!service || typeof service.getSessionInfo !== \"function\") {\n helpers.json(res, {\n available: false,\n status: \"not_registered\",\n reason:\n \"Gateway relay service not active. Connect to Eliza Cloud in Settings to enable instance routing.\",\n });\n return true;\n }\n\n try {\n const info = service.getSessionInfo();\n helpers.json(res, {\n available: true,\n ...info,\n accessUrl: buildHomeRemoteRunnerAccessUrl({\n sessionId: info.sessionId,\n }),\n ssh: buildHomeRemoteRunnerSshTunnel({\n remoteBaseUrl:\n readRuntimeSetting(state.runtime, \"ELIZA_HOME_REMOTE_RUNNER_URL\") ??\n process.env.ELIZA_HOME_REMOTE_RUNNER_URL ??\n readRuntimeSetting(state.runtime, \"ELIZA_HOME_RUNNER_URL\") ??\n process.env.ELIZA_HOME_RUNNER_URL,\n sshTarget:\n readRuntimeSetting(\n state.runtime,\n \"ELIZA_HOME_REMOTE_RUNNER_SSH_TARGET\",\n ) ??\n process.env.ELIZA_HOME_REMOTE_RUNNER_SSH_TARGET ??\n readRuntimeSetting(state.runtime, \"ELIZA_HOME_SSH_TARGET\") ??\n process.env.ELIZA_HOME_SSH_TARGET,\n sshIdentity:\n readRuntimeSetting(\n state.runtime,\n \"ELIZA_HOME_REMOTE_RUNNER_SSH_IDENTITY\",\n ) ??\n process.env.ELIZA_HOME_REMOTE_RUNNER_SSH_IDENTITY ??\n readRuntimeSetting(state.runtime, \"ELIZA_HOME_SSH_IDENTITY\") ??\n process.env.ELIZA_HOME_SSH_IDENTITY,\n localPort:\n readRuntimeSetting(\n state.runtime,\n \"ELIZA_HOME_REMOTE_RUNNER_SSH_LOCAL_PORT\",\n ) ?? process.env.ELIZA_HOME_REMOTE_RUNNER_SSH_LOCAL_PORT,\n }),\n });\n } catch (err) {\n helpers.json(res, {\n available: false,\n status: \"error\",\n reason: err instanceof Error ? err.message : String(err),\n });\n }\n\n return true;\n}\n\nfunction readRuntimeSetting(\n runtime: CloudRelayRouteState[\"runtime\"],\n key: string,\n): string | null {\n const value = runtime?.getSetting?.(key);\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n",
|
|
55
|
+
"/**\n * Cloud setup flow for Eliza Cloud integration.\n *\n * Handles availability check → browser-based auth → agent provisioning\n * during `runFirstTimeSetup()`. Transport-agnostic: every user-visible\n * event and every interactive prompt is funneled through a\n * `CloudSetupObserver`. CLI callers wrap their clack instance in\n * `ClackObserver`; web/desktop callers provide an event-bridge observer.\n *\n * @module cloud-setup\n */\n\nimport { logger } from \"@elizaos/core\";\nimport type { StylePreset } from \"@elizaos/core\";\nimport { type CloudLoginResult, cloudLogin } from \"./cloud/auth.js\";\nimport { normalizeCloudSiteUrl } from \"./cloud/base-url.js\";\nimport {\n type CloudAgentCreateParams,\n ElizaCloudClient,\n} from \"./cloud/bridge-client.js\";\nimport type { CloudSetupObserver } from \"./cloud/setup-observer.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Result of a successful cloud setup flow. */\nexport interface CloudSetupResult {\n apiKey: string;\n agentId: string | undefined;\n baseUrl: string;\n bridgeUrl?: string;\n}\n\n/**\n * Outcome of the agent-provisioning step. Distinguishes a fully-running\n * agent from one that timed out mid-provisioning so callers do not treat\n * the timeout path as a success.\n */\ntype ProvisionOutcome =\n | { kind: \"running\"; agentId: string; bridgeUrl?: string }\n | { kind: \"pending-after-timeout\"; agentId: string }\n | null;\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_CLOUD_BASE_URL = \"https://www.elizacloud.ai\";\nconst PROVISION_TIMEOUT_MS = 120_000; // 2 minutes\nconst PROVISION_POLL_INTERVAL_MS = 3_000;\n\n// ---------------------------------------------------------------------------\n// Availability check\n// ---------------------------------------------------------------------------\n\n/**\n * Quick pre-flight check: is Eliza Cloud accepting new agents?\n * Returns null if available, or an error message string if not.\n */\nexport async function checkCloudAvailability(\n baseUrl: string,\n): Promise<string | null> {\n try {\n const url = `${normalizeCloudSiteUrl(baseUrl)}/api/compat/availability`;\n const res = await fetch(url, {\n method: \"GET\",\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(10_000),\n });\n\n if (!res.ok) {\n return `Cloud returned HTTP ${res.status}. It may be temporarily unavailable.`;\n }\n\n const body = (await res.json()) as {\n success?: boolean;\n data?: { acceptingNewAgents?: boolean; availableSlots?: number };\n };\n\n if (!body.success || !body.data?.acceptingNewAgents) {\n return \"Eliza Cloud is currently at capacity. Try again later or run locally.\";\n }\n\n return null; // Available!\n } catch (err) {\n const msg = String(err);\n if (msg.includes(\"timed out\") || msg.includes(\"timeout\")) {\n return \"Could not reach Eliza Cloud (request timed out). Check your internet connection.\";\n }\n return `Could not reach Eliza Cloud: ${msg}`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Cloud auth wrapper\n// ---------------------------------------------------------------------------\n\n/**\n * Run the Eliza Cloud browser-based login, surfacing every transition\n * through the observer. Returns the API key/result or null on failure.\n */\nasync function runCloudAuth(\n observer: CloudSetupObserver,\n baseUrl: string,\n): Promise<CloudLoginResult | null> {\n try {\n const result = await cloudLogin({\n baseUrl,\n timeoutMs: 300_000, // 5 minutes\n onBrowserUrl: (url: string) => {\n observer.onAuthStart(url);\n\n // Try to open the browser. Failure is surfaced through the\n // observer instead of being swallowed at debug-level — desktop /\n // web setup wrappers need to render an inline \"couldn't open\n // browser\" affordance.\n openBrowser(url).catch((err) => {\n const error = err instanceof Error ? err : new Error(String(err));\n observer.onAuthBrowserOpenFailed(url, error);\n });\n },\n onPollStatus: (status: string) => {\n observer.onAuthPollStatus(status);\n },\n });\n\n observer.onAuthSuccess();\n return result;\n } catch (err) {\n observer.onAuthFailure(describeCloudAuthError(err));\n return null;\n }\n}\n\n/**\n * Translate the various error categories `cloudLogin` can throw into a\n * single user-facing line. The categories are derived from the strings\n * `cloud/auth.ts` and `cloud/validate-url.ts` already produce — we don't\n * invent new error types, we just steer them into the right bucket.\n */\nfunction describeCloudAuthError(err: unknown): string {\n const raw = err instanceof Error ? err.message : String(err);\n const msg = raw.toLowerCase();\n\n // Overall 5-minute browser timeout from cloudLogin.\n if (\n msg.includes(\"login timed out\") ||\n msg.includes(\"not completed within\")\n ) {\n return \"Cloud sign-in timed out after 5 minutes. Try again or run locally.\";\n }\n\n // validateCloudBaseUrl rejections (HTTPS-only, blocked host, DNS, …).\n if (\n msg.includes(\"invalid cloud base url\") ||\n msg.includes(\"cloud base url\") ||\n msg.includes(\"could not be resolved via dns\")\n ) {\n return `Cloud sign-in failed: ${raw}`;\n }\n\n // Per-request timeouts (session create / polling) and any fetch network\n // failure from `cloudLogin`.\n if (\n msg.includes(\"timed out\") ||\n msg.includes(\"failed to create auth session\") ||\n msg.includes(\"polling failed\") ||\n msg.includes(\"polling request timed out\")\n ) {\n return \"Couldn't reach Eliza Cloud. Check your connection or run locally.\";\n }\n\n // Fallback: surface the underlying message verbatim.\n return `Cloud sign-in failed: ${raw}`;\n}\n\n// ---------------------------------------------------------------------------\n// Agent provisioning\n// ---------------------------------------------------------------------------\n\n/**\n * Create and provision a cloud agent, polling until it's running.\n *\n * Returns a discriminated outcome:\n * - `{ kind: \"running\", agentId, bridgeUrl? }` — agent reached a\n * terminal \"up\" state.\n * - `{ kind: \"pending-after-timeout\", agentId }` — agent was created\n * but never reached a running/failed terminal status before\n * `PROVISION_TIMEOUT_MS`. The caller is expected to surface the\n * timeout to the user; we don't pretend it succeeded.\n * - `null` — agent creation failed outright, or provisioning failed\n * with an `error`/`failed` status, or the polling loop hit a\n * terminal auth error (401/403). The caller falls back.\n */\nasync function provisionCloudAgent(\n observer: CloudSetupObserver,\n client: ElizaCloudClient,\n agentName: string,\n preset?: StylePreset,\n): Promise<ProvisionOutcome> {\n observer.onProvisionStart(agentName);\n\n let agentId: string;\n let initialStatus: string;\n try {\n const agentConfig: Record<string, unknown> = {};\n if (preset) {\n agentConfig.bio = preset.bio;\n agentConfig.system = preset.system;\n agentConfig.style = preset.style;\n agentConfig.adjectives = preset.adjectives;\n agentConfig.topics = preset.topics;\n agentConfig.postExamples = preset.postExamples;\n agentConfig.messageExamples = preset.messageExamples;\n }\n\n const params: CloudAgentCreateParams = {\n agentName,\n agentConfig,\n };\n\n const agent = await client.createAgent(params);\n agentId = agent.id;\n initialStatus = agent.status;\n } catch (err) {\n observer.onProvisionFailure(`Failed to create cloud agent: ${String(err)}`);\n return null;\n }\n\n observer.onProvisionStatus(\"created\");\n\n // Poll for terminal status. Order: poll first (terminal-on-first-read\n // skips the wasted sleep), then sleep at the END of each iteration if\n // the loop has time remaining.\n const deadline = Date.now() + PROVISION_TIMEOUT_MS;\n let lastStatus = initialStatus;\n\n while (Date.now() < deadline) {\n let current: Awaited<ReturnType<ElizaCloudClient[\"getAgent\"]>> | null;\n try {\n current = await client.getAgent(agentId);\n } catch (pollErr) {\n const classification = classifyPollError(pollErr);\n if (classification === \"auth\") {\n observer.onProvisionFailure(\n `Cloud rejected the API key (last status: ${lastStatus}). Please sign in again.`,\n );\n return null;\n }\n if (classification === \"transient\") {\n // 5xx / network: keep trying, but at warn level so a sustained\n // outage is visible in logs (not silently buried at debug).\n logger.warn(\n `[cloud-setup] Transient poll error, will retry: ${String(pollErr)}`,\n );\n current = null;\n } else {\n // Terminal but not auth — propagate and stop the flow.\n observer.onProvisionFailure(`Provisioning poll failed: ${String(pollErr)}`);\n return null;\n }\n }\n\n if (current) {\n lastStatus = current.status;\n switch (lastStatus) {\n case \"running\":\n case \"completed\":\n observer.onProvisionSuccess({\n agentId,\n bridgeUrl: current.bridgeUrl,\n });\n return {\n kind: \"running\",\n agentId,\n bridgeUrl: current.bridgeUrl,\n };\n\n case \"failed\":\n case \"error\":\n observer.onProvisionFailure(\n `Provisioning failed: ${current.errorMessage ?? \"unknown error\"}`,\n );\n return null;\n\n default:\n observer.onProvisionStatus(lastStatus, current);\n }\n }\n\n // Sleep AFTER the read. If the previous read was terminal we would\n // have returned above; if it pushed us past the deadline the loop\n // condition will exit on the next iteration without another sleep.\n if (Date.now() + PROVISION_POLL_INTERVAL_MS < deadline) {\n await sleep(PROVISION_POLL_INTERVAL_MS);\n } else {\n break;\n }\n }\n\n // Reached the deadline without a terminal status. Surface that\n // explicitly — callers must not treat this as a success.\n observer.onProvisionTimeout(agentId, lastStatus);\n return { kind: \"pending-after-timeout\", agentId };\n}\n\n/**\n * Classify a `getAgent` poll error. The bridge client's `request<T>`\n * surfaces non-2xx responses as plain `Error(\"HTTP <status>: ...\")` from\n * `getAgent` (see `cloud/bridge-client.ts`), so the message-prefix match\n * is the canonical signal.\n *\n * \"auth\" — 401/403: stop polling immediately.\n * \"transient\" — 5xx or network/fetch error: keep retrying.\n * \"terminal\" — anything else (404, malformed body, etc.): stop.\n */\nfunction classifyPollError(err: unknown): \"auth\" | \"transient\" | \"terminal\" {\n const raw = err instanceof Error ? err.message : String(err);\n if (/\\bHTTP\\s+40[13]\\b/i.test(raw)) {\n return \"auth\";\n }\n if (/\\bHTTP\\s+5\\d{2}\\b/i.test(raw)) {\n return \"transient\";\n }\n // AbortError / TimeoutError / fetch failures from the request layer.\n if (\n err instanceof Error &&\n (err.name === \"AbortError\" ||\n err.name === \"TimeoutError\" ||\n /fetch failed|network|timed out|timeout/i.test(raw))\n ) {\n return \"transient\";\n }\n return \"terminal\";\n}\n\n// ---------------------------------------------------------------------------\n// Main orchestrator\n// ---------------------------------------------------------------------------\n\n/**\n * Run the full cloud setup flow:\n * 1. Check availability\n * 2. Authenticate via browser\n * 3. Create + provision agent\n *\n * Returns the result or null if the user cancels / an error occurs.\n * On failure, the caller should fall back to local mode.\n */\nexport async function runCloudSetup(\n observer: CloudSetupObserver,\n agentName: string,\n preset?: StylePreset,\n baseUrl?: string,\n): Promise<CloudSetupResult | null> {\n const resolvedBaseUrl = normalizeCloudSiteUrl(\n baseUrl ?? DEFAULT_CLOUD_BASE_URL,\n );\n\n // ── Step 1: Availability check ──────────────────────────────────────\n const unavailableReason = await checkCloudAvailability(resolvedBaseUrl);\n observer.onAvailabilityChecked({\n ok: unavailableReason === null,\n ...(unavailableReason ? { reason: unavailableReason } : {}),\n });\n\n if (unavailableReason) {\n const fallback = await observer.confirm({\n message: \"Run locally instead?\",\n defaultValue: true,\n });\n\n // Cancel (null) and explicit \"yes, run locally\" both bail to local.\n if (fallback === null || fallback === true) {\n return null;\n }\n // User said \"no\" to fallback — try auth anyway (maybe availability is\n // temporarily wrong).\n }\n\n // ── Step 2: Browser-based auth ──────────────────────────────────────\n const authResult = await runCloudAuth(observer, resolvedBaseUrl);\n if (!authResult) {\n observer.onNotice(\"Cloud login was not completed.\");\n\n const retry = await observer.confirm({\n message: \"Try again, or run locally?\",\n activeLabel: \"Try again\",\n inactiveLabel: \"Run locally\",\n defaultValue: false,\n });\n\n // Cancel or \"run locally\" both bail.\n if (retry === null || retry === false) {\n return null;\n }\n\n // Retry auth once\n const retryResult = await runCloudAuth(observer, resolvedBaseUrl);\n if (!retryResult) {\n observer.onNotice(\"Login was not completed. Falling back to local mode.\");\n return null;\n }\n\n return await finishProvisioning(\n observer,\n resolvedBaseUrl,\n retryResult,\n agentName,\n preset,\n );\n }\n\n return await finishProvisioning(\n observer,\n resolvedBaseUrl,\n authResult,\n agentName,\n preset,\n );\n}\n\n/**\n * Complete provisioning after successful auth.\n *\n * Branches on the explicit `ProvisionOutcome` kind: a \"pending-after-\n * timeout\" outcome is NOT treated as success — the caller is prompted\n * to fall back to local, the same as for outright failure, but the\n * agent id is preserved on the result so the user can reconnect later\n * with `eliza cloud connect`.\n */\nasync function finishProvisioning(\n observer: CloudSetupObserver,\n baseUrl: string,\n authResult: CloudLoginResult,\n agentName: string,\n preset?: StylePreset,\n): Promise<CloudSetupResult | null> {\n // ── Step 3: Create + provision agent ──────────────────────────────\n const client = new ElizaCloudClient(baseUrl, authResult.apiKey);\n const provisionResult = await provisionCloudAgent(\n observer,\n client,\n agentName,\n preset,\n );\n\n if (provisionResult && provisionResult.kind === \"running\") {\n return {\n apiKey: authResult.apiKey,\n agentId: provisionResult.agentId,\n baseUrl,\n bridgeUrl: provisionResult.bridgeUrl,\n };\n }\n\n // Either provisioning errored (`null`) or timed out mid-flight.\n // Prompt the user to fall back. We preserve any agentId we got so\n // a later `eliza cloud connect` can resume.\n const pendingAgentId =\n provisionResult?.kind === \"pending-after-timeout\"\n ? provisionResult.agentId\n : undefined;\n\n observer.onNotice(\n pendingAgentId\n ? \"Cloud agent is still starting up. You can try `eliza cloud connect` once it's ready.\"\n : \"Cloud provisioning did not complete. You can try `eliza cloud connect` later.\",\n );\n\n const runLocal = await observer.confirm({\n message: \"Continue with local setup instead?\",\n defaultValue: true,\n });\n\n if (runLocal === null || runLocal === true) {\n return null;\n }\n\n // User doesn't want local either — save the auth result (and the\n // pending agent id, if we have one) so they can reconnect later.\n return {\n apiKey: authResult.apiKey,\n agentId: pendingAgentId,\n baseUrl,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Try to open a URL in the user's default browser.\n *\n * Rejects with a real Error when the underlying OS command fails (binary\n * not on PATH, etc.). The caller is responsible for surfacing the failure\n * — `runCloudAuth` routes it through `observer.onAuthBrowserOpenFailed`.\n *\n * Uses execFile with an args array (not exec with string interpolation)\n * to avoid shell injection via crafted URLs.\n */\nasync function openBrowser(url: string): Promise<void> {\n const { execFile } = await import(\"node:child_process\");\n const { platform } = await import(\"node:os\");\n\n const p = platform();\n\n return new Promise((resolve, reject) => {\n const onError = (err: Error | null) => {\n if (err) {\n reject(err);\n return;\n }\n resolve();\n };\n\n if (p === \"darwin\") {\n execFile(\"open\", [url], onError);\n } else if (p === \"win32\") {\n execFile(\"cmd.exe\", [\"/c\", \"start\", \"\", url], onError);\n } else {\n execFile(\"xdg-open\", [url], onError);\n }\n });\n}\n",
|
|
56
|
+
"/**\n * Eliza Cloud login flow — reuses the CLI auth session pattern:\n * create session, open browser, poll until authenticated, return API key.\n */\n\nimport crypto from \"node:crypto\";\nimport { logger } from \"@elizaos/core\";\nimport { normalizeCloudSiteUrl } from \"./base-url.js\";\nimport { validateCloudBaseUrl } from \"./validate-url.js\";\n\nexport interface CloudLoginResult {\n apiKey: string;\n keyPrefix: string;\n expiresAt: string | null;\n}\n\nexport interface CloudLoginOptions {\n baseUrl?: string;\n timeoutMs?: number;\n requestTimeoutMs?: number;\n pollIntervalMs?: number;\n onBrowserUrl?: (url: string) => void;\n onPollStatus?: (status: string) => void;\n}\n\nconst DEFAULT_CLOUD_REQUEST_TIMEOUT_MS = 10_000;\n\nfunction isRedirectResponse(response: Response): boolean {\n return response.status >= 300 && response.status < 400;\n}\n\nfunction isTimeoutError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n if (err.name === \"TimeoutError\" || err.name === \"AbortError\") return true;\n const msg = err.message.toLowerCase();\n return msg.includes(\"timed out\") || msg.includes(\"timeout\");\n}\n\nasync function fetchWithTimeout(\n input: string,\n init: RequestInit,\n timeoutMs: number,\n): Promise<Response> {\n return fetch(input, {\n ...init,\n redirect: \"manual\",\n signal: AbortSignal.timeout(timeoutMs),\n });\n}\n\nexport async function cloudLogin(\n options: CloudLoginOptions = {},\n): Promise<CloudLoginResult> {\n const baseUrl = normalizeCloudSiteUrl(options.baseUrl);\n const urlError = await validateCloudBaseUrl(baseUrl);\n if (urlError) {\n throw new Error(urlError);\n }\n const timeoutMs = options.timeoutMs ?? 300_000;\n const requestTimeoutMs =\n options.requestTimeoutMs ?? DEFAULT_CLOUD_REQUEST_TIMEOUT_MS;\n const pollIntervalMs = options.pollIntervalMs ?? 2_000;\n const sessionId = crypto.randomUUID();\n\n logger.info(\"[cloud-auth] Creating auth session...\");\n\n let createResponse: Response;\n try {\n createResponse = await fetchWithTimeout(\n `${baseUrl}/api/auth/cli-session`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ sessionId }),\n },\n requestTimeoutMs,\n );\n } catch (err) {\n if (isTimeoutError(err)) {\n throw new Error(\n `Cloud login request timed out while creating session (>${requestTimeoutMs}ms).`,\n );\n }\n throw new Error(`Failed to create auth session: ${String(err)}`);\n }\n\n if (!createResponse.ok) {\n if (isRedirectResponse(createResponse)) {\n throw new Error(\n \"Cloud login request was redirected; redirects are not allowed.\",\n );\n }\n const errorText = await createResponse.text();\n throw new Error(\n `Failed to create auth session (HTTP ${createResponse.status}): ${errorText}`,\n );\n }\n\n const browserUrl = `${baseUrl}/auth/cli-login?session=${encodeURIComponent(sessionId)}`;\n logger.info(`[cloud-auth] Browser URL: ${browserUrl}`);\n options.onBrowserUrl?.(browserUrl);\n\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n const remainingBeforeSleep = deadline - Date.now();\n if (remainingBeforeSleep <= 0) break;\n await new Promise((resolve) =>\n setTimeout(resolve, Math.min(pollIntervalMs, remainingBeforeSleep)),\n );\n\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n\n let pollResponse: Response;\n try {\n pollResponse = await fetchWithTimeout(\n `${baseUrl}/api/auth/cli-session/${encodeURIComponent(sessionId)}`,\n {},\n Math.min(requestTimeoutMs, remaining),\n );\n } catch (err) {\n if (isTimeoutError(err)) {\n if (remaining <= requestTimeoutMs) {\n break;\n }\n throw new Error(\n `Cloud login polling request timed out (>${Math.min(requestTimeoutMs, remaining)}ms).`,\n );\n }\n throw new Error(`Cloud login polling failed: ${String(err)}`);\n }\n\n if (!pollResponse.ok) {\n if (isRedirectResponse(pollResponse)) {\n throw new Error(\n \"Cloud login polling request was redirected; redirects are not allowed.\",\n );\n }\n if (pollResponse.status === 404) {\n throw new Error(\"Auth session expired or not found. Please try again.\");\n }\n options.onPollStatus?.(\"error\");\n continue;\n }\n\n const data = (await pollResponse.json()) as {\n status: string;\n apiKey?: string;\n keyPrefix?: string;\n expiresAt?: string;\n };\n\n options.onPollStatus?.(data.status);\n\n if (data.status === \"authenticated\" && data.apiKey) {\n logger.info(\"[cloud-auth] Authentication complete\");\n return {\n apiKey: data.apiKey,\n keyPrefix: data.keyPrefix ?? \"\",\n expiresAt: data.expiresAt ?? null,\n };\n }\n\n if (data.status === \"authenticated\" && !data.apiKey) {\n throw new Error(\n \"Auth session was completed but the API key was already retrieved. Please try logging in again.\",\n );\n }\n }\n\n throw new Error(\n `Cloud login timed out. The browser login was not completed within ${Math.round(timeoutMs / 1000)} seconds.`,\n );\n}\n",
|
|
57
|
+
"/**\n * HTTP client for the Eliza Cloud Eliza Sandbox API.\n */\nimport { normalizeCloudSiteUrl } from \"./base-url.js\";\n\nexport type CloudChainType = \"evm\" | \"solana\";\nexport type CloudWalletProvider = \"privy\" | \"steward\";\n\nexport interface CloudWalletDescriptor {\n agentWalletId: string;\n walletAddress: string;\n walletProvider: CloudWalletProvider;\n chainType: CloudChainType;\n balance?: string | number;\n}\n\ninterface CloudWalletAddresses {\n evm?: string | null;\n solana?: string | null;\n}\n\nexport interface SignedRpcEnvelope {\n clientAddress: string;\n payload: {\n method: string;\n params: unknown[];\n };\n nonce: string;\n timestamp: number;\n signature: string;\n correlationId?: string;\n}\n\nexport interface RpcResult {\n [key: string]: unknown;\n}\n\nexport class CloudBridgeError extends Error {\n constructor(\n message: string,\n public readonly status?: number,\n public readonly body?: string,\n ) {\n super(message);\n this.name = \"CloudBridgeError\";\n }\n}\n\nexport class SignatureInvalidError extends CloudBridgeError {\n constructor(message: string, body?: string) {\n super(message, 401, body);\n this.name = \"SignatureInvalidError\";\n }\n}\n\nexport class NonceReplayError extends CloudBridgeError {\n constructor(message: string, body?: string) {\n super(message, 409, body);\n this.name = \"NonceReplayError\";\n }\n}\n\nexport class SessionExpiredError extends CloudBridgeError {\n constructor(message: string, body?: string) {\n super(message, 410, body);\n this.name = \"SessionExpiredError\";\n }\n}\n\nexport class CloudUnavailableError extends CloudBridgeError {\n constructor(message: string, status: number, body?: string) {\n super(message, status, body);\n this.name = \"CloudUnavailableError\";\n }\n}\n\nexport interface CloudAgent {\n id: string;\n agentName: string;\n status: string;\n databaseStatus: string;\n bridgeUrl?: string;\n lastBackupAt?: string;\n lastHeartbeatAt?: string;\n errorMessage?: string;\n errorCount?: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CloudAgentCreateParams {\n agentName: string;\n agentConfig?: Record<string, unknown>;\n environmentVars?: Record<string, string>;\n}\n\nexport interface ProvisionInfo {\n id: string;\n agentName: string;\n status: string;\n bridgeUrl?: string;\n healthUrl?: string;\n}\n\nexport interface BackupInfo {\n id: string;\n snapshotType: string;\n sizeBytes: number | null;\n createdAt: string;\n}\n\nexport type ChatChannelType =\n | \"DM\"\n | \"GROUP\"\n | \"VOICE_DM\"\n | \"VOICE_GROUP\"\n | \"API\";\n\ninterface ApiResponse<T> {\n success: boolean;\n data?: T;\n error?: string;\n}\n\nfunction formatApiErrorBody(text: string): string | null {\n if (!text) return null;\n try {\n const parsed = JSON.parse(text) as {\n error?: unknown;\n details?: Array<{ message?: unknown }>;\n };\n const baseError =\n typeof parsed.error === \"string\" && parsed.error.trim().length > 0\n ? parsed.error.trim()\n : null;\n const details = Array.isArray(parsed.details)\n ? parsed.details\n .map((detail) =>\n typeof detail?.message === \"string\" ? detail.message.trim() : \"\",\n )\n .filter((message) => message.length > 0)\n : [];\n if (baseError && details.length > 0) {\n return `${baseError}: ${details.join(\"; \")}`;\n }\n if (baseError) return baseError;\n } catch {\n /* plain text */\n }\n\n return text.slice(0, 200) || null;\n}\n\nfunction isRedirectResponse(response: Response): boolean {\n return response.status >= 300 && response.status < 400;\n}\n\nfunction normalizeChainAddress(\n addresses: CloudWalletAddresses | null | undefined,\n chain: CloudChainType,\n): string | null {\n const value = addresses?.[chain];\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction looksLikeChainAddress(\n address: string,\n chain: CloudChainType,\n): boolean {\n if (chain === \"evm\") {\n return /^0x[a-fA-F0-9]{40}$/.test(address);\n }\n\n return /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(address);\n}\n\nfunction resolveRequestedWalletAddress(\n data: {\n walletAddress: string | null;\n walletAddresses?: CloudWalletAddresses | null;\n },\n chain: CloudChainType,\n): string | null {\n const explicit = normalizeChainAddress(data.walletAddresses, chain);\n if (explicit) return explicit;\n if (typeof data.walletAddress !== \"string\") return null;\n\n const trimmed = data.walletAddress.trim();\n if (!trimmed) return null;\n return looksLikeChainAddress(trimmed, chain) ? trimmed : null;\n}\n\nexport class ElizaCloudClient {\n private baseUrl: string;\n private apiKey: string;\n\n constructor(baseUrl: string, apiKey: string) {\n this.baseUrl = normalizeCloudSiteUrl(baseUrl);\n this.apiKey = apiKey;\n }\n\n async listAgents(): Promise<CloudAgent[]> {\n const res = await this.request<CloudAgent[]>(\"GET\", \"/api/v1/eliza/agents\");\n return res.data ?? [];\n }\n\n async createAgent(params: CloudAgentCreateParams): Promise<CloudAgent> {\n const res = await this.request<CloudAgent>(\n \"POST\",\n \"/api/v1/eliza/agents\",\n params,\n );\n if (!res.success || !res.data)\n throw new Error(res.error ?? \"Failed to create cloud agent\");\n return res.data;\n }\n\n async getAgent(agentId: string): Promise<CloudAgent> {\n const res = await this.request<CloudAgent>(\n \"GET\",\n `/api/v1/eliza/agents/${agentId}`,\n );\n if (!res.success || !res.data)\n throw new Error(res.error ?? \"Agent not found\");\n return res.data;\n }\n\n async deleteAgent(agentId: string): Promise<void> {\n const res = await this.request<void>(\n \"DELETE\",\n `/api/v1/eliza/agents/${agentId}`,\n );\n if (!res.success) throw new Error(res.error ?? \"Failed to delete agent\");\n }\n\n async provision(agentId: string): Promise<ProvisionInfo> {\n const res = await this.request<ProvisionInfo>(\n \"POST\",\n `/api/v1/eliza/agents/${agentId}/provision`,\n );\n if (!res.success || !res.data)\n throw new Error(res.error ?? \"Failed to provision sandbox\");\n return res.data;\n }\n\n async sendMessage(\n agentId: string,\n text: string,\n roomId = \"web-chat\",\n channelType: ChatChannelType = \"DM\",\n ): Promise<string> {\n const url = `${this.baseUrl}/api/v1/eliza/agents/${agentId}/bridge`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-Api-Key\": this.apiKey },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: crypto.randomUUID(),\n method: \"message.send\",\n params: { text, roomId, channelType },\n }),\n redirect: \"manual\",\n signal: AbortSignal.timeout(60_000),\n });\n\n if (isRedirectResponse(response)) {\n throw new Error(\n \"Bridge request was redirected; redirects are not allowed\",\n );\n }\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => \"\");\n throw new Error(\n `Bridge request failed: HTTP ${response.status} ${errorText.slice(0, 200)}`,\n );\n }\n\n const rpc = (await response.json()) as {\n result?: { text?: string };\n error?: { code: number; message: string };\n };\n\n if (rpc.error) throw new Error(rpc.error.message);\n return rpc.result?.text ?? \"(no response)\";\n }\n\n async *sendMessageStream(\n agentId: string,\n text: string,\n roomId = \"web-chat\",\n channelType: ChatChannelType = \"DM\",\n ): AsyncGenerator<{ type: string; data: Record<string, unknown> }> {\n const url = `${this.baseUrl}/api/v1/eliza/agents/${agentId}/stream`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-Api-Key\": this.apiKey },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: crypto.randomUUID(),\n method: \"message.send\",\n params: { text, roomId, channelType },\n }),\n redirect: \"manual\",\n });\n\n if (isRedirectResponse(response)) {\n throw new Error(\n \"Stream request was redirected; redirects are not allowed\",\n );\n }\n\n if (!response.ok || !response.body) {\n throw new Error(`Stream request failed: HTTP ${response.status}`);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const parts = buffer.split(\"\\n\\n\");\n buffer = parts.pop() ?? \"\";\n\n for (const part of parts) {\n if (!part.trim()) continue;\n let eventType = \"message\";\n let eventData = \"\";\n\n for (const line of part.split(\"\\n\")) {\n if (line.startsWith(\"event: \")) eventType = line.slice(7).trim();\n else if (line.startsWith(\"data: \"))\n eventData += (eventData ? \"\\n\" : \"\") + line.slice(6);\n }\n\n if (eventData) {\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(eventData) as Record<string, unknown>;\n } catch {\n continue;\n }\n yield { type: eventType, data };\n }\n }\n }\n }\n\n async snapshot(agentId: string): Promise<BackupInfo> {\n const res = await this.request<BackupInfo>(\n \"POST\",\n `/api/v1/eliza/agents/${agentId}/snapshot`,\n );\n if (!res.success || !res.data)\n throw new Error(res.error ?? \"Snapshot failed\");\n return res.data;\n }\n\n async listBackups(agentId: string): Promise<BackupInfo[]> {\n const res = await this.request<BackupInfo[]>(\n \"GET\",\n `/api/v1/eliza/agents/${agentId}/backups`,\n );\n return res.data ?? [];\n }\n\n async restore(agentId: string, backupId?: string): Promise<void> {\n const res = await this.request<void>(\n \"POST\",\n `/api/v1/eliza/agents/${agentId}/restore`,\n backupId ? { backupId } : {},\n );\n if (!res.success) throw new Error(res.error ?? \"Restore failed\");\n }\n\n async heartbeat(agentId: string): Promise<boolean> {\n const url = `${this.baseUrl}/api/v1/eliza/agents/${agentId}/bridge`;\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Api-Key\": this.apiKey,\n },\n body: JSON.stringify({ jsonrpc: \"2.0\", method: \"heartbeat\" }),\n redirect: \"manual\",\n signal: AbortSignal.timeout(10_000),\n });\n if (isRedirectResponse(response)) return false;\n return response.ok;\n } catch {\n return false;\n }\n }\n\n /**\n * Fetch the cloud-side wallet descriptor for an agent.\n * Uses the standard API-key auth (X-Api-Key).\n */\n async getAgentWallet(\n agentId: string,\n chain: CloudChainType,\n ): Promise<CloudWalletDescriptor> {\n const res = await this.request<{\n agentId?: string;\n walletAddress: string | null;\n walletAddresses?: CloudWalletAddresses | null;\n walletProvider: CloudWalletProvider | null;\n walletStatus?: string;\n balance?: string | number | null;\n chain?: string;\n }>(\n \"GET\",\n `/api/v1/eliza/agents/${encodeURIComponent(agentId)}/wallet?chain=${encodeURIComponent(chain)}`,\n );\n\n if (!res.success || !res.data) {\n throw new CloudBridgeError(res.error ?? \"Failed to fetch agent wallet\");\n }\n\n const data = res.data;\n const walletAddress = resolveRequestedWalletAddress(data, chain);\n if (!walletAddress || !data.walletProvider) {\n throw new CloudBridgeError(\n `Agent has no cloud ${chain} wallet provisioned`,\n );\n }\n\n return {\n agentWalletId: data.agentId ?? agentId,\n walletAddress,\n walletProvider: data.walletProvider,\n chainType: chain,\n balance: data.balance ?? undefined,\n };\n }\n\n /**\n * Provision a cloud-custodied server wallet tied to a local client address.\n * Idempotent server-side: returns the existing wallet if one already exists\n * for the (user, clientAddress, chain) tuple.\n */\n async provisionWallet(input: {\n chainType: CloudChainType;\n clientAddress: string;\n }): Promise<{\n walletId: string;\n address: string;\n chainType: CloudChainType;\n provider: CloudWalletProvider;\n }> {\n const res = await this.request<{\n id: string;\n address: string;\n chainType: CloudChainType;\n clientAddress: string;\n provider?: CloudWalletProvider;\n }>(\"POST\", \"/api/v1/user/wallets/provision\", input);\n\n if (!res.success || !res.data) {\n throw new CloudBridgeError(res.error ?? \"Failed to provision wallet\");\n }\n\n return {\n walletId: res.data.id,\n address: res.data.address,\n chainType: res.data.chainType,\n provider: res.data.provider ?? \"privy\",\n };\n }\n\n /**\n * Execute a signed RPC envelope through the cloud custodial signer.\n *\n * Auth: body-embedded wallet signature — we MUST NOT send X-Api-Key/Bearer\n * headers here. The cloud verifies the signature against the\n * agentServerWallets.client_address registered at provision time.\n *\n * Error mapping:\n * 401 → SignatureInvalidError\n * 409 → NonceReplayError\n * 410 → SessionExpiredError\n * 5xx → CloudUnavailableError\n */\n async executeRpc(envelope: SignedRpcEnvelope): Promise<RpcResult> {\n const { correlationId, ...body } = envelope;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (correlationId) {\n headers[\"X-Correlation-Id\"] = correlationId;\n }\n\n let response: Response;\n try {\n response = await fetch(`${this.baseUrl}/api/v1/user/wallets/rpc`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n redirect: \"manual\",\n signal: AbortSignal.timeout(60_000),\n });\n } catch (err) {\n throw new CloudUnavailableError(\n `Cloud RPC network error: ${(err as Error).message}`,\n 0,\n );\n }\n\n if (isRedirectResponse(response)) {\n throw new CloudBridgeError(\n \"Cloud RPC request was redirected; redirects are not allowed\",\n response.status,\n );\n }\n\n const text = await response.text().catch(() => \"\");\n\n if (response.ok) {\n try {\n const parsed = JSON.parse(text) as ApiResponse<RpcResult>;\n if (!parsed.success || parsed.data === undefined) {\n throw new CloudBridgeError(\n parsed.error ?? \"Cloud RPC returned no data\",\n response.status,\n text,\n );\n }\n return parsed.data;\n } catch (err) {\n if (err instanceof CloudBridgeError) throw err;\n throw new CloudBridgeError(\n `Cloud RPC returned malformed JSON: ${(err as Error).message}`,\n response.status,\n text,\n );\n }\n }\n\n let errMessage = `HTTP ${response.status}`;\n try {\n const parsed = JSON.parse(text) as { error?: string };\n if (parsed.error) errMessage = parsed.error;\n } catch {\n if (text) errMessage = text.slice(0, 200);\n }\n\n if (response.status === 401) {\n throw new SignatureInvalidError(errMessage, text);\n }\n if (response.status === 409) {\n throw new NonceReplayError(errMessage, text);\n }\n if (response.status === 410) {\n throw new SessionExpiredError(errMessage, text);\n }\n if (response.status >= 500) {\n throw new CloudUnavailableError(errMessage, response.status, text);\n }\n throw new CloudBridgeError(errMessage, response.status, text);\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n ): Promise<ApiResponse<T>> {\n const headers: Record<string, string> = { \"X-Api-Key\": this.apiKey };\n if (body !== undefined) headers[\"Content-Type\"] = \"application/json\";\n\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n redirect: \"manual\",\n signal: AbortSignal.timeout(30_000),\n });\n\n if (isRedirectResponse(response)) {\n return {\n success: false,\n error: \"Cloud API request was redirected; redirects are not allowed\",\n };\n }\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n return {\n success: false,\n error: formatApiErrorBody(text) ?? `HTTP ${response.status}`,\n };\n }\n\n return (await response.json()) as ApiResponse<T>;\n }\n}\n",
|
|
58
|
+
"/**\n * `@clack/prompts`-backed implementation of `CloudSetupObserver`.\n *\n * Used by the CLI first-time-setup flow. Wraps a lazily-loaded clack module\n * (so packaged desktop builds that never run interactive setup don't\n * pay the dep cost) and renders every observer event as a spinner update,\n * `log.info` / `log.warn`, or `confirm` / `select` prompt.\n *\n * @module cloud/clack-observer\n */\nimport { logger } from \"@elizaos/core\";\nimport type {\n CloudSetupObserver,\n ConfirmPrompt,\n ProvisionSuccessInfo,\n SelectChoicePrompt,\n} from \"./setup-observer.js\";\n\n/** Lazy-loaded @clack/prompts module type. */\ntype ClackModule = typeof import(\"@clack/prompts\");\n\ninterface ClackSpinner {\n start(message?: string): void;\n stop(message?: string): void;\n message(message?: string): void;\n}\n\n/**\n * Observer that drives a clack CLI session. One instance per setup run\n * — internal spinner state is reused across the auth + provisioning phases\n * so we don't stack overlapping spinners.\n */\nexport class ClackObserver implements CloudSetupObserver {\n private spinner: ClackSpinner | null = null;\n\n constructor(private readonly clack: ClackModule) {}\n\n // ── Spinner helpers ──────────────────────────────────────────────────\n private ensureSpinner(): ClackSpinner {\n if (!this.spinner) {\n this.spinner = this.clack.spinner();\n }\n return this.spinner;\n }\n\n private stopSpinner(message: string): void {\n if (this.spinner) {\n this.spinner.stop(message);\n this.spinner = null;\n } else {\n // No active spinner — render the line as a log.info so the\n // message isn't lost.\n this.clack.log.info(message);\n }\n }\n\n // ── Availability ─────────────────────────────────────────────────────\n onAvailabilityChecked(result: { ok: boolean; reason?: string }): void {\n if (!result.ok && result.reason) {\n this.clack.log.warn(result.reason);\n }\n }\n\n // ── Auth ─────────────────────────────────────────────────────────────\n onAuthStart(loginUrl: string): void {\n const spinner = this.ensureSpinner();\n spinner.start(\"Connecting to Eliza Cloud...\");\n // The auth flow's first callback fires when we have the login URL.\n spinner.stop(\"Opening your browser to log in...\");\n this.spinner = null;\n this.clack.log.info(`If the browser didn't open, visit:\\n ${loginUrl}`);\n const polling = this.ensureSpinner();\n polling.start(\"Waiting for login in browser...\");\n }\n\n onAuthBrowserOpenFailed(loginUrl: string, error: Error): void {\n // Previously swallowed at debug-level. Now visible: the user may have\n // missed the URL printed by onAuthStart, so re-emit it here with the\n // explicit \"couldn't open browser\" framing.\n this.clack.log.warn(\n `Could not open browser automatically (${error.message}). Visit this URL to continue:\\n ${loginUrl}`,\n );\n }\n\n onAuthPollStatus(status: string): void {\n if (status === \"pending\") {\n this.ensureSpinner().message(\"Waiting for login in browser...\");\n }\n }\n\n onAuthSuccess(): void {\n this.stopSpinner(\"✓ Logged in to Eliza Cloud!\");\n }\n\n onAuthFailure(message: string): void {\n this.stopSpinner(message);\n }\n\n // ── Provisioning ─────────────────────────────────────────────────────\n onProvisionStart(_agentName: string): void {\n const spinner = this.ensureSpinner();\n spinner.start(\"Creating your cloud agent...\");\n }\n\n onProvisionStatus(status: string): void {\n const spinner = this.ensureSpinner();\n switch (status) {\n case \"created\":\n spinner.message(\"Agent created! Provisioning cloud environment...\");\n break;\n case \"queued\":\n spinner.message(\"Queued — waiting for available slot...\");\n break;\n case \"provisioning\":\n spinner.message(\"Provisioning cloud environment...\");\n break;\n default:\n spinner.message(`Status: ${status}...`);\n }\n }\n\n onProvisionTimeout(_agentId: string, lastStatus: string): void {\n this.stopSpinner(\n `Provisioning timed out (last status: ${lastStatus}). The agent may still be starting up.`,\n );\n }\n\n onProvisionFailure(reason: string): void {\n this.stopSpinner(reason);\n }\n\n onProvisionSuccess(result: ProvisionSuccessInfo): void {\n this.stopSpinner(`☁️ Cloud agent \"${result.agentId}\" is running!`);\n }\n\n // ── Generic ──────────────────────────────────────────────────────────\n onNotice(message: string): void {\n this.clack.log.warn(message);\n }\n\n onFatalError(error: Error, context: string): void {\n logger.error(`[cloud-setup] ${context}: ${error.message}`);\n this.clack.log.error(`${context}: ${error.message}`);\n }\n\n // ── Prompts ──────────────────────────────────────────────────────────\n async confirm(prompt: ConfirmPrompt): Promise<boolean | null> {\n const args: {\n message: string;\n initialValue?: boolean;\n active?: string;\n inactive?: string;\n } = { message: prompt.message };\n\n if (prompt.defaultValue !== undefined) args.initialValue = prompt.defaultValue;\n if (prompt.activeLabel !== undefined) args.active = prompt.activeLabel;\n if (prompt.inactiveLabel !== undefined) args.inactive = prompt.inactiveLabel;\n\n const result = await this.clack.confirm(args);\n if (this.clack.isCancel(result)) return null;\n return result;\n }\n\n async selectChoice<T extends string>(\n prompt: SelectChoicePrompt<T>,\n ): Promise<T | null> {\n // Clack's `Option<Value>` is a conditional type that for `Value extends\n // Primitive` makes `label` optional. TS can't narrow the conditional\n // for an unresolved generic `T extends string`, so we describe the\n // option shape via Parameters of clack's `select` and let inference\n // pick it up. No `as unknown as` escape — the parameter type IS the\n // right type, we just have to address it positionally.\n type SelectOpts = Parameters<typeof this.clack.select<T>>[0];\n const options = prompt.options.map((option) => {\n const out = {\n label: option.label,\n value: option.value,\n ...(option.hint !== undefined ? { hint: option.hint } : {}),\n };\n return out;\n }) as SelectOpts[\"options\"];\n const result = await this.clack.select<T>({\n message: prompt.message,\n options,\n });\n if (this.clack.isCancel(result)) return null;\n return result;\n }\n}\n",
|
|
59
|
+
"/**\n * Silent `CloudSetupObserver` for tests and headless runs.\n *\n * - All event methods intentionally ignore their inputs.\n * - All prompt methods resolve to `null` (i.e. \"user cancelled\"), which\n * lets the orchestrator exercise its cancel branches without surfacing\n * any UI.\n *\n * Tests that want to assert observer calls should use a capturing\n * observer instead.\n *\n * @module cloud/null-observer\n */\nimport type {\n CloudSetupObserver,\n ConfirmPrompt,\n ProvisionSuccessInfo,\n SelectChoicePrompt,\n} from \"./setup-observer.js\";\n\nexport class NullCloudSetupObserver implements CloudSetupObserver {\n onAvailabilityChecked(_result: { ok: boolean; reason?: string }): void {}\n onAuthStart(_loginUrl: string): void {}\n onAuthBrowserOpenFailed(_loginUrl: string, _error: Error): void {}\n onAuthPollStatus(_status: string): void {}\n onAuthSuccess(): void {}\n onAuthFailure(_message: string): void {}\n onProvisionStart(_agentName: string): void {}\n onProvisionStatus(_status: string): void {}\n onProvisionTimeout(_agentId: string, _lastStatus: string): void {}\n onProvisionFailure(_reason: string): void {}\n onProvisionSuccess(_result: ProvisionSuccessInfo): void {}\n onNotice(_message: string): void {}\n onFatalError(_error: Error, _context: string): void {}\n\n async confirm(_prompt: ConfirmPrompt): Promise<boolean | null> {\n return null;\n }\n\n async selectChoice<T extends string>(\n _prompt: SelectChoicePrompt<T>,\n ): Promise<T | null> {\n return null;\n }\n}\n",
|
|
60
|
+
"/**\n * Top-level orchestrator for cloud integration.\n * Manages client, proxy, backup scheduler, and connection monitor lifecycle.\n */\n\nimport { logger } from \"@elizaos/core\";\nimport type { CloudConfig } from \"../lib/config-like.js\";\nimport { BackupScheduler } from \"./backup.js\";\nimport { normalizeCloudSiteUrl } from \"./base-url.js\";\nimport { ElizaCloudClient } from \"./bridge-client.js\";\nimport { CloudRuntimeProxy } from \"./cloud-proxy.js\";\nimport { ConnectionMonitor } from \"./reconnect.js\";\nimport { validateCloudBaseUrl } from \"./validate-url.js\";\n\nexport type CloudConnectionStatus =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"reconnecting\"\n | \"error\";\n\nexport interface CloudManagerCallbacks {\n onStatusChange?: (status: CloudConnectionStatus) => void;\n}\n\nexport class CloudManager {\n private client: ElizaCloudClient | null = null;\n private proxy: CloudRuntimeProxy | null = null;\n private backupScheduler: BackupScheduler | null = null;\n private connectionMonitor: ConnectionMonitor | null = null;\n private status: CloudConnectionStatus = \"disconnected\";\n private activeAgentId: string | null = null;\n\n constructor(\n private cloudConfig: CloudConfig,\n private callbacks: CloudManagerCallbacks = {},\n ) {}\n\n async init(): Promise<void> {\n const rawUrl = normalizeCloudSiteUrl(this.cloudConfig.baseUrl);\n const apiKey = this.cloudConfig.apiKey;\n if (!apiKey)\n throw new Error(\n \"Cloud API key is not configured. Run cloud login first.\",\n );\n\n const urlError = await validateCloudBaseUrl(rawUrl);\n if (urlError) {\n throw new Error(urlError);\n }\n\n // rawUrl is already normalized above — don't re-normalize, which would\n // re-read ELIZAOS_CLOUD_BASE_URL and could produce a different URL than\n // the one we just validated.\n this.client = new ElizaCloudClient(rawUrl, apiKey);\n logger.info(`[cloud-manager] Client initialised (baseUrl=${rawUrl})`);\n }\n\n async connect(agentId: string): Promise<CloudRuntimeProxy> {\n if (!this.client) await this.init();\n if (!this.client) throw new Error(\"Cloud client failed to initialise\");\n\n this.setStatus(\"connecting\");\n this.activeAgentId = agentId;\n\n try {\n await this.client.provision(agentId);\n const agent = await this.client.getAgent(agentId);\n\n this.proxy = new CloudRuntimeProxy(this.client, agentId, agent.agentName);\n\n this.backupScheduler = new BackupScheduler(\n this.client,\n agentId,\n this.cloudConfig.backup?.autoBackupIntervalMs ?? 60_000,\n );\n this.backupScheduler.start();\n\n this.connectionMonitor = new ConnectionMonitor(\n this.client,\n agentId,\n {\n onDisconnect: () => this.setStatus(\"reconnecting\"),\n onReconnect: () => this.setStatus(\"connected\"),\n onStatusChange: (s) => {\n if (s === \"connected\") this.setStatus(\"connected\");\n else if (s === \"reconnecting\") this.setStatus(\"reconnecting\");\n else this.setStatus(\"error\");\n },\n },\n this.cloudConfig.bridge?.heartbeatIntervalMs ?? 30_000,\n );\n this.connectionMonitor.start();\n\n this.setStatus(\"connected\");\n logger.info(\n `[cloud-manager] Connected to cloud agent (agentId=${agentId}, agentName=${agent.agentName})`,\n );\n return this.proxy;\n } catch (err) {\n this.setStatus(\"error\");\n if (this.backupScheduler) {\n this.backupScheduler.stop();\n this.backupScheduler = null;\n }\n if (this.connectionMonitor) {\n this.connectionMonitor.stop();\n this.connectionMonitor = null;\n }\n this.proxy = null;\n this.activeAgentId = null;\n this.setStatus(\"disconnected\");\n throw err;\n }\n }\n\n async disconnect(): Promise<void> {\n if (this.backupScheduler) {\n await this.backupScheduler.finalSnapshot();\n this.backupScheduler.stop();\n this.backupScheduler = null;\n }\n if (this.connectionMonitor) {\n this.connectionMonitor.stop();\n this.connectionMonitor = null;\n }\n this.proxy = null;\n this.activeAgentId = null;\n this.setStatus(\"disconnected\");\n }\n\n async replaceApiKey(apiKey: string): Promise<void> {\n await this.disconnect();\n this.cloudConfig = {\n ...this.cloudConfig,\n apiKey,\n };\n this.client = null;\n await this.init();\n }\n\n getProxy(): CloudRuntimeProxy | null {\n return this.proxy;\n }\n getClient(): ElizaCloudClient | null {\n return this.client;\n }\n getActiveAgentId(): string | null {\n return this.activeAgentId;\n }\n getStatus(): CloudConnectionStatus {\n return this.status;\n }\n isEnabled(): boolean {\n return Boolean(this.cloudConfig.enabled && this.cloudConfig.apiKey);\n }\n\n private setStatus(status: CloudConnectionStatus): void {\n if (this.status === status) return;\n this.status = status;\n this.callbacks.onStatusChange?.(status);\n }\n}\n",
|
|
61
|
+
"/**\n * Periodic state backup scheduler for cloud sandboxes.\n * Default interval: 60s. Configurable via cloud.backup.autoBackupIntervalMs.\n */\n\nimport { logger } from \"@elizaos/core\";\nimport type { ElizaCloudClient } from \"./bridge-client.js\";\n\nexport class BackupScheduler {\n private timer: ReturnType<typeof setInterval> | null = null;\n private running = false;\n\n constructor(\n private client: ElizaCloudClient,\n private agentId: string,\n private intervalMs: number = 60_000,\n ) {}\n\n start(): void {\n if (this.timer) return;\n this.running = true;\n this.timer = setInterval(() => {\n this.client.snapshot(this.agentId).catch((err) => {\n logger.warn(`[cloud-backup] Auto-backup failed: ${String(err)}`);\n });\n }, this.intervalMs);\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n this.running = false;\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n async finalSnapshot(): Promise<void> {\n await this.client.snapshot(this.agentId).catch((err) => {\n logger.warn(`[cloud-backup] Final snapshot failed: ${String(err)}`);\n });\n }\n}\n",
|
|
62
|
+
"/**\n * Drop-in replacement for a local AgentRuntime when running in cloud mode.\n * Routes chat/status calls through the ElizaCloudClient to the remote sandbox.\n */\n\nimport type { ChatChannelType, ElizaCloudClient } from \"./bridge-client.js\";\n\nexport class CloudRuntimeProxy {\n constructor(\n private client: ElizaCloudClient,\n private agentId: string,\n private _agentName: string,\n ) {}\n\n get agentName(): string {\n return this._agentName;\n }\n\n async handleChatMessage(\n text: string,\n roomId = \"web-chat\",\n channelType: ChatChannelType = \"DM\",\n ): Promise<string> {\n return this.client.sendMessage(this.agentId, text, roomId, channelType);\n }\n\n async *handleChatMessageStream(\n text: string,\n roomId = \"web-chat\",\n channelType: ChatChannelType = \"DM\",\n ): AsyncGenerator<string> {\n for await (const event of this.client.sendMessageStream(\n this.agentId,\n text,\n roomId,\n channelType,\n )) {\n if (event.type === \"chunk\" && typeof event.data.text === \"string\") {\n yield event.data.text;\n }\n }\n }\n\n async getStatus(): Promise<{ state: string; agentName: string }> {\n const agent = await this.client.getAgent(this.agentId);\n return { state: agent.status, agentName: agent.agentName };\n }\n\n async isAlive(): Promise<boolean> {\n return this.client.heartbeat(this.agentId).catch(() => false);\n }\n}\n",
|
|
63
|
+
"/**\n * Heartbeat monitor with auto-reconnect via exponential backoff.\n */\n\nimport { logger } from \"@elizaos/core\";\nimport type { ElizaCloudClient } from \"./bridge-client.js\";\n\nexport interface ConnectionMonitorCallbacks {\n onDisconnect: () => void;\n onReconnect: () => void;\n onStatusChange?: (\n status: \"connected\" | \"reconnecting\" | \"disconnected\",\n ) => void;\n}\n\nexport class ConnectionMonitor {\n private timer: ReturnType<typeof setInterval> | null = null;\n private consecutiveFailures = 0;\n private reconnecting = false;\n\n constructor(\n private client: ElizaCloudClient,\n private agentId: string,\n private callbacks: ConnectionMonitorCallbacks,\n private heartbeatIntervalMs: number = 30_000,\n private maxFailures: number = 3,\n ) {}\n\n start(): void {\n if (this.timer) return;\n logger.info(\n `[cloud-monitor] Starting connection monitor (interval: ${this.heartbeatIntervalMs}ms, maxFailures: ${this.maxFailures})`,\n );\n this.consecutiveFailures = 0;\n this.timer = setInterval(() => {\n this.tick();\n }, this.heartbeatIntervalMs);\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n this.consecutiveFailures = 0;\n this.reconnecting = false;\n logger.info(\"[cloud-monitor] Connection monitor stopped\");\n }\n\n isMonitoring(): boolean {\n return this.timer !== null;\n }\n\n private async tick(): Promise<void> {\n if (this.reconnecting) return;\n\n const alive = await this.client.heartbeat(this.agentId).catch(() => false);\n\n if (alive) {\n if (this.consecutiveFailures > 0) {\n this.consecutiveFailures = 0;\n this.callbacks.onStatusChange?.(\"connected\");\n }\n return;\n }\n\n this.consecutiveFailures++;\n logger.warn(\n `[cloud-monitor] Heartbeat failed (${this.consecutiveFailures}/${this.maxFailures})`,\n );\n\n if (this.consecutiveFailures >= this.maxFailures) {\n // Don't emit \"disconnected\" here — attemptReconnect() will emit\n // \"reconnecting\" first, and only emits \"disconnected\" if all\n // retry attempts fail. This avoids a misleading disconnected→\n // reconnecting flicker for callers.\n this.callbacks.onDisconnect();\n await this.attemptReconnect();\n }\n }\n\n private async attemptReconnect(): Promise<void> {\n this.reconnecting = true;\n this.callbacks.onStatusChange?.(\"reconnecting\");\n\n let delay = 3_000;\n for (let attempt = 1; attempt <= 10; attempt++) {\n logger.info(`[cloud-monitor] Reconnect attempt ${attempt}/10...`);\n const ok = await this.client\n .provision(this.agentId)\n .then(() => true)\n .catch(() => false);\n\n if (ok) {\n logger.info(\"[cloud-monitor] Reconnection successful\");\n this.consecutiveFailures = 0;\n this.reconnecting = false;\n this.callbacks.onStatusChange?.(\"connected\");\n this.callbacks.onReconnect();\n return;\n }\n\n await new Promise((r) => setTimeout(r, delay));\n delay = Math.min(delay * 2, 60_000);\n }\n\n logger.error(\"[cloud-monitor] Failed to reconnect after 10 attempts\");\n this.reconnecting = false;\n this.callbacks.onStatusChange?.(\"disconnected\");\n }\n}\n",
|
|
64
|
+
"/**\n * Cloud TTS helpers — proxy to Eliza Cloud (`elizacloud.ai`).\n *\n * Pure / config-driven helpers (TTS API key resolution, base URL resolution,\n * voice / model id normalization, compat header mirroring) live in\n * `@elizaos/shared/elizacloud/server-cloud-tts` so host-layer packages can\n * resolve cloud TTS configuration without reverse-importing this plugin.\n *\n * The HTTP request handler (`handleCloudTtsPreviewRoute`) stays here because\n * it wires together the runtime route system.\n */\nimport type http from \"node:http\";\nimport { sanitizeSpeechText } from \"@elizaos/core\";\nimport {\n _internalResolveCloudApiKey,\n ELIZA_CLOUD_TTS_MAX_TEXT_CHARS,\n resolveCloudProxyTtsModel,\n resolveCloudTtsCandidateUrls,\n resolveElizaCloudTtsVoiceId,\n shouldRetryCloudTtsUpstream,\n ttsDebug,\n ttsDebugTextPreview,\n} from \"@elizaos/shared\";\n\nexport {\n __resetCloudBaseUrlCache,\n ELIZA_CLOUD_TTS_MAX_TEXT_CHARS,\n ensureCloudTtsApiKeyAlias,\n mirrorCompatHeaders,\n normalizeElizaCloudTtsModelId,\n resolveCloudProxyTtsModel,\n resolveCloudTtsBaseUrl,\n resolveCloudTtsCandidateUrls,\n resolveElevenLabsApiKeyForCloudMode,\n resolveElizaCloudTtsVoiceId,\n shouldRetryCloudTtsUpstream,\n} from \"@elizaos/shared\";\n\n/** Browser → API correlation (never forwarded to Eliza Cloud). */\nexport function readTtsDebugClientHeaders(\n req: Pick<http.IncomingMessage, \"headers\">,\n): {\n messageId?: string;\n clipSegment?: string;\n hearingFull?: string;\n} {\n const pick = (name: string): string | undefined => {\n const raw = req.headers[name];\n if (raw == null) return undefined;\n const v = Array.isArray(raw) ? raw[0] : raw;\n return typeof v === \"string\" && v.trim() ? v.trim() : undefined;\n };\n const decode = (enc: string | undefined): string | undefined => {\n if (!enc) return undefined;\n try {\n return decodeURIComponent(enc);\n } catch {\n return enc;\n }\n };\n return {\n messageId: decode(pick(\"x-elizaos-tts-message-id\")),\n clipSegment: decode(pick(\"x-elizaos-tts-clip-segment\")),\n hearingFull: decode(pick(\"x-elizaos-tts-full-preview\")),\n };\n}\n\nfunction ttsClientDbgFields(\n hdr: ReturnType<typeof readTtsDebugClientHeaders>,\n): Record<string, string> {\n const o: Record<string, string> = {};\n if (hdr.messageId) o.messageId = hdr.messageId;\n if (hdr.clipSegment) o.clipSegment = hdr.clipSegment;\n if (hdr.hearingFull) o.hearingFull = hdr.hearingFull;\n return o;\n}\n\nfunction pickBodyString(\n body: Record<string, unknown>,\n camel: string,\n snake: string,\n): unknown {\n const a = body[camel];\n if (typeof a === \"string\" && a.trim()) return a;\n const b = body[snake];\n if (typeof b === \"string\" && b.trim()) return b;\n return undefined;\n}\n\nasync function readRawRequestBody(req: http.IncomingMessage): Promise<Buffer> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n }\n return Buffer.concat(chunks);\n}\n\nfunction sendJsonResponse(\n res: http.ServerResponse,\n status: number,\n body: unknown,\n): void {\n if (res.headersSent) return;\n res.statusCode = status;\n res.setHeader(\"content-type\", \"application/json; charset=utf-8\");\n res.end(JSON.stringify(body));\n}\n\nfunction sendJsonErrorResponse(\n res: http.ServerResponse,\n status: number,\n message: string,\n): void {\n sendJsonResponse(res, status, { error: message });\n}\n\nfunction forwardCloudTtsUpstreamError(\n res: http.ServerResponse,\n status: number,\n bodyText: string,\n): void {\n if (res.headersSent) return;\n const trimmed = bodyText.trim();\n if (\n (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) ||\n (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\"))\n ) {\n try {\n const parsed: unknown = JSON.parse(trimmed);\n sendJsonResponse(res, status, parsed);\n return;\n } catch {\n /* fall through */\n }\n }\n res.statusCode = status;\n res.setHeader(\"content-type\", \"application/json; charset=utf-8\");\n res.end(\n JSON.stringify({ error: trimmed || \"Eliza Cloud TTS request failed\" }),\n );\n}\n\nexport async function handleCloudTtsPreviewRoute(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n): Promise<boolean> {\n const clientTtsDbg = readTtsDebugClientHeaders(req);\n const dbgExtra = ttsClientDbgFields(clientTtsDbg);\n\n const cloudApiKey = _internalResolveCloudApiKey();\n if (!cloudApiKey) {\n ttsDebug(\"server:cloud-tts:reject\", {\n reason: \"no_api_key\",\n ...dbgExtra,\n });\n sendJsonErrorResponse(\n res,\n 401,\n \"Eliza Cloud is not connected. Connect your Eliza Cloud account first.\",\n );\n return true;\n }\n\n const rawBody = await readRawRequestBody(req);\n let body: Record<string, unknown>;\n try {\n body = JSON.parse(rawBody.toString(\"utf8\")) as Record<string, unknown>;\n } catch {\n sendJsonErrorResponse(res, 400, \"Invalid JSON request body\");\n return true;\n }\n\n const text = sanitizeSpeechText(\n typeof body.text === \"string\" ? body.text : \"\",\n );\n if (!text) {\n sendJsonErrorResponse(res, 400, \"Missing text\");\n return true;\n }\n\n if (text.length > ELIZA_CLOUD_TTS_MAX_TEXT_CHARS) {\n sendJsonErrorResponse(\n res,\n 400,\n `Text too long. Maximum length is ${ELIZA_CLOUD_TTS_MAX_TEXT_CHARS} characters`,\n );\n return true;\n }\n\n const cloudModel = resolveCloudProxyTtsModel(\n pickBodyString(body, \"modelId\", \"model_id\"),\n );\n const cloudVoice = resolveElizaCloudTtsVoiceId(\n pickBodyString(body, \"voiceId\", \"voice_id\"),\n );\n const cloudUrls = resolveCloudTtsCandidateUrls();\n\n const ttsPreview = ttsDebugTextPreview(text);\n ttsDebug(\"server:cloud-tts:proxy\", {\n textChars: text.length,\n preview: ttsPreview,\n modelId: cloudModel,\n voiceId: cloudVoice,\n urlCandidates: cloudUrls.length,\n ...dbgExtra,\n });\n\n try {\n let lastStatus = 0;\n let lastDetails = \"unknown error\";\n let cloudResponse: Response | null = null;\n for (let i = 0; i < cloudUrls.length; i++) {\n const cloudUrl = cloudUrls[i];\n if (cloudUrl === undefined) {\n continue;\n }\n const attempt = await fetch(cloudUrl, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${cloudApiKey}`,\n \"x-api-key\": cloudApiKey,\n \"Content-Type\": \"application/json\",\n Accept: \"audio/mpeg\",\n },\n body: JSON.stringify({\n text,\n voiceId: cloudVoice,\n modelId: cloudModel,\n }),\n });\n\n if (attempt.ok) {\n cloudResponse = attempt;\n ttsDebug(\"server:cloud-tts:upstream-ok\", {\n urlIndex: i,\n status: attempt.status,\n preview: ttsPreview,\n ...dbgExtra,\n });\n break;\n }\n\n lastStatus = attempt.status;\n lastDetails = await attempt.text().catch(() => \"unknown error\");\n ttsDebug(\"server:cloud-tts:upstream-retry\", {\n urlIndex: i,\n status: attempt.status,\n preview: ttsPreview,\n ...dbgExtra,\n });\n\n const hasMoreCandidates = i < cloudUrls.length - 1;\n if (!hasMoreCandidates || !shouldRetryCloudTtsUpstream(attempt.status)) {\n break;\n }\n }\n if (!cloudResponse) {\n ttsDebug(\"server:cloud-tts:reject\", {\n reason: \"upstream_failed\",\n lastStatus,\n preview: ttsPreview,\n ...dbgExtra,\n });\n if (\n lastStatus === 400 ||\n lastStatus === 401 ||\n lastStatus === 402 ||\n lastStatus === 403 ||\n lastStatus === 429\n ) {\n forwardCloudTtsUpstreamError(res, lastStatus, lastDetails);\n return true;\n }\n sendJsonErrorResponse(\n res,\n 502,\n `Eliza Cloud TTS failed (${lastStatus || 502}): ${lastDetails}`,\n );\n return true;\n }\n\n const audioBuffer = Buffer.from(await cloudResponse.arrayBuffer());\n ttsDebug(\"server:cloud-tts:success\", {\n bytes: audioBuffer.length,\n preview: ttsPreview,\n ...dbgExtra,\n });\n res.statusCode = 200;\n res.setHeader(\"Content-Type\", \"audio/mpeg\");\n res.setHeader(\"Cache-Control\", \"no-store\");\n res.end(audioBuffer);\n return true;\n } catch (err) {\n sendJsonErrorResponse(\n res,\n 502,\n `Eliza Cloud TTS request failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n return true;\n }\n}\n",
|
|
65
|
+
"/**\n * Cloud-routed ElevenLabs voice catalog.\n *\n * The Eliza Cloud SDK exposes two voice-listing endpoints:\n * - `GET /api/elevenlabs/voices` — ElevenLabs **premade** voices (shared).\n * - `GET /api/elevenlabs/voices/user` — voices cloned / saved by the\n * authenticated user.\n *\n * We expose the union of both to consumers so the dashboard, the agent, and\n * any other client see the full set of voices the user can actually use.\n *\n * Results are cached in-memory for {@link CACHE_TTL_MS} (1 hour). The cache\n * is keyed by the runtime's cloud base URL + API key so multi-tenant or\n * test-isolated runtimes don't share entries. On any fetch error we return\n * a normalized empty list rather than throwing — callers can decide whether\n * to surface a UI hint.\n */\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport { isCloudConnected, logger, toRuntimeSettings } from \"@elizaos/core\";\nimport { getApiKey, getBaseURL } from \"./utils/config\";\nimport { createElizaCloudClient } from \"./utils/sdk-client\";\n\nconst CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour\n\nexport interface CloudVoiceCatalogEntry {\n id: string;\n name: string;\n gender?: string;\n preview?: string;\n category?: string;\n language?: string;\n}\n\n/**\n * Narrow interface the catalog actually uses. Lets tests substitute a\n * fake without rebuilding the full SDK surface.\n */\nexport interface CloudVoiceClient {\n routes: {\n getApiElevenlabsVoices<T = unknown>(options?: {\n query?: Record<string, unknown>;\n }): Promise<T>;\n getApiElevenlabsVoicesUser<T = unknown>(options?: {\n query?: Record<string, unknown>;\n }): Promise<T>;\n };\n}\n\ntype ClientFactory = (runtime: IAgentRuntime) => CloudVoiceClient;\n\nlet clientFactory: ClientFactory = (runtime) =>\n createElizaCloudClient(runtime) as unknown as CloudVoiceClient;\n\n/**\n * Test seam: substitute the SDK client factory. Pass `null` to reset to\n * the real `createElizaCloudClient`. Production code should never call\n * this.\n */\nexport function setCloudVoiceClientFactoryForTesting(\n factory: ClientFactory | null,\n): void {\n if (factory === null) {\n clientFactory = (runtime) =>\n createElizaCloudClient(runtime) as unknown as CloudVoiceClient;\n } else {\n clientFactory = factory;\n }\n}\n\ninterface CacheEntry {\n fetchedAt: number;\n voices: CloudVoiceCatalogEntry[];\n}\n\n/** Module-level cache. Keyed by `${baseUrl}|${apiKey}`. */\nconst cache = new Map<string, CacheEntry>();\n\n/**\n * Test seam: drop the in-memory cache. Production code should never call\n * this; the TTL handles eviction by itself.\n */\nexport function resetCloudVoiceCatalogCacheForTesting(): void {\n cache.clear();\n}\n\nfunction cacheKeyFor(runtime: IAgentRuntime): string {\n const baseUrl = getBaseURL(runtime) || \"\";\n const apiKey = getApiKey(runtime) || \"\";\n return `${baseUrl}|${apiKey}`;\n}\n\nfunction pickString(\n record: Record<string, unknown>,\n key: string,\n): string | undefined {\n const v = record[key];\n return typeof v === \"string\" && v.trim() ? v.trim() : undefined;\n}\n\nfunction pickStringFromAny(\n record: Record<string, unknown>,\n ...keys: string[]\n): string | undefined {\n for (const key of keys) {\n const v = pickString(record, key);\n if (v) return v;\n }\n return undefined;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n}\n\n/**\n * Best-effort normalizer for the heterogeneous shapes the upstream returns.\n *\n * ElevenLabs's premade voices include `labels: { gender, accent, ... }`,\n * `preview_url`, `category`. User-cloned voices look very similar but may\n * omit some fields. We accept any shape that has at least a `voice_id`\n * (or `id`) and produce a uniform record.\n */\nfunction normalizeVoiceEntry(raw: unknown): CloudVoiceCatalogEntry | null {\n const record = asRecord(raw);\n if (!record) return null;\n const id = pickStringFromAny(record, \"voice_id\", \"voiceId\", \"id\");\n if (!id) return null;\n\n const name =\n pickStringFromAny(record, \"name\", \"display_name\", \"displayName\") ?? id;\n const preview = pickStringFromAny(\n record,\n \"preview_url\",\n \"previewUrl\",\n \"preview\",\n );\n const category = pickStringFromAny(record, \"category\");\n\n // `labels` is the canonical ElevenLabs metadata block.\n const labels = asRecord(record.labels);\n const gender =\n pickStringFromAny(record, \"gender\") ??\n (labels ? pickStringFromAny(labels, \"gender\") : undefined);\n const language =\n pickStringFromAny(record, \"language\", \"language_code\", \"languageCode\") ??\n (labels\n ? pickStringFromAny(labels, \"language\", \"language_code\", \"languageCode\")\n : undefined);\n\n return {\n id,\n name,\n ...(gender ? { gender } : {}),\n ...(preview ? { preview } : {}),\n ...(category ? { category } : {}),\n ...(language ? { language } : {}),\n };\n}\n\n/**\n * Some endpoints return `{ voices: [...] }`, others return a bare array.\n * Accept both.\n */\nfunction extractVoiceArray(payload: unknown): unknown[] {\n if (Array.isArray(payload)) return payload;\n const record = asRecord(payload);\n if (!record) return [];\n for (const key of [\"voices\", \"data\", \"items\", \"results\"]) {\n const v = record[key];\n if (Array.isArray(v)) return v;\n }\n return [];\n}\n\nfunction dedupeById(entries: CloudVoiceCatalogEntry[]): CloudVoiceCatalogEntry[] {\n const seen = new Set<string>();\n const out: CloudVoiceCatalogEntry[] = [];\n for (const entry of entries) {\n if (seen.has(entry.id)) continue;\n seen.add(entry.id);\n out.push(entry);\n }\n return out;\n}\n\nasync function fetchEndpointVoices(\n runtime: IAgentRuntime,\n endpoint: \"premade\" | \"user\",\n): Promise<CloudVoiceCatalogEntry[]> {\n try {\n const client = clientFactory(runtime);\n const payload =\n endpoint === \"premade\"\n ? await client.routes.getApiElevenlabsVoices<unknown>()\n : await client.routes.getApiElevenlabsVoicesUser<unknown>();\n const raw = extractVoiceArray(payload);\n const normalized: CloudVoiceCatalogEntry[] = [];\n for (const entry of raw) {\n const v = normalizeVoiceEntry(entry);\n if (v) normalized.push(v);\n }\n return normalized;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n logger.debug(\n `[ELIZAOS_CLOUD] voice catalog ${endpoint} fetch failed: ${message}`,\n );\n return [];\n }\n}\n\n/**\n * Fetch the user-visible voice catalog from Eliza Cloud (premade + cloned).\n *\n * Returns an empty array when:\n * - Eliza Cloud isn't connected (no API key / not enabled).\n * - Both upstream endpoints fail (network, auth, etc.).\n *\n * Results are cached for {@link CACHE_TTL_MS} per runtime. Subsequent calls\n * within that window are served from memory.\n */\nexport async function fetchCloudVoiceCatalog(\n runtime: IAgentRuntime,\n): Promise<CloudVoiceCatalogEntry[]> {\n if (!isCloudConnected(toRuntimeSettings(runtime))) {\n return [];\n }\n const key = cacheKeyFor(runtime);\n const now = Date.now();\n const cached = cache.get(key);\n if (cached && now - cached.fetchedAt < CACHE_TTL_MS) {\n return cached.voices;\n }\n\n const [premade, user] = await Promise.all([\n fetchEndpointVoices(runtime, \"premade\"),\n fetchEndpointVoices(runtime, \"user\"),\n ]);\n\n // User voices first so cloned voices appear before the shared premade\n // list — most users care about their own clones.\n const merged = dedupeById([...user, ...premade]);\n cache.set(key, { fetchedAt: now, voices: merged });\n return merged;\n}\n",
|
|
66
|
+
"import { logger } from \"@elizaos/core\";\nimport {\n PaymentRequiredError,\n parseX402Response,\n} from \"./x402-payment-handler.js\";\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport class DuffelConfigError extends Error {\n readonly code = \"DUFFEL_NOT_CONFIGURED\" as const;\n constructor(message: string) {\n super(message);\n this.name = \"DuffelConfigError\";\n }\n}\n\n/** Direct mode hits api.duffel.com with the user's own DUFFEL_API_KEY.\n * Cloud mode hits the local Eliza Cloud relay which performs the upstream\n * Duffel call, applies creator markup, and meters against the user's\n * Cloud credit balance. Cloud mode is the default. */\nexport type DuffelMode = \"cloud\" | \"direct\";\n\nexport interface DuffelConfig {\n mode: DuffelMode;\n /** Required when mode === \"direct\". */\n apiKey: string | null;\n /** Required when mode === \"cloud\". Local Eliza agent API base, e.g.\n * http://127.0.0.1:31337. The relay path is appended internally. */\n cloudRelayBaseUrl: string | null;\n}\n\nconst DUFFEL_API_BASE_DEFAULT = \"https://api.duffel.com\";\nconst DUFFEL_API_VERSION = \"v2\";\nconst DEFAULT_CLOUD_RELAY_BASE = \"http://127.0.0.1:31337\";\n\ninterface DuffelTelemetrySpan {\n success(meta?: Record<string, unknown>): void;\n failure(meta?: Record<string, unknown>): void;\n}\n\nconst NOOP_DUFFEL_SPAN: DuffelTelemetrySpan = {\n success() {},\n failure() {},\n};\n\n/** Honour the mockoon redirect (or any explicit `LIFEOPS_DUFFEL_API_BASE`\n * override) so direct-mode tests can swap Duffel for a local mock. */\nfunction getDuffelApiBase(): string {\n return process.env.LIFEOPS_DUFFEL_API_BASE?.trim() || DUFFEL_API_BASE_DEFAULT;\n}\n\nfunction resolveDirectFlag(env: NodeJS.ProcessEnv): boolean {\n const value = env.ELIZA_DUFFEL_DIRECT?.trim().toLowerCase();\n return value === \"1\" || value === \"true\";\n}\n\nfunction resolveLocalApiBase(env: NodeJS.ProcessEnv): string {\n const port = env.ELIZA_API_PORT?.trim();\n if (port && /^\\d+$/.test(port)) {\n return `http://127.0.0.1:${port}`;\n }\n return DEFAULT_CLOUD_RELAY_BASE;\n}\n\nexport function readDuffelConfigFromEnv(\n env: NodeJS.ProcessEnv = process.env,\n): DuffelConfig {\n if (resolveDirectFlag(env)) {\n const apiKey = env.DUFFEL_API_KEY?.trim();\n if (!apiKey) {\n throw new DuffelConfigError(\n \"Duffel direct mode requested but DUFFEL_API_KEY is not set.\",\n );\n }\n return { mode: \"direct\", apiKey, cloudRelayBaseUrl: null };\n }\n\n return {\n mode: \"cloud\",\n apiKey: null,\n cloudRelayBaseUrl: resolveLocalApiBase(env),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Input types\n// ---------------------------------------------------------------------------\n\nexport interface SearchFlightsRequest {\n /** IATA airport code for origin, e.g. \"JFK\". */\n origin: string;\n /** IATA airport code for destination, e.g. \"LHR\". */\n destination: string;\n /** ISO 8601 date string (YYYY-MM-DD). */\n departureDate: string;\n /**\n * ISO 8601 date string for return leg.\n * Omit or pass undefined for one-way search.\n */\n returnDate?: string;\n /** Number of adult passengers (default 1). */\n passengers?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Response types\n// ---------------------------------------------------------------------------\n\nexport interface DuffelSegment {\n origin: string;\n destination: string;\n departingAt: string;\n arrivingAt: string;\n carrierIataCode: string;\n flightNumber: string;\n duration: string;\n}\n\nexport interface DuffelSlice {\n origin: string;\n destination: string;\n duration: string;\n segments: DuffelSegment[];\n}\n\nexport interface DuffelOfferPassenger {\n id: string;\n type: string;\n givenName: string | null;\n familyName: string | null;\n}\n\nexport interface DuffelPaymentRequirements {\n requiresInstantPayment: boolean;\n priceGuaranteeExpiresAt: string | null;\n paymentRequiredBy: string | null;\n}\n\nexport interface DuffelOffer {\n id: string;\n totalAmount: string;\n totalCurrency: string;\n passengerCount: number;\n slices: DuffelSlice[];\n expiresAt: string | null;\n /** Raw cabin class reported by Duffel for the first slice. */\n cabinClass: string | null;\n passengers: DuffelOfferPassenger[];\n paymentRequirements: DuffelPaymentRequirements | null;\n}\n\n/**\n * Cost envelope returned by the cloud relay. The breakdown is computed\n * server-side (commandment 2 — no client-side math) and the local code\n * forwards it to the UI for display. In direct mode all values are zero\n * because no markup is charged.\n *\n * `markupPercent` is a *display-only* derived field: it equals\n * `platformFeeUsd / totalUsd`, computed once at the boundary so UI\n * components don't repeat the division. The pricing decision itself is\n * still Cloud-side — this is the same pattern as a \"discount %\" badge\n * derived from a server-supplied price.\n */\nexport interface DuffelCallCost {\n /** Net cost charged to the user's Cloud credit balance, in USD. */\n totalUsd: number;\n /** Portion that flows to the creator as markup, in USD. */\n creatorMarkupUsd: number;\n /** Eliza Cloud platform fee portion, in USD. */\n platformFeeUsd: number;\n /** Display-only ratio of platform fee to total (e.g. 0.2 for 20%).\n * Derived from server values, never used for pricing. Null when\n * totalUsd is zero (direct mode or free call). */\n markupPercent: number | null;\n /** Whether the call was metered (true in cloud mode, false in direct mode). */\n metered: boolean;\n}\n\nconst DIRECT_MODE_COST: DuffelCallCost = {\n totalUsd: 0,\n creatorMarkupUsd: 0,\n platformFeeUsd: 0,\n markupPercent: null,\n metered: false,\n};\n\nexport interface SearchFlightsResult {\n offerRequestId: string;\n offers: DuffelOffer[];\n cost: DuffelCallCost;\n}\n\nexport interface DuffelOrderPassenger {\n id: string;\n givenName: string | null;\n familyName: string | null;\n}\n\nexport interface DuffelOrderPaymentStatus {\n awaitingPayment: boolean;\n paymentRequiredBy: string | null;\n priceGuaranteeExpiresAt: string | null;\n}\n\nexport interface DuffelOrderDocument {\n type: string | null;\n uniqueIdentifier: string | null;\n}\n\nexport interface DuffelOrder {\n id: string;\n bookingReference: string | null;\n totalAmount: string;\n totalCurrency: string;\n slices: DuffelSlice[];\n passengers: DuffelOrderPassenger[];\n paymentStatus: DuffelOrderPaymentStatus | null;\n documents: DuffelOrderDocument[];\n}\n\nexport interface DuffelPayment {\n id: string;\n orderId: string;\n status: string;\n currency: string;\n amount: string;\n type: string;\n failureReason: string | null;\n createdAt: string | null;\n}\n\nexport interface DuffelOrderPassengerInput {\n id: string;\n title?: string;\n gender?: string;\n givenName: string;\n familyName: string;\n bornOn: string;\n email?: string;\n phoneNumber?: string;\n}\n\nexport interface CreateDuffelOrderRequest {\n selectedOffers: ReadonlyArray<string>;\n passengers: ReadonlyArray<DuffelOrderPassengerInput>;\n type: \"hold\" | \"instant\";\n payment?: {\n type: \"balance\";\n amount: string;\n currency: string;\n };\n metadata?: Readonly<Record<string, string>>;\n}\n\n// ---------------------------------------------------------------------------\n// Internal Duffel API response shapes (minimal — only fields we use)\n// ---------------------------------------------------------------------------\n\ninterface DuffelApiOffer {\n id: string;\n total_amount: string;\n total_currency: string;\n expires_at: string | null;\n slices: Array<{\n origin: { iata_code: string };\n destination: { iata_code: string };\n duration: string;\n segments: Array<{\n origin: { iata_code: string };\n destination: { iata_code: string };\n departing_at: string;\n arriving_at: string;\n operating_carrier: { iata_code: string };\n flight_number: string | null;\n duration: string;\n }>;\n fare_brand_name: string | null;\n }>;\n passengers: Array<{\n id?: string;\n type?: string;\n given_name?: string | null;\n family_name?: string | null;\n }>;\n payment_requirements?: {\n requires_instant_payment?: boolean;\n price_guarantee_expires_at?: string | null;\n payment_required_by?: string | null;\n };\n}\n\ninterface DuffelOfferRequestResponse {\n data: {\n id: string;\n offers: DuffelApiOffer[];\n };\n}\n\ninterface DuffelOfferResponse {\n data: DuffelApiOffer;\n}\n\ninterface DuffelApiOrder {\n id: string;\n booking_reference?: string | null;\n total_amount: string;\n total_currency: string;\n slices: DuffelApiOffer[\"slices\"];\n passengers: Array<{\n id?: string;\n given_name?: string | null;\n family_name?: string | null;\n }>;\n payment_status?: {\n awaiting_payment?: boolean;\n payment_required_by?: string | null;\n price_guarantee_expires_at?: string | null;\n };\n documents?: Array<{\n type?: string | null;\n unique_identifier?: string | null;\n }>;\n}\n\ninterface DuffelOrderResponse {\n data: DuffelApiOrder;\n}\n\ninterface DuffelPaymentResponse {\n data: {\n id: string;\n order_id: string;\n status: string;\n currency: string;\n amount: string;\n type: string;\n failure_reason?: string | null;\n created_at?: string | null;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildHeaders(apiKey: string): Record<string, string> {\n return {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n \"Duffel-Version\": DUFFEL_API_VERSION,\n Accept: \"application/json\",\n };\n}\n\nfunction mapOffer(raw: DuffelApiOffer): DuffelOffer {\n const cabinClass = raw.slices[0]?.fare_brand_name ?? null;\n\n const slices: DuffelSlice[] = raw.slices.map((slice) => ({\n origin: slice.origin.iata_code,\n destination: slice.destination.iata_code,\n duration: slice.duration,\n segments: slice.segments.map((seg) => ({\n origin: seg.origin.iata_code,\n destination: seg.destination.iata_code,\n departingAt: seg.departing_at,\n arrivingAt: seg.arriving_at,\n carrierIataCode: seg.operating_carrier.iata_code,\n flightNumber: seg.flight_number ?? \"\",\n duration: seg.duration,\n })),\n }));\n const passengers: DuffelOfferPassenger[] = raw.passengers.map(\n (passenger, index) => ({\n id: passenger.id?.trim() || `passenger_${index}`,\n type: passenger.type?.trim() || \"adult\",\n givenName: passenger.given_name?.trim() || null,\n familyName: passenger.family_name?.trim() || null,\n }),\n );\n const paymentRequirements = raw.payment_requirements\n ? {\n requiresInstantPayment:\n raw.payment_requirements.requires_instant_payment !== false,\n priceGuaranteeExpiresAt:\n raw.payment_requirements.price_guarantee_expires_at ?? null,\n paymentRequiredBy: raw.payment_requirements.payment_required_by ?? null,\n }\n : null;\n\n return {\n id: raw.id,\n totalAmount: raw.total_amount,\n totalCurrency: raw.total_currency,\n passengerCount: passengers.length > 0 ? passengers.length : 1,\n slices,\n expiresAt: raw.expires_at,\n cabinClass,\n passengers,\n paymentRequirements,\n };\n}\n\nfunction mapOrder(raw: DuffelApiOrder): DuffelOrder {\n return {\n id: raw.id,\n bookingReference: raw.booking_reference ?? null,\n totalAmount: raw.total_amount,\n totalCurrency: raw.total_currency,\n slices: raw.slices.map((slice) => ({\n origin: slice.origin.iata_code,\n destination: slice.destination.iata_code,\n duration: slice.duration,\n segments: slice.segments.map((segment) => ({\n origin: segment.origin.iata_code,\n destination: segment.destination.iata_code,\n departingAt: segment.departing_at,\n arrivingAt: segment.arriving_at,\n carrierIataCode: segment.operating_carrier.iata_code,\n flightNumber: segment.flight_number ?? \"\",\n duration: segment.duration,\n })),\n })),\n passengers: raw.passengers.map((passenger, index) => ({\n id: passenger.id?.trim() || `passenger_${index}`,\n givenName: passenger.given_name?.trim() || null,\n familyName: passenger.family_name?.trim() || null,\n })),\n paymentStatus: raw.payment_status\n ? {\n awaitingPayment: raw.payment_status.awaiting_payment === true,\n paymentRequiredBy: raw.payment_status.payment_required_by ?? null,\n priceGuaranteeExpiresAt:\n raw.payment_status.price_guarantee_expires_at ?? null,\n }\n : null,\n documents: (raw.documents ?? []).map((document) => ({\n type: document.type ?? null,\n uniqueIdentifier: document.unique_identifier ?? null,\n })),\n };\n}\n\nfunction mapPayment(raw: DuffelPaymentResponse[\"data\"]): DuffelPayment {\n return {\n id: raw.id,\n orderId: raw.order_id,\n status: raw.status,\n currency: raw.currency,\n amount: raw.amount,\n type: raw.type,\n failureReason: raw.failure_reason ?? null,\n createdAt: raw.created_at ?? null,\n };\n}\n\n/**\n * Cost meta envelope returned by the Eliza Cloud relay alongside the\n * Duffel payload. Defined server-side; the client trusts whatever Cloud\n * returns and never recomputes (commandment 2).\n */\ninterface RelayCostMeta {\n total_usd?: number;\n creator_markup_usd?: number;\n platform_fee_usd?: number;\n}\n\ninterface RelayMeta {\n cost?: RelayCostMeta;\n}\n\ninterface RelayEnvelope {\n _meta?: RelayMeta;\n}\n\nfunction readRelayCost(envelope: unknown): DuffelCallCost {\n if (\n envelope === null ||\n typeof envelope !== \"object\" ||\n !(\"_meta\" in envelope)\n ) {\n throw new Error(\n \"Duffel cloud relay response missing _meta envelope. Update Eliza Cloud or set ELIZA_DUFFEL_DIRECT=1.\",\n );\n }\n const meta = (envelope as RelayEnvelope)._meta;\n const cost = meta?.cost;\n if (\n !cost ||\n typeof cost.total_usd !== \"number\" ||\n typeof cost.creator_markup_usd !== \"number\" ||\n typeof cost.platform_fee_usd !== \"number\"\n ) {\n throw new Error(\n \"Duffel cloud relay returned malformed _meta.cost. Refusing to proceed without billing receipt.\",\n );\n }\n const totalUsd = cost.total_usd;\n const platformFeeUsd = cost.platform_fee_usd;\n const markupPercent = totalUsd > 0 ? platformFeeUsd / totalUsd : null;\n return {\n totalUsd,\n creatorMarkupUsd: cost.creator_markup_usd,\n platformFeeUsd,\n markupPercent,\n metered: true,\n };\n}\n\ninterface DuffelFetchResult<T> {\n data: T;\n cost: DuffelCallCost;\n}\n\ninterface DuffelRequest {\n config: DuffelConfig;\n method: \"GET\" | \"POST\";\n /** Path on api.duffel.com (e.g. \"/air/offer_requests\"). */\n directPath: string;\n /** Path on the local cloud relay (e.g. \"/api/cloud/travel-providers/duffel/offer-requests\"). */\n cloudRelayPath: string;\n body?: unknown;\n operation: string;\n}\n\nasync function duffelFetch<T>(\n args: DuffelRequest,\n): Promise<DuffelFetchResult<T>> {\n const { config, method, directPath, cloudRelayPath, body, operation } = args;\n\n const isCloud = config.mode === \"cloud\";\n const url = isCloud\n ? `${config.cloudRelayBaseUrl ?? \"\"}${cloudRelayPath}`\n : `${getDuffelApiBase()}${directPath}`;\n\n const headers = isCloud\n ? { \"Content-Type\": \"application/json\", Accept: \"application/json\" }\n : buildHeaders(config.apiKey ?? \"\");\n\n const span = NOOP_DUFFEL_SPAN;\n\n let response: Response;\n try {\n response = await fetch(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(30_000),\n });\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n logger.error(\n {\n boundary: \"elizacloud\",\n integration: \"duffel\",\n operation,\n mode: config.mode,\n err: error instanceof Error ? error : undefined,\n },\n `[elizacloud-duffel] Duffel ${operation} network error: ${msg}`,\n );\n span.failure({ error, errorKind: \"network_error\" });\n throw new Error(`Duffel ${operation} failed: ${msg}`);\n }\n\n if (response.status === 402 && isCloud) {\n // x402 payment-required: surface as a typed PaymentRequiredError so\n // the action layer can route the user to the wallet top-up flow\n // rather than treating this as a generic HTTP failure. The Cloud\n // billing layer emits 402 only when the user's credit balance can't\n // cover the call — see docs/cloud-travel-billing.md.\n const requirements = await parseX402Response(response);\n logger.warn(\n {\n boundary: \"elizacloud\",\n integration: \"duffel\",\n operation,\n mode: config.mode,\n statusCode: 402,\n requirementCount: requirements?.length ?? 0,\n },\n `[elizacloud-duffel] Duffel ${operation} returned 402 payment-required`,\n );\n span.failure({ statusCode: 402, errorKind: \"payment_required\" });\n if (!requirements || requirements.length === 0) {\n throw new PaymentRequiredError(\n [],\n `Duffel ${operation} requires payment but the upstream did not advertise any payment options.`,\n );\n }\n throw new PaymentRequiredError(requirements);\n }\n\n if (!response.ok) {\n const errorBody = await response.text().catch(() => \"\");\n const errorMsg = errorBody || `HTTP ${response.status}`;\n logger.warn(\n {\n boundary: \"elizacloud\",\n integration: \"duffel\",\n operation,\n mode: config.mode,\n statusCode: response.status,\n },\n `[elizacloud-duffel] Duffel ${operation} HTTP error: ${errorMsg}`,\n );\n span.failure({ statusCode: response.status, errorKind: \"http_error\" });\n throw new Error(\n `Duffel ${operation} failed (${response.status}): ${errorMsg}`,\n );\n }\n\n const payload = (await response.json()) as T;\n span.success({ statusCode: response.status });\n\n const cost = isCloud ? readRelayCost(payload) : DIRECT_MODE_COST;\n return { data: payload, cost };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Search for available flight offers via the Duffel Offer Requests API.\n *\n * Throws `DuffelConfigError` when DUFFEL_API_KEY is absent.\n * One-way search when `returnDate` is omitted; return search when provided.\n *\n */\nexport async function searchFlights(\n request: SearchFlightsRequest,\n config?: DuffelConfig,\n): Promise<SearchFlightsResult> {\n const resolvedConfig = config ?? readDuffelConfigFromEnv();\n const passengerCount = Math.max(1, Math.round(request.passengers ?? 1));\n\n const slices: Array<{\n origin: string;\n destination: string;\n departure_date: string;\n }> = [\n {\n origin: request.origin.toUpperCase().trim(),\n destination: request.destination.toUpperCase().trim(),\n departure_date: request.departureDate,\n },\n ];\n if (request.returnDate) {\n slices.push({\n origin: request.destination.toUpperCase().trim(),\n destination: request.origin.toUpperCase().trim(),\n departure_date: request.returnDate,\n });\n }\n\n const requestBody = {\n data: {\n slices,\n passengers: Array.from({ length: passengerCount }, () => ({\n type: \"adult\",\n })),\n cabin_class: \"economy\",\n },\n };\n\n logger.info(\n {\n boundary: \"elizacloud\",\n integration: \"duffel\",\n origin: request.origin,\n destination: request.destination,\n },\n `[elizacloud-duffel] Searching flights ${request.origin} → ${request.destination} on ${request.departureDate}`,\n );\n\n const { data: responseData, cost } =\n await duffelFetch<DuffelOfferRequestResponse>({\n config: resolvedConfig,\n method: \"POST\",\n directPath: \"/air/offer_requests?return_offers=true\",\n cloudRelayPath: \"/api/cloud/travel-providers/duffel/offer-requests\",\n body: requestBody,\n operation: \"offer_request\",\n });\n\n const offers = responseData.data.offers.map(mapOffer);\n\n logger.info(\n {\n boundary: \"elizacloud\",\n integration: \"duffel\",\n offerRequestId: responseData.data.id,\n offerCount: offers.length,\n costUsd: cost.totalUsd,\n },\n `[elizacloud-duffel] Duffel returned ${offers.length} offers for request ${responseData.data.id}`,\n );\n\n return {\n offerRequestId: responseData.data.id,\n offers,\n cost,\n };\n}\n\n/**\n * Retrieve a single flight offer by ID.\n *\n * Use after `searchFlights` to get live pricing and full details for a\n * specific offer before presenting it to the user for approval.\n *\n */\nexport async function getOffer(\n id: string,\n config?: DuffelConfig,\n): Promise<DuffelOffer> {\n const resolvedConfig = config ?? readDuffelConfigFromEnv();\n\n if (!id || id.trim().length === 0) {\n throw new Error(\"Duffel getOffer: offer id is required\");\n }\n\n const { data: responseData } = await duffelFetch<DuffelOfferResponse>({\n config: resolvedConfig,\n method: \"GET\",\n directPath: `/air/offers/${encodeURIComponent(id.trim())}`,\n cloudRelayPath: `/api/cloud/travel-providers/duffel/offers/${encodeURIComponent(id.trim())}`,\n operation: \"offer_retrieve\",\n });\n\n return mapOffer(responseData.data);\n}\n\nexport async function createOrder(\n request: CreateDuffelOrderRequest,\n config?: DuffelConfig,\n): Promise<DuffelOrder> {\n const resolvedConfig = config ?? readDuffelConfigFromEnv();\n if (request.selectedOffers.length !== 1) {\n throw new Error(\n \"Duffel createOrder: exactly one selected offer is required\",\n );\n }\n if (request.passengers.length === 0) {\n throw new Error(\"Duffel createOrder: at least one passenger is required\");\n }\n\n const data: Record<string, unknown> = {\n type: request.type,\n selected_offers: [...request.selectedOffers],\n passengers: request.passengers.map((passenger) => ({\n id: passenger.id,\n title: passenger.title,\n gender: passenger.gender,\n given_name: passenger.givenName,\n family_name: passenger.familyName,\n born_on: passenger.bornOn,\n email: passenger.email,\n phone_number: passenger.phoneNumber,\n })),\n };\n if (request.payment) {\n data.payments = [\n {\n type: request.payment.type,\n amount: request.payment.amount,\n currency: request.payment.currency,\n },\n ];\n }\n if (request.metadata && Object.keys(request.metadata).length > 0) {\n data.metadata = request.metadata;\n }\n\n const { data: response } = await duffelFetch<DuffelOrderResponse>({\n config: resolvedConfig,\n method: \"POST\",\n directPath: \"/air/orders\",\n cloudRelayPath: \"/api/cloud/travel-providers/duffel/orders\",\n body: { data },\n operation: \"order_create\",\n });\n\n return mapOrder(response.data);\n}\n\nexport async function getOrder(\n orderId: string,\n config?: DuffelConfig,\n): Promise<DuffelOrder> {\n const resolvedConfig = config ?? readDuffelConfigFromEnv();\n if (!orderId || orderId.trim().length === 0) {\n throw new Error(\"Duffel getOrder: order id is required\");\n }\n\n const { data: response } = await duffelFetch<DuffelOrderResponse>({\n config: resolvedConfig,\n method: \"GET\",\n directPath: `/air/orders/${encodeURIComponent(orderId.trim())}`,\n cloudRelayPath: `/api/cloud/travel-providers/duffel/orders/${encodeURIComponent(orderId.trim())}`,\n operation: \"order_retrieve\",\n });\n\n return mapOrder(response.data);\n}\n\nexport async function createPayment(\n args: {\n orderId: string;\n amount: string;\n currency: string;\n },\n config?: DuffelConfig,\n): Promise<DuffelPayment> {\n const resolvedConfig = config ?? readDuffelConfigFromEnv();\n if (args.orderId.trim().length === 0) {\n throw new Error(\"Duffel createPayment: order id is required\");\n }\n if (args.amount.trim().length === 0) {\n throw new Error(\"Duffel createPayment: amount is required\");\n }\n if (args.currency.trim().length === 0) {\n throw new Error(\"Duffel createPayment: currency is required\");\n }\n\n const { data: response } = await duffelFetch<DuffelPaymentResponse>({\n config: resolvedConfig,\n method: \"POST\",\n directPath: \"/air/payments\",\n cloudRelayPath: \"/api/cloud/travel-providers/duffel/payments\",\n body: {\n data: {\n order_id: args.orderId.trim(),\n payment: {\n type: \"balance\",\n amount: args.amount.trim(),\n currency: args.currency.trim().toUpperCase(),\n },\n },\n },\n operation: \"payment_create\",\n });\n\n return mapPayment(response.data);\n}\n",
|
|
67
|
+
"/**\n * x402 (HTTP 402 Payment Required) handler for Eliza Cloud relays.\n *\n * Spec reference: https://www.x402.org\n *\n * When the user's Cloud credit balance can't cover a metered call, the\n * Cloud relay returns HTTP 402 with a `payment-requirements` envelope —\n * either as a `WWW-Authenticate: x402 <json>` header or as a JSON body\n * with a top-level `paymentRequirements` array. Each requirement\n * describes one acceptable payment option (asset, network, recipient,\n * amount).\n *\n * This module is intentionally thin:\n * - `parseX402Response` extracts requirements from a Response.\n * - `PaymentRequiredError` carries them up to the action layer.\n * - `requestPayment` is the agent-side bridge: today it surfaces the\n * requirement back to the owner via the runtime logger so the UI /\n * planner can route the user to the existing wallet top-up flow.\n * Auto-pay intentionally lives outside this bridge — the actual money\n * movement is Cloud-side and gated by the wallet UI (commandment 4).\n *\n * No silent failures: a malformed 402 throws so the action layer can\n * surface a clear \"payment-required\" message rather than treating the\n * upstream as a generic HTTP error.\n */\n\nimport { type IAgentRuntime, logger } from \"@elizaos/core\";\n\n/**\n * One acceptable payment option as advertised by the server.\n *\n * Fields mirror the x402 spec's `paymentRequirements` entry. We type\n * everything as required so silent partial parses are impossible — the\n * parser either yields a complete requirement or rejects it.\n */\nexport interface X402PaymentRequirement {\n /** Decimal amount in the asset's smallest unit (e.g. \"1500000\" for\n * 1.50 USDC). String, not number, to preserve precision. */\n readonly amount: string;\n /** Asset symbol or ERC-20 contract address (e.g. \"USDC\"). */\n readonly asset: string;\n /** Network identifier (e.g. \"base\", \"ethereum\", \"solana\"). */\n readonly network: string;\n /** Recipient address that should receive the payment. */\n readonly payTo: string;\n /** Payment scheme — currently x402 supports \"exact\" only. */\n readonly scheme: string;\n /** ISO-8601 deadline after which the requirement is no longer valid. */\n readonly expiresAt: string | null;\n /** Human-readable description of the resource being purchased. */\n readonly description: string | null;\n}\n\n/**\n * Wire shape we accept from JSON bodies. Loose at the boundary, strict\n * after parsing.\n */\ninterface RawRequirement {\n readonly amount?: unknown;\n readonly asset?: unknown;\n readonly network?: unknown;\n readonly payTo?: unknown;\n readonly scheme?: unknown;\n readonly expiresAt?: unknown;\n readonly description?: unknown;\n}\n\ninterface RawX402Body {\n readonly paymentRequirements?: ReadonlyArray<RawRequirement>;\n readonly accepts?: ReadonlyArray<RawRequirement>;\n}\n\nfunction readString(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction readAmount(value: unknown): string | null {\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n return null;\n}\n\nfunction normalizeRequirement(\n raw: RawRequirement | null | undefined,\n): X402PaymentRequirement | null {\n if (!raw || typeof raw !== \"object\") return null;\n const amount = readAmount(raw.amount);\n const asset = readString(raw.asset);\n const network = readString(raw.network);\n const payTo = readString(raw.payTo);\n if (!amount || !asset || !network || !payTo) return null;\n const scheme = readString(raw.scheme) ?? \"exact\";\n return {\n amount,\n asset,\n network,\n payTo,\n scheme,\n expiresAt: readString(raw.expiresAt),\n description: readString(raw.description),\n };\n}\n\nfunction parseRequirementsArray(\n raw: ReadonlyArray<RawRequirement> | undefined,\n): X402PaymentRequirement[] {\n if (!Array.isArray(raw)) return [];\n const out: X402PaymentRequirement[] = [];\n for (const entry of raw) {\n const normalized = normalizeRequirement(entry);\n if (normalized) out.push(normalized);\n }\n return out;\n}\n\n/**\n * Pull payment requirements out of an x402 response. Tries the header\n * form first (lowest-overhead per spec), then falls back to the JSON\n * body. Returns `null` when the response carries no parseable\n * requirements — callers should treat that as a generic 402 and\n * surface the upstream status text.\n */\nexport async function parseX402Response(\n response: Response,\n): Promise<X402PaymentRequirement[] | null> {\n const headerValue = response.headers.get(\"www-authenticate\");\n if (headerValue?.toLowerCase().startsWith(\"x402\")) {\n const jsonPart = headerValue.slice(4).trim();\n if (jsonPart.length > 0) {\n const parsed = JSON.parse(jsonPart) as RawX402Body | RawRequirement[];\n const requirements = Array.isArray(parsed)\n ? parseRequirementsArray(parsed)\n : parseRequirementsArray(parsed.paymentRequirements ?? parsed.accepts);\n if (requirements.length > 0) return requirements;\n }\n }\n // Fall back to body parse. Clone so the caller can still read it.\n const cloned = response.clone();\n const text = await cloned.text();\n if (text.length === 0) return null;\n const body = JSON.parse(text) as RawX402Body;\n const requirements = parseRequirementsArray(\n body.paymentRequirements ?? body.accepts,\n );\n return requirements.length > 0 ? requirements : null;\n}\n\n/**\n * Thrown by adapters when an upstream metered call returns 402 with\n * actionable payment requirements. Action handlers convert this into an\n * approval-queue entry so the user sees both the cost and the\n * top-up prompt together.\n */\nexport class PaymentRequiredError extends Error {\n readonly code = \"PAYMENT_REQUIRED\" as const;\n readonly requirements: ReadonlyArray<X402PaymentRequirement>;\n\n constructor(\n requirements: ReadonlyArray<X402PaymentRequirement>,\n message?: string,\n ) {\n const text =\n message ??\n `Eliza Cloud returned HTTP 402 — your credit balance can't cover this call. ${requirements.length} payment option(s) available.`;\n super(text);\n this.name = \"PaymentRequiredError\";\n this.requirements = requirements;\n }\n}\n\nexport interface PaymentReceipt {\n readonly status: \"surfaced\" | \"paid\";\n readonly requirement: X402PaymentRequirement;\n /** Transaction id when status === \"paid\", null when only surfaced. */\n readonly txId: string | null;\n}\n\n/**\n * Bridge from a raw payment requirement to user action. For now this\n * does not auto-pay: the actual money movement happens in the existing\n * wallet UI (Cloud-side). We log the requirement so the agent's\n * messaging surface and the desktop dev console both pick it up, then\n * return a \"surfaced\" receipt for the action layer to forward into the\n * approval queue.\n */\nexport async function requestPayment(\n runtime: IAgentRuntime,\n requirements: ReadonlyArray<X402PaymentRequirement>,\n): Promise<PaymentReceipt> {\n if (requirements.length === 0) {\n throw new Error(\n \"[x402] requestPayment called with no requirements — adapter bug\",\n );\n }\n const preferred = requirements[0];\n logger.warn(\n {\n boundary: \"elizacloud\",\n integration: \"x402\",\n asset: preferred.asset,\n network: preferred.network,\n amount: preferred.amount,\n runtimeId: runtime.agentId,\n },\n `[x402] payment-required: ${preferred.amount} ${preferred.asset} on ${preferred.network} → ${preferred.payTo}${preferred.description ? ` (${preferred.description})` : \"\"}`,\n );\n return { status: \"surfaced\", requirement: preferred, txId: null };\n}\n",
|
|
68
|
+
"import {\n normalizeCloudSiteUrl,\n resolveCloudApiBaseUrl,\n} from \"./base-url.js\";\nimport type {\n GetLifeOpsScheduleMergedStateResponse,\n SyncLifeOpsScheduleObservationsRequest,\n SyncLifeOpsScheduleObservationsResponse,\n} from \"./lifeops-schedule-sync-contracts.js\";\n\nconst LIFEOPS_SCHEDULE_REQUEST_TIMEOUT_MS = 20_000;\n\nexport class LifeOpsScheduleSyncClientError extends Error {\n constructor(\n public readonly status: number,\n message: string,\n ) {\n super(message);\n this.name = \"LifeOpsScheduleSyncClientError\";\n }\n}\n\nexport type ResolvedLifeOpsScheduleSyncConfig =\n | {\n configured: false;\n mode: \"none\";\n }\n | {\n configured: true;\n mode: \"remote\";\n baseUrl: string;\n accessToken: string | null;\n }\n | {\n configured: true;\n mode: \"cloud\";\n apiBaseUrl: string;\n apiKey: string;\n agentId: string;\n };\n\nexport interface LifeOpsScheduleSyncConfigInput {\n remoteApiBase?: string | null;\n remoteAccessToken?: string | null;\n apiKey?: string | null;\n baseUrl?: string | null;\n agentId?: string | null;\n}\n\nfunction normalizeOptionalString(value: string | null | undefined): string | null {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : null;\n}\n\nexport function normalizeLifeOpsScheduleSyncSecret(\n value: string | null | undefined,\n): string | null {\n const trimmed = normalizeOptionalString(value);\n if (!trimmed) {\n return null;\n }\n return trimmed.toUpperCase() === \"[REDACTED]\" ? null : trimmed;\n}\n\nexport function resolveLifeOpsScheduleSyncConfig(\n config: LifeOpsScheduleSyncConfigInput = {},\n): ResolvedLifeOpsScheduleSyncConfig {\n const remoteApiBase = normalizeOptionalString(config.remoteApiBase);\n if (remoteApiBase) {\n return {\n configured: true,\n mode: \"remote\",\n baseUrl: remoteApiBase.replace(/\\/+$/, \"\"),\n accessToken:\n normalizeLifeOpsScheduleSyncSecret(config.remoteAccessToken) ??\n normalizeLifeOpsScheduleSyncSecret(process.env.ELIZA_REMOTE_ACCESS_TOKEN),\n };\n }\n\n const apiKey =\n normalizeLifeOpsScheduleSyncSecret(config.apiKey) ??\n normalizeLifeOpsScheduleSyncSecret(process.env.ELIZAOS_CLOUD_API_KEY);\n const agentId =\n normalizeLifeOpsScheduleSyncSecret(config.agentId) ??\n normalizeLifeOpsScheduleSyncSecret(process.env.ELIZAOS_CLOUD_AGENT_ID);\n if (!apiKey || !agentId) {\n return {\n configured: false,\n mode: \"none\",\n };\n }\n\n return {\n configured: true,\n mode: \"cloud\",\n apiBaseUrl: resolveCloudApiBaseUrl(\n normalizeOptionalString(config.baseUrl) ?? process.env.ELIZAOS_CLOUD_BASE_URL,\n ),\n apiKey,\n agentId,\n };\n}\n\nfunction buildTimeoutSignal(): AbortSignal {\n return AbortSignal.timeout(LIFEOPS_SCHEDULE_REQUEST_TIMEOUT_MS);\n}\n\nasync function readJsonResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n let detail = `${response.status} ${response.statusText}`.trim();\n const text = await response.text();\n const trimmed = text.trim();\n if (trimmed.length > 0) {\n try {\n const parsed = JSON.parse(trimmed) as {\n error?: string;\n message?: string;\n };\n detail = parsed.message ?? parsed.error ?? trimmed;\n } catch {\n detail = trimmed.slice(0, 200);\n }\n }\n throw new LifeOpsScheduleSyncClientError(response.status, detail);\n }\n return (await response.json()) as T;\n}\n\nexport function resolveLifeOpsScheduleSyncSiteUrl(rawUrl?: string): string {\n return normalizeCloudSiteUrl(rawUrl);\n}\n\nexport class LifeOpsScheduleSyncClient {\n constructor(\n private readonly configSource:\n | ResolvedLifeOpsScheduleSyncConfig\n | (() => ResolvedLifeOpsScheduleSyncConfig) =\n resolveLifeOpsScheduleSyncConfig,\n ) {}\n\n private getConfig(): ResolvedLifeOpsScheduleSyncConfig {\n return typeof this.configSource === \"function\"\n ? this.configSource()\n : this.configSource;\n }\n\n get configured(): boolean {\n return this.getConfig().configured;\n }\n\n private requireConfig(): Exclude<\n ResolvedLifeOpsScheduleSyncConfig,\n { configured: false }\n > {\n const config = this.getConfig();\n if (!config.configured) {\n throw new LifeOpsScheduleSyncClientError(\n 409,\n \"LifeOps schedule sync is not configured.\",\n );\n }\n return config;\n }\n\n private resolvePath(pathname: string): string {\n const config = this.requireConfig();\n const normalizedPath = pathname.replace(/^\\/+/, \"\");\n if (config.mode === \"remote\") {\n return new URL(\n `api/lifeops/schedule/${normalizedPath}`,\n `${config.baseUrl.replace(/\\/+$/, \"\")}/`,\n ).toString();\n }\n return new URL(\n `eliza/agents/${encodeURIComponent(config.agentId)}/lifeops/schedule/${normalizedPath}`,\n `${config.apiBaseUrl.replace(/\\/+$/, \"\")}/`,\n ).toString();\n }\n\n private requestHeaders(\n initHeaders: HeadersInit | undefined,\n ): Record<string, string> {\n const config = this.requireConfig();\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n };\n if (config.mode === \"cloud\") {\n headers[\"X-API-Key\"] = config.apiKey;\n }\n if (config.mode === \"remote\" && config.accessToken) {\n headers.Authorization = `Bearer ${config.accessToken}`;\n }\n if (initHeaders instanceof Headers) {\n for (const [key, value] of initHeaders.entries()) {\n headers[key] = value;\n }\n return headers;\n }\n if (Array.isArray(initHeaders)) {\n for (const [key, value] of initHeaders) {\n headers[key] = value;\n }\n return headers;\n }\n return {\n ...headers,\n ...(initHeaders ?? {}),\n };\n }\n\n private async request<T>(pathname: string, init: RequestInit): Promise<T> {\n const response = await fetch(this.resolvePath(pathname), {\n ...init,\n headers: this.requestHeaders(init.headers),\n signal: init.signal ?? buildTimeoutSignal(),\n });\n return readJsonResponse<T>(response);\n }\n\n async syncObservations(\n request: SyncLifeOpsScheduleObservationsRequest,\n ): Promise<SyncLifeOpsScheduleObservationsResponse> {\n return this.request<SyncLifeOpsScheduleObservationsResponse>(\n \"observations\",\n {\n method: \"POST\",\n body: JSON.stringify(request),\n },\n );\n }\n\n async getMergedState(\n timezone: string,\n scope: \"local\" | \"cloud\" | \"effective\" = \"cloud\",\n ): Promise<GetLifeOpsScheduleMergedStateResponse> {\n const query = new URLSearchParams({ timezone, scope });\n return this.request<GetLifeOpsScheduleMergedStateResponse>(\n `merged-state?${query.toString()}`,\n {\n method: \"GET\",\n },\n );\n }\n}\n",
|
|
69
|
+
"import type {\n LifeOpsAwakeProbability,\n LifeOpsCircadianState,\n LifeOpsPersonalBaseline,\n LifeOpsRelativeTime,\n LifeOpsScheduleInsight,\n LifeOpsScheduleMealLabel,\n LifeOpsScheduleRegularity,\n LifeOpsScheduleSleepStatus,\n LifeOpsUnclearReason,\n} from \"@elizaos/shared\";\n\nexport const LIFEOPS_SCHEDULE_DEVICE_KINDS = [\n \"iphone\",\n \"ipad\",\n \"mac\",\n \"watch\",\n \"cloud\",\n \"unknown\",\n] as const;\n\nexport type LifeOpsScheduleDeviceKind =\n (typeof LIFEOPS_SCHEDULE_DEVICE_KINDS)[number];\n\nexport const LIFEOPS_SCHEDULE_OBSERVATION_ORIGINS = [\n \"local_inference\",\n \"device_sync\",\n] as const;\n\nexport type LifeOpsScheduleObservationOrigin =\n (typeof LIFEOPS_SCHEDULE_OBSERVATION_ORIGINS)[number];\n\nexport const LIFEOPS_SCHEDULE_STATE_SCOPES = [\"local\", \"cloud\"] as const;\n\nexport type LifeOpsScheduleStateScope =\n (typeof LIFEOPS_SCHEDULE_STATE_SCOPES)[number];\n\nexport interface LifeOpsScheduleObservationSnapshot {\n effectiveDayKey: string;\n localDate: string;\n phase: LifeOpsCircadianState;\n circadianState: LifeOpsCircadianState;\n stateConfidence: number;\n uncertaintyReason: LifeOpsUnclearReason | null;\n relativeTime: LifeOpsRelativeTime;\n awakeProbability: LifeOpsAwakeProbability;\n regularity: LifeOpsScheduleRegularity;\n baseline: LifeOpsPersonalBaseline | null;\n sleepStatus: LifeOpsScheduleSleepStatus;\n isProbablySleeping: boolean;\n sleepConfidence: number;\n currentSleepStartedAt: string | null;\n lastSleepStartedAt: string | null;\n lastSleepEndedAt: string | null;\n lastSleepDurationMinutes: number | null;\n wakeAt: string | null;\n firstActiveAt: string | null;\n lastActiveAt: string | null;\n lastMealAt: string | null;\n nextMealLabel: LifeOpsScheduleMealLabel | null;\n nextMealWindowStartAt: string | null;\n nextMealWindowEndAt: string | null;\n nextMealConfidence: number;\n}\n\nexport interface LifeOpsScheduleObservation {\n id: string;\n agentId: string;\n origin: LifeOpsScheduleObservationOrigin;\n deviceId: string;\n deviceKind: LifeOpsScheduleDeviceKind;\n timezone: string;\n observedAt: string;\n windowStartAt: string;\n windowEndAt: string | null;\n circadianState: LifeOpsCircadianState;\n stateConfidence: number;\n uncertaintyReason: LifeOpsUnclearReason | null;\n mealLabel: LifeOpsScheduleMealLabel | null;\n metadata: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface LifeOpsScheduleMergedState extends LifeOpsScheduleInsight {\n id: string;\n agentId: string;\n scope: LifeOpsScheduleStateScope;\n mergedAt: string;\n observationCount: number;\n deviceCount: number;\n contributingDeviceKinds: LifeOpsScheduleDeviceKind[];\n metadata: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface SyncLifeOpsScheduleObservationInput {\n circadianState: LifeOpsCircadianState;\n stateConfidence: number;\n uncertaintyReason?: LifeOpsUnclearReason | null;\n windowStartAt: string;\n windowEndAt?: string | null;\n mealLabel?: LifeOpsScheduleMealLabel | null;\n snapshot?: Partial<LifeOpsScheduleObservationSnapshot> | null;\n metadata?: Record<string, unknown>;\n}\n\nexport interface SyncLifeOpsScheduleObservationsRequest {\n deviceId: string;\n deviceKind: LifeOpsScheduleDeviceKind;\n timezone: string;\n observedAt?: string;\n observations: SyncLifeOpsScheduleObservationInput[];\n}\n\nexport interface SyncLifeOpsScheduleObservationsResponse {\n acceptedCount: number;\n mergedState: LifeOpsScheduleMergedState;\n}\n\nexport interface GetLifeOpsScheduleMergedStateResponse {\n mergedState: LifeOpsScheduleMergedState | null;\n}\n",
|
|
70
|
+
"import {\n normalizeCloudSiteUrl,\n resolveCloudApiBaseUrl,\n} from \"./base-url.js\";\n\nexport { normalizeCloudSiteUrl, resolveCloudApiBaseUrl } from \"./base-url.js\";\n\nexport interface ElizaCloudManagedClientConfig {\n configured: boolean;\n apiKey: string | null;\n apiBaseUrl: string;\n siteUrl: string;\n}\n\nexport function normalizeElizaCloudApiKey(\n value: string | undefined | null,\n): string | null {\n const trimmed = value?.trim();\n if (!trimmed) return null;\n return trimmed.toUpperCase() === \"[REDACTED]\" ? null : trimmed;\n}\n\nexport function resolveEnvElizaCloudManagedClientConfig(\n env: Record<string, string | undefined> =\n typeof process === \"undefined\" ? {} : process.env,\n): ElizaCloudManagedClientConfig {\n const apiKey = normalizeElizaCloudApiKey(env.ELIZAOS_CLOUD_API_KEY);\n const baseUrl = env.ELIZAOS_CLOUD_BASE_URL;\n return {\n configured: Boolean(apiKey),\n apiKey,\n apiBaseUrl: resolveCloudApiBaseUrl(baseUrl),\n siteUrl: normalizeCloudSiteUrl(baseUrl),\n };\n}\n\nconst PLAID_REQUEST_TIMEOUT_MS = 30_000;\nconst PAYPAL_REQUEST_TIMEOUT_MS = 30_000;\n\ntype ConfigSource = () => ElizaCloudManagedClientConfig;\n\nexport class PlaidManagedClientError extends Error {\n constructor(\n public readonly status: number,\n message: string,\n ) {\n super(message);\n this.name = \"PlaidManagedClientError\";\n }\n}\n\nexport class PaypalManagedClientError extends Error {\n constructor(\n public readonly status: number,\n message: string,\n public readonly fallback: \"csv_export\" | null = null,\n ) {\n super(message);\n this.name = \"PaypalManagedClientError\";\n }\n}\n\nasync function readPlaidJson<T>(response: Response): Promise<T> {\n if (!response.ok) {\n let detail = `${response.status} ${response.statusText}`.trim();\n const text = await response.text();\n if (text.trim().length > 0) {\n try {\n const parsed = JSON.parse(text) as {\n error?: string;\n message?: string;\n };\n detail = parsed.message ?? parsed.error ?? text.slice(0, 240);\n } catch {\n detail = text.slice(0, 240);\n }\n }\n throw new PlaidManagedClientError(response.status, detail);\n }\n return (await response.json()) as T;\n}\n\nasync function readPaypalJson<T>(response: Response): Promise<T> {\n if (!response.ok) {\n let detail = `${response.status} ${response.statusText}`.trim();\n let fallback: \"csv_export\" | null = null;\n const text = await response.text();\n if (text.trim().length > 0) {\n try {\n const parsed = JSON.parse(text) as {\n error?: string;\n message?: string;\n fallback?: \"csv_export\" | null;\n };\n detail = parsed.message ?? parsed.error ?? text.slice(0, 240);\n fallback = parsed.fallback ?? null;\n } catch {\n detail = text.slice(0, 240);\n }\n }\n throw new PaypalManagedClientError(response.status, detail, fallback);\n }\n return (await response.json()) as T;\n}\n\nexport interface PlaidLinkTokenResponse {\n linkToken: string;\n expiration: string;\n environment: \"sandbox\" | \"development\" | \"production\";\n}\n\nexport interface PlaidExchangeResponse {\n accessToken: string;\n itemId: string;\n institution: {\n institutionId: string;\n institutionName: string;\n primaryAccountMask: string | null;\n accounts: Array<{\n accountId: string;\n name: string;\n mask: string | null;\n type: string;\n subtype: string | null;\n }>;\n };\n}\n\nexport interface PlaidSyncResponse {\n added: PlaidTransactionDto[];\n modified: PlaidTransactionDto[];\n removed: Array<{ transaction_id: string }>;\n nextCursor: string;\n hasMore: boolean;\n}\n\nexport interface PlaidTransactionDto {\n transaction_id: string;\n account_id: string;\n amount: number;\n iso_currency_code: string | null;\n unofficial_currency_code: string | null;\n date: string;\n authorized_date: string | null;\n name: string;\n merchant_name: string | null;\n pending: boolean;\n category: string[] | null;\n personal_finance_category: {\n primary: string;\n detailed: string;\n } | null;\n}\n\nexport class PlaidManagedClient {\n constructor(\n private readonly configSource: ConfigSource =\n resolveEnvElizaCloudManagedClientConfig,\n ) {}\n\n private requireConfig(): ElizaCloudManagedClientConfig & { apiKey: string } {\n const config = this.configSource();\n if (!config.apiKey) {\n throw new PlaidManagedClientError(409, \"Eliza Cloud is not connected.\");\n }\n return { ...config, apiKey: config.apiKey };\n }\n\n get configured(): boolean {\n return this.configSource().configured;\n }\n\n async createLinkToken(): Promise<PlaidLinkTokenResponse> {\n const config = this.requireConfig();\n const response = await fetch(\n `${config.apiBaseUrl}/v1/eliza/plaid/link-token`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: \"{}\",\n signal: AbortSignal.timeout(PLAID_REQUEST_TIMEOUT_MS),\n },\n );\n return readPlaidJson<PlaidLinkTokenResponse>(response);\n }\n\n async exchangePublicToken(args: {\n publicToken: string;\n }): Promise<PlaidExchangeResponse> {\n const config = this.requireConfig();\n const response = await fetch(\n `${config.apiBaseUrl}/v1/eliza/plaid/exchange`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ publicToken: args.publicToken }),\n signal: AbortSignal.timeout(PLAID_REQUEST_TIMEOUT_MS),\n },\n );\n return readPlaidJson<PlaidExchangeResponse>(response);\n }\n\n async syncTransactions(args: {\n accessToken: string;\n cursor?: string;\n count?: number;\n }): Promise<PlaidSyncResponse> {\n const config = this.requireConfig();\n const response = await fetch(`${config.apiBaseUrl}/v1/eliza/plaid/sync`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n accessToken: args.accessToken,\n cursor: args.cursor ?? \"\",\n count: args.count ?? 250,\n }),\n signal: AbortSignal.timeout(PLAID_REQUEST_TIMEOUT_MS * 2),\n });\n return readPlaidJson<PlaidSyncResponse>(response);\n }\n}\n\nexport interface PaypalAuthorizeUrlResponse {\n url: string;\n scope: string;\n environment: \"live\" | \"sandbox\";\n}\n\nexport interface PaypalCallbackResponse {\n accessToken: string;\n refreshToken: string | null;\n expiresIn: number;\n scope: string;\n capability: { hasReporting: boolean; hasIdentity: boolean };\n identity: { payerId: string; emails: string[]; name: string | null } | null;\n}\n\nexport interface PaypalTransactionDto {\n transaction_info: {\n transaction_id: string;\n transaction_initiation_date: string;\n transaction_updated_date: string | null;\n transaction_amount: { currency_code: string; value: string };\n transaction_status: string;\n transaction_subject: string | null;\n transaction_note: string | null;\n };\n payer_info?: {\n email_address?: string;\n payer_name?: { alternate_full_name?: string };\n };\n shipping_info?: { name?: string };\n cart_info?: {\n item_details?: Array<{\n item_name?: string;\n item_amount?: { currency_code: string; value: string };\n }>;\n };\n}\n\nexport interface PaypalTransactionsResponse {\n transactions: PaypalTransactionDto[];\n totalItems: number;\n totalPages: number;\n page: number;\n}\n\nexport class PaypalManagedClient {\n constructor(\n private readonly configSource: ConfigSource =\n resolveEnvElizaCloudManagedClientConfig,\n ) {}\n\n private requireConfig(): ElizaCloudManagedClientConfig & { apiKey: string } {\n const config = this.configSource();\n if (!config.apiKey) {\n throw new PaypalManagedClientError(409, \"Eliza Cloud is not connected.\");\n }\n return { ...config, apiKey: config.apiKey };\n }\n\n get configured(): boolean {\n return this.configSource().configured;\n }\n\n async buildAuthorizeUrl(args: {\n state: string;\n }): Promise<PaypalAuthorizeUrlResponse> {\n const config = this.requireConfig();\n const response = await fetch(\n `${config.apiBaseUrl}/v1/eliza/paypal/authorize`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ state: args.state }),\n signal: AbortSignal.timeout(PAYPAL_REQUEST_TIMEOUT_MS),\n },\n );\n return readPaypalJson<PaypalAuthorizeUrlResponse>(response);\n }\n\n async exchangeCode(args: { code: string }): Promise<PaypalCallbackResponse> {\n const config = this.requireConfig();\n const response = await fetch(\n `${config.apiBaseUrl}/v1/eliza/paypal/callback`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: args.code }),\n signal: AbortSignal.timeout(PAYPAL_REQUEST_TIMEOUT_MS),\n },\n );\n return readPaypalJson<PaypalCallbackResponse>(response);\n }\n\n async refreshAccessToken(args: { refreshToken: string }): Promise<{\n accessToken: string;\n refreshToken: string | null;\n expiresIn: number;\n scope: string;\n }> {\n const config = this.requireConfig();\n const response = await fetch(\n `${config.apiBaseUrl}/v1/eliza/paypal/refresh`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ refreshToken: args.refreshToken }),\n signal: AbortSignal.timeout(PAYPAL_REQUEST_TIMEOUT_MS),\n },\n );\n return readPaypalJson(response);\n }\n\n async searchTransactions(args: {\n accessToken: string;\n startDate: string;\n endDate: string;\n page?: number;\n }): Promise<PaypalTransactionsResponse> {\n const config = this.requireConfig();\n const response = await fetch(\n `${config.apiBaseUrl}/v1/eliza/paypal/transactions`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(args),\n signal: AbortSignal.timeout(PAYPAL_REQUEST_TIMEOUT_MS * 2),\n },\n );\n return readPaypalJson<PaypalTransactionsResponse>(response);\n }\n}\n",
|
|
71
|
+
"import pluginDefault from \"./index.js\";\n\nexport * from \"./index.js\";\nexport default pluginDefault;\n\n// Node-only route handlers (depend on node:os and other node built-ins).\nexport { handleCloudBillingRoute } from \"./routes/cloud-billing-routes\";\nexport { handleCloudCompatRoute } from \"./routes/cloud-compat-routes\";\nexport { handleCloudRelayRoute } from \"./routes/cloud-relay-routes\";\nexport {\n type CloudRouteState,\n handleCloudRoute,\n} from \"./routes/cloud-routes-autonomous\";\nexport {\n handleCloudCodingContainerRoute,\n type CloudCodingContainerRouteState,\n} from \"./routes/cloud-coding-container-routes\";\nexport type { CloudConfigLike } from \"./routes/cloud-routes-autonomous\";\nexport { handleCloudStatusRoutes } from \"./routes/cloud-status-routes\";\nexport { runCloudSetup, type CloudSetupResult } from \"./cloud-setup\";\nexport { ClackObserver } from \"./cloud/clack-observer\";\nexport { NullCloudSetupObserver } from \"./cloud/null-observer\";\nexport type {\n AvailabilityResult,\n CloudSetupObserver,\n ConfirmPrompt,\n ProvisionSuccessInfo,\n SelectChoiceOption,\n SelectChoicePrompt,\n} from \"./cloud/setup-observer\";\nexport { CloudManager, type CloudManagerCallbacks } from \"./cloud/cloud-manager\";\nexport {\n getOrCreateClientAddressKey,\n persistCloudWalletCache,\n provisionCloudWalletsBestEffort,\n} from \"./cloud/cloud-wallet\";\nexport {\n normalizeCloudSecret,\n resolveCloudApiKey,\n} from \"./cloud/cloud-api-key\";\nexport {\n isCloudAuthApiKeyService,\n normalizeCloudApiKey,\n type CloudAuthApiKeyService,\n} from \"./cloud/auth-service-types\";\nexport {\n clearCloudSecrets,\n getCloudSecret,\n scrubCloudSecretsFromEnv,\n} from \"./lib/cloud-secrets\";\nexport {\n __resetCloudBaseUrlCache,\n ensureCloudTtsApiKeyAlias,\n handleCloudTtsPreviewRoute,\n mirrorCompatHeaders,\n resolveCloudTtsBaseUrl,\n resolveElevenLabsApiKeyForCloudMode,\n} from \"./lib/server-cloud-tts\";\nexport {\n fetchCloudVoiceCatalog,\n resetCloudVoiceCatalogCacheForTesting,\n setCloudVoiceClientFactoryForTesting,\n type CloudVoiceCatalogEntry,\n type CloudVoiceClient,\n} from \"./cloud-voice-catalog\";\nexport {\n CloudTtsUnavailableError,\n type CloudTextToSpeechParams,\n} from \"./models/speech\";\n"
|
|
34
72
|
],
|
|
35
|
-
"mappings": "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",
|
|
36
|
-
"debugId": "
|
|
73
|
+
"mappings": "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",
|
|
74
|
+
"debugId": "D06EFE0396EE9E0064756E2164756E21",
|
|
37
75
|
"names": []
|
|
38
76
|
}
|