@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,198 @@
|
|
|
1
|
+
import type http from "node:http";
|
|
2
|
+
import {
|
|
3
|
+
PromoteVfsToCloudContainerRequestSchema,
|
|
4
|
+
RequestCodingAgentContainerRequestSchema,
|
|
5
|
+
SyncCloudCodingContainerRequestSchema,
|
|
6
|
+
} from "@elizaos/shared";
|
|
7
|
+
import type {
|
|
8
|
+
PromoteVfsToCloudContainerRequest,
|
|
9
|
+
PromoteVfsToCloudContainerResponse,
|
|
10
|
+
RequestCodingAgentContainerRequest,
|
|
11
|
+
RequestCodingAgentContainerResponse,
|
|
12
|
+
SyncCloudCodingContainerRequest,
|
|
13
|
+
SyncCloudCodingContainerResponse,
|
|
14
|
+
} from "../types/cloud";
|
|
15
|
+
import { sendJson, sendJsonError } from "../lib/http";
|
|
16
|
+
|
|
17
|
+
export interface CloudCodingContainerRouteState {
|
|
18
|
+
runtime: {
|
|
19
|
+
getService?: (name: string) => unknown;
|
|
20
|
+
} | null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface CodingContainerServiceLike {
|
|
24
|
+
promoteVfsToCloudContainer(
|
|
25
|
+
request: PromoteVfsToCloudContainerRequest,
|
|
26
|
+
): Promise<PromoteVfsToCloudContainerResponse>;
|
|
27
|
+
requestCodingAgentContainer(
|
|
28
|
+
request: RequestCodingAgentContainerRequest,
|
|
29
|
+
): Promise<RequestCodingAgentContainerResponse>;
|
|
30
|
+
syncCodingContainerChanges(
|
|
31
|
+
containerId: string,
|
|
32
|
+
request: SyncCloudCodingContainerRequest,
|
|
33
|
+
): Promise<SyncCloudCodingContainerResponse>;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export async function handleCloudCodingContainerRoute(
|
|
37
|
+
req: http.IncomingMessage,
|
|
38
|
+
res: http.ServerResponse,
|
|
39
|
+
pathname: string,
|
|
40
|
+
method: string,
|
|
41
|
+
state: CloudCodingContainerRouteState,
|
|
42
|
+
): Promise<boolean> {
|
|
43
|
+
if (
|
|
44
|
+
method === "POST" &&
|
|
45
|
+
pathname === "/api/cloud/coding-containers/promotions"
|
|
46
|
+
) {
|
|
47
|
+
const service = getCloudContainerService(state);
|
|
48
|
+
if (!service) {
|
|
49
|
+
sendJsonError(res, "Cloud container service is not available", 503);
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
const body = await readJsonBody(req, res);
|
|
53
|
+
if (!body) return true;
|
|
54
|
+
const parsed = PromoteVfsToCloudContainerRequestSchema.safeParse(body);
|
|
55
|
+
if (!parsed.success) {
|
|
56
|
+
sendJsonError(
|
|
57
|
+
res,
|
|
58
|
+
parsed.error.issues[0]?.message ?? "Invalid promotion request",
|
|
59
|
+
400,
|
|
60
|
+
);
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
await sendServiceResponse(res, () =>
|
|
64
|
+
service.promoteVfsToCloudContainer(
|
|
65
|
+
parsed.data as PromoteVfsToCloudContainerRequest,
|
|
66
|
+
),
|
|
67
|
+
);
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (method === "POST" && pathname === "/api/cloud/coding-containers") {
|
|
72
|
+
const service = getCloudContainerService(state);
|
|
73
|
+
if (!service) {
|
|
74
|
+
sendJsonError(res, "Cloud container service is not available", 503);
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
const body = await readJsonBody(req, res);
|
|
78
|
+
if (!body) return true;
|
|
79
|
+
const parsed = RequestCodingAgentContainerRequestSchema.safeParse(body);
|
|
80
|
+
if (!parsed.success) {
|
|
81
|
+
sendJsonError(
|
|
82
|
+
res,
|
|
83
|
+
parsed.error.issues[0]?.message ?? "Invalid coding container request",
|
|
84
|
+
400,
|
|
85
|
+
);
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
await sendServiceResponse(res, () =>
|
|
89
|
+
service.requestCodingAgentContainer(
|
|
90
|
+
parsed.data as RequestCodingAgentContainerRequest,
|
|
91
|
+
),
|
|
92
|
+
);
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const syncMatch = /^\/api\/cloud\/coding-containers\/([^/]+)\/sync$/.exec(
|
|
97
|
+
pathname,
|
|
98
|
+
);
|
|
99
|
+
if (method === "POST" && syncMatch) {
|
|
100
|
+
const service = getCloudContainerService(state);
|
|
101
|
+
if (!service) {
|
|
102
|
+
sendJsonError(res, "Cloud container service is not available", 503);
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
const containerId = decodeURIComponent(syncMatch[1]);
|
|
106
|
+
const body = await readJsonBody(req, res);
|
|
107
|
+
if (!body) return true;
|
|
108
|
+
const parsed = SyncCloudCodingContainerRequestSchema.safeParse(body);
|
|
109
|
+
if (!parsed.success) {
|
|
110
|
+
sendJsonError(
|
|
111
|
+
res,
|
|
112
|
+
parsed.error.issues[0]?.message ?? "Invalid sync request",
|
|
113
|
+
400,
|
|
114
|
+
);
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
await sendServiceResponse(res, () =>
|
|
118
|
+
service.syncCodingContainerChanges(
|
|
119
|
+
containerId,
|
|
120
|
+
parsed.data as SyncCloudCodingContainerRequest,
|
|
121
|
+
),
|
|
122
|
+
);
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function getCloudContainerService(
|
|
130
|
+
state: CloudCodingContainerRouteState,
|
|
131
|
+
): CodingContainerServiceLike | null {
|
|
132
|
+
const service =
|
|
133
|
+
state.runtime?.getService?.("CLOUD_CONTAINER") ??
|
|
134
|
+
state.runtime?.getService?.("cloud-container") ??
|
|
135
|
+
state.runtime?.getService?.("cloudContainer");
|
|
136
|
+
if (!service || typeof service !== "object") return null;
|
|
137
|
+
const candidate = service as Partial<CodingContainerServiceLike>;
|
|
138
|
+
if (
|
|
139
|
+
typeof candidate.promoteVfsToCloudContainer === "function" &&
|
|
140
|
+
typeof candidate.requestCodingAgentContainer === "function" &&
|
|
141
|
+
typeof candidate.syncCodingContainerChanges === "function"
|
|
142
|
+
) {
|
|
143
|
+
return candidate as CodingContainerServiceLike;
|
|
144
|
+
}
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
async function readJsonBody(
|
|
149
|
+
req: http.IncomingMessage,
|
|
150
|
+
res: http.ServerResponse,
|
|
151
|
+
): Promise<Record<string, unknown> | null> {
|
|
152
|
+
const preParsed = (req as http.IncomingMessage & { body?: unknown }).body;
|
|
153
|
+
if (
|
|
154
|
+
preParsed &&
|
|
155
|
+
typeof preParsed === "object" &&
|
|
156
|
+
!Array.isArray(preParsed)
|
|
157
|
+
) {
|
|
158
|
+
return preParsed as Record<string, unknown>;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const chunks: Buffer[] = [];
|
|
162
|
+
for await (const chunk of req) {
|
|
163
|
+
chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
|
|
164
|
+
}
|
|
165
|
+
const raw = Buffer.concat(chunks).toString("utf8").trim();
|
|
166
|
+
if (!raw) return {};
|
|
167
|
+
let parsed: unknown;
|
|
168
|
+
try {
|
|
169
|
+
parsed = JSON.parse(raw) as unknown;
|
|
170
|
+
} catch {
|
|
171
|
+
sendJsonError(res, "Invalid JSON body", 400);
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
175
|
+
sendJsonError(res, "Invalid JSON body", 400);
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
return parsed as Record<string, unknown>;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
async function sendServiceResponse(
|
|
182
|
+
res: http.ServerResponse,
|
|
183
|
+
fn: () => Promise<unknown>,
|
|
184
|
+
): Promise<void> {
|
|
185
|
+
try {
|
|
186
|
+
sendJson(res, await fn());
|
|
187
|
+
} catch (error) {
|
|
188
|
+
const status =
|
|
189
|
+
typeof (error as { statusCode?: unknown })?.statusCode === "number"
|
|
190
|
+
? (error as { statusCode: number }).statusCode
|
|
191
|
+
: 500;
|
|
192
|
+
sendJsonError(
|
|
193
|
+
res,
|
|
194
|
+
error instanceof Error ? error.message : String(error),
|
|
195
|
+
status,
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import type http from "node:http";
|
|
2
|
+
import type { AgentRuntime, Service } from "@elizaos/core";
|
|
3
|
+
import { logger } from "@elizaos/core";
|
|
4
|
+
import { normalizeCloudSiteUrl } from "../cloud/base-url.js";
|
|
5
|
+
import {
|
|
6
|
+
type CloudAuthApiKeyService,
|
|
7
|
+
normalizeCloudApiKey,
|
|
8
|
+
} from "../cloud/auth-service-types";
|
|
9
|
+
import { resolveCloudApiKey } from "../cloud/cloud-api-key.js";
|
|
10
|
+
import { validateCloudBaseUrl } from "../cloud/validate-url.js";
|
|
11
|
+
import type { CloudProxyConfigLike } from "../lib/config-like";
|
|
12
|
+
import { sendJson, sendJsonError } from "../lib/http";
|
|
13
|
+
|
|
14
|
+
export interface CloudCompatRouteState {
|
|
15
|
+
config: CloudProxyConfigLike;
|
|
16
|
+
runtime?: AgentRuntime | null;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const PROXY_TIMEOUT_MS = 15_000;
|
|
20
|
+
const MAX_BODY_BYTES = 1_048_576;
|
|
21
|
+
const JSON_CONTENT_TYPE_RE = /\b(?:application\/json|[^;\s]+\+json)\b/i;
|
|
22
|
+
|
|
23
|
+
export function resolveCloudBaseUrl(config: CloudProxyConfigLike): string {
|
|
24
|
+
return normalizeCloudSiteUrl(config.cloud?.baseUrl);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function resolveProxyApiKey(state: CloudCompatRouteState): string | null {
|
|
28
|
+
const cloudAuth = state.runtime
|
|
29
|
+
? state.runtime.getService<Service & CloudAuthApiKeyService>("CLOUD_AUTH")
|
|
30
|
+
: null;
|
|
31
|
+
const runtimeApiKey =
|
|
32
|
+
cloudAuth?.isAuthenticated() === true
|
|
33
|
+
? normalizeCloudApiKey(cloudAuth.getApiKey?.())
|
|
34
|
+
: null;
|
|
35
|
+
|
|
36
|
+
return runtimeApiKey ?? resolveCloudApiKey(state.config, state.runtime);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function buildAuthHeaders(
|
|
40
|
+
config: CloudProxyConfigLike,
|
|
41
|
+
apiKeyOverride?: string | null,
|
|
42
|
+
): Record<string, string> {
|
|
43
|
+
const serviceKey = config.cloud?.serviceKey?.trim();
|
|
44
|
+
const apiKey =
|
|
45
|
+
normalizeCloudApiKey(apiKeyOverride) ?? resolveCloudApiKey(config);
|
|
46
|
+
|
|
47
|
+
const headers: Record<string, string> = {
|
|
48
|
+
"Content-Type": "application/json",
|
|
49
|
+
Accept: "application/json",
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
if (serviceKey) {
|
|
53
|
+
headers["X-Service-Key"] = serviceKey;
|
|
54
|
+
}
|
|
55
|
+
if (apiKey) {
|
|
56
|
+
headers.Authorization = `Bearer ${apiKey}`;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return headers;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function readBody(req: http.IncomingMessage): Promise<string | undefined> {
|
|
63
|
+
return new Promise<string | undefined>((resolve, reject) => {
|
|
64
|
+
const chunks: Buffer[] = [];
|
|
65
|
+
let size = 0;
|
|
66
|
+
req.on("data", (chunk: Buffer) => {
|
|
67
|
+
size += chunk.length;
|
|
68
|
+
if (size > MAX_BODY_BYTES) {
|
|
69
|
+
reject(new Error("Request body too large"));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
chunks.push(chunk);
|
|
73
|
+
});
|
|
74
|
+
req.on("end", () =>
|
|
75
|
+
resolve(
|
|
76
|
+
chunks.length > 0 ? Buffer.concat(chunks).toString("utf-8") : undefined,
|
|
77
|
+
),
|
|
78
|
+
);
|
|
79
|
+
req.on("error", reject);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async function fetchUpstream(
|
|
84
|
+
url: string,
|
|
85
|
+
method: string,
|
|
86
|
+
headers: Record<string, string>,
|
|
87
|
+
body: string | undefined,
|
|
88
|
+
): Promise<Response> {
|
|
89
|
+
const res = await fetch(url, {
|
|
90
|
+
method,
|
|
91
|
+
headers,
|
|
92
|
+
body,
|
|
93
|
+
redirect: "manual",
|
|
94
|
+
signal: AbortSignal.timeout(PROXY_TIMEOUT_MS),
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
if (res.status >= 300 && res.status < 400) {
|
|
98
|
+
throw Object.assign(new Error("redirect"), { code: "REDIRECT" });
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return res;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function summarizeUpstreamBody(bodyText: string): string {
|
|
105
|
+
const trimmed = bodyText.trim();
|
|
106
|
+
if (!trimmed) return "";
|
|
107
|
+
return trimmed.length > 300 ? `${trimmed.slice(0, 297)}...` : trimmed;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function isResourceCompatPath(pathname: string): boolean {
|
|
111
|
+
return pathname.split("/").filter(Boolean).length >= 5;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function sendUpstreamNotFound(
|
|
115
|
+
res: http.ServerResponse,
|
|
116
|
+
pathname: string,
|
|
117
|
+
upstreamBody?: unknown,
|
|
118
|
+
): void {
|
|
119
|
+
if (isResourceCompatPath(pathname)) {
|
|
120
|
+
sendJson(
|
|
121
|
+
res,
|
|
122
|
+
upstreamBody ?? {
|
|
123
|
+
success: false,
|
|
124
|
+
error: "Eliza Cloud returned 404 for this API route.",
|
|
125
|
+
code: "CLOUD_ROUTE_NOT_FOUND",
|
|
126
|
+
},
|
|
127
|
+
404,
|
|
128
|
+
);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
sendJson(
|
|
133
|
+
res,
|
|
134
|
+
{
|
|
135
|
+
success: false,
|
|
136
|
+
error: "This Cloud feature is not available yet.",
|
|
137
|
+
code: "CLOUD_NOT_READY",
|
|
138
|
+
},
|
|
139
|
+
404,
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
async function parseUpstreamJsonResponse(
|
|
144
|
+
upstreamRes: Response,
|
|
145
|
+
method: string,
|
|
146
|
+
): Promise<
|
|
147
|
+
| { kind: "head" }
|
|
148
|
+
| { kind: "empty" }
|
|
149
|
+
| { kind: "json"; body: unknown }
|
|
150
|
+
| { kind: "invalid-json"; bodyText: string }
|
|
151
|
+
| { kind: "non-json"; bodyText: string }
|
|
152
|
+
> {
|
|
153
|
+
if (method === "HEAD") {
|
|
154
|
+
return { kind: "head" };
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const bodyText = await upstreamRes.text();
|
|
158
|
+
if (bodyText.trim().length === 0) {
|
|
159
|
+
return { kind: "empty" };
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const contentType = upstreamRes.headers.get("content-type");
|
|
163
|
+
const expectsJson = JSON_CONTENT_TYPE_RE.test(contentType ?? "");
|
|
164
|
+
|
|
165
|
+
if (!expectsJson && !/^\s*[[{]/.test(bodyText)) {
|
|
166
|
+
return { kind: "non-json", bodyText };
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
try {
|
|
170
|
+
return { kind: "json", body: JSON.parse(bodyText) };
|
|
171
|
+
} catch {
|
|
172
|
+
return expectsJson
|
|
173
|
+
? { kind: "invalid-json", bodyText }
|
|
174
|
+
: { kind: "non-json", bodyText };
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function handleUpstreamError(error: unknown, res: http.ServerResponse): void {
|
|
179
|
+
if (error instanceof Error) {
|
|
180
|
+
const errorCode = (error as { code?: string }).code;
|
|
181
|
+
if (errorCode === "REDIRECT") {
|
|
182
|
+
sendJsonError(res, "Eliza Cloud returned an unexpected redirect.", 502);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
if (error.name === "TimeoutError" || error.name === "AbortError") {
|
|
186
|
+
sendJsonError(res, "Eliza Cloud request timed out.", 504);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
if (error.message === "Request body too large") {
|
|
190
|
+
sendJsonError(res, error.message, 413);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
sendJsonError(
|
|
194
|
+
res,
|
|
195
|
+
`Failed to reach Eliza Cloud: ${error.message || "Unknown error"}`,
|
|
196
|
+
502,
|
|
197
|
+
);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
sendJsonError(res, "Failed to reach Eliza Cloud.", 502);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/** Paths under /api/cloud/v1/ are forwarded directly as /api/v1/ on the cloud backend. */
|
|
205
|
+
const CLOUD_V1_PREFIX = "/api/cloud/v1/";
|
|
206
|
+
|
|
207
|
+
export async function handleCloudCompatRoute(
|
|
208
|
+
req: http.IncomingMessage,
|
|
209
|
+
res: http.ServerResponse,
|
|
210
|
+
pathname: string,
|
|
211
|
+
method: string,
|
|
212
|
+
state: CloudCompatRouteState,
|
|
213
|
+
): Promise<boolean> {
|
|
214
|
+
const isCompatRoute = pathname.startsWith("/api/cloud/compat/");
|
|
215
|
+
const isV1Route = pathname.startsWith(CLOUD_V1_PREFIX);
|
|
216
|
+
if (!isCompatRoute && !isV1Route) return false;
|
|
217
|
+
|
|
218
|
+
const apiKey = resolveProxyApiKey(state);
|
|
219
|
+
if (!apiKey) {
|
|
220
|
+
sendJsonError(
|
|
221
|
+
res,
|
|
222
|
+
"Not connected to Eliza Cloud. Please log in first.",
|
|
223
|
+
401,
|
|
224
|
+
);
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const baseUrl = resolveCloudBaseUrl(state.config);
|
|
229
|
+
const urlError = await validateCloudBaseUrl(baseUrl);
|
|
230
|
+
if (urlError) {
|
|
231
|
+
sendJsonError(res, urlError, 502);
|
|
232
|
+
return true;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// /api/cloud/compat/* → /api/compat/* (existing mapping)
|
|
236
|
+
// /api/cloud/v1/* → /api/v1/* (eliza v1 endpoints, e.g. pairing-token)
|
|
237
|
+
// Both branches strip the leading `/api/cloud` and re-prefix `/api`. The
|
|
238
|
+
// earlier v1 branch used `.slice("/api/cloud".length)` which left
|
|
239
|
+
// `/v1/...` (no `/api/` prefix), causing upstream to return 405 for
|
|
240
|
+
// valid POSTs to e.g. /api/v1/app/agents/{id}/provision.
|
|
241
|
+
const compatPath = pathname.replace("/api/cloud", "/api");
|
|
242
|
+
const fullUrl = req.url ?? pathname;
|
|
243
|
+
const qsIndex = fullUrl.indexOf("?");
|
|
244
|
+
const queryString = qsIndex >= 0 ? fullUrl.slice(qsIndex) : "";
|
|
245
|
+
const upstreamUrl = `${baseUrl}${compatPath}${queryString}`;
|
|
246
|
+
const headers = buildAuthHeaders(state.config, apiKey);
|
|
247
|
+
|
|
248
|
+
try {
|
|
249
|
+
let body: string | undefined;
|
|
250
|
+
if (method !== "GET" && method !== "HEAD") {
|
|
251
|
+
body = await readBody(req);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
const upstreamRes = await fetchUpstream(upstreamUrl, method, headers, body);
|
|
255
|
+
const parsed = await parseUpstreamJsonResponse(upstreamRes, method);
|
|
256
|
+
|
|
257
|
+
if (parsed.kind === "head") {
|
|
258
|
+
res.statusCode = upstreamRes.status;
|
|
259
|
+
res.end();
|
|
260
|
+
return true;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
if (parsed.kind === "json") {
|
|
264
|
+
if (upstreamRes.status === 404) {
|
|
265
|
+
sendUpstreamNotFound(res, pathname, parsed.body);
|
|
266
|
+
return true;
|
|
267
|
+
}
|
|
268
|
+
sendJson(res, parsed.body, upstreamRes.status);
|
|
269
|
+
return true;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
if (upstreamRes.status === 404) {
|
|
273
|
+
sendUpstreamNotFound(res, pathname);
|
|
274
|
+
return true;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
const upstreamStatus = upstreamRes.ok ? 502 : upstreamRes.status;
|
|
278
|
+
if (parsed.kind === "empty") {
|
|
279
|
+
const message = upstreamRes.ok
|
|
280
|
+
? "Eliza Cloud returned an empty response."
|
|
281
|
+
: `Eliza Cloud returned HTTP ${upstreamRes.status} with an empty response body.`;
|
|
282
|
+
sendJsonError(res, message, upstreamStatus);
|
|
283
|
+
return true;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
const message =
|
|
287
|
+
parsed.kind === "invalid-json"
|
|
288
|
+
? "Eliza Cloud returned malformed JSON."
|
|
289
|
+
: "Eliza Cloud returned a non-JSON response.";
|
|
290
|
+
const detail = summarizeUpstreamBody(parsed.bodyText);
|
|
291
|
+
logger.warn(
|
|
292
|
+
`[cloud-compat] ${message} ${method} ${compatPath} (${upstreamRes.status})${detail ? `: ${detail}` : ""}`,
|
|
293
|
+
);
|
|
294
|
+
sendJsonError(
|
|
295
|
+
res,
|
|
296
|
+
detail ? `${message} ${detail}` : message,
|
|
297
|
+
upstreamStatus,
|
|
298
|
+
);
|
|
299
|
+
return true;
|
|
300
|
+
} catch (error) {
|
|
301
|
+
handleUpstreamError(error, res);
|
|
302
|
+
return true;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type http from "node:http";
|
|
2
|
+
import type { AgentRuntime } from "@elizaos/core";
|
|
3
|
+
import type { CloudProxyConfigLike } from "../lib/config-like";
|
|
4
|
+
import { sendJsonError } from "../lib/http";
|
|
5
|
+
|
|
6
|
+
const LIFEOPS_CLOUD_FEATURES_MODULE: string =
|
|
7
|
+
"@elizaos/plugin-personal-assistant/routes/cloud-features-routes";
|
|
8
|
+
|
|
9
|
+
export interface CloudFeaturesRouteState {
|
|
10
|
+
config: CloudProxyConfigLike;
|
|
11
|
+
runtime?: AgentRuntime | null;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
type CloudFeaturesRoutesModule = {
|
|
15
|
+
handleCloudFeaturesRoute?: (
|
|
16
|
+
req: http.IncomingMessage,
|
|
17
|
+
res: http.ServerResponse,
|
|
18
|
+
pathname: string,
|
|
19
|
+
method: string,
|
|
20
|
+
state: CloudFeaturesRouteState,
|
|
21
|
+
) => Promise<boolean> | boolean;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export async function handleCloudFeaturesRoute(
|
|
25
|
+
req: http.IncomingMessage,
|
|
26
|
+
res: http.ServerResponse,
|
|
27
|
+
pathname: string,
|
|
28
|
+
method: string,
|
|
29
|
+
state: CloudFeaturesRouteState,
|
|
30
|
+
): Promise<boolean> {
|
|
31
|
+
if (
|
|
32
|
+
pathname !== "/api/cloud/features" &&
|
|
33
|
+
pathname !== "/api/cloud/features/sync"
|
|
34
|
+
) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
const loaded = (await import(
|
|
40
|
+
/* @vite-ignore */ LIFEOPS_CLOUD_FEATURES_MODULE
|
|
41
|
+
)) as CloudFeaturesRoutesModule;
|
|
42
|
+
if (typeof loaded.handleCloudFeaturesRoute !== "function") {
|
|
43
|
+
sendJsonError(res, "LifeOps cloud feature routes are not available", 503);
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
return await loaded.handleCloudFeaturesRoute(
|
|
47
|
+
req,
|
|
48
|
+
res,
|
|
49
|
+
pathname,
|
|
50
|
+
method,
|
|
51
|
+
state,
|
|
52
|
+
);
|
|
53
|
+
} catch {
|
|
54
|
+
sendJsonError(res, "LifeOps cloud feature routes are not available", 503);
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
function hasValue(value: string | undefined): boolean {
|
|
2
|
+
return Boolean(value?.trim());
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
function hasCompatApiToken(): boolean {
|
|
6
|
+
return hasValue(process.env.ELIZA_API_TOKEN);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function hasCloudApiKeyProvisioning(): boolean {
|
|
10
|
+
return (
|
|
11
|
+
process.env.ELIZAOS_CLOUD_ENABLED === "true" &&
|
|
12
|
+
hasValue(process.env.ELIZAOS_CLOUD_API_KEY)
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Platform-managed cloud containers should skip local pairing and onboarding UI.
|
|
18
|
+
*
|
|
19
|
+
* In production we may have either:
|
|
20
|
+
* - a Steward sidecar token (older / sidecar-managed path),
|
|
21
|
+
* - an inbound API token injected directly into the container, or
|
|
22
|
+
* - cloud-managed API-key access injected into the runtime environment.
|
|
23
|
+
*
|
|
24
|
+
* Requiring the cloud flag plus one of those credentials keeps accidental local
|
|
25
|
+
* env leakage from triggering cloud behavior, while still matching real deployed
|
|
26
|
+
* cloud containers.
|
|
27
|
+
*/
|
|
28
|
+
export function isCloudProvisionedContainer(): boolean {
|
|
29
|
+
const hasCloudFlag = process.env.ELIZA_CLOUD_PROVISIONED === "1";
|
|
30
|
+
|
|
31
|
+
return (
|
|
32
|
+
hasCloudFlag &&
|
|
33
|
+
(hasValue(process.env.STEWARD_AGENT_TOKEN) ||
|
|
34
|
+
hasCompatApiToken() ||
|
|
35
|
+
hasCloudApiKeyProvisioning())
|
|
36
|
+
);
|
|
37
|
+
}
|