@elizaos/plugin-elizacloud 2.0.0-alpha.8 → 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 -38
- package/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.node.cjs +12165 -2277
- package/dist/cjs/index.node.js.map +135 -28
- 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 -3
- 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 +14 -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 +12170 -2266
- package/dist/node/index.node.js.map +135 -28
- 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,853 @@
|
|
|
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
|
+
function isLoopbackHost(hostname) {
|
|
21
|
+
const normalized = hostname.toLowerCase();
|
|
22
|
+
return normalized === "localhost" || normalized === "::1" || normalized === "0:0:0:0:0:0:0:1" || normalized.startsWith("127.");
|
|
23
|
+
}
|
|
24
|
+
function trimApiPath(pathname) {
|
|
25
|
+
const normalized = pathname.trim().replace(/\/+$/, "");
|
|
26
|
+
if (!normalized)
|
|
27
|
+
return "";
|
|
28
|
+
if (normalized === "/api/v1")
|
|
29
|
+
return "";
|
|
30
|
+
if (normalized.endsWith("/api/v1")) {
|
|
31
|
+
return normalized.slice(0, -"/api/v1".length);
|
|
32
|
+
}
|
|
33
|
+
return normalized;
|
|
34
|
+
}
|
|
35
|
+
function normalizeCloudSiteUrl(rawUrl) {
|
|
36
|
+
const envOverride = process.env.ELIZAOS_CLOUD_BASE_URL?.trim();
|
|
37
|
+
const candidate = envOverride || rawUrl?.trim() || DEFAULT_CLOUD_SITE_URL;
|
|
38
|
+
try {
|
|
39
|
+
const parsed = new URL(candidate);
|
|
40
|
+
const pathname = trimApiPath(parsed.pathname);
|
|
41
|
+
const host = parsed.hostname.toLowerCase();
|
|
42
|
+
const preserveLocalOrigin = isLoopbackHost(host);
|
|
43
|
+
parsed.hash = "";
|
|
44
|
+
parsed.search = "";
|
|
45
|
+
if (!preserveLocalOrigin) {
|
|
46
|
+
parsed.protocol = "https:";
|
|
47
|
+
parsed.port = "";
|
|
48
|
+
}
|
|
49
|
+
parsed.pathname = pathname;
|
|
50
|
+
if (LEGACY_CLOUD_HOST_ALIASES.has(host)) {
|
|
51
|
+
parsed.hostname = "www.elizacloud.ai";
|
|
52
|
+
parsed.pathname = "";
|
|
53
|
+
}
|
|
54
|
+
return parsed.toString().replace(/\/{1,1024}$/, "");
|
|
55
|
+
} catch {
|
|
56
|
+
const safeCandidate = candidate.length > 8192 ? candidate.slice(0, 8192) : candidate;
|
|
57
|
+
return safeCandidate.replace(/\/{1,1024}$/, "");
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function resolveCloudApiBaseUrl(rawUrl) {
|
|
61
|
+
return `${normalizeCloudSiteUrl(rawUrl)}/api/v1`;
|
|
62
|
+
}
|
|
63
|
+
var DEFAULT_CLOUD_SITE_URL = "https://www.elizacloud.ai", LEGACY_CLOUD_HOST_ALIASES;
|
|
64
|
+
var init_base_url = __esm(() => {
|
|
65
|
+
LEGACY_CLOUD_HOST_ALIASES = new Set([
|
|
66
|
+
"elizacloud.ai",
|
|
67
|
+
"www.elizacloud.ai"
|
|
68
|
+
]);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
// src/cloud/validate-url.ts
|
|
72
|
+
import dns from "node:dns";
|
|
73
|
+
import net from "node:net";
|
|
74
|
+
import { promisify } from "node:util";
|
|
75
|
+
function normalizeHostLike(value) {
|
|
76
|
+
return value.trim().toLowerCase().replace(/^\[|\]$/g, "");
|
|
77
|
+
}
|
|
78
|
+
function decodeIpv6MappedHex(mapped) {
|
|
79
|
+
const parts = mapped.split(":");
|
|
80
|
+
if (parts.length < 1 || parts.length > 2)
|
|
81
|
+
return null;
|
|
82
|
+
const parsed = parts.map((part) => {
|
|
83
|
+
if (!/^[0-9a-f]{1,4}$/i.test(part))
|
|
84
|
+
return Number.NaN;
|
|
85
|
+
return Number.parseInt(part, 16);
|
|
86
|
+
});
|
|
87
|
+
if (parsed.some((value) => !Number.isFinite(value)))
|
|
88
|
+
return null;
|
|
89
|
+
const [hi, lo] = parsed.length === 1 ? [0, parsed[0]] : parsed;
|
|
90
|
+
const octets = [hi >> 8, hi & 255, lo >> 8, lo & 255];
|
|
91
|
+
return octets.join(".");
|
|
92
|
+
}
|
|
93
|
+
function canonicalizeIpv6(ip) {
|
|
94
|
+
try {
|
|
95
|
+
return new URL(`http://[${ip}]/`).hostname.replace(/^\[|\]$/g, "");
|
|
96
|
+
} catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function normalizeIpForPolicy(ip) {
|
|
101
|
+
const base = normalizeHostLike(ip).split("%")[0];
|
|
102
|
+
if (!base)
|
|
103
|
+
return base;
|
|
104
|
+
let normalized = base;
|
|
105
|
+
if (net.isIP(normalized) === 6) {
|
|
106
|
+
normalized = canonicalizeIpv6(normalized) ?? normalized;
|
|
107
|
+
}
|
|
108
|
+
let mapped = null;
|
|
109
|
+
if (normalized.startsWith("::ffff:")) {
|
|
110
|
+
mapped = normalized.slice("::ffff:".length);
|
|
111
|
+
} else if (normalized.startsWith("0:0:0:0:0:ffff:")) {
|
|
112
|
+
mapped = normalized.slice("0:0:0:0:0:ffff:".length);
|
|
113
|
+
}
|
|
114
|
+
if (!mapped)
|
|
115
|
+
return normalized;
|
|
116
|
+
if (net.isIP(mapped) === 4)
|
|
117
|
+
return mapped;
|
|
118
|
+
return decodeIpv6MappedHex(mapped) ?? normalized;
|
|
119
|
+
}
|
|
120
|
+
function cidrV4(base, prefix) {
|
|
121
|
+
const parsed = parseIpv4ToInt(base);
|
|
122
|
+
if (parsed === null) {
|
|
123
|
+
throw new Error(`Invalid CIDR base IPv4 address: ${base}`);
|
|
124
|
+
}
|
|
125
|
+
const shift = 32 - prefix;
|
|
126
|
+
const mask = shift === 32 ? 0 : 4294967295 << shift >>> 0;
|
|
127
|
+
return { base: parsed & mask, mask };
|
|
128
|
+
}
|
|
129
|
+
function parseIpv4ToInt(ip) {
|
|
130
|
+
const parts = ip.split(".");
|
|
131
|
+
if (parts.length !== 4)
|
|
132
|
+
return null;
|
|
133
|
+
let value = 0;
|
|
134
|
+
for (const part of parts) {
|
|
135
|
+
if (!/^\d{1,3}$/.test(part))
|
|
136
|
+
return null;
|
|
137
|
+
const octet = Number.parseInt(part, 10);
|
|
138
|
+
if (!Number.isInteger(octet) || octet < 0 || octet > 255)
|
|
139
|
+
return null;
|
|
140
|
+
value = value << 8 | octet;
|
|
141
|
+
}
|
|
142
|
+
return value >>> 0;
|
|
143
|
+
}
|
|
144
|
+
function isBlockedIpv4(ip) {
|
|
145
|
+
const asInt = parseIpv4ToInt(ip);
|
|
146
|
+
if (asInt === null)
|
|
147
|
+
return true;
|
|
148
|
+
return BLOCKED_IPV4_CIDRS.some((cidr) => (asInt & cidr.mask) === cidr.base);
|
|
149
|
+
}
|
|
150
|
+
function isBlockedIpv6(ip) {
|
|
151
|
+
const normalized = ip.toLowerCase();
|
|
152
|
+
return normalized === "::" || normalized === "::1" || /^fe[89ab][0-9a-f]:/.test(normalized) || /^f[cd][0-9a-f]{2}:/i.test(normalized) || normalized.startsWith("ff");
|
|
153
|
+
}
|
|
154
|
+
function isBlockedIp(ip) {
|
|
155
|
+
const normalized = normalizeIpForPolicy(ip);
|
|
156
|
+
const family = net.isIP(normalized);
|
|
157
|
+
if (family === 4)
|
|
158
|
+
return isBlockedIpv4(normalized);
|
|
159
|
+
if (family === 6)
|
|
160
|
+
return isBlockedIpv6(normalized);
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
async function validateCloudBaseUrl(rawUrl) {
|
|
164
|
+
let parsed;
|
|
165
|
+
try {
|
|
166
|
+
parsed = new URL(rawUrl);
|
|
167
|
+
} catch {
|
|
168
|
+
return `Invalid cloud base URL: "${rawUrl}"`;
|
|
169
|
+
}
|
|
170
|
+
if (parsed.protocol !== "https:") {
|
|
171
|
+
return `Cloud base URL must use HTTPS, got "${parsed.protocol}" in "${rawUrl}"`;
|
|
172
|
+
}
|
|
173
|
+
const hostname = normalizeHostLike(parsed.hostname);
|
|
174
|
+
if (!hostname) {
|
|
175
|
+
return `Invalid cloud base URL: "${rawUrl}"`;
|
|
176
|
+
}
|
|
177
|
+
if (hostname === "localhost" || hostname.endsWith(".localhost") || hostname.endsWith(".local")) {
|
|
178
|
+
return `Cloud base URL "${rawUrl}" points to a blocked local hostname.`;
|
|
179
|
+
}
|
|
180
|
+
if (true) {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
if (isBlockedIp(hostname)) {
|
|
184
|
+
return `Cloud base URL "${rawUrl}" points to a blocked address.`;
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
const results = await dnsLookupAll(hostname, { all: true });
|
|
188
|
+
const addresses = Array.isArray(results) ? results : [results];
|
|
189
|
+
for (const entry of addresses) {
|
|
190
|
+
const ip = typeof entry === "string" ? entry : entry.address;
|
|
191
|
+
if (isBlockedIp(ip)) {
|
|
192
|
+
return `Cloud base URL "${rawUrl}" resolves to ${ip}, ` + "which is a blocked internal/metadata address.";
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
} catch {
|
|
196
|
+
return `Cloud base URL "${rawUrl}" could not be resolved via DNS.`;
|
|
197
|
+
}
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
var dnsLookupAll, BLOCKED_IPV4_CIDRS;
|
|
201
|
+
var init_validate_url = __esm(() => {
|
|
202
|
+
dnsLookupAll = promisify(dns.lookup);
|
|
203
|
+
BLOCKED_IPV4_CIDRS = [
|
|
204
|
+
cidrV4("0.0.0.0", 8),
|
|
205
|
+
cidrV4("10.0.0.0", 8),
|
|
206
|
+
cidrV4("172.16.0.0", 12),
|
|
207
|
+
cidrV4("192.168.0.0", 16),
|
|
208
|
+
cidrV4("100.64.0.0", 10),
|
|
209
|
+
cidrV4("127.0.0.0", 8),
|
|
210
|
+
cidrV4("169.254.0.0", 16),
|
|
211
|
+
cidrV4("192.0.0.0", 24),
|
|
212
|
+
cidrV4("198.18.0.0", 15),
|
|
213
|
+
cidrV4("192.0.2.0", 24),
|
|
214
|
+
cidrV4("198.51.100.0", 24),
|
|
215
|
+
cidrV4("203.0.113.0", 24),
|
|
216
|
+
cidrV4("224.0.0.0", 4),
|
|
217
|
+
cidrV4("240.0.0.0", 4)
|
|
218
|
+
];
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
// src/cloud/backup.ts
|
|
222
|
+
import { logger } from "@elizaos/core";
|
|
223
|
+
|
|
224
|
+
class BackupScheduler {
|
|
225
|
+
client;
|
|
226
|
+
agentId;
|
|
227
|
+
intervalMs;
|
|
228
|
+
timer = null;
|
|
229
|
+
running = false;
|
|
230
|
+
constructor(client, agentId, intervalMs = 60000) {
|
|
231
|
+
this.client = client;
|
|
232
|
+
this.agentId = agentId;
|
|
233
|
+
this.intervalMs = intervalMs;
|
|
234
|
+
}
|
|
235
|
+
start() {
|
|
236
|
+
if (this.timer)
|
|
237
|
+
return;
|
|
238
|
+
this.running = true;
|
|
239
|
+
this.timer = setInterval(() => {
|
|
240
|
+
this.client.snapshot(this.agentId).catch((err) => {
|
|
241
|
+
logger.warn(`[cloud-backup] Auto-backup failed: ${String(err)}`);
|
|
242
|
+
});
|
|
243
|
+
}, this.intervalMs);
|
|
244
|
+
}
|
|
245
|
+
stop() {
|
|
246
|
+
if (this.timer) {
|
|
247
|
+
clearInterval(this.timer);
|
|
248
|
+
this.timer = null;
|
|
249
|
+
}
|
|
250
|
+
this.running = false;
|
|
251
|
+
}
|
|
252
|
+
isRunning() {
|
|
253
|
+
return this.running;
|
|
254
|
+
}
|
|
255
|
+
async finalSnapshot() {
|
|
256
|
+
await this.client.snapshot(this.agentId).catch((err) => {
|
|
257
|
+
logger.warn(`[cloud-backup] Final snapshot failed: ${String(err)}`);
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// src/cloud/bridge-client.ts
|
|
263
|
+
init_base_url();
|
|
264
|
+
|
|
265
|
+
class CloudBridgeError extends Error {
|
|
266
|
+
status;
|
|
267
|
+
body;
|
|
268
|
+
constructor(message, status, body) {
|
|
269
|
+
super(message);
|
|
270
|
+
this.status = status;
|
|
271
|
+
this.body = body;
|
|
272
|
+
this.name = "CloudBridgeError";
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
class SignatureInvalidError extends CloudBridgeError {
|
|
277
|
+
constructor(message, body) {
|
|
278
|
+
super(message, 401, body);
|
|
279
|
+
this.name = "SignatureInvalidError";
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
class NonceReplayError extends CloudBridgeError {
|
|
284
|
+
constructor(message, body) {
|
|
285
|
+
super(message, 409, body);
|
|
286
|
+
this.name = "NonceReplayError";
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
class SessionExpiredError extends CloudBridgeError {
|
|
291
|
+
constructor(message, body) {
|
|
292
|
+
super(message, 410, body);
|
|
293
|
+
this.name = "SessionExpiredError";
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
class CloudUnavailableError extends CloudBridgeError {
|
|
298
|
+
constructor(message, status, body) {
|
|
299
|
+
super(message, status, body);
|
|
300
|
+
this.name = "CloudUnavailableError";
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
function formatApiErrorBody(text) {
|
|
304
|
+
if (!text)
|
|
305
|
+
return null;
|
|
306
|
+
try {
|
|
307
|
+
const parsed = JSON.parse(text);
|
|
308
|
+
const baseError = typeof parsed.error === "string" && parsed.error.trim().length > 0 ? parsed.error.trim() : null;
|
|
309
|
+
const details = Array.isArray(parsed.details) ? parsed.details.map((detail) => typeof detail?.message === "string" ? detail.message.trim() : "").filter((message) => message.length > 0) : [];
|
|
310
|
+
if (baseError && details.length > 0) {
|
|
311
|
+
return `${baseError}: ${details.join("; ")}`;
|
|
312
|
+
}
|
|
313
|
+
if (baseError)
|
|
314
|
+
return baseError;
|
|
315
|
+
} catch {}
|
|
316
|
+
return text.slice(0, 200) || null;
|
|
317
|
+
}
|
|
318
|
+
function isRedirectResponse(response) {
|
|
319
|
+
return response.status >= 300 && response.status < 400;
|
|
320
|
+
}
|
|
321
|
+
function normalizeChainAddress(addresses, chain) {
|
|
322
|
+
const value = addresses?.[chain];
|
|
323
|
+
if (typeof value !== "string")
|
|
324
|
+
return null;
|
|
325
|
+
const trimmed = value.trim();
|
|
326
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
327
|
+
}
|
|
328
|
+
function looksLikeChainAddress(address, chain) {
|
|
329
|
+
if (chain === "evm") {
|
|
330
|
+
return /^0x[a-fA-F0-9]{40}$/.test(address);
|
|
331
|
+
}
|
|
332
|
+
return /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(address);
|
|
333
|
+
}
|
|
334
|
+
function resolveRequestedWalletAddress(data, chain) {
|
|
335
|
+
const explicit = normalizeChainAddress(data.walletAddresses, chain);
|
|
336
|
+
if (explicit)
|
|
337
|
+
return explicit;
|
|
338
|
+
if (typeof data.walletAddress !== "string")
|
|
339
|
+
return null;
|
|
340
|
+
const trimmed = data.walletAddress.trim();
|
|
341
|
+
if (!trimmed)
|
|
342
|
+
return null;
|
|
343
|
+
return looksLikeChainAddress(trimmed, chain) ? trimmed : null;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
class ElizaCloudClient {
|
|
347
|
+
baseUrl;
|
|
348
|
+
apiKey;
|
|
349
|
+
constructor(baseUrl, apiKey) {
|
|
350
|
+
this.baseUrl = normalizeCloudSiteUrl(baseUrl);
|
|
351
|
+
this.apiKey = apiKey;
|
|
352
|
+
}
|
|
353
|
+
async listAgents() {
|
|
354
|
+
const res = await this.request("GET", "/api/v1/eliza/agents");
|
|
355
|
+
return res.data ?? [];
|
|
356
|
+
}
|
|
357
|
+
async createAgent(params) {
|
|
358
|
+
const res = await this.request("POST", "/api/v1/eliza/agents", params);
|
|
359
|
+
if (!res.success || !res.data)
|
|
360
|
+
throw new Error(res.error ?? "Failed to create cloud agent");
|
|
361
|
+
return res.data;
|
|
362
|
+
}
|
|
363
|
+
async getAgent(agentId) {
|
|
364
|
+
const res = await this.request("GET", `/api/v1/eliza/agents/${agentId}`);
|
|
365
|
+
if (!res.success || !res.data)
|
|
366
|
+
throw new Error(res.error ?? "Agent not found");
|
|
367
|
+
return res.data;
|
|
368
|
+
}
|
|
369
|
+
async deleteAgent(agentId) {
|
|
370
|
+
const res = await this.request("DELETE", `/api/v1/eliza/agents/${agentId}`);
|
|
371
|
+
if (!res.success)
|
|
372
|
+
throw new Error(res.error ?? "Failed to delete agent");
|
|
373
|
+
}
|
|
374
|
+
async provision(agentId) {
|
|
375
|
+
const res = await this.request("POST", `/api/v1/eliza/agents/${agentId}/provision`);
|
|
376
|
+
if (!res.success || !res.data)
|
|
377
|
+
throw new Error(res.error ?? "Failed to provision sandbox");
|
|
378
|
+
return res.data;
|
|
379
|
+
}
|
|
380
|
+
async sendMessage(agentId, text, roomId = "web-chat", channelType = "DM") {
|
|
381
|
+
const url = `${this.baseUrl}/api/v1/eliza/agents/${agentId}/bridge`;
|
|
382
|
+
const response = await fetch(url, {
|
|
383
|
+
method: "POST",
|
|
384
|
+
headers: { "Content-Type": "application/json", "X-Api-Key": this.apiKey },
|
|
385
|
+
body: JSON.stringify({
|
|
386
|
+
jsonrpc: "2.0",
|
|
387
|
+
id: crypto.randomUUID(),
|
|
388
|
+
method: "message.send",
|
|
389
|
+
params: { text, roomId, channelType }
|
|
390
|
+
}),
|
|
391
|
+
redirect: "manual",
|
|
392
|
+
signal: AbortSignal.timeout(60000)
|
|
393
|
+
});
|
|
394
|
+
if (isRedirectResponse(response)) {
|
|
395
|
+
throw new Error("Bridge request was redirected; redirects are not allowed");
|
|
396
|
+
}
|
|
397
|
+
if (!response.ok) {
|
|
398
|
+
const errorText = await response.text().catch(() => "");
|
|
399
|
+
throw new Error(`Bridge request failed: HTTP ${response.status} ${errorText.slice(0, 200)}`);
|
|
400
|
+
}
|
|
401
|
+
const rpc = await response.json();
|
|
402
|
+
if (rpc.error)
|
|
403
|
+
throw new Error(rpc.error.message);
|
|
404
|
+
return rpc.result?.text ?? "(no response)";
|
|
405
|
+
}
|
|
406
|
+
async* sendMessageStream(agentId, text, roomId = "web-chat", channelType = "DM") {
|
|
407
|
+
const url = `${this.baseUrl}/api/v1/eliza/agents/${agentId}/stream`;
|
|
408
|
+
const response = await fetch(url, {
|
|
409
|
+
method: "POST",
|
|
410
|
+
headers: { "Content-Type": "application/json", "X-Api-Key": this.apiKey },
|
|
411
|
+
body: JSON.stringify({
|
|
412
|
+
jsonrpc: "2.0",
|
|
413
|
+
id: crypto.randomUUID(),
|
|
414
|
+
method: "message.send",
|
|
415
|
+
params: { text, roomId, channelType }
|
|
416
|
+
}),
|
|
417
|
+
redirect: "manual"
|
|
418
|
+
});
|
|
419
|
+
if (isRedirectResponse(response)) {
|
|
420
|
+
throw new Error("Stream request was redirected; redirects are not allowed");
|
|
421
|
+
}
|
|
422
|
+
if (!response.ok || !response.body) {
|
|
423
|
+
throw new Error(`Stream request failed: HTTP ${response.status}`);
|
|
424
|
+
}
|
|
425
|
+
const reader = response.body.getReader();
|
|
426
|
+
const decoder = new TextDecoder;
|
|
427
|
+
let buffer = "";
|
|
428
|
+
for (;; ) {
|
|
429
|
+
const { done, value } = await reader.read();
|
|
430
|
+
if (done)
|
|
431
|
+
break;
|
|
432
|
+
buffer += decoder.decode(value, { stream: true });
|
|
433
|
+
const parts = buffer.split(`
|
|
434
|
+
|
|
435
|
+
`);
|
|
436
|
+
buffer = parts.pop() ?? "";
|
|
437
|
+
for (const part of parts) {
|
|
438
|
+
if (!part.trim())
|
|
439
|
+
continue;
|
|
440
|
+
let eventType = "message";
|
|
441
|
+
let eventData = "";
|
|
442
|
+
for (const line of part.split(`
|
|
443
|
+
`)) {
|
|
444
|
+
if (line.startsWith("event: "))
|
|
445
|
+
eventType = line.slice(7).trim();
|
|
446
|
+
else if (line.startsWith("data: "))
|
|
447
|
+
eventData += (eventData ? `
|
|
448
|
+
` : "") + line.slice(6);
|
|
449
|
+
}
|
|
450
|
+
if (eventData) {
|
|
451
|
+
let data;
|
|
452
|
+
try {
|
|
453
|
+
data = JSON.parse(eventData);
|
|
454
|
+
} catch {
|
|
455
|
+
continue;
|
|
456
|
+
}
|
|
457
|
+
yield { type: eventType, data };
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
async snapshot(agentId) {
|
|
463
|
+
const res = await this.request("POST", `/api/v1/eliza/agents/${agentId}/snapshot`);
|
|
464
|
+
if (!res.success || !res.data)
|
|
465
|
+
throw new Error(res.error ?? "Snapshot failed");
|
|
466
|
+
return res.data;
|
|
467
|
+
}
|
|
468
|
+
async listBackups(agentId) {
|
|
469
|
+
const res = await this.request("GET", `/api/v1/eliza/agents/${agentId}/backups`);
|
|
470
|
+
return res.data ?? [];
|
|
471
|
+
}
|
|
472
|
+
async restore(agentId, backupId) {
|
|
473
|
+
const res = await this.request("POST", `/api/v1/eliza/agents/${agentId}/restore`, backupId ? { backupId } : {});
|
|
474
|
+
if (!res.success)
|
|
475
|
+
throw new Error(res.error ?? "Restore failed");
|
|
476
|
+
}
|
|
477
|
+
async heartbeat(agentId) {
|
|
478
|
+
const url = `${this.baseUrl}/api/v1/eliza/agents/${agentId}/bridge`;
|
|
479
|
+
try {
|
|
480
|
+
const response = await fetch(url, {
|
|
481
|
+
method: "POST",
|
|
482
|
+
headers: {
|
|
483
|
+
"Content-Type": "application/json",
|
|
484
|
+
"X-Api-Key": this.apiKey
|
|
485
|
+
},
|
|
486
|
+
body: JSON.stringify({ jsonrpc: "2.0", method: "heartbeat" }),
|
|
487
|
+
redirect: "manual",
|
|
488
|
+
signal: AbortSignal.timeout(1e4)
|
|
489
|
+
});
|
|
490
|
+
if (isRedirectResponse(response))
|
|
491
|
+
return false;
|
|
492
|
+
return response.ok;
|
|
493
|
+
} catch {
|
|
494
|
+
return false;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
async getAgentWallet(agentId, chain) {
|
|
498
|
+
const res = await this.request("GET", `/api/v1/eliza/agents/${encodeURIComponent(agentId)}/wallet?chain=${encodeURIComponent(chain)}`);
|
|
499
|
+
if (!res.success || !res.data) {
|
|
500
|
+
throw new CloudBridgeError(res.error ?? "Failed to fetch agent wallet");
|
|
501
|
+
}
|
|
502
|
+
const data = res.data;
|
|
503
|
+
const walletAddress = resolveRequestedWalletAddress(data, chain);
|
|
504
|
+
if (!walletAddress || !data.walletProvider) {
|
|
505
|
+
throw new CloudBridgeError(`Agent has no cloud ${chain} wallet provisioned`);
|
|
506
|
+
}
|
|
507
|
+
return {
|
|
508
|
+
agentWalletId: data.agentId ?? agentId,
|
|
509
|
+
walletAddress,
|
|
510
|
+
walletProvider: data.walletProvider,
|
|
511
|
+
chainType: chain,
|
|
512
|
+
balance: data.balance ?? undefined
|
|
513
|
+
};
|
|
514
|
+
}
|
|
515
|
+
async provisionWallet(input) {
|
|
516
|
+
const res = await this.request("POST", "/api/v1/user/wallets/provision", input);
|
|
517
|
+
if (!res.success || !res.data) {
|
|
518
|
+
throw new CloudBridgeError(res.error ?? "Failed to provision wallet");
|
|
519
|
+
}
|
|
520
|
+
return {
|
|
521
|
+
walletId: res.data.id,
|
|
522
|
+
address: res.data.address,
|
|
523
|
+
chainType: res.data.chainType,
|
|
524
|
+
provider: res.data.provider ?? "privy"
|
|
525
|
+
};
|
|
526
|
+
}
|
|
527
|
+
async executeRpc(envelope) {
|
|
528
|
+
const { correlationId, ...body } = envelope;
|
|
529
|
+
const headers = {
|
|
530
|
+
"Content-Type": "application/json"
|
|
531
|
+
};
|
|
532
|
+
if (correlationId) {
|
|
533
|
+
headers["X-Correlation-Id"] = correlationId;
|
|
534
|
+
}
|
|
535
|
+
let response;
|
|
536
|
+
try {
|
|
537
|
+
response = await fetch(`${this.baseUrl}/api/v1/user/wallets/rpc`, {
|
|
538
|
+
method: "POST",
|
|
539
|
+
headers,
|
|
540
|
+
body: JSON.stringify(body),
|
|
541
|
+
redirect: "manual",
|
|
542
|
+
signal: AbortSignal.timeout(60000)
|
|
543
|
+
});
|
|
544
|
+
} catch (err) {
|
|
545
|
+
throw new CloudUnavailableError(`Cloud RPC network error: ${err.message}`, 0);
|
|
546
|
+
}
|
|
547
|
+
if (isRedirectResponse(response)) {
|
|
548
|
+
throw new CloudBridgeError("Cloud RPC request was redirected; redirects are not allowed", response.status);
|
|
549
|
+
}
|
|
550
|
+
const text = await response.text().catch(() => "");
|
|
551
|
+
if (response.ok) {
|
|
552
|
+
try {
|
|
553
|
+
const parsed = JSON.parse(text);
|
|
554
|
+
if (!parsed.success || parsed.data === undefined) {
|
|
555
|
+
throw new CloudBridgeError(parsed.error ?? "Cloud RPC returned no data", response.status, text);
|
|
556
|
+
}
|
|
557
|
+
return parsed.data;
|
|
558
|
+
} catch (err) {
|
|
559
|
+
if (err instanceof CloudBridgeError)
|
|
560
|
+
throw err;
|
|
561
|
+
throw new CloudBridgeError(`Cloud RPC returned malformed JSON: ${err.message}`, response.status, text);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
let errMessage = `HTTP ${response.status}`;
|
|
565
|
+
try {
|
|
566
|
+
const parsed = JSON.parse(text);
|
|
567
|
+
if (parsed.error)
|
|
568
|
+
errMessage = parsed.error;
|
|
569
|
+
} catch {
|
|
570
|
+
if (text)
|
|
571
|
+
errMessage = text.slice(0, 200);
|
|
572
|
+
}
|
|
573
|
+
if (response.status === 401) {
|
|
574
|
+
throw new SignatureInvalidError(errMessage, text);
|
|
575
|
+
}
|
|
576
|
+
if (response.status === 409) {
|
|
577
|
+
throw new NonceReplayError(errMessage, text);
|
|
578
|
+
}
|
|
579
|
+
if (response.status === 410) {
|
|
580
|
+
throw new SessionExpiredError(errMessage, text);
|
|
581
|
+
}
|
|
582
|
+
if (response.status >= 500) {
|
|
583
|
+
throw new CloudUnavailableError(errMessage, response.status, text);
|
|
584
|
+
}
|
|
585
|
+
throw new CloudBridgeError(errMessage, response.status, text);
|
|
586
|
+
}
|
|
587
|
+
async request(method, path, body) {
|
|
588
|
+
const headers = { "X-Api-Key": this.apiKey };
|
|
589
|
+
if (body !== undefined)
|
|
590
|
+
headers["Content-Type"] = "application/json";
|
|
591
|
+
const response = await fetch(`${this.baseUrl}${path}`, {
|
|
592
|
+
method,
|
|
593
|
+
headers,
|
|
594
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
595
|
+
redirect: "manual",
|
|
596
|
+
signal: AbortSignal.timeout(30000)
|
|
597
|
+
});
|
|
598
|
+
if (isRedirectResponse(response)) {
|
|
599
|
+
return {
|
|
600
|
+
success: false,
|
|
601
|
+
error: "Cloud API request was redirected; redirects are not allowed"
|
|
602
|
+
};
|
|
603
|
+
}
|
|
604
|
+
if (!response.ok) {
|
|
605
|
+
const text = await response.text().catch(() => "");
|
|
606
|
+
return {
|
|
607
|
+
success: false,
|
|
608
|
+
error: formatApiErrorBody(text) ?? `HTTP ${response.status}`
|
|
609
|
+
};
|
|
610
|
+
}
|
|
611
|
+
return await response.json();
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
// src/cloud/cloud-proxy.ts
|
|
616
|
+
class CloudRuntimeProxy {
|
|
617
|
+
client;
|
|
618
|
+
agentId;
|
|
619
|
+
_agentName;
|
|
620
|
+
constructor(client, agentId, _agentName) {
|
|
621
|
+
this.client = client;
|
|
622
|
+
this.agentId = agentId;
|
|
623
|
+
this._agentName = _agentName;
|
|
624
|
+
}
|
|
625
|
+
get agentName() {
|
|
626
|
+
return this._agentName;
|
|
627
|
+
}
|
|
628
|
+
async handleChatMessage(text, roomId = "web-chat", channelType = "DM") {
|
|
629
|
+
return this.client.sendMessage(this.agentId, text, roomId, channelType);
|
|
630
|
+
}
|
|
631
|
+
async* handleChatMessageStream(text, roomId = "web-chat", channelType = "DM") {
|
|
632
|
+
for await (const event of this.client.sendMessageStream(this.agentId, text, roomId, channelType)) {
|
|
633
|
+
if (event.type === "chunk" && typeof event.data.text === "string") {
|
|
634
|
+
yield event.data.text;
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
async getStatus() {
|
|
639
|
+
const agent = await this.client.getAgent(this.agentId);
|
|
640
|
+
return { state: agent.status, agentName: agent.agentName };
|
|
641
|
+
}
|
|
642
|
+
async isAlive() {
|
|
643
|
+
return this.client.heartbeat(this.agentId).catch(() => false);
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
// src/cloud/reconnect.ts
|
|
648
|
+
import { logger as logger2 } from "@elizaos/core";
|
|
649
|
+
|
|
650
|
+
class ConnectionMonitor {
|
|
651
|
+
client;
|
|
652
|
+
agentId;
|
|
653
|
+
callbacks;
|
|
654
|
+
heartbeatIntervalMs;
|
|
655
|
+
maxFailures;
|
|
656
|
+
timer = null;
|
|
657
|
+
consecutiveFailures = 0;
|
|
658
|
+
reconnecting = false;
|
|
659
|
+
constructor(client, agentId, callbacks, heartbeatIntervalMs = 30000, maxFailures = 3) {
|
|
660
|
+
this.client = client;
|
|
661
|
+
this.agentId = agentId;
|
|
662
|
+
this.callbacks = callbacks;
|
|
663
|
+
this.heartbeatIntervalMs = heartbeatIntervalMs;
|
|
664
|
+
this.maxFailures = maxFailures;
|
|
665
|
+
}
|
|
666
|
+
start() {
|
|
667
|
+
if (this.timer)
|
|
668
|
+
return;
|
|
669
|
+
logger2.info(`[cloud-monitor] Starting connection monitor (interval: ${this.heartbeatIntervalMs}ms, maxFailures: ${this.maxFailures})`);
|
|
670
|
+
this.consecutiveFailures = 0;
|
|
671
|
+
this.timer = setInterval(() => {
|
|
672
|
+
this.tick();
|
|
673
|
+
}, this.heartbeatIntervalMs);
|
|
674
|
+
}
|
|
675
|
+
stop() {
|
|
676
|
+
if (this.timer) {
|
|
677
|
+
clearInterval(this.timer);
|
|
678
|
+
this.timer = null;
|
|
679
|
+
}
|
|
680
|
+
this.consecutiveFailures = 0;
|
|
681
|
+
this.reconnecting = false;
|
|
682
|
+
logger2.info("[cloud-monitor] Connection monitor stopped");
|
|
683
|
+
}
|
|
684
|
+
isMonitoring() {
|
|
685
|
+
return this.timer !== null;
|
|
686
|
+
}
|
|
687
|
+
async tick() {
|
|
688
|
+
if (this.reconnecting)
|
|
689
|
+
return;
|
|
690
|
+
const alive = await this.client.heartbeat(this.agentId).catch(() => false);
|
|
691
|
+
if (alive) {
|
|
692
|
+
if (this.consecutiveFailures > 0) {
|
|
693
|
+
this.consecutiveFailures = 0;
|
|
694
|
+
this.callbacks.onStatusChange?.("connected");
|
|
695
|
+
}
|
|
696
|
+
return;
|
|
697
|
+
}
|
|
698
|
+
this.consecutiveFailures++;
|
|
699
|
+
logger2.warn(`[cloud-monitor] Heartbeat failed (${this.consecutiveFailures}/${this.maxFailures})`);
|
|
700
|
+
if (this.consecutiveFailures >= this.maxFailures) {
|
|
701
|
+
this.callbacks.onDisconnect();
|
|
702
|
+
await this.attemptReconnect();
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
async attemptReconnect() {
|
|
706
|
+
this.reconnecting = true;
|
|
707
|
+
this.callbacks.onStatusChange?.("reconnecting");
|
|
708
|
+
let delay = 3000;
|
|
709
|
+
for (let attempt = 1;attempt <= 10; attempt++) {
|
|
710
|
+
logger2.info(`[cloud-monitor] Reconnect attempt ${attempt}/10...`);
|
|
711
|
+
const ok = await this.client.provision(this.agentId).then(() => true).catch(() => false);
|
|
712
|
+
if (ok) {
|
|
713
|
+
logger2.info("[cloud-monitor] Reconnection successful");
|
|
714
|
+
this.consecutiveFailures = 0;
|
|
715
|
+
this.reconnecting = false;
|
|
716
|
+
this.callbacks.onStatusChange?.("connected");
|
|
717
|
+
this.callbacks.onReconnect();
|
|
718
|
+
return;
|
|
719
|
+
}
|
|
720
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
721
|
+
delay = Math.min(delay * 2, 60000);
|
|
722
|
+
}
|
|
723
|
+
logger2.error("[cloud-monitor] Failed to reconnect after 10 attempts");
|
|
724
|
+
this.reconnecting = false;
|
|
725
|
+
this.callbacks.onStatusChange?.("disconnected");
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
// src/cloud/cloud-manager.ts
|
|
730
|
+
import { logger as logger3 } from "@elizaos/core";
|
|
731
|
+
init_base_url();
|
|
732
|
+
init_validate_url();
|
|
733
|
+
|
|
734
|
+
class CloudManager {
|
|
735
|
+
cloudConfig;
|
|
736
|
+
callbacks;
|
|
737
|
+
client = null;
|
|
738
|
+
proxy = null;
|
|
739
|
+
backupScheduler = null;
|
|
740
|
+
connectionMonitor = null;
|
|
741
|
+
status = "disconnected";
|
|
742
|
+
activeAgentId = null;
|
|
743
|
+
constructor(cloudConfig, callbacks = {}) {
|
|
744
|
+
this.cloudConfig = cloudConfig;
|
|
745
|
+
this.callbacks = callbacks;
|
|
746
|
+
}
|
|
747
|
+
async init() {
|
|
748
|
+
const rawUrl = normalizeCloudSiteUrl(this.cloudConfig.baseUrl);
|
|
749
|
+
const apiKey = this.cloudConfig.apiKey;
|
|
750
|
+
if (!apiKey)
|
|
751
|
+
throw new Error("Cloud API key is not configured. Run cloud login first.");
|
|
752
|
+
const urlError = await validateCloudBaseUrl(rawUrl);
|
|
753
|
+
if (urlError) {
|
|
754
|
+
throw new Error(urlError);
|
|
755
|
+
}
|
|
756
|
+
this.client = new ElizaCloudClient(rawUrl, apiKey);
|
|
757
|
+
logger3.info(`[cloud-manager] Client initialised (baseUrl=${rawUrl})`);
|
|
758
|
+
}
|
|
759
|
+
async connect(agentId) {
|
|
760
|
+
if (!this.client)
|
|
761
|
+
await this.init();
|
|
762
|
+
if (!this.client)
|
|
763
|
+
throw new Error("Cloud client failed to initialise");
|
|
764
|
+
this.setStatus("connecting");
|
|
765
|
+
this.activeAgentId = agentId;
|
|
766
|
+
try {
|
|
767
|
+
await this.client.provision(agentId);
|
|
768
|
+
const agent = await this.client.getAgent(agentId);
|
|
769
|
+
this.proxy = new CloudRuntimeProxy(this.client, agentId, agent.agentName);
|
|
770
|
+
this.backupScheduler = new BackupScheduler(this.client, agentId, this.cloudConfig.backup?.autoBackupIntervalMs ?? 60000);
|
|
771
|
+
this.backupScheduler.start();
|
|
772
|
+
this.connectionMonitor = new ConnectionMonitor(this.client, agentId, {
|
|
773
|
+
onDisconnect: () => this.setStatus("reconnecting"),
|
|
774
|
+
onReconnect: () => this.setStatus("connected"),
|
|
775
|
+
onStatusChange: (s) => {
|
|
776
|
+
if (s === "connected")
|
|
777
|
+
this.setStatus("connected");
|
|
778
|
+
else if (s === "reconnecting")
|
|
779
|
+
this.setStatus("reconnecting");
|
|
780
|
+
else
|
|
781
|
+
this.setStatus("error");
|
|
782
|
+
}
|
|
783
|
+
}, this.cloudConfig.bridge?.heartbeatIntervalMs ?? 30000);
|
|
784
|
+
this.connectionMonitor.start();
|
|
785
|
+
this.setStatus("connected");
|
|
786
|
+
logger3.info(`[cloud-manager] Connected to cloud agent (agentId=${agentId}, agentName=${agent.agentName})`);
|
|
787
|
+
return this.proxy;
|
|
788
|
+
} catch (err) {
|
|
789
|
+
this.setStatus("error");
|
|
790
|
+
if (this.backupScheduler) {
|
|
791
|
+
this.backupScheduler.stop();
|
|
792
|
+
this.backupScheduler = null;
|
|
793
|
+
}
|
|
794
|
+
if (this.connectionMonitor) {
|
|
795
|
+
this.connectionMonitor.stop();
|
|
796
|
+
this.connectionMonitor = null;
|
|
797
|
+
}
|
|
798
|
+
this.proxy = null;
|
|
799
|
+
this.activeAgentId = null;
|
|
800
|
+
this.setStatus("disconnected");
|
|
801
|
+
throw err;
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
async disconnect() {
|
|
805
|
+
if (this.backupScheduler) {
|
|
806
|
+
await this.backupScheduler.finalSnapshot();
|
|
807
|
+
this.backupScheduler.stop();
|
|
808
|
+
this.backupScheduler = null;
|
|
809
|
+
}
|
|
810
|
+
if (this.connectionMonitor) {
|
|
811
|
+
this.connectionMonitor.stop();
|
|
812
|
+
this.connectionMonitor = null;
|
|
813
|
+
}
|
|
814
|
+
this.proxy = null;
|
|
815
|
+
this.activeAgentId = null;
|
|
816
|
+
this.setStatus("disconnected");
|
|
817
|
+
}
|
|
818
|
+
async replaceApiKey(apiKey) {
|
|
819
|
+
await this.disconnect();
|
|
820
|
+
this.cloudConfig = {
|
|
821
|
+
...this.cloudConfig,
|
|
822
|
+
apiKey
|
|
823
|
+
};
|
|
824
|
+
this.client = null;
|
|
825
|
+
await this.init();
|
|
826
|
+
}
|
|
827
|
+
getProxy() {
|
|
828
|
+
return this.proxy;
|
|
829
|
+
}
|
|
830
|
+
getClient() {
|
|
831
|
+
return this.client;
|
|
832
|
+
}
|
|
833
|
+
getActiveAgentId() {
|
|
834
|
+
return this.activeAgentId;
|
|
835
|
+
}
|
|
836
|
+
getStatus() {
|
|
837
|
+
return this.status;
|
|
838
|
+
}
|
|
839
|
+
isEnabled() {
|
|
840
|
+
return Boolean(this.cloudConfig.enabled && this.cloudConfig.apiKey);
|
|
841
|
+
}
|
|
842
|
+
setStatus(status) {
|
|
843
|
+
if (this.status === status)
|
|
844
|
+
return;
|
|
845
|
+
this.status = status;
|
|
846
|
+
this.callbacks.onStatusChange?.(status);
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
export {
|
|
850
|
+
CloudManager
|
|
851
|
+
};
|
|
852
|
+
|
|
853
|
+
//# debugId=D34BA0F1C08BEDCE64756E2164756E21
|