@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
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for `fetchCloudVoiceCatalog`.
|
|
3
|
+
*
|
|
4
|
+
* The catalog merges two upstream endpoints (`getApiElevenlabsVoices` for
|
|
5
|
+
* premade voices and `getApiElevenlabsVoicesUser` for user-cloned voices)
|
|
6
|
+
* and caches the result in memory. These tests cover:
|
|
7
|
+
* - Normalization across the heterogeneous upstream shapes.
|
|
8
|
+
* - Cache hits within the TTL (no second SDK call).
|
|
9
|
+
* - Empty-array return when the runtime isn't cloud-connected (no SDK call
|
|
10
|
+
* at all, since the gate runs before the HTTP fetch).
|
|
11
|
+
* - Per-endpoint failure isolation (one endpoint erroring still surfaces
|
|
12
|
+
* the other's voices).
|
|
13
|
+
*
|
|
14
|
+
* The SDK client is swapped via `setCloudVoiceClientFactoryForTesting` so
|
|
15
|
+
* the tests never hit the real network and never need a working
|
|
16
|
+
* `createElizaCloudClient`. After each test we restore the factory.
|
|
17
|
+
*/
|
|
18
|
+
import type { IAgentRuntime } from "@elizaos/core";
|
|
19
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
20
|
+
|
|
21
|
+
import {
|
|
22
|
+
type CloudVoiceClient,
|
|
23
|
+
fetchCloudVoiceCatalog,
|
|
24
|
+
resetCloudVoiceCatalogCacheForTesting,
|
|
25
|
+
setCloudVoiceClientFactoryForTesting,
|
|
26
|
+
} from "./cloud-voice-catalog";
|
|
27
|
+
|
|
28
|
+
interface RuntimeOptions {
|
|
29
|
+
connected?: boolean;
|
|
30
|
+
apiKey?: string;
|
|
31
|
+
baseUrl?: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function makeRuntime(opts: RuntimeOptions = {}): IAgentRuntime {
|
|
35
|
+
const apiKey = opts.apiKey ?? "test-cloud-key";
|
|
36
|
+
const baseUrl = opts.baseUrl ?? "https://cloud.test.local/api/v1";
|
|
37
|
+
const enabled = opts.connected === false ? "false" : "true";
|
|
38
|
+
const settings: Record<string, string | null> = {
|
|
39
|
+
ELIZAOS_CLOUD_API_KEY: opts.connected === false ? null : apiKey,
|
|
40
|
+
ELIZAOS_CLOUD_ENABLED: enabled,
|
|
41
|
+
ELIZAOS_CLOUD_BASE_URL: baseUrl,
|
|
42
|
+
};
|
|
43
|
+
return {
|
|
44
|
+
getSetting: (key: string) => settings[key] ?? undefined,
|
|
45
|
+
} as unknown as IAgentRuntime;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
interface FakeRoutesCallLog {
|
|
49
|
+
premade: number;
|
|
50
|
+
user: number;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function makeFakeClient(payloads: {
|
|
54
|
+
premade?: unknown;
|
|
55
|
+
user?: unknown;
|
|
56
|
+
premadeError?: Error;
|
|
57
|
+
userError?: Error;
|
|
58
|
+
}): { client: CloudVoiceClient; calls: FakeRoutesCallLog } {
|
|
59
|
+
const calls: FakeRoutesCallLog = { premade: 0, user: 0 };
|
|
60
|
+
const client: CloudVoiceClient = {
|
|
61
|
+
routes: {
|
|
62
|
+
async getApiElevenlabsVoices<T = unknown>(): Promise<T> {
|
|
63
|
+
calls.premade += 1;
|
|
64
|
+
if (payloads.premadeError) throw payloads.premadeError;
|
|
65
|
+
return payloads.premade as T;
|
|
66
|
+
},
|
|
67
|
+
async getApiElevenlabsVoicesUser<T = unknown>(): Promise<T> {
|
|
68
|
+
calls.user += 1;
|
|
69
|
+
if (payloads.userError) throw payloads.userError;
|
|
70
|
+
return payloads.user as T;
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
return { client, calls };
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const PREMADE_VOICES_PAYLOAD = {
|
|
78
|
+
voices: [
|
|
79
|
+
{
|
|
80
|
+
voice_id: "EXAVITQu4vr4xnSDxMaL",
|
|
81
|
+
name: "Sarah",
|
|
82
|
+
preview_url: "https://cdn.example/sarah.mp3",
|
|
83
|
+
category: "premade",
|
|
84
|
+
labels: { gender: "female", language: "en" },
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
voice_id: "21m00Tcm4TlvDq8ikWAM",
|
|
88
|
+
name: "Rachel",
|
|
89
|
+
preview_url: "https://cdn.example/rachel.mp3",
|
|
90
|
+
category: "premade",
|
|
91
|
+
labels: { gender: "female" },
|
|
92
|
+
},
|
|
93
|
+
// Bare ID — should still normalize.
|
|
94
|
+
{ id: "minimal-id-voice" },
|
|
95
|
+
// Malformed entries should be dropped.
|
|
96
|
+
{},
|
|
97
|
+
null,
|
|
98
|
+
"not-an-object",
|
|
99
|
+
],
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const USER_VOICES_PAYLOAD = [
|
|
103
|
+
{
|
|
104
|
+
voice_id: "user-clone-1",
|
|
105
|
+
name: "My Clone",
|
|
106
|
+
category: "cloned",
|
|
107
|
+
labels: { gender: "male", language_code: "es" },
|
|
108
|
+
},
|
|
109
|
+
// Duplicate of a premade ID — premade should be deduped out, but the user
|
|
110
|
+
// entry should win (it comes first in the merge).
|
|
111
|
+
{
|
|
112
|
+
voice_id: "EXAVITQu4vr4xnSDxMaL",
|
|
113
|
+
name: "Sarah (clone)",
|
|
114
|
+
},
|
|
115
|
+
];
|
|
116
|
+
|
|
117
|
+
describe("fetchCloudVoiceCatalog", () => {
|
|
118
|
+
beforeEach(() => {
|
|
119
|
+
resetCloudVoiceCatalogCacheForTesting();
|
|
120
|
+
});
|
|
121
|
+
afterEach(() => {
|
|
122
|
+
setCloudVoiceClientFactoryForTesting(null);
|
|
123
|
+
resetCloudVoiceCatalogCacheForTesting();
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it("returns an empty array when the runtime is not cloud-connected (no SDK calls)", async () => {
|
|
127
|
+
const { client, calls } = makeFakeClient({
|
|
128
|
+
premade: PREMADE_VOICES_PAYLOAD,
|
|
129
|
+
user: USER_VOICES_PAYLOAD,
|
|
130
|
+
});
|
|
131
|
+
setCloudVoiceClientFactoryForTesting(() => client);
|
|
132
|
+
|
|
133
|
+
const voices = await fetchCloudVoiceCatalog(makeRuntime({ connected: false }));
|
|
134
|
+
expect(voices).toEqual([]);
|
|
135
|
+
// The gate runs before the HTTP fetch, so neither endpoint is called.
|
|
136
|
+
expect(calls.premade).toBe(0);
|
|
137
|
+
expect(calls.user).toBe(0);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it("normalizes premade + user voices and dedupes by id (user wins)", async () => {
|
|
141
|
+
const { client, calls } = makeFakeClient({
|
|
142
|
+
premade: PREMADE_VOICES_PAYLOAD,
|
|
143
|
+
user: USER_VOICES_PAYLOAD,
|
|
144
|
+
});
|
|
145
|
+
setCloudVoiceClientFactoryForTesting(() => client);
|
|
146
|
+
|
|
147
|
+
const voices = await fetchCloudVoiceCatalog(makeRuntime());
|
|
148
|
+
|
|
149
|
+
expect(calls.premade).toBe(1);
|
|
150
|
+
expect(calls.user).toBe(1);
|
|
151
|
+
|
|
152
|
+
// Expected order: user voices first (clone + dupe), then unique premade.
|
|
153
|
+
const ids = voices.map((v) => v.id);
|
|
154
|
+
expect(ids).toEqual([
|
|
155
|
+
"user-clone-1",
|
|
156
|
+
"EXAVITQu4vr4xnSDxMaL", // dupe — user copy wins
|
|
157
|
+
"21m00Tcm4TlvDq8ikWAM",
|
|
158
|
+
"minimal-id-voice",
|
|
159
|
+
]);
|
|
160
|
+
|
|
161
|
+
// User clone normalization.
|
|
162
|
+
const userClone = voices.find((v) => v.id === "user-clone-1");
|
|
163
|
+
expect(userClone).toMatchObject({
|
|
164
|
+
id: "user-clone-1",
|
|
165
|
+
name: "My Clone",
|
|
166
|
+
gender: "male",
|
|
167
|
+
category: "cloned",
|
|
168
|
+
language: "es",
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
// Premade normalization.
|
|
172
|
+
const rachel = voices.find((v) => v.id === "21m00Tcm4TlvDq8ikWAM");
|
|
173
|
+
expect(rachel).toMatchObject({
|
|
174
|
+
id: "21m00Tcm4TlvDq8ikWAM",
|
|
175
|
+
name: "Rachel",
|
|
176
|
+
preview: "https://cdn.example/rachel.mp3",
|
|
177
|
+
gender: "female",
|
|
178
|
+
category: "premade",
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
// Dedupe: the user copy of Sarah (cloned) wins over the premade entry.
|
|
182
|
+
const sarah = voices.find((v) => v.id === "EXAVITQu4vr4xnSDxMaL");
|
|
183
|
+
expect(sarah?.name).toBe("Sarah (clone)");
|
|
184
|
+
|
|
185
|
+
// Bare-id entry has a fallback display name.
|
|
186
|
+
const minimal = voices.find((v) => v.id === "minimal-id-voice");
|
|
187
|
+
expect(minimal?.name).toBe("minimal-id-voice");
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it("caches results within the 1h TTL — second call does not refetch", async () => {
|
|
191
|
+
const { client, calls } = makeFakeClient({
|
|
192
|
+
premade: PREMADE_VOICES_PAYLOAD,
|
|
193
|
+
user: USER_VOICES_PAYLOAD,
|
|
194
|
+
});
|
|
195
|
+
setCloudVoiceClientFactoryForTesting(() => client);
|
|
196
|
+
|
|
197
|
+
const runtime = makeRuntime();
|
|
198
|
+
const a = await fetchCloudVoiceCatalog(runtime);
|
|
199
|
+
const b = await fetchCloudVoiceCatalog(runtime);
|
|
200
|
+
expect(a).toBe(b);
|
|
201
|
+
expect(calls.premade).toBe(1);
|
|
202
|
+
expect(calls.user).toBe(1);
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it("uses different cache entries per runtime base URL + API key", async () => {
|
|
206
|
+
const { client, calls } = makeFakeClient({
|
|
207
|
+
premade: PREMADE_VOICES_PAYLOAD,
|
|
208
|
+
user: USER_VOICES_PAYLOAD,
|
|
209
|
+
});
|
|
210
|
+
setCloudVoiceClientFactoryForTesting(() => client);
|
|
211
|
+
|
|
212
|
+
await fetchCloudVoiceCatalog(makeRuntime({ apiKey: "key-1" }));
|
|
213
|
+
await fetchCloudVoiceCatalog(makeRuntime({ apiKey: "key-2" }));
|
|
214
|
+
// Each runtime gets its own cache slot — both fetched once.
|
|
215
|
+
expect(calls.premade).toBe(2);
|
|
216
|
+
expect(calls.user).toBe(2);
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
it("isolates per-endpoint failures — one endpoint erroring still returns the other's voices", async () => {
|
|
220
|
+
const { client } = makeFakeClient({
|
|
221
|
+
premade: PREMADE_VOICES_PAYLOAD,
|
|
222
|
+
userError: new Error("user endpoint down"),
|
|
223
|
+
});
|
|
224
|
+
setCloudVoiceClientFactoryForTesting(() => client);
|
|
225
|
+
|
|
226
|
+
const voices = await fetchCloudVoiceCatalog(makeRuntime());
|
|
227
|
+
// Only premade voices come back; the user endpoint failure is swallowed.
|
|
228
|
+
expect(voices.map((v) => v.id).sort()).toEqual(
|
|
229
|
+
["21m00Tcm4TlvDq8ikWAM", "EXAVITQu4vr4xnSDxMaL", "minimal-id-voice"].sort(),
|
|
230
|
+
);
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
it("returns empty array when both endpoints fail", async () => {
|
|
234
|
+
const { client } = makeFakeClient({
|
|
235
|
+
premadeError: new Error("premade endpoint down"),
|
|
236
|
+
userError: new Error("user endpoint down"),
|
|
237
|
+
});
|
|
238
|
+
setCloudVoiceClientFactoryForTesting(() => client);
|
|
239
|
+
|
|
240
|
+
const voices = await fetchCloudVoiceCatalog(makeRuntime());
|
|
241
|
+
expect(voices).toEqual([]);
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
it("accepts bare-array payloads (some upstream variants return arrays)", async () => {
|
|
245
|
+
const { client } = makeFakeClient({
|
|
246
|
+
premade: [{ voice_id: "premade-1", name: "Premade One" }],
|
|
247
|
+
user: { items: [{ voice_id: "user-1", name: "User One" }] },
|
|
248
|
+
});
|
|
249
|
+
setCloudVoiceClientFactoryForTesting(() => client);
|
|
250
|
+
|
|
251
|
+
const voices = await fetchCloudVoiceCatalog(makeRuntime());
|
|
252
|
+
expect(voices.map((v) => v.id).sort()).toEqual(["premade-1", "user-1"]);
|
|
253
|
+
});
|
|
254
|
+
});
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloud-routed ElevenLabs voice catalog.
|
|
3
|
+
*
|
|
4
|
+
* The Eliza Cloud SDK exposes two voice-listing endpoints:
|
|
5
|
+
* - `GET /api/elevenlabs/voices` — ElevenLabs **premade** voices (shared).
|
|
6
|
+
* - `GET /api/elevenlabs/voices/user` — voices cloned / saved by the
|
|
7
|
+
* authenticated user.
|
|
8
|
+
*
|
|
9
|
+
* We expose the union of both to consumers so the dashboard, the agent, and
|
|
10
|
+
* any other client see the full set of voices the user can actually use.
|
|
11
|
+
*
|
|
12
|
+
* Results are cached in-memory for {@link CACHE_TTL_MS} (1 hour). The cache
|
|
13
|
+
* is keyed by the runtime's cloud base URL + API key so multi-tenant or
|
|
14
|
+
* test-isolated runtimes don't share entries. On any fetch error we return
|
|
15
|
+
* a normalized empty list rather than throwing — callers can decide whether
|
|
16
|
+
* to surface a UI hint.
|
|
17
|
+
*/
|
|
18
|
+
import type { IAgentRuntime } from "@elizaos/core";
|
|
19
|
+
import { isCloudConnected, logger, toRuntimeSettings } from "@elizaos/core";
|
|
20
|
+
import { getApiKey, getBaseURL } from "./utils/config";
|
|
21
|
+
import { createElizaCloudClient } from "./utils/sdk-client";
|
|
22
|
+
|
|
23
|
+
const CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour
|
|
24
|
+
|
|
25
|
+
export interface CloudVoiceCatalogEntry {
|
|
26
|
+
id: string;
|
|
27
|
+
name: string;
|
|
28
|
+
gender?: string;
|
|
29
|
+
preview?: string;
|
|
30
|
+
category?: string;
|
|
31
|
+
language?: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Narrow interface the catalog actually uses. Lets tests substitute a
|
|
36
|
+
* fake without rebuilding the full SDK surface.
|
|
37
|
+
*/
|
|
38
|
+
export interface CloudVoiceClient {
|
|
39
|
+
routes: {
|
|
40
|
+
getApiElevenlabsVoices<T = unknown>(options?: {
|
|
41
|
+
query?: Record<string, unknown>;
|
|
42
|
+
}): Promise<T>;
|
|
43
|
+
getApiElevenlabsVoicesUser<T = unknown>(options?: {
|
|
44
|
+
query?: Record<string, unknown>;
|
|
45
|
+
}): Promise<T>;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
type ClientFactory = (runtime: IAgentRuntime) => CloudVoiceClient;
|
|
50
|
+
|
|
51
|
+
let clientFactory: ClientFactory = (runtime) =>
|
|
52
|
+
createElizaCloudClient(runtime) as unknown as CloudVoiceClient;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Test seam: substitute the SDK client factory. Pass `null` to reset to
|
|
56
|
+
* the real `createElizaCloudClient`. Production code should never call
|
|
57
|
+
* this.
|
|
58
|
+
*/
|
|
59
|
+
export function setCloudVoiceClientFactoryForTesting(
|
|
60
|
+
factory: ClientFactory | null,
|
|
61
|
+
): void {
|
|
62
|
+
if (factory === null) {
|
|
63
|
+
clientFactory = (runtime) =>
|
|
64
|
+
createElizaCloudClient(runtime) as unknown as CloudVoiceClient;
|
|
65
|
+
} else {
|
|
66
|
+
clientFactory = factory;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
interface CacheEntry {
|
|
71
|
+
fetchedAt: number;
|
|
72
|
+
voices: CloudVoiceCatalogEntry[];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Module-level cache. Keyed by `${baseUrl}|${apiKey}`. */
|
|
76
|
+
const cache = new Map<string, CacheEntry>();
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Test seam: drop the in-memory cache. Production code should never call
|
|
80
|
+
* this; the TTL handles eviction by itself.
|
|
81
|
+
*/
|
|
82
|
+
export function resetCloudVoiceCatalogCacheForTesting(): void {
|
|
83
|
+
cache.clear();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function cacheKeyFor(runtime: IAgentRuntime): string {
|
|
87
|
+
const baseUrl = getBaseURL(runtime) || "";
|
|
88
|
+
const apiKey = getApiKey(runtime) || "";
|
|
89
|
+
return `${baseUrl}|${apiKey}`;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function pickString(
|
|
93
|
+
record: Record<string, unknown>,
|
|
94
|
+
key: string,
|
|
95
|
+
): string | undefined {
|
|
96
|
+
const v = record[key];
|
|
97
|
+
return typeof v === "string" && v.trim() ? v.trim() : undefined;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function pickStringFromAny(
|
|
101
|
+
record: Record<string, unknown>,
|
|
102
|
+
...keys: string[]
|
|
103
|
+
): string | undefined {
|
|
104
|
+
for (const key of keys) {
|
|
105
|
+
const v = pickString(record, key);
|
|
106
|
+
if (v) return v;
|
|
107
|
+
}
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function asRecord(value: unknown): Record<string, unknown> | null {
|
|
112
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return null;
|
|
113
|
+
return value as Record<string, unknown>;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Best-effort normalizer for the heterogeneous shapes the upstream returns.
|
|
118
|
+
*
|
|
119
|
+
* ElevenLabs's premade voices include `labels: { gender, accent, ... }`,
|
|
120
|
+
* `preview_url`, `category`. User-cloned voices look very similar but may
|
|
121
|
+
* omit some fields. We accept any shape that has at least a `voice_id`
|
|
122
|
+
* (or `id`) and produce a uniform record.
|
|
123
|
+
*/
|
|
124
|
+
function normalizeVoiceEntry(raw: unknown): CloudVoiceCatalogEntry | null {
|
|
125
|
+
const record = asRecord(raw);
|
|
126
|
+
if (!record) return null;
|
|
127
|
+
const id = pickStringFromAny(record, "voice_id", "voiceId", "id");
|
|
128
|
+
if (!id) return null;
|
|
129
|
+
|
|
130
|
+
const name =
|
|
131
|
+
pickStringFromAny(record, "name", "display_name", "displayName") ?? id;
|
|
132
|
+
const preview = pickStringFromAny(
|
|
133
|
+
record,
|
|
134
|
+
"preview_url",
|
|
135
|
+
"previewUrl",
|
|
136
|
+
"preview",
|
|
137
|
+
);
|
|
138
|
+
const category = pickStringFromAny(record, "category");
|
|
139
|
+
|
|
140
|
+
// `labels` is the canonical ElevenLabs metadata block.
|
|
141
|
+
const labels = asRecord(record.labels);
|
|
142
|
+
const gender =
|
|
143
|
+
pickStringFromAny(record, "gender") ??
|
|
144
|
+
(labels ? pickStringFromAny(labels, "gender") : undefined);
|
|
145
|
+
const language =
|
|
146
|
+
pickStringFromAny(record, "language", "language_code", "languageCode") ??
|
|
147
|
+
(labels
|
|
148
|
+
? pickStringFromAny(labels, "language", "language_code", "languageCode")
|
|
149
|
+
: undefined);
|
|
150
|
+
|
|
151
|
+
return {
|
|
152
|
+
id,
|
|
153
|
+
name,
|
|
154
|
+
...(gender ? { gender } : {}),
|
|
155
|
+
...(preview ? { preview } : {}),
|
|
156
|
+
...(category ? { category } : {}),
|
|
157
|
+
...(language ? { language } : {}),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Some endpoints return `{ voices: [...] }`, others return a bare array.
|
|
163
|
+
* Accept both.
|
|
164
|
+
*/
|
|
165
|
+
function extractVoiceArray(payload: unknown): unknown[] {
|
|
166
|
+
if (Array.isArray(payload)) return payload;
|
|
167
|
+
const record = asRecord(payload);
|
|
168
|
+
if (!record) return [];
|
|
169
|
+
for (const key of ["voices", "data", "items", "results"]) {
|
|
170
|
+
const v = record[key];
|
|
171
|
+
if (Array.isArray(v)) return v;
|
|
172
|
+
}
|
|
173
|
+
return [];
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function dedupeById(entries: CloudVoiceCatalogEntry[]): CloudVoiceCatalogEntry[] {
|
|
177
|
+
const seen = new Set<string>();
|
|
178
|
+
const out: CloudVoiceCatalogEntry[] = [];
|
|
179
|
+
for (const entry of entries) {
|
|
180
|
+
if (seen.has(entry.id)) continue;
|
|
181
|
+
seen.add(entry.id);
|
|
182
|
+
out.push(entry);
|
|
183
|
+
}
|
|
184
|
+
return out;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
async function fetchEndpointVoices(
|
|
188
|
+
runtime: IAgentRuntime,
|
|
189
|
+
endpoint: "premade" | "user",
|
|
190
|
+
): Promise<CloudVoiceCatalogEntry[]> {
|
|
191
|
+
try {
|
|
192
|
+
const client = clientFactory(runtime);
|
|
193
|
+
const payload =
|
|
194
|
+
endpoint === "premade"
|
|
195
|
+
? await client.routes.getApiElevenlabsVoices<unknown>()
|
|
196
|
+
: await client.routes.getApiElevenlabsVoicesUser<unknown>();
|
|
197
|
+
const raw = extractVoiceArray(payload);
|
|
198
|
+
const normalized: CloudVoiceCatalogEntry[] = [];
|
|
199
|
+
for (const entry of raw) {
|
|
200
|
+
const v = normalizeVoiceEntry(entry);
|
|
201
|
+
if (v) normalized.push(v);
|
|
202
|
+
}
|
|
203
|
+
return normalized;
|
|
204
|
+
} catch (err) {
|
|
205
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
206
|
+
logger.debug(
|
|
207
|
+
`[ELIZAOS_CLOUD] voice catalog ${endpoint} fetch failed: ${message}`,
|
|
208
|
+
);
|
|
209
|
+
return [];
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Fetch the user-visible voice catalog from Eliza Cloud (premade + cloned).
|
|
215
|
+
*
|
|
216
|
+
* Returns an empty array when:
|
|
217
|
+
* - Eliza Cloud isn't connected (no API key / not enabled).
|
|
218
|
+
* - Both upstream endpoints fail (network, auth, etc.).
|
|
219
|
+
*
|
|
220
|
+
* Results are cached for {@link CACHE_TTL_MS} per runtime. Subsequent calls
|
|
221
|
+
* within that window are served from memory.
|
|
222
|
+
*/
|
|
223
|
+
export async function fetchCloudVoiceCatalog(
|
|
224
|
+
runtime: IAgentRuntime,
|
|
225
|
+
): Promise<CloudVoiceCatalogEntry[]> {
|
|
226
|
+
if (!isCloudConnected(toRuntimeSettings(runtime))) {
|
|
227
|
+
return [];
|
|
228
|
+
}
|
|
229
|
+
const key = cacheKeyFor(runtime);
|
|
230
|
+
const now = Date.now();
|
|
231
|
+
const cached = cache.get(key);
|
|
232
|
+
if (cached && now - cached.fetchedAt < CACHE_TTL_MS) {
|
|
233
|
+
return cached.voices;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
const [premade, user] = await Promise.all([
|
|
237
|
+
fetchEndpointVoices(runtime, "premade"),
|
|
238
|
+
fetchEndpointVoices(runtime, "user"),
|
|
239
|
+
]);
|
|
240
|
+
|
|
241
|
+
// User voices first so cloned voices appear before the shared premade
|
|
242
|
+
// list — most users care about their own clones.
|
|
243
|
+
const merged = dedupeById([...user, ...premade]);
|
|
244
|
+
cache.set(key, { fetchedAt: now, voices: merged });
|
|
245
|
+
return merged;
|
|
246
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Plugin } from "@elizaos/core";
|
|
2
|
+
|
|
3
|
+
export const elizaOSCloudPlugin: Plugin = {
|
|
4
|
+
name: "elizaOSCloud",
|
|
5
|
+
description:
|
|
6
|
+
"ElizaOS Cloud browser facade. Node-only routes and services are exported from the node entry.",
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
// Browser-side unavailable facades for the named exports that ship from the Node
|
|
10
|
+
// entry. The renderer needs the names to statically resolve so the bundler
|
|
11
|
+
// doesn't fail with MISSING_EXPORT. These functions are never executed in
|
|
12
|
+
// the browser since the consumers are server-side routes; in eliza local-mode
|
|
13
|
+
// the bundled `app-core/dist/api/server.js` imports them at module-load time.
|
|
14
|
+
const unavailableBrowserExport = (): undefined => undefined;
|
|
15
|
+
|
|
16
|
+
export function getCloudSecret(
|
|
17
|
+
_key?: "ELIZAOS_CLOUD_API_KEY" | "ELIZAOS_CLOUD_ENABLED",
|
|
18
|
+
): string | undefined {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function clearCloudSecrets(): void {}
|
|
23
|
+
|
|
24
|
+
export const ensureCloudTtsApiKeyAlias = unavailableBrowserExport;
|
|
25
|
+
export const handleCloudTtsPreviewRoute = unavailableBrowserExport;
|
|
26
|
+
export const mirrorCompatHeaders = unavailableBrowserExport;
|
|
27
|
+
export const normalizeCloudSiteUrl = unavailableBrowserExport;
|
|
28
|
+
export const scrubCloudSecretsFromEnv = unavailableBrowserExport;
|
|
29
|
+
export const __resetCloudBaseUrlCache = unavailableBrowserExport;
|
|
30
|
+
export const resolveCloudTtsBaseUrl = unavailableBrowserExport;
|
|
31
|
+
export const resolveElevenLabsApiKeyForCloudMode = unavailableBrowserExport;
|
|
32
|
+
// `resolveCloudApiBaseUrl` is referenced statically by plugin-wallet's
|
|
33
|
+
// browser bundle (the cloud-routing fallback path). The renderer doesn't
|
|
34
|
+
// run the Node-side resolver; the consumer just needs the name to bind
|
|
35
|
+
// so Rolldown's MISSING_EXPORT check passes.
|
|
36
|
+
export const resolveCloudApiBaseUrl = (): undefined => undefined;
|
|
37
|
+
|
|
38
|
+
export * from "./types";
|
|
39
|
+
export default elizaOSCloudPlugin;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import pluginDefault from "./index.js";
|
|
2
|
+
|
|
3
|
+
export * from "./index.js";
|
|
4
|
+
export default pluginDefault;
|
|
5
|
+
|
|
6
|
+
// Node-only route handlers (depend on node:os and other node built-ins).
|
|
7
|
+
export { handleCloudBillingRoute } from "./routes/cloud-billing-routes";
|
|
8
|
+
export { handleCloudCompatRoute } from "./routes/cloud-compat-routes";
|
|
9
|
+
export { handleCloudRelayRoute } from "./routes/cloud-relay-routes";
|
|
10
|
+
export {
|
|
11
|
+
type CloudRouteState,
|
|
12
|
+
handleCloudRoute,
|
|
13
|
+
} from "./routes/cloud-routes-autonomous";
|
|
14
|
+
export {
|
|
15
|
+
handleCloudCodingContainerRoute,
|
|
16
|
+
type CloudCodingContainerRouteState,
|
|
17
|
+
} from "./routes/cloud-coding-container-routes";
|
|
18
|
+
export type { CloudConfigLike } from "./routes/cloud-routes-autonomous";
|
|
19
|
+
export { handleCloudStatusRoutes } from "./routes/cloud-status-routes";
|
|
20
|
+
export { runCloudSetup, type CloudSetupResult } from "./cloud-setup";
|
|
21
|
+
export { ClackObserver } from "./cloud/clack-observer";
|
|
22
|
+
export { NullCloudSetupObserver } from "./cloud/null-observer";
|
|
23
|
+
export type {
|
|
24
|
+
AvailabilityResult,
|
|
25
|
+
CloudSetupObserver,
|
|
26
|
+
ConfirmPrompt,
|
|
27
|
+
ProvisionSuccessInfo,
|
|
28
|
+
SelectChoiceOption,
|
|
29
|
+
SelectChoicePrompt,
|
|
30
|
+
} from "./cloud/setup-observer";
|
|
31
|
+
export { CloudManager, type CloudManagerCallbacks } from "./cloud/cloud-manager";
|
|
32
|
+
export {
|
|
33
|
+
getOrCreateClientAddressKey,
|
|
34
|
+
persistCloudWalletCache,
|
|
35
|
+
provisionCloudWalletsBestEffort,
|
|
36
|
+
} from "./cloud/cloud-wallet";
|
|
37
|
+
export {
|
|
38
|
+
normalizeCloudSecret,
|
|
39
|
+
resolveCloudApiKey,
|
|
40
|
+
} from "./cloud/cloud-api-key";
|
|
41
|
+
export {
|
|
42
|
+
isCloudAuthApiKeyService,
|
|
43
|
+
normalizeCloudApiKey,
|
|
44
|
+
type CloudAuthApiKeyService,
|
|
45
|
+
} from "./cloud/auth-service-types";
|
|
46
|
+
export {
|
|
47
|
+
clearCloudSecrets,
|
|
48
|
+
getCloudSecret,
|
|
49
|
+
scrubCloudSecretsFromEnv,
|
|
50
|
+
} from "./lib/cloud-secrets";
|
|
51
|
+
export {
|
|
52
|
+
__resetCloudBaseUrlCache,
|
|
53
|
+
ensureCloudTtsApiKeyAlias,
|
|
54
|
+
handleCloudTtsPreviewRoute,
|
|
55
|
+
mirrorCompatHeaders,
|
|
56
|
+
resolveCloudTtsBaseUrl,
|
|
57
|
+
resolveElevenLabsApiKeyForCloudMode,
|
|
58
|
+
} from "./lib/server-cloud-tts";
|
|
59
|
+
export {
|
|
60
|
+
fetchCloudVoiceCatalog,
|
|
61
|
+
resetCloudVoiceCatalogCacheForTesting,
|
|
62
|
+
setCloudVoiceClientFactoryForTesting,
|
|
63
|
+
type CloudVoiceCatalogEntry,
|
|
64
|
+
type CloudVoiceClient,
|
|
65
|
+
} from "./cloud-voice-catalog";
|
|
66
|
+
export {
|
|
67
|
+
CloudTtsUnavailableError,
|
|
68
|
+
type CloudTextToSpeechParams,
|
|
69
|
+
} from "./models/speech";
|