@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,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/cloud/base-url.ts", "../src/cloud/validate-url.ts", "../src/cloud/auth-service-types.ts", "../src/cloud/cloud-api-key.ts", "../src/routes/travel-provider-relay-routes.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Cloud site/API URL normalizer. The implementation moved to\n * `@elizaos/shared/elizacloud/base-url` so host-layer packages can normalize\n * URLs without reverse-importing this plugin.\n */\nexport { normalizeCloudSiteUrl, resolveCloudApiBaseUrl } from \"@elizaos/shared\";\n",
|
|
6
|
+
"import dns from \"node:dns\";\nimport net from \"node:net\";\nimport { promisify } from \"node:util\";\n\nconst dnsLookupAll = promisify(dns.lookup);\n\nconst BLOCKED_IPV4_CIDRS: Array<{ base: number; mask: number }> = [\n cidrV4(\"0.0.0.0\", 8),\n cidrV4(\"10.0.0.0\", 8),\n cidrV4(\"172.16.0.0\", 12),\n cidrV4(\"192.168.0.0\", 16),\n cidrV4(\"100.64.0.0\", 10),\n cidrV4(\"127.0.0.0\", 8),\n cidrV4(\"169.254.0.0\", 16),\n cidrV4(\"192.0.0.0\", 24),\n cidrV4(\"198.18.0.0\", 15),\n cidrV4(\"192.0.2.0\", 24),\n cidrV4(\"198.51.100.0\", 24),\n cidrV4(\"203.0.113.0\", 24),\n cidrV4(\"224.0.0.0\", 4),\n cidrV4(\"240.0.0.0\", 4),\n];\n\nfunction normalizeHostLike(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/^\\[|\\]$/g, \"\");\n}\n\nfunction decodeIpv6MappedHex(mapped: string): string | null {\n const parts = mapped.split(\":\");\n if (parts.length < 1 || parts.length > 2) return null;\n\n const parsed = parts.map((part) => {\n if (!/^[0-9a-f]{1,4}$/i.test(part)) return Number.NaN;\n return Number.parseInt(part, 16);\n });\n if (parsed.some((value) => !Number.isFinite(value))) return null;\n\n const [hi, lo] = parsed.length === 1 ? [0, parsed[0]] : parsed;\n const octets = [hi >> 8, hi & 0xff, lo >> 8, lo & 0xff];\n return octets.join(\".\");\n}\n\nfunction canonicalizeIpv6(ip: string): string | null {\n try {\n return new URL(`http://[${ip}]/`).hostname.replace(/^\\[|\\]$/g, \"\");\n } catch {\n return null;\n }\n}\n\nfunction normalizeIpForPolicy(ip: string): string {\n const base = normalizeHostLike(ip).split(\"%\")[0];\n if (!base) return base;\n\n let normalized = base;\n if (net.isIP(normalized) === 6) {\n normalized = canonicalizeIpv6(normalized) ?? normalized;\n }\n\n let mapped: string | null = null;\n if (normalized.startsWith(\"::ffff:\")) {\n mapped = normalized.slice(\"::ffff:\".length);\n } else if (normalized.startsWith(\"0:0:0:0:0:ffff:\")) {\n mapped = normalized.slice(\"0:0:0:0:0:ffff:\".length);\n }\n if (!mapped) return normalized;\n\n if (net.isIP(mapped) === 4) return mapped;\n return decodeIpv6MappedHex(mapped) ?? normalized;\n}\n\nfunction cidrV4(base: string, prefix: number): { base: number; mask: number } {\n const parsed = parseIpv4ToInt(base);\n if (parsed === null) {\n throw new Error(`Invalid CIDR base IPv4 address: ${base}`);\n }\n const shift = 32 - prefix;\n const mask = shift === 32 ? 0 : (0xffffffff << shift) >>> 0;\n return { base: parsed & mask, mask };\n}\n\nfunction parseIpv4ToInt(ip: string): number | null {\n const parts = ip.split(\".\");\n if (parts.length !== 4) return null;\n\n let value = 0;\n for (const part of parts) {\n if (!/^\\d{1,3}$/.test(part)) return null;\n const octet = Number.parseInt(part, 10);\n if (!Number.isInteger(octet) || octet < 0 || octet > 255) return null;\n value = (value << 8) | octet;\n }\n\n return value >>> 0;\n}\n\nfunction isBlockedIpv4(ip: string): boolean {\n const asInt = parseIpv4ToInt(ip);\n if (asInt === null) return true;\n return BLOCKED_IPV4_CIDRS.some((cidr) => (asInt & cidr.mask) === cidr.base);\n}\n\nfunction isBlockedIpv6(ip: string): boolean {\n const normalized = ip.toLowerCase();\n return (\n normalized === \"::\" ||\n normalized === \"::1\" ||\n /^fe[89ab][0-9a-f]:/.test(normalized) ||\n /^f[cd][0-9a-f]{2}:/i.test(normalized) ||\n normalized.startsWith(\"ff\")\n );\n}\n\nfunction isBlockedIp(ip: string): boolean {\n const normalized = normalizeIpForPolicy(ip);\n const family = net.isIP(normalized);\n if (family === 4) return isBlockedIpv4(normalized);\n if (family === 6) return isBlockedIpv6(normalized);\n return false;\n}\n\nexport async function validateCloudBaseUrl(\n rawUrl: string,\n): Promise<string | null> {\n let parsed: URL;\n try {\n parsed = new URL(rawUrl);\n } catch {\n return `Invalid cloud base URL: \"${rawUrl}\"`;\n }\n\n if (parsed.protocol !== \"https:\") {\n return `Cloud base URL must use HTTPS, got \"${parsed.protocol}\" in \"${rawUrl}\"`;\n }\n\n const hostname = normalizeHostLike(parsed.hostname);\n if (!hostname) {\n return `Invalid cloud base URL: \"${rawUrl}\"`;\n }\n\n if (\n hostname === \"localhost\" ||\n hostname.endsWith(\".localhost\") ||\n hostname.endsWith(\".local\")\n ) {\n return `Cloud base URL \"${rawUrl}\" points to a blocked local hostname.`;\n }\n\n // Dev-mode bypass: skip IP-range blocking but keep URL format checks above.\n const elizaDev = process.env.ELIZA_DEV?.trim().toLowerCase();\n if (\n process.env.NODE_ENV === \"development\" ||\n elizaDev === \"1\" ||\n elizaDev === \"true\" ||\n elizaDev === \"yes\"\n ) {\n return null;\n }\n\n if (isBlockedIp(hostname)) {\n return `Cloud base URL \"${rawUrl}\" points to a blocked address.`;\n }\n\n try {\n const results = await dnsLookupAll(hostname, { all: true });\n const addresses = Array.isArray(results) ? results : [results];\n for (const entry of addresses) {\n const ip =\n typeof entry === \"string\"\n ? entry\n : (entry as { address: string }).address;\n if (isBlockedIp(ip)) {\n return (\n `Cloud base URL \"${rawUrl}\" resolves to ${ip}, ` +\n \"which is a blocked internal/metadata address.\"\n );\n }\n }\n } catch {\n return `Cloud base URL \"${rawUrl}\" could not be resolved via DNS.`;\n }\n\n return null;\n}\n",
|
|
7
|
+
"import type { Service } from \"@elizaos/core\";\n\nexport interface CloudAuthApiKeyService {\n isAuthenticated: () => boolean;\n getApiKey?: () => string | undefined;\n}\n\nexport function isCloudAuthApiKeyService(\n value: Service | null | undefined,\n): value is Service & CloudAuthApiKeyService {\n return (\n value !== null &&\n value !== undefined &&\n typeof (value as Partial<CloudAuthApiKeyService>).isAuthenticated ===\n \"function\"\n );\n}\n\nexport function normalizeCloudApiKey(value: string | null | undefined): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n if (!trimmed || trimmed.toUpperCase() === \"[REDACTED]\") return null;\n return trimmed;\n}\n",
|
|
8
|
+
"/**\n * Cloud API key + base URL resolution.\n *\n * Resolves the Eliza Cloud API key and base URL from (in priority order):\n * 1. Explicit `config.cloud.apiKey` / `config.cloud.baseUrl`\n * 2. Runtime settings + character secrets (`ELIZAOS_CLOUD_API_KEY`)\n * 3. Process env (`ELIZAOS_CLOUD_API_KEY`, `ELIZAOS_CLOUD_BASE_URL`)\n *\n * Previously these helpers lived in `packages/agent/src/api/wallet-rpc.ts`\n * because the wallet uses Cloud RPC proxies. They are NOT wallet-specific —\n * cloud auth is consumed by cloud-status, cloud-billing, cloud-compat,\n * health, x-relay, and travel-provider-relay routes. Hosting them under\n * `cloud/` matches their actual ownership.\n */\n\nimport type { ElizaConfig } from \"../lib/config-like\";\n\nexport const DEFAULT_CLOUD_API_BASE_URL = \"https://elizacloud.ai/api/v1\";\n\nexport type CloudApiKeyRuntimeLike = {\n getSetting?: (key: string) => unknown;\n character?: {\n secrets?: Record<string, unknown>;\n } | null;\n} | null;\n\nexport function normalizeCloudSecret(\n value: string | null | undefined,\n): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction resolveRuntimeCloudApiKey(\n runtime?: CloudApiKeyRuntimeLike,\n): string | null {\n const fromSetting = runtime?.getSetting?.(\"ELIZAOS_CLOUD_API_KEY\");\n if (typeof fromSetting === \"string\") {\n return normalizeCloudSecret(fromSetting);\n }\n\n const fromSecrets = runtime?.character?.secrets?.ELIZAOS_CLOUD_API_KEY;\n return typeof fromSecrets === \"string\"\n ? normalizeCloudSecret(fromSecrets)\n : null;\n}\n\nexport function resolveCloudApiBaseUrl(\n rawBaseUrl?: string | null,\n): string | null {\n const candidate =\n normalizeCloudSecret(rawBaseUrl ?? process.env.ELIZAOS_CLOUD_BASE_URL) ??\n DEFAULT_CLOUD_API_BASE_URL;\n try {\n const parsed = new URL(candidate);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n return null;\n }\n parsed.hash = \"\";\n parsed.search = \"\";\n const normalizedBase = parsed.toString().replace(/\\/+$/, \"\");\n return normalizedBase.endsWith(\"/api/v1\")\n ? normalizedBase\n : `${normalizedBase}/api/v1`;\n } catch {\n return null;\n }\n}\n\nexport function resolveCloudApiKey(\n config?: Pick<ElizaConfig, \"cloud\"> | null,\n runtime?: CloudApiKeyRuntimeLike,\n): string | null {\n return normalizeCloudSecret(\n config?.cloud?.apiKey ??\n resolveRuntimeCloudApiKey(runtime) ??\n process.env.ELIZAOS_CLOUD_API_KEY,\n );\n}\n",
|
|
9
|
+
"import type http from \"node:http\";\nimport {\n type IAgentRuntime,\n type Service,\n sendJson,\n sendJsonError,\n} from \"@elizaos/core\";\nimport {\n isCloudAuthApiKeyService,\n normalizeCloudApiKey,\n} from \"../cloud/auth-service-types.js\";\nimport { normalizeCloudSiteUrl } from \"../cloud/base-url.js\";\nimport { resolveCloudApiKey } from \"../cloud/cloud-api-key.js\";\nimport { validateCloudBaseUrl } from \"../cloud/validate-url.js\";\nimport type { CloudProxyConfigLike } from \"../lib/config-like\";\n\nexport interface TravelProviderRelayRouteState {\n config: CloudProxyConfigLike;\n runtime?: IAgentRuntime | null;\n}\n\nconst PROXY_TIMEOUT_MS = 30_000;\nconst MAX_BODY_BYTES = 1_048_576;\nconst TRAVEL_PROVIDER_PATH_RE =\n /^\\/api\\/cloud\\/travel-providers\\/([a-z0-9][a-z0-9-]*)(\\/.*)$/;\n\nfunction resolveProxyApiKey(\n state: TravelProviderRelayRouteState,\n): string | null {\n const cloudAuth = state.runtime?.getService<Service>(\"CLOUD_AUTH\");\n const runtimeApiKey =\n isCloudAuthApiKeyService(cloudAuth) && cloudAuth.isAuthenticated() === true\n ? normalizeCloudApiKey(cloudAuth.getApiKey?.())\n : null;\n return runtimeApiKey ?? resolveCloudApiKey(state.config, state.runtime);\n}\n\nfunction buildAuthHeaders(\n config: CloudProxyConfigLike,\n apiKey: string,\n): Record<string, string> {\n const serviceKey = config.cloud?.serviceKey?.trim();\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n };\n if (serviceKey) headers[\"X-Service-Key\"] = serviceKey;\n return headers;\n}\n\nfunction readBody(req: http.IncomingMessage): Promise<string | undefined> {\n return new Promise<string | undefined>((resolve, reject) => {\n const chunks: Buffer[] = [];\n let size = 0;\n req.on(\"data\", (chunk: Buffer) => {\n size += chunk.length;\n if (size > MAX_BODY_BYTES) {\n reject(new Error(\"Request body too large\"));\n return;\n }\n chunks.push(chunk);\n });\n req.on(\"end\", () =>\n resolve(\n chunks.length > 0 ? Buffer.concat(chunks).toString(\"utf-8\") : undefined,\n ),\n );\n req.on(\"error\", reject);\n });\n}\n\nasync function readJsonResponse(response: Response): Promise<unknown> {\n return response.json().catch(async () => ({\n success: response.ok,\n error: await response\n .text()\n .catch(() => \"Travel-provider relay request failed\"),\n }));\n}\n\nfunction buildUpstreamPath(localPath: string): string {\n const parsed = parseTravelProviderPath(localPath);\n if (!parsed) {\n throw new Error(\"Invalid travel-provider relay path\");\n }\n return `/api/v1/${parsed.provider}${parsed.providerPath}`;\n}\n\nconst TRAVEL_PROVIDER_RELAY_ROUTES: ReadonlyArray<{\n method: \"GET\" | \"POST\";\n pattern: RegExp;\n}> = [\n { method: \"POST\", pattern: /^\\/offer-requests$/ },\n { method: \"GET\", pattern: /^\\/offers\\/[^/]+$/ },\n { method: \"POST\", pattern: /^\\/orders$/ },\n { method: \"GET\", pattern: /^\\/orders\\/[^/]+$/ },\n { method: \"POST\", pattern: /^\\/payments$/ },\n];\n\nfunction parseTravelProviderPath(\n pathname: string,\n): { provider: string; providerPath: string } | null {\n const match = TRAVEL_PROVIDER_PATH_RE.exec(pathname);\n if (!match) return null;\n const [, provider, providerPath] = match;\n return provider ? { provider, providerPath } : null;\n}\n\nfunction matchRoute(method: string, pathname: string): boolean {\n const parsed = parseTravelProviderPath(pathname);\n if (!parsed) return false;\n return TRAVEL_PROVIDER_RELAY_ROUTES.some(\n (route) => route.method === method && route.pattern.test(parsed.providerPath),\n );\n}\n\nexport async function handleTravelProviderRelayRoute(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string,\n method: string,\n state: TravelProviderRelayRouteState,\n): Promise<boolean> {\n const parsed = parseTravelProviderPath(pathname);\n if (!parsed) return false;\n\n if (!matchRoute(method, pathname)) {\n sendJsonError(res, \"Unknown travel-provider relay route\", 404);\n return true;\n }\n\n const apiKey = resolveProxyApiKey(state);\n if (!apiKey) {\n sendJsonError(\n res,\n \"Not connected to Eliza Cloud. Sign in to use travel search.\",\n 401,\n );\n return true;\n }\n\n const baseUrl = normalizeCloudSiteUrl(state.config.cloud?.baseUrl);\n const urlError = await validateCloudBaseUrl(baseUrl);\n if (urlError) {\n sendJsonError(res, urlError, 502);\n return true;\n }\n\n const headers = buildAuthHeaders(state.config, apiKey);\n let body: string | undefined;\n if (method === \"POST\") {\n try {\n body = await readBody(req);\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Failed to read body\";\n sendJsonError(res, msg, 413);\n return true;\n }\n }\n\n const fullUrl = new URL(req.url ?? pathname, \"http://localhost\");\n const upstreamUrl = `${baseUrl}${buildUpstreamPath(pathname)}${fullUrl.search}`;\n const upstreamResponse = await fetch(upstreamUrl, {\n method,\n headers,\n body,\n redirect: \"manual\",\n signal: AbortSignal.timeout(PROXY_TIMEOUT_MS),\n });\n\n if (upstreamResponse.status === 402) {\n await forward402(res, upstreamResponse);\n return true;\n }\n\n const payload = await readJsonResponse(upstreamResponse);\n sendJson(res, payload, upstreamResponse.status);\n return true;\n}\n\nasync function forward402(\n res: http.ServerResponse,\n upstream: Response,\n): Promise<void> {\n const wwwAuth = upstream.headers.get(\"www-authenticate\");\n const contentType = upstream.headers.get(\"content-type\") ?? \"application/json\";\n const bodyText = await upstream.text();\n res.statusCode = 402;\n res.setHeader(\"Content-Type\", contentType);\n if (wwwAuth) res.setHeader(\"WWW-Authenticate\", wwwAuth);\n res.end(bodyText);\n}\n"
|
|
10
|
+
],
|
|
11
|
+
"mappings": "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",
|
|
12
|
+
"debugId": "868735A1EE187E7764756E2164756E21",
|
|
13
|
+
"names": []
|
|
14
|
+
}
|
|
@@ -1,13 +1,136 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CloudAuthService —
|
|
2
|
+
* CloudAuthService — Eliza Cloud authentication entry points.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Two distinct auth flows live here:
|
|
5
|
+
*
|
|
6
|
+
* 1. **Device auto-signup** (`authenticateWithDevice`) — convenience-only.
|
|
7
|
+
* Derives a hardware fingerprint and exchanges it for a free-tier API key
|
|
8
|
+
* against the cloud signup endpoint. The result is treated as opaque and
|
|
9
|
+
* is **never** trusted as inbound auth for the local Eliza dashboard.
|
|
10
|
+
* See `docs/security/remote-auth-hardening-plan.md` §7 for the explicit
|
|
11
|
+
* demotion rationale.
|
|
12
|
+
*
|
|
13
|
+
* 2. **Eliza Cloud SSO** (`getSsoRedirectUrl` / `exchangeCodeForSession`) —
|
|
14
|
+
* OAuth-style authorization-code flow against the cloud issuer. The
|
|
15
|
+
* callback handler in `app-core` (`api/auth/cloud-sso.ts`) consumes these
|
|
16
|
+
* methods to bind a verified cloud user to a local Identity. All error
|
|
17
|
+
* paths fail closed: the methods throw and the caller MUST refuse the
|
|
18
|
+
* request. There is no partial-claims fallback.
|
|
7
19
|
*/
|
|
8
|
-
import { type IAgentRuntime, Service } from "@elizaos/core";
|
|
20
|
+
import { type RuntimeEnvRecord, type IAgentRuntime, Service } from "@elizaos/core";
|
|
9
21
|
import type { CloudCredentials } from "../types/cloud";
|
|
10
22
|
import { CloudApiClient } from "../utils/cloud-api";
|
|
23
|
+
import type { CloudBootstrapService } from "./cloud-bootstrap";
|
|
24
|
+
/**
|
|
25
|
+
* Required ID-token claims for an Eliza Cloud SSO exchange.
|
|
26
|
+
*
|
|
27
|
+
* `sub` is the cloud user id (canonical identity key). `email` and `name`
|
|
28
|
+
* are surfaced for UI display and identity provisioning. Anything else the
|
|
29
|
+
* cloud issuer adds is preserved on `extra` for callers that need it but
|
|
30
|
+
* is never required for auth decisions.
|
|
31
|
+
*/
|
|
32
|
+
export interface CloudSsoIdTokenClaims {
|
|
33
|
+
iss: string;
|
|
34
|
+
sub: string;
|
|
35
|
+
aud: string | string[];
|
|
36
|
+
exp: number;
|
|
37
|
+
iat: number;
|
|
38
|
+
email: string;
|
|
39
|
+
email_verified?: boolean;
|
|
40
|
+
name: string;
|
|
41
|
+
picture?: string;
|
|
42
|
+
extra: Record<string, unknown>;
|
|
43
|
+
}
|
|
44
|
+
export interface CloudSsoSession {
|
|
45
|
+
cloudUserId: string;
|
|
46
|
+
email: string;
|
|
47
|
+
displayName: string;
|
|
48
|
+
claims: CloudSsoIdTokenClaims;
|
|
49
|
+
}
|
|
50
|
+
export interface SsoRedirectArgs {
|
|
51
|
+
/**
|
|
52
|
+
* Local URL the user should land on after the SSO round-trip
|
|
53
|
+
* (e.g. `/first-run/setup`). The dashboard's callback route forwards
|
|
54
|
+
* to this once the session cookie is set; it is NOT sent to the cloud
|
|
55
|
+
* issuer.
|
|
56
|
+
*/
|
|
57
|
+
returnTo?: string;
|
|
58
|
+
/**
|
|
59
|
+
* State nonce. The caller is responsible for generating this with
|
|
60
|
+
* `crypto.randomBytes(32)` and storing it server-side keyed by the
|
|
61
|
+
* issued cookie / pending exchange.
|
|
62
|
+
*/
|
|
63
|
+
state: string;
|
|
64
|
+
/**
|
|
65
|
+
* Override for `ELIZA_CLOUD_CLIENT_ID`. Falls through to the env when
|
|
66
|
+
* unset; explicitly throws when neither is provided.
|
|
67
|
+
*/
|
|
68
|
+
clientId?: string;
|
|
69
|
+
/** Allows tests to inject a synthetic env record. */
|
|
70
|
+
env?: RuntimeEnvRecord;
|
|
71
|
+
}
|
|
72
|
+
export interface ExchangeCodeArgs {
|
|
73
|
+
/** Authorization code returned on the SSO callback. */
|
|
74
|
+
code: string;
|
|
75
|
+
/** State value the cloud issuer echoed back on the callback. */
|
|
76
|
+
state: string;
|
|
77
|
+
/**
|
|
78
|
+
* State value the caller originally issued. Compared with `state` and
|
|
79
|
+
* mismatch causes a fail-closed throw before any network call is made.
|
|
80
|
+
*/
|
|
81
|
+
expectedState: string;
|
|
82
|
+
/**
|
|
83
|
+
* Source for `getJwksUrl()`. The caller resolves this from the runtime
|
|
84
|
+
* service registry (`runtime.getService("CLOUD_BOOTSTRAP")`) so this
|
|
85
|
+
* file does not import from `app-core` directly.
|
|
86
|
+
*/
|
|
87
|
+
bootstrap: CloudBootstrapService;
|
|
88
|
+
/** Allows tests to inject a fake fetch for the token endpoint. */
|
|
89
|
+
fetchImpl?: typeof fetch;
|
|
90
|
+
/** Allows tests to inject a synthetic env record. */
|
|
91
|
+
env?: RuntimeEnvRecord;
|
|
92
|
+
/** Optional override for the redirect URI; defaults to the local callback. */
|
|
93
|
+
redirectUri?: string;
|
|
94
|
+
}
|
|
95
|
+
interface ApiKeyAuthInput {
|
|
96
|
+
apiKey: string;
|
|
97
|
+
organizationId?: string;
|
|
98
|
+
userId?: string;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Returns the absolute URL the dashboard should redirect the user to in
|
|
102
|
+
* order to start an Eliza Cloud SSO authorization-code flow.
|
|
103
|
+
*
|
|
104
|
+
* Throws when `ELIZA_CLOUD_CLIENT_ID` is unset and no `clientId` override
|
|
105
|
+
* is provided — there is no built-in default. `ELIZA_CLOUD_ISSUER` is read
|
|
106
|
+
* via the `CloudBootstrapService`'s service-port and must already be set;
|
|
107
|
+
* if not, this method throws via the bootstrap's existing fail-closed
|
|
108
|
+
* behaviour.
|
|
109
|
+
*
|
|
110
|
+
* The `state` argument MUST be generated by the caller with a cryptographic
|
|
111
|
+
* RNG and stored server-side bound to the issued cookie. This method does
|
|
112
|
+
* NOT generate or persist state.
|
|
113
|
+
*
|
|
114
|
+
* @param bootstrap - Service-port that exposes `getExpectedIssuer()`.
|
|
115
|
+
* @param args - Required `state`, optional `clientId` / `returnTo` / `env`.
|
|
116
|
+
*/
|
|
117
|
+
export declare function getSsoRedirectUrl(bootstrap: CloudBootstrapService, args: SsoRedirectArgs): string;
|
|
118
|
+
/**
|
|
119
|
+
* Exchange an authorization code for a verified Eliza Cloud session.
|
|
120
|
+
*
|
|
121
|
+
* Steps:
|
|
122
|
+
* 1. Compare `state === expectedState`. Mismatch throws.
|
|
123
|
+
* 2. POST to `${ELIZA_CLOUD_ISSUER}/oauth/token` with the code,
|
|
124
|
+
* `client_id`, and `client_secret` (the latter from
|
|
125
|
+
* `ELIZA_CLOUD_CLIENT_SECRET`).
|
|
126
|
+
* 3. Verify the returned `id_token` against the JWKS exposed by
|
|
127
|
+
* `CloudBootstrapService.getJwksUrl()`. RS256 only.
|
|
128
|
+
* 4. Project the claims onto a `CloudSsoSession`.
|
|
129
|
+
*
|
|
130
|
+
* Any error in fetch / signature verify / claim shape throws — this method
|
|
131
|
+
* NEVER returns a partial or fallback session.
|
|
132
|
+
*/
|
|
133
|
+
export declare function exchangeCodeForSession(args: ExchangeCodeArgs): Promise<CloudSsoSession>;
|
|
11
134
|
export declare class CloudAuthService extends Service {
|
|
12
135
|
static serviceType: string;
|
|
13
136
|
capabilityDescription: string;
|
|
@@ -18,7 +141,18 @@ export declare class CloudAuthService extends Service {
|
|
|
18
141
|
stop(): Promise<void>;
|
|
19
142
|
private initialize;
|
|
20
143
|
private validateApiKey;
|
|
144
|
+
/**
|
|
145
|
+
* Free-tier device auto-signup. **Convenience only — not a security
|
|
146
|
+
* primitive.** The hardware fingerprint is treated as opaque material the
|
|
147
|
+
* cloud signup endpoint can use to mint a fresh API key + $5 free credit
|
|
148
|
+
* for new installs. The result is usable for outbound LLM calls; it never
|
|
149
|
+
* authorizes inbound dashboard access.
|
|
150
|
+
*
|
|
151
|
+
* See `docs/security/remote-auth-hardening-plan.md` §7.
|
|
152
|
+
*/
|
|
21
153
|
authenticateWithDevice(): Promise<CloudCredentials>;
|
|
154
|
+
authenticateWithApiKey(input: ApiKeyAuthInput): CloudCredentials;
|
|
155
|
+
clearAuth(): void;
|
|
22
156
|
isAuthenticated(): boolean;
|
|
23
157
|
getCredentials(): CloudCredentials | null;
|
|
24
158
|
getApiKey(): string | undefined;
|
|
@@ -26,4 +160,5 @@ export declare class CloudAuthService extends Service {
|
|
|
26
160
|
getUserId(): string | undefined;
|
|
27
161
|
getOrganizationId(): string | undefined;
|
|
28
162
|
}
|
|
163
|
+
export {};
|
|
29
164
|
//# sourceMappingURL=cloud-auth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-auth.d.ts","sourceRoot":"","sources":["../../services/cloud-auth.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cloud-auth.d.ts","sourceRoot":"","sources":["../../src/services/cloud-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __returnValue = (v) => v;
|
|
4
|
+
function __exportSetter(name, newValue) {
|
|
5
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
6
|
+
}
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, {
|
|
10
|
+
get: all[name],
|
|
11
|
+
enumerable: true,
|
|
12
|
+
configurable: true,
|
|
13
|
+
set: __exportSetter.bind(all, name)
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
17
|
+
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
18
|
+
|
|
19
|
+
// src/types/cloud.ts
|
|
20
|
+
import {
|
|
21
|
+
CloudApiError,
|
|
22
|
+
InsufficientCreditsError
|
|
23
|
+
} from "@elizaos/cloud-sdk";
|
|
24
|
+
var DEFAULT_CLOUD_CONFIG = {
|
|
25
|
+
enabled: false,
|
|
26
|
+
baseUrl: "https://www.elizacloud.ai/api/v1",
|
|
27
|
+
inferenceMode: "cloud",
|
|
28
|
+
autoProvision: false,
|
|
29
|
+
bridge: {
|
|
30
|
+
reconnectIntervalMs: 3000,
|
|
31
|
+
maxReconnectAttempts: 20,
|
|
32
|
+
heartbeatIntervalMs: 30000
|
|
33
|
+
},
|
|
34
|
+
backup: {
|
|
35
|
+
autoBackupIntervalMs: 3600000,
|
|
36
|
+
maxSnapshots: 10
|
|
37
|
+
},
|
|
38
|
+
container: {
|
|
39
|
+
defaultImage: "elizaos/agent:latest",
|
|
40
|
+
defaultArchitecture: "arm64",
|
|
41
|
+
defaultCpu: 1792,
|
|
42
|
+
defaultMemory: 1792,
|
|
43
|
+
defaultPort: 3000
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// src/utils/cloud-api.ts
|
|
48
|
+
import {
|
|
49
|
+
CloudApiClient,
|
|
50
|
+
CloudApiError as CloudApiError2,
|
|
51
|
+
ElizaCloudHttpClient,
|
|
52
|
+
InsufficientCreditsError as InsufficientCreditsError2
|
|
53
|
+
} from "@elizaos/cloud-sdk";
|
|
54
|
+
|
|
55
|
+
// src/services/cloud-auth.ts
|
|
56
|
+
import {
|
|
57
|
+
logger,
|
|
58
|
+
Service,
|
|
59
|
+
resolveApiSecurityConfig,
|
|
60
|
+
resolveDesktopApiPort
|
|
61
|
+
} from "@elizaos/core";
|
|
62
|
+
import { isCloudReachable } from "@elizaos/shared";
|
|
63
|
+
import { createRemoteJWKSet, jwtVerify } from "jose";
|
|
64
|
+
async function deriveDeviceId() {
|
|
65
|
+
const os = await import("node:os");
|
|
66
|
+
const crypto = await import("node:crypto");
|
|
67
|
+
const cpus = os.cpus();
|
|
68
|
+
const raw = [
|
|
69
|
+
os.hostname(),
|
|
70
|
+
os.platform(),
|
|
71
|
+
os.arch(),
|
|
72
|
+
cpus[0]?.model ?? "?",
|
|
73
|
+
cpus.length,
|
|
74
|
+
os.totalmem()
|
|
75
|
+
].join(":");
|
|
76
|
+
return crypto.createHash("sha256").update(raw).digest("hex");
|
|
77
|
+
}
|
|
78
|
+
function detectPlatform() {
|
|
79
|
+
if (typeof process === "undefined")
|
|
80
|
+
return "web";
|
|
81
|
+
const map = {
|
|
82
|
+
darwin: "macos",
|
|
83
|
+
win32: "windows",
|
|
84
|
+
linux: "linux"
|
|
85
|
+
};
|
|
86
|
+
return map[process.platform] ?? "linux";
|
|
87
|
+
}
|
|
88
|
+
function readEnvKey(env, key) {
|
|
89
|
+
const value = env[key];
|
|
90
|
+
if (typeof value !== "string")
|
|
91
|
+
return null;
|
|
92
|
+
const trimmed = value.trim();
|
|
93
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
94
|
+
}
|
|
95
|
+
function processEnv() {
|
|
96
|
+
if (typeof process === "undefined")
|
|
97
|
+
return {};
|
|
98
|
+
return process.env;
|
|
99
|
+
}
|
|
100
|
+
function defaultRedirectUri(env) {
|
|
101
|
+
const security = resolveApiSecurityConfig(env);
|
|
102
|
+
const port = resolveDesktopApiPort(env);
|
|
103
|
+
const scheme = security.isLoopbackBind ? "http" : "https";
|
|
104
|
+
const host = security.bindHost.startsWith("[") ? security.bindHost : security.bindHost.includes(":") && !security.bindHost.startsWith("[") ? `[${security.bindHost}]` : security.bindHost;
|
|
105
|
+
return `${scheme}://${host}:${port}/api/auth/login/sso/callback`;
|
|
106
|
+
}
|
|
107
|
+
function getSsoRedirectUrl(bootstrap, args) {
|
|
108
|
+
const env = args.env ?? processEnv();
|
|
109
|
+
const clientId = args.clientId ?? readEnvKey(env, "ELIZA_CLOUD_CLIENT_ID");
|
|
110
|
+
if (!clientId) {
|
|
111
|
+
throw new Error("ELIZA_CLOUD_CLIENT_ID is not configured — cannot start Eliza Cloud SSO");
|
|
112
|
+
}
|
|
113
|
+
if (args.state.length === 0) {
|
|
114
|
+
throw new Error("getSsoRedirectUrl requires a non-empty state nonce");
|
|
115
|
+
}
|
|
116
|
+
const issuer = bootstrap.getExpectedIssuer();
|
|
117
|
+
const redirectUri = defaultRedirectUri(env);
|
|
118
|
+
const params = new URLSearchParams;
|
|
119
|
+
params.set("response_type", "code");
|
|
120
|
+
params.set("client_id", clientId);
|
|
121
|
+
params.set("redirect_uri", redirectUri);
|
|
122
|
+
params.set("scope", "openid profile");
|
|
123
|
+
params.set("state", args.state);
|
|
124
|
+
if (args.returnTo) {
|
|
125
|
+
params.set("eliza_return_to", args.returnTo);
|
|
126
|
+
}
|
|
127
|
+
return `${issuer}/oauth/authorize?${params.toString()}`;
|
|
128
|
+
}
|
|
129
|
+
function shapeIdTokenClaims(payload) {
|
|
130
|
+
if (typeof payload.iss !== "string" || payload.iss.length === 0) {
|
|
131
|
+
throw new Error("id_token missing issuer claim");
|
|
132
|
+
}
|
|
133
|
+
if (typeof payload.sub !== "string" || payload.sub.length === 0) {
|
|
134
|
+
throw new Error("id_token missing sub claim");
|
|
135
|
+
}
|
|
136
|
+
if (typeof payload.aud !== "string" && !(Array.isArray(payload.aud) && payload.aud.every((value) => typeof value === "string"))) {
|
|
137
|
+
throw new Error("id_token missing or malformed aud claim");
|
|
138
|
+
}
|
|
139
|
+
if (typeof payload.exp !== "number" || !Number.isFinite(payload.exp)) {
|
|
140
|
+
throw new Error("id_token missing exp claim");
|
|
141
|
+
}
|
|
142
|
+
if (typeof payload.iat !== "number" || !Number.isFinite(payload.iat)) {
|
|
143
|
+
throw new Error("id_token missing iat claim");
|
|
144
|
+
}
|
|
145
|
+
if (typeof payload.email !== "string" || payload.email.length === 0) {
|
|
146
|
+
throw new Error("id_token missing email claim — Eliza Cloud SSO requires it");
|
|
147
|
+
}
|
|
148
|
+
if (typeof payload.name !== "string" || payload.name.length === 0) {
|
|
149
|
+
throw new Error("id_token missing name claim — Eliza Cloud SSO requires it");
|
|
150
|
+
}
|
|
151
|
+
const extra = {};
|
|
152
|
+
for (const [key, value] of Object.entries(payload)) {
|
|
153
|
+
if (key !== "iss" && key !== "sub" && key !== "aud" && key !== "exp" && key !== "iat" && key !== "email" && key !== "email_verified" && key !== "name" && key !== "picture") {
|
|
154
|
+
extra[key] = value;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
iss: payload.iss,
|
|
159
|
+
sub: payload.sub,
|
|
160
|
+
aud: payload.aud,
|
|
161
|
+
exp: payload.exp,
|
|
162
|
+
iat: payload.iat,
|
|
163
|
+
email: payload.email,
|
|
164
|
+
email_verified: typeof payload.email_verified === "boolean" ? payload.email_verified : undefined,
|
|
165
|
+
name: payload.name,
|
|
166
|
+
picture: typeof payload.picture === "string" ? payload.picture : undefined,
|
|
167
|
+
extra
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
function shapeTokenResponse(payload) {
|
|
171
|
+
if (!payload || typeof payload !== "object") {
|
|
172
|
+
throw new Error("Eliza Cloud token endpoint returned a non-object body");
|
|
173
|
+
}
|
|
174
|
+
const raw = payload;
|
|
175
|
+
if (typeof raw.id_token !== "string" || raw.id_token.length === 0) {
|
|
176
|
+
throw new Error("Eliza Cloud token endpoint did not return an id_token");
|
|
177
|
+
}
|
|
178
|
+
return { idToken: raw.id_token };
|
|
179
|
+
}
|
|
180
|
+
async function exchangeCodeForSession(args) {
|
|
181
|
+
if (args.code.length === 0) {
|
|
182
|
+
throw new Error("exchangeCodeForSession requires a non-empty code");
|
|
183
|
+
}
|
|
184
|
+
if (!args.state || !args.expectedState || args.state !== args.expectedState) {
|
|
185
|
+
throw new Error("Eliza Cloud SSO state mismatch — refusing to exchange code (possible CSRF)");
|
|
186
|
+
}
|
|
187
|
+
const env = args.env ?? processEnv();
|
|
188
|
+
const clientId = readEnvKey(env, "ELIZA_CLOUD_CLIENT_ID");
|
|
189
|
+
if (!clientId) {
|
|
190
|
+
throw new Error("ELIZA_CLOUD_CLIENT_ID is not configured — cannot complete Eliza Cloud SSO");
|
|
191
|
+
}
|
|
192
|
+
const clientSecret = readEnvKey(env, "ELIZA_CLOUD_CLIENT_SECRET");
|
|
193
|
+
if (!clientSecret) {
|
|
194
|
+
throw new Error("ELIZA_CLOUD_CLIENT_SECRET is not configured — cannot complete Eliza Cloud SSO");
|
|
195
|
+
}
|
|
196
|
+
const issuer = args.bootstrap.getExpectedIssuer();
|
|
197
|
+
const redirectUri = args.redirectUri ?? defaultRedirectUri(env);
|
|
198
|
+
const tokenUrl = `${issuer}/oauth/token`;
|
|
199
|
+
const fetchImpl = args.fetchImpl ?? fetch;
|
|
200
|
+
const body = new URLSearchParams;
|
|
201
|
+
body.set("grant_type", "authorization_code");
|
|
202
|
+
body.set("code", args.code);
|
|
203
|
+
body.set("redirect_uri", redirectUri);
|
|
204
|
+
body.set("client_id", clientId);
|
|
205
|
+
body.set("client_secret", clientSecret);
|
|
206
|
+
const response = await fetchImpl(tokenUrl, {
|
|
207
|
+
method: "POST",
|
|
208
|
+
headers: {
|
|
209
|
+
"content-type": "application/x-www-form-urlencoded",
|
|
210
|
+
accept: "application/json"
|
|
211
|
+
},
|
|
212
|
+
body: body.toString()
|
|
213
|
+
});
|
|
214
|
+
if (!response.ok) {
|
|
215
|
+
throw new Error(`Eliza Cloud token endpoint returned HTTP ${response.status} for code exchange`);
|
|
216
|
+
}
|
|
217
|
+
const payload = await response.json();
|
|
218
|
+
const { idToken } = shapeTokenResponse(payload);
|
|
219
|
+
const jwksUrl = args.bootstrap.getJwksUrl();
|
|
220
|
+
const remoteJwks = createRemoteJWKSet(new URL(jwksUrl));
|
|
221
|
+
const verified = await jwtVerify(idToken, remoteJwks, {
|
|
222
|
+
algorithms: ["RS256"],
|
|
223
|
+
issuer,
|
|
224
|
+
audience: clientId
|
|
225
|
+
});
|
|
226
|
+
const claims = shapeIdTokenClaims(verified.payload);
|
|
227
|
+
return {
|
|
228
|
+
cloudUserId: claims.sub,
|
|
229
|
+
email: claims.email,
|
|
230
|
+
displayName: claims.name,
|
|
231
|
+
claims
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
class CloudAuthService extends Service {
|
|
236
|
+
static serviceType = "CLOUD_AUTH";
|
|
237
|
+
capabilityDescription = "Eliza Cloud device authentication and SSO session helpers";
|
|
238
|
+
client;
|
|
239
|
+
credentials = null;
|
|
240
|
+
constructor(runtime) {
|
|
241
|
+
super(runtime);
|
|
242
|
+
this.client = new CloudApiClient(DEFAULT_CLOUD_CONFIG.baseUrl);
|
|
243
|
+
}
|
|
244
|
+
static async start(runtime) {
|
|
245
|
+
const service = new CloudAuthService(runtime);
|
|
246
|
+
await service.initialize();
|
|
247
|
+
return service;
|
|
248
|
+
}
|
|
249
|
+
async stop() {
|
|
250
|
+
this.credentials = null;
|
|
251
|
+
}
|
|
252
|
+
async initialize() {
|
|
253
|
+
const baseUrl = String(this.runtime.getSetting("ELIZAOS_CLOUD_BASE_URL") ?? DEFAULT_CLOUD_CONFIG.baseUrl);
|
|
254
|
+
this.client.setBaseUrl(baseUrl);
|
|
255
|
+
const existingKey = this.runtime.getSetting("ELIZAOS_CLOUD_API_KEY");
|
|
256
|
+
if (existingKey) {
|
|
257
|
+
const key = String(existingKey);
|
|
258
|
+
this.client.setApiKey(key);
|
|
259
|
+
this.credentials = {
|
|
260
|
+
apiKey: key,
|
|
261
|
+
userId: String(this.runtime.getSetting("ELIZAOS_CLOUD_USER_ID") ?? ""),
|
|
262
|
+
organizationId: String(this.runtime.getSetting("ELIZAOS_CLOUD_ORG_ID") ?? this.runtime.getSetting("ELIZA_CLOUD_ORGANIZATION_ID") ?? ""),
|
|
263
|
+
authenticatedAt: Date.now()
|
|
264
|
+
};
|
|
265
|
+
logger.info("[CloudAuth] Authenticated with saved API key");
|
|
266
|
+
this.validateApiKey(key).then((valid) => {
|
|
267
|
+
if (!valid) {
|
|
268
|
+
logger.warn("[CloudAuth] Saved API key could not be validated (cloud may be unreachable or key revoked) — model calls will use the key anyway");
|
|
269
|
+
}
|
|
270
|
+
}).catch(() => {});
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
const enabled = this.runtime.getSetting("ELIZAOS_CLOUD_ENABLED");
|
|
274
|
+
if (enabled === "true" || enabled === "1") {
|
|
275
|
+
try {
|
|
276
|
+
await this.authenticateWithDevice();
|
|
277
|
+
} catch (err) {
|
|
278
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
279
|
+
logger.warn(`[CloudAuth] Device auth failed (cloud may be unreachable): ${msg}`);
|
|
280
|
+
logger.info("[CloudAuth] Service will start unauthenticated — cloud features disabled until connectivity is restored");
|
|
281
|
+
}
|
|
282
|
+
} else {
|
|
283
|
+
logger.info("[CloudAuth] Cloud not enabled (set ELIZAOS_CLOUD_ENABLED=true)");
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
async validateApiKey(key) {
|
|
287
|
+
if (!await isCloudReachable()) {
|
|
288
|
+
logger.warn("[CloudAuth] Cloud unreachable at boot — skipping API key validation; key will be used as-is");
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
try {
|
|
292
|
+
const validationClient = new CloudApiClient(this.client.getBaseUrl(), key);
|
|
293
|
+
await validationClient.get("/models", { timeoutMs: 2500 });
|
|
294
|
+
return true;
|
|
295
|
+
} catch (err) {
|
|
296
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
297
|
+
logger.warn(`[CloudAuth] Could not reach cloud API to validate key: ${msg}`);
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
async authenticateWithDevice() {
|
|
302
|
+
const deviceId = await deriveDeviceId();
|
|
303
|
+
const platform = detectPlatform();
|
|
304
|
+
const appVersion = process.env.ELIZAOS_CLOUD_APP_VERSION ?? "2.0.0-beta.0";
|
|
305
|
+
const os = await import("node:os");
|
|
306
|
+
logger.info(`[CloudAuth] Authenticating device (platform=${platform})`);
|
|
307
|
+
const response = await this.client.postUnauthenticated("/device-auth", {
|
|
308
|
+
deviceId,
|
|
309
|
+
platform,
|
|
310
|
+
appVersion,
|
|
311
|
+
deviceName: os.hostname()
|
|
312
|
+
});
|
|
313
|
+
this.credentials = {
|
|
314
|
+
apiKey: response.data.apiKey,
|
|
315
|
+
userId: response.data.userId,
|
|
316
|
+
organizationId: response.data.organizationId,
|
|
317
|
+
authenticatedAt: Date.now()
|
|
318
|
+
};
|
|
319
|
+
this.client.setApiKey(response.data.apiKey);
|
|
320
|
+
const action = response.data.isNew ? "New account created" : "Authenticated";
|
|
321
|
+
logger.info(`[CloudAuth] ${action} (credits: $${response.data.credits.toFixed(2)})`);
|
|
322
|
+
return this.credentials;
|
|
323
|
+
}
|
|
324
|
+
authenticateWithApiKey(input) {
|
|
325
|
+
const apiKey = input.apiKey.trim();
|
|
326
|
+
if (!apiKey) {
|
|
327
|
+
throw new Error("Eliza Cloud API key is required");
|
|
328
|
+
}
|
|
329
|
+
this.client.setApiKey(apiKey);
|
|
330
|
+
this.credentials = {
|
|
331
|
+
apiKey,
|
|
332
|
+
userId: input.userId ?? "",
|
|
333
|
+
organizationId: input.organizationId ?? "",
|
|
334
|
+
authenticatedAt: Date.now()
|
|
335
|
+
};
|
|
336
|
+
logger.info("[CloudAuth] Authenticated with API key");
|
|
337
|
+
return this.credentials;
|
|
338
|
+
}
|
|
339
|
+
clearAuth() {
|
|
340
|
+
this.credentials = null;
|
|
341
|
+
this.client.setApiKey(undefined);
|
|
342
|
+
}
|
|
343
|
+
isAuthenticated() {
|
|
344
|
+
return this.credentials !== null;
|
|
345
|
+
}
|
|
346
|
+
getCredentials() {
|
|
347
|
+
return this.credentials;
|
|
348
|
+
}
|
|
349
|
+
getApiKey() {
|
|
350
|
+
return this.credentials?.apiKey ?? this.client.getApiKey();
|
|
351
|
+
}
|
|
352
|
+
getClient() {
|
|
353
|
+
return this.client;
|
|
354
|
+
}
|
|
355
|
+
getUserId() {
|
|
356
|
+
return this.credentials?.userId;
|
|
357
|
+
}
|
|
358
|
+
getOrganizationId() {
|
|
359
|
+
return this.credentials?.organizationId;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
export {
|
|
363
|
+
getSsoRedirectUrl,
|
|
364
|
+
exchangeCodeForSession,
|
|
365
|
+
CloudAuthService
|
|
366
|
+
};
|
|
367
|
+
|
|
368
|
+
//# debugId=C706585F0178D71764756E2164756E21
|