@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,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/cloud/base-url.ts", "../src/cloud/validate-url.ts", "../src/cloud/auth-service-types.ts", "../src/cloud/auth.ts", "../src/cloud/bridge-client.ts", "../src/cloud/backup.ts", "../src/cloud/cloud-proxy.ts", "../src/cloud/reconnect.ts", "../src/cloud/cloud-manager.ts", "../src/cloud/x402-payment-handler.ts", "../src/cloud/duffel-client.ts", "../src/cloud/lifeops-schedule-sync-client.ts", "../src/cloud/lifeops-schedule-sync-contracts.ts", "../src/cloud/managed-payment-clients.ts", "../src/cloud/index.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 * Eliza Cloud login flow — reuses the CLI auth session pattern:\n * create session, open browser, poll until authenticated, return API key.\n */\n\nimport crypto from \"node:crypto\";\nimport { logger } from \"@elizaos/core\";\nimport { normalizeCloudSiteUrl } from \"./base-url.js\";\nimport { validateCloudBaseUrl } from \"./validate-url.js\";\n\nexport interface CloudLoginResult {\n apiKey: string;\n keyPrefix: string;\n expiresAt: string | null;\n}\n\nexport interface CloudLoginOptions {\n baseUrl?: string;\n timeoutMs?: number;\n requestTimeoutMs?: number;\n pollIntervalMs?: number;\n onBrowserUrl?: (url: string) => void;\n onPollStatus?: (status: string) => void;\n}\n\nconst DEFAULT_CLOUD_REQUEST_TIMEOUT_MS = 10_000;\n\nfunction isRedirectResponse(response: Response): boolean {\n return response.status >= 300 && response.status < 400;\n}\n\nfunction isTimeoutError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n if (err.name === \"TimeoutError\" || err.name === \"AbortError\") return true;\n const msg = err.message.toLowerCase();\n return msg.includes(\"timed out\") || msg.includes(\"timeout\");\n}\n\nasync function fetchWithTimeout(\n input: string,\n init: RequestInit,\n timeoutMs: number,\n): Promise<Response> {\n return fetch(input, {\n ...init,\n redirect: \"manual\",\n signal: AbortSignal.timeout(timeoutMs),\n });\n}\n\nexport async function cloudLogin(\n options: CloudLoginOptions = {},\n): Promise<CloudLoginResult> {\n const baseUrl = normalizeCloudSiteUrl(options.baseUrl);\n const urlError = await validateCloudBaseUrl(baseUrl);\n if (urlError) {\n throw new Error(urlError);\n }\n const timeoutMs = options.timeoutMs ?? 300_000;\n const requestTimeoutMs =\n options.requestTimeoutMs ?? DEFAULT_CLOUD_REQUEST_TIMEOUT_MS;\n const pollIntervalMs = options.pollIntervalMs ?? 2_000;\n const sessionId = crypto.randomUUID();\n\n logger.info(\"[cloud-auth] Creating auth session...\");\n\n let createResponse: Response;\n try {\n createResponse = await fetchWithTimeout(\n `${baseUrl}/api/auth/cli-session`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ sessionId }),\n },\n requestTimeoutMs,\n );\n } catch (err) {\n if (isTimeoutError(err)) {\n throw new Error(\n `Cloud login request timed out while creating session (>${requestTimeoutMs}ms).`,\n );\n }\n throw new Error(`Failed to create auth session: ${String(err)}`);\n }\n\n if (!createResponse.ok) {\n if (isRedirectResponse(createResponse)) {\n throw new Error(\n \"Cloud login request was redirected; redirects are not allowed.\",\n );\n }\n const errorText = await createResponse.text();\n throw new Error(\n `Failed to create auth session (HTTP ${createResponse.status}): ${errorText}`,\n );\n }\n\n const browserUrl = `${baseUrl}/auth/cli-login?session=${encodeURIComponent(sessionId)}`;\n logger.info(`[cloud-auth] Browser URL: ${browserUrl}`);\n options.onBrowserUrl?.(browserUrl);\n\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n const remainingBeforeSleep = deadline - Date.now();\n if (remainingBeforeSleep <= 0) break;\n await new Promise((resolve) =>\n setTimeout(resolve, Math.min(pollIntervalMs, remainingBeforeSleep)),\n );\n\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n\n let pollResponse: Response;\n try {\n pollResponse = await fetchWithTimeout(\n `${baseUrl}/api/auth/cli-session/${encodeURIComponent(sessionId)}`,\n {},\n Math.min(requestTimeoutMs, remaining),\n );\n } catch (err) {\n if (isTimeoutError(err)) {\n if (remaining <= requestTimeoutMs) {\n break;\n }\n throw new Error(\n `Cloud login polling request timed out (>${Math.min(requestTimeoutMs, remaining)}ms).`,\n );\n }\n throw new Error(`Cloud login polling failed: ${String(err)}`);\n }\n\n if (!pollResponse.ok) {\n if (isRedirectResponse(pollResponse)) {\n throw new Error(\n \"Cloud login polling request was redirected; redirects are not allowed.\",\n );\n }\n if (pollResponse.status === 404) {\n throw new Error(\"Auth session expired or not found. Please try again.\");\n }\n options.onPollStatus?.(\"error\");\n continue;\n }\n\n const data = (await pollResponse.json()) as {\n status: string;\n apiKey?: string;\n keyPrefix?: string;\n expiresAt?: string;\n };\n\n options.onPollStatus?.(data.status);\n\n if (data.status === \"authenticated\" && data.apiKey) {\n logger.info(\"[cloud-auth] Authentication complete\");\n return {\n apiKey: data.apiKey,\n keyPrefix: data.keyPrefix ?? \"\",\n expiresAt: data.expiresAt ?? null,\n };\n }\n\n if (data.status === \"authenticated\" && !data.apiKey) {\n throw new Error(\n \"Auth session was completed but the API key was already retrieved. Please try logging in again.\",\n );\n }\n }\n\n throw new Error(\n `Cloud login timed out. The browser login was not completed within ${Math.round(timeoutMs / 1000)} seconds.`,\n );\n}\n",
|
|
9
|
+
"/**\n * HTTP client for the Eliza Cloud Eliza Sandbox API.\n */\nimport { normalizeCloudSiteUrl } from \"./base-url.js\";\n\nexport type CloudChainType = \"evm\" | \"solana\";\nexport type CloudWalletProvider = \"privy\" | \"steward\";\n\nexport interface CloudWalletDescriptor {\n agentWalletId: string;\n walletAddress: string;\n walletProvider: CloudWalletProvider;\n chainType: CloudChainType;\n balance?: string | number;\n}\n\ninterface CloudWalletAddresses {\n evm?: string | null;\n solana?: string | null;\n}\n\nexport interface SignedRpcEnvelope {\n clientAddress: string;\n payload: {\n method: string;\n params: unknown[];\n };\n nonce: string;\n timestamp: number;\n signature: string;\n correlationId?: string;\n}\n\nexport interface RpcResult {\n [key: string]: unknown;\n}\n\nexport class CloudBridgeError extends Error {\n constructor(\n message: string,\n public readonly status?: number,\n public readonly body?: string,\n ) {\n super(message);\n this.name = \"CloudBridgeError\";\n }\n}\n\nexport class SignatureInvalidError extends CloudBridgeError {\n constructor(message: string, body?: string) {\n super(message, 401, body);\n this.name = \"SignatureInvalidError\";\n }\n}\n\nexport class NonceReplayError extends CloudBridgeError {\n constructor(message: string, body?: string) {\n super(message, 409, body);\n this.name = \"NonceReplayError\";\n }\n}\n\nexport class SessionExpiredError extends CloudBridgeError {\n constructor(message: string, body?: string) {\n super(message, 410, body);\n this.name = \"SessionExpiredError\";\n }\n}\n\nexport class CloudUnavailableError extends CloudBridgeError {\n constructor(message: string, status: number, body?: string) {\n super(message, status, body);\n this.name = \"CloudUnavailableError\";\n }\n}\n\nexport interface CloudAgent {\n id: string;\n agentName: string;\n status: string;\n databaseStatus: string;\n bridgeUrl?: string;\n lastBackupAt?: string;\n lastHeartbeatAt?: string;\n errorMessage?: string;\n errorCount?: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CloudAgentCreateParams {\n agentName: string;\n agentConfig?: Record<string, unknown>;\n environmentVars?: Record<string, string>;\n}\n\nexport interface ProvisionInfo {\n id: string;\n agentName: string;\n status: string;\n bridgeUrl?: string;\n healthUrl?: string;\n}\n\nexport interface BackupInfo {\n id: string;\n snapshotType: string;\n sizeBytes: number | null;\n createdAt: string;\n}\n\nexport type ChatChannelType =\n | \"DM\"\n | \"GROUP\"\n | \"VOICE_DM\"\n | \"VOICE_GROUP\"\n | \"API\";\n\ninterface ApiResponse<T> {\n success: boolean;\n data?: T;\n error?: string;\n}\n\nfunction formatApiErrorBody(text: string): string | null {\n if (!text) return null;\n try {\n const parsed = JSON.parse(text) as {\n error?: unknown;\n details?: Array<{ message?: unknown }>;\n };\n const baseError =\n typeof parsed.error === \"string\" && parsed.error.trim().length > 0\n ? parsed.error.trim()\n : null;\n const details = Array.isArray(parsed.details)\n ? parsed.details\n .map((detail) =>\n typeof detail?.message === \"string\" ? detail.message.trim() : \"\",\n )\n .filter((message) => message.length > 0)\n : [];\n if (baseError && details.length > 0) {\n return `${baseError}: ${details.join(\"; \")}`;\n }\n if (baseError) return baseError;\n } catch {\n /* plain text */\n }\n\n return text.slice(0, 200) || null;\n}\n\nfunction isRedirectResponse(response: Response): boolean {\n return response.status >= 300 && response.status < 400;\n}\n\nfunction normalizeChainAddress(\n addresses: CloudWalletAddresses | null | undefined,\n chain: CloudChainType,\n): string | null {\n const value = addresses?.[chain];\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction looksLikeChainAddress(\n address: string,\n chain: CloudChainType,\n): boolean {\n if (chain === \"evm\") {\n return /^0x[a-fA-F0-9]{40}$/.test(address);\n }\n\n return /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(address);\n}\n\nfunction resolveRequestedWalletAddress(\n data: {\n walletAddress: string | null;\n walletAddresses?: CloudWalletAddresses | null;\n },\n chain: CloudChainType,\n): string | null {\n const explicit = normalizeChainAddress(data.walletAddresses, chain);\n if (explicit) return explicit;\n if (typeof data.walletAddress !== \"string\") return null;\n\n const trimmed = data.walletAddress.trim();\n if (!trimmed) return null;\n return looksLikeChainAddress(trimmed, chain) ? trimmed : null;\n}\n\nexport class ElizaCloudClient {\n private baseUrl: string;\n private apiKey: string;\n\n constructor(baseUrl: string, apiKey: string) {\n this.baseUrl = normalizeCloudSiteUrl(baseUrl);\n this.apiKey = apiKey;\n }\n\n async listAgents(): Promise<CloudAgent[]> {\n const res = await this.request<CloudAgent[]>(\"GET\", \"/api/v1/eliza/agents\");\n return res.data ?? [];\n }\n\n async createAgent(params: CloudAgentCreateParams): Promise<CloudAgent> {\n const res = await this.request<CloudAgent>(\n \"POST\",\n \"/api/v1/eliza/agents\",\n params,\n );\n if (!res.success || !res.data)\n throw new Error(res.error ?? \"Failed to create cloud agent\");\n return res.data;\n }\n\n async getAgent(agentId: string): Promise<CloudAgent> {\n const res = await this.request<CloudAgent>(\n \"GET\",\n `/api/v1/eliza/agents/${agentId}`,\n );\n if (!res.success || !res.data)\n throw new Error(res.error ?? \"Agent not found\");\n return res.data;\n }\n\n async deleteAgent(agentId: string): Promise<void> {\n const res = await this.request<void>(\n \"DELETE\",\n `/api/v1/eliza/agents/${agentId}`,\n );\n if (!res.success) throw new Error(res.error ?? \"Failed to delete agent\");\n }\n\n async provision(agentId: string): Promise<ProvisionInfo> {\n const res = await this.request<ProvisionInfo>(\n \"POST\",\n `/api/v1/eliza/agents/${agentId}/provision`,\n );\n if (!res.success || !res.data)\n throw new Error(res.error ?? \"Failed to provision sandbox\");\n return res.data;\n }\n\n async sendMessage(\n agentId: string,\n text: string,\n roomId = \"web-chat\",\n channelType: ChatChannelType = \"DM\",\n ): Promise<string> {\n const url = `${this.baseUrl}/api/v1/eliza/agents/${agentId}/bridge`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-Api-Key\": this.apiKey },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: crypto.randomUUID(),\n method: \"message.send\",\n params: { text, roomId, channelType },\n }),\n redirect: \"manual\",\n signal: AbortSignal.timeout(60_000),\n });\n\n if (isRedirectResponse(response)) {\n throw new Error(\n \"Bridge request was redirected; redirects are not allowed\",\n );\n }\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => \"\");\n throw new Error(\n `Bridge request failed: HTTP ${response.status} ${errorText.slice(0, 200)}`,\n );\n }\n\n const rpc = (await response.json()) as {\n result?: { text?: string };\n error?: { code: number; message: string };\n };\n\n if (rpc.error) throw new Error(rpc.error.message);\n return rpc.result?.text ?? \"(no response)\";\n }\n\n async *sendMessageStream(\n agentId: string,\n text: string,\n roomId = \"web-chat\",\n channelType: ChatChannelType = \"DM\",\n ): AsyncGenerator<{ type: string; data: Record<string, unknown> }> {\n const url = `${this.baseUrl}/api/v1/eliza/agents/${agentId}/stream`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-Api-Key\": this.apiKey },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: crypto.randomUUID(),\n method: \"message.send\",\n params: { text, roomId, channelType },\n }),\n redirect: \"manual\",\n });\n\n if (isRedirectResponse(response)) {\n throw new Error(\n \"Stream request was redirected; redirects are not allowed\",\n );\n }\n\n if (!response.ok || !response.body) {\n throw new Error(`Stream request failed: HTTP ${response.status}`);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const parts = buffer.split(\"\\n\\n\");\n buffer = parts.pop() ?? \"\";\n\n for (const part of parts) {\n if (!part.trim()) continue;\n let eventType = \"message\";\n let eventData = \"\";\n\n for (const line of part.split(\"\\n\")) {\n if (line.startsWith(\"event: \")) eventType = line.slice(7).trim();\n else if (line.startsWith(\"data: \"))\n eventData += (eventData ? \"\\n\" : \"\") + line.slice(6);\n }\n\n if (eventData) {\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(eventData) as Record<string, unknown>;\n } catch {\n continue;\n }\n yield { type: eventType, data };\n }\n }\n }\n }\n\n async snapshot(agentId: string): Promise<BackupInfo> {\n const res = await this.request<BackupInfo>(\n \"POST\",\n `/api/v1/eliza/agents/${agentId}/snapshot`,\n );\n if (!res.success || !res.data)\n throw new Error(res.error ?? \"Snapshot failed\");\n return res.data;\n }\n\n async listBackups(agentId: string): Promise<BackupInfo[]> {\n const res = await this.request<BackupInfo[]>(\n \"GET\",\n `/api/v1/eliza/agents/${agentId}/backups`,\n );\n return res.data ?? [];\n }\n\n async restore(agentId: string, backupId?: string): Promise<void> {\n const res = await this.request<void>(\n \"POST\",\n `/api/v1/eliza/agents/${agentId}/restore`,\n backupId ? { backupId } : {},\n );\n if (!res.success) throw new Error(res.error ?? \"Restore failed\");\n }\n\n async heartbeat(agentId: string): Promise<boolean> {\n const url = `${this.baseUrl}/api/v1/eliza/agents/${agentId}/bridge`;\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Api-Key\": this.apiKey,\n },\n body: JSON.stringify({ jsonrpc: \"2.0\", method: \"heartbeat\" }),\n redirect: \"manual\",\n signal: AbortSignal.timeout(10_000),\n });\n if (isRedirectResponse(response)) return false;\n return response.ok;\n } catch {\n return false;\n }\n }\n\n /**\n * Fetch the cloud-side wallet descriptor for an agent.\n * Uses the standard API-key auth (X-Api-Key).\n */\n async getAgentWallet(\n agentId: string,\n chain: CloudChainType,\n ): Promise<CloudWalletDescriptor> {\n const res = await this.request<{\n agentId?: string;\n walletAddress: string | null;\n walletAddresses?: CloudWalletAddresses | null;\n walletProvider: CloudWalletProvider | null;\n walletStatus?: string;\n balance?: string | number | null;\n chain?: string;\n }>(\n \"GET\",\n `/api/v1/eliza/agents/${encodeURIComponent(agentId)}/wallet?chain=${encodeURIComponent(chain)}`,\n );\n\n if (!res.success || !res.data) {\n throw new CloudBridgeError(res.error ?? \"Failed to fetch agent wallet\");\n }\n\n const data = res.data;\n const walletAddress = resolveRequestedWalletAddress(data, chain);\n if (!walletAddress || !data.walletProvider) {\n throw new CloudBridgeError(\n `Agent has no cloud ${chain} wallet provisioned`,\n );\n }\n\n return {\n agentWalletId: data.agentId ?? agentId,\n walletAddress,\n walletProvider: data.walletProvider,\n chainType: chain,\n balance: data.balance ?? undefined,\n };\n }\n\n /**\n * Provision a cloud-custodied server wallet tied to a local client address.\n * Idempotent server-side: returns the existing wallet if one already exists\n * for the (user, clientAddress, chain) tuple.\n */\n async provisionWallet(input: {\n chainType: CloudChainType;\n clientAddress: string;\n }): Promise<{\n walletId: string;\n address: string;\n chainType: CloudChainType;\n provider: CloudWalletProvider;\n }> {\n const res = await this.request<{\n id: string;\n address: string;\n chainType: CloudChainType;\n clientAddress: string;\n provider?: CloudWalletProvider;\n }>(\"POST\", \"/api/v1/user/wallets/provision\", input);\n\n if (!res.success || !res.data) {\n throw new CloudBridgeError(res.error ?? \"Failed to provision wallet\");\n }\n\n return {\n walletId: res.data.id,\n address: res.data.address,\n chainType: res.data.chainType,\n provider: res.data.provider ?? \"privy\",\n };\n }\n\n /**\n * Execute a signed RPC envelope through the cloud custodial signer.\n *\n * Auth: body-embedded wallet signature — we MUST NOT send X-Api-Key/Bearer\n * headers here. The cloud verifies the signature against the\n * agentServerWallets.client_address registered at provision time.\n *\n * Error mapping:\n * 401 → SignatureInvalidError\n * 409 → NonceReplayError\n * 410 → SessionExpiredError\n * 5xx → CloudUnavailableError\n */\n async executeRpc(envelope: SignedRpcEnvelope): Promise<RpcResult> {\n const { correlationId, ...body } = envelope;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (correlationId) {\n headers[\"X-Correlation-Id\"] = correlationId;\n }\n\n let response: Response;\n try {\n response = await fetch(`${this.baseUrl}/api/v1/user/wallets/rpc`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n redirect: \"manual\",\n signal: AbortSignal.timeout(60_000),\n });\n } catch (err) {\n throw new CloudUnavailableError(\n `Cloud RPC network error: ${(err as Error).message}`,\n 0,\n );\n }\n\n if (isRedirectResponse(response)) {\n throw new CloudBridgeError(\n \"Cloud RPC request was redirected; redirects are not allowed\",\n response.status,\n );\n }\n\n const text = await response.text().catch(() => \"\");\n\n if (response.ok) {\n try {\n const parsed = JSON.parse(text) as ApiResponse<RpcResult>;\n if (!parsed.success || parsed.data === undefined) {\n throw new CloudBridgeError(\n parsed.error ?? \"Cloud RPC returned no data\",\n response.status,\n text,\n );\n }\n return parsed.data;\n } catch (err) {\n if (err instanceof CloudBridgeError) throw err;\n throw new CloudBridgeError(\n `Cloud RPC returned malformed JSON: ${(err as Error).message}`,\n response.status,\n text,\n );\n }\n }\n\n let errMessage = `HTTP ${response.status}`;\n try {\n const parsed = JSON.parse(text) as { error?: string };\n if (parsed.error) errMessage = parsed.error;\n } catch {\n if (text) errMessage = text.slice(0, 200);\n }\n\n if (response.status === 401) {\n throw new SignatureInvalidError(errMessage, text);\n }\n if (response.status === 409) {\n throw new NonceReplayError(errMessage, text);\n }\n if (response.status === 410) {\n throw new SessionExpiredError(errMessage, text);\n }\n if (response.status >= 500) {\n throw new CloudUnavailableError(errMessage, response.status, text);\n }\n throw new CloudBridgeError(errMessage, response.status, text);\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n ): Promise<ApiResponse<T>> {\n const headers: Record<string, string> = { \"X-Api-Key\": this.apiKey };\n if (body !== undefined) headers[\"Content-Type\"] = \"application/json\";\n\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n redirect: \"manual\",\n signal: AbortSignal.timeout(30_000),\n });\n\n if (isRedirectResponse(response)) {\n return {\n success: false,\n error: \"Cloud API request was redirected; redirects are not allowed\",\n };\n }\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n return {\n success: false,\n error: formatApiErrorBody(text) ?? `HTTP ${response.status}`,\n };\n }\n\n return (await response.json()) as ApiResponse<T>;\n }\n}\n",
|
|
10
|
+
"/**\n * Periodic state backup scheduler for cloud sandboxes.\n * Default interval: 60s. Configurable via cloud.backup.autoBackupIntervalMs.\n */\n\nimport { logger } from \"@elizaos/core\";\nimport type { ElizaCloudClient } from \"./bridge-client.js\";\n\nexport class BackupScheduler {\n private timer: ReturnType<typeof setInterval> | null = null;\n private running = false;\n\n constructor(\n private client: ElizaCloudClient,\n private agentId: string,\n private intervalMs: number = 60_000,\n ) {}\n\n start(): void {\n if (this.timer) return;\n this.running = true;\n this.timer = setInterval(() => {\n this.client.snapshot(this.agentId).catch((err) => {\n logger.warn(`[cloud-backup] Auto-backup failed: ${String(err)}`);\n });\n }, this.intervalMs);\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n this.running = false;\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n async finalSnapshot(): Promise<void> {\n await this.client.snapshot(this.agentId).catch((err) => {\n logger.warn(`[cloud-backup] Final snapshot failed: ${String(err)}`);\n });\n }\n}\n",
|
|
11
|
+
"/**\n * Drop-in replacement for a local AgentRuntime when running in cloud mode.\n * Routes chat/status calls through the ElizaCloudClient to the remote sandbox.\n */\n\nimport type { ChatChannelType, ElizaCloudClient } from \"./bridge-client.js\";\n\nexport class CloudRuntimeProxy {\n constructor(\n private client: ElizaCloudClient,\n private agentId: string,\n private _agentName: string,\n ) {}\n\n get agentName(): string {\n return this._agentName;\n }\n\n async handleChatMessage(\n text: string,\n roomId = \"web-chat\",\n channelType: ChatChannelType = \"DM\",\n ): Promise<string> {\n return this.client.sendMessage(this.agentId, text, roomId, channelType);\n }\n\n async *handleChatMessageStream(\n text: string,\n roomId = \"web-chat\",\n channelType: ChatChannelType = \"DM\",\n ): AsyncGenerator<string> {\n for await (const event of this.client.sendMessageStream(\n this.agentId,\n text,\n roomId,\n channelType,\n )) {\n if (event.type === \"chunk\" && typeof event.data.text === \"string\") {\n yield event.data.text;\n }\n }\n }\n\n async getStatus(): Promise<{ state: string; agentName: string }> {\n const agent = await this.client.getAgent(this.agentId);\n return { state: agent.status, agentName: agent.agentName };\n }\n\n async isAlive(): Promise<boolean> {\n return this.client.heartbeat(this.agentId).catch(() => false);\n }\n}\n",
|
|
12
|
+
"/**\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",
|
|
13
|
+
"/**\n * Top-level orchestrator for cloud integration.\n * Manages client, proxy, backup scheduler, and connection monitor lifecycle.\n */\n\nimport { logger } from \"@elizaos/core\";\nimport type { CloudConfig } from \"../lib/config-like.js\";\nimport { BackupScheduler } from \"./backup.js\";\nimport { normalizeCloudSiteUrl } from \"./base-url.js\";\nimport { ElizaCloudClient } from \"./bridge-client.js\";\nimport { CloudRuntimeProxy } from \"./cloud-proxy.js\";\nimport { ConnectionMonitor } from \"./reconnect.js\";\nimport { validateCloudBaseUrl } from \"./validate-url.js\";\n\nexport type CloudConnectionStatus =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"reconnecting\"\n | \"error\";\n\nexport interface CloudManagerCallbacks {\n onStatusChange?: (status: CloudConnectionStatus) => void;\n}\n\nexport class CloudManager {\n private client: ElizaCloudClient | null = null;\n private proxy: CloudRuntimeProxy | null = null;\n private backupScheduler: BackupScheduler | null = null;\n private connectionMonitor: ConnectionMonitor | null = null;\n private status: CloudConnectionStatus = \"disconnected\";\n private activeAgentId: string | null = null;\n\n constructor(\n private cloudConfig: CloudConfig,\n private callbacks: CloudManagerCallbacks = {},\n ) {}\n\n async init(): Promise<void> {\n const rawUrl = normalizeCloudSiteUrl(this.cloudConfig.baseUrl);\n const apiKey = this.cloudConfig.apiKey;\n if (!apiKey)\n throw new Error(\n \"Cloud API key is not configured. Run cloud login first.\",\n );\n\n const urlError = await validateCloudBaseUrl(rawUrl);\n if (urlError) {\n throw new Error(urlError);\n }\n\n // rawUrl is already normalized above — don't re-normalize, which would\n // re-read ELIZAOS_CLOUD_BASE_URL and could produce a different URL than\n // the one we just validated.\n this.client = new ElizaCloudClient(rawUrl, apiKey);\n logger.info(`[cloud-manager] Client initialised (baseUrl=${rawUrl})`);\n }\n\n async connect(agentId: string): Promise<CloudRuntimeProxy> {\n if (!this.client) await this.init();\n if (!this.client) throw new Error(\"Cloud client failed to initialise\");\n\n this.setStatus(\"connecting\");\n this.activeAgentId = agentId;\n\n try {\n await this.client.provision(agentId);\n const agent = await this.client.getAgent(agentId);\n\n this.proxy = new CloudRuntimeProxy(this.client, agentId, agent.agentName);\n\n this.backupScheduler = new BackupScheduler(\n this.client,\n agentId,\n this.cloudConfig.backup?.autoBackupIntervalMs ?? 60_000,\n );\n this.backupScheduler.start();\n\n this.connectionMonitor = new ConnectionMonitor(\n this.client,\n agentId,\n {\n onDisconnect: () => this.setStatus(\"reconnecting\"),\n onReconnect: () => this.setStatus(\"connected\"),\n onStatusChange: (s) => {\n if (s === \"connected\") this.setStatus(\"connected\");\n else if (s === \"reconnecting\") this.setStatus(\"reconnecting\");\n else this.setStatus(\"error\");\n },\n },\n this.cloudConfig.bridge?.heartbeatIntervalMs ?? 30_000,\n );\n this.connectionMonitor.start();\n\n this.setStatus(\"connected\");\n logger.info(\n `[cloud-manager] Connected to cloud agent (agentId=${agentId}, agentName=${agent.agentName})`,\n );\n return this.proxy;\n } catch (err) {\n this.setStatus(\"error\");\n if (this.backupScheduler) {\n this.backupScheduler.stop();\n this.backupScheduler = null;\n }\n if (this.connectionMonitor) {\n this.connectionMonitor.stop();\n this.connectionMonitor = null;\n }\n this.proxy = null;\n this.activeAgentId = null;\n this.setStatus(\"disconnected\");\n throw err;\n }\n }\n\n async disconnect(): Promise<void> {\n if (this.backupScheduler) {\n await this.backupScheduler.finalSnapshot();\n this.backupScheduler.stop();\n this.backupScheduler = null;\n }\n if (this.connectionMonitor) {\n this.connectionMonitor.stop();\n this.connectionMonitor = null;\n }\n this.proxy = null;\n this.activeAgentId = null;\n this.setStatus(\"disconnected\");\n }\n\n async replaceApiKey(apiKey: string): Promise<void> {\n await this.disconnect();\n this.cloudConfig = {\n ...this.cloudConfig,\n apiKey,\n };\n this.client = null;\n await this.init();\n }\n\n getProxy(): CloudRuntimeProxy | null {\n return this.proxy;\n }\n getClient(): ElizaCloudClient | null {\n return this.client;\n }\n getActiveAgentId(): string | null {\n return this.activeAgentId;\n }\n getStatus(): CloudConnectionStatus {\n return this.status;\n }\n isEnabled(): boolean {\n return Boolean(this.cloudConfig.enabled && this.cloudConfig.apiKey);\n }\n\n private setStatus(status: CloudConnectionStatus): void {\n if (this.status === status) return;\n this.status = status;\n this.callbacks.onStatusChange?.(status);\n }\n}\n",
|
|
14
|
+
"/**\n * x402 (HTTP 402 Payment Required) handler for Eliza Cloud relays.\n *\n * Spec reference: https://www.x402.org\n *\n * When the user's Cloud credit balance can't cover a metered call, the\n * Cloud relay returns HTTP 402 with a `payment-requirements` envelope —\n * either as a `WWW-Authenticate: x402 <json>` header or as a JSON body\n * with a top-level `paymentRequirements` array. Each requirement\n * describes one acceptable payment option (asset, network, recipient,\n * amount).\n *\n * This module is intentionally thin:\n * - `parseX402Response` extracts requirements from a Response.\n * - `PaymentRequiredError` carries them up to the action layer.\n * - `requestPayment` is the agent-side bridge: today it surfaces the\n * requirement back to the owner via the runtime logger so the UI /\n * planner can route the user to the existing wallet top-up flow.\n * Auto-pay intentionally lives outside this bridge — the actual money\n * movement is Cloud-side and gated by the wallet UI (commandment 4).\n *\n * No silent failures: a malformed 402 throws so the action layer can\n * surface a clear \"payment-required\" message rather than treating the\n * upstream as a generic HTTP error.\n */\n\nimport { type IAgentRuntime, logger } from \"@elizaos/core\";\n\n/**\n * One acceptable payment option as advertised by the server.\n *\n * Fields mirror the x402 spec's `paymentRequirements` entry. We type\n * everything as required so silent partial parses are impossible — the\n * parser either yields a complete requirement or rejects it.\n */\nexport interface X402PaymentRequirement {\n /** Decimal amount in the asset's smallest unit (e.g. \"1500000\" for\n * 1.50 USDC). String, not number, to preserve precision. */\n readonly amount: string;\n /** Asset symbol or ERC-20 contract address (e.g. \"USDC\"). */\n readonly asset: string;\n /** Network identifier (e.g. \"base\", \"ethereum\", \"solana\"). */\n readonly network: string;\n /** Recipient address that should receive the payment. */\n readonly payTo: string;\n /** Payment scheme — currently x402 supports \"exact\" only. */\n readonly scheme: string;\n /** ISO-8601 deadline after which the requirement is no longer valid. */\n readonly expiresAt: string | null;\n /** Human-readable description of the resource being purchased. */\n readonly description: string | null;\n}\n\n/**\n * Wire shape we accept from JSON bodies. Loose at the boundary, strict\n * after parsing.\n */\ninterface RawRequirement {\n readonly amount?: unknown;\n readonly asset?: unknown;\n readonly network?: unknown;\n readonly payTo?: unknown;\n readonly scheme?: unknown;\n readonly expiresAt?: unknown;\n readonly description?: unknown;\n}\n\ninterface RawX402Body {\n readonly paymentRequirements?: ReadonlyArray<RawRequirement>;\n readonly accepts?: ReadonlyArray<RawRequirement>;\n}\n\nfunction readString(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction readAmount(value: unknown): string | null {\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n return null;\n}\n\nfunction normalizeRequirement(\n raw: RawRequirement | null | undefined,\n): X402PaymentRequirement | null {\n if (!raw || typeof raw !== \"object\") return null;\n const amount = readAmount(raw.amount);\n const asset = readString(raw.asset);\n const network = readString(raw.network);\n const payTo = readString(raw.payTo);\n if (!amount || !asset || !network || !payTo) return null;\n const scheme = readString(raw.scheme) ?? \"exact\";\n return {\n amount,\n asset,\n network,\n payTo,\n scheme,\n expiresAt: readString(raw.expiresAt),\n description: readString(raw.description),\n };\n}\n\nfunction parseRequirementsArray(\n raw: ReadonlyArray<RawRequirement> | undefined,\n): X402PaymentRequirement[] {\n if (!Array.isArray(raw)) return [];\n const out: X402PaymentRequirement[] = [];\n for (const entry of raw) {\n const normalized = normalizeRequirement(entry);\n if (normalized) out.push(normalized);\n }\n return out;\n}\n\n/**\n * Pull payment requirements out of an x402 response. Tries the header\n * form first (lowest-overhead per spec), then falls back to the JSON\n * body. Returns `null` when the response carries no parseable\n * requirements — callers should treat that as a generic 402 and\n * surface the upstream status text.\n */\nexport async function parseX402Response(\n response: Response,\n): Promise<X402PaymentRequirement[] | null> {\n const headerValue = response.headers.get(\"www-authenticate\");\n if (headerValue?.toLowerCase().startsWith(\"x402\")) {\n const jsonPart = headerValue.slice(4).trim();\n if (jsonPart.length > 0) {\n const parsed = JSON.parse(jsonPart) as RawX402Body | RawRequirement[];\n const requirements = Array.isArray(parsed)\n ? parseRequirementsArray(parsed)\n : parseRequirementsArray(parsed.paymentRequirements ?? parsed.accepts);\n if (requirements.length > 0) return requirements;\n }\n }\n // Fall back to body parse. Clone so the caller can still read it.\n const cloned = response.clone();\n const text = await cloned.text();\n if (text.length === 0) return null;\n const body = JSON.parse(text) as RawX402Body;\n const requirements = parseRequirementsArray(\n body.paymentRequirements ?? body.accepts,\n );\n return requirements.length > 0 ? requirements : null;\n}\n\n/**\n * Thrown by adapters when an upstream metered call returns 402 with\n * actionable payment requirements. Action handlers convert this into an\n * approval-queue entry so the user sees both the cost and the\n * top-up prompt together.\n */\nexport class PaymentRequiredError extends Error {\n readonly code = \"PAYMENT_REQUIRED\" as const;\n readonly requirements: ReadonlyArray<X402PaymentRequirement>;\n\n constructor(\n requirements: ReadonlyArray<X402PaymentRequirement>,\n message?: string,\n ) {\n const text =\n message ??\n `Eliza Cloud returned HTTP 402 — your credit balance can't cover this call. ${requirements.length} payment option(s) available.`;\n super(text);\n this.name = \"PaymentRequiredError\";\n this.requirements = requirements;\n }\n}\n\nexport interface PaymentReceipt {\n readonly status: \"surfaced\" | \"paid\";\n readonly requirement: X402PaymentRequirement;\n /** Transaction id when status === \"paid\", null when only surfaced. */\n readonly txId: string | null;\n}\n\n/**\n * Bridge from a raw payment requirement to user action. For now this\n * does not auto-pay: the actual money movement happens in the existing\n * wallet UI (Cloud-side). We log the requirement so the agent's\n * messaging surface and the desktop dev console both pick it up, then\n * return a \"surfaced\" receipt for the action layer to forward into the\n * approval queue.\n */\nexport async function requestPayment(\n runtime: IAgentRuntime,\n requirements: ReadonlyArray<X402PaymentRequirement>,\n): Promise<PaymentReceipt> {\n if (requirements.length === 0) {\n throw new Error(\n \"[x402] requestPayment called with no requirements — adapter bug\",\n );\n }\n const preferred = requirements[0];\n logger.warn(\n {\n boundary: \"elizacloud\",\n integration: \"x402\",\n asset: preferred.asset,\n network: preferred.network,\n amount: preferred.amount,\n runtimeId: runtime.agentId,\n },\n `[x402] payment-required: ${preferred.amount} ${preferred.asset} on ${preferred.network} → ${preferred.payTo}${preferred.description ? ` (${preferred.description})` : \"\"}`,\n );\n return { status: \"surfaced\", requirement: preferred, txId: null };\n}\n",
|
|
15
|
+
"import { logger } from \"@elizaos/core\";\nimport {\n PaymentRequiredError,\n parseX402Response,\n} from \"./x402-payment-handler.js\";\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport class DuffelConfigError extends Error {\n readonly code = \"DUFFEL_NOT_CONFIGURED\" as const;\n constructor(message: string) {\n super(message);\n this.name = \"DuffelConfigError\";\n }\n}\n\n/** Direct mode hits api.duffel.com with the user's own DUFFEL_API_KEY.\n * Cloud mode hits the local Eliza Cloud relay which performs the upstream\n * Duffel call, applies creator markup, and meters against the user's\n * Cloud credit balance. Cloud mode is the default. */\nexport type DuffelMode = \"cloud\" | \"direct\";\n\nexport interface DuffelConfig {\n mode: DuffelMode;\n /** Required when mode === \"direct\". */\n apiKey: string | null;\n /** Required when mode === \"cloud\". Local Eliza agent API base, e.g.\n * http://127.0.0.1:31337. The relay path is appended internally. */\n cloudRelayBaseUrl: string | null;\n}\n\nconst DUFFEL_API_BASE_DEFAULT = \"https://api.duffel.com\";\nconst DUFFEL_API_VERSION = \"v2\";\nconst DEFAULT_CLOUD_RELAY_BASE = \"http://127.0.0.1:31337\";\n\ninterface DuffelTelemetrySpan {\n success(meta?: Record<string, unknown>): void;\n failure(meta?: Record<string, unknown>): void;\n}\n\nconst NOOP_DUFFEL_SPAN: DuffelTelemetrySpan = {\n success() {},\n failure() {},\n};\n\n/** Honour the mockoon redirect (or any explicit `LIFEOPS_DUFFEL_API_BASE`\n * override) so direct-mode tests can swap Duffel for a local mock. */\nfunction getDuffelApiBase(): string {\n return process.env.LIFEOPS_DUFFEL_API_BASE?.trim() || DUFFEL_API_BASE_DEFAULT;\n}\n\nfunction resolveDirectFlag(env: NodeJS.ProcessEnv): boolean {\n const value = env.ELIZA_DUFFEL_DIRECT?.trim().toLowerCase();\n return value === \"1\" || value === \"true\";\n}\n\nfunction resolveLocalApiBase(env: NodeJS.ProcessEnv): string {\n const port = env.ELIZA_API_PORT?.trim();\n if (port && /^\\d+$/.test(port)) {\n return `http://127.0.0.1:${port}`;\n }\n return DEFAULT_CLOUD_RELAY_BASE;\n}\n\nexport function readDuffelConfigFromEnv(\n env: NodeJS.ProcessEnv = process.env,\n): DuffelConfig {\n if (resolveDirectFlag(env)) {\n const apiKey = env.DUFFEL_API_KEY?.trim();\n if (!apiKey) {\n throw new DuffelConfigError(\n \"Duffel direct mode requested but DUFFEL_API_KEY is not set.\",\n );\n }\n return { mode: \"direct\", apiKey, cloudRelayBaseUrl: null };\n }\n\n return {\n mode: \"cloud\",\n apiKey: null,\n cloudRelayBaseUrl: resolveLocalApiBase(env),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Input types\n// ---------------------------------------------------------------------------\n\nexport interface SearchFlightsRequest {\n /** IATA airport code for origin, e.g. \"JFK\". */\n origin: string;\n /** IATA airport code for destination, e.g. \"LHR\". */\n destination: string;\n /** ISO 8601 date string (YYYY-MM-DD). */\n departureDate: string;\n /**\n * ISO 8601 date string for return leg.\n * Omit or pass undefined for one-way search.\n */\n returnDate?: string;\n /** Number of adult passengers (default 1). */\n passengers?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Response types\n// ---------------------------------------------------------------------------\n\nexport interface DuffelSegment {\n origin: string;\n destination: string;\n departingAt: string;\n arrivingAt: string;\n carrierIataCode: string;\n flightNumber: string;\n duration: string;\n}\n\nexport interface DuffelSlice {\n origin: string;\n destination: string;\n duration: string;\n segments: DuffelSegment[];\n}\n\nexport interface DuffelOfferPassenger {\n id: string;\n type: string;\n givenName: string | null;\n familyName: string | null;\n}\n\nexport interface DuffelPaymentRequirements {\n requiresInstantPayment: boolean;\n priceGuaranteeExpiresAt: string | null;\n paymentRequiredBy: string | null;\n}\n\nexport interface DuffelOffer {\n id: string;\n totalAmount: string;\n totalCurrency: string;\n passengerCount: number;\n slices: DuffelSlice[];\n expiresAt: string | null;\n /** Raw cabin class reported by Duffel for the first slice. */\n cabinClass: string | null;\n passengers: DuffelOfferPassenger[];\n paymentRequirements: DuffelPaymentRequirements | null;\n}\n\n/**\n * Cost envelope returned by the cloud relay. The breakdown is computed\n * server-side (commandment 2 — no client-side math) and the local code\n * forwards it to the UI for display. In direct mode all values are zero\n * because no markup is charged.\n *\n * `markupPercent` is a *display-only* derived field: it equals\n * `platformFeeUsd / totalUsd`, computed once at the boundary so UI\n * components don't repeat the division. The pricing decision itself is\n * still Cloud-side — this is the same pattern as a \"discount %\" badge\n * derived from a server-supplied price.\n */\nexport interface DuffelCallCost {\n /** Net cost charged to the user's Cloud credit balance, in USD. */\n totalUsd: number;\n /** Portion that flows to the creator as markup, in USD. */\n creatorMarkupUsd: number;\n /** Eliza Cloud platform fee portion, in USD. */\n platformFeeUsd: number;\n /** Display-only ratio of platform fee to total (e.g. 0.2 for 20%).\n * Derived from server values, never used for pricing. Null when\n * totalUsd is zero (direct mode or free call). */\n markupPercent: number | null;\n /** Whether the call was metered (true in cloud mode, false in direct mode). */\n metered: boolean;\n}\n\nconst DIRECT_MODE_COST: DuffelCallCost = {\n totalUsd: 0,\n creatorMarkupUsd: 0,\n platformFeeUsd: 0,\n markupPercent: null,\n metered: false,\n};\n\nexport interface SearchFlightsResult {\n offerRequestId: string;\n offers: DuffelOffer[];\n cost: DuffelCallCost;\n}\n\nexport interface DuffelOrderPassenger {\n id: string;\n givenName: string | null;\n familyName: string | null;\n}\n\nexport interface DuffelOrderPaymentStatus {\n awaitingPayment: boolean;\n paymentRequiredBy: string | null;\n priceGuaranteeExpiresAt: string | null;\n}\n\nexport interface DuffelOrderDocument {\n type: string | null;\n uniqueIdentifier: string | null;\n}\n\nexport interface DuffelOrder {\n id: string;\n bookingReference: string | null;\n totalAmount: string;\n totalCurrency: string;\n slices: DuffelSlice[];\n passengers: DuffelOrderPassenger[];\n paymentStatus: DuffelOrderPaymentStatus | null;\n documents: DuffelOrderDocument[];\n}\n\nexport interface DuffelPayment {\n id: string;\n orderId: string;\n status: string;\n currency: string;\n amount: string;\n type: string;\n failureReason: string | null;\n createdAt: string | null;\n}\n\nexport interface DuffelOrderPassengerInput {\n id: string;\n title?: string;\n gender?: string;\n givenName: string;\n familyName: string;\n bornOn: string;\n email?: string;\n phoneNumber?: string;\n}\n\nexport interface CreateDuffelOrderRequest {\n selectedOffers: ReadonlyArray<string>;\n passengers: ReadonlyArray<DuffelOrderPassengerInput>;\n type: \"hold\" | \"instant\";\n payment?: {\n type: \"balance\";\n amount: string;\n currency: string;\n };\n metadata?: Readonly<Record<string, string>>;\n}\n\n// ---------------------------------------------------------------------------\n// Internal Duffel API response shapes (minimal — only fields we use)\n// ---------------------------------------------------------------------------\n\ninterface DuffelApiOffer {\n id: string;\n total_amount: string;\n total_currency: string;\n expires_at: string | null;\n slices: Array<{\n origin: { iata_code: string };\n destination: { iata_code: string };\n duration: string;\n segments: Array<{\n origin: { iata_code: string };\n destination: { iata_code: string };\n departing_at: string;\n arriving_at: string;\n operating_carrier: { iata_code: string };\n flight_number: string | null;\n duration: string;\n }>;\n fare_brand_name: string | null;\n }>;\n passengers: Array<{\n id?: string;\n type?: string;\n given_name?: string | null;\n family_name?: string | null;\n }>;\n payment_requirements?: {\n requires_instant_payment?: boolean;\n price_guarantee_expires_at?: string | null;\n payment_required_by?: string | null;\n };\n}\n\ninterface DuffelOfferRequestResponse {\n data: {\n id: string;\n offers: DuffelApiOffer[];\n };\n}\n\ninterface DuffelOfferResponse {\n data: DuffelApiOffer;\n}\n\ninterface DuffelApiOrder {\n id: string;\n booking_reference?: string | null;\n total_amount: string;\n total_currency: string;\n slices: DuffelApiOffer[\"slices\"];\n passengers: Array<{\n id?: string;\n given_name?: string | null;\n family_name?: string | null;\n }>;\n payment_status?: {\n awaiting_payment?: boolean;\n payment_required_by?: string | null;\n price_guarantee_expires_at?: string | null;\n };\n documents?: Array<{\n type?: string | null;\n unique_identifier?: string | null;\n }>;\n}\n\ninterface DuffelOrderResponse {\n data: DuffelApiOrder;\n}\n\ninterface DuffelPaymentResponse {\n data: {\n id: string;\n order_id: string;\n status: string;\n currency: string;\n amount: string;\n type: string;\n failure_reason?: string | null;\n created_at?: string | null;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildHeaders(apiKey: string): Record<string, string> {\n return {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n \"Duffel-Version\": DUFFEL_API_VERSION,\n Accept: \"application/json\",\n };\n}\n\nfunction mapOffer(raw: DuffelApiOffer): DuffelOffer {\n const cabinClass = raw.slices[0]?.fare_brand_name ?? null;\n\n const slices: DuffelSlice[] = raw.slices.map((slice) => ({\n origin: slice.origin.iata_code,\n destination: slice.destination.iata_code,\n duration: slice.duration,\n segments: slice.segments.map((seg) => ({\n origin: seg.origin.iata_code,\n destination: seg.destination.iata_code,\n departingAt: seg.departing_at,\n arrivingAt: seg.arriving_at,\n carrierIataCode: seg.operating_carrier.iata_code,\n flightNumber: seg.flight_number ?? \"\",\n duration: seg.duration,\n })),\n }));\n const passengers: DuffelOfferPassenger[] = raw.passengers.map(\n (passenger, index) => ({\n id: passenger.id?.trim() || `passenger_${index}`,\n type: passenger.type?.trim() || \"adult\",\n givenName: passenger.given_name?.trim() || null,\n familyName: passenger.family_name?.trim() || null,\n }),\n );\n const paymentRequirements = raw.payment_requirements\n ? {\n requiresInstantPayment:\n raw.payment_requirements.requires_instant_payment !== false,\n priceGuaranteeExpiresAt:\n raw.payment_requirements.price_guarantee_expires_at ?? null,\n paymentRequiredBy: raw.payment_requirements.payment_required_by ?? null,\n }\n : null;\n\n return {\n id: raw.id,\n totalAmount: raw.total_amount,\n totalCurrency: raw.total_currency,\n passengerCount: passengers.length > 0 ? passengers.length : 1,\n slices,\n expiresAt: raw.expires_at,\n cabinClass,\n passengers,\n paymentRequirements,\n };\n}\n\nfunction mapOrder(raw: DuffelApiOrder): DuffelOrder {\n return {\n id: raw.id,\n bookingReference: raw.booking_reference ?? null,\n totalAmount: raw.total_amount,\n totalCurrency: raw.total_currency,\n slices: raw.slices.map((slice) => ({\n origin: slice.origin.iata_code,\n destination: slice.destination.iata_code,\n duration: slice.duration,\n segments: slice.segments.map((segment) => ({\n origin: segment.origin.iata_code,\n destination: segment.destination.iata_code,\n departingAt: segment.departing_at,\n arrivingAt: segment.arriving_at,\n carrierIataCode: segment.operating_carrier.iata_code,\n flightNumber: segment.flight_number ?? \"\",\n duration: segment.duration,\n })),\n })),\n passengers: raw.passengers.map((passenger, index) => ({\n id: passenger.id?.trim() || `passenger_${index}`,\n givenName: passenger.given_name?.trim() || null,\n familyName: passenger.family_name?.trim() || null,\n })),\n paymentStatus: raw.payment_status\n ? {\n awaitingPayment: raw.payment_status.awaiting_payment === true,\n paymentRequiredBy: raw.payment_status.payment_required_by ?? null,\n priceGuaranteeExpiresAt:\n raw.payment_status.price_guarantee_expires_at ?? null,\n }\n : null,\n documents: (raw.documents ?? []).map((document) => ({\n type: document.type ?? null,\n uniqueIdentifier: document.unique_identifier ?? null,\n })),\n };\n}\n\nfunction mapPayment(raw: DuffelPaymentResponse[\"data\"]): DuffelPayment {\n return {\n id: raw.id,\n orderId: raw.order_id,\n status: raw.status,\n currency: raw.currency,\n amount: raw.amount,\n type: raw.type,\n failureReason: raw.failure_reason ?? null,\n createdAt: raw.created_at ?? null,\n };\n}\n\n/**\n * Cost meta envelope returned by the Eliza Cloud relay alongside the\n * Duffel payload. Defined server-side; the client trusts whatever Cloud\n * returns and never recomputes (commandment 2).\n */\ninterface RelayCostMeta {\n total_usd?: number;\n creator_markup_usd?: number;\n platform_fee_usd?: number;\n}\n\ninterface RelayMeta {\n cost?: RelayCostMeta;\n}\n\ninterface RelayEnvelope {\n _meta?: RelayMeta;\n}\n\nfunction readRelayCost(envelope: unknown): DuffelCallCost {\n if (\n envelope === null ||\n typeof envelope !== \"object\" ||\n !(\"_meta\" in envelope)\n ) {\n throw new Error(\n \"Duffel cloud relay response missing _meta envelope. Update Eliza Cloud or set ELIZA_DUFFEL_DIRECT=1.\",\n );\n }\n const meta = (envelope as RelayEnvelope)._meta;\n const cost = meta?.cost;\n if (\n !cost ||\n typeof cost.total_usd !== \"number\" ||\n typeof cost.creator_markup_usd !== \"number\" ||\n typeof cost.platform_fee_usd !== \"number\"\n ) {\n throw new Error(\n \"Duffel cloud relay returned malformed _meta.cost. Refusing to proceed without billing receipt.\",\n );\n }\n const totalUsd = cost.total_usd;\n const platformFeeUsd = cost.platform_fee_usd;\n const markupPercent = totalUsd > 0 ? platformFeeUsd / totalUsd : null;\n return {\n totalUsd,\n creatorMarkupUsd: cost.creator_markup_usd,\n platformFeeUsd,\n markupPercent,\n metered: true,\n };\n}\n\ninterface DuffelFetchResult<T> {\n data: T;\n cost: DuffelCallCost;\n}\n\ninterface DuffelRequest {\n config: DuffelConfig;\n method: \"GET\" | \"POST\";\n /** Path on api.duffel.com (e.g. \"/air/offer_requests\"). */\n directPath: string;\n /** Path on the local cloud relay (e.g. \"/api/cloud/travel-providers/duffel/offer-requests\"). */\n cloudRelayPath: string;\n body?: unknown;\n operation: string;\n}\n\nasync function duffelFetch<T>(\n args: DuffelRequest,\n): Promise<DuffelFetchResult<T>> {\n const { config, method, directPath, cloudRelayPath, body, operation } = args;\n\n const isCloud = config.mode === \"cloud\";\n const url = isCloud\n ? `${config.cloudRelayBaseUrl ?? \"\"}${cloudRelayPath}`\n : `${getDuffelApiBase()}${directPath}`;\n\n const headers = isCloud\n ? { \"Content-Type\": \"application/json\", Accept: \"application/json\" }\n : buildHeaders(config.apiKey ?? \"\");\n\n const span = NOOP_DUFFEL_SPAN;\n\n let response: Response;\n try {\n response = await fetch(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(30_000),\n });\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n logger.error(\n {\n boundary: \"elizacloud\",\n integration: \"duffel\",\n operation,\n mode: config.mode,\n err: error instanceof Error ? error : undefined,\n },\n `[elizacloud-duffel] Duffel ${operation} network error: ${msg}`,\n );\n span.failure({ error, errorKind: \"network_error\" });\n throw new Error(`Duffel ${operation} failed: ${msg}`);\n }\n\n if (response.status === 402 && isCloud) {\n // x402 payment-required: surface as a typed PaymentRequiredError so\n // the action layer can route the user to the wallet top-up flow\n // rather than treating this as a generic HTTP failure. The Cloud\n // billing layer emits 402 only when the user's credit balance can't\n // cover the call — see docs/cloud-travel-billing.md.\n const requirements = await parseX402Response(response);\n logger.warn(\n {\n boundary: \"elizacloud\",\n integration: \"duffel\",\n operation,\n mode: config.mode,\n statusCode: 402,\n requirementCount: requirements?.length ?? 0,\n },\n `[elizacloud-duffel] Duffel ${operation} returned 402 payment-required`,\n );\n span.failure({ statusCode: 402, errorKind: \"payment_required\" });\n if (!requirements || requirements.length === 0) {\n throw new PaymentRequiredError(\n [],\n `Duffel ${operation} requires payment but the upstream did not advertise any payment options.`,\n );\n }\n throw new PaymentRequiredError(requirements);\n }\n\n if (!response.ok) {\n const errorBody = await response.text().catch(() => \"\");\n const errorMsg = errorBody || `HTTP ${response.status}`;\n logger.warn(\n {\n boundary: \"elizacloud\",\n integration: \"duffel\",\n operation,\n mode: config.mode,\n statusCode: response.status,\n },\n `[elizacloud-duffel] Duffel ${operation} HTTP error: ${errorMsg}`,\n );\n span.failure({ statusCode: response.status, errorKind: \"http_error\" });\n throw new Error(\n `Duffel ${operation} failed (${response.status}): ${errorMsg}`,\n );\n }\n\n const payload = (await response.json()) as T;\n span.success({ statusCode: response.status });\n\n const cost = isCloud ? readRelayCost(payload) : DIRECT_MODE_COST;\n return { data: payload, cost };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Search for available flight offers via the Duffel Offer Requests API.\n *\n * Throws `DuffelConfigError` when DUFFEL_API_KEY is absent.\n * One-way search when `returnDate` is omitted; return search when provided.\n *\n */\nexport async function searchFlights(\n request: SearchFlightsRequest,\n config?: DuffelConfig,\n): Promise<SearchFlightsResult> {\n const resolvedConfig = config ?? readDuffelConfigFromEnv();\n const passengerCount = Math.max(1, Math.round(request.passengers ?? 1));\n\n const slices: Array<{\n origin: string;\n destination: string;\n departure_date: string;\n }> = [\n {\n origin: request.origin.toUpperCase().trim(),\n destination: request.destination.toUpperCase().trim(),\n departure_date: request.departureDate,\n },\n ];\n if (request.returnDate) {\n slices.push({\n origin: request.destination.toUpperCase().trim(),\n destination: request.origin.toUpperCase().trim(),\n departure_date: request.returnDate,\n });\n }\n\n const requestBody = {\n data: {\n slices,\n passengers: Array.from({ length: passengerCount }, () => ({\n type: \"adult\",\n })),\n cabin_class: \"economy\",\n },\n };\n\n logger.info(\n {\n boundary: \"elizacloud\",\n integration: \"duffel\",\n origin: request.origin,\n destination: request.destination,\n },\n `[elizacloud-duffel] Searching flights ${request.origin} → ${request.destination} on ${request.departureDate}`,\n );\n\n const { data: responseData, cost } =\n await duffelFetch<DuffelOfferRequestResponse>({\n config: resolvedConfig,\n method: \"POST\",\n directPath: \"/air/offer_requests?return_offers=true\",\n cloudRelayPath: \"/api/cloud/travel-providers/duffel/offer-requests\",\n body: requestBody,\n operation: \"offer_request\",\n });\n\n const offers = responseData.data.offers.map(mapOffer);\n\n logger.info(\n {\n boundary: \"elizacloud\",\n integration: \"duffel\",\n offerRequestId: responseData.data.id,\n offerCount: offers.length,\n costUsd: cost.totalUsd,\n },\n `[elizacloud-duffel] Duffel returned ${offers.length} offers for request ${responseData.data.id}`,\n );\n\n return {\n offerRequestId: responseData.data.id,\n offers,\n cost,\n };\n}\n\n/**\n * Retrieve a single flight offer by ID.\n *\n * Use after `searchFlights` to get live pricing and full details for a\n * specific offer before presenting it to the user for approval.\n *\n */\nexport async function getOffer(\n id: string,\n config?: DuffelConfig,\n): Promise<DuffelOffer> {\n const resolvedConfig = config ?? readDuffelConfigFromEnv();\n\n if (!id || id.trim().length === 0) {\n throw new Error(\"Duffel getOffer: offer id is required\");\n }\n\n const { data: responseData } = await duffelFetch<DuffelOfferResponse>({\n config: resolvedConfig,\n method: \"GET\",\n directPath: `/air/offers/${encodeURIComponent(id.trim())}`,\n cloudRelayPath: `/api/cloud/travel-providers/duffel/offers/${encodeURIComponent(id.trim())}`,\n operation: \"offer_retrieve\",\n });\n\n return mapOffer(responseData.data);\n}\n\nexport async function createOrder(\n request: CreateDuffelOrderRequest,\n config?: DuffelConfig,\n): Promise<DuffelOrder> {\n const resolvedConfig = config ?? readDuffelConfigFromEnv();\n if (request.selectedOffers.length !== 1) {\n throw new Error(\n \"Duffel createOrder: exactly one selected offer is required\",\n );\n }\n if (request.passengers.length === 0) {\n throw new Error(\"Duffel createOrder: at least one passenger is required\");\n }\n\n const data: Record<string, unknown> = {\n type: request.type,\n selected_offers: [...request.selectedOffers],\n passengers: request.passengers.map((passenger) => ({\n id: passenger.id,\n title: passenger.title,\n gender: passenger.gender,\n given_name: passenger.givenName,\n family_name: passenger.familyName,\n born_on: passenger.bornOn,\n email: passenger.email,\n phone_number: passenger.phoneNumber,\n })),\n };\n if (request.payment) {\n data.payments = [\n {\n type: request.payment.type,\n amount: request.payment.amount,\n currency: request.payment.currency,\n },\n ];\n }\n if (request.metadata && Object.keys(request.metadata).length > 0) {\n data.metadata = request.metadata;\n }\n\n const { data: response } = await duffelFetch<DuffelOrderResponse>({\n config: resolvedConfig,\n method: \"POST\",\n directPath: \"/air/orders\",\n cloudRelayPath: \"/api/cloud/travel-providers/duffel/orders\",\n body: { data },\n operation: \"order_create\",\n });\n\n return mapOrder(response.data);\n}\n\nexport async function getOrder(\n orderId: string,\n config?: DuffelConfig,\n): Promise<DuffelOrder> {\n const resolvedConfig = config ?? readDuffelConfigFromEnv();\n if (!orderId || orderId.trim().length === 0) {\n throw new Error(\"Duffel getOrder: order id is required\");\n }\n\n const { data: response } = await duffelFetch<DuffelOrderResponse>({\n config: resolvedConfig,\n method: \"GET\",\n directPath: `/air/orders/${encodeURIComponent(orderId.trim())}`,\n cloudRelayPath: `/api/cloud/travel-providers/duffel/orders/${encodeURIComponent(orderId.trim())}`,\n operation: \"order_retrieve\",\n });\n\n return mapOrder(response.data);\n}\n\nexport async function createPayment(\n args: {\n orderId: string;\n amount: string;\n currency: string;\n },\n config?: DuffelConfig,\n): Promise<DuffelPayment> {\n const resolvedConfig = config ?? readDuffelConfigFromEnv();\n if (args.orderId.trim().length === 0) {\n throw new Error(\"Duffel createPayment: order id is required\");\n }\n if (args.amount.trim().length === 0) {\n throw new Error(\"Duffel createPayment: amount is required\");\n }\n if (args.currency.trim().length === 0) {\n throw new Error(\"Duffel createPayment: currency is required\");\n }\n\n const { data: response } = await duffelFetch<DuffelPaymentResponse>({\n config: resolvedConfig,\n method: \"POST\",\n directPath: \"/air/payments\",\n cloudRelayPath: \"/api/cloud/travel-providers/duffel/payments\",\n body: {\n data: {\n order_id: args.orderId.trim(),\n payment: {\n type: \"balance\",\n amount: args.amount.trim(),\n currency: args.currency.trim().toUpperCase(),\n },\n },\n },\n operation: \"payment_create\",\n });\n\n return mapPayment(response.data);\n}\n",
|
|
16
|
+
"import {\n normalizeCloudSiteUrl,\n resolveCloudApiBaseUrl,\n} from \"./base-url.js\";\nimport type {\n GetLifeOpsScheduleMergedStateResponse,\n SyncLifeOpsScheduleObservationsRequest,\n SyncLifeOpsScheduleObservationsResponse,\n} from \"./lifeops-schedule-sync-contracts.js\";\n\nconst LIFEOPS_SCHEDULE_REQUEST_TIMEOUT_MS = 20_000;\n\nexport class LifeOpsScheduleSyncClientError extends Error {\n constructor(\n public readonly status: number,\n message: string,\n ) {\n super(message);\n this.name = \"LifeOpsScheduleSyncClientError\";\n }\n}\n\nexport type ResolvedLifeOpsScheduleSyncConfig =\n | {\n configured: false;\n mode: \"none\";\n }\n | {\n configured: true;\n mode: \"remote\";\n baseUrl: string;\n accessToken: string | null;\n }\n | {\n configured: true;\n mode: \"cloud\";\n apiBaseUrl: string;\n apiKey: string;\n agentId: string;\n };\n\nexport interface LifeOpsScheduleSyncConfigInput {\n remoteApiBase?: string | null;\n remoteAccessToken?: string | null;\n apiKey?: string | null;\n baseUrl?: string | null;\n agentId?: string | null;\n}\n\nfunction normalizeOptionalString(value: string | null | undefined): string | null {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : null;\n}\n\nexport function normalizeLifeOpsScheduleSyncSecret(\n value: string | null | undefined,\n): string | null {\n const trimmed = normalizeOptionalString(value);\n if (!trimmed) {\n return null;\n }\n return trimmed.toUpperCase() === \"[REDACTED]\" ? null : trimmed;\n}\n\nexport function resolveLifeOpsScheduleSyncConfig(\n config: LifeOpsScheduleSyncConfigInput = {},\n): ResolvedLifeOpsScheduleSyncConfig {\n const remoteApiBase = normalizeOptionalString(config.remoteApiBase);\n if (remoteApiBase) {\n return {\n configured: true,\n mode: \"remote\",\n baseUrl: remoteApiBase.replace(/\\/+$/, \"\"),\n accessToken:\n normalizeLifeOpsScheduleSyncSecret(config.remoteAccessToken) ??\n normalizeLifeOpsScheduleSyncSecret(process.env.ELIZA_REMOTE_ACCESS_TOKEN),\n };\n }\n\n const apiKey =\n normalizeLifeOpsScheduleSyncSecret(config.apiKey) ??\n normalizeLifeOpsScheduleSyncSecret(process.env.ELIZAOS_CLOUD_API_KEY);\n const agentId =\n normalizeLifeOpsScheduleSyncSecret(config.agentId) ??\n normalizeLifeOpsScheduleSyncSecret(process.env.ELIZAOS_CLOUD_AGENT_ID);\n if (!apiKey || !agentId) {\n return {\n configured: false,\n mode: \"none\",\n };\n }\n\n return {\n configured: true,\n mode: \"cloud\",\n apiBaseUrl: resolveCloudApiBaseUrl(\n normalizeOptionalString(config.baseUrl) ?? process.env.ELIZAOS_CLOUD_BASE_URL,\n ),\n apiKey,\n agentId,\n };\n}\n\nfunction buildTimeoutSignal(): AbortSignal {\n return AbortSignal.timeout(LIFEOPS_SCHEDULE_REQUEST_TIMEOUT_MS);\n}\n\nasync function readJsonResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n let detail = `${response.status} ${response.statusText}`.trim();\n const text = await response.text();\n const trimmed = text.trim();\n if (trimmed.length > 0) {\n try {\n const parsed = JSON.parse(trimmed) as {\n error?: string;\n message?: string;\n };\n detail = parsed.message ?? parsed.error ?? trimmed;\n } catch {\n detail = trimmed.slice(0, 200);\n }\n }\n throw new LifeOpsScheduleSyncClientError(response.status, detail);\n }\n return (await response.json()) as T;\n}\n\nexport function resolveLifeOpsScheduleSyncSiteUrl(rawUrl?: string): string {\n return normalizeCloudSiteUrl(rawUrl);\n}\n\nexport class LifeOpsScheduleSyncClient {\n constructor(\n private readonly configSource:\n | ResolvedLifeOpsScheduleSyncConfig\n | (() => ResolvedLifeOpsScheduleSyncConfig) =\n resolveLifeOpsScheduleSyncConfig,\n ) {}\n\n private getConfig(): ResolvedLifeOpsScheduleSyncConfig {\n return typeof this.configSource === \"function\"\n ? this.configSource()\n : this.configSource;\n }\n\n get configured(): boolean {\n return this.getConfig().configured;\n }\n\n private requireConfig(): Exclude<\n ResolvedLifeOpsScheduleSyncConfig,\n { configured: false }\n > {\n const config = this.getConfig();\n if (!config.configured) {\n throw new LifeOpsScheduleSyncClientError(\n 409,\n \"LifeOps schedule sync is not configured.\",\n );\n }\n return config;\n }\n\n private resolvePath(pathname: string): string {\n const config = this.requireConfig();\n const normalizedPath = pathname.replace(/^\\/+/, \"\");\n if (config.mode === \"remote\") {\n return new URL(\n `api/lifeops/schedule/${normalizedPath}`,\n `${config.baseUrl.replace(/\\/+$/, \"\")}/`,\n ).toString();\n }\n return new URL(\n `eliza/agents/${encodeURIComponent(config.agentId)}/lifeops/schedule/${normalizedPath}`,\n `${config.apiBaseUrl.replace(/\\/+$/, \"\")}/`,\n ).toString();\n }\n\n private requestHeaders(\n initHeaders: HeadersInit | undefined,\n ): Record<string, string> {\n const config = this.requireConfig();\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n };\n if (config.mode === \"cloud\") {\n headers[\"X-API-Key\"] = config.apiKey;\n }\n if (config.mode === \"remote\" && config.accessToken) {\n headers.Authorization = `Bearer ${config.accessToken}`;\n }\n if (initHeaders instanceof Headers) {\n for (const [key, value] of initHeaders.entries()) {\n headers[key] = value;\n }\n return headers;\n }\n if (Array.isArray(initHeaders)) {\n for (const [key, value] of initHeaders) {\n headers[key] = value;\n }\n return headers;\n }\n return {\n ...headers,\n ...(initHeaders ?? {}),\n };\n }\n\n private async request<T>(pathname: string, init: RequestInit): Promise<T> {\n const response = await fetch(this.resolvePath(pathname), {\n ...init,\n headers: this.requestHeaders(init.headers),\n signal: init.signal ?? buildTimeoutSignal(),\n });\n return readJsonResponse<T>(response);\n }\n\n async syncObservations(\n request: SyncLifeOpsScheduleObservationsRequest,\n ): Promise<SyncLifeOpsScheduleObservationsResponse> {\n return this.request<SyncLifeOpsScheduleObservationsResponse>(\n \"observations\",\n {\n method: \"POST\",\n body: JSON.stringify(request),\n },\n );\n }\n\n async getMergedState(\n timezone: string,\n scope: \"local\" | \"cloud\" | \"effective\" = \"cloud\",\n ): Promise<GetLifeOpsScheduleMergedStateResponse> {\n const query = new URLSearchParams({ timezone, scope });\n return this.request<GetLifeOpsScheduleMergedStateResponse>(\n `merged-state?${query.toString()}`,\n {\n method: \"GET\",\n },\n );\n }\n}\n",
|
|
17
|
+
"import type {\n LifeOpsAwakeProbability,\n LifeOpsCircadianState,\n LifeOpsPersonalBaseline,\n LifeOpsRelativeTime,\n LifeOpsScheduleInsight,\n LifeOpsScheduleMealLabel,\n LifeOpsScheduleRegularity,\n LifeOpsScheduleSleepStatus,\n LifeOpsUnclearReason,\n} from \"@elizaos/shared\";\n\nexport const LIFEOPS_SCHEDULE_DEVICE_KINDS = [\n \"iphone\",\n \"ipad\",\n \"mac\",\n \"watch\",\n \"cloud\",\n \"unknown\",\n] as const;\n\nexport type LifeOpsScheduleDeviceKind =\n (typeof LIFEOPS_SCHEDULE_DEVICE_KINDS)[number];\n\nexport const LIFEOPS_SCHEDULE_OBSERVATION_ORIGINS = [\n \"local_inference\",\n \"device_sync\",\n] as const;\n\nexport type LifeOpsScheduleObservationOrigin =\n (typeof LIFEOPS_SCHEDULE_OBSERVATION_ORIGINS)[number];\n\nexport const LIFEOPS_SCHEDULE_STATE_SCOPES = [\"local\", \"cloud\"] as const;\n\nexport type LifeOpsScheduleStateScope =\n (typeof LIFEOPS_SCHEDULE_STATE_SCOPES)[number];\n\nexport interface LifeOpsScheduleObservationSnapshot {\n effectiveDayKey: string;\n localDate: string;\n phase: LifeOpsCircadianState;\n circadianState: LifeOpsCircadianState;\n stateConfidence: number;\n uncertaintyReason: LifeOpsUnclearReason | null;\n relativeTime: LifeOpsRelativeTime;\n awakeProbability: LifeOpsAwakeProbability;\n regularity: LifeOpsScheduleRegularity;\n baseline: LifeOpsPersonalBaseline | null;\n sleepStatus: LifeOpsScheduleSleepStatus;\n isProbablySleeping: boolean;\n sleepConfidence: number;\n currentSleepStartedAt: string | null;\n lastSleepStartedAt: string | null;\n lastSleepEndedAt: string | null;\n lastSleepDurationMinutes: number | null;\n wakeAt: string | null;\n firstActiveAt: string | null;\n lastActiveAt: string | null;\n lastMealAt: string | null;\n nextMealLabel: LifeOpsScheduleMealLabel | null;\n nextMealWindowStartAt: string | null;\n nextMealWindowEndAt: string | null;\n nextMealConfidence: number;\n}\n\nexport interface LifeOpsScheduleObservation {\n id: string;\n agentId: string;\n origin: LifeOpsScheduleObservationOrigin;\n deviceId: string;\n deviceKind: LifeOpsScheduleDeviceKind;\n timezone: string;\n observedAt: string;\n windowStartAt: string;\n windowEndAt: string | null;\n circadianState: LifeOpsCircadianState;\n stateConfidence: number;\n uncertaintyReason: LifeOpsUnclearReason | null;\n mealLabel: LifeOpsScheduleMealLabel | null;\n metadata: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface LifeOpsScheduleMergedState extends LifeOpsScheduleInsight {\n id: string;\n agentId: string;\n scope: LifeOpsScheduleStateScope;\n mergedAt: string;\n observationCount: number;\n deviceCount: number;\n contributingDeviceKinds: LifeOpsScheduleDeviceKind[];\n metadata: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface SyncLifeOpsScheduleObservationInput {\n circadianState: LifeOpsCircadianState;\n stateConfidence: number;\n uncertaintyReason?: LifeOpsUnclearReason | null;\n windowStartAt: string;\n windowEndAt?: string | null;\n mealLabel?: LifeOpsScheduleMealLabel | null;\n snapshot?: Partial<LifeOpsScheduleObservationSnapshot> | null;\n metadata?: Record<string, unknown>;\n}\n\nexport interface SyncLifeOpsScheduleObservationsRequest {\n deviceId: string;\n deviceKind: LifeOpsScheduleDeviceKind;\n timezone: string;\n observedAt?: string;\n observations: SyncLifeOpsScheduleObservationInput[];\n}\n\nexport interface SyncLifeOpsScheduleObservationsResponse {\n acceptedCount: number;\n mergedState: LifeOpsScheduleMergedState;\n}\n\nexport interface GetLifeOpsScheduleMergedStateResponse {\n mergedState: LifeOpsScheduleMergedState | null;\n}\n",
|
|
18
|
+
"import {\n normalizeCloudSiteUrl,\n resolveCloudApiBaseUrl,\n} from \"./base-url.js\";\n\nexport { normalizeCloudSiteUrl, resolveCloudApiBaseUrl } from \"./base-url.js\";\n\nexport interface ElizaCloudManagedClientConfig {\n configured: boolean;\n apiKey: string | null;\n apiBaseUrl: string;\n siteUrl: string;\n}\n\nexport function normalizeElizaCloudApiKey(\n value: string | undefined | null,\n): string | null {\n const trimmed = value?.trim();\n if (!trimmed) return null;\n return trimmed.toUpperCase() === \"[REDACTED]\" ? null : trimmed;\n}\n\nexport function resolveEnvElizaCloudManagedClientConfig(\n env: Record<string, string | undefined> =\n typeof process === \"undefined\" ? {} : process.env,\n): ElizaCloudManagedClientConfig {\n const apiKey = normalizeElizaCloudApiKey(env.ELIZAOS_CLOUD_API_KEY);\n const baseUrl = env.ELIZAOS_CLOUD_BASE_URL;\n return {\n configured: Boolean(apiKey),\n apiKey,\n apiBaseUrl: resolveCloudApiBaseUrl(baseUrl),\n siteUrl: normalizeCloudSiteUrl(baseUrl),\n };\n}\n\nconst PLAID_REQUEST_TIMEOUT_MS = 30_000;\nconst PAYPAL_REQUEST_TIMEOUT_MS = 30_000;\n\ntype ConfigSource = () => ElizaCloudManagedClientConfig;\n\nexport class PlaidManagedClientError extends Error {\n constructor(\n public readonly status: number,\n message: string,\n ) {\n super(message);\n this.name = \"PlaidManagedClientError\";\n }\n}\n\nexport class PaypalManagedClientError extends Error {\n constructor(\n public readonly status: number,\n message: string,\n public readonly fallback: \"csv_export\" | null = null,\n ) {\n super(message);\n this.name = \"PaypalManagedClientError\";\n }\n}\n\nasync function readPlaidJson<T>(response: Response): Promise<T> {\n if (!response.ok) {\n let detail = `${response.status} ${response.statusText}`.trim();\n const text = await response.text();\n if (text.trim().length > 0) {\n try {\n const parsed = JSON.parse(text) as {\n error?: string;\n message?: string;\n };\n detail = parsed.message ?? parsed.error ?? text.slice(0, 240);\n } catch {\n detail = text.slice(0, 240);\n }\n }\n throw new PlaidManagedClientError(response.status, detail);\n }\n return (await response.json()) as T;\n}\n\nasync function readPaypalJson<T>(response: Response): Promise<T> {\n if (!response.ok) {\n let detail = `${response.status} ${response.statusText}`.trim();\n let fallback: \"csv_export\" | null = null;\n const text = await response.text();\n if (text.trim().length > 0) {\n try {\n const parsed = JSON.parse(text) as {\n error?: string;\n message?: string;\n fallback?: \"csv_export\" | null;\n };\n detail = parsed.message ?? parsed.error ?? text.slice(0, 240);\n fallback = parsed.fallback ?? null;\n } catch {\n detail = text.slice(0, 240);\n }\n }\n throw new PaypalManagedClientError(response.status, detail, fallback);\n }\n return (await response.json()) as T;\n}\n\nexport interface PlaidLinkTokenResponse {\n linkToken: string;\n expiration: string;\n environment: \"sandbox\" | \"development\" | \"production\";\n}\n\nexport interface PlaidExchangeResponse {\n accessToken: string;\n itemId: string;\n institution: {\n institutionId: string;\n institutionName: string;\n primaryAccountMask: string | null;\n accounts: Array<{\n accountId: string;\n name: string;\n mask: string | null;\n type: string;\n subtype: string | null;\n }>;\n };\n}\n\nexport interface PlaidSyncResponse {\n added: PlaidTransactionDto[];\n modified: PlaidTransactionDto[];\n removed: Array<{ transaction_id: string }>;\n nextCursor: string;\n hasMore: boolean;\n}\n\nexport interface PlaidTransactionDto {\n transaction_id: string;\n account_id: string;\n amount: number;\n iso_currency_code: string | null;\n unofficial_currency_code: string | null;\n date: string;\n authorized_date: string | null;\n name: string;\n merchant_name: string | null;\n pending: boolean;\n category: string[] | null;\n personal_finance_category: {\n primary: string;\n detailed: string;\n } | null;\n}\n\nexport class PlaidManagedClient {\n constructor(\n private readonly configSource: ConfigSource =\n resolveEnvElizaCloudManagedClientConfig,\n ) {}\n\n private requireConfig(): ElizaCloudManagedClientConfig & { apiKey: string } {\n const config = this.configSource();\n if (!config.apiKey) {\n throw new PlaidManagedClientError(409, \"Eliza Cloud is not connected.\");\n }\n return { ...config, apiKey: config.apiKey };\n }\n\n get configured(): boolean {\n return this.configSource().configured;\n }\n\n async createLinkToken(): Promise<PlaidLinkTokenResponse> {\n const config = this.requireConfig();\n const response = await fetch(\n `${config.apiBaseUrl}/v1/eliza/plaid/link-token`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: \"{}\",\n signal: AbortSignal.timeout(PLAID_REQUEST_TIMEOUT_MS),\n },\n );\n return readPlaidJson<PlaidLinkTokenResponse>(response);\n }\n\n async exchangePublicToken(args: {\n publicToken: string;\n }): Promise<PlaidExchangeResponse> {\n const config = this.requireConfig();\n const response = await fetch(\n `${config.apiBaseUrl}/v1/eliza/plaid/exchange`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ publicToken: args.publicToken }),\n signal: AbortSignal.timeout(PLAID_REQUEST_TIMEOUT_MS),\n },\n );\n return readPlaidJson<PlaidExchangeResponse>(response);\n }\n\n async syncTransactions(args: {\n accessToken: string;\n cursor?: string;\n count?: number;\n }): Promise<PlaidSyncResponse> {\n const config = this.requireConfig();\n const response = await fetch(`${config.apiBaseUrl}/v1/eliza/plaid/sync`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n accessToken: args.accessToken,\n cursor: args.cursor ?? \"\",\n count: args.count ?? 250,\n }),\n signal: AbortSignal.timeout(PLAID_REQUEST_TIMEOUT_MS * 2),\n });\n return readPlaidJson<PlaidSyncResponse>(response);\n }\n}\n\nexport interface PaypalAuthorizeUrlResponse {\n url: string;\n scope: string;\n environment: \"live\" | \"sandbox\";\n}\n\nexport interface PaypalCallbackResponse {\n accessToken: string;\n refreshToken: string | null;\n expiresIn: number;\n scope: string;\n capability: { hasReporting: boolean; hasIdentity: boolean };\n identity: { payerId: string; emails: string[]; name: string | null } | null;\n}\n\nexport interface PaypalTransactionDto {\n transaction_info: {\n transaction_id: string;\n transaction_initiation_date: string;\n transaction_updated_date: string | null;\n transaction_amount: { currency_code: string; value: string };\n transaction_status: string;\n transaction_subject: string | null;\n transaction_note: string | null;\n };\n payer_info?: {\n email_address?: string;\n payer_name?: { alternate_full_name?: string };\n };\n shipping_info?: { name?: string };\n cart_info?: {\n item_details?: Array<{\n item_name?: string;\n item_amount?: { currency_code: string; value: string };\n }>;\n };\n}\n\nexport interface PaypalTransactionsResponse {\n transactions: PaypalTransactionDto[];\n totalItems: number;\n totalPages: number;\n page: number;\n}\n\nexport class PaypalManagedClient {\n constructor(\n private readonly configSource: ConfigSource =\n resolveEnvElizaCloudManagedClientConfig,\n ) {}\n\n private requireConfig(): ElizaCloudManagedClientConfig & { apiKey: string } {\n const config = this.configSource();\n if (!config.apiKey) {\n throw new PaypalManagedClientError(409, \"Eliza Cloud is not connected.\");\n }\n return { ...config, apiKey: config.apiKey };\n }\n\n get configured(): boolean {\n return this.configSource().configured;\n }\n\n async buildAuthorizeUrl(args: {\n state: string;\n }): Promise<PaypalAuthorizeUrlResponse> {\n const config = this.requireConfig();\n const response = await fetch(\n `${config.apiBaseUrl}/v1/eliza/paypal/authorize`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ state: args.state }),\n signal: AbortSignal.timeout(PAYPAL_REQUEST_TIMEOUT_MS),\n },\n );\n return readPaypalJson<PaypalAuthorizeUrlResponse>(response);\n }\n\n async exchangeCode(args: { code: string }): Promise<PaypalCallbackResponse> {\n const config = this.requireConfig();\n const response = await fetch(\n `${config.apiBaseUrl}/v1/eliza/paypal/callback`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: args.code }),\n signal: AbortSignal.timeout(PAYPAL_REQUEST_TIMEOUT_MS),\n },\n );\n return readPaypalJson<PaypalCallbackResponse>(response);\n }\n\n async refreshAccessToken(args: { refreshToken: string }): Promise<{\n accessToken: string;\n refreshToken: string | null;\n expiresIn: number;\n scope: string;\n }> {\n const config = this.requireConfig();\n const response = await fetch(\n `${config.apiBaseUrl}/v1/eliza/paypal/refresh`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ refreshToken: args.refreshToken }),\n signal: AbortSignal.timeout(PAYPAL_REQUEST_TIMEOUT_MS),\n },\n );\n return readPaypalJson(response);\n }\n\n async searchTransactions(args: {\n accessToken: string;\n startDate: string;\n endDate: string;\n page?: number;\n }): Promise<PaypalTransactionsResponse> {\n const config = this.requireConfig();\n const response = await fetch(\n `${config.apiBaseUrl}/v1/eliza/paypal/transactions`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(args),\n signal: AbortSignal.timeout(PAYPAL_REQUEST_TIMEOUT_MS * 2),\n },\n );\n return readPaypalJson<PaypalTransactionsResponse>(response);\n }\n}\n",
|
|
19
|
+
"export {\n type CloudLoginOptions,\n type CloudLoginResult,\n cloudLogin,\n} from \"./auth.js\";\nexport { BackupScheduler } from \"./backup.js\";\nexport {\n isCloudAuthApiKeyService,\n normalizeCloudApiKey,\n type CloudAuthApiKeyService,\n} from \"./auth-service-types.js\";\nexport {\n normalizeCloudSiteUrl,\n resolveCloudApiBaseUrl,\n} from \"./base-url.js\";\nexport * from \"./duffel-client.js\";\nexport * from \"./lifeops-schedule-sync-client.js\";\nexport * from \"./lifeops-schedule-sync-contracts.js\";\nexport {\n type BackupInfo,\n type CloudAgent,\n type CloudAgentCreateParams,\n ElizaCloudClient,\n type ProvisionInfo,\n} from \"./bridge-client.js\";\nexport {\n type CloudConnectionStatus,\n CloudManager,\n type CloudManagerCallbacks,\n} from \"./cloud-manager.js\";\nexport { CloudRuntimeProxy } from \"./cloud-proxy.js\";\nexport * from \"./managed-payment-clients.js\";\nexport * from \"./x402-payment-handler.js\";\nexport {\n ConnectionMonitor,\n type ConnectionMonitorCallbacks,\n} from \"./reconnect.js\";\nexport { validateCloudBaseUrl } from \"./validate-url.js\";\n"
|
|
20
|
+
],
|
|
21
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAKA;AAAA;;;ACLA;AACA;AACA;AAqBA,SAAS,iBAAiB,CAAC,OAAuB;AAAA,EAChD,OAAO,MACJ,KAAK,EACL,YAAY,EACZ,QAAQ,YAAY,EAAE;AAAA;AAG3B,SAAS,mBAAmB,CAAC,QAA+B;AAAA,EAC1D,MAAM,QAAQ,OAAO,MAAM,GAAG;AAAA,EAC9B,IAAI,MAAM,SAAS,KAAK,MAAM,SAAS;AAAA,IAAG,OAAO;AAAA,EAEjD,MAAM,SAAS,MAAM,IAAI,CAAC,SAAS;AAAA,IACjC,IAAI,CAAC,mBAAmB,KAAK,IAAI;AAAA,MAAG,OAAO,OAAO;AAAA,IAClD,OAAO,OAAO,SAAS,MAAM,EAAE;AAAA,GAChC;AAAA,EACD,IAAI,OAAO,KAAK,CAAC,UAAU,CAAC,OAAO,SAAS,KAAK,CAAC;AAAA,IAAG,OAAO;AAAA,EAE5D,OAAO,IAAI,MAAM,OAAO,WAAW,IAAI,CAAC,GAAG,OAAO,EAAE,IAAI;AAAA,EACxD,MAAM,SAAS,CAAC,MAAM,GAAG,KAAK,KAAM,MAAM,GAAG,KAAK,GAAI;AAAA,EACtD,OAAO,OAAO,KAAK,GAAG;AAAA;AAGxB,SAAS,gBAAgB,CAAC,IAA2B;AAAA,EACnD,IAAI;AAAA,IACF,OAAO,IAAI,IAAI,WAAW,MAAM,EAAE,SAAS,QAAQ,YAAY,EAAE;AAAA,IACjE,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAIX,SAAS,oBAAoB,CAAC,IAAoB;AAAA,EAChD,MAAM,OAAO,kBAAkB,EAAE,EAAE,MAAM,GAAG,EAAE;AAAA,EAC9C,IAAI,CAAC;AAAA,IAAM,OAAO;AAAA,EAElB,IAAI,aAAa;AAAA,EACjB,IAAI,IAAI,KAAK,UAAU,MAAM,GAAG;AAAA,IAC9B,aAAa,iBAAiB,UAAU,KAAK;AAAA,EAC/C;AAAA,EAEA,IAAI,SAAwB;AAAA,EAC5B,IAAI,WAAW,WAAW,SAAS,GAAG;AAAA,IACpC,SAAS,WAAW,MAAM,UAAU,MAAM;AAAA,EAC5C,EAAO,SAAI,WAAW,WAAW,iBAAiB,GAAG;AAAA,IACnD,SAAS,WAAW,MAAM,kBAAkB,MAAM;AAAA,EACpD;AAAA,EACA,IAAI,CAAC;AAAA,IAAQ,OAAO;AAAA,EAEpB,IAAI,IAAI,KAAK,MAAM,MAAM;AAAA,IAAG,OAAO;AAAA,EACnC,OAAO,oBAAoB,MAAM,KAAK;AAAA;AAGxC,SAAS,MAAM,CAAC,MAAc,QAAgD;AAAA,EAC5E,MAAM,SAAS,eAAe,IAAI;AAAA,EAClC,IAAI,WAAW,MAAM;AAAA,IACnB,MAAM,IAAI,MAAM,mCAAmC,MAAM;AAAA,EAC3D;AAAA,EACA,MAAM,QAAQ,KAAK;AAAA,EACnB,MAAM,OAAO,UAAU,KAAK,IAAK,cAAc,UAAW;AAAA,EAC1D,OAAO,EAAE,MAAM,SAAS,MAAM,KAAK;AAAA;AAGrC,SAAS,cAAc,CAAC,IAA2B;AAAA,EACjD,MAAM,QAAQ,GAAG,MAAM,GAAG;AAAA,EAC1B,IAAI,MAAM,WAAW;AAAA,IAAG,OAAO;AAAA,EAE/B,IAAI,QAAQ;AAAA,EACZ,WAAW,QAAQ,OAAO;AAAA,IACxB,IAAI,CAAC,YAAY,KAAK,IAAI;AAAA,MAAG,OAAO;AAAA,IACpC,MAAM,QAAQ,OAAO,SAAS,MAAM,EAAE;AAAA,IACtC,IAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ;AAAA,MAAK,OAAO;AAAA,IACjE,QAAS,SAAS,IAAK;AAAA,EACzB;AAAA,EAEA,OAAO,UAAU;AAAA;AAGnB,SAAS,aAAa,CAAC,IAAqB;AAAA,EAC1C,MAAM,QAAQ,eAAe,EAAE;AAAA,EAC/B,IAAI,UAAU;AAAA,IAAM,OAAO;AAAA,EAC3B,OAAO,mBAAmB,KAAK,CAAC,UAAU,QAAQ,KAAK,UAAU,KAAK,IAAI;AAAA;AAG5E,SAAS,aAAa,CAAC,IAAqB;AAAA,EAC1C,MAAM,aAAa,GAAG,YAAY;AAAA,EAClC,OACE,eAAe,QACf,eAAe,SACf,qBAAqB,KAAK,UAAU,KACpC,sBAAsB,KAAK,UAAU,KACrC,WAAW,WAAW,IAAI;AAAA;AAI9B,SAAS,WAAW,CAAC,IAAqB;AAAA,EACxC,MAAM,aAAa,qBAAqB,EAAE;AAAA,EAC1C,MAAM,SAAS,IAAI,KAAK,UAAU;AAAA,EAClC,IAAI,WAAW;AAAA,IAAG,OAAO,cAAc,UAAU;AAAA,EACjD,IAAI,WAAW;AAAA,IAAG,OAAO,cAAc,UAAU;AAAA,EACjD,OAAO;AAAA;AAGT,eAAsB,oBAAoB,CACxC,QACwB;AAAA,EACxB,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,SAAS,IAAI,IAAI,MAAM;AAAA,IACvB,MAAM;AAAA,IACN,OAAO,4BAA4B;AAAA;AAAA,EAGrC,IAAI,OAAO,aAAa,UAAU;AAAA,IAChC,OAAO,uCAAuC,OAAO,iBAAiB;AAAA,EACxE;AAAA,EAEA,MAAM,WAAW,kBAAkB,OAAO,QAAQ;AAAA,EAClD,IAAI,CAAC,UAAU;AAAA,IACb,OAAO,4BAA4B;AAAA,EACrC;AAAA,EAEA,IACE,aAAa,eACb,SAAS,SAAS,YAAY,KAC9B,SAAS,SAAS,QAAQ,GAC1B;AAAA,IACA,OAAO,mBAAmB;AAAA,EAC5B;AAAA,EAGA,MAAM,WAAW,QAAQ,IAAI,WAAW,KAAK,EAAE,YAAY;AAAA,EAC3D,IACE,MAIA;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,YAAY,QAAQ,GAAG;AAAA,IACzB,OAAO,mBAAmB;AAAA,EAC5B;AAAA,EAEA,IAAI;AAAA,IACF,MAAM,UAAU,MAAM,aAAa,UAAU,EAAE,KAAK,KAAK,CAAC;AAAA,IAC1D,MAAM,YAAY,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AAAA,IAC7D,WAAW,SAAS,WAAW;AAAA,MAC7B,MAAM,KACJ,OAAO,UAAU,WACb,QACC,MAA8B;AAAA,MACrC,IAAI,YAAY,EAAE,GAAG;AAAA,QACnB,OACE,mBAAmB,uBAAuB,SAC1C;AAAA,MAEJ;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,OAAO,mBAAmB;AAAA;AAAA,EAG5B,OAAO;AAAA;AAAA,IArLH,cAEA;AAAA;AAAA,EAFA,eAAe,UAAU,IAAI,MAAM;AAAA,EAEnC,qBAA4D;AAAA,IAChE,OAAO,WAAW,CAAC;AAAA,IACnB,OAAO,YAAY,CAAC;AAAA,IACpB,OAAO,cAAc,EAAE;AAAA,IACvB,OAAO,eAAe,EAAE;AAAA,IACxB,OAAO,cAAc,EAAE;AAAA,IACvB,OAAO,aAAa,CAAC;AAAA,IACrB,OAAO,eAAe,EAAE;AAAA,IACxB,OAAO,aAAa,EAAE;AAAA,IACtB,OAAO,cAAc,EAAE;AAAA,IACvB,OAAO,aAAa,EAAE;AAAA,IACtB,OAAO,gBAAgB,EAAE;AAAA,IACzB,OAAO,eAAe,EAAE;AAAA,IACxB,OAAO,aAAa,CAAC;AAAA,IACrB,OAAO,aAAa,CAAC;AAAA,EACvB;AAAA;;;ACdO,SAAS,wBAAwB,CACtC,OAC2C;AAAA,EAC3C,OACE,UAAU,QACV,UAAU,aACV,OAAQ,MAA0C,oBAChD;AAAA;AAIC,SAAS,oBAAoB,CAAC,OAAiD;AAAA,EACpF,IAAI,OAAO,UAAU;AAAA,IAAU,OAAO;AAAA,EACtC,MAAM,UAAU,MAAM,KAAK;AAAA,EAC3B,IAAI,CAAC,WAAW,QAAQ,YAAY,MAAM;AAAA,IAAc,OAAO;AAAA,EAC/D,OAAO;AAAA;;;ACfT;AACA;AAHA;AACA;AAmBA,IAAM,mCAAmC;AAEzC,SAAS,kBAAkB,CAAC,UAA6B;AAAA,EACvD,OAAO,SAAS,UAAU,OAAO,SAAS,SAAS;AAAA;AAGrD,SAAS,cAAc,CAAC,KAAuB;AAAA,EAC7C,IAAI,EAAE,eAAe;AAAA,IAAQ,OAAO;AAAA,EACpC,IAAI,IAAI,SAAS,kBAAkB,IAAI,SAAS;AAAA,IAAc,OAAO;AAAA,EACrE,MAAM,MAAM,IAAI,QAAQ,YAAY;AAAA,EACpC,OAAO,IAAI,SAAS,WAAW,KAAK,IAAI,SAAS,SAAS;AAAA;AAG5D,eAAe,gBAAgB,CAC7B,OACA,MACA,WACmB;AAAA,EACnB,OAAO,MAAM,OAAO;AAAA,OACf;AAAA,IACH,UAAU;AAAA,IACV,QAAQ,YAAY,QAAQ,SAAS;AAAA,EACvC,CAAC;AAAA;AAGH,eAAsB,UAAU,CAC9B,UAA6B,CAAC,GACH;AAAA,EAC3B,MAAM,UAAU,sBAAsB,QAAQ,OAAO;AAAA,EACrD,MAAM,WAAW,MAAM,qBAAqB,OAAO;AAAA,EACnD,IAAI,UAAU;AAAA,IACZ,MAAM,IAAI,MAAM,QAAQ;AAAA,EAC1B;AAAA,EACA,MAAM,YAAY,QAAQ,aAAa;AAAA,EACvC,MAAM,mBACJ,QAAQ,oBAAoB;AAAA,EAC9B,MAAM,iBAAiB,QAAQ,kBAAkB;AAAA,EACjD,MAAM,YAAY,QAAO,WAAW;AAAA,EAEpC,OAAO,KAAK,uCAAuC;AAAA,EAEnD,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,iBAAiB,MAAM,iBACrB,GAAG,gCACH;AAAA,MACE,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,UAAU,CAAC;AAAA,IACpC,GACA,gBACF;AAAA,IACA,OAAO,KAAK;AAAA,IACZ,IAAI,eAAe,GAAG,GAAG;AAAA,MACvB,MAAM,IAAI,MACR,0DAA0D,sBAC5D;AAAA,IACF;AAAA,IACA,MAAM,IAAI,MAAM,kCAAkC,OAAO,GAAG,GAAG;AAAA;AAAA,EAGjE,IAAI,CAAC,eAAe,IAAI;AAAA,IACtB,IAAI,mBAAmB,cAAc,GAAG;AAAA,MACtC,MAAM,IAAI,MACR,gEACF;AAAA,IACF;AAAA,IACA,MAAM,YAAY,MAAM,eAAe,KAAK;AAAA,IAC5C,MAAM,IAAI,MACR,uCAAuC,eAAe,YAAY,WACpE;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,GAAG,kCAAkC,mBAAmB,SAAS;AAAA,EACpF,OAAO,KAAK,6BAA6B,YAAY;AAAA,EACrD,QAAQ,eAAe,UAAU;AAAA,EAEjC,MAAM,WAAW,KAAK,IAAI,IAAI;AAAA,EAE9B,OAAO,KAAK,IAAI,IAAI,UAAU;AAAA,IAC5B,MAAM,uBAAuB,WAAW,KAAK,IAAI;AAAA,IACjD,IAAI,wBAAwB;AAAA,MAAG;AAAA,IAC/B,MAAM,IAAI,QAAQ,CAAC,YACjB,WAAW,SAAS,KAAK,IAAI,gBAAgB,oBAAoB,CAAC,CACpE;AAAA,IAEA,MAAM,YAAY,WAAW,KAAK,IAAI;AAAA,IACtC,IAAI,aAAa;AAAA,MAAG;AAAA,IAEpB,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,eAAe,MAAM,iBACnB,GAAG,gCAAgC,mBAAmB,SAAS,KAC/D,CAAC,GACD,KAAK,IAAI,kBAAkB,SAAS,CACtC;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,IAAI,eAAe,GAAG,GAAG;AAAA,QACvB,IAAI,aAAa,kBAAkB;AAAA,UACjC;AAAA,QACF;AAAA,QACA,MAAM,IAAI,MACR,2CAA2C,KAAK,IAAI,kBAAkB,SAAS,OACjF;AAAA,MACF;AAAA,MACA,MAAM,IAAI,MAAM,+BAA+B,OAAO,GAAG,GAAG;AAAA;AAAA,IAG9D,IAAI,CAAC,aAAa,IAAI;AAAA,MACpB,IAAI,mBAAmB,YAAY,GAAG;AAAA,QACpC,MAAM,IAAI,MACR,wEACF;AAAA,MACF;AAAA,MACA,IAAI,aAAa,WAAW,KAAK;AAAA,QAC/B,MAAM,IAAI,MAAM,sDAAsD;AAAA,MACxE;AAAA,MACA,QAAQ,eAAe,OAAO;AAAA,MAC9B;AAAA,IACF;AAAA,IAEA,MAAM,OAAQ,MAAM,aAAa,KAAK;AAAA,IAOtC,QAAQ,eAAe,KAAK,MAAM;AAAA,IAElC,IAAI,KAAK,WAAW,mBAAmB,KAAK,QAAQ;AAAA,MAClD,OAAO,KAAK,sCAAsC;AAAA,MAClD,OAAO;AAAA,QACL,QAAQ,KAAK;AAAA,QACb,WAAW,KAAK,aAAa;AAAA,QAC7B,WAAW,KAAK,aAAa;AAAA,MAC/B;AAAA,IACF;AAAA,IAEA,IAAI,KAAK,WAAW,mBAAmB,CAAC,KAAK,QAAQ;AAAA,MACnD,MAAM,IAAI,MACR,gGACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,MACR,qEAAqE,KAAK,MAAM,YAAY,IAAI,YAClG;AAAA;;;AC1KF;AAAA;AAkCO,MAAM,yBAAyB,MAAM;AAAA,EAGxB;AAAA,EACA;AAAA,EAHlB,WAAW,CACT,SACgB,QACA,MAChB;AAAA,IACA,MAAM,OAAO;AAAA,IAHG;AAAA,IACA;AAAA,IAGhB,KAAK,OAAO;AAAA;AAEhB;AAAA;AAEO,MAAM,8BAA8B,iBAAiB;AAAA,EAC1D,WAAW,CAAC,SAAiB,MAAe;AAAA,IAC1C,MAAM,SAAS,KAAK,IAAI;AAAA,IACxB,KAAK,OAAO;AAAA;AAEhB;AAAA;AAEO,MAAM,yBAAyB,iBAAiB;AAAA,EACrD,WAAW,CAAC,SAAiB,MAAe;AAAA,IAC1C,MAAM,SAAS,KAAK,IAAI;AAAA,IACxB,KAAK,OAAO;AAAA;AAEhB;AAAA;AAEO,MAAM,4BAA4B,iBAAiB;AAAA,EACxD,WAAW,CAAC,SAAiB,MAAe;AAAA,IAC1C,MAAM,SAAS,KAAK,IAAI;AAAA,IACxB,KAAK,OAAO;AAAA;AAEhB;AAAA;AAEO,MAAM,8BAA8B,iBAAiB;AAAA,EAC1D,WAAW,CAAC,SAAiB,QAAgB,MAAe;AAAA,IAC1D,MAAM,SAAS,QAAQ,IAAI;AAAA,IAC3B,KAAK,OAAO;AAAA;AAEhB;AAkDA,SAAS,kBAAkB,CAAC,MAA6B;AAAA,EACvD,IAAI,CAAC;AAAA,IAAM,OAAO;AAAA,EAClB,IAAI;AAAA,IACF,MAAM,SAAS,KAAK,MAAM,IAAI;AAAA,IAI9B,MAAM,YACJ,OAAO,OAAO,UAAU,YAAY,OAAO,MAAM,KAAK,EAAE,SAAS,IAC7D,OAAO,MAAM,KAAK,IAClB;AAAA,IACN,MAAM,UAAU,MAAM,QAAQ,OAAO,OAAO,IACxC,OAAO,QACJ,IAAI,CAAC,WACJ,OAAO,QAAQ,YAAY,WAAW,OAAO,QAAQ,KAAK,IAAI,EAChE,EACC,OAAO,CAAC,YAAY,QAAQ,SAAS,CAAC,IACzC,CAAC;AAAA,IACL,IAAI,aAAa,QAAQ,SAAS,GAAG;AAAA,MACnC,OAAO,GAAG,cAAc,QAAQ,KAAK,IAAI;AAAA,IAC3C;AAAA,IACA,IAAI;AAAA,MAAW,OAAO;AAAA,IACtB,MAAM;AAAA,EAIR,OAAO,KAAK,MAAM,GAAG,GAAG,KAAK;AAAA;AAG/B,SAAS,mBAAkB,CAAC,UAA6B;AAAA,EACvD,OAAO,SAAS,UAAU,OAAO,SAAS,SAAS;AAAA;AAGrD,SAAS,qBAAqB,CAC5B,WACA,OACe;AAAA,EACf,MAAM,QAAQ,YAAY;AAAA,EAC1B,IAAI,OAAO,UAAU;AAAA,IAAU,OAAO;AAAA,EACtC,MAAM,UAAU,MAAM,KAAK;AAAA,EAC3B,OAAO,QAAQ,SAAS,IAAI,UAAU;AAAA;AAGxC,SAAS,qBAAqB,CAC5B,SACA,OACS;AAAA,EACT,IAAI,UAAU,OAAO;AAAA,IACnB,OAAO,sBAAsB,KAAK,OAAO;AAAA,EAC3C;AAAA,EAEA,OAAO,gCAAgC,KAAK,OAAO;AAAA;AAGrD,SAAS,6BAA6B,CACpC,MAIA,OACe;AAAA,EACf,MAAM,WAAW,sBAAsB,KAAK,iBAAiB,KAAK;AAAA,EAClE,IAAI;AAAA,IAAU,OAAO;AAAA,EACrB,IAAI,OAAO,KAAK,kBAAkB;AAAA,IAAU,OAAO;AAAA,EAEnD,MAAM,UAAU,KAAK,cAAc,KAAK;AAAA,EACxC,IAAI,CAAC;AAAA,IAAS,OAAO;AAAA,EACrB,OAAO,sBAAsB,SAAS,KAAK,IAAI,UAAU;AAAA;AAAA;AAGpD,MAAM,iBAAiB;AAAA,EACpB;AAAA,EACA;AAAA,EAER,WAAW,CAAC,SAAiB,QAAgB;AAAA,IAC3C,KAAK,UAAU,sBAAsB,OAAO;AAAA,IAC5C,KAAK,SAAS;AAAA;AAAA,OAGV,WAAU,GAA0B;AAAA,IACxC,MAAM,MAAM,MAAM,KAAK,QAAsB,OAAO,sBAAsB;AAAA,IAC1E,OAAO,IAAI,QAAQ,CAAC;AAAA;AAAA,OAGhB,YAAW,CAAC,QAAqD;AAAA,IACrE,MAAM,MAAM,MAAM,KAAK,QACrB,QACA,wBACA,MACF;AAAA,IACA,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI;AAAA,MACvB,MAAM,IAAI,MAAM,IAAI,SAAS,8BAA8B;AAAA,IAC7D,OAAO,IAAI;AAAA;AAAA,OAGP,SAAQ,CAAC,SAAsC;AAAA,IACnD,MAAM,MAAM,MAAM,KAAK,QACrB,OACA,wBAAwB,SAC1B;AAAA,IACA,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI;AAAA,MACvB,MAAM,IAAI,MAAM,IAAI,SAAS,iBAAiB;AAAA,IAChD,OAAO,IAAI;AAAA;AAAA,OAGP,YAAW,CAAC,SAAgC;AAAA,IAChD,MAAM,MAAM,MAAM,KAAK,QACrB,UACA,wBAAwB,SAC1B;AAAA,IACA,IAAI,CAAC,IAAI;AAAA,MAAS,MAAM,IAAI,MAAM,IAAI,SAAS,wBAAwB;AAAA;AAAA,OAGnE,UAAS,CAAC,SAAyC;AAAA,IACvD,MAAM,MAAM,MAAM,KAAK,QACrB,QACA,wBAAwB,mBAC1B;AAAA,IACA,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI;AAAA,MACvB,MAAM,IAAI,MAAM,IAAI,SAAS,6BAA6B;AAAA,IAC5D,OAAO,IAAI;AAAA;AAAA,OAGP,YAAW,CACf,SACA,MACA,SAAS,YACT,cAA+B,MACd;AAAA,IACjB,MAAM,MAAM,GAAG,KAAK,+BAA+B;AAAA,IACnD,MAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,oBAAoB,aAAa,KAAK,OAAO;AAAA,MACxE,MAAM,KAAK,UAAU;AAAA,QACnB,SAAS;AAAA,QACT,IAAI,OAAO,WAAW;AAAA,QACtB,QAAQ;AAAA,QACR,QAAQ,EAAE,MAAM,QAAQ,YAAY;AAAA,MACtC,CAAC;AAAA,MACD,UAAU;AAAA,MACV,QAAQ,YAAY,QAAQ,KAAM;AAAA,IACpC,CAAC;AAAA,IAED,IAAI,oBAAmB,QAAQ,GAAG;AAAA,MAChC,MAAM,IAAI,MACR,0DACF;AAAA,IACF;AAAA,IAEA,IAAI,CAAC,SAAS,IAAI;AAAA,MAChB,MAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AAAA,MACtD,MAAM,IAAI,MACR,+BAA+B,SAAS,UAAU,UAAU,MAAM,GAAG,GAAG,GAC1E;AAAA,IACF;AAAA,IAEA,MAAM,MAAO,MAAM,SAAS,KAAK;AAAA,IAKjC,IAAI,IAAI;AAAA,MAAO,MAAM,IAAI,MAAM,IAAI,MAAM,OAAO;AAAA,IAChD,OAAO,IAAI,QAAQ,QAAQ;AAAA;AAAA,SAGtB,iBAAiB,CACtB,SACA,MACA,SAAS,YACT,cAA+B,MACkC;AAAA,IACjE,MAAM,MAAM,GAAG,KAAK,+BAA+B;AAAA,IACnD,MAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,oBAAoB,aAAa,KAAK,OAAO;AAAA,MACxE,MAAM,KAAK,UAAU;AAAA,QACnB,SAAS;AAAA,QACT,IAAI,OAAO,WAAW;AAAA,QACtB,QAAQ;AAAA,QACR,QAAQ,EAAE,MAAM,QAAQ,YAAY;AAAA,MACtC,CAAC;AAAA,MACD,UAAU;AAAA,IACZ,CAAC;AAAA,IAED,IAAI,oBAAmB,QAAQ,GAAG;AAAA,MAChC,MAAM,IAAI,MACR,0DACF;AAAA,IACF;AAAA,IAEA,IAAI,CAAC,SAAS,MAAM,CAAC,SAAS,MAAM;AAAA,MAClC,MAAM,IAAI,MAAM,+BAA+B,SAAS,QAAQ;AAAA,IAClE;AAAA,IAEA,MAAM,SAAS,SAAS,KAAK,UAAU;AAAA,IACvC,MAAM,UAAU,IAAI;AAAA,IACpB,IAAI,SAAS;AAAA,IAEb,UAAS;AAAA,MACP,QAAQ,MAAM,UAAU,MAAM,OAAO,KAAK;AAAA,MAC1C,IAAI;AAAA,QAAM;AAAA,MAEV,UAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAAA,MAChD,MAAM,QAAQ,OAAO,MAAM;AAAA;AAAA,CAAM;AAAA,MACjC,SAAS,MAAM,IAAI,KAAK;AAAA,MAExB,WAAW,QAAQ,OAAO;AAAA,QACxB,IAAI,CAAC,KAAK,KAAK;AAAA,UAAG;AAAA,QAClB,IAAI,YAAY;AAAA,QAChB,IAAI,YAAY;AAAA,QAEhB,WAAW,QAAQ,KAAK,MAAM;AAAA,CAAI,GAAG;AAAA,UACnC,IAAI,KAAK,WAAW,SAAS;AAAA,YAAG,YAAY,KAAK,MAAM,CAAC,EAAE,KAAK;AAAA,UAC1D,SAAI,KAAK,WAAW,QAAQ;AAAA,YAC/B,cAAc,YAAY;AAAA,IAAO,MAAM,KAAK,MAAM,CAAC;AAAA,QACvD;AAAA,QAEA,IAAI,WAAW;AAAA,UACb,IAAI;AAAA,UACJ,IAAI;AAAA,YACF,OAAO,KAAK,MAAM,SAAS;AAAA,YAC3B,MAAM;AAAA,YACN;AAAA;AAAA,UAEF,MAAM,EAAE,MAAM,WAAW,KAAK;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAAA;AAAA,OAGI,SAAQ,CAAC,SAAsC;AAAA,IACnD,MAAM,MAAM,MAAM,KAAK,QACrB,QACA,wBAAwB,kBAC1B;AAAA,IACA,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI;AAAA,MACvB,MAAM,IAAI,MAAM,IAAI,SAAS,iBAAiB;AAAA,IAChD,OAAO,IAAI;AAAA;AAAA,OAGP,YAAW,CAAC,SAAwC;AAAA,IACxD,MAAM,MAAM,MAAM,KAAK,QACrB,OACA,wBAAwB,iBAC1B;AAAA,IACA,OAAO,IAAI,QAAQ,CAAC;AAAA;AAAA,OAGhB,QAAO,CAAC,SAAiB,UAAkC;AAAA,IAC/D,MAAM,MAAM,MAAM,KAAK,QACrB,QACA,wBAAwB,mBACxB,WAAW,EAAE,SAAS,IAAI,CAAC,CAC7B;AAAA,IACA,IAAI,CAAC,IAAI;AAAA,MAAS,MAAM,IAAI,MAAM,IAAI,SAAS,gBAAgB;AAAA;AAAA,OAG3D,UAAS,CAAC,SAAmC;AAAA,IACjD,MAAM,MAAM,GAAG,KAAK,+BAA+B;AAAA,IACnD,IAAI;AAAA,MACF,MAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,aAAa,KAAK;AAAA,QACpB;AAAA,QACA,MAAM,KAAK,UAAU,EAAE,SAAS,OAAO,QAAQ,YAAY,CAAC;AAAA,QAC5D,UAAU;AAAA,QACV,QAAQ,YAAY,QAAQ,GAAM;AAAA,MACpC,CAAC;AAAA,MACD,IAAI,oBAAmB,QAAQ;AAAA,QAAG,OAAO;AAAA,MACzC,OAAO,SAAS;AAAA,MAChB,MAAM;AAAA,MACN,OAAO;AAAA;AAAA;AAAA,OAQL,eAAc,CAClB,SACA,OACgC;AAAA,IAChC,MAAM,MAAM,MAAM,KAAK,QASrB,OACA,wBAAwB,mBAAmB,OAAO,kBAAkB,mBAAmB,KAAK,GAC9F;AAAA,IAEA,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,MAAM;AAAA,MAC7B,MAAM,IAAI,iBAAiB,IAAI,SAAS,8BAA8B;AAAA,IACxE;AAAA,IAEA,MAAM,OAAO,IAAI;AAAA,IACjB,MAAM,gBAAgB,8BAA8B,MAAM,KAAK;AAAA,IAC/D,IAAI,CAAC,iBAAiB,CAAC,KAAK,gBAAgB;AAAA,MAC1C,MAAM,IAAI,iBACR,sBAAsB,0BACxB;AAAA,IACF;AAAA,IAEA,OAAO;AAAA,MACL,eAAe,KAAK,WAAW;AAAA,MAC/B;AAAA,MACA,gBAAgB,KAAK;AAAA,MACrB,WAAW;AAAA,MACX,SAAS,KAAK,WAAW;AAAA,IAC3B;AAAA;AAAA,OAQI,gBAAe,CAAC,OAQnB;AAAA,IACD,MAAM,MAAM,MAAM,KAAK,QAMpB,QAAQ,kCAAkC,KAAK;AAAA,IAElD,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,MAAM;AAAA,MAC7B,MAAM,IAAI,iBAAiB,IAAI,SAAS,4BAA4B;AAAA,IACtE;AAAA,IAEA,OAAO;AAAA,MACL,UAAU,IAAI,KAAK;AAAA,MACnB,SAAS,IAAI,KAAK;AAAA,MAClB,WAAW,IAAI,KAAK;AAAA,MACpB,UAAU,IAAI,KAAK,YAAY;AAAA,IACjC;AAAA;AAAA,OAgBI,WAAU,CAAC,UAAiD;AAAA,IAChE,QAAQ,kBAAkB,SAAS;AAAA,IACnC,MAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,IAClB;AAAA,IACA,IAAI,eAAe;AAAA,MACjB,QAAQ,sBAAsB;AAAA,IAChC;AAAA,IAEA,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,WAAW,MAAM,MAAM,GAAG,KAAK,mCAAmC;AAAA,QAChE,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,KAAK,UAAU,IAAI;AAAA,QACzB,UAAU;AAAA,QACV,QAAQ,YAAY,QAAQ,KAAM;AAAA,MACpC,CAAC;AAAA,MACD,OAAO,KAAK;AAAA,MACZ,MAAM,IAAI,sBACR,4BAA6B,IAAc,WAC3C,CACF;AAAA;AAAA,IAGF,IAAI,oBAAmB,QAAQ,GAAG;AAAA,MAChC,MAAM,IAAI,iBACR,+DACA,SAAS,MACX;AAAA,IACF;AAAA,IAEA,MAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AAAA,IAEjD,IAAI,SAAS,IAAI;AAAA,MACf,IAAI;AAAA,QACF,MAAM,SAAS,KAAK,MAAM,IAAI;AAAA,QAC9B,IAAI,CAAC,OAAO,WAAW,OAAO,SAAS,WAAW;AAAA,UAChD,MAAM,IAAI,iBACR,OAAO,SAAS,8BAChB,SAAS,QACT,IACF;AAAA,QACF;AAAA,QACA,OAAO,OAAO;AAAA,QACd,OAAO,KAAK;AAAA,QACZ,IAAI,eAAe;AAAA,UAAkB,MAAM;AAAA,QAC3C,MAAM,IAAI,iBACR,sCAAuC,IAAc,WACrD,SAAS,QACT,IACF;AAAA;AAAA,IAEJ;AAAA,IAEA,IAAI,aAAa,QAAQ,SAAS;AAAA,IAClC,IAAI;AAAA,MACF,MAAM,SAAS,KAAK,MAAM,IAAI;AAAA,MAC9B,IAAI,OAAO;AAAA,QAAO,aAAa,OAAO;AAAA,MACtC,MAAM;AAAA,MACN,IAAI;AAAA,QAAM,aAAa,KAAK,MAAM,GAAG,GAAG;AAAA;AAAA,IAG1C,IAAI,SAAS,WAAW,KAAK;AAAA,MAC3B,MAAM,IAAI,sBAAsB,YAAY,IAAI;AAAA,IAClD;AAAA,IACA,IAAI,SAAS,WAAW,KAAK;AAAA,MAC3B,MAAM,IAAI,iBAAiB,YAAY,IAAI;AAAA,IAC7C;AAAA,IACA,IAAI,SAAS,WAAW,KAAK;AAAA,MAC3B,MAAM,IAAI,oBAAoB,YAAY,IAAI;AAAA,IAChD;AAAA,IACA,IAAI,SAAS,UAAU,KAAK;AAAA,MAC1B,MAAM,IAAI,sBAAsB,YAAY,SAAS,QAAQ,IAAI;AAAA,IACnE;AAAA,IACA,MAAM,IAAI,iBAAiB,YAAY,SAAS,QAAQ,IAAI;AAAA;AAAA,OAGhD,QAAU,CACtB,QACA,MACA,MACyB;AAAA,IACzB,MAAM,UAAkC,EAAE,aAAa,KAAK,OAAO;AAAA,IACnE,IAAI,SAAS;AAAA,MAAW,QAAQ,kBAAkB;AAAA,IAElD,MAAM,WAAW,MAAM,MAAM,GAAG,KAAK,UAAU,QAAQ;AAAA,MACrD;AAAA,MACA;AAAA,MACA,MAAM,SAAS,YAAY,KAAK,UAAU,IAAI,IAAI;AAAA,MAClD,UAAU;AAAA,MACV,QAAQ,YAAY,QAAQ,KAAM;AAAA,IACpC,CAAC;AAAA,IAED,IAAI,oBAAmB,QAAQ,GAAG;AAAA,MAChC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IAEA,IAAI,CAAC,SAAS,IAAI;AAAA,MAChB,MAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AAAA,MACjD,OAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,mBAAmB,IAAI,KAAK,QAAQ,SAAS;AAAA,MACtD;AAAA,IACF;AAAA,IAEA,OAAQ,MAAM,SAAS,KAAK;AAAA;AAEhC;;;ACplBA,mBAAS;AAAA;AAGF,MAAM,gBAAgB;AAAA,EAKjB;AAAA,EACA;AAAA,EACA;AAAA,EANF,QAA+C;AAAA,EAC/C,UAAU;AAAA,EAElB,WAAW,CACD,QACA,SACA,aAAqB,OAC7B;AAAA,IAHQ;AAAA,IACA;AAAA,IACA;AAAA;AAAA,EAGV,KAAK,GAAS;AAAA,IACZ,IAAI,KAAK;AAAA,MAAO;AAAA,IAChB,KAAK,UAAU;AAAA,IACf,KAAK,QAAQ,YAAY,MAAM;AAAA,MAC7B,KAAK,OAAO,SAAS,KAAK,OAAO,EAAE,MAAM,CAAC,QAAQ;AAAA,QAChD,QAAO,KAAK,sCAAsC,OAAO,GAAG,GAAG;AAAA,OAChE;AAAA,OACA,KAAK,UAAU;AAAA;AAAA,EAGpB,IAAI,GAAS;AAAA,IACX,IAAI,KAAK,OAAO;AAAA,MACd,cAAc,KAAK,KAAK;AAAA,MACxB,KAAK,QAAQ;AAAA,IACf;AAAA,IACA,KAAK,UAAU;AAAA;AAAA,EAGjB,SAAS,GAAY;AAAA,IACnB,OAAO,KAAK;AAAA;AAAA,OAGR,cAAa,GAAkB;AAAA,IACnC,MAAM,KAAK,OAAO,SAAS,KAAK,OAAO,EAAE,MAAM,CAAC,QAAQ;AAAA,MACtD,QAAO,KAAK,yCAAyC,OAAO,GAAG,GAAG;AAAA,KACnE;AAAA;AAEL;;;ACtCO,MAAM,kBAAkB;AAAA,EAEnB;AAAA,EACA;AAAA,EACA;AAAA,EAHV,WAAW,CACD,QACA,SACA,YACR;AAAA,IAHQ;AAAA,IACA;AAAA,IACA;AAAA;AAAA,MAGN,SAAS,GAAW;AAAA,IACtB,OAAO,KAAK;AAAA;AAAA,OAGR,kBAAiB,CACrB,MACA,SAAS,YACT,cAA+B,MACd;AAAA,IACjB,OAAO,KAAK,OAAO,YAAY,KAAK,SAAS,MAAM,QAAQ,WAAW;AAAA;AAAA,SAGjE,uBAAuB,CAC5B,MACA,SAAS,YACT,cAA+B,MACP;AAAA,IACxB,iBAAiB,SAAS,KAAK,OAAO,kBACpC,KAAK,SACL,MACA,QACA,WACF,GAAG;AAAA,MACD,IAAI,MAAM,SAAS,WAAW,OAAO,MAAM,KAAK,SAAS,UAAU;AAAA,QACjE,MAAM,MAAM,KAAK;AAAA,MACnB;AAAA,IACF;AAAA;AAAA,OAGI,UAAS,GAAkD;AAAA,IAC/D,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,KAAK,OAAO;AAAA,IACrD,OAAO,EAAE,OAAO,MAAM,QAAQ,WAAW,MAAM,UAAU;AAAA;AAAA,OAGrD,QAAO,GAAqB;AAAA,IAChC,OAAO,KAAK,OAAO,UAAU,KAAK,OAAO,EAAE,MAAM,MAAM,KAAK;AAAA;AAEhE;;;AC/CA,mBAAS;AAAA;AAWF,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,QAAO,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,QAAO,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,QAAO,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,QAAO,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,QAAO,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,QAAO,MAAM,uDAAuD;AAAA,IACpE,KAAK,eAAe;AAAA,IACpB,KAAK,UAAU,iBAAiB,cAAc;AAAA;AAElD;;;ACzGA,mBAAS;AAGT;AAIA;AAAA;AAaO,MAAM,aAAa;AAAA,EASd;AAAA,EACA;AAAA,EATF,SAAkC;AAAA,EAClC,QAAkC;AAAA,EAClC,kBAA0C;AAAA,EAC1C,oBAA8C;AAAA,EAC9C,SAAgC;AAAA,EAChC,gBAA+B;AAAA,EAEvC,WAAW,CACD,aACA,YAAmC,CAAC,GAC5C;AAAA,IAFQ;AAAA,IACA;AAAA;AAAA,OAGJ,KAAI,GAAkB;AAAA,IAC1B,MAAM,SAAS,sBAAsB,KAAK,YAAY,OAAO;AAAA,IAC7D,MAAM,SAAS,KAAK,YAAY;AAAA,IAChC,IAAI,CAAC;AAAA,MACH,MAAM,IAAI,MACR,yDACF;AAAA,IAEF,MAAM,WAAW,MAAM,qBAAqB,MAAM;AAAA,IAClD,IAAI,UAAU;AAAA,MACZ,MAAM,IAAI,MAAM,QAAQ;AAAA,IAC1B;AAAA,IAKA,KAAK,SAAS,IAAI,iBAAiB,QAAQ,MAAM;AAAA,IACjD,QAAO,KAAK,+CAA+C,SAAS;AAAA;AAAA,OAGhE,QAAO,CAAC,SAA6C;AAAA,IACzD,IAAI,CAAC,KAAK;AAAA,MAAQ,MAAM,KAAK,KAAK;AAAA,IAClC,IAAI,CAAC,KAAK;AAAA,MAAQ,MAAM,IAAI,MAAM,mCAAmC;AAAA,IAErE,KAAK,UAAU,YAAY;AAAA,IAC3B,KAAK,gBAAgB;AAAA,IAErB,IAAI;AAAA,MACF,MAAM,KAAK,OAAO,UAAU,OAAO;AAAA,MACnC,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,OAAO;AAAA,MAEhD,KAAK,QAAQ,IAAI,kBAAkB,KAAK,QAAQ,SAAS,MAAM,SAAS;AAAA,MAExE,KAAK,kBAAkB,IAAI,gBACzB,KAAK,QACL,SACA,KAAK,YAAY,QAAQ,wBAAwB,KACnD;AAAA,MACA,KAAK,gBAAgB,MAAM;AAAA,MAE3B,KAAK,oBAAoB,IAAI,kBAC3B,KAAK,QACL,SACA;AAAA,QACE,cAAc,MAAM,KAAK,UAAU,cAAc;AAAA,QACjD,aAAa,MAAM,KAAK,UAAU,WAAW;AAAA,QAC7C,gBAAgB,CAAC,MAAM;AAAA,UACrB,IAAI,MAAM;AAAA,YAAa,KAAK,UAAU,WAAW;AAAA,UAC5C,SAAI,MAAM;AAAA,YAAgB,KAAK,UAAU,cAAc;AAAA,UACvD;AAAA,iBAAK,UAAU,OAAO;AAAA;AAAA,MAE/B,GACA,KAAK,YAAY,QAAQ,uBAAuB,KAClD;AAAA,MACA,KAAK,kBAAkB,MAAM;AAAA,MAE7B,KAAK,UAAU,WAAW;AAAA,MAC1B,QAAO,KACL,qDAAqD,sBAAsB,MAAM,YACnF;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,KAAK,UAAU,OAAO;AAAA,MACtB,IAAI,KAAK,iBAAiB;AAAA,QACxB,KAAK,gBAAgB,KAAK;AAAA,QAC1B,KAAK,kBAAkB;AAAA,MACzB;AAAA,MACA,IAAI,KAAK,mBAAmB;AAAA,QAC1B,KAAK,kBAAkB,KAAK;AAAA,QAC5B,KAAK,oBAAoB;AAAA,MAC3B;AAAA,MACA,KAAK,QAAQ;AAAA,MACb,KAAK,gBAAgB;AAAA,MACrB,KAAK,UAAU,cAAc;AAAA,MAC7B,MAAM;AAAA;AAAA;AAAA,OAIJ,WAAU,GAAkB;AAAA,IAChC,IAAI,KAAK,iBAAiB;AAAA,MACxB,MAAM,KAAK,gBAAgB,cAAc;AAAA,MACzC,KAAK,gBAAgB,KAAK;AAAA,MAC1B,KAAK,kBAAkB;AAAA,IACzB;AAAA,IACA,IAAI,KAAK,mBAAmB;AAAA,MAC1B,KAAK,kBAAkB,KAAK;AAAA,MAC5B,KAAK,oBAAoB;AAAA,IAC3B;AAAA,IACA,KAAK,QAAQ;AAAA,IACb,KAAK,gBAAgB;AAAA,IACrB,KAAK,UAAU,cAAc;AAAA;AAAA,OAGzB,cAAa,CAAC,QAA+B;AAAA,IACjD,MAAM,KAAK,WAAW;AAAA,IACtB,KAAK,cAAc;AAAA,SACd,KAAK;AAAA,MACR;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AAAA,IACd,MAAM,KAAK,KAAK;AAAA;AAAA,EAGlB,QAAQ,GAA6B;AAAA,IACnC,OAAO,KAAK;AAAA;AAAA,EAEd,SAAS,GAA4B;AAAA,IACnC,OAAO,KAAK;AAAA;AAAA,EAEd,gBAAgB,GAAkB;AAAA,IAChC,OAAO,KAAK;AAAA;AAAA,EAEd,SAAS,GAA0B;AAAA,IACjC,OAAO,KAAK;AAAA;AAAA,EAEd,SAAS,GAAY;AAAA,IACnB,OAAO,QAAQ,KAAK,YAAY,WAAW,KAAK,YAAY,MAAM;AAAA;AAAA,EAG5D,SAAS,CAAC,QAAqC;AAAA,IACrD,IAAI,KAAK,WAAW;AAAA,MAAQ;AAAA,IAC5B,KAAK,SAAS;AAAA,IACd,KAAK,UAAU,iBAAiB,MAAM;AAAA;AAE1C;;;ACxIA,mBAA6B;AA8C7B,SAAS,UAAU,CAAC,OAA+B;AAAA,EACjD,IAAI,OAAO,UAAU;AAAA,IAAU,OAAO;AAAA,EACtC,MAAM,UAAU,MAAM,KAAK;AAAA,EAC3B,OAAO,QAAQ,SAAS,IAAI,UAAU;AAAA;AAGxC,SAAS,UAAU,CAAC,OAA+B;AAAA,EACjD,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,MAAM,UAAU,MAAM,KAAK;AAAA,IAC3B,OAAO,QAAQ,SAAS,IAAI,UAAU;AAAA,EACxC;AAAA,EACA,IAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AAAA,IACvD,OAAO,OAAO,KAAK;AAAA,EACrB;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,oBAAoB,CAC3B,KAC+B;AAAA,EAC/B,IAAI,CAAC,OAAO,OAAO,QAAQ;AAAA,IAAU,OAAO;AAAA,EAC5C,MAAM,SAAS,WAAW,IAAI,MAAM;AAAA,EACpC,MAAM,QAAQ,WAAW,IAAI,KAAK;AAAA,EAClC,MAAM,UAAU,WAAW,IAAI,OAAO;AAAA,EACtC,MAAM,QAAQ,WAAW,IAAI,KAAK;AAAA,EAClC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC;AAAA,IAAO,OAAO;AAAA,EACpD,MAAM,SAAS,WAAW,IAAI,MAAM,KAAK;AAAA,EACzC,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,WAAW,IAAI,SAAS;AAAA,IACnC,aAAa,WAAW,IAAI,WAAW;AAAA,EACzC;AAAA;AAGF,SAAS,sBAAsB,CAC7B,KAC0B;AAAA,EAC1B,IAAI,CAAC,MAAM,QAAQ,GAAG;AAAA,IAAG,OAAO,CAAC;AAAA,EACjC,MAAM,MAAgC,CAAC;AAAA,EACvC,WAAW,SAAS,KAAK;AAAA,IACvB,MAAM,aAAa,qBAAqB,KAAK;AAAA,IAC7C,IAAI;AAAA,MAAY,IAAI,KAAK,UAAU;AAAA,EACrC;AAAA,EACA,OAAO;AAAA;AAUT,eAAsB,iBAAiB,CACrC,UAC0C;AAAA,EAC1C,MAAM,cAAc,SAAS,QAAQ,IAAI,kBAAkB;AAAA,EAC3D,IAAI,aAAa,YAAY,EAAE,WAAW,MAAM,GAAG;AAAA,IACjD,MAAM,WAAW,YAAY,MAAM,CAAC,EAAE,KAAK;AAAA,IAC3C,IAAI,SAAS,SAAS,GAAG;AAAA,MACvB,MAAM,SAAS,KAAK,MAAM,QAAQ;AAAA,MAClC,MAAM,gBAAe,MAAM,QAAQ,MAAM,IACrC,uBAAuB,MAAM,IAC7B,uBAAuB,OAAO,uBAAuB,OAAO,OAAO;AAAA,MACvE,IAAI,cAAa,SAAS;AAAA,QAAG,OAAO;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,SAAS,MAAM;AAAA,EAC9B,MAAM,OAAO,MAAM,OAAO,KAAK;AAAA,EAC/B,IAAI,KAAK,WAAW;AAAA,IAAG,OAAO;AAAA,EAC9B,MAAM,OAAO,KAAK,MAAM,IAAI;AAAA,EAC5B,MAAM,eAAe,uBACnB,KAAK,uBAAuB,KAAK,OACnC;AAAA,EACA,OAAO,aAAa,SAAS,IAAI,eAAe;AAAA;AAAA;AAS3C,MAAM,6BAA6B,MAAM;AAAA,EACrC,OAAO;AAAA,EACP;AAAA,EAET,WAAW,CACT,cACA,SACA;AAAA,IACA,MAAM,OACJ,WACA,8EAA6E,aAAa;AAAA,IAC5F,MAAM,IAAI;AAAA,IACV,KAAK,OAAO;AAAA,IACZ,KAAK,eAAe;AAAA;AAExB;AAiBA,eAAsB,cAAc,CAClC,SACA,cACyB;AAAA,EACzB,IAAI,aAAa,WAAW,GAAG;AAAA,IAC7B,MAAM,IAAI,MACR,iEACF;AAAA,EACF;AAAA,EACA,MAAM,YAAY,aAAa;AAAA,EAC/B,QAAO,KACL;AAAA,IACE,UAAU;AAAA,IACV,aAAa;AAAA,IACb,OAAO,UAAU;AAAA,IACjB,SAAS,UAAU;AAAA,IACnB,QAAQ,UAAU;AAAA,IAClB,WAAW,QAAQ;AAAA,EACrB,GACA,4BAA4B,UAAU,UAAU,UAAU,YAAY,UAAU,aAAY,UAAU,QAAQ,UAAU,cAAc,KAAK,UAAU,iBAAiB,IACxK;AAAA,EACA,OAAO,EAAE,QAAQ,YAAY,aAAa,WAAW,MAAM,KAAK;AAAA;;;ACrNlE,mBAAS;AAUF,MAAM,0BAA0B,MAAM;AAAA,EAClC,OAAO;AAAA,EAChB,WAAW,CAAC,SAAiB;AAAA,IAC3B,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA;AAEhB;AAiBA,IAAM,0BAA0B;AAChC,IAAM,qBAAqB;AAC3B,IAAM,2BAA2B;AAOjC,IAAM,mBAAwC;AAAA,EAC5C,OAAO,GAAG;AAAA,EACV,OAAO,GAAG;AACZ;AAIA,SAAS,gBAAgB,GAAW;AAAA,EAClC,OAAO,QAAQ,IAAI,yBAAyB,KAAK,KAAK;AAAA;AAGxD,SAAS,iBAAiB,CAAC,KAAiC;AAAA,EAC1D,MAAM,QAAQ,IAAI,qBAAqB,KAAK,EAAE,YAAY;AAAA,EAC1D,OAAO,UAAU,OAAO,UAAU;AAAA;AAGpC,SAAS,mBAAmB,CAAC,KAAgC;AAAA,EAC3D,MAAM,OAAO,IAAI,gBAAgB,KAAK;AAAA,EACtC,IAAI,QAAQ,QAAQ,KAAK,IAAI,GAAG;AAAA,IAC9B,OAAO,oBAAoB;AAAA,EAC7B;AAAA,EACA,OAAO;AAAA;AAGF,SAAS,uBAAuB,CACrC,MAAyB,QAAQ,KACnB;AAAA,EACd,IAAI,kBAAkB,GAAG,GAAG;AAAA,IAC1B,MAAM,SAAS,IAAI,gBAAgB,KAAK;AAAA,IACxC,IAAI,CAAC,QAAQ;AAAA,MACX,MAAM,IAAI,kBACR,6DACF;AAAA,IACF;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,QAAQ,mBAAmB,KAAK;AAAA,EAC3D;AAAA,EAEA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,mBAAmB,oBAAoB,GAAG;AAAA,EAC5C;AAAA;AAiGF,IAAM,mBAAmC;AAAA,EACvC,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,SAAS;AACX;AAiKA,SAAS,YAAY,CAAC,QAAwC;AAAA,EAC5D,OAAO;AAAA,IACL,eAAe,UAAU;AAAA,IACzB,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,QAAQ;AAAA,EACV;AAAA;AAGF,SAAS,QAAQ,CAAC,KAAkC;AAAA,EAClD,MAAM,aAAa,IAAI,OAAO,IAAI,mBAAmB;AAAA,EAErD,MAAM,SAAwB,IAAI,OAAO,IAAI,CAAC,WAAW;AAAA,IACvD,QAAQ,MAAM,OAAO;AAAA,IACrB,aAAa,MAAM,YAAY;AAAA,IAC/B,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM,SAAS,IAAI,CAAC,SAAS;AAAA,MACrC,QAAQ,IAAI,OAAO;AAAA,MACnB,aAAa,IAAI,YAAY;AAAA,MAC7B,aAAa,IAAI;AAAA,MACjB,YAAY,IAAI;AAAA,MAChB,iBAAiB,IAAI,kBAAkB;AAAA,MACvC,cAAc,IAAI,iBAAiB;AAAA,MACnC,UAAU,IAAI;AAAA,IAChB,EAAE;AAAA,EACJ,EAAE;AAAA,EACF,MAAM,aAAqC,IAAI,WAAW,IACxD,CAAC,WAAW,WAAW;AAAA,IACrB,IAAI,UAAU,IAAI,KAAK,KAAK,aAAa;AAAA,IACzC,MAAM,UAAU,MAAM,KAAK,KAAK;AAAA,IAChC,WAAW,UAAU,YAAY,KAAK,KAAK;AAAA,IAC3C,YAAY,UAAU,aAAa,KAAK,KAAK;AAAA,EAC/C,EACF;AAAA,EACA,MAAM,sBAAsB,IAAI,uBAC5B;AAAA,IACE,wBACE,IAAI,qBAAqB,6BAA6B;AAAA,IACxD,yBACE,IAAI,qBAAqB,8BAA8B;AAAA,IACzD,mBAAmB,IAAI,qBAAqB,uBAAuB;AAAA,EACrE,IACA;AAAA,EAEJ,OAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,aAAa,IAAI;AAAA,IACjB,eAAe,IAAI;AAAA,IACnB,gBAAgB,WAAW,SAAS,IAAI,WAAW,SAAS;AAAA,IAC5D;AAAA,IACA,WAAW,IAAI;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAGF,SAAS,QAAQ,CAAC,KAAkC;AAAA,EAClD,OAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,kBAAkB,IAAI,qBAAqB;AAAA,IAC3C,aAAa,IAAI;AAAA,IACjB,eAAe,IAAI;AAAA,IACnB,QAAQ,IAAI,OAAO,IAAI,CAAC,WAAW;AAAA,MACjC,QAAQ,MAAM,OAAO;AAAA,MACrB,aAAa,MAAM,YAAY;AAAA,MAC/B,UAAU,MAAM;AAAA,MAChB,UAAU,MAAM,SAAS,IAAI,CAAC,aAAa;AAAA,QACzC,QAAQ,QAAQ,OAAO;AAAA,QACvB,aAAa,QAAQ,YAAY;AAAA,QACjC,aAAa,QAAQ;AAAA,QACrB,YAAY,QAAQ;AAAA,QACpB,iBAAiB,QAAQ,kBAAkB;AAAA,QAC3C,cAAc,QAAQ,iBAAiB;AAAA,QACvC,UAAU,QAAQ;AAAA,MACpB,EAAE;AAAA,IACJ,EAAE;AAAA,IACF,YAAY,IAAI,WAAW,IAAI,CAAC,WAAW,WAAW;AAAA,MACpD,IAAI,UAAU,IAAI,KAAK,KAAK,aAAa;AAAA,MACzC,WAAW,UAAU,YAAY,KAAK,KAAK;AAAA,MAC3C,YAAY,UAAU,aAAa,KAAK,KAAK;AAAA,IAC/C,EAAE;AAAA,IACF,eAAe,IAAI,iBACf;AAAA,MACE,iBAAiB,IAAI,eAAe,qBAAqB;AAAA,MACzD,mBAAmB,IAAI,eAAe,uBAAuB;AAAA,MAC7D,yBACE,IAAI,eAAe,8BAA8B;AAAA,IACrD,IACA;AAAA,IACJ,YAAY,IAAI,aAAa,CAAC,GAAG,IAAI,CAAC,cAAc;AAAA,MAClD,MAAM,SAAS,QAAQ;AAAA,MACvB,kBAAkB,SAAS,qBAAqB;AAAA,IAClD,EAAE;AAAA,EACJ;AAAA;AAGF,SAAS,UAAU,CAAC,KAAmD;AAAA,EACrE,OAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,SAAS,IAAI;AAAA,IACb,QAAQ,IAAI;AAAA,IACZ,UAAU,IAAI;AAAA,IACd,QAAQ,IAAI;AAAA,IACZ,MAAM,IAAI;AAAA,IACV,eAAe,IAAI,kBAAkB;AAAA,IACrC,WAAW,IAAI,cAAc;AAAA,EAC/B;AAAA;AAsBF,SAAS,aAAa,CAAC,UAAmC;AAAA,EACxD,IACE,aAAa,QACb,OAAO,aAAa,YACpB,EAAE,WAAW,WACb;AAAA,IACA,MAAM,IAAI,MACR,sGACF;AAAA,EACF;AAAA,EACA,MAAM,OAAQ,SAA2B;AAAA,EACzC,MAAM,OAAO,MAAM;AAAA,EACnB,IACE,CAAC,QACD,OAAO,KAAK,cAAc,YAC1B,OAAO,KAAK,uBAAuB,YACnC,OAAO,KAAK,qBAAqB,UACjC;AAAA,IACA,MAAM,IAAI,MACR,gGACF;AAAA,EACF;AAAA,EACA,MAAM,WAAW,KAAK;AAAA,EACtB,MAAM,iBAAiB,KAAK;AAAA,EAC5B,MAAM,gBAAgB,WAAW,IAAI,iBAAiB,WAAW;AAAA,EACjE,OAAO;AAAA,IACL;AAAA,IACA,kBAAkB,KAAK;AAAA,IACvB;AAAA,IACA;AAAA,IACA,SAAS;AAAA,EACX;AAAA;AAmBF,eAAe,WAAc,CAC3B,MAC+B;AAAA,EAC/B,QAAQ,QAAQ,QAAQ,YAAY,gBAAgB,MAAM,cAAc;AAAA,EAExE,MAAM,UAAU,OAAO,SAAS;AAAA,EAChC,MAAM,MAAM,UACR,GAAG,OAAO,qBAAqB,KAAK,mBACpC,GAAG,iBAAiB,IAAI;AAAA,EAE5B,MAAM,UAAU,UACZ,EAAE,gBAAgB,oBAAoB,QAAQ,mBAAmB,IACjE,aAAa,OAAO,UAAU,EAAE;AAAA,EAEpC,MAAM,OAAO;AAAA,EAEb,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,WAAW,MAAM,MAAM,KAAK;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,MAAM,SAAS,YAAY,KAAK,UAAU,IAAI,IAAI;AAAA,MAClD,QAAQ,YAAY,QAAQ,KAAM;AAAA,IACpC,CAAC;AAAA,IACD,OAAO,OAAO;AAAA,IACd,MAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACjE,QAAO,MACL;AAAA,MACE,UAAU;AAAA,MACV,aAAa;AAAA,MACb;AAAA,MACA,MAAM,OAAO;AAAA,MACb,KAAK,iBAAiB,QAAQ,QAAQ;AAAA,IACxC,GACA,8BAA8B,4BAA4B,KAC5D;AAAA,IACA,KAAK,QAAQ,EAAE,OAAO,WAAW,gBAAgB,CAAC;AAAA,IAClD,MAAM,IAAI,MAAM,UAAU,qBAAqB,KAAK;AAAA;AAAA,EAGtD,IAAI,SAAS,WAAW,OAAO,SAAS;AAAA,IAMtC,MAAM,eAAe,MAAM,kBAAkB,QAAQ;AAAA,IACrD,QAAO,KACL;AAAA,MACE,UAAU;AAAA,MACV,aAAa;AAAA,MACb;AAAA,MACA,MAAM,OAAO;AAAA,MACb,YAAY;AAAA,MACZ,kBAAkB,cAAc,UAAU;AAAA,IAC5C,GACA,8BAA8B,yCAChC;AAAA,IACA,KAAK,QAAQ,EAAE,YAAY,KAAK,WAAW,mBAAmB,CAAC;AAAA,IAC/D,IAAI,CAAC,gBAAgB,aAAa,WAAW,GAAG;AAAA,MAC9C,MAAM,IAAI,qBACR,CAAC,GACD,UAAU,oFACZ;AAAA,IACF;AAAA,IACA,MAAM,IAAI,qBAAqB,YAAY;AAAA,EAC7C;AAAA,EAEA,IAAI,CAAC,SAAS,IAAI;AAAA,IAChB,MAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AAAA,IACtD,MAAM,WAAW,aAAa,QAAQ,SAAS;AAAA,IAC/C,QAAO,KACL;AAAA,MACE,UAAU;AAAA,MACV,aAAa;AAAA,MACb;AAAA,MACA,MAAM,OAAO;AAAA,MACb,YAAY,SAAS;AAAA,IACvB,GACA,8BAA8B,yBAAyB,UACzD;AAAA,IACA,KAAK,QAAQ,EAAE,YAAY,SAAS,QAAQ,WAAW,aAAa,CAAC;AAAA,IACrE,MAAM,IAAI,MACR,UAAU,qBAAqB,SAAS,YAAY,UACtD;AAAA,EACF;AAAA,EAEA,MAAM,UAAW,MAAM,SAAS,KAAK;AAAA,EACrC,KAAK,QAAQ,EAAE,YAAY,SAAS,OAAO,CAAC;AAAA,EAE5C,MAAM,OAAO,UAAU,cAAc,OAAO,IAAI;AAAA,EAChD,OAAO,EAAE,MAAM,SAAS,KAAK;AAAA;AAc/B,eAAsB,aAAa,CACjC,SACA,QAC8B;AAAA,EAC9B,MAAM,iBAAiB,UAAU,wBAAwB;AAAA,EACzD,MAAM,iBAAiB,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,cAAc,CAAC,CAAC;AAAA,EAEtE,MAAM,SAID;AAAA,IACH;AAAA,MACE,QAAQ,QAAQ,OAAO,YAAY,EAAE,KAAK;AAAA,MAC1C,aAAa,QAAQ,YAAY,YAAY,EAAE,KAAK;AAAA,MACpD,gBAAgB,QAAQ;AAAA,IAC1B;AAAA,EACF;AAAA,EACA,IAAI,QAAQ,YAAY;AAAA,IACtB,OAAO,KAAK;AAAA,MACV,QAAQ,QAAQ,YAAY,YAAY,EAAE,KAAK;AAAA,MAC/C,aAAa,QAAQ,OAAO,YAAY,EAAE,KAAK;AAAA,MAC/C,gBAAgB,QAAQ;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,cAAc;AAAA,IAClB,MAAM;AAAA,MACJ;AAAA,MACA,YAAY,MAAM,KAAK,EAAE,QAAQ,eAAe,GAAG,OAAO;AAAA,QACxD,MAAM;AAAA,MACR,EAAE;AAAA,MACF,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEA,QAAO,KACL;AAAA,IACE,UAAU;AAAA,IACV,aAAa;AAAA,IACb,QAAQ,QAAQ;AAAA,IAChB,aAAa,QAAQ;AAAA,EACvB,GACA,yCAAyC,QAAQ,YAAW,QAAQ,kBAAkB,QAAQ,eAChG;AAAA,EAEA,QAAQ,MAAM,cAAc,SAC1B,MAAM,YAAwC;AAAA,IAC5C,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,MAAM;AAAA,IACN,WAAW;AAAA,EACb,CAAC;AAAA,EAEH,MAAM,SAAS,aAAa,KAAK,OAAO,IAAI,QAAQ;AAAA,EAEpD,QAAO,KACL;AAAA,IACE,UAAU;AAAA,IACV,aAAa;AAAA,IACb,gBAAgB,aAAa,KAAK;AAAA,IAClC,YAAY,OAAO;AAAA,IACnB,SAAS,KAAK;AAAA,EAChB,GACA,uCAAuC,OAAO,6BAA6B,aAAa,KAAK,IAC/F;AAAA,EAEA,OAAO;AAAA,IACL,gBAAgB,aAAa,KAAK;AAAA,IAClC;AAAA,IACA;AAAA,EACF;AAAA;AAUF,eAAsB,QAAQ,CAC5B,IACA,QACsB;AAAA,EACtB,MAAM,iBAAiB,UAAU,wBAAwB;AAAA,EAEzD,IAAI,CAAC,MAAM,GAAG,KAAK,EAAE,WAAW,GAAG;AAAA,IACjC,MAAM,IAAI,MAAM,uCAAuC;AAAA,EACzD;AAAA,EAEA,QAAQ,MAAM,iBAAiB,MAAM,YAAiC;AAAA,IACpE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,YAAY,eAAe,mBAAmB,GAAG,KAAK,CAAC;AAAA,IACvD,gBAAgB,6CAA6C,mBAAmB,GAAG,KAAK,CAAC;AAAA,IACzF,WAAW;AAAA,EACb,CAAC;AAAA,EAED,OAAO,SAAS,aAAa,IAAI;AAAA;AAGnC,eAAsB,WAAW,CAC/B,SACA,QACsB;AAAA,EACtB,MAAM,iBAAiB,UAAU,wBAAwB;AAAA,EACzD,IAAI,QAAQ,eAAe,WAAW,GAAG;AAAA,IACvC,MAAM,IAAI,MACR,4DACF;AAAA,EACF;AAAA,EACA,IAAI,QAAQ,WAAW,WAAW,GAAG;AAAA,IACnC,MAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AAAA,EAEA,MAAM,OAAgC;AAAA,IACpC,MAAM,QAAQ;AAAA,IACd,iBAAiB,CAAC,GAAG,QAAQ,cAAc;AAAA,IAC3C,YAAY,QAAQ,WAAW,IAAI,CAAC,eAAe;AAAA,MACjD,IAAI,UAAU;AAAA,MACd,OAAO,UAAU;AAAA,MACjB,QAAQ,UAAU;AAAA,MAClB,YAAY,UAAU;AAAA,MACtB,aAAa,UAAU;AAAA,MACvB,SAAS,UAAU;AAAA,MACnB,OAAO,UAAU;AAAA,MACjB,cAAc,UAAU;AAAA,IAC1B,EAAE;AAAA,EACJ;AAAA,EACA,IAAI,QAAQ,SAAS;AAAA,IACnB,KAAK,WAAW;AAAA,MACd;AAAA,QACE,MAAM,QAAQ,QAAQ;AAAA,QACtB,QAAQ,QAAQ,QAAQ;AAAA,QACxB,UAAU,QAAQ,QAAQ;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA,EACA,IAAI,QAAQ,YAAY,OAAO,KAAK,QAAQ,QAAQ,EAAE,SAAS,GAAG;AAAA,IAChE,KAAK,WAAW,QAAQ;AAAA,EAC1B;AAAA,EAEA,QAAQ,MAAM,aAAa,MAAM,YAAiC;AAAA,IAChE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,MAAM,EAAE,KAAK;AAAA,IACb,WAAW;AAAA,EACb,CAAC;AAAA,EAED,OAAO,SAAS,SAAS,IAAI;AAAA;AAG/B,eAAsB,QAAQ,CAC5B,SACA,QACsB;AAAA,EACtB,MAAM,iBAAiB,UAAU,wBAAwB;AAAA,EACzD,IAAI,CAAC,WAAW,QAAQ,KAAK,EAAE,WAAW,GAAG;AAAA,IAC3C,MAAM,IAAI,MAAM,uCAAuC;AAAA,EACzD;AAAA,EAEA,QAAQ,MAAM,aAAa,MAAM,YAAiC;AAAA,IAChE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,YAAY,eAAe,mBAAmB,QAAQ,KAAK,CAAC;AAAA,IAC5D,gBAAgB,6CAA6C,mBAAmB,QAAQ,KAAK,CAAC;AAAA,IAC9F,WAAW;AAAA,EACb,CAAC;AAAA,EAED,OAAO,SAAS,SAAS,IAAI;AAAA;AAG/B,eAAsB,aAAa,CACjC,MAKA,QACwB;AAAA,EACxB,MAAM,iBAAiB,UAAU,wBAAwB;AAAA,EACzD,IAAI,KAAK,QAAQ,KAAK,EAAE,WAAW,GAAG;AAAA,IACpC,MAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAAA,EACA,IAAI,KAAK,OAAO,KAAK,EAAE,WAAW,GAAG;AAAA,IACnC,MAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AAAA,EACA,IAAI,KAAK,SAAS,KAAK,EAAE,WAAW,GAAG;AAAA,IACrC,MAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAAA,EAEA,QAAQ,MAAM,aAAa,MAAM,YAAmC;AAAA,IAClE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM;AAAA,QACJ,UAAU,KAAK,QAAQ,KAAK;AAAA,QAC5B,SAAS;AAAA,UACP,MAAM;AAAA,UACN,QAAQ,KAAK,OAAO,KAAK;AAAA,UACzB,UAAU,KAAK,SAAS,KAAK,EAAE,YAAY;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAAA,IACA,WAAW;AAAA,EACb,CAAC;AAAA,EAED,OAAO,WAAW,SAAS,IAAI;AAAA;;;AC70BjC;AAUA,IAAM,sCAAsC;AAAA;AAErC,MAAM,uCAAuC,MAAM;AAAA,EAEtC;AAAA,EADlB,WAAW,CACO,QAChB,SACA;AAAA,IACA,MAAM,OAAO;AAAA,IAHG;AAAA,IAIhB,KAAK,OAAO;AAAA;AAEhB;AA6BA,SAAS,uBAAuB,CAAC,OAAiD;AAAA,EAChF,MAAM,UAAU,OAAO,KAAK;AAAA,EAC5B,OAAO,WAAW,QAAQ,SAAS,IAAI,UAAU;AAAA;AAG5C,SAAS,kCAAkC,CAChD,OACe;AAAA,EACf,MAAM,UAAU,wBAAwB,KAAK;AAAA,EAC7C,IAAI,CAAC,SAAS;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,OAAO,QAAQ,YAAY,MAAM,eAAe,OAAO;AAAA;AAGlD,SAAS,gCAAgC,CAC9C,SAAyC,CAAC,GACP;AAAA,EACnC,MAAM,gBAAgB,wBAAwB,OAAO,aAAa;AAAA,EAClE,IAAI,eAAe;AAAA,IACjB,OAAO;AAAA,MACL,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,SAAS,cAAc,QAAQ,QAAQ,EAAE;AAAA,MACzC,aACE,mCAAmC,OAAO,iBAAiB,KAC3D,mCAAmC,QAAQ,IAAI,yBAAyB;AAAA,IAC5E;AAAA,EACF;AAAA,EAEA,MAAM,SACJ,mCAAmC,OAAO,MAAM,KAChD,mCAAmC,QAAQ,IAAI,qBAAqB;AAAA,EACtE,MAAM,UACJ,mCAAmC,OAAO,OAAO,KACjD,mCAAmC,QAAQ,IAAI,sBAAsB;AAAA,EACvE,IAAI,CAAC,UAAU,CAAC,SAAS;AAAA,IACvB,OAAO;AAAA,MACL,YAAY;AAAA,MACZ,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,YAAY,uBACV,wBAAwB,OAAO,OAAO,KAAK,QAAQ,IAAI,sBACzD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAGF,SAAS,kBAAkB,GAAgB;AAAA,EACzC,OAAO,YAAY,QAAQ,mCAAmC;AAAA;AAGhE,eAAe,gBAAmB,CAAC,UAAgC;AAAA,EACjE,IAAI,CAAC,SAAS,IAAI;AAAA,IAChB,IAAI,SAAS,GAAG,SAAS,UAAU,SAAS,aAAa,KAAK;AAAA,IAC9D,MAAM,OAAO,MAAM,SAAS,KAAK;AAAA,IACjC,MAAM,UAAU,KAAK,KAAK;AAAA,IAC1B,IAAI,QAAQ,SAAS,GAAG;AAAA,MACtB,IAAI;AAAA,QACF,MAAM,SAAS,KAAK,MAAM,OAAO;AAAA,QAIjC,SAAS,OAAO,WAAW,OAAO,SAAS;AAAA,QAC3C,MAAM;AAAA,QACN,SAAS,QAAQ,MAAM,GAAG,GAAG;AAAA;AAAA,IAEjC;AAAA,IACA,MAAM,IAAI,+BAA+B,SAAS,QAAQ,MAAM;AAAA,EAClE;AAAA,EACA,OAAQ,MAAM,SAAS,KAAK;AAAA;AAGvB,SAAS,iCAAiC,CAAC,QAAyB;AAAA,EACzE,OAAO,sBAAsB,MAAM;AAAA;AAAA;AAG9B,MAAM,0BAA0B;AAAA,EAElB;AAAA,EADnB,WAAW,CACQ,eAGf,kCACF;AAAA,IAJiB;AAAA;AAAA,EAMX,SAAS,GAAsC;AAAA,IACrD,OAAO,OAAO,KAAK,iBAAiB,aAChC,KAAK,aAAa,IAClB,KAAK;AAAA;AAAA,MAGP,UAAU,GAAY;AAAA,IACxB,OAAO,KAAK,UAAU,EAAE;AAAA;AAAA,EAGlB,aAAa,GAGnB;AAAA,IACA,MAAM,SAAS,KAAK,UAAU;AAAA,IAC9B,IAAI,CAAC,OAAO,YAAY;AAAA,MACtB,MAAM,IAAI,+BACR,KACA,0CACF;AAAA,IACF;AAAA,IACA,OAAO;AAAA;AAAA,EAGD,WAAW,CAAC,UAA0B;AAAA,IAC5C,MAAM,SAAS,KAAK,cAAc;AAAA,IAClC,MAAM,iBAAiB,SAAS,QAAQ,QAAQ,EAAE;AAAA,IAClD,IAAI,OAAO,SAAS,UAAU;AAAA,MAC5B,OAAO,IAAI,IACT,wBAAwB,kBACxB,GAAG,OAAO,QAAQ,QAAQ,QAAQ,EAAE,IACtC,EAAE,SAAS;AAAA,IACb;AAAA,IACA,OAAO,IAAI,IACT,gBAAgB,mBAAmB,OAAO,OAAO,sBAAsB,kBACvE,GAAG,OAAO,WAAW,QAAQ,QAAQ,EAAE,IACzC,EAAE,SAAS;AAAA;AAAA,EAGL,cAAc,CACpB,aACwB;AAAA,IACxB,MAAM,SAAS,KAAK,cAAc;AAAA,IAClC,MAAM,UAAkC;AAAA,MACtC,QAAQ;AAAA,MACR,gBAAgB;AAAA,IAClB;AAAA,IACA,IAAI,OAAO,SAAS,SAAS;AAAA,MAC3B,QAAQ,eAAe,OAAO;AAAA,IAChC;AAAA,IACA,IAAI,OAAO,SAAS,YAAY,OAAO,aAAa;AAAA,MAClD,QAAQ,gBAAgB,UAAU,OAAO;AAAA,IAC3C;AAAA,IACA,IAAI,uBAAuB,SAAS;AAAA,MAClC,YAAY,KAAK,UAAU,YAAY,QAAQ,GAAG;AAAA,QAChD,QAAQ,OAAO;AAAA,MACjB;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IACA,IAAI,MAAM,QAAQ,WAAW,GAAG;AAAA,MAC9B,YAAY,KAAK,UAAU,aAAa;AAAA,QACtC,QAAQ,OAAO;AAAA,MACjB;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IACA,OAAO;AAAA,SACF;AAAA,SACC,eAAe,CAAC;AAAA,IACtB;AAAA;AAAA,OAGY,QAAU,CAAC,UAAkB,MAA+B;AAAA,IACxE,MAAM,WAAW,MAAM,MAAM,KAAK,YAAY,QAAQ,GAAG;AAAA,SACpD;AAAA,MACH,SAAS,KAAK,eAAe,KAAK,OAAO;AAAA,MACzC,QAAQ,KAAK,UAAU,mBAAmB;AAAA,IAC5C,CAAC;AAAA,IACD,OAAO,iBAAoB,QAAQ;AAAA;AAAA,OAG/B,iBAAgB,CACpB,SACkD;AAAA,IAClD,OAAO,KAAK,QACV,gBACA;AAAA,MACE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC9B,CACF;AAAA;AAAA,OAGI,eAAc,CAClB,UACA,QAAyC,SACO;AAAA,IAChD,MAAM,QAAQ,IAAI,gBAAgB,EAAE,UAAU,MAAM,CAAC;AAAA,IACrD,OAAO,KAAK,QACV,gBAAgB,MAAM,SAAS,KAC/B;AAAA,MACE,QAAQ;AAAA,IACV,CACF;AAAA;AAEJ;;;ACxOO,IAAM,gCAAgC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKO,IAAM,uCAAuC;AAAA,EAClD;AAAA,EACA;AACF;AAKO,IAAM,gCAAgC,CAAC,SAAS,OAAO;;;AChC9D;AAKA;AASO,SAAS,yBAAyB,CACvC,OACe;AAAA,EACf,MAAM,UAAU,OAAO,KAAK;AAAA,EAC5B,IAAI,CAAC;AAAA,IAAS,OAAO;AAAA,EACrB,OAAO,QAAQ,YAAY,MAAM,eAAe,OAAO;AAAA;AAGlD,SAAS,uCAAuC,CACrD,MACE,OAAO,YAAY,cAAc,CAAC,IAAI,QAAQ,KACjB;AAAA,EAC/B,MAAM,SAAS,0BAA0B,IAAI,qBAAqB;AAAA,EAClE,MAAM,UAAU,IAAI;AAAA,EACpB,OAAO;AAAA,IACL,YAAY,QAAQ,MAAM;AAAA,IAC1B;AAAA,IACA,YAAY,uBAAuB,OAAO;AAAA,IAC1C,SAAS,sBAAsB,OAAO;AAAA,EACxC;AAAA;AAGF,IAAM,2BAA2B;AACjC,IAAM,4BAA4B;AAAA;AAI3B,MAAM,gCAAgC,MAAM;AAAA,EAE/B;AAAA,EADlB,WAAW,CACO,QAChB,SACA;AAAA,IACA,MAAM,OAAO;AAAA,IAHG;AAAA,IAIhB,KAAK,OAAO;AAAA;AAEhB;AAAA;AAEO,MAAM,iCAAiC,MAAM;AAAA,EAEhC;AAAA,EAEA;AAAA,EAHlB,WAAW,CACO,QAChB,SACgB,WAAgC,MAChD;AAAA,IACA,MAAM,OAAO;AAAA,IAJG;AAAA,IAEA;AAAA,IAGhB,KAAK,OAAO;AAAA;AAEhB;AAEA,eAAe,aAAgB,CAAC,UAAgC;AAAA,EAC9D,IAAI,CAAC,SAAS,IAAI;AAAA,IAChB,IAAI,SAAS,GAAG,SAAS,UAAU,SAAS,aAAa,KAAK;AAAA,IAC9D,MAAM,OAAO,MAAM,SAAS,KAAK;AAAA,IACjC,IAAI,KAAK,KAAK,EAAE,SAAS,GAAG;AAAA,MAC1B,IAAI;AAAA,QACF,MAAM,SAAS,KAAK,MAAM,IAAI;AAAA,QAI9B,SAAS,OAAO,WAAW,OAAO,SAAS,KAAK,MAAM,GAAG,GAAG;AAAA,QAC5D,MAAM;AAAA,QACN,SAAS,KAAK,MAAM,GAAG,GAAG;AAAA;AAAA,IAE9B;AAAA,IACA,MAAM,IAAI,wBAAwB,SAAS,QAAQ,MAAM;AAAA,EAC3D;AAAA,EACA,OAAQ,MAAM,SAAS,KAAK;AAAA;AAG9B,eAAe,cAAiB,CAAC,UAAgC;AAAA,EAC/D,IAAI,CAAC,SAAS,IAAI;AAAA,IAChB,IAAI,SAAS,GAAG,SAAS,UAAU,SAAS,aAAa,KAAK;AAAA,IAC9D,IAAI,WAAgC;AAAA,IACpC,MAAM,OAAO,MAAM,SAAS,KAAK;AAAA,IACjC,IAAI,KAAK,KAAK,EAAE,SAAS,GAAG;AAAA,MAC1B,IAAI;AAAA,QACF,MAAM,SAAS,KAAK,MAAM,IAAI;AAAA,QAK9B,SAAS,OAAO,WAAW,OAAO,SAAS,KAAK,MAAM,GAAG,GAAG;AAAA,QAC5D,WAAW,OAAO,YAAY;AAAA,QAC9B,MAAM;AAAA,QACN,SAAS,KAAK,MAAM,GAAG,GAAG;AAAA;AAAA,IAE9B;AAAA,IACA,MAAM,IAAI,yBAAyB,SAAS,QAAQ,QAAQ,QAAQ;AAAA,EACtE;AAAA,EACA,OAAQ,MAAM,SAAS,KAAK;AAAA;AAAA;AAoDvB,MAAM,mBAAmB;AAAA,EAEX;AAAA,EADnB,WAAW,CACQ,eACf,yCACF;AAAA,IAFiB;AAAA;AAAA,EAIX,aAAa,GAAuD;AAAA,IAC1E,MAAM,SAAS,KAAK,aAAa;AAAA,IACjC,IAAI,CAAC,OAAO,QAAQ;AAAA,MAClB,MAAM,IAAI,wBAAwB,KAAK,+BAA+B;AAAA,IACxE;AAAA,IACA,OAAO,KAAK,QAAQ,QAAQ,OAAO,OAAO;AAAA;AAAA,MAGxC,UAAU,GAAY;AAAA,IACxB,OAAO,KAAK,aAAa,EAAE;AAAA;AAAA,OAGvB,gBAAe,GAAoC;AAAA,IACvD,MAAM,SAAS,KAAK,cAAc;AAAA,IAClC,MAAM,WAAW,MAAM,MACrB,GAAG,OAAO,wCACV;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,OAAO;AAAA,QAChC,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM;AAAA,MACN,QAAQ,YAAY,QAAQ,wBAAwB;AAAA,IACtD,CACF;AAAA,IACA,OAAO,cAAsC,QAAQ;AAAA;AAAA,OAGjD,oBAAmB,CAAC,MAES;AAAA,IACjC,MAAM,SAAS,KAAK,cAAc;AAAA,IAClC,MAAM,WAAW,MAAM,MACrB,GAAG,OAAO,sCACV;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,OAAO;AAAA,QAChC,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,aAAa,KAAK,YAAY,CAAC;AAAA,MACtD,QAAQ,YAAY,QAAQ,wBAAwB;AAAA,IACtD,CACF;AAAA,IACA,OAAO,cAAqC,QAAQ;AAAA;AAAA,OAGhD,iBAAgB,CAAC,MAIQ;AAAA,IAC7B,MAAM,SAAS,KAAK,cAAc;AAAA,IAClC,MAAM,WAAW,MAAM,MAAM,GAAG,OAAO,kCAAkC;AAAA,MACvE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,OAAO;AAAA,QAChC,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,aAAa,KAAK;AAAA,QAClB,QAAQ,KAAK,UAAU;AAAA,QACvB,OAAO,KAAK,SAAS;AAAA,MACvB,CAAC;AAAA,MACD,QAAQ,YAAY,QAAQ,2BAA2B,CAAC;AAAA,IAC1D,CAAC;AAAA,IACD,OAAO,cAAiC,QAAQ;AAAA;AAEpD;AAAA;AA+CO,MAAM,oBAAoB;AAAA,EAEZ;AAAA,EADnB,WAAW,CACQ,eACf,yCACF;AAAA,IAFiB;AAAA;AAAA,EAIX,aAAa,GAAuD;AAAA,IAC1E,MAAM,SAAS,KAAK,aAAa;AAAA,IACjC,IAAI,CAAC,OAAO,QAAQ;AAAA,MAClB,MAAM,IAAI,yBAAyB,KAAK,+BAA+B;AAAA,IACzE;AAAA,IACA,OAAO,KAAK,QAAQ,QAAQ,OAAO,OAAO;AAAA;AAAA,MAGxC,UAAU,GAAY;AAAA,IACxB,OAAO,KAAK,aAAa,EAAE;AAAA;AAAA,OAGvB,kBAAiB,CAAC,MAEgB;AAAA,IACtC,MAAM,SAAS,KAAK,cAAc;AAAA,IAClC,MAAM,WAAW,MAAM,MACrB,GAAG,OAAO,wCACV;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,OAAO;AAAA,QAChC,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,OAAO,KAAK,MAAM,CAAC;AAAA,MAC1C,QAAQ,YAAY,QAAQ,yBAAyB;AAAA,IACvD,CACF;AAAA,IACA,OAAO,eAA2C,QAAQ;AAAA;AAAA,OAGtD,aAAY,CAAC,MAAyD;AAAA,IAC1E,MAAM,SAAS,KAAK,cAAc;AAAA,IAClC,MAAM,WAAW,MAAM,MACrB,GAAG,OAAO,uCACV;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,OAAO;AAAA,QAChC,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,MAAM,KAAK,KAAK,CAAC;AAAA,MACxC,QAAQ,YAAY,QAAQ,yBAAyB;AAAA,IACvD,CACF;AAAA,IACA,OAAO,eAAuC,QAAQ;AAAA;AAAA,OAGlD,mBAAkB,CAAC,MAKtB;AAAA,IACD,MAAM,SAAS,KAAK,cAAc;AAAA,IAClC,MAAM,WAAW,MAAM,MACrB,GAAG,OAAO,sCACV;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,OAAO;AAAA,QAChC,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,cAAc,KAAK,aAAa,CAAC;AAAA,MACxD,QAAQ,YAAY,QAAQ,yBAAyB;AAAA,IACvD,CACF;AAAA,IACA,OAAO,eAAe,QAAQ;AAAA;AAAA,OAG1B,mBAAkB,CAAC,MAKe;AAAA,IACtC,MAAM,SAAS,KAAK,cAAc;AAAA,IAClC,MAAM,WAAW,MAAM,MACrB,GAAG,OAAO,2CACV;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,OAAO;AAAA,QAChC,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,MACzB,QAAQ,YAAY,QAAQ,4BAA4B,CAAC;AAAA,IAC3D,CACF;AAAA,IACA,OAAO,eAA2C,QAAQ;AAAA;AAE9D;;;AC1WA;AA0BA;",
|
|
22
|
+
"debugId": "4E32E0FBB0A20BF564756E2164756E21",
|
|
23
|
+
"names": []
|
|
24
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { GetLifeOpsScheduleMergedStateResponse, SyncLifeOpsScheduleObservationsRequest, SyncLifeOpsScheduleObservationsResponse } from "./lifeops-schedule-sync-contracts.js";
|
|
2
|
+
export declare class LifeOpsScheduleSyncClientError extends Error {
|
|
3
|
+
readonly status: number;
|
|
4
|
+
constructor(status: number, message: string);
|
|
5
|
+
}
|
|
6
|
+
export type ResolvedLifeOpsScheduleSyncConfig = {
|
|
7
|
+
configured: false;
|
|
8
|
+
mode: "none";
|
|
9
|
+
} | {
|
|
10
|
+
configured: true;
|
|
11
|
+
mode: "remote";
|
|
12
|
+
baseUrl: string;
|
|
13
|
+
accessToken: string | null;
|
|
14
|
+
} | {
|
|
15
|
+
configured: true;
|
|
16
|
+
mode: "cloud";
|
|
17
|
+
apiBaseUrl: string;
|
|
18
|
+
apiKey: string;
|
|
19
|
+
agentId: string;
|
|
20
|
+
};
|
|
21
|
+
export interface LifeOpsScheduleSyncConfigInput {
|
|
22
|
+
remoteApiBase?: string | null;
|
|
23
|
+
remoteAccessToken?: string | null;
|
|
24
|
+
apiKey?: string | null;
|
|
25
|
+
baseUrl?: string | null;
|
|
26
|
+
agentId?: string | null;
|
|
27
|
+
}
|
|
28
|
+
export declare function normalizeLifeOpsScheduleSyncSecret(value: string | null | undefined): string | null;
|
|
29
|
+
export declare function resolveLifeOpsScheduleSyncConfig(config?: LifeOpsScheduleSyncConfigInput): ResolvedLifeOpsScheduleSyncConfig;
|
|
30
|
+
export declare function resolveLifeOpsScheduleSyncSiteUrl(rawUrl?: string): string;
|
|
31
|
+
export declare class LifeOpsScheduleSyncClient {
|
|
32
|
+
private readonly configSource;
|
|
33
|
+
constructor(configSource?: ResolvedLifeOpsScheduleSyncConfig | (() => ResolvedLifeOpsScheduleSyncConfig));
|
|
34
|
+
private getConfig;
|
|
35
|
+
get configured(): boolean;
|
|
36
|
+
private requireConfig;
|
|
37
|
+
private resolvePath;
|
|
38
|
+
private requestHeaders;
|
|
39
|
+
private request;
|
|
40
|
+
syncObservations(request: SyncLifeOpsScheduleObservationsRequest): Promise<SyncLifeOpsScheduleObservationsResponse>;
|
|
41
|
+
getMergedState(timezone: string, scope?: "local" | "cloud" | "effective"): Promise<GetLifeOpsScheduleMergedStateResponse>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=lifeops-schedule-sync-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifeops-schedule-sync-client.d.ts","sourceRoot":"","sources":["../../src/cloud/lifeops-schedule-sync-client.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,qCAAqC,EACrC,sCAAsC,EACtC,uCAAuC,EACxC,MAAM,sCAAsC,CAAC;AAI9C,qBAAa,8BAA+B,SAAQ,KAAK;aAErC,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EAC9B,OAAO,EAAE,MAAM;CAKlB;AAED,MAAM,MAAM,iCAAiC,GACzC;IACE,UAAU,EAAE,KAAK,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,UAAU,EAAE,IAAI,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,GACD;IACE,UAAU,EAAE,IAAI,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEN,MAAM,WAAW,8BAA8B;IAC7C,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAOD,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,MAAM,GAAG,IAAI,CAMf;AAED,wBAAgB,gCAAgC,CAC9C,MAAM,GAAE,8BAAmC,GAC1C,iCAAiC,CAmCnC;AA2BD,wBAAgB,iCAAiC,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED,qBAAa,yBAAyB;IAElC,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,GACzB,iCAAiC,GACjC,CAAC,MAAM,iCAAiC,CACV;IAGpC,OAAO,CAAC,SAAS;IAMjB,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,cAAc;YAgCR,OAAO;IASf,gBAAgB,CACpB,OAAO,EAAE,sCAAsC,GAC9C,OAAO,CAAC,uCAAuC,CAAC;IAU7C,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,GAAE,OAAO,GAAG,OAAO,GAAG,WAAqB,GAC/C,OAAO,CAAC,qCAAqC,CAAC;CASlD"}
|
|
@@ -0,0 +1,180 @@
|
|
|
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/base-url.ts
|
|
20
|
+
import { normalizeCloudSiteUrl, resolveCloudApiBaseUrl } from "@elizaos/shared";
|
|
21
|
+
var init_base_url = () => {};
|
|
22
|
+
|
|
23
|
+
// src/cloud/lifeops-schedule-sync-client.ts
|
|
24
|
+
init_base_url();
|
|
25
|
+
var LIFEOPS_SCHEDULE_REQUEST_TIMEOUT_MS = 20000;
|
|
26
|
+
|
|
27
|
+
class LifeOpsScheduleSyncClientError extends Error {
|
|
28
|
+
status;
|
|
29
|
+
constructor(status, message) {
|
|
30
|
+
super(message);
|
|
31
|
+
this.status = status;
|
|
32
|
+
this.name = "LifeOpsScheduleSyncClientError";
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function normalizeOptionalString(value) {
|
|
36
|
+
const trimmed = value?.trim();
|
|
37
|
+
return trimmed && trimmed.length > 0 ? trimmed : null;
|
|
38
|
+
}
|
|
39
|
+
function normalizeLifeOpsScheduleSyncSecret(value) {
|
|
40
|
+
const trimmed = normalizeOptionalString(value);
|
|
41
|
+
if (!trimmed) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
return trimmed.toUpperCase() === "[REDACTED]" ? null : trimmed;
|
|
45
|
+
}
|
|
46
|
+
function resolveLifeOpsScheduleSyncConfig(config = {}) {
|
|
47
|
+
const remoteApiBase = normalizeOptionalString(config.remoteApiBase);
|
|
48
|
+
if (remoteApiBase) {
|
|
49
|
+
return {
|
|
50
|
+
configured: true,
|
|
51
|
+
mode: "remote",
|
|
52
|
+
baseUrl: remoteApiBase.replace(/\/+$/, ""),
|
|
53
|
+
accessToken: normalizeLifeOpsScheduleSyncSecret(config.remoteAccessToken) ?? normalizeLifeOpsScheduleSyncSecret(process.env.ELIZA_REMOTE_ACCESS_TOKEN)
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const apiKey = normalizeLifeOpsScheduleSyncSecret(config.apiKey) ?? normalizeLifeOpsScheduleSyncSecret(process.env.ELIZAOS_CLOUD_API_KEY);
|
|
57
|
+
const agentId = normalizeLifeOpsScheduleSyncSecret(config.agentId) ?? normalizeLifeOpsScheduleSyncSecret(process.env.ELIZAOS_CLOUD_AGENT_ID);
|
|
58
|
+
if (!apiKey || !agentId) {
|
|
59
|
+
return {
|
|
60
|
+
configured: false,
|
|
61
|
+
mode: "none"
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
configured: true,
|
|
66
|
+
mode: "cloud",
|
|
67
|
+
apiBaseUrl: resolveCloudApiBaseUrl(normalizeOptionalString(config.baseUrl) ?? process.env.ELIZAOS_CLOUD_BASE_URL),
|
|
68
|
+
apiKey,
|
|
69
|
+
agentId
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function buildTimeoutSignal() {
|
|
73
|
+
return AbortSignal.timeout(LIFEOPS_SCHEDULE_REQUEST_TIMEOUT_MS);
|
|
74
|
+
}
|
|
75
|
+
async function readJsonResponse(response) {
|
|
76
|
+
if (!response.ok) {
|
|
77
|
+
let detail = `${response.status} ${response.statusText}`.trim();
|
|
78
|
+
const text = await response.text();
|
|
79
|
+
const trimmed = text.trim();
|
|
80
|
+
if (trimmed.length > 0) {
|
|
81
|
+
try {
|
|
82
|
+
const parsed = JSON.parse(trimmed);
|
|
83
|
+
detail = parsed.message ?? parsed.error ?? trimmed;
|
|
84
|
+
} catch {
|
|
85
|
+
detail = trimmed.slice(0, 200);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
throw new LifeOpsScheduleSyncClientError(response.status, detail);
|
|
89
|
+
}
|
|
90
|
+
return await response.json();
|
|
91
|
+
}
|
|
92
|
+
function resolveLifeOpsScheduleSyncSiteUrl(rawUrl) {
|
|
93
|
+
return normalizeCloudSiteUrl(rawUrl);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
class LifeOpsScheduleSyncClient {
|
|
97
|
+
configSource;
|
|
98
|
+
constructor(configSource = resolveLifeOpsScheduleSyncConfig) {
|
|
99
|
+
this.configSource = configSource;
|
|
100
|
+
}
|
|
101
|
+
getConfig() {
|
|
102
|
+
return typeof this.configSource === "function" ? this.configSource() : this.configSource;
|
|
103
|
+
}
|
|
104
|
+
get configured() {
|
|
105
|
+
return this.getConfig().configured;
|
|
106
|
+
}
|
|
107
|
+
requireConfig() {
|
|
108
|
+
const config = this.getConfig();
|
|
109
|
+
if (!config.configured) {
|
|
110
|
+
throw new LifeOpsScheduleSyncClientError(409, "LifeOps schedule sync is not configured.");
|
|
111
|
+
}
|
|
112
|
+
return config;
|
|
113
|
+
}
|
|
114
|
+
resolvePath(pathname) {
|
|
115
|
+
const config = this.requireConfig();
|
|
116
|
+
const normalizedPath = pathname.replace(/^\/+/, "");
|
|
117
|
+
if (config.mode === "remote") {
|
|
118
|
+
return new URL(`api/lifeops/schedule/${normalizedPath}`, `${config.baseUrl.replace(/\/+$/, "")}/`).toString();
|
|
119
|
+
}
|
|
120
|
+
return new URL(`eliza/agents/${encodeURIComponent(config.agentId)}/lifeops/schedule/${normalizedPath}`, `${config.apiBaseUrl.replace(/\/+$/, "")}/`).toString();
|
|
121
|
+
}
|
|
122
|
+
requestHeaders(initHeaders) {
|
|
123
|
+
const config = this.requireConfig();
|
|
124
|
+
const headers = {
|
|
125
|
+
Accept: "application/json",
|
|
126
|
+
"Content-Type": "application/json"
|
|
127
|
+
};
|
|
128
|
+
if (config.mode === "cloud") {
|
|
129
|
+
headers["X-API-Key"] = config.apiKey;
|
|
130
|
+
}
|
|
131
|
+
if (config.mode === "remote" && config.accessToken) {
|
|
132
|
+
headers.Authorization = `Bearer ${config.accessToken}`;
|
|
133
|
+
}
|
|
134
|
+
if (initHeaders instanceof Headers) {
|
|
135
|
+
for (const [key, value] of initHeaders.entries()) {
|
|
136
|
+
headers[key] = value;
|
|
137
|
+
}
|
|
138
|
+
return headers;
|
|
139
|
+
}
|
|
140
|
+
if (Array.isArray(initHeaders)) {
|
|
141
|
+
for (const [key, value] of initHeaders) {
|
|
142
|
+
headers[key] = value;
|
|
143
|
+
}
|
|
144
|
+
return headers;
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
...headers,
|
|
148
|
+
...initHeaders ?? {}
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
async request(pathname, init) {
|
|
152
|
+
const response = await fetch(this.resolvePath(pathname), {
|
|
153
|
+
...init,
|
|
154
|
+
headers: this.requestHeaders(init.headers),
|
|
155
|
+
signal: init.signal ?? buildTimeoutSignal()
|
|
156
|
+
});
|
|
157
|
+
return readJsonResponse(response);
|
|
158
|
+
}
|
|
159
|
+
async syncObservations(request) {
|
|
160
|
+
return this.request("observations", {
|
|
161
|
+
method: "POST",
|
|
162
|
+
body: JSON.stringify(request)
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
async getMergedState(timezone, scope = "cloud") {
|
|
166
|
+
const query = new URLSearchParams({ timezone, scope });
|
|
167
|
+
return this.request(`merged-state?${query.toString()}`, {
|
|
168
|
+
method: "GET"
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
export {
|
|
173
|
+
resolveLifeOpsScheduleSyncSiteUrl,
|
|
174
|
+
resolveLifeOpsScheduleSyncConfig,
|
|
175
|
+
normalizeLifeOpsScheduleSyncSecret,
|
|
176
|
+
LifeOpsScheduleSyncClientError,
|
|
177
|
+
LifeOpsScheduleSyncClient
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
//# debugId=DB5EAEA978BD54A764756E2164756E21
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/cloud/base-url.ts", "../src/cloud/lifeops-schedule-sync-client.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 {\n normalizeCloudSiteUrl,\n resolveCloudApiBaseUrl,\n} from \"./base-url.js\";\nimport type {\n GetLifeOpsScheduleMergedStateResponse,\n SyncLifeOpsScheduleObservationsRequest,\n SyncLifeOpsScheduleObservationsResponse,\n} from \"./lifeops-schedule-sync-contracts.js\";\n\nconst LIFEOPS_SCHEDULE_REQUEST_TIMEOUT_MS = 20_000;\n\nexport class LifeOpsScheduleSyncClientError extends Error {\n constructor(\n public readonly status: number,\n message: string,\n ) {\n super(message);\n this.name = \"LifeOpsScheduleSyncClientError\";\n }\n}\n\nexport type ResolvedLifeOpsScheduleSyncConfig =\n | {\n configured: false;\n mode: \"none\";\n }\n | {\n configured: true;\n mode: \"remote\";\n baseUrl: string;\n accessToken: string | null;\n }\n | {\n configured: true;\n mode: \"cloud\";\n apiBaseUrl: string;\n apiKey: string;\n agentId: string;\n };\n\nexport interface LifeOpsScheduleSyncConfigInput {\n remoteApiBase?: string | null;\n remoteAccessToken?: string | null;\n apiKey?: string | null;\n baseUrl?: string | null;\n agentId?: string | null;\n}\n\nfunction normalizeOptionalString(value: string | null | undefined): string | null {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : null;\n}\n\nexport function normalizeLifeOpsScheduleSyncSecret(\n value: string | null | undefined,\n): string | null {\n const trimmed = normalizeOptionalString(value);\n if (!trimmed) {\n return null;\n }\n return trimmed.toUpperCase() === \"[REDACTED]\" ? null : trimmed;\n}\n\nexport function resolveLifeOpsScheduleSyncConfig(\n config: LifeOpsScheduleSyncConfigInput = {},\n): ResolvedLifeOpsScheduleSyncConfig {\n const remoteApiBase = normalizeOptionalString(config.remoteApiBase);\n if (remoteApiBase) {\n return {\n configured: true,\n mode: \"remote\",\n baseUrl: remoteApiBase.replace(/\\/+$/, \"\"),\n accessToken:\n normalizeLifeOpsScheduleSyncSecret(config.remoteAccessToken) ??\n normalizeLifeOpsScheduleSyncSecret(process.env.ELIZA_REMOTE_ACCESS_TOKEN),\n };\n }\n\n const apiKey =\n normalizeLifeOpsScheduleSyncSecret(config.apiKey) ??\n normalizeLifeOpsScheduleSyncSecret(process.env.ELIZAOS_CLOUD_API_KEY);\n const agentId =\n normalizeLifeOpsScheduleSyncSecret(config.agentId) ??\n normalizeLifeOpsScheduleSyncSecret(process.env.ELIZAOS_CLOUD_AGENT_ID);\n if (!apiKey || !agentId) {\n return {\n configured: false,\n mode: \"none\",\n };\n }\n\n return {\n configured: true,\n mode: \"cloud\",\n apiBaseUrl: resolveCloudApiBaseUrl(\n normalizeOptionalString(config.baseUrl) ?? process.env.ELIZAOS_CLOUD_BASE_URL,\n ),\n apiKey,\n agentId,\n };\n}\n\nfunction buildTimeoutSignal(): AbortSignal {\n return AbortSignal.timeout(LIFEOPS_SCHEDULE_REQUEST_TIMEOUT_MS);\n}\n\nasync function readJsonResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n let detail = `${response.status} ${response.statusText}`.trim();\n const text = await response.text();\n const trimmed = text.trim();\n if (trimmed.length > 0) {\n try {\n const parsed = JSON.parse(trimmed) as {\n error?: string;\n message?: string;\n };\n detail = parsed.message ?? parsed.error ?? trimmed;\n } catch {\n detail = trimmed.slice(0, 200);\n }\n }\n throw new LifeOpsScheduleSyncClientError(response.status, detail);\n }\n return (await response.json()) as T;\n}\n\nexport function resolveLifeOpsScheduleSyncSiteUrl(rawUrl?: string): string {\n return normalizeCloudSiteUrl(rawUrl);\n}\n\nexport class LifeOpsScheduleSyncClient {\n constructor(\n private readonly configSource:\n | ResolvedLifeOpsScheduleSyncConfig\n | (() => ResolvedLifeOpsScheduleSyncConfig) =\n resolveLifeOpsScheduleSyncConfig,\n ) {}\n\n private getConfig(): ResolvedLifeOpsScheduleSyncConfig {\n return typeof this.configSource === \"function\"\n ? this.configSource()\n : this.configSource;\n }\n\n get configured(): boolean {\n return this.getConfig().configured;\n }\n\n private requireConfig(): Exclude<\n ResolvedLifeOpsScheduleSyncConfig,\n { configured: false }\n > {\n const config = this.getConfig();\n if (!config.configured) {\n throw new LifeOpsScheduleSyncClientError(\n 409,\n \"LifeOps schedule sync is not configured.\",\n );\n }\n return config;\n }\n\n private resolvePath(pathname: string): string {\n const config = this.requireConfig();\n const normalizedPath = pathname.replace(/^\\/+/, \"\");\n if (config.mode === \"remote\") {\n return new URL(\n `api/lifeops/schedule/${normalizedPath}`,\n `${config.baseUrl.replace(/\\/+$/, \"\")}/`,\n ).toString();\n }\n return new URL(\n `eliza/agents/${encodeURIComponent(config.agentId)}/lifeops/schedule/${normalizedPath}`,\n `${config.apiBaseUrl.replace(/\\/+$/, \"\")}/`,\n ).toString();\n }\n\n private requestHeaders(\n initHeaders: HeadersInit | undefined,\n ): Record<string, string> {\n const config = this.requireConfig();\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n };\n if (config.mode === \"cloud\") {\n headers[\"X-API-Key\"] = config.apiKey;\n }\n if (config.mode === \"remote\" && config.accessToken) {\n headers.Authorization = `Bearer ${config.accessToken}`;\n }\n if (initHeaders instanceof Headers) {\n for (const [key, value] of initHeaders.entries()) {\n headers[key] = value;\n }\n return headers;\n }\n if (Array.isArray(initHeaders)) {\n for (const [key, value] of initHeaders) {\n headers[key] = value;\n }\n return headers;\n }\n return {\n ...headers,\n ...(initHeaders ?? {}),\n };\n }\n\n private async request<T>(pathname: string, init: RequestInit): Promise<T> {\n const response = await fetch(this.resolvePath(pathname), {\n ...init,\n headers: this.requestHeaders(init.headers),\n signal: init.signal ?? buildTimeoutSignal(),\n });\n return readJsonResponse<T>(response);\n }\n\n async syncObservations(\n request: SyncLifeOpsScheduleObservationsRequest,\n ): Promise<SyncLifeOpsScheduleObservationsResponse> {\n return this.request<SyncLifeOpsScheduleObservationsResponse>(\n \"observations\",\n {\n method: \"POST\",\n body: JSON.stringify(request),\n },\n );\n }\n\n async getMergedState(\n timezone: string,\n scope: \"local\" | \"cloud\" | \"effective\" = \"cloud\",\n ): Promise<GetLifeOpsScheduleMergedStateResponse> {\n const query = new URLSearchParams({ timezone, scope });\n return this.request<GetLifeOpsScheduleMergedStateResponse>(\n `merged-state?${query.toString()}`,\n {\n method: \"GET\",\n },\n );\n }\n}\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "DB5EAEA978BD54A764756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|