@elizaos/plugin-elizacloud 2.0.0-alpha.7 → 2.0.0-beta.1
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 +220 -0
- package/auto-enable.ts +17 -0
- package/dist/browser/index.browser.js +2 -21
- package/dist/browser/index.browser.js.map +5 -37
- package/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.node.cjs +12173 -2271
- package/dist/cjs/index.node.js.map +135 -27
- package/dist/cloud/auth.d.ts +19 -0
- package/dist/cloud/auth.d.ts.map +1 -0
- package/dist/cloud/auth.js +330 -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 +3 -0
- package/dist/cloud/base-url.d.ts.map +1 -0
- package/dist/cloud/base-url.js +77 -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 +432 -0
- package/dist/cloud/bridge-client.js.map +11 -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 +853 -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 +5195 -0
- package/dist/cloud/cloud-wallet.js.map +92 -0
- package/dist/cloud/index.d.ts +9 -0
- package/dist/cloud/index.d.ts.map +1 -0
- package/dist/cloud/index.js +30 -0
- package/dist/cloud/index.js.map +9 -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/validate-url.d.ts +2 -0
- package/dist/cloud/validate-url.d.ts.map +1 -0
- package/dist/cloud/validate-url.js +174 -0
- package/dist/cloud/validate-url.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/index.browser.d.ts +4 -2
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12851 -0
- package/dist/index.js.map +145 -0
- package/dist/index.node.d.ts +15 -2
- package/dist/index.node.d.ts.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +169 -0
- package/dist/init.js.map +12 -0
- package/dist/lib/cloud-connection.d.ts +78 -0
- package/dist/lib/cloud-connection.d.ts.map +1 -0
- package/dist/lib/cloud-connection.js +731 -0
- package/dist/lib/cloud-connection.js.map +14 -0
- package/dist/lib/cloud-secrets.d.ts +23 -0
- package/dist/lib/cloud-secrets.d.ts.map +1 -0
- package/dist/lib/cloud-secrets.js +64 -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 +22 -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 +34 -0
- package/dist/lib/server-cloud-tts.d.ts.map +1 -0
- package/dist/lib/server-cloud-tts.js +549 -0
- package/dist/lib/server-cloud-tts.js.map +13 -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 +4 -0
- package/dist/lib/tts-debug.d.ts.map +1 -0
- package/dist/lib/tts-debug.js +57 -0
- package/dist/lib/tts-debug.js.map +10 -0
- package/dist/models/embeddings.d.ts.map +1 -1
- package/dist/models/embeddings.js +319 -0
- package/dist/models/embeddings.js.map +13 -0
- package/dist/models/image.d.ts.map +1 -1
- package/dist/models/image.js +374 -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 +1386 -0
- package/dist/models/index.js.map +20 -0
- package/dist/models/research.d.ts.map +1 -1
- package/dist/models/research.js +324 -0
- package/dist/models/research.js.map +13 -0
- package/dist/models/speech.d.ts.map +1 -1
- package/dist/models/speech.js +273 -0
- package/dist/models/speech.js.map +13 -0
- package/dist/models/text.d.ts +5 -2
- package/dist/models/text.d.ts.map +1 -1
- package/dist/models/text.js +803 -0
- package/dist/models/text.js.map +15 -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 +283 -0
- package/dist/models/transcription.js.map +13 -0
- package/dist/node/index.d.ts +2 -2
- package/dist/node/index.node.js +12171 -2266
- package/dist/node/index.node.js.map +135 -27
- package/dist/onboarding.d.ts +35 -0
- package/dist/onboarding.d.ts.map +1 -0
- package/dist/onboarding.js +883 -0
- package/dist/onboarding.js.map +14 -0
- package/dist/plugin.d.ts +20 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +7611 -0
- package/dist/plugin.js.map +104 -0
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +127 -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 +7612 -0
- package/dist/register-routes.js.map +105 -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 +807 -0
- package/dist/routes/cloud-billing-routes.js.map +14 -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 +538 -0
- package/dist/routes/cloud-compat-routes.js.map +14 -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 +22 -0
- package/dist/routes/cloud-relay-routes.d.ts.map +1 -0
- package/dist/routes/cloud-relay-routes.js +60 -0
- package/dist/routes/cloud-relay-routes.js.map +10 -0
- package/dist/routes/cloud-routes-autonomous.d.ts +83 -0
- package/dist/routes/cloud-routes-autonomous.d.ts.map +1 -0
- package/dist/routes/cloud-routes-autonomous.js +6134 -0
- package/dist/routes/cloud-routes-autonomous.js.map +97 -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 +6888 -0
- package/dist/routes/cloud-routes.js.map +100 -0
- package/dist/routes/cloud-status-routes-autonomous.d.ts +15 -0
- package/dist/routes/cloud-status-routes-autonomous.d.ts.map +1 -0
- package/dist/routes/cloud-status-routes-autonomous.js +396 -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 +771 -0
- package/dist/routes/cloud-status-routes.js.map +15 -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 +363 -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.map +1 -1
- package/dist/services/cloud-container.js +241 -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 +41 -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 +3561 -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 +5377 -0
- package/dist/utils/cloud-sdk/public-routes.d.ts.map +1 -0
- package/dist/utils/cloud-sdk/public-routes.js +2950 -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 +655 -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 +7 -3
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +137 -0
- package/dist/utils/config.js.map +10 -0
- package/dist/utils/events.d.ts.map +1 -1
- package/dist/utils/events.js +43 -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 +144 -0
- package/dist/utils/sdk-client.js.map +11 -0
- package/package.json +108 -19
- package/src/cloud/auth.ts +175 -0
- package/src/cloud/backup.ts +46 -0
- package/src/cloud/base-url.ts +62 -0
- package/src/cloud/bridge-client.ts +602 -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/index.ts +28 -0
- package/src/cloud/reconnect.ts +111 -0
- package/src/cloud/validate-url.ts +181 -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/index.browser.ts +10 -0
- package/src/index.node.ts +39 -0
- package/src/index.ts +347 -0
- package/src/init.ts +39 -0
- package/src/lib/cloud-connection.ts +663 -0
- package/src/lib/cloud-secrets.ts +58 -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 +139 -0
- package/src/lib/server-cloud-tts.ts +609 -0
- package/src/lib/state-paths.ts +28 -0
- package/src/lib/tts-debug.ts +34 -0
- package/src/models/embeddings.ts +234 -0
- package/src/models/image.ts +219 -0
- package/src/models/index.ts +16 -0
- package/src/models/research.ts +265 -0
- package/src/models/speech.ts +78 -0
- package/src/models/text.ts +899 -0
- package/src/models/tokenization.ts +67 -0
- package/src/models/transcription.ts +97 -0
- package/src/onboarding.ts +396 -0
- package/src/plugin.ts +243 -0
- package/src/providers/openai.ts +16 -0
- package/src/register-routes.ts +6 -0
- package/src/routes/cloud-billing-routes.ts +754 -0
- package/src/routes/cloud-compat-routes.ts +314 -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 +89 -0
- package/src/routes/cloud-routes-autonomous.ts +996 -0
- package/src/routes/cloud-routes.ts +576 -0
- package/src/routes/cloud-status-routes-autonomous.ts +234 -0
- package/src/routes/cloud-status-routes.ts +73 -0
- package/src/services/cloud-auth.ts +567 -0
- package/src/services/cloud-backup.ts +208 -0
- package/src/services/cloud-bootstrap.ts +108 -0
- package/src/services/cloud-bridge.ts +386 -0
- package/src/services/cloud-container.ts +297 -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 +52 -29
- package/{types → src/types}/index.ts +6 -0
- package/src/utils/cloud-api.ts +10 -0
- package/src/utils/cloud-sdk/client.ts +735 -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 +5070 -0
- package/src/utils/cloud-sdk/types.cloud-api.ts +120 -0
- package/src/utils/cloud-sdk/types.ts +762 -0
- package/src/utils/config.ts +174 -0
- package/src/utils/events.ts +37 -0
- package/src/utils/helpers.ts +107 -0
- package/src/utils/responses-output.ts +115 -0
- package/src/utils/sdk-client.ts +37 -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,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/types/cloud.ts", "../src/services/cloud-backup.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Cloud-specific types for ElizaCloud integration.\n *\n * These types mirror the eliza-cloud-v2 database schemas and API contracts\n * for containers, auth, credits, bridge messaging, and agent state snapshots.\n */\n\n// ─── Container Types ────────────────────────────────────────────────────────\n\nexport type ContainerStatus =\n | \"pending\"\n | \"building\"\n | \"deploying\"\n | \"running\"\n | \"stopped\"\n | \"failed\"\n | \"suspended\";\n\nexport type ContainerBillingStatus =\n | \"active\"\n | \"warning\"\n | \"suspended\"\n | \"shutdown_pending\"\n | \"archived\";\n\nexport type ContainerArchitecture = \"arm64\" | \"x86_64\";\n\nexport interface CloudContainer {\n id: string;\n name: string;\n project_name: string;\n description: string | null;\n organization_id: string;\n user_id: string;\n status: ContainerStatus;\n image_tag: string | null;\n port: number;\n desired_count: number;\n cpu: number;\n memory: number;\n architecture: ContainerArchitecture;\n environment_vars: Record<string, string>;\n health_check_path: string;\n load_balancer_url: string | null;\n ecr_repository_uri: string | null;\n ecr_image_tag: string | null;\n cloudformation_stack_name: string | null;\n billing_status: ContainerBillingStatus;\n total_billed: string;\n last_deployed_at: string | null;\n last_health_check: string | null;\n deployment_log: string | null;\n error_message: string | null;\n metadata: Record<string, unknown>;\n created_at: string;\n updated_at: string;\n}\n\nexport interface CreateContainerRequest {\n name: string;\n project_name: string;\n description?: string;\n port?: number;\n desired_count?: number;\n cpu?: number;\n memory?: number;\n environment_vars?: Record<string, string>;\n health_check_path?: string;\n ecr_image_uri: string;\n ecr_repository_uri?: string;\n image_tag?: string;\n architecture?: ContainerArchitecture;\n}\n\nexport interface CreateContainerResponse {\n success: boolean;\n data: CloudContainer;\n message: string;\n creditsDeducted: number;\n creditsRemaining: number;\n stackName: string;\n polling: {\n endpoint: string;\n intervalMs: number;\n expectedDurationMs: number;\n };\n}\n\nexport interface ContainerListResponse {\n success: boolean;\n data: CloudContainer[];\n}\n\nexport interface ContainerGetResponse {\n success: boolean;\n data: CloudContainer;\n}\n\nexport interface ContainerDeleteResponse {\n success: boolean;\n message?: string;\n}\n\nexport interface ContainerHealthResponse {\n success: boolean;\n data: {\n status: string;\n healthy: boolean;\n lastCheck: string | null;\n uptime: number | null;\n };\n}\n\n// ─── Auth Types ─────────────────────────────────────────────────────────────\n\nexport type DevicePlatform = \"ios\" | \"android\" | \"macos\" | \"windows\" | \"linux\" | \"web\";\n\nexport interface DeviceAuthRequest {\n deviceId: string;\n platform: DevicePlatform;\n appVersion: string;\n deviceName?: string;\n}\n\nexport interface DeviceAuthResponse {\n success: boolean;\n data: {\n apiKey: string;\n userId: string;\n organizationId: string;\n credits: number;\n isNew: boolean;\n };\n}\n\nexport interface CloudCredentials {\n apiKey: string;\n userId: string;\n organizationId: string;\n authenticatedAt: number;\n}\n\n// ─── Credits Types ──────────────────────────────────────────────────────────\n\nexport interface CreditBalanceResponse {\n success: boolean;\n data: {\n balance: number;\n currency: string;\n };\n}\n\nexport interface CreditSummaryResponse {\n success: boolean;\n data: {\n balance: number;\n totalSpent: number;\n totalAdded: number;\n recentTransactions: CreditTransaction[];\n };\n}\n\nexport interface CreditTransaction {\n id: string;\n amount: number;\n description: string;\n type: \"credit\" | \"debit\";\n created_at: string;\n}\n\n// ─── Bridge Types ───────────────────────────────────────────────────────────\n\nexport type BridgeConnectionState = \"disconnected\" | \"connecting\" | \"connected\" | \"reconnecting\";\n\nexport interface BridgeMessage {\n jsonrpc: \"2.0\";\n id?: string | number;\n method?: string;\n params?: Record<string, unknown>;\n result?: unknown;\n error?: BridgeError;\n}\n\nexport interface BridgeError {\n code: number;\n message: string;\n data?: unknown;\n}\n\nexport type BridgeMessageHandler = (message: BridgeMessage) => void;\n\nexport interface BridgeConnection {\n containerId: string;\n state: BridgeConnectionState;\n connectedAt: number | null;\n lastHeartbeat: number | null;\n reconnectAttempts: number;\n}\n\n// ─── Managed Gateway Relay Types ───────────────────────────────────────────\n\nexport interface GatewayRelaySession {\n id: string;\n organizationId: string;\n userId: string;\n runtimeAgentId: string;\n agentName: string | null;\n platform: \"local-runtime\";\n createdAt: string;\n lastSeenAt: string;\n}\n\nexport interface GatewayRelayRequest {\n jsonrpc: \"2.0\";\n id?: string | number;\n method: string;\n params?: Record<string, unknown>;\n}\n\nexport interface GatewayRelayResponse {\n jsonrpc: \"2.0\";\n id?: string | number;\n result?: Record<string, unknown>;\n error?: BridgeError;\n}\n\nexport interface GatewayRelayRequestEnvelope {\n requestId: string;\n rpc: GatewayRelayRequest;\n queuedAt: string;\n}\n\nexport interface RegisterGatewayRelaySessionResponse {\n success: boolean;\n data: {\n session: GatewayRelaySession;\n };\n}\n\nexport interface PollGatewayRelayResponse {\n success: boolean;\n data: {\n request: GatewayRelayRequestEnvelope | null;\n };\n}\n\n// ─── Snapshot / Backup Types ────────────────────────────────────────────────\n\nexport type SnapshotType = \"manual\" | \"auto\" | \"pre-eviction\";\n\nexport interface AgentSnapshot {\n id: string;\n containerId: string;\n organizationId: string;\n snapshotType: SnapshotType;\n storageUrl: string;\n sizeBytes: number;\n agentConfig: Record<string, unknown>;\n metadata: Record<string, unknown>;\n created_at: string;\n}\n\nexport interface CreateSnapshotRequest {\n snapshotType?: SnapshotType;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreateSnapshotResponse {\n success: boolean;\n data: AgentSnapshot;\n}\n\nexport interface SnapshotListResponse {\n success: boolean;\n data: AgentSnapshot[];\n}\n\nexport interface RestoreSnapshotRequest {\n snapshotId: string;\n}\n\nexport interface RestoreSnapshotResponse {\n success: boolean;\n message: string;\n}\n\n// ─── Cloud Config Types ─────────────────────────────────────────────────────\n\nexport type InferenceMode = \"cloud\" | \"byok\" | \"local\";\n\nexport interface CloudPluginConfig {\n /** Enable ElizaCloud integration. */\n enabled: boolean;\n /** ElizaCloud API base URL. */\n baseUrl: string;\n /** Stored API key for authenticated requests. */\n apiKey?: string;\n /** Device ID used for auto-signup authentication. */\n deviceId?: string;\n /** Platform identifier. */\n platform?: DevicePlatform;\n /** Inference mode: cloud (ElizaCloud proxied), byok (user keys), local (no cloud). */\n inferenceMode: InferenceMode;\n /** Auto-deploy agents to cloud on creation. */\n autoProvision: boolean;\n /** Bridge reconnection settings. */\n bridge: {\n reconnectIntervalMs: number;\n maxReconnectAttempts: number;\n heartbeatIntervalMs: number;\n };\n /** Auto-backup settings. */\n backup: {\n autoBackupIntervalMs: number;\n maxSnapshots: number;\n };\n /** Default container settings for new deployments. */\n container: {\n defaultImage: string;\n defaultArchitecture: ContainerArchitecture;\n defaultCpu: number;\n defaultMemory: number;\n defaultPort: number;\n };\n}\n\nexport const DEFAULT_CLOUD_CONFIG: CloudPluginConfig = {\n enabled: false,\n baseUrl: \"https://www.elizacloud.ai/api/v1\",\n inferenceMode: \"cloud\",\n autoProvision: false,\n bridge: {\n reconnectIntervalMs: 3000,\n maxReconnectAttempts: 20,\n heartbeatIntervalMs: 30_000,\n },\n backup: {\n autoBackupIntervalMs: 3_600_000, // 1 hour\n maxSnapshots: 10,\n },\n container: {\n defaultImage: \"elizaos/agent:latest\",\n defaultArchitecture: \"arm64\",\n defaultCpu: 1792,\n defaultMemory: 1792,\n defaultPort: 3000,\n },\n};\n\n// ─── API Error Types ────────────────────────────────────────────────────────\n\nexport type { CloudApiErrorBody } from \"@elizaos/cloud-sdk\";\nexport {\n CloudApiError,\n InsufficientCreditsError,\n} from \"@elizaos/cloud-sdk\";\n",
|
|
6
|
+
"/**\n * CloudBackupService — Agent state snapshots and restore.\n *\n * Creates, lists, and restores agent state snapshots through the ElizaCloud\n * API. Supports manual snapshots, periodic auto-backup, and pre-eviction\n * snapshots triggered by the billing system's low-credit warning.\n */\n\nimport { type IAgentRuntime, logger, Service } from \"@elizaos/core\";\nimport type {\n AgentSnapshot,\n CreateSnapshotResponse,\n RestoreSnapshotResponse,\n SnapshotListResponse,\n SnapshotType,\n} from \"../types/cloud\";\nimport { DEFAULT_CLOUD_CONFIG } from \"../types/cloud\";\nimport type { CloudAuthService } from \"./cloud-auth\";\n\ninterface AutoBackupEntry {\n containerId: string;\n timer: ReturnType<typeof setInterval>;\n lastBackupAt: number | null;\n}\n\nexport class CloudBackupService extends Service {\n static serviceType = \"CLOUD_BACKUP\";\n capabilityDescription = \"ElizaCloud agent state backup and restore\";\n\n private authService!: CloudAuthService;\n private autoBackups: Map<string, AutoBackupEntry> = new Map();\n private readonly maxSnapshots = DEFAULT_CLOUD_CONFIG.backup.maxSnapshots;\n private readonly backupIntervalMs = DEFAULT_CLOUD_CONFIG.backup.autoBackupIntervalMs;\n\n static async start(runtime: IAgentRuntime): Promise<Service> {\n const service = new CloudBackupService(runtime);\n await service.initialize();\n return service;\n }\n\n async stop(): Promise<void> {\n for (const [, entry] of this.autoBackups) {\n clearInterval(entry.timer);\n }\n this.autoBackups.clear();\n logger.info(\"[CloudBackup] Service stopped\");\n }\n\n private async initialize(): Promise<void> {\n const auth = this.runtime.getService(\"CLOUD_AUTH\");\n if (!auth) {\n logger.debug(\"[CloudBackup] CloudAuthService not available\");\n return;\n }\n this.authService = auth as CloudAuthService;\n logger.info(\"[CloudBackup] Service initialized\");\n }\n\n // ─── Snapshot CRUD ─────────────────────────────────────────────────────\n\n async createSnapshot(\n containerId: string,\n snapshotType: SnapshotType = \"manual\",\n metadata?: Record<string, unknown>\n ): Promise<AgentSnapshot> {\n const client = this.authService.getClient();\n const response = await client.post<CreateSnapshotResponse>(\n `/agent-state/${containerId}/snapshot`,\n { snapshotType, metadata }\n );\n\n logger.info(\n `[CloudBackup] Created ${snapshotType} snapshot for container ${containerId} (id=${response.data.id}, size=${formatBytes(response.data.sizeBytes)})`\n );\n\n // Update last backup timestamp for auto-backup tracking\n const autoEntry = this.autoBackups.get(containerId);\n if (autoEntry) {\n autoEntry.lastBackupAt = Date.now();\n }\n\n return response.data;\n }\n\n async listSnapshots(containerId: string): Promise<AgentSnapshot[]> {\n const client = this.authService.getClient();\n const response = await client.get<SnapshotListResponse>(\n `/agent-state/${containerId}/snapshots`\n );\n return response.data;\n }\n\n async restoreSnapshot(containerId: string, snapshotId: string): Promise<void> {\n const client = this.authService.getClient();\n\n await client.post<RestoreSnapshotResponse>(`/agent-state/${containerId}/restore`, {\n snapshotId,\n });\n\n logger.info(`[CloudBackup] Restored snapshot ${snapshotId} for container ${containerId}`);\n }\n\n async getLatestSnapshot(containerId: string): Promise<AgentSnapshot | null> {\n const snapshots = await this.listSnapshots(containerId);\n if (snapshots.length === 0) return null;\n\n // Sort by created_at descending and return the most recent\n snapshots.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());\n return snapshots[0];\n }\n\n // ─── Auto-Backup Scheduling ────────────────────────────────────────────\n\n scheduleAutoBackup(containerId: string, intervalMs?: number): void {\n // Don't double-schedule\n if (this.autoBackups.has(containerId)) {\n logger.debug(`[CloudBackup] Auto-backup already scheduled for ${containerId}`);\n return;\n }\n\n const interval = intervalMs ?? this.backupIntervalMs;\n\n const timer = setInterval(() => {\n logger.debug(`[CloudBackup] Running auto-backup for container ${containerId}`);\n this.createSnapshot(containerId, \"auto\", {\n trigger: \"scheduled\",\n scheduledIntervalMs: interval,\n })\n .then(() => this.pruneSnapshots(containerId))\n .catch((err: Error) => {\n logger.error(`[CloudBackup] Auto-backup failed for ${containerId}: ${err.message}`);\n });\n }, interval);\n\n this.autoBackups.set(containerId, {\n containerId,\n timer,\n lastBackupAt: null,\n });\n\n logger.info(\n `[CloudBackup] Scheduled auto-backup for ${containerId} every ${Math.round(interval / 60_000)} minutes`\n );\n }\n\n cancelAutoBackup(containerId: string): void {\n const entry = this.autoBackups.get(containerId);\n if (!entry) return;\n\n clearInterval(entry.timer);\n this.autoBackups.delete(containerId);\n logger.info(`[CloudBackup] Cancelled auto-backup for ${containerId}`);\n }\n\n /**\n * Create a pre-eviction snapshot. Called when the billing system sends\n * a low-credit warning before shutting down the container.\n */\n async createPreEvictionSnapshot(containerId: string): Promise<AgentSnapshot> {\n logger.info(`[CloudBackup] Creating pre-eviction snapshot for ${containerId}`);\n return this.createSnapshot(containerId, \"pre-eviction\", {\n trigger: \"billing-eviction\",\n createdAt: new Date().toISOString(),\n });\n }\n\n // ─── Snapshot Pruning ──────────────────────────────────────────────────\n\n /**\n * Remove the oldest auto snapshots beyond maxSnapshots limit.\n * Manual and pre-eviction snapshots are never pruned.\n */\n private async pruneSnapshots(containerId: string): Promise<void> {\n const snapshots = await this.listSnapshots(containerId);\n\n const autoSnapshots = snapshots\n .filter((s) => s.snapshotType === \"auto\")\n .sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());\n\n const excess = autoSnapshots.slice(this.maxSnapshots);\n if (excess.length === 0) return;\n\n const client = this.authService.getClient();\n for (const snapshot of excess) {\n await client.delete(`/agent-state/${containerId}/snapshots/${snapshot.id}`);\n logger.debug(`[CloudBackup] Pruned old auto snapshot ${snapshot.id} for ${containerId}`);\n }\n\n logger.info(`[CloudBackup] Pruned ${excess.length} old auto snapshot(s) for ${containerId}`);\n }\n\n // ─── Accessors ─────────────────────────────────────────────────────────\n\n isAutoBackupScheduled(containerId: string): boolean {\n return this.autoBackups.has(containerId);\n }\n\n getLastBackupTime(containerId: string): number | null {\n return this.autoBackups.get(containerId)?.lastBackupAt ?? null;\n }\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "3A3130D224AC9DB064756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CloudBootstrapService — service-port that exposes Eliza Cloud bootstrap
|
|
3
|
+
* verification endpoints to `app-core` via the runtime service registry.
|
|
4
|
+
*
|
|
5
|
+
* The actual JWKS fetch / cache and bootstrap-token verify path lives in
|
|
6
|
+
* `app-core` (`services/cloud-jwks-store.ts` and `api/auth/bootstrap-token.ts`).
|
|
7
|
+
* This service intentionally has a minimal surface: it answers questions
|
|
8
|
+
* about the cloud trust anchor (issuer, JWKS URL, revocation list URL,
|
|
9
|
+
* expected container id) so that `app-core` does not need to import
|
|
10
|
+
* directly from `@elizaos/plugin-elizacloud`.
|
|
11
|
+
*
|
|
12
|
+
* Hard rule (per remote-auth-hardening-plan §3.2): no fail-open. If the
|
|
13
|
+
* cloud issuer is not configured, `getExpectedIssuer()` throws and the
|
|
14
|
+
* consumer must reject the bootstrap exchange — the runtime never silently
|
|
15
|
+
* trusts a default URL.
|
|
16
|
+
*/
|
|
17
|
+
import { type IAgentRuntime, Service } from "@elizaos/core";
|
|
18
|
+
export interface CloudBootstrapService {
|
|
19
|
+
/** Returns `${ELIZA_CLOUD_ISSUER}/.well-known/jwks.json`. */
|
|
20
|
+
getJwksUrl(): string;
|
|
21
|
+
/** Returns `${ELIZA_CLOUD_ISSUER}/.well-known/revocations.json`. */
|
|
22
|
+
getRevocationListUrl(): string;
|
|
23
|
+
/** Returns the configured `ELIZA_CLOUD_ISSUER`. Throws when unset. */
|
|
24
|
+
getExpectedIssuer(): string;
|
|
25
|
+
/** Returns the configured `ELIZA_CLOUD_CONTAINER_ID`, or `null` when unset. */
|
|
26
|
+
getExpectedContainerId(): string | null;
|
|
27
|
+
}
|
|
28
|
+
export declare class CloudBootstrapServiceImpl extends Service implements CloudBootstrapService {
|
|
29
|
+
static serviceType: string;
|
|
30
|
+
capabilityDescription: string;
|
|
31
|
+
static start(runtime: IAgentRuntime): Promise<Service>;
|
|
32
|
+
stop(): Promise<void>;
|
|
33
|
+
getExpectedIssuer(): string;
|
|
34
|
+
getJwksUrl(): string;
|
|
35
|
+
getRevocationListUrl(): string;
|
|
36
|
+
getExpectedContainerId(): string | null;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=cloud-bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-bootstrap.d.ts","sourceRoot":"","sources":["../../src/services/cloud-bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,KAAK,aAAa,EAAU,OAAO,EAAE,MAAM,eAAe,CAAC;AAEpE,MAAM,WAAW,qBAAqB;IACpC,6DAA6D;IAC7D,UAAU,IAAI,MAAM,CAAC;IACrB,oEAAoE;IACpE,oBAAoB,IAAI,MAAM,CAAC;IAC/B,sEAAsE;IACtE,iBAAiB,IAAI,MAAM,CAAC;IAC5B,+EAA+E;IAC/E,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAAC;CACzC;AAiCD,qBAAa,yBAA0B,SAAQ,OAAQ,YAAW,qBAAqB;IACrF,MAAM,CAAC,WAAW,SAAqB;IACvC,qBAAqB,SAC2G;WAEnH,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBtD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,iBAAiB,IAAI,MAAM;IAU3B,UAAU,IAAI,MAAM;IAIpB,oBAAoB,IAAI,MAAM;IAI9B,sBAAsB,IAAI,MAAM,GAAG,IAAI;CAGxC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
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/services/cloud-bootstrap.ts
|
|
20
|
+
import { logger, Service } from "@elizaos/core";
|
|
21
|
+
function readEnv() {
|
|
22
|
+
if (typeof process === "undefined") {
|
|
23
|
+
return {};
|
|
24
|
+
}
|
|
25
|
+
return process.env;
|
|
26
|
+
}
|
|
27
|
+
function readSetting(runtime, key) {
|
|
28
|
+
if (runtime && typeof runtime.getSetting === "function") {
|
|
29
|
+
const value = runtime.getSetting(key);
|
|
30
|
+
if (typeof value === "string" && value.length > 0) {
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const fromEnv = readEnv()[key];
|
|
35
|
+
if (typeof fromEnv === "string" && fromEnv.length > 0) {
|
|
36
|
+
return fromEnv;
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
function trimTrailingSlash(input) {
|
|
41
|
+
let end = input.length;
|
|
42
|
+
while (end > 0 && input.charCodeAt(end - 1) === 47) {
|
|
43
|
+
end -= 1;
|
|
44
|
+
}
|
|
45
|
+
return end === input.length ? input : input.slice(0, end);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
class CloudBootstrapServiceImpl extends Service {
|
|
49
|
+
static serviceType = "CLOUD_BOOTSTRAP";
|
|
50
|
+
capabilityDescription = "Exposes Eliza Cloud bootstrap-token trust anchor (issuer, JWKS URL, revocation list URL, expected container id) to app-core";
|
|
51
|
+
static async start(runtime) {
|
|
52
|
+
const service = new CloudBootstrapServiceImpl(runtime);
|
|
53
|
+
const issuer = readSetting(runtime, "ELIZA_CLOUD_ISSUER");
|
|
54
|
+
const containerId = readSetting(runtime, "ELIZA_CLOUD_CONTAINER_ID");
|
|
55
|
+
if (issuer) {
|
|
56
|
+
logger.info(`[CloudBootstrap] Trust anchor configured (issuer=${issuer}, containerId=${containerId ?? "<unset>"})`);
|
|
57
|
+
} else {
|
|
58
|
+
logger.debug("[CloudBootstrap] ELIZA_CLOUD_ISSUER unset — bootstrap-token verification will reject until configured");
|
|
59
|
+
}
|
|
60
|
+
return service;
|
|
61
|
+
}
|
|
62
|
+
async stop() {}
|
|
63
|
+
getExpectedIssuer() {
|
|
64
|
+
const issuer = readSetting(this.runtime, "ELIZA_CLOUD_ISSUER");
|
|
65
|
+
if (!issuer) {
|
|
66
|
+
throw new Error("ELIZA_CLOUD_ISSUER is not configured — bootstrap-token verification cannot proceed");
|
|
67
|
+
}
|
|
68
|
+
return trimTrailingSlash(issuer);
|
|
69
|
+
}
|
|
70
|
+
getJwksUrl() {
|
|
71
|
+
return `${this.getExpectedIssuer()}/.well-known/jwks.json`;
|
|
72
|
+
}
|
|
73
|
+
getRevocationListUrl() {
|
|
74
|
+
return `${this.getExpectedIssuer()}/.well-known/revocations.json`;
|
|
75
|
+
}
|
|
76
|
+
getExpectedContainerId() {
|
|
77
|
+
return readSetting(this.runtime, "ELIZA_CLOUD_CONTAINER_ID");
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export {
|
|
81
|
+
CloudBootstrapServiceImpl
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
//# debugId=8AC6CE0E4399D14364756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/services/cloud-bootstrap.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * CloudBootstrapService — service-port that exposes Eliza Cloud bootstrap\n * verification endpoints to `app-core` via the runtime service registry.\n *\n * The actual JWKS fetch / cache and bootstrap-token verify path lives in\n * `app-core` (`services/cloud-jwks-store.ts` and `api/auth/bootstrap-token.ts`).\n * This service intentionally has a minimal surface: it answers questions\n * about the cloud trust anchor (issuer, JWKS URL, revocation list URL,\n * expected container id) so that `app-core` does not need to import\n * directly from `@elizaos/plugin-elizacloud`.\n *\n * Hard rule (per remote-auth-hardening-plan §3.2): no fail-open. If the\n * cloud issuer is not configured, `getExpectedIssuer()` throws and the\n * consumer must reject the bootstrap exchange — the runtime never silently\n * trusts a default URL.\n */\n\nimport { type IAgentRuntime, logger, Service } from \"@elizaos/core\";\n\nexport interface CloudBootstrapService {\n /** Returns `${ELIZA_CLOUD_ISSUER}/.well-known/jwks.json`. */\n getJwksUrl(): string;\n /** Returns `${ELIZA_CLOUD_ISSUER}/.well-known/revocations.json`. */\n getRevocationListUrl(): string;\n /** Returns the configured `ELIZA_CLOUD_ISSUER`. Throws when unset. */\n getExpectedIssuer(): string;\n /** Returns the configured `ELIZA_CLOUD_CONTAINER_ID`, or `null` when unset. */\n getExpectedContainerId(): string | null;\n}\n\ntype ProcessEnvLike = Record<string, string | undefined>;\n\nfunction readEnv(): ProcessEnvLike {\n if (typeof process === \"undefined\") {\n return {};\n }\n return process.env as ProcessEnvLike;\n}\n\nfunction readSetting(runtime: IAgentRuntime | undefined, key: string): string | null {\n if (runtime && typeof runtime.getSetting === \"function\") {\n const value = runtime.getSetting(key);\n if (typeof value === \"string\" && value.length > 0) {\n return value;\n }\n }\n const fromEnv = readEnv()[key];\n if (typeof fromEnv === \"string\" && fromEnv.length > 0) {\n return fromEnv;\n }\n return null;\n}\n\nfunction trimTrailingSlash(input: string): string {\n let end = input.length;\n while (end > 0 && input.charCodeAt(end - 1) === 0x2f) {\n end -= 1;\n }\n return end === input.length ? input : input.slice(0, end);\n}\n\nexport class CloudBootstrapServiceImpl extends Service implements CloudBootstrapService {\n static serviceType = \"CLOUD_BOOTSTRAP\";\n capabilityDescription =\n \"Exposes Eliza Cloud bootstrap-token trust anchor (issuer, JWKS URL, revocation list URL, expected container id) to app-core\";\n\n static async start(runtime: IAgentRuntime): Promise<Service> {\n const service = new CloudBootstrapServiceImpl(runtime);\n const issuer = readSetting(runtime, \"ELIZA_CLOUD_ISSUER\");\n const containerId = readSetting(runtime, \"ELIZA_CLOUD_CONTAINER_ID\");\n if (issuer) {\n logger.info(\n `[CloudBootstrap] Trust anchor configured (issuer=${issuer}, containerId=${containerId ?? \"<unset>\"})`\n );\n } else {\n logger.debug(\n \"[CloudBootstrap] ELIZA_CLOUD_ISSUER unset — bootstrap-token verification will reject until configured\"\n );\n }\n return service;\n }\n\n async stop(): Promise<void> {\n // No persistent state to tear down.\n }\n\n getExpectedIssuer(): string {\n const issuer = readSetting(this.runtime, \"ELIZA_CLOUD_ISSUER\");\n if (!issuer) {\n throw new Error(\n \"ELIZA_CLOUD_ISSUER is not configured — bootstrap-token verification cannot proceed\"\n );\n }\n return trimTrailingSlash(issuer);\n }\n\n getJwksUrl(): string {\n return `${this.getExpectedIssuer()}/.well-known/jwks.json`;\n }\n\n getRevocationListUrl(): string {\n return `${this.getExpectedIssuer()}/.well-known/revocations.json`;\n }\n\n getExpectedContainerId(): string | null {\n return readSetting(this.runtime, \"ELIZA_CLOUD_CONTAINER_ID\");\n }\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAiBA;AAeA,SAAS,OAAO,GAAmB;AAAA,EACjC,IAAI,OAAO,YAAY,aAAa;AAAA,IAClC,OAAO,CAAC;AAAA,EACV;AAAA,EACA,OAAO,QAAQ;AAAA;AAGjB,SAAS,WAAW,CAAC,SAAoC,KAA4B;AAAA,EACnF,IAAI,WAAW,OAAO,QAAQ,eAAe,YAAY;AAAA,IACvD,MAAM,QAAQ,QAAQ,WAAW,GAAG;AAAA,IACpC,IAAI,OAAO,UAAU,YAAY,MAAM,SAAS,GAAG;AAAA,MACjD,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,MAAM,UAAU,QAAQ,EAAE;AAAA,EAC1B,IAAI,OAAO,YAAY,YAAY,QAAQ,SAAS,GAAG;AAAA,IACrD,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,iBAAiB,CAAC,OAAuB;AAAA,EAChD,IAAI,MAAM,MAAM;AAAA,EAChB,OAAO,MAAM,KAAK,MAAM,WAAW,MAAM,CAAC,MAAM,IAAM;AAAA,IACpD,OAAO;AAAA,EACT;AAAA,EACA,OAAO,QAAQ,MAAM,SAAS,QAAQ,MAAM,MAAM,GAAG,GAAG;AAAA;AAAA;AAGnD,MAAM,kCAAkC,QAAyC;AAAA,SAC/E,cAAc;AAAA,EACrB,wBACE;AAAA,cAEW,MAAK,CAAC,SAA0C;AAAA,IAC3D,MAAM,UAAU,IAAI,0BAA0B,OAAO;AAAA,IACrD,MAAM,SAAS,YAAY,SAAS,oBAAoB;AAAA,IACxD,MAAM,cAAc,YAAY,SAAS,0BAA0B;AAAA,IACnE,IAAI,QAAQ;AAAA,MACV,OAAO,KACL,oDAAoD,uBAAuB,eAAe,YAC5F;AAAA,IACF,EAAO;AAAA,MACL,OAAO,MACL,uGACF;AAAA;AAAA,IAEF,OAAO;AAAA;AAAA,OAGH,KAAI,GAAkB;AAAA,EAI5B,iBAAiB,GAAW;AAAA,IAC1B,MAAM,SAAS,YAAY,KAAK,SAAS,oBAAoB;AAAA,IAC7D,IAAI,CAAC,QAAQ;AAAA,MACX,MAAM,IAAI,MACR,oFACF;AAAA,IACF;AAAA,IACA,OAAO,kBAAkB,MAAM;AAAA;AAAA,EAGjC,UAAU,GAAW;AAAA,IACnB,OAAO,GAAG,KAAK,kBAAkB;AAAA;AAAA,EAGnC,oBAAoB,GAAW;AAAA,IAC7B,OAAO,GAAG,KAAK,kBAAkB;AAAA;AAAA,EAGnC,sBAAsB,GAAkB;AAAA,IACtC,OAAO,YAAY,KAAK,SAAS,0BAA0B;AAAA;AAE/D;",
|
|
8
|
+
"debugId": "8AC6CE0E4399D14364756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* CloudBridgeService — WebSocket bridge to cloud-hosted agents.
|
|
3
3
|
*
|
|
4
4
|
* Establishes a JSON-RPC 2.0 WebSocket connection per container, allowing
|
|
5
|
-
* the local
|
|
5
|
+
* the local eliza client to send messages to and receive events from
|
|
6
6
|
* cloud-hosted ElizaOS agents. Handles reconnection with exponential
|
|
7
7
|
* backoff and heartbeat keepalive.
|
|
8
8
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-bridge.d.ts","sourceRoot":"","sources":["../../services/cloud-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,aAAa,EAAU,OAAO,EAAE,MAAM,eAAe,CAAC;AAEpE,OAAO,KAAK,EACV,gBAAgB,EAChB,qBAAqB,EAErB,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"cloud-bridge.d.ts","sourceRoot":"","sources":["../../src/services/cloud-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,aAAa,EAAU,OAAO,EAAE,MAAM,eAAe,CAAC;AAEpE,OAAO,KAAK,EACV,gBAAgB,EAChB,qBAAqB,EAErB,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AA+BxB,qBAAa,kBAAmB,SAAQ,OAAO;IAC7C,MAAM,CAAC,WAAW,SAAkB;IACpC,qBAAqB,SAAqD;IAE1E,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA+B;IAC5D,OAAO,CAAC,WAAW,CAA4C;WAElD,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAMtD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAOb,UAAU;IAYlB,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3C,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAuBtC,mBAAmB;IA0FjC,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,aAAa;IAerB;;OAEG;IACG,WAAW,CACf,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,SAAS,SAAS,GACjB,OAAO,CAAC,OAAO,CAAC;IAyBnB;;OAEG;IACH,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAe5F;;OAEG;IACG,eAAe,CACnB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IAShE;;OAEG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAK3E;;OAEG;IACG,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5F,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,MAAM,IAAI;IA6BzE,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,qBAAqB;IAI9D,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAa/D,wBAAwB,IAAI,MAAM,EAAE;CAOrC"}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __returnValue = (v) => v;
|
|
4
|
+
function __exportSetter(name, newValue) {
|
|
5
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
6
|
+
}
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, {
|
|
10
|
+
get: all[name],
|
|
11
|
+
enumerable: true,
|
|
12
|
+
configurable: true,
|
|
13
|
+
set: __exportSetter.bind(all, name)
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
17
|
+
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
18
|
+
|
|
19
|
+
// src/types/cloud.ts
|
|
20
|
+
import {
|
|
21
|
+
CloudApiError,
|
|
22
|
+
InsufficientCreditsError
|
|
23
|
+
} from "@elizaos/cloud-sdk";
|
|
24
|
+
var DEFAULT_CLOUD_CONFIG = {
|
|
25
|
+
enabled: false,
|
|
26
|
+
baseUrl: "https://www.elizacloud.ai/api/v1",
|
|
27
|
+
inferenceMode: "cloud",
|
|
28
|
+
autoProvision: false,
|
|
29
|
+
bridge: {
|
|
30
|
+
reconnectIntervalMs: 3000,
|
|
31
|
+
maxReconnectAttempts: 20,
|
|
32
|
+
heartbeatIntervalMs: 30000
|
|
33
|
+
},
|
|
34
|
+
backup: {
|
|
35
|
+
autoBackupIntervalMs: 3600000,
|
|
36
|
+
maxSnapshots: 10
|
|
37
|
+
},
|
|
38
|
+
container: {
|
|
39
|
+
defaultImage: "elizaos/agent:latest",
|
|
40
|
+
defaultArchitecture: "arm64",
|
|
41
|
+
defaultCpu: 1792,
|
|
42
|
+
defaultMemory: 1792,
|
|
43
|
+
defaultPort: 3000
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// src/services/cloud-bridge.ts
|
|
48
|
+
import { logger, Service } from "@elizaos/core";
|
|
49
|
+
import { WebSocket } from "undici";
|
|
50
|
+
function requireWebSocket(conn, containerId) {
|
|
51
|
+
if (!conn.ws) {
|
|
52
|
+
throw new Error(`WebSocket not connected for container ${containerId}`);
|
|
53
|
+
}
|
|
54
|
+
return conn.ws;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
class CloudBridgeService extends Service {
|
|
58
|
+
static serviceType = "CLOUD_BRIDGE";
|
|
59
|
+
capabilityDescription = "WebSocket bridge to cloud-hosted ElizaOS agents";
|
|
60
|
+
authService;
|
|
61
|
+
bridgeConfig = DEFAULT_CLOUD_CONFIG.bridge;
|
|
62
|
+
connections = new Map;
|
|
63
|
+
static async start(runtime) {
|
|
64
|
+
const service = new CloudBridgeService(runtime);
|
|
65
|
+
await service.initialize();
|
|
66
|
+
return service;
|
|
67
|
+
}
|
|
68
|
+
async stop() {
|
|
69
|
+
for (const [containerId] of this.connections) {
|
|
70
|
+
await this.disconnect(containerId);
|
|
71
|
+
}
|
|
72
|
+
logger.info("[CloudBridge] Service stopped");
|
|
73
|
+
}
|
|
74
|
+
async initialize() {
|
|
75
|
+
const auth = this.runtime.getService("CLOUD_AUTH");
|
|
76
|
+
if (!auth) {
|
|
77
|
+
logger.debug("[CloudBridge] CloudAuthService not available");
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
this.authService = auth;
|
|
81
|
+
logger.info("[CloudBridge] Service initialized");
|
|
82
|
+
}
|
|
83
|
+
async connect(containerId) {
|
|
84
|
+
const existing = this.connections.get(containerId);
|
|
85
|
+
if (existing) {
|
|
86
|
+
if (existing.state === "connected" || existing.state === "connecting") {
|
|
87
|
+
logger.debug(`[CloudBridge] Already connected/connecting to ${containerId}`);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
await this.establishConnection(containerId, 0);
|
|
92
|
+
}
|
|
93
|
+
async disconnect(containerId) {
|
|
94
|
+
const conn = this.connections.get(containerId);
|
|
95
|
+
if (!conn)
|
|
96
|
+
return;
|
|
97
|
+
if (conn.heartbeatTimer)
|
|
98
|
+
clearInterval(conn.heartbeatTimer);
|
|
99
|
+
if (conn.reconnectTimer)
|
|
100
|
+
clearTimeout(conn.reconnectTimer);
|
|
101
|
+
for (const [, pending] of conn.pendingRequests) {
|
|
102
|
+
clearTimeout(pending.timeout);
|
|
103
|
+
pending.reject(new Error("Bridge disconnected"));
|
|
104
|
+
}
|
|
105
|
+
conn.pendingRequests.clear();
|
|
106
|
+
const ws = conn.ws;
|
|
107
|
+
if (ws && (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING)) {
|
|
108
|
+
ws.close(1000, "Client disconnect");
|
|
109
|
+
}
|
|
110
|
+
this.connections.delete(containerId);
|
|
111
|
+
logger.info(`[CloudBridge] Disconnected from ${containerId}`);
|
|
112
|
+
}
|
|
113
|
+
async establishConnection(containerId, reconnectAttempts) {
|
|
114
|
+
const client = this.authService.getClient();
|
|
115
|
+
const apiKey = this.authService.getApiKey();
|
|
116
|
+
const wsUrl = client.buildWsUrl(`/agent-bridge/${containerId}`);
|
|
117
|
+
const authUrl = apiKey ? `${wsUrl}?token=${encodeURIComponent(apiKey)}` : wsUrl;
|
|
118
|
+
const ws = new WebSocket(authUrl);
|
|
119
|
+
const conn = {
|
|
120
|
+
ws,
|
|
121
|
+
state: "connecting",
|
|
122
|
+
connectedAt: null,
|
|
123
|
+
lastHeartbeat: null,
|
|
124
|
+
reconnectAttempts,
|
|
125
|
+
heartbeatTimer: null,
|
|
126
|
+
reconnectTimer: null,
|
|
127
|
+
handlers: this.connections.get(containerId)?.handlers ?? new Set,
|
|
128
|
+
pendingRequests: new Map,
|
|
129
|
+
nextRequestId: 1
|
|
130
|
+
};
|
|
131
|
+
this.connections.set(containerId, conn);
|
|
132
|
+
ws.addEventListener("open", () => {
|
|
133
|
+
conn.state = "connected";
|
|
134
|
+
conn.connectedAt = Date.now();
|
|
135
|
+
conn.reconnectAttempts = 0;
|
|
136
|
+
logger.info(`[CloudBridge] Connected to agent ${containerId}`);
|
|
137
|
+
conn.heartbeatTimer = setInterval(() => {
|
|
138
|
+
this.sendHeartbeat(containerId);
|
|
139
|
+
}, this.bridgeConfig.heartbeatIntervalMs);
|
|
140
|
+
});
|
|
141
|
+
ws.addEventListener("message", (event) => {
|
|
142
|
+
const raw = event.data;
|
|
143
|
+
const data = typeof raw === "string" ? raw : raw instanceof Buffer ? raw.toString("utf-8") : String(raw);
|
|
144
|
+
const message = JSON.parse(data);
|
|
145
|
+
if (message.method === "heartbeat.ack") {
|
|
146
|
+
conn.lastHeartbeat = Date.now();
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (message.id !== undefined && !message.method) {
|
|
150
|
+
const pending = conn.pendingRequests.get(message.id);
|
|
151
|
+
if (pending) {
|
|
152
|
+
clearTimeout(pending.timeout);
|
|
153
|
+
conn.pendingRequests.delete(message.id);
|
|
154
|
+
if (message.error) {
|
|
155
|
+
pending.reject(new Error(message.error.message));
|
|
156
|
+
} else {
|
|
157
|
+
pending.resolve(message.result);
|
|
158
|
+
}
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
for (const handler of conn.handlers) {
|
|
163
|
+
handler(message);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
ws.addEventListener("close", (event) => {
|
|
167
|
+
conn.state = "disconnected";
|
|
168
|
+
if (conn.heartbeatTimer)
|
|
169
|
+
clearInterval(conn.heartbeatTimer);
|
|
170
|
+
if (event.code === 1000) {
|
|
171
|
+
logger.info(`[CloudBridge] Clean disconnect from ${containerId}`);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
logger.warn(`[CloudBridge] Connection lost to ${containerId} (code=${event.code}, reason=${event.reason})`);
|
|
175
|
+
this.scheduleReconnect(containerId, conn.reconnectAttempts + 1);
|
|
176
|
+
});
|
|
177
|
+
ws.addEventListener("error", () => {
|
|
178
|
+
logger.error(`[CloudBridge] WebSocket error for ${containerId}`);
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
scheduleReconnect(containerId, attempt) {
|
|
182
|
+
if (attempt > this.bridgeConfig.maxReconnectAttempts) {
|
|
183
|
+
logger.error(`[CloudBridge] Max reconnect attempts (${this.bridgeConfig.maxReconnectAttempts}) reached for ${containerId}`);
|
|
184
|
+
this.connections.delete(containerId);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
const base = this.bridgeConfig.reconnectIntervalMs;
|
|
188
|
+
const delay = Math.min(base * 2 ** Math.min(attempt, 5), 120000);
|
|
189
|
+
const jitter = Math.floor(Math.random() * 1000);
|
|
190
|
+
logger.info(`[CloudBridge] Reconnecting to ${containerId} in ${Math.round((delay + jitter) / 1000)}s (attempt ${attempt})`);
|
|
191
|
+
const conn = this.connections.get(containerId);
|
|
192
|
+
if (conn) {
|
|
193
|
+
conn.state = "reconnecting";
|
|
194
|
+
conn.reconnectTimer = setTimeout(() => {
|
|
195
|
+
this.establishConnection(containerId, attempt);
|
|
196
|
+
}, delay + jitter);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
sendHeartbeat(containerId) {
|
|
200
|
+
const conn = this.connections.get(containerId);
|
|
201
|
+
if (!conn || conn.state !== "connected")
|
|
202
|
+
return;
|
|
203
|
+
const message = {
|
|
204
|
+
jsonrpc: "2.0",
|
|
205
|
+
method: "heartbeat",
|
|
206
|
+
params: { timestamp: Date.now() }
|
|
207
|
+
};
|
|
208
|
+
requireWebSocket(conn, containerId).send(JSON.stringify(message));
|
|
209
|
+
}
|
|
210
|
+
async sendRequest(containerId, method, params, timeoutMs = 60000) {
|
|
211
|
+
const conn = this.connections.get(containerId);
|
|
212
|
+
if (!conn || conn.state !== "connected") {
|
|
213
|
+
throw new Error(`Not connected to container ${containerId}`);
|
|
214
|
+
}
|
|
215
|
+
const id = conn.nextRequestId++;
|
|
216
|
+
const message = {
|
|
217
|
+
jsonrpc: "2.0",
|
|
218
|
+
id,
|
|
219
|
+
method,
|
|
220
|
+
params
|
|
221
|
+
};
|
|
222
|
+
return new Promise((resolve, reject) => {
|
|
223
|
+
const timeout = setTimeout(() => {
|
|
224
|
+
conn.pendingRequests.delete(id);
|
|
225
|
+
reject(new Error(`Request ${method} timed out after ${timeoutMs}ms`));
|
|
226
|
+
}, timeoutMs);
|
|
227
|
+
conn.pendingRequests.set(id, { resolve, reject, timeout });
|
|
228
|
+
requireWebSocket(conn, containerId).send(JSON.stringify(message));
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
sendNotification(containerId, method, params) {
|
|
232
|
+
const conn = this.connections.get(containerId);
|
|
233
|
+
if (!conn || conn.state !== "connected") {
|
|
234
|
+
throw new Error(`Not connected to container ${containerId}`);
|
|
235
|
+
}
|
|
236
|
+
const message = {
|
|
237
|
+
jsonrpc: "2.0",
|
|
238
|
+
method,
|
|
239
|
+
params
|
|
240
|
+
};
|
|
241
|
+
requireWebSocket(conn, containerId).send(JSON.stringify(message));
|
|
242
|
+
}
|
|
243
|
+
async sendChatMessage(containerId, text, roomId, metadata) {
|
|
244
|
+
const result = await this.sendRequest(containerId, "message.send", {
|
|
245
|
+
text,
|
|
246
|
+
roomId,
|
|
247
|
+
metadata
|
|
248
|
+
});
|
|
249
|
+
return result;
|
|
250
|
+
}
|
|
251
|
+
async getAgentStatus(containerId) {
|
|
252
|
+
const result = await this.sendRequest(containerId, "status.get", {});
|
|
253
|
+
return result;
|
|
254
|
+
}
|
|
255
|
+
async updateAgentConfig(containerId, config) {
|
|
256
|
+
await this.sendRequest(containerId, "config.update", config);
|
|
257
|
+
}
|
|
258
|
+
onMessage(containerId, handler) {
|
|
259
|
+
let conn = this.connections.get(containerId);
|
|
260
|
+
if (!conn) {
|
|
261
|
+
conn = {
|
|
262
|
+
ws: null,
|
|
263
|
+
state: "disconnected",
|
|
264
|
+
connectedAt: null,
|
|
265
|
+
lastHeartbeat: null,
|
|
266
|
+
reconnectAttempts: 0,
|
|
267
|
+
heartbeatTimer: null,
|
|
268
|
+
reconnectTimer: null,
|
|
269
|
+
handlers: new Set,
|
|
270
|
+
pendingRequests: new Map,
|
|
271
|
+
nextRequestId: 1
|
|
272
|
+
};
|
|
273
|
+
this.connections.set(containerId, conn);
|
|
274
|
+
}
|
|
275
|
+
conn.handlers.add(handler);
|
|
276
|
+
return () => {
|
|
277
|
+
conn.handlers.delete(handler);
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
getConnectionState(containerId) {
|
|
281
|
+
return this.connections.get(containerId)?.state ?? "disconnected";
|
|
282
|
+
}
|
|
283
|
+
getConnectionInfo(containerId) {
|
|
284
|
+
const conn = this.connections.get(containerId);
|
|
285
|
+
if (!conn)
|
|
286
|
+
return null;
|
|
287
|
+
return {
|
|
288
|
+
containerId,
|
|
289
|
+
state: conn.state,
|
|
290
|
+
connectedAt: conn.connectedAt,
|
|
291
|
+
lastHeartbeat: conn.lastHeartbeat,
|
|
292
|
+
reconnectAttempts: conn.reconnectAttempts
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
getConnectedContainerIds() {
|
|
296
|
+
const ids = [];
|
|
297
|
+
for (const [id, conn] of this.connections) {
|
|
298
|
+
if (conn.state === "connected")
|
|
299
|
+
ids.push(id);
|
|
300
|
+
}
|
|
301
|
+
return ids;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
export {
|
|
305
|
+
CloudBridgeService
|
|
306
|
+
};
|
|
307
|
+
|
|
308
|
+
//# debugId=0C81D369BEE5065864756E2164756E21
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/types/cloud.ts", "../src/services/cloud-bridge.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Cloud-specific types for ElizaCloud integration.\n *\n * These types mirror the eliza-cloud-v2 database schemas and API contracts\n * for containers, auth, credits, bridge messaging, and agent state snapshots.\n */\n\n// ─── Container Types ────────────────────────────────────────────────────────\n\nexport type ContainerStatus =\n | \"pending\"\n | \"building\"\n | \"deploying\"\n | \"running\"\n | \"stopped\"\n | \"failed\"\n | \"suspended\";\n\nexport type ContainerBillingStatus =\n | \"active\"\n | \"warning\"\n | \"suspended\"\n | \"shutdown_pending\"\n | \"archived\";\n\nexport type ContainerArchitecture = \"arm64\" | \"x86_64\";\n\nexport interface CloudContainer {\n id: string;\n name: string;\n project_name: string;\n description: string | null;\n organization_id: string;\n user_id: string;\n status: ContainerStatus;\n image_tag: string | null;\n port: number;\n desired_count: number;\n cpu: number;\n memory: number;\n architecture: ContainerArchitecture;\n environment_vars: Record<string, string>;\n health_check_path: string;\n load_balancer_url: string | null;\n ecr_repository_uri: string | null;\n ecr_image_tag: string | null;\n cloudformation_stack_name: string | null;\n billing_status: ContainerBillingStatus;\n total_billed: string;\n last_deployed_at: string | null;\n last_health_check: string | null;\n deployment_log: string | null;\n error_message: string | null;\n metadata: Record<string, unknown>;\n created_at: string;\n updated_at: string;\n}\n\nexport interface CreateContainerRequest {\n name: string;\n project_name: string;\n description?: string;\n port?: number;\n desired_count?: number;\n cpu?: number;\n memory?: number;\n environment_vars?: Record<string, string>;\n health_check_path?: string;\n ecr_image_uri: string;\n ecr_repository_uri?: string;\n image_tag?: string;\n architecture?: ContainerArchitecture;\n}\n\nexport interface CreateContainerResponse {\n success: boolean;\n data: CloudContainer;\n message: string;\n creditsDeducted: number;\n creditsRemaining: number;\n stackName: string;\n polling: {\n endpoint: string;\n intervalMs: number;\n expectedDurationMs: number;\n };\n}\n\nexport interface ContainerListResponse {\n success: boolean;\n data: CloudContainer[];\n}\n\nexport interface ContainerGetResponse {\n success: boolean;\n data: CloudContainer;\n}\n\nexport interface ContainerDeleteResponse {\n success: boolean;\n message?: string;\n}\n\nexport interface ContainerHealthResponse {\n success: boolean;\n data: {\n status: string;\n healthy: boolean;\n lastCheck: string | null;\n uptime: number | null;\n };\n}\n\n// ─── Auth Types ─────────────────────────────────────────────────────────────\n\nexport type DevicePlatform = \"ios\" | \"android\" | \"macos\" | \"windows\" | \"linux\" | \"web\";\n\nexport interface DeviceAuthRequest {\n deviceId: string;\n platform: DevicePlatform;\n appVersion: string;\n deviceName?: string;\n}\n\nexport interface DeviceAuthResponse {\n success: boolean;\n data: {\n apiKey: string;\n userId: string;\n organizationId: string;\n credits: number;\n isNew: boolean;\n };\n}\n\nexport interface CloudCredentials {\n apiKey: string;\n userId: string;\n organizationId: string;\n authenticatedAt: number;\n}\n\n// ─── Credits Types ──────────────────────────────────────────────────────────\n\nexport interface CreditBalanceResponse {\n success: boolean;\n data: {\n balance: number;\n currency: string;\n };\n}\n\nexport interface CreditSummaryResponse {\n success: boolean;\n data: {\n balance: number;\n totalSpent: number;\n totalAdded: number;\n recentTransactions: CreditTransaction[];\n };\n}\n\nexport interface CreditTransaction {\n id: string;\n amount: number;\n description: string;\n type: \"credit\" | \"debit\";\n created_at: string;\n}\n\n// ─── Bridge Types ───────────────────────────────────────────────────────────\n\nexport type BridgeConnectionState = \"disconnected\" | \"connecting\" | \"connected\" | \"reconnecting\";\n\nexport interface BridgeMessage {\n jsonrpc: \"2.0\";\n id?: string | number;\n method?: string;\n params?: Record<string, unknown>;\n result?: unknown;\n error?: BridgeError;\n}\n\nexport interface BridgeError {\n code: number;\n message: string;\n data?: unknown;\n}\n\nexport type BridgeMessageHandler = (message: BridgeMessage) => void;\n\nexport interface BridgeConnection {\n containerId: string;\n state: BridgeConnectionState;\n connectedAt: number | null;\n lastHeartbeat: number | null;\n reconnectAttempts: number;\n}\n\n// ─── Managed Gateway Relay Types ───────────────────────────────────────────\n\nexport interface GatewayRelaySession {\n id: string;\n organizationId: string;\n userId: string;\n runtimeAgentId: string;\n agentName: string | null;\n platform: \"local-runtime\";\n createdAt: string;\n lastSeenAt: string;\n}\n\nexport interface GatewayRelayRequest {\n jsonrpc: \"2.0\";\n id?: string | number;\n method: string;\n params?: Record<string, unknown>;\n}\n\nexport interface GatewayRelayResponse {\n jsonrpc: \"2.0\";\n id?: string | number;\n result?: Record<string, unknown>;\n error?: BridgeError;\n}\n\nexport interface GatewayRelayRequestEnvelope {\n requestId: string;\n rpc: GatewayRelayRequest;\n queuedAt: string;\n}\n\nexport interface RegisterGatewayRelaySessionResponse {\n success: boolean;\n data: {\n session: GatewayRelaySession;\n };\n}\n\nexport interface PollGatewayRelayResponse {\n success: boolean;\n data: {\n request: GatewayRelayRequestEnvelope | null;\n };\n}\n\n// ─── Snapshot / Backup Types ────────────────────────────────────────────────\n\nexport type SnapshotType = \"manual\" | \"auto\" | \"pre-eviction\";\n\nexport interface AgentSnapshot {\n id: string;\n containerId: string;\n organizationId: string;\n snapshotType: SnapshotType;\n storageUrl: string;\n sizeBytes: number;\n agentConfig: Record<string, unknown>;\n metadata: Record<string, unknown>;\n created_at: string;\n}\n\nexport interface CreateSnapshotRequest {\n snapshotType?: SnapshotType;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreateSnapshotResponse {\n success: boolean;\n data: AgentSnapshot;\n}\n\nexport interface SnapshotListResponse {\n success: boolean;\n data: AgentSnapshot[];\n}\n\nexport interface RestoreSnapshotRequest {\n snapshotId: string;\n}\n\nexport interface RestoreSnapshotResponse {\n success: boolean;\n message: string;\n}\n\n// ─── Cloud Config Types ─────────────────────────────────────────────────────\n\nexport type InferenceMode = \"cloud\" | \"byok\" | \"local\";\n\nexport interface CloudPluginConfig {\n /** Enable ElizaCloud integration. */\n enabled: boolean;\n /** ElizaCloud API base URL. */\n baseUrl: string;\n /** Stored API key for authenticated requests. */\n apiKey?: string;\n /** Device ID used for auto-signup authentication. */\n deviceId?: string;\n /** Platform identifier. */\n platform?: DevicePlatform;\n /** Inference mode: cloud (ElizaCloud proxied), byok (user keys), local (no cloud). */\n inferenceMode: InferenceMode;\n /** Auto-deploy agents to cloud on creation. */\n autoProvision: boolean;\n /** Bridge reconnection settings. */\n bridge: {\n reconnectIntervalMs: number;\n maxReconnectAttempts: number;\n heartbeatIntervalMs: number;\n };\n /** Auto-backup settings. */\n backup: {\n autoBackupIntervalMs: number;\n maxSnapshots: number;\n };\n /** Default container settings for new deployments. */\n container: {\n defaultImage: string;\n defaultArchitecture: ContainerArchitecture;\n defaultCpu: number;\n defaultMemory: number;\n defaultPort: number;\n };\n}\n\nexport const DEFAULT_CLOUD_CONFIG: CloudPluginConfig = {\n enabled: false,\n baseUrl: \"https://www.elizacloud.ai/api/v1\",\n inferenceMode: \"cloud\",\n autoProvision: false,\n bridge: {\n reconnectIntervalMs: 3000,\n maxReconnectAttempts: 20,\n heartbeatIntervalMs: 30_000,\n },\n backup: {\n autoBackupIntervalMs: 3_600_000, // 1 hour\n maxSnapshots: 10,\n },\n container: {\n defaultImage: \"elizaos/agent:latest\",\n defaultArchitecture: \"arm64\",\n defaultCpu: 1792,\n defaultMemory: 1792,\n defaultPort: 3000,\n },\n};\n\n// ─── API Error Types ────────────────────────────────────────────────────────\n\nexport type { CloudApiErrorBody } from \"@elizaos/cloud-sdk\";\nexport {\n CloudApiError,\n InsufficientCreditsError,\n} from \"@elizaos/cloud-sdk\";\n",
|
|
6
|
+
"/**\n * CloudBridgeService — WebSocket bridge to cloud-hosted agents.\n *\n * Establishes a JSON-RPC 2.0 WebSocket connection per container, allowing\n * the local eliza client to send messages to and receive events from\n * cloud-hosted ElizaOS agents. Handles reconnection with exponential\n * backoff and heartbeat keepalive.\n */\n\nimport { type IAgentRuntime, logger, Service } from \"@elizaos/core\";\nimport { WebSocket } from \"undici\";\nimport type {\n BridgeConnection,\n BridgeConnectionState,\n BridgeMessage,\n BridgeMessageHandler,\n} from \"../types/cloud\";\nimport { DEFAULT_CLOUD_CONFIG } from \"../types/cloud\";\nimport type { CloudAuthService } from \"./cloud-auth\";\n\ninterface ActiveConnection {\n ws: WebSocket | null;\n state: BridgeConnectionState;\n connectedAt: number | null;\n lastHeartbeat: number | null;\n reconnectAttempts: number;\n heartbeatTimer: ReturnType<typeof setInterval> | null;\n reconnectTimer: ReturnType<typeof setTimeout> | null;\n handlers: Set<BridgeMessageHandler>;\n pendingRequests: Map<\n string | number,\n {\n resolve: (value: unknown) => void;\n reject: (reason: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }\n >;\n nextRequestId: number;\n}\n\nfunction requireWebSocket(conn: ActiveConnection, containerId: string): WebSocket {\n if (!conn.ws) {\n throw new Error(`WebSocket not connected for container ${containerId}`);\n }\n return conn.ws;\n}\n\nexport class CloudBridgeService extends Service {\n static serviceType = \"CLOUD_BRIDGE\";\n capabilityDescription = \"WebSocket bridge to cloud-hosted ElizaOS agents\";\n\n private authService!: CloudAuthService;\n private readonly bridgeConfig = DEFAULT_CLOUD_CONFIG.bridge;\n private connections: Map<string, ActiveConnection> = new Map();\n\n static async start(runtime: IAgentRuntime): Promise<Service> {\n const service = new CloudBridgeService(runtime);\n await service.initialize();\n return service;\n }\n\n async stop(): Promise<void> {\n for (const [containerId] of this.connections) {\n await this.disconnect(containerId);\n }\n logger.info(\"[CloudBridge] Service stopped\");\n }\n\n private async initialize(): Promise<void> {\n const auth = this.runtime.getService(\"CLOUD_AUTH\");\n if (!auth) {\n logger.debug(\"[CloudBridge] CloudAuthService not available\");\n return;\n }\n this.authService = auth as CloudAuthService;\n logger.info(\"[CloudBridge] Service initialized\");\n }\n\n // ─── Connection Management ─────────────────────────────────────────────\n\n async connect(containerId: string): Promise<void> {\n const existing = this.connections.get(containerId);\n if (existing) {\n if (existing.state === \"connected\" || existing.state === \"connecting\") {\n logger.debug(`[CloudBridge] Already connected/connecting to ${containerId}`);\n return;\n }\n }\n\n await this.establishConnection(containerId, 0);\n }\n\n async disconnect(containerId: string): Promise<void> {\n const conn = this.connections.get(containerId);\n if (!conn) return;\n\n if (conn.heartbeatTimer) clearInterval(conn.heartbeatTimer);\n if (conn.reconnectTimer) clearTimeout(conn.reconnectTimer);\n\n // Reject all pending requests\n for (const [, pending] of conn.pendingRequests) {\n clearTimeout(pending.timeout);\n pending.reject(new Error(\"Bridge disconnected\"));\n }\n conn.pendingRequests.clear();\n\n const ws = conn.ws;\n if (ws && (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING)) {\n ws.close(1000, \"Client disconnect\");\n }\n\n this.connections.delete(containerId);\n logger.info(`[CloudBridge] Disconnected from ${containerId}`);\n }\n\n private async establishConnection(containerId: string, reconnectAttempts: number): Promise<void> {\n const client = this.authService.getClient();\n const apiKey = this.authService.getApiKey();\n const wsUrl = client.buildWsUrl(`/agent-bridge/${containerId}`);\n\n // Append API key as query parameter for WebSocket auth\n const authUrl = apiKey ? `${wsUrl}?token=${encodeURIComponent(apiKey)}` : wsUrl;\n const ws = new WebSocket(authUrl);\n\n const conn: ActiveConnection = {\n ws,\n state: \"connecting\",\n connectedAt: null,\n lastHeartbeat: null,\n reconnectAttempts,\n heartbeatTimer: null,\n reconnectTimer: null,\n handlers: this.connections.get(containerId)?.handlers ?? new Set(),\n pendingRequests: new Map(),\n nextRequestId: 1,\n };\n\n this.connections.set(containerId, conn);\n\n ws.addEventListener(\"open\", () => {\n conn.state = \"connected\";\n conn.connectedAt = Date.now();\n conn.reconnectAttempts = 0;\n logger.info(`[CloudBridge] Connected to agent ${containerId}`);\n\n // Start heartbeat\n conn.heartbeatTimer = setInterval(() => {\n this.sendHeartbeat(containerId);\n }, this.bridgeConfig.heartbeatIntervalMs);\n });\n\n ws.addEventListener(\"message\", (event) => {\n const raw = event.data;\n const data =\n typeof raw === \"string\" ? raw : raw instanceof Buffer ? raw.toString(\"utf-8\") : String(raw);\n const message = JSON.parse(data) as BridgeMessage;\n\n // Handle heartbeat responses\n if (message.method === \"heartbeat.ack\") {\n conn.lastHeartbeat = Date.now();\n return;\n }\n\n // Handle responses to pending requests\n if (message.id !== undefined && !message.method) {\n const pending = conn.pendingRequests.get(message.id);\n if (pending) {\n clearTimeout(pending.timeout);\n conn.pendingRequests.delete(message.id);\n if (message.error) {\n pending.reject(new Error(message.error.message));\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n }\n\n // Dispatch to handlers\n for (const handler of conn.handlers) {\n handler(message);\n }\n });\n\n ws.addEventListener(\"close\", (event: CloseEvent) => {\n conn.state = \"disconnected\";\n if (conn.heartbeatTimer) clearInterval(conn.heartbeatTimer);\n\n // Don't reconnect on clean close\n if (event.code === 1000) {\n logger.info(`[CloudBridge] Clean disconnect from ${containerId}`);\n return;\n }\n\n logger.warn(\n `[CloudBridge] Connection lost to ${containerId} (code=${event.code}, reason=${event.reason})`\n );\n this.scheduleReconnect(containerId, conn.reconnectAttempts + 1);\n });\n\n ws.addEventListener(\"error\", () => {\n logger.error(`[CloudBridge] WebSocket error for ${containerId}`);\n });\n }\n\n private scheduleReconnect(containerId: string, attempt: number): void {\n if (attempt > this.bridgeConfig.maxReconnectAttempts) {\n logger.error(\n `[CloudBridge] Max reconnect attempts (${this.bridgeConfig.maxReconnectAttempts}) reached for ${containerId}`\n );\n this.connections.delete(containerId);\n return;\n }\n\n // Exponential backoff with jitter: base * 2^attempt + random jitter\n const base = this.bridgeConfig.reconnectIntervalMs;\n const delay = Math.min(base * 2 ** Math.min(attempt, 5), 120_000);\n const jitter = Math.floor(Math.random() * 1000);\n\n logger.info(\n `[CloudBridge] Reconnecting to ${containerId} in ${Math.round((delay + jitter) / 1000)}s (attempt ${attempt})`\n );\n\n const conn = this.connections.get(containerId);\n if (conn) {\n conn.state = \"reconnecting\";\n conn.reconnectTimer = setTimeout(() => {\n this.establishConnection(containerId, attempt);\n }, delay + jitter);\n }\n }\n\n private sendHeartbeat(containerId: string): void {\n const conn = this.connections.get(containerId);\n if (!conn || conn.state !== \"connected\") return;\n\n const message: BridgeMessage = {\n jsonrpc: \"2.0\",\n method: \"heartbeat\",\n params: { timestamp: Date.now() },\n };\n\n requireWebSocket(conn, containerId).send(JSON.stringify(message));\n }\n\n // ─── Messaging ─────────────────────────────────────────────────────────\n\n /**\n * Send a JSON-RPC request and wait for a response.\n */\n async sendRequest(\n containerId: string,\n method: string,\n params: Record<string, unknown>,\n timeoutMs = 60_000\n ): Promise<unknown> {\n const conn = this.connections.get(containerId);\n if (!conn || conn.state !== \"connected\") {\n throw new Error(`Not connected to container ${containerId}`);\n }\n\n const id = conn.nextRequestId++;\n const message: BridgeMessage = {\n jsonrpc: \"2.0\",\n id,\n method,\n params,\n };\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n conn.pendingRequests.delete(id);\n reject(new Error(`Request ${method} timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n conn.pendingRequests.set(id, { resolve, reject, timeout });\n requireWebSocket(conn, containerId).send(JSON.stringify(message));\n });\n }\n\n /**\n * Send a one-way notification (no response expected).\n */\n sendNotification(containerId: string, method: string, params: Record<string, unknown>): void {\n const conn = this.connections.get(containerId);\n if (!conn || conn.state !== \"connected\") {\n throw new Error(`Not connected to container ${containerId}`);\n }\n\n const message: BridgeMessage = {\n jsonrpc: \"2.0\",\n method,\n params,\n };\n\n requireWebSocket(conn, containerId).send(JSON.stringify(message));\n }\n\n /**\n * Send a chat message to the cloud agent and get the response.\n */\n async sendChatMessage(\n containerId: string,\n text: string,\n roomId?: string,\n metadata?: Record<string, unknown>\n ): Promise<{ text: string; metadata?: Record<string, unknown> }> {\n const result = await this.sendRequest(containerId, \"message.send\", {\n text,\n roomId,\n metadata,\n });\n return result as { text: string; metadata?: Record<string, unknown> };\n }\n\n /**\n * Request the cloud agent's current status.\n */\n async getAgentStatus(containerId: string): Promise<Record<string, unknown>> {\n const result = await this.sendRequest(containerId, \"status.get\", {});\n return result as Record<string, unknown>;\n }\n\n /**\n * Update the cloud agent's configuration.\n */\n async updateAgentConfig(containerId: string, config: Record<string, unknown>): Promise<void> {\n await this.sendRequest(containerId, \"config.update\", config);\n }\n\n // ─── Event Handlers ────────────────────────────────────────────────────\n\n onMessage(containerId: string, handler: BridgeMessageHandler): () => void {\n let conn = this.connections.get(containerId);\n if (!conn) {\n // Pre-register handler before connection is established\n conn = {\n ws: null,\n state: \"disconnected\",\n connectedAt: null,\n lastHeartbeat: null,\n reconnectAttempts: 0,\n heartbeatTimer: null,\n reconnectTimer: null,\n handlers: new Set(),\n pendingRequests: new Map(),\n nextRequestId: 1,\n };\n this.connections.set(containerId, conn);\n }\n\n conn.handlers.add(handler);\n\n // Return unsubscribe function\n return () => {\n conn.handlers.delete(handler);\n };\n }\n\n // ─── Accessors ─────────────────────────────────────────────────────────\n\n getConnectionState(containerId: string): BridgeConnectionState {\n return this.connections.get(containerId)?.state ?? \"disconnected\";\n }\n\n getConnectionInfo(containerId: string): BridgeConnection | null {\n const conn = this.connections.get(containerId);\n if (!conn) return null;\n\n return {\n containerId,\n state: conn.state,\n connectedAt: conn.connectedAt,\n lastHeartbeat: conn.lastHeartbeat,\n reconnectAttempts: conn.reconnectAttempts,\n };\n }\n\n getConnectedContainerIds(): string[] {\n const ids: string[] = [];\n for (const [id, conn] of this.connections) {\n if (conn.state === \"connected\") ids.push(id);\n }\n return ids;\n }\n}\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "0C81D369BEE5065864756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-container.d.ts","sourceRoot":"","sources":["../../services/cloud-container.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,aAAa,EAAU,OAAO,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EACV,cAAc,EAGd,uBAAuB,EAEvB,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,gBAAgB,CAAC;AAYxB,qBAAa,qBAAsB,SAAQ,OAAO;IAChD,MAAM,CAAC,WAAW,SAAqB;IACvC,qBAAqB,SAAgE;IAErF,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAkC;IACpE,OAAO,CAAC,OAAO,CAA4C;WAE9C,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAMtD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAQb,UAAU;IAuCxB,OAAO,CAAC,SAAS;IAMX,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAuClF,cAAc,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAM3C,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAa1D,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBzD;;;OAGG;IACH,OAAO,CAAC,YAAY;IA+CpB;;;OAGG;IACG,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,SAAU,GAAG,OAAO,CAAC,cAAc,CAAC;IA2B1F,OAAO,CAAC,qBAAqB;IAqBvB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAO/E,oBAAoB,IAAI,cAAc,EAAE;IAIxC,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIpE,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAIhD,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAGpD"}
|
|
1
|
+
{"version":3,"file":"cloud-container.d.ts","sourceRoot":"","sources":["../../src/services/cloud-container.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,aAAa,EAAU,OAAO,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EACV,cAAc,EAGd,uBAAuB,EAEvB,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,gBAAgB,CAAC;AAYxB,qBAAa,qBAAsB,SAAQ,OAAO;IAChD,MAAM,CAAC,WAAW,SAAqB;IACvC,qBAAqB,SAAgE;IAErF,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAkC;IACpE,OAAO,CAAC,OAAO,CAA4C;WAE9C,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAMtD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAQb,UAAU;IAuCxB,OAAO,CAAC,SAAS;IAMX,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAuClF,cAAc,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAM3C,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAa1D,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBzD;;;OAGG;IACH,OAAO,CAAC,YAAY;IA+CpB;;;OAGG;IACG,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,SAAU,GAAG,OAAO,CAAC,cAAc,CAAC;IA2B1F,OAAO,CAAC,qBAAqB;IAqBvB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAO/E,oBAAoB,IAAI,cAAc,EAAE;IAIxC,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIpE,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAIhD,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAGpD"}
|