@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,45 @@
|
|
|
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/cloud/null-observer.ts
|
|
20
|
+
class NullCloudSetupObserver {
|
|
21
|
+
onAvailabilityChecked(_result) {}
|
|
22
|
+
onAuthStart(_loginUrl) {}
|
|
23
|
+
onAuthBrowserOpenFailed(_loginUrl, _error) {}
|
|
24
|
+
onAuthPollStatus(_status) {}
|
|
25
|
+
onAuthSuccess() {}
|
|
26
|
+
onAuthFailure(_message) {}
|
|
27
|
+
onProvisionStart(_agentName) {}
|
|
28
|
+
onProvisionStatus(_status) {}
|
|
29
|
+
onProvisionTimeout(_agentId, _lastStatus) {}
|
|
30
|
+
onProvisionFailure(_reason) {}
|
|
31
|
+
onProvisionSuccess(_result) {}
|
|
32
|
+
onNotice(_message) {}
|
|
33
|
+
onFatalError(_error, _context) {}
|
|
34
|
+
async confirm(_prompt) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
async selectChoice(_prompt) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export {
|
|
42
|
+
NullCloudSetupObserver
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
//# debugId=41A094308B5C165F64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/cloud/null-observer.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Silent `CloudSetupObserver` for tests and headless runs.\n *\n * - All event methods intentionally ignore their inputs.\n * - All prompt methods resolve to `null` (i.e. \"user cancelled\"), which\n * lets the orchestrator exercise its cancel branches without surfacing\n * any UI.\n *\n * Tests that want to assert observer calls should use a capturing\n * observer instead.\n *\n * @module cloud/null-observer\n */\nimport type {\n CloudSetupObserver,\n ConfirmPrompt,\n ProvisionSuccessInfo,\n SelectChoicePrompt,\n} from \"./setup-observer.js\";\n\nexport class NullCloudSetupObserver implements CloudSetupObserver {\n onAvailabilityChecked(_result: { ok: boolean; reason?: string }): void {}\n onAuthStart(_loginUrl: string): void {}\n onAuthBrowserOpenFailed(_loginUrl: string, _error: Error): void {}\n onAuthPollStatus(_status: string): void {}\n onAuthSuccess(): void {}\n onAuthFailure(_message: string): void {}\n onProvisionStart(_agentName: string): void {}\n onProvisionStatus(_status: string): void {}\n onProvisionTimeout(_agentId: string, _lastStatus: string): void {}\n onProvisionFailure(_reason: string): void {}\n onProvisionSuccess(_result: ProvisionSuccessInfo): void {}\n onNotice(_message: string): void {}\n onFatalError(_error: Error, _context: string): void {}\n\n async confirm(_prompt: ConfirmPrompt): Promise<boolean | null> {\n return null;\n }\n\n async selectChoice<T extends string>(\n _prompt: SelectChoicePrompt<T>,\n ): Promise<T | null> {\n return null;\n }\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAoBO,MAAM,uBAAqD;AAAA,EAChE,qBAAqB,CAAC,SAAiD;AAAA,EACvE,WAAW,CAAC,WAAyB;AAAA,EACrC,uBAAuB,CAAC,WAAmB,QAAqB;AAAA,EAChE,gBAAgB,CAAC,SAAuB;AAAA,EACxC,aAAa,GAAS;AAAA,EACtB,aAAa,CAAC,UAAwB;AAAA,EACtC,gBAAgB,CAAC,YAA0B;AAAA,EAC3C,iBAAiB,CAAC,SAAuB;AAAA,EACzC,kBAAkB,CAAC,UAAkB,aAA2B;AAAA,EAChE,kBAAkB,CAAC,SAAuB;AAAA,EAC1C,kBAAkB,CAAC,SAAqC;AAAA,EACxD,QAAQ,CAAC,UAAwB;AAAA,EACjC,YAAY,CAAC,QAAe,UAAwB;AAAA,OAE9C,QAAO,CAAC,SAAiD;AAAA,IAC7D,OAAO;AAAA;AAAA,OAGH,aAA8B,CAClC,SACmB;AAAA,IACnB,OAAO;AAAA;AAEX;",
|
|
8
|
+
"debugId": "41A094308B5C165F64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heartbeat monitor with auto-reconnect via exponential backoff.
|
|
3
|
+
*/
|
|
4
|
+
import type { ElizaCloudClient } from "./bridge-client.js";
|
|
5
|
+
export interface ConnectionMonitorCallbacks {
|
|
6
|
+
onDisconnect: () => void;
|
|
7
|
+
onReconnect: () => void;
|
|
8
|
+
onStatusChange?: (status: "connected" | "reconnecting" | "disconnected") => void;
|
|
9
|
+
}
|
|
10
|
+
export declare class ConnectionMonitor {
|
|
11
|
+
private client;
|
|
12
|
+
private agentId;
|
|
13
|
+
private callbacks;
|
|
14
|
+
private heartbeatIntervalMs;
|
|
15
|
+
private maxFailures;
|
|
16
|
+
private timer;
|
|
17
|
+
private consecutiveFailures;
|
|
18
|
+
private reconnecting;
|
|
19
|
+
constructor(client: ElizaCloudClient, agentId: string, callbacks: ConnectionMonitorCallbacks, heartbeatIntervalMs?: number, maxFailures?: number);
|
|
20
|
+
start(): void;
|
|
21
|
+
stop(): void;
|
|
22
|
+
isMonitoring(): boolean;
|
|
23
|
+
private tick;
|
|
24
|
+
private attemptReconnect;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=reconnect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconnect.d.ts","sourceRoot":"","sources":["../../src/cloud/reconnect.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,WAAW,0BAA0B;IACzC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,cAAc,CAAC,EAAE,CACf,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,cAAc,KAClD,IAAI,CAAC;CACX;AAED,qBAAa,iBAAiB;IAM1B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,WAAW;IATrB,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,YAAY,CAAS;gBAGnB,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,0BAA0B,EACrC,mBAAmB,GAAE,MAAe,EACpC,WAAW,GAAE,MAAU;IAGjC,KAAK,IAAI,IAAI;IAWb,IAAI,IAAI,IAAI;IAUZ,YAAY,IAAI,OAAO;YAIT,IAAI;YA4BJ,gBAAgB;CA6B/B"}
|
|
@@ -0,0 +1,104 @@
|
|
|
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/cloud/reconnect.ts
|
|
20
|
+
import { logger } from "@elizaos/core";
|
|
21
|
+
|
|
22
|
+
class ConnectionMonitor {
|
|
23
|
+
client;
|
|
24
|
+
agentId;
|
|
25
|
+
callbacks;
|
|
26
|
+
heartbeatIntervalMs;
|
|
27
|
+
maxFailures;
|
|
28
|
+
timer = null;
|
|
29
|
+
consecutiveFailures = 0;
|
|
30
|
+
reconnecting = false;
|
|
31
|
+
constructor(client, agentId, callbacks, heartbeatIntervalMs = 30000, maxFailures = 3) {
|
|
32
|
+
this.client = client;
|
|
33
|
+
this.agentId = agentId;
|
|
34
|
+
this.callbacks = callbacks;
|
|
35
|
+
this.heartbeatIntervalMs = heartbeatIntervalMs;
|
|
36
|
+
this.maxFailures = maxFailures;
|
|
37
|
+
}
|
|
38
|
+
start() {
|
|
39
|
+
if (this.timer)
|
|
40
|
+
return;
|
|
41
|
+
logger.info(`[cloud-monitor] Starting connection monitor (interval: ${this.heartbeatIntervalMs}ms, maxFailures: ${this.maxFailures})`);
|
|
42
|
+
this.consecutiveFailures = 0;
|
|
43
|
+
this.timer = setInterval(() => {
|
|
44
|
+
this.tick();
|
|
45
|
+
}, this.heartbeatIntervalMs);
|
|
46
|
+
}
|
|
47
|
+
stop() {
|
|
48
|
+
if (this.timer) {
|
|
49
|
+
clearInterval(this.timer);
|
|
50
|
+
this.timer = null;
|
|
51
|
+
}
|
|
52
|
+
this.consecutiveFailures = 0;
|
|
53
|
+
this.reconnecting = false;
|
|
54
|
+
logger.info("[cloud-monitor] Connection monitor stopped");
|
|
55
|
+
}
|
|
56
|
+
isMonitoring() {
|
|
57
|
+
return this.timer !== null;
|
|
58
|
+
}
|
|
59
|
+
async tick() {
|
|
60
|
+
if (this.reconnecting)
|
|
61
|
+
return;
|
|
62
|
+
const alive = await this.client.heartbeat(this.agentId).catch(() => false);
|
|
63
|
+
if (alive) {
|
|
64
|
+
if (this.consecutiveFailures > 0) {
|
|
65
|
+
this.consecutiveFailures = 0;
|
|
66
|
+
this.callbacks.onStatusChange?.("connected");
|
|
67
|
+
}
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
this.consecutiveFailures++;
|
|
71
|
+
logger.warn(`[cloud-monitor] Heartbeat failed (${this.consecutiveFailures}/${this.maxFailures})`);
|
|
72
|
+
if (this.consecutiveFailures >= this.maxFailures) {
|
|
73
|
+
this.callbacks.onDisconnect();
|
|
74
|
+
await this.attemptReconnect();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async attemptReconnect() {
|
|
78
|
+
this.reconnecting = true;
|
|
79
|
+
this.callbacks.onStatusChange?.("reconnecting");
|
|
80
|
+
let delay = 3000;
|
|
81
|
+
for (let attempt = 1;attempt <= 10; attempt++) {
|
|
82
|
+
logger.info(`[cloud-monitor] Reconnect attempt ${attempt}/10...`);
|
|
83
|
+
const ok = await this.client.provision(this.agentId).then(() => true).catch(() => false);
|
|
84
|
+
if (ok) {
|
|
85
|
+
logger.info("[cloud-monitor] Reconnection successful");
|
|
86
|
+
this.consecutiveFailures = 0;
|
|
87
|
+
this.reconnecting = false;
|
|
88
|
+
this.callbacks.onStatusChange?.("connected");
|
|
89
|
+
this.callbacks.onReconnect();
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
93
|
+
delay = Math.min(delay * 2, 60000);
|
|
94
|
+
}
|
|
95
|
+
logger.error("[cloud-monitor] Failed to reconnect after 10 attempts");
|
|
96
|
+
this.reconnecting = false;
|
|
97
|
+
this.callbacks.onStatusChange?.("disconnected");
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export {
|
|
101
|
+
ConnectionMonitor
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
//# debugId=430B8E5B9401539164756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/cloud/reconnect.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Heartbeat monitor with auto-reconnect via exponential backoff.\n */\n\nimport { logger } from \"@elizaos/core\";\nimport type { ElizaCloudClient } from \"./bridge-client.js\";\n\nexport interface ConnectionMonitorCallbacks {\n onDisconnect: () => void;\n onReconnect: () => void;\n onStatusChange?: (\n status: \"connected\" | \"reconnecting\" | \"disconnected\",\n ) => void;\n}\n\nexport class ConnectionMonitor {\n private timer: ReturnType<typeof setInterval> | null = null;\n private consecutiveFailures = 0;\n private reconnecting = false;\n\n constructor(\n private client: ElizaCloudClient,\n private agentId: string,\n private callbacks: ConnectionMonitorCallbacks,\n private heartbeatIntervalMs: number = 30_000,\n private maxFailures: number = 3,\n ) {}\n\n start(): void {\n if (this.timer) return;\n logger.info(\n `[cloud-monitor] Starting connection monitor (interval: ${this.heartbeatIntervalMs}ms, maxFailures: ${this.maxFailures})`,\n );\n this.consecutiveFailures = 0;\n this.timer = setInterval(() => {\n this.tick();\n }, this.heartbeatIntervalMs);\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n this.consecutiveFailures = 0;\n this.reconnecting = false;\n logger.info(\"[cloud-monitor] Connection monitor stopped\");\n }\n\n isMonitoring(): boolean {\n return this.timer !== null;\n }\n\n private async tick(): Promise<void> {\n if (this.reconnecting) return;\n\n const alive = await this.client.heartbeat(this.agentId).catch(() => false);\n\n if (alive) {\n if (this.consecutiveFailures > 0) {\n this.consecutiveFailures = 0;\n this.callbacks.onStatusChange?.(\"connected\");\n }\n return;\n }\n\n this.consecutiveFailures++;\n logger.warn(\n `[cloud-monitor] Heartbeat failed (${this.consecutiveFailures}/${this.maxFailures})`,\n );\n\n if (this.consecutiveFailures >= this.maxFailures) {\n // Don't emit \"disconnected\" here — attemptReconnect() will emit\n // \"reconnecting\" first, and only emits \"disconnected\" if all\n // retry attempts fail. This avoids a misleading disconnected→\n // reconnecting flicker for callers.\n this.callbacks.onDisconnect();\n await this.attemptReconnect();\n }\n }\n\n private async attemptReconnect(): Promise<void> {\n this.reconnecting = true;\n this.callbacks.onStatusChange?.(\"reconnecting\");\n\n let delay = 3_000;\n for (let attempt = 1; attempt <= 10; attempt++) {\n logger.info(`[cloud-monitor] Reconnect attempt ${attempt}/10...`);\n const ok = await this.client\n .provision(this.agentId)\n .then(() => true)\n .catch(() => false);\n\n if (ok) {\n logger.info(\"[cloud-monitor] Reconnection successful\");\n this.consecutiveFailures = 0;\n this.reconnecting = false;\n this.callbacks.onStatusChange?.(\"connected\");\n this.callbacks.onReconnect();\n return;\n }\n\n await new Promise((r) => setTimeout(r, delay));\n delay = Math.min(delay * 2, 60_000);\n }\n\n logger.error(\"[cloud-monitor] Failed to reconnect after 10 attempts\");\n this.reconnecting = false;\n this.callbacks.onStatusChange?.(\"disconnected\");\n }\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAIA;AAAA;AAWO,MAAM,kBAAkB;AAAA,EAMnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EATF,QAA+C;AAAA,EAC/C,sBAAsB;AAAA,EACtB,eAAe;AAAA,EAEvB,WAAW,CACD,QACA,SACA,WACA,sBAA8B,OAC9B,cAAsB,GAC9B;AAAA,IALQ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,EAGV,KAAK,GAAS;AAAA,IACZ,IAAI,KAAK;AAAA,MAAO;AAAA,IAChB,OAAO,KACL,0DAA0D,KAAK,uCAAuC,KAAK,cAC7G;AAAA,IACA,KAAK,sBAAsB;AAAA,IAC3B,KAAK,QAAQ,YAAY,MAAM;AAAA,MAC7B,KAAK,KAAK;AAAA,OACT,KAAK,mBAAmB;AAAA;AAAA,EAG7B,IAAI,GAAS;AAAA,IACX,IAAI,KAAK,OAAO;AAAA,MACd,cAAc,KAAK,KAAK;AAAA,MACxB,KAAK,QAAQ;AAAA,IACf;AAAA,IACA,KAAK,sBAAsB;AAAA,IAC3B,KAAK,eAAe;AAAA,IACpB,OAAO,KAAK,4CAA4C;AAAA;AAAA,EAG1D,YAAY,GAAY;AAAA,IACtB,OAAO,KAAK,UAAU;AAAA;AAAA,OAGV,KAAI,GAAkB;AAAA,IAClC,IAAI,KAAK;AAAA,MAAc;AAAA,IAEvB,MAAM,QAAQ,MAAM,KAAK,OAAO,UAAU,KAAK,OAAO,EAAE,MAAM,MAAM,KAAK;AAAA,IAEzE,IAAI,OAAO;AAAA,MACT,IAAI,KAAK,sBAAsB,GAAG;AAAA,QAChC,KAAK,sBAAsB;AAAA,QAC3B,KAAK,UAAU,iBAAiB,WAAW;AAAA,MAC7C;AAAA,MACA;AAAA,IACF;AAAA,IAEA,KAAK;AAAA,IACL,OAAO,KACL,qCAAqC,KAAK,uBAAuB,KAAK,cACxE;AAAA,IAEA,IAAI,KAAK,uBAAuB,KAAK,aAAa;AAAA,MAKhD,KAAK,UAAU,aAAa;AAAA,MAC5B,MAAM,KAAK,iBAAiB;AAAA,IAC9B;AAAA;AAAA,OAGY,iBAAgB,GAAkB;AAAA,IAC9C,KAAK,eAAe;AAAA,IACpB,KAAK,UAAU,iBAAiB,cAAc;AAAA,IAE9C,IAAI,QAAQ;AAAA,IACZ,SAAS,UAAU,EAAG,WAAW,IAAI,WAAW;AAAA,MAC9C,OAAO,KAAK,qCAAqC,eAAe;AAAA,MAChE,MAAM,KAAK,MAAM,KAAK,OACnB,UAAU,KAAK,OAAO,EACtB,KAAK,MAAM,IAAI,EACf,MAAM,MAAM,KAAK;AAAA,MAEpB,IAAI,IAAI;AAAA,QACN,OAAO,KAAK,yCAAyC;AAAA,QACrD,KAAK,sBAAsB;AAAA,QAC3B,KAAK,eAAe;AAAA,QACpB,KAAK,UAAU,iBAAiB,WAAW;AAAA,QAC3C,KAAK,UAAU,YAAY;AAAA,QAC3B;AAAA,MACF;AAAA,MAEA,MAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AAAA,MAC7C,QAAQ,KAAK,IAAI,QAAQ,GAAG,KAAM;AAAA,IACpC;AAAA,IAEA,OAAO,MAAM,uDAAuD;AAAA,IACpE,KAAK,eAAe;AAAA,IACpB,KAAK,UAAU,iBAAiB,cAAc;AAAA;AAElD;",
|
|
8
|
+
"debugId": "430B8E5B9401539164756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transport-agnostic observer for the cloud setup orchestrator.
|
|
3
|
+
*
|
|
4
|
+
* `runCloudSetup` calls into this interface for every user-visible
|
|
5
|
+
* event and every interactive prompt. CLI provides a `@clack/prompts`-
|
|
6
|
+
* backed implementation; web/desktop provides an event-bridge
|
|
7
|
+
* implementation; tests provide a capturing observer.
|
|
8
|
+
*
|
|
9
|
+
* The orchestrator MUST stay free of any presentation-layer concerns
|
|
10
|
+
* (spinners, terminal output, GUI events). It only knows about the
|
|
11
|
+
* methods defined here.
|
|
12
|
+
*
|
|
13
|
+
* @module cloud/setup-observer
|
|
14
|
+
*/
|
|
15
|
+
import type { ProvisionInfo } from "./bridge-client.js";
|
|
16
|
+
export interface AvailabilityResult {
|
|
17
|
+
ok: boolean;
|
|
18
|
+
/** Human-readable reason when `ok` is false. */
|
|
19
|
+
reason?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ProvisionSuccessInfo {
|
|
22
|
+
agentId: string;
|
|
23
|
+
bridgeUrl?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface ConfirmPrompt {
|
|
26
|
+
message: string;
|
|
27
|
+
/** Optional override for the default value when the user just presses enter. */
|
|
28
|
+
defaultValue?: boolean;
|
|
29
|
+
/** Optional label for the "true" branch. CLI surfaces use this on a toggle. */
|
|
30
|
+
activeLabel?: string;
|
|
31
|
+
/** Optional label for the "false" branch. CLI surfaces use this on a toggle. */
|
|
32
|
+
inactiveLabel?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface SelectChoiceOption<T extends string> {
|
|
35
|
+
label: string;
|
|
36
|
+
value: T;
|
|
37
|
+
hint?: string;
|
|
38
|
+
}
|
|
39
|
+
export interface SelectChoicePrompt<T extends string> {
|
|
40
|
+
message: string;
|
|
41
|
+
options: SelectChoiceOption<T>[];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Sink for every event the cloud setup orchestrator surfaces, plus the
|
|
45
|
+
* interactive prompts it needs to resolve.
|
|
46
|
+
*
|
|
47
|
+
* Implementation contract:
|
|
48
|
+
*
|
|
49
|
+
* - Event methods are fire-and-forget; they MUST NOT throw. Implementations
|
|
50
|
+
* that fail to render an event are responsible for their own logging.
|
|
51
|
+
* - Prompt methods are async. A `null` return from `selectChoice` or a
|
|
52
|
+
* cancellation from `confirm` is interpreted by the orchestrator as
|
|
53
|
+
* "user cancelled" — the orchestrator decides what that means for the
|
|
54
|
+
* flow. The observer MUST NOT exit the process or throw on cancel.
|
|
55
|
+
*/
|
|
56
|
+
export interface CloudSetupObserver {
|
|
57
|
+
onAvailabilityChecked(result: AvailabilityResult): void;
|
|
58
|
+
onAuthStart(loginUrl: string): void;
|
|
59
|
+
/**
|
|
60
|
+
* The orchestrator could not spawn the OS browser (no `open` / `xdg-open`
|
|
61
|
+
* / `cmd.exe` on PATH, etc.). The login URL is unchanged — the observer
|
|
62
|
+
* can render an inline "visit this URL manually" affordance, retry, or
|
|
63
|
+
* surface the error however it wants. This was previously swallowed
|
|
64
|
+
* silently behind a debug log.
|
|
65
|
+
*/
|
|
66
|
+
onAuthBrowserOpenFailed(loginUrl: string, error: Error): void;
|
|
67
|
+
onAuthPollStatus(status: string): void;
|
|
68
|
+
onAuthSuccess(): void;
|
|
69
|
+
onAuthFailure(message: string): void;
|
|
70
|
+
onProvisionStart(agentName: string): void;
|
|
71
|
+
onProvisionStatus(status: string, current?: ProvisionInfo): void;
|
|
72
|
+
onProvisionTimeout(agentId: string, lastStatus: string): void;
|
|
73
|
+
onProvisionFailure(reason: string): void;
|
|
74
|
+
onProvisionSuccess(result: ProvisionSuccessInfo): void;
|
|
75
|
+
/**
|
|
76
|
+
* A categorized user-facing message that doesn't map onto a specific
|
|
77
|
+
* lifecycle event — e.g. "Cloud login was not completed", "Cloud agent
|
|
78
|
+
* is still starting up. You can try `eliza cloud connect` once it's
|
|
79
|
+
* ready." The CLI implementation renders these as `log.warn`.
|
|
80
|
+
*/
|
|
81
|
+
onNotice(message: string): void;
|
|
82
|
+
/**
|
|
83
|
+
* An unexpected, non-flow-control error. The orchestrator does not
|
|
84
|
+
* itself swallow errors — it surfaces them here and lets the observer
|
|
85
|
+
* decide whether to retry, fall back, or rethrow.
|
|
86
|
+
*/
|
|
87
|
+
onFatalError(error: Error, context: string): void;
|
|
88
|
+
/**
|
|
89
|
+
* Resolve to `true` / `false` for a yes/no decision, or `null` when the
|
|
90
|
+
* user explicitly cancels (e.g. Ctrl-C on CLI, modal dismiss on GUI).
|
|
91
|
+
*/
|
|
92
|
+
confirm(prompt: ConfirmPrompt): Promise<boolean | null>;
|
|
93
|
+
/**
|
|
94
|
+
* Resolve to the chosen value, or `null` on cancel.
|
|
95
|
+
*/
|
|
96
|
+
selectChoice<T extends string>(prompt: SelectChoicePrompt<T>): Promise<T | null>;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=setup-observer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-observer.d.ts","sourceRoot":"","sources":["../../src/cloud/setup-observer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMxD,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,MAAM;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,CAAC;IACT,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,MAAM;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;CAClC;AAMD;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,kBAAkB;IAEjC,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAExD,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC;;;;;;OAMG;IACH,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC9D,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,aAAa,IAAI,IAAI,CAAC;IACtB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAErC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACjE,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9D,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,kBAAkB,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAEvD;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAEhC;;;;OAIG;IACH,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAGlD;;;OAGG;IACH,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAExD;;OAEG;IACH,YAAY,CAAC,CAAC,SAAS,MAAM,EAC3B,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-url.d.ts","sourceRoot":"","sources":["../../src/cloud/validate-url.ts"],"names":[],"mappings":"AA4HA,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA4DxB"}
|
|
@@ -0,0 +1,175 @@
|
|
|
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/cloud/validate-url.ts
|
|
20
|
+
import dns from "node:dns";
|
|
21
|
+
import net from "node:net";
|
|
22
|
+
import { promisify } from "node:util";
|
|
23
|
+
function normalizeHostLike(value) {
|
|
24
|
+
return value.trim().toLowerCase().replace(/^\[|\]$/g, "");
|
|
25
|
+
}
|
|
26
|
+
function decodeIpv6MappedHex(mapped) {
|
|
27
|
+
const parts = mapped.split(":");
|
|
28
|
+
if (parts.length < 1 || parts.length > 2)
|
|
29
|
+
return null;
|
|
30
|
+
const parsed = parts.map((part) => {
|
|
31
|
+
if (!/^[0-9a-f]{1,4}$/i.test(part))
|
|
32
|
+
return Number.NaN;
|
|
33
|
+
return Number.parseInt(part, 16);
|
|
34
|
+
});
|
|
35
|
+
if (parsed.some((value) => !Number.isFinite(value)))
|
|
36
|
+
return null;
|
|
37
|
+
const [hi, lo] = parsed.length === 1 ? [0, parsed[0]] : parsed;
|
|
38
|
+
const octets = [hi >> 8, hi & 255, lo >> 8, lo & 255];
|
|
39
|
+
return octets.join(".");
|
|
40
|
+
}
|
|
41
|
+
function canonicalizeIpv6(ip) {
|
|
42
|
+
try {
|
|
43
|
+
return new URL(`http://[${ip}]/`).hostname.replace(/^\[|\]$/g, "");
|
|
44
|
+
} catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function normalizeIpForPolicy(ip) {
|
|
49
|
+
const base = normalizeHostLike(ip).split("%")[0];
|
|
50
|
+
if (!base)
|
|
51
|
+
return base;
|
|
52
|
+
let normalized = base;
|
|
53
|
+
if (net.isIP(normalized) === 6) {
|
|
54
|
+
normalized = canonicalizeIpv6(normalized) ?? normalized;
|
|
55
|
+
}
|
|
56
|
+
let mapped = null;
|
|
57
|
+
if (normalized.startsWith("::ffff:")) {
|
|
58
|
+
mapped = normalized.slice("::ffff:".length);
|
|
59
|
+
} else if (normalized.startsWith("0:0:0:0:0:ffff:")) {
|
|
60
|
+
mapped = normalized.slice("0:0:0:0:0:ffff:".length);
|
|
61
|
+
}
|
|
62
|
+
if (!mapped)
|
|
63
|
+
return normalized;
|
|
64
|
+
if (net.isIP(mapped) === 4)
|
|
65
|
+
return mapped;
|
|
66
|
+
return decodeIpv6MappedHex(mapped) ?? normalized;
|
|
67
|
+
}
|
|
68
|
+
function cidrV4(base, prefix) {
|
|
69
|
+
const parsed = parseIpv4ToInt(base);
|
|
70
|
+
if (parsed === null) {
|
|
71
|
+
throw new Error(`Invalid CIDR base IPv4 address: ${base}`);
|
|
72
|
+
}
|
|
73
|
+
const shift = 32 - prefix;
|
|
74
|
+
const mask = shift === 32 ? 0 : 4294967295 << shift >>> 0;
|
|
75
|
+
return { base: parsed & mask, mask };
|
|
76
|
+
}
|
|
77
|
+
function parseIpv4ToInt(ip) {
|
|
78
|
+
const parts = ip.split(".");
|
|
79
|
+
if (parts.length !== 4)
|
|
80
|
+
return null;
|
|
81
|
+
let value = 0;
|
|
82
|
+
for (const part of parts) {
|
|
83
|
+
if (!/^\d{1,3}$/.test(part))
|
|
84
|
+
return null;
|
|
85
|
+
const octet = Number.parseInt(part, 10);
|
|
86
|
+
if (!Number.isInteger(octet) || octet < 0 || octet > 255)
|
|
87
|
+
return null;
|
|
88
|
+
value = value << 8 | octet;
|
|
89
|
+
}
|
|
90
|
+
return value >>> 0;
|
|
91
|
+
}
|
|
92
|
+
function isBlockedIpv4(ip) {
|
|
93
|
+
const asInt = parseIpv4ToInt(ip);
|
|
94
|
+
if (asInt === null)
|
|
95
|
+
return true;
|
|
96
|
+
return BLOCKED_IPV4_CIDRS.some((cidr) => (asInt & cidr.mask) === cidr.base);
|
|
97
|
+
}
|
|
98
|
+
function isBlockedIpv6(ip) {
|
|
99
|
+
const normalized = ip.toLowerCase();
|
|
100
|
+
return normalized === "::" || normalized === "::1" || /^fe[89ab][0-9a-f]:/.test(normalized) || /^f[cd][0-9a-f]{2}:/i.test(normalized) || normalized.startsWith("ff");
|
|
101
|
+
}
|
|
102
|
+
function isBlockedIp(ip) {
|
|
103
|
+
const normalized = normalizeIpForPolicy(ip);
|
|
104
|
+
const family = net.isIP(normalized);
|
|
105
|
+
if (family === 4)
|
|
106
|
+
return isBlockedIpv4(normalized);
|
|
107
|
+
if (family === 6)
|
|
108
|
+
return isBlockedIpv6(normalized);
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
async function validateCloudBaseUrl(rawUrl) {
|
|
112
|
+
let parsed;
|
|
113
|
+
try {
|
|
114
|
+
parsed = new URL(rawUrl);
|
|
115
|
+
} catch {
|
|
116
|
+
return `Invalid cloud base URL: "${rawUrl}"`;
|
|
117
|
+
}
|
|
118
|
+
if (parsed.protocol !== "https:") {
|
|
119
|
+
return `Cloud base URL must use HTTPS, got "${parsed.protocol}" in "${rawUrl}"`;
|
|
120
|
+
}
|
|
121
|
+
const hostname = normalizeHostLike(parsed.hostname);
|
|
122
|
+
if (!hostname) {
|
|
123
|
+
return `Invalid cloud base URL: "${rawUrl}"`;
|
|
124
|
+
}
|
|
125
|
+
if (hostname === "localhost" || hostname.endsWith(".localhost") || hostname.endsWith(".local")) {
|
|
126
|
+
return `Cloud base URL "${rawUrl}" points to a blocked local hostname.`;
|
|
127
|
+
}
|
|
128
|
+
const elizaDev = process.env.ELIZA_DEV?.trim().toLowerCase();
|
|
129
|
+
if (true) {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
if (isBlockedIp(hostname)) {
|
|
133
|
+
return `Cloud base URL "${rawUrl}" points to a blocked address.`;
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
const results = await dnsLookupAll(hostname, { all: true });
|
|
137
|
+
const addresses = Array.isArray(results) ? results : [results];
|
|
138
|
+
for (const entry of addresses) {
|
|
139
|
+
const ip = typeof entry === "string" ? entry : entry.address;
|
|
140
|
+
if (isBlockedIp(ip)) {
|
|
141
|
+
return `Cloud base URL "${rawUrl}" resolves to ${ip}, ` + "which is a blocked internal/metadata address.";
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
} catch {
|
|
145
|
+
return `Cloud base URL "${rawUrl}" could not be resolved via DNS.`;
|
|
146
|
+
}
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
var dnsLookupAll, BLOCKED_IPV4_CIDRS;
|
|
150
|
+
var init_validate_url = __esm(() => {
|
|
151
|
+
dnsLookupAll = promisify(dns.lookup);
|
|
152
|
+
BLOCKED_IPV4_CIDRS = [
|
|
153
|
+
cidrV4("0.0.0.0", 8),
|
|
154
|
+
cidrV4("10.0.0.0", 8),
|
|
155
|
+
cidrV4("172.16.0.0", 12),
|
|
156
|
+
cidrV4("192.168.0.0", 16),
|
|
157
|
+
cidrV4("100.64.0.0", 10),
|
|
158
|
+
cidrV4("127.0.0.0", 8),
|
|
159
|
+
cidrV4("169.254.0.0", 16),
|
|
160
|
+
cidrV4("192.0.0.0", 24),
|
|
161
|
+
cidrV4("198.18.0.0", 15),
|
|
162
|
+
cidrV4("192.0.2.0", 24),
|
|
163
|
+
cidrV4("198.51.100.0", 24),
|
|
164
|
+
cidrV4("203.0.113.0", 24),
|
|
165
|
+
cidrV4("224.0.0.0", 4),
|
|
166
|
+
cidrV4("240.0.0.0", 4)
|
|
167
|
+
];
|
|
168
|
+
});
|
|
169
|
+
init_validate_url();
|
|
170
|
+
|
|
171
|
+
export {
|
|
172
|
+
validateCloudBaseUrl
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
//# debugId=4ADEDB99210B0D5564756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/cloud/validate-url.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"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"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "4ADEDB99210B0D5564756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x402 (HTTP 402 Payment Required) handler for Eliza Cloud relays.
|
|
3
|
+
*
|
|
4
|
+
* Spec reference: https://www.x402.org
|
|
5
|
+
*
|
|
6
|
+
* When the user's Cloud credit balance can't cover a metered call, the
|
|
7
|
+
* Cloud relay returns HTTP 402 with a `payment-requirements` envelope —
|
|
8
|
+
* either as a `WWW-Authenticate: x402 <json>` header or as a JSON body
|
|
9
|
+
* with a top-level `paymentRequirements` array. Each requirement
|
|
10
|
+
* describes one acceptable payment option (asset, network, recipient,
|
|
11
|
+
* amount).
|
|
12
|
+
*
|
|
13
|
+
* This module is intentionally thin:
|
|
14
|
+
* - `parseX402Response` extracts requirements from a Response.
|
|
15
|
+
* - `PaymentRequiredError` carries them up to the action layer.
|
|
16
|
+
* - `requestPayment` is the agent-side bridge: today it surfaces the
|
|
17
|
+
* requirement back to the owner via the runtime logger so the UI /
|
|
18
|
+
* planner can route the user to the existing wallet top-up flow.
|
|
19
|
+
* Auto-pay intentionally lives outside this bridge — the actual money
|
|
20
|
+
* movement is Cloud-side and gated by the wallet UI (commandment 4).
|
|
21
|
+
*
|
|
22
|
+
* No silent failures: a malformed 402 throws so the action layer can
|
|
23
|
+
* surface a clear "payment-required" message rather than treating the
|
|
24
|
+
* upstream as a generic HTTP error.
|
|
25
|
+
*/
|
|
26
|
+
import { type IAgentRuntime } from "@elizaos/core";
|
|
27
|
+
/**
|
|
28
|
+
* One acceptable payment option as advertised by the server.
|
|
29
|
+
*
|
|
30
|
+
* Fields mirror the x402 spec's `paymentRequirements` entry. We type
|
|
31
|
+
* everything as required so silent partial parses are impossible — the
|
|
32
|
+
* parser either yields a complete requirement or rejects it.
|
|
33
|
+
*/
|
|
34
|
+
export interface X402PaymentRequirement {
|
|
35
|
+
/** Decimal amount in the asset's smallest unit (e.g. "1500000" for
|
|
36
|
+
* 1.50 USDC). String, not number, to preserve precision. */
|
|
37
|
+
readonly amount: string;
|
|
38
|
+
/** Asset symbol or ERC-20 contract address (e.g. "USDC"). */
|
|
39
|
+
readonly asset: string;
|
|
40
|
+
/** Network identifier (e.g. "base", "ethereum", "solana"). */
|
|
41
|
+
readonly network: string;
|
|
42
|
+
/** Recipient address that should receive the payment. */
|
|
43
|
+
readonly payTo: string;
|
|
44
|
+
/** Payment scheme — currently x402 supports "exact" only. */
|
|
45
|
+
readonly scheme: string;
|
|
46
|
+
/** ISO-8601 deadline after which the requirement is no longer valid. */
|
|
47
|
+
readonly expiresAt: string | null;
|
|
48
|
+
/** Human-readable description of the resource being purchased. */
|
|
49
|
+
readonly description: string | null;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Pull payment requirements out of an x402 response. Tries the header
|
|
53
|
+
* form first (lowest-overhead per spec), then falls back to the JSON
|
|
54
|
+
* body. Returns `null` when the response carries no parseable
|
|
55
|
+
* requirements — callers should treat that as a generic 402 and
|
|
56
|
+
* surface the upstream status text.
|
|
57
|
+
*/
|
|
58
|
+
export declare function parseX402Response(response: Response): Promise<X402PaymentRequirement[] | null>;
|
|
59
|
+
/**
|
|
60
|
+
* Thrown by adapters when an upstream metered call returns 402 with
|
|
61
|
+
* actionable payment requirements. Action handlers convert this into an
|
|
62
|
+
* approval-queue entry so the user sees both the cost and the
|
|
63
|
+
* top-up prompt together.
|
|
64
|
+
*/
|
|
65
|
+
export declare class PaymentRequiredError extends Error {
|
|
66
|
+
readonly code: "PAYMENT_REQUIRED";
|
|
67
|
+
readonly requirements: ReadonlyArray<X402PaymentRequirement>;
|
|
68
|
+
constructor(requirements: ReadonlyArray<X402PaymentRequirement>, message?: string);
|
|
69
|
+
}
|
|
70
|
+
export interface PaymentReceipt {
|
|
71
|
+
readonly status: "surfaced" | "paid";
|
|
72
|
+
readonly requirement: X402PaymentRequirement;
|
|
73
|
+
/** Transaction id when status === "paid", null when only surfaced. */
|
|
74
|
+
readonly txId: string | null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Bridge from a raw payment requirement to user action. For now this
|
|
78
|
+
* does not auto-pay: the actual money movement happens in the existing
|
|
79
|
+
* wallet UI (Cloud-side). We log the requirement so the agent's
|
|
80
|
+
* messaging surface and the desktop dev console both pick it up, then
|
|
81
|
+
* return a "surfaced" receipt for the action layer to forward into the
|
|
82
|
+
* approval queue.
|
|
83
|
+
*/
|
|
84
|
+
export declare function requestPayment(runtime: IAgentRuntime, requirements: ReadonlyArray<X402PaymentRequirement>): Promise<PaymentReceipt>;
|
|
85
|
+
//# sourceMappingURL=x402-payment-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402-payment-handler.d.ts","sourceRoot":"","sources":["../../src/cloud/x402-payment-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,KAAK,aAAa,EAAU,MAAM,eAAe,CAAC;AAE3D;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACrC;iEAC6D;IAC7D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,6DAA6D;IAC7D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,kEAAkE;IAClE,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAuED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,sBAAsB,EAAE,GAAG,IAAI,CAAC,CAqB1C;AAED;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,EAAG,kBAAkB,CAAU;IAC5C,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,sBAAsB,CAAC,CAAC;gBAG3D,YAAY,EAAE,aAAa,CAAC,sBAAsB,CAAC,EACnD,OAAO,CAAC,EAAE,MAAM;CASnB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,sBAAsB,CAAC;IAC7C,sEAAsE;IACtE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,aAAa,EACtB,YAAY,EAAE,aAAa,CAAC,sBAAsB,CAAC,GAClD,OAAO,CAAC,cAAc,CAAC,CAmBzB"}
|