@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,807 @@
|
|
|
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/cloud-api-key.ts
|
|
222
|
+
function normalizeCloudSecret(value) {
|
|
223
|
+
if (typeof value !== "string")
|
|
224
|
+
return null;
|
|
225
|
+
const trimmed = value.trim();
|
|
226
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
227
|
+
}
|
|
228
|
+
function resolveRuntimeCloudApiKey(runtime) {
|
|
229
|
+
const fromSetting = runtime?.getSetting?.("ELIZAOS_CLOUD_API_KEY");
|
|
230
|
+
if (typeof fromSetting === "string") {
|
|
231
|
+
return normalizeCloudSecret(fromSetting);
|
|
232
|
+
}
|
|
233
|
+
const fromSecrets = runtime?.character?.secrets?.ELIZAOS_CLOUD_API_KEY;
|
|
234
|
+
return typeof fromSecrets === "string" ? normalizeCloudSecret(fromSecrets) : null;
|
|
235
|
+
}
|
|
236
|
+
function resolveCloudApiBaseUrl2(rawBaseUrl) {
|
|
237
|
+
const candidate = normalizeCloudSecret(rawBaseUrl ?? process.env.ELIZAOS_CLOUD_BASE_URL) ?? DEFAULT_CLOUD_API_BASE_URL;
|
|
238
|
+
try {
|
|
239
|
+
const parsed = new URL(candidate);
|
|
240
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
parsed.hash = "";
|
|
244
|
+
parsed.search = "";
|
|
245
|
+
const normalizedBase = parsed.toString().replace(/\/+$/, "");
|
|
246
|
+
return normalizedBase.endsWith("/api/v1") ? normalizedBase : `${normalizedBase}/api/v1`;
|
|
247
|
+
} catch {
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
function resolveCloudApiKey(config, runtime) {
|
|
252
|
+
return normalizeCloudSecret(config?.cloud?.apiKey ?? resolveRuntimeCloudApiKey(runtime) ?? process.env.ELIZAOS_CLOUD_API_KEY);
|
|
253
|
+
}
|
|
254
|
+
var DEFAULT_CLOUD_API_BASE_URL = "https://elizacloud.ai/api/v1";
|
|
255
|
+
|
|
256
|
+
// src/lib/http.ts
|
|
257
|
+
function scrubStackFields(value) {
|
|
258
|
+
if (value instanceof Error) {
|
|
259
|
+
return { error: value.message || "Internal error" };
|
|
260
|
+
}
|
|
261
|
+
if (Array.isArray(value)) {
|
|
262
|
+
return value.map(scrubStackFields);
|
|
263
|
+
}
|
|
264
|
+
if (value && typeof value === "object") {
|
|
265
|
+
const out = {};
|
|
266
|
+
for (const [key, nested] of Object.entries(value)) {
|
|
267
|
+
if (key === "stack" || key === "stackTrace")
|
|
268
|
+
continue;
|
|
269
|
+
out[key] = scrubStackFields(nested);
|
|
270
|
+
}
|
|
271
|
+
return out;
|
|
272
|
+
}
|
|
273
|
+
return value;
|
|
274
|
+
}
|
|
275
|
+
function sendJson(res, body, status = 200) {
|
|
276
|
+
if (res.headersSent)
|
|
277
|
+
return;
|
|
278
|
+
res.statusCode = status;
|
|
279
|
+
res.setHeader("content-type", "application/json; charset=utf-8");
|
|
280
|
+
res.end(JSON.stringify(scrubStackFields(body)));
|
|
281
|
+
}
|
|
282
|
+
function sendJsonError(res, message, status = 400) {
|
|
283
|
+
sendJson(res, { error: message }, status);
|
|
284
|
+
}
|
|
285
|
+
async function readRequestBody(req, options) {
|
|
286
|
+
const maxBytes = options.maxBytes ?? 1048576;
|
|
287
|
+
const chunks = [];
|
|
288
|
+
let size = 0;
|
|
289
|
+
for await (const chunk of req) {
|
|
290
|
+
const buffer = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
|
|
291
|
+
size += buffer.length;
|
|
292
|
+
if (size > maxBytes) {
|
|
293
|
+
if (options.destroyOnTooLarge)
|
|
294
|
+
req.destroy();
|
|
295
|
+
throw new Error(options.tooLargeMessage ?? "Request body too large");
|
|
296
|
+
}
|
|
297
|
+
chunks.push(buffer);
|
|
298
|
+
}
|
|
299
|
+
if (chunks.length === 0)
|
|
300
|
+
return null;
|
|
301
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
302
|
+
}
|
|
303
|
+
async function readJsonBody(req, res, options = {}) {
|
|
304
|
+
const cached = req.body;
|
|
305
|
+
if (cached !== undefined) {
|
|
306
|
+
if (options.requireObject !== false && (!cached || typeof cached !== "object" || Array.isArray(cached))) {
|
|
307
|
+
sendJsonError(res, "Request body must be a JSON object", 400);
|
|
308
|
+
return null;
|
|
309
|
+
}
|
|
310
|
+
return cached;
|
|
311
|
+
}
|
|
312
|
+
let raw;
|
|
313
|
+
try {
|
|
314
|
+
raw = await readRequestBody(req, options);
|
|
315
|
+
} catch (error) {
|
|
316
|
+
sendJsonError(res, error instanceof Error ? error.message : "Failed to read request body", 413);
|
|
317
|
+
return null;
|
|
318
|
+
}
|
|
319
|
+
if (!raw?.trim()) {
|
|
320
|
+
const empty = {};
|
|
321
|
+
req.body = empty;
|
|
322
|
+
return empty;
|
|
323
|
+
}
|
|
324
|
+
let parsed;
|
|
325
|
+
try {
|
|
326
|
+
parsed = JSON.parse(raw);
|
|
327
|
+
} catch {
|
|
328
|
+
sendJsonError(res, "Invalid JSON in request body", 400);
|
|
329
|
+
return null;
|
|
330
|
+
}
|
|
331
|
+
if (options.requireObject !== false && (!parsed || typeof parsed !== "object" || Array.isArray(parsed))) {
|
|
332
|
+
sendJsonError(res, "Request body must be a JSON object", 400);
|
|
333
|
+
return null;
|
|
334
|
+
}
|
|
335
|
+
req.body = parsed;
|
|
336
|
+
return parsed;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
// src/routes/cloud-billing-routes.ts
|
|
340
|
+
function cryptoStatusCacheKey(baseUrl, headers) {
|
|
341
|
+
return `${baseUrl}|${headers.Authorization ?? ""}`;
|
|
342
|
+
}
|
|
343
|
+
async function fetchCryptoStatusCached(baseUrl, headers) {
|
|
344
|
+
const now = Date.now();
|
|
345
|
+
const cacheKey = cryptoStatusCacheKey(baseUrl, headers);
|
|
346
|
+
const cached = cryptoStatusCache.get(cacheKey);
|
|
347
|
+
if (cached && cached.expiresAt > now) {
|
|
348
|
+
return cached.value;
|
|
349
|
+
}
|
|
350
|
+
const response = await fetchUpstream(`${baseUrl}/api/crypto/status`, "GET", headers, undefined).catch(() => null);
|
|
351
|
+
if (!response?.ok) {
|
|
352
|
+
return cached?.value ?? null;
|
|
353
|
+
}
|
|
354
|
+
const value = await readJsonResponse(response).catch(() => ({}));
|
|
355
|
+
cryptoStatusCache.set(cacheKey, {
|
|
356
|
+
value,
|
|
357
|
+
expiresAt: now + CRYPTO_STATUS_CACHE_MS
|
|
358
|
+
});
|
|
359
|
+
return value;
|
|
360
|
+
}
|
|
361
|
+
function resolveCloudBaseUrl(config) {
|
|
362
|
+
return normalizeCloudSiteUrl(config.cloud?.baseUrl);
|
|
363
|
+
}
|
|
364
|
+
function normalizeCloudApiKey(value) {
|
|
365
|
+
if (typeof value !== "string")
|
|
366
|
+
return null;
|
|
367
|
+
const trimmed = value.trim();
|
|
368
|
+
if (!trimmed || trimmed.toUpperCase() === "[REDACTED]") {
|
|
369
|
+
return null;
|
|
370
|
+
}
|
|
371
|
+
return trimmed;
|
|
372
|
+
}
|
|
373
|
+
function resolveProxyApiKey(state) {
|
|
374
|
+
const cloudAuth = state.runtime ? state.runtime.getService("CLOUD_AUTH") : null;
|
|
375
|
+
const runtimeApiKey = cloudAuth?.isAuthenticated() === true ? normalizeCloudApiKey(cloudAuth.getApiKey?.()) : null;
|
|
376
|
+
return runtimeApiKey ?? resolveCloudApiKey(state.config, state.runtime);
|
|
377
|
+
}
|
|
378
|
+
function buildAuthHeaders(config, apiKeyOverride) {
|
|
379
|
+
const serviceKey = config.cloud?.serviceKey?.trim();
|
|
380
|
+
const apiKey = normalizeCloudApiKey(apiKeyOverride) ?? resolveCloudApiKey(config);
|
|
381
|
+
const headers = {
|
|
382
|
+
Accept: "application/json",
|
|
383
|
+
"Content-Type": "application/json"
|
|
384
|
+
};
|
|
385
|
+
if (serviceKey) {
|
|
386
|
+
headers["X-Service-Key"] = serviceKey;
|
|
387
|
+
}
|
|
388
|
+
if (apiKey) {
|
|
389
|
+
headers.Authorization = `Bearer ${apiKey}`;
|
|
390
|
+
}
|
|
391
|
+
return headers;
|
|
392
|
+
}
|
|
393
|
+
function isRecord(value) {
|
|
394
|
+
return typeof value === "object" && value !== null;
|
|
395
|
+
}
|
|
396
|
+
function readString(value) {
|
|
397
|
+
return typeof value === "string" && value.trim() ? value : undefined;
|
|
398
|
+
}
|
|
399
|
+
function readNumber(value) {
|
|
400
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
401
|
+
return value;
|
|
402
|
+
if (typeof value === "string" && value.trim()) {
|
|
403
|
+
const parsed = Number(value);
|
|
404
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
405
|
+
}
|
|
406
|
+
return null;
|
|
407
|
+
}
|
|
408
|
+
function readBoolean(value) {
|
|
409
|
+
return typeof value === "boolean" ? value : undefined;
|
|
410
|
+
}
|
|
411
|
+
function readBody(req) {
|
|
412
|
+
const preParsedBody = req.body;
|
|
413
|
+
if (preParsedBody !== undefined) {
|
|
414
|
+
return Promise.resolve(typeof preParsedBody === "string" ? preParsedBody : JSON.stringify(preParsedBody));
|
|
415
|
+
}
|
|
416
|
+
if (req.readableEnded) {
|
|
417
|
+
return Promise.resolve(undefined);
|
|
418
|
+
}
|
|
419
|
+
return new Promise((resolve, reject) => {
|
|
420
|
+
const chunks = [];
|
|
421
|
+
let size = 0;
|
|
422
|
+
req.on("data", (chunk) => {
|
|
423
|
+
size += chunk.length;
|
|
424
|
+
if (size > MAX_BODY_BYTES) {
|
|
425
|
+
reject(new Error("Request body too large"));
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
chunks.push(chunk);
|
|
429
|
+
});
|
|
430
|
+
req.on("end", () => resolve(chunks.length > 0 ? Buffer.concat(chunks).toString("utf-8") : undefined));
|
|
431
|
+
req.on("error", reject);
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
async function fetchUpstream(url, method, headers, body) {
|
|
435
|
+
let currentUrl = url;
|
|
436
|
+
let currentMethod = method;
|
|
437
|
+
let currentBody = body;
|
|
438
|
+
for (let redirectCount = 0;redirectCount <= MAX_REDIRECTS; redirectCount += 1) {
|
|
439
|
+
const response = await fetch(currentUrl, {
|
|
440
|
+
method: currentMethod,
|
|
441
|
+
headers,
|
|
442
|
+
body: currentBody,
|
|
443
|
+
redirect: "manual",
|
|
444
|
+
signal: AbortSignal.timeout(PROXY_TIMEOUT_MS)
|
|
445
|
+
});
|
|
446
|
+
if (response.status < 300 || response.status >= 400) {
|
|
447
|
+
return response;
|
|
448
|
+
}
|
|
449
|
+
const location = response.headers.get("location");
|
|
450
|
+
if (!location) {
|
|
451
|
+
throw Object.assign(new Error("redirect"), { code: "REDIRECT" });
|
|
452
|
+
}
|
|
453
|
+
const nextUrl = new URL(location, currentUrl).toString();
|
|
454
|
+
const currentOrigin = normalizeCloudSiteUrl(new URL(currentUrl).origin);
|
|
455
|
+
const nextOrigin = normalizeCloudSiteUrl(new URL(nextUrl).origin);
|
|
456
|
+
if (new URL(currentUrl).origin !== new URL(nextUrl).origin && currentOrigin !== nextOrigin) {
|
|
457
|
+
throw Object.assign(new Error("redirect"), { code: "REDIRECT" });
|
|
458
|
+
}
|
|
459
|
+
currentUrl = nextUrl;
|
|
460
|
+
if (currentMethod !== "GET" && currentMethod !== "HEAD" && (response.status === 301 || response.status === 302 || response.status === 303)) {
|
|
461
|
+
currentMethod = "GET";
|
|
462
|
+
currentBody = undefined;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
throw Object.assign(new Error("redirect"), { code: "REDIRECT" });
|
|
466
|
+
}
|
|
467
|
+
async function readJsonResponse(response) {
|
|
468
|
+
return response.json().catch(async () => ({
|
|
469
|
+
success: response.ok,
|
|
470
|
+
error: await response.text().catch(() => "Billing request failed")
|
|
471
|
+
}));
|
|
472
|
+
}
|
|
473
|
+
function buildRedirectUrl(baseUrl, pathname, params) {
|
|
474
|
+
const url = new URL(pathname, `${baseUrl}/`);
|
|
475
|
+
for (const [key, value] of Object.entries(params)) {
|
|
476
|
+
url.searchParams.set(key, value);
|
|
477
|
+
}
|
|
478
|
+
return url.toString();
|
|
479
|
+
}
|
|
480
|
+
function normalizeCryptoNetwork(value) {
|
|
481
|
+
if (!value)
|
|
482
|
+
return;
|
|
483
|
+
const normalized = value.trim().toUpperCase();
|
|
484
|
+
switch (normalized) {
|
|
485
|
+
case "BSC":
|
|
486
|
+
case "BEP20":
|
|
487
|
+
return "BEP20";
|
|
488
|
+
case "ETH":
|
|
489
|
+
case "ERC20":
|
|
490
|
+
return "ERC20";
|
|
491
|
+
case "MATIC":
|
|
492
|
+
case "POLYGON":
|
|
493
|
+
return "POLYGON";
|
|
494
|
+
case "SOL":
|
|
495
|
+
case "SOLANA":
|
|
496
|
+
return "SOL";
|
|
497
|
+
case "BASE":
|
|
498
|
+
return "BASE";
|
|
499
|
+
case "ARB":
|
|
500
|
+
case "ARBITRUM":
|
|
501
|
+
return "ARB";
|
|
502
|
+
case "OP":
|
|
503
|
+
case "OPTIMISM":
|
|
504
|
+
return "OP";
|
|
505
|
+
case "TRON":
|
|
506
|
+
case "TRC20":
|
|
507
|
+
return "TRC20";
|
|
508
|
+
default:
|
|
509
|
+
return;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
function mapBillingSummary(payload, baseUrl, cryptoStatus) {
|
|
513
|
+
const source = isRecord(payload) ? payload : {};
|
|
514
|
+
const organization = isRecord(source.organization) ? source.organization : {};
|
|
515
|
+
const pricing = isRecord(source.pricing) ? source.pricing : {};
|
|
516
|
+
const crypto = isRecord(cryptoStatus) ? cryptoStatus : {};
|
|
517
|
+
const balance = readNumber(organization.creditBalance) ?? 0;
|
|
518
|
+
return {
|
|
519
|
+
success: source.success ?? true,
|
|
520
|
+
balance,
|
|
521
|
+
currency: "USD",
|
|
522
|
+
topUpUrl: `${baseUrl}/dashboard/settings?tab=billing`,
|
|
523
|
+
embeddedCheckoutEnabled: false,
|
|
524
|
+
hostedCheckoutEnabled: true,
|
|
525
|
+
cryptoEnabled: readBoolean(crypto.enabled) ?? readBoolean(pricing.x402Enabled) ?? false,
|
|
526
|
+
low: balance < 2,
|
|
527
|
+
critical: balance < 0.5,
|
|
528
|
+
hasPaymentMethod: readBoolean(organization.hasPaymentMethod) ?? false,
|
|
529
|
+
autoTopUpEnabled: readBoolean(organization.autoTopUpEnabled) ?? false,
|
|
530
|
+
autoTopUpAmount: readNumber(organization.autoTopUpAmount),
|
|
531
|
+
autoTopUpThreshold: readNumber(organization.autoTopUpThreshold),
|
|
532
|
+
minimumTopUp: readNumber(pricing.minimumTopUp)
|
|
533
|
+
};
|
|
534
|
+
}
|
|
535
|
+
function mapPaymentMethods(payload) {
|
|
536
|
+
const source = isRecord(payload) ? payload : {};
|
|
537
|
+
const organization = isRecord(source.organization) ? source.organization : {};
|
|
538
|
+
const hasPaymentMethod = readBoolean(organization.hasPaymentMethod) ?? false;
|
|
539
|
+
return {
|
|
540
|
+
success: true,
|
|
541
|
+
data: hasPaymentMethod ? [
|
|
542
|
+
{
|
|
543
|
+
id: "stripe-default",
|
|
544
|
+
type: "card",
|
|
545
|
+
label: "Saved payment method",
|
|
546
|
+
brand: "Card",
|
|
547
|
+
isDefault: true
|
|
548
|
+
}
|
|
549
|
+
] : []
|
|
550
|
+
};
|
|
551
|
+
}
|
|
552
|
+
function mapBillingHistory(payload) {
|
|
553
|
+
const source = isRecord(payload) ? payload : {};
|
|
554
|
+
const rawTransactions = Array.isArray(source.transactions) ? source.transactions : [];
|
|
555
|
+
return {
|
|
556
|
+
success: true,
|
|
557
|
+
data: rawTransactions.filter(isRecord).map((item, index) => ({
|
|
558
|
+
id: readString(item.id) ?? `txn-${index}`,
|
|
559
|
+
kind: readString(item.type),
|
|
560
|
+
provider: readString(item.stripe_payment_intent_id) ? "stripe" : undefined,
|
|
561
|
+
status: (readNumber(item.amount) ?? 0) >= 0 ? "credited" : "usage",
|
|
562
|
+
amount: readNumber(item.amount) ?? 0,
|
|
563
|
+
currency: "USD",
|
|
564
|
+
description: readString(item.description),
|
|
565
|
+
createdAt: readString(item.created_at) ?? new Date().toISOString()
|
|
566
|
+
})),
|
|
567
|
+
total: readNumber(source.total),
|
|
568
|
+
period: source.period
|
|
569
|
+
};
|
|
570
|
+
}
|
|
571
|
+
function mapCheckoutResponse(payload) {
|
|
572
|
+
const source = isRecord(payload) ? payload : {};
|
|
573
|
+
return {
|
|
574
|
+
success: true,
|
|
575
|
+
provider: "stripe",
|
|
576
|
+
mode: "hosted",
|
|
577
|
+
checkoutUrl: readString(source.url) ?? readString(source.checkoutUrl),
|
|
578
|
+
sessionId: readString(source.sessionId)
|
|
579
|
+
};
|
|
580
|
+
}
|
|
581
|
+
function mapCryptoQuoteResponse(payload, amountUsd, payCurrency, network) {
|
|
582
|
+
const source = isRecord(payload) ? payload : {};
|
|
583
|
+
return {
|
|
584
|
+
success: true,
|
|
585
|
+
provider: "oxapay",
|
|
586
|
+
invoiceId: readString(source.paymentId) ?? readString(source.trackId),
|
|
587
|
+
trackId: readString(source.trackId),
|
|
588
|
+
network,
|
|
589
|
+
currency: payCurrency,
|
|
590
|
+
amount: readString(source.creditsToAdd) ?? String(amountUsd),
|
|
591
|
+
amountUsd,
|
|
592
|
+
paymentLinkUrl: readString(source.payLink),
|
|
593
|
+
expiresAt: readString(source.expiresAt)
|
|
594
|
+
};
|
|
595
|
+
}
|
|
596
|
+
function parseJsonBody(body) {
|
|
597
|
+
if (!body)
|
|
598
|
+
return {};
|
|
599
|
+
const parsed = JSON.parse(body);
|
|
600
|
+
return isRecord(parsed) ? parsed : {};
|
|
601
|
+
}
|
|
602
|
+
async function forwardSummary(baseUrl, headers) {
|
|
603
|
+
const summaryResponse = await fetchUpstream(`${baseUrl}/api/v1/credits/summary`, "GET", headers, undefined);
|
|
604
|
+
const summaryPayload = await readJsonResponse(summaryResponse);
|
|
605
|
+
if (!summaryResponse.ok) {
|
|
606
|
+
return { status: summaryResponse.status, payload: summaryPayload };
|
|
607
|
+
}
|
|
608
|
+
const cryptoPayload = await fetchCryptoStatusCached(baseUrl, headers) ?? {};
|
|
609
|
+
return {
|
|
610
|
+
status: summaryResponse.status,
|
|
611
|
+
payload: mapBillingSummary(summaryPayload, baseUrl, cryptoPayload)
|
|
612
|
+
};
|
|
613
|
+
}
|
|
614
|
+
function sendJsonWithRetry(res, payload, status) {
|
|
615
|
+
if (status === 429 && isRecord(payload)) {
|
|
616
|
+
const retryAfter = readNumber(payload.retryAfter);
|
|
617
|
+
if (retryAfter && retryAfter > 0) {
|
|
618
|
+
res.setHeader("Retry-After", String(Math.ceil(retryAfter)));
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
sendJson(res, payload, status);
|
|
622
|
+
}
|
|
623
|
+
function mirrorPaymentHeaders(res, upstreamResponse) {
|
|
624
|
+
for (const header of [
|
|
625
|
+
"PAYMENT-REQUIRED",
|
|
626
|
+
"Payment-Required",
|
|
627
|
+
"PAYMENT-RESPONSE",
|
|
628
|
+
"Payment-Response",
|
|
629
|
+
"Access-Control-Expose-Headers"
|
|
630
|
+
]) {
|
|
631
|
+
const value = upstreamResponse.headers.get(header);
|
|
632
|
+
if (value) {
|
|
633
|
+
res.setHeader(header, value);
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
function isAllowedAppMoneyPath(pathname) {
|
|
638
|
+
const appMoneyPath = /^\/api\/cloud\/billing\/apps\/[^/]+\/(charges|earnings|monetization)(?:\/|$)/;
|
|
639
|
+
return appMoneyPath.test(pathname);
|
|
640
|
+
}
|
|
641
|
+
function mapBillingProxyPath(pathname) {
|
|
642
|
+
if (pathname === "/api/cloud/billing/x402")
|
|
643
|
+
return "/api/v1/x402";
|
|
644
|
+
if (pathname.startsWith("/api/cloud/billing/x402/")) {
|
|
645
|
+
return pathname.replace("/api/cloud/billing/x402", "/api/v1/x402");
|
|
646
|
+
}
|
|
647
|
+
if (pathname === "/api/cloud/billing/app-credits") {
|
|
648
|
+
return "/api/v1/app-credits";
|
|
649
|
+
}
|
|
650
|
+
if (pathname.startsWith("/api/cloud/billing/app-credits/")) {
|
|
651
|
+
return pathname.replace("/api/cloud/billing/app-credits", "/api/v1/app-credits");
|
|
652
|
+
}
|
|
653
|
+
if (pathname === "/api/cloud/billing/affiliates") {
|
|
654
|
+
return "/api/v1/affiliates";
|
|
655
|
+
}
|
|
656
|
+
if (pathname.startsWith("/api/cloud/billing/affiliates/")) {
|
|
657
|
+
return pathname.replace("/api/cloud/billing/affiliates", "/api/v1/affiliates");
|
|
658
|
+
}
|
|
659
|
+
if (pathname === "/api/cloud/billing/redemptions") {
|
|
660
|
+
return "/api/v1/redemptions";
|
|
661
|
+
}
|
|
662
|
+
if (pathname.startsWith("/api/cloud/billing/redemptions/")) {
|
|
663
|
+
return pathname.replace("/api/cloud/billing/redemptions", "/api/v1/redemptions");
|
|
664
|
+
}
|
|
665
|
+
if (isAllowedAppMoneyPath(pathname)) {
|
|
666
|
+
return pathname.replace("/api/cloud/billing/apps", "/api/v1/apps");
|
|
667
|
+
}
|
|
668
|
+
return null;
|
|
669
|
+
}
|
|
670
|
+
async function forwardBillingProxy(req, res, method, baseUrl, headers, upstreamPath, search) {
|
|
671
|
+
let body;
|
|
672
|
+
if (method !== "GET" && method !== "HEAD") {
|
|
673
|
+
body = await readBody(req);
|
|
674
|
+
}
|
|
675
|
+
const upstreamResponse = await fetchUpstream(`${baseUrl}${upstreamPath}${search}`, method, headers, body);
|
|
676
|
+
const responseData = await readJsonResponse(upstreamResponse);
|
|
677
|
+
mirrorPaymentHeaders(res, upstreamResponse);
|
|
678
|
+
sendJsonWithRetry(res, responseData, upstreamResponse.status);
|
|
679
|
+
}
|
|
680
|
+
async function handleCloudBillingRoute(req, res, pathname, method, state) {
|
|
681
|
+
if (!pathname.startsWith("/api/cloud/billing"))
|
|
682
|
+
return false;
|
|
683
|
+
const apiKey = resolveProxyApiKey(state);
|
|
684
|
+
if (!apiKey) {
|
|
685
|
+
sendJsonError(res, "Not connected to Eliza Cloud. Please log in first.", 401);
|
|
686
|
+
return true;
|
|
687
|
+
}
|
|
688
|
+
const baseUrl = resolveCloudBaseUrl(state.config);
|
|
689
|
+
const urlError = await validateCloudBaseUrl(baseUrl);
|
|
690
|
+
if (urlError) {
|
|
691
|
+
sendJsonError(res, urlError, 502);
|
|
692
|
+
return true;
|
|
693
|
+
}
|
|
694
|
+
const headers = buildAuthHeaders(state.config, apiKey);
|
|
695
|
+
const fullUrl = new URL(req.url ?? pathname, "http://localhost");
|
|
696
|
+
const proxiedMoneyPath = mapBillingProxyPath(pathname);
|
|
697
|
+
if (proxiedMoneyPath) {
|
|
698
|
+
await forwardBillingProxy(req, res, method, baseUrl, headers, proxiedMoneyPath, fullUrl.search);
|
|
699
|
+
return true;
|
|
700
|
+
}
|
|
701
|
+
if (pathname === "/api/cloud/billing/summary" && method === "GET") {
|
|
702
|
+
const { status, payload } = await forwardSummary(baseUrl, headers);
|
|
703
|
+
sendJsonWithRetry(res, payload, status);
|
|
704
|
+
return true;
|
|
705
|
+
}
|
|
706
|
+
if (pathname === "/api/cloud/billing/payment-methods" && method === "GET") {
|
|
707
|
+
const summaryResponse = await fetchUpstream(`${baseUrl}/api/v1/credits/summary`, "GET", headers, undefined);
|
|
708
|
+
const summaryPayload = await readJsonResponse(summaryResponse);
|
|
709
|
+
sendJsonWithRetry(res, summaryResponse.ok ? mapPaymentMethods(summaryPayload) : summaryPayload, summaryResponse.status);
|
|
710
|
+
return true;
|
|
711
|
+
}
|
|
712
|
+
if (pathname === "/api/cloud/billing/history" && method === "GET") {
|
|
713
|
+
const upstreamUrl = `${baseUrl}/api/credits/transactions${fullUrl.search}`;
|
|
714
|
+
const historyResponse = await fetchUpstream(upstreamUrl, "GET", headers, undefined);
|
|
715
|
+
const historyPayload = await readJsonResponse(historyResponse);
|
|
716
|
+
sendJsonWithRetry(res, historyResponse.ok ? mapBillingHistory(historyPayload) : historyPayload, historyResponse.status);
|
|
717
|
+
return true;
|
|
718
|
+
}
|
|
719
|
+
if (pathname === "/api/cloud/billing/checkout" && method === "POST") {
|
|
720
|
+
const body2 = await readBody(req);
|
|
721
|
+
const requestBody = parseJsonBody(body2);
|
|
722
|
+
const amountUsd = readNumber(requestBody.amountUsd);
|
|
723
|
+
if (!amountUsd || amountUsd <= 0) {
|
|
724
|
+
sendJsonError(res, "Invalid top-up amount", 400);
|
|
725
|
+
return true;
|
|
726
|
+
}
|
|
727
|
+
const upstreamBody = JSON.stringify({
|
|
728
|
+
credits: amountUsd,
|
|
729
|
+
success_url: buildRedirectUrl(baseUrl, "/dashboard/billing/success", {
|
|
730
|
+
from: "eliza"
|
|
731
|
+
}),
|
|
732
|
+
cancel_url: buildRedirectUrl(baseUrl, "/dashboard/settings", {
|
|
733
|
+
from: "eliza",
|
|
734
|
+
tab: "billing",
|
|
735
|
+
canceled: "1"
|
|
736
|
+
})
|
|
737
|
+
});
|
|
738
|
+
const checkoutResponse = await fetchUpstream(`${baseUrl}/api/v1/credits/checkout`, "POST", headers, upstreamBody);
|
|
739
|
+
const checkoutPayload = await readJsonResponse(checkoutResponse);
|
|
740
|
+
sendJsonWithRetry(res, checkoutResponse.ok ? mapCheckoutResponse(checkoutPayload) : checkoutPayload, checkoutResponse.status);
|
|
741
|
+
return true;
|
|
742
|
+
}
|
|
743
|
+
if (pathname === "/api/cloud/billing/crypto/quote" && method === "POST") {
|
|
744
|
+
const body2 = await readBody(req);
|
|
745
|
+
const requestBody = parseJsonBody(body2);
|
|
746
|
+
const amountUsd = readNumber(requestBody.amountUsd);
|
|
747
|
+
if (!amountUsd || amountUsd <= 0) {
|
|
748
|
+
sendJsonError(res, "Invalid top-up amount", 400);
|
|
749
|
+
return true;
|
|
750
|
+
}
|
|
751
|
+
const payCurrency = readString(requestBody.currency)?.trim().toUpperCase() ?? "USDC";
|
|
752
|
+
const network = normalizeCryptoNetwork(readString(requestBody.network));
|
|
753
|
+
const upstreamBody = JSON.stringify({
|
|
754
|
+
amount: amountUsd,
|
|
755
|
+
payCurrency,
|
|
756
|
+
network
|
|
757
|
+
});
|
|
758
|
+
const cryptoResponse = await fetchUpstream(`${baseUrl}/api/crypto/payments`, "POST", headers, upstreamBody);
|
|
759
|
+
const cryptoPayload = await readJsonResponse(cryptoResponse);
|
|
760
|
+
sendJsonWithRetry(res, cryptoResponse.ok ? mapCryptoQuoteResponse(cryptoPayload, amountUsd, payCurrency, network) : cryptoPayload, cryptoResponse.status);
|
|
761
|
+
return true;
|
|
762
|
+
}
|
|
763
|
+
if (pathname.startsWith("/api/cloud/billing/credits/")) {
|
|
764
|
+
let body2;
|
|
765
|
+
if (method !== "GET" && method !== "HEAD") {
|
|
766
|
+
body2 = await readBody(req);
|
|
767
|
+
}
|
|
768
|
+
const upstreamPath = pathname.replace("/api/cloud/billing/credits", "/api/v1/credits");
|
|
769
|
+
const upstreamResponse2 = await fetchUpstream(`${baseUrl}${upstreamPath}${fullUrl.search}`, method, headers, body2);
|
|
770
|
+
const responseData2 = await readJsonResponse(upstreamResponse2);
|
|
771
|
+
sendJsonWithRetry(res, responseData2, upstreamResponse2.status);
|
|
772
|
+
return true;
|
|
773
|
+
}
|
|
774
|
+
if (pathname.startsWith("/api/cloud/billing/crypto/") && pathname !== "/api/cloud/billing/crypto/quote") {
|
|
775
|
+
let body2;
|
|
776
|
+
if (method !== "GET" && method !== "HEAD") {
|
|
777
|
+
body2 = await readBody(req);
|
|
778
|
+
}
|
|
779
|
+
const upstreamPath = pathname.replace("/api/cloud/billing/crypto", "/api/crypto");
|
|
780
|
+
const upstreamResponse2 = await fetchUpstream(`${baseUrl}${upstreamPath}${fullUrl.search}`, method, headers, body2);
|
|
781
|
+
const responseData2 = await readJsonResponse(upstreamResponse2);
|
|
782
|
+
sendJsonWithRetry(res, responseData2, upstreamResponse2.status);
|
|
783
|
+
return true;
|
|
784
|
+
}
|
|
785
|
+
let body;
|
|
786
|
+
if (method !== "GET" && method !== "HEAD") {
|
|
787
|
+
body = await readBody(req);
|
|
788
|
+
}
|
|
789
|
+
const billingPath = pathname.replace("/api/cloud/billing", "/api/v1/billing");
|
|
790
|
+
const upstreamResponse = await fetchUpstream(`${baseUrl}${billingPath}${fullUrl.search}`, method, headers, body);
|
|
791
|
+
const responseData = await readJsonResponse(upstreamResponse);
|
|
792
|
+
sendJsonWithRetry(res, responseData, upstreamResponse.status);
|
|
793
|
+
return true;
|
|
794
|
+
}
|
|
795
|
+
var PROXY_TIMEOUT_MS = 15000, MAX_BODY_BYTES = 1048576, MAX_REDIRECTS = 4, CRYPTO_STATUS_CACHE_MS = 60000, cryptoStatusCache;
|
|
796
|
+
var init_cloud_billing_routes = __esm(() => {
|
|
797
|
+
init_base_url();
|
|
798
|
+
init_validate_url();
|
|
799
|
+
cryptoStatusCache = new Map;
|
|
800
|
+
});
|
|
801
|
+
init_cloud_billing_routes();
|
|
802
|
+
|
|
803
|
+
export {
|
|
804
|
+
handleCloudBillingRoute
|
|
805
|
+
};
|
|
806
|
+
|
|
807
|
+
//# debugId=8585E844C10AB24464756E2164756E21
|