@elizaos/plugin-elizacloud 2.0.0-beta.1 → 2.0.11-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -44
- package/auto-enable.ts +10 -5
- package/dist/browser/index.browser.js +2 -2
- package/dist/browser/index.browser.js.map +4 -4
- package/dist/cjs/index.node.cjs +2874 -5915
- package/dist/cjs/index.node.js.map +47 -116
- package/dist/cloud/auth-service-types.d.ts +8 -0
- package/dist/cloud/auth-service-types.d.ts.map +1 -0
- package/dist/cloud/auth-service-types.js +36 -0
- package/dist/cloud/auth-service-types.js.map +10 -0
- package/dist/cloud/auth.js +4 -51
- package/dist/cloud/auth.js.map +4 -4
- package/dist/cloud/base-url.d.ts +6 -2
- package/dist/cloud/base-url.d.ts.map +1 -1
- package/dist/cloud/base-url.js +3 -51
- package/dist/cloud/base-url.js.map +3 -3
- package/dist/cloud/bridge-client.d.ts +3 -3
- package/dist/cloud/bridge-client.d.ts.map +1 -1
- package/dist/cloud/bridge-client.js +3 -51
- package/dist/cloud/bridge-client.js.map +3 -3
- package/dist/cloud/clack-observer.d.ts +35 -0
- package/dist/cloud/clack-observer.d.ts.map +1 -0
- package/dist/cloud/clack-observer.js +143 -0
- package/dist/cloud/clack-observer.js.map +10 -0
- package/dist/cloud/cloud-manager.js +45 -92
- package/dist/cloud/cloud-manager.js.map +6 -6
- package/dist/cloud/cloud-wallet.js +2 -4835
- package/dist/cloud/cloud-wallet.js.map +3 -82
- package/dist/cloud/duffel-client.d.ts +181 -0
- package/dist/cloud/duffel-client.d.ts.map +1 -0
- package/dist/cloud/duffel-client.js +506 -0
- package/dist/cloud/duffel-client.js.map +11 -0
- package/dist/cloud/index.d.ts +6 -0
- package/dist/cloud/index.d.ts.map +1 -1
- package/dist/cloud/index.js +1782 -1
- package/dist/cloud/index.js.map +18 -3
- package/dist/cloud/lifeops-schedule-sync-client.d.ts +43 -0
- package/dist/cloud/lifeops-schedule-sync-client.d.ts.map +1 -0
- package/dist/cloud/lifeops-schedule-sync-client.js +180 -0
- package/dist/cloud/lifeops-schedule-sync-client.js.map +11 -0
- package/dist/cloud/lifeops-schedule-sync-contracts.d.ts +89 -0
- package/dist/cloud/lifeops-schedule-sync-contracts.d.ts.map +1 -0
- package/dist/cloud/lifeops-schedule-sync-contracts.js +39 -0
- package/dist/cloud/lifeops-schedule-sync-contracts.js.map +10 -0
- package/dist/cloud/managed-payment-clients.d.ts +166 -0
- package/dist/cloud/managed-payment-clients.d.ts.map +1 -0
- package/dist/cloud/managed-payment-clients.js +238 -0
- package/dist/cloud/managed-payment-clients.js.map +11 -0
- package/dist/cloud/null-observer.d.ts +35 -0
- package/dist/cloud/null-observer.d.ts.map +1 -0
- package/dist/cloud/null-observer.js +45 -0
- package/dist/cloud/null-observer.js.map +10 -0
- package/dist/cloud/setup-observer.d.ts +98 -0
- package/dist/cloud/setup-observer.d.ts.map +1 -0
- package/dist/cloud/setup-observer.js +2 -0
- package/dist/cloud/setup-observer.js.map +9 -0
- package/dist/cloud/validate-url.d.ts.map +1 -1
- package/dist/cloud/validate-url.js +2 -1
- package/dist/cloud/validate-url.js.map +3 -3
- package/dist/cloud/x402-payment-handler.d.ts +85 -0
- package/dist/cloud/x402-payment-handler.d.ts.map +1 -0
- package/dist/cloud/x402-payment-handler.js +119 -0
- package/dist/cloud/x402-payment-handler.js.map +10 -0
- package/dist/cloud-setup.d.ts +36 -0
- package/dist/cloud-setup.d.ts.map +1 -0
- package/dist/{onboarding.js → cloud-setup.js} +139 -139
- package/dist/cloud-setup.js.map +14 -0
- package/dist/cloud-voice-catalog.d.ts +65 -0
- package/dist/cloud-voice-catalog.d.ts.map +1 -0
- package/dist/cloud-voice-catalog.js +278 -0
- package/dist/cloud-voice-catalog.js.map +12 -0
- package/dist/index.browser.d.ts +11 -0
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5416 -8405
- package/dist/index.js.map +48 -116
- package/dist/index.node.d.ts +8 -1
- package/dist/index.node.d.ts.map +1 -1
- package/dist/init.js +17 -4
- package/dist/init.js.map +4 -4
- package/dist/lib/cloud-connection.d.ts +0 -1
- package/dist/lib/cloud-connection.d.ts.map +1 -1
- package/dist/lib/cloud-connection.js +14 -91
- package/dist/lib/cloud-connection.js.map +7 -7
- package/dist/lib/cloud-secrets.d.ts +5 -18
- package/dist/lib/cloud-secrets.d.ts.map +1 -1
- package/dist/lib/cloud-secrets.js +8 -36
- package/dist/lib/cloud-secrets.js.map +3 -3
- package/dist/lib/config-like.d.ts +1 -1
- package/dist/lib/config-like.d.ts.map +1 -1
- package/dist/lib/config-like.js +3 -3
- package/dist/lib/config-like.js.map +3 -3
- package/dist/lib/credential-type-map.d.ts +1 -1
- package/dist/lib/credential-type-map.js.map +1 -1
- package/dist/lib/http.d.ts +0 -11
- package/dist/lib/http.d.ts.map +1 -1
- package/dist/lib/http.js.map +2 -2
- package/dist/lib/server-cloud-tts.d.ts +12 -25
- package/dist/lib/server-cloud-tts.d.ts.map +1 -1
- package/dist/lib/server-cloud-tts.js +31 -329
- package/dist/lib/server-cloud-tts.js.map +4 -7
- package/dist/lib/tts-debug.d.ts +5 -3
- package/dist/lib/tts-debug.d.ts.map +1 -1
- package/dist/lib/tts-debug.js +1 -34
- package/dist/lib/tts-debug.js.map +3 -4
- package/dist/models/embeddings.d.ts.map +1 -1
- package/dist/models/embeddings.js +79 -69
- package/dist/models/embeddings.js.map +6 -6
- package/dist/models/image.d.ts.map +1 -1
- package/dist/models/image.js +42 -15
- package/dist/models/image.js.map +6 -6
- package/dist/models/index.js +676 -166
- package/dist/models/index.js.map +11 -12
- package/dist/models/research.d.ts.map +1 -1
- package/dist/models/research.js +24 -7
- package/dist/models/research.js.map +6 -6
- package/dist/models/speech.d.ts +61 -3
- package/dist/models/speech.d.ts.map +1 -1
- package/dist/models/speech.js +173 -17
- package/dist/models/speech.js.map +5 -5
- package/dist/models/text.d.ts +106 -1
- package/dist/models/text.d.ts.map +1 -1
- package/dist/models/text.js +452 -82
- package/dist/models/text.js.map +7 -8
- package/dist/models/tokenization.d.ts.map +1 -1
- package/dist/models/tokenization.js.map +2 -2
- package/dist/models/transcription.d.ts.map +1 -1
- package/dist/models/transcription.js +20 -6
- package/dist/models/transcription.js.map +5 -5
- package/dist/node/index.node.js +2828 -5838
- package/dist/node/index.node.js.map +47 -116
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +376 -5050
- package/dist/plugin.js.map +16 -92
- package/dist/providers/openai.js +11 -2
- package/dist/providers/openai.js.map +3 -3
- package/dist/register-routes.js +376 -5050
- package/dist/register-routes.js.map +16 -92
- package/dist/routes/cloud-billing-routes.d.ts.map +1 -1
- package/dist/routes/cloud-billing-routes.js +17 -60
- package/dist/routes/cloud-billing-routes.js.map +8 -7
- package/dist/routes/cloud-coding-container-routes.d.ts +8 -0
- package/dist/routes/cloud-coding-container-routes.d.ts.map +1 -0
- package/dist/routes/cloud-coding-container-routes.js +214 -0
- package/dist/routes/cloud-coding-container-routes.js.map +11 -0
- package/dist/routes/cloud-compat-routes.d.ts.map +1 -1
- package/dist/routes/cloud-compat-routes.js +17 -60
- package/dist/routes/cloud-compat-routes.js.map +8 -7
- package/dist/routes/cloud-features-routes.js +2 -2
- package/dist/routes/cloud-features-routes.js.map +4 -4
- package/dist/routes/cloud-relay-routes.d.ts +2 -1
- package/dist/routes/cloud-relay-routes.d.ts.map +1 -1
- package/dist/routes/cloud-relay-routes.js +84 -2
- package/dist/routes/cloud-relay-routes.js.map +5 -4
- package/dist/routes/cloud-routes-autonomous.d.ts +3 -4
- package/dist/routes/cloud-routes-autonomous.d.ts.map +1 -1
- package/dist/routes/cloud-routes-autonomous.js +11 -4893
- package/dist/routes/cloud-routes-autonomous.js.map +8 -87
- package/dist/routes/cloud-routes.d.ts +2 -2
- package/dist/routes/cloud-routes.d.ts.map +1 -1
- package/dist/routes/cloud-routes.js +343 -5058
- package/dist/routes/cloud-routes.js.map +13 -90
- package/dist/routes/cloud-status-routes-autonomous.d.ts +1 -2
- package/dist/routes/cloud-status-routes-autonomous.d.ts.map +1 -1
- package/dist/routes/cloud-status-routes-autonomous.js +4 -51
- package/dist/routes/cloud-status-routes-autonomous.js.map +5 -5
- package/dist/routes/cloud-status-routes.js +14 -90
- package/dist/routes/cloud-status-routes.js.map +7 -7
- package/dist/routes/home-remote-runner-access-url.d.ts +16 -0
- package/dist/routes/home-remote-runner-access-url.d.ts.map +1 -0
- package/dist/routes/home-remote-runner-access-url.js +91 -0
- package/dist/routes/home-remote-runner-access-url.js.map +10 -0
- package/dist/routes/travel-provider-relay-routes.d.ts +9 -0
- package/dist/routes/travel-provider-relay-routes.d.ts.map +1 -0
- package/dist/routes/travel-provider-relay-routes.js +358 -0
- package/dist/routes/travel-provider-relay-routes.js.map +14 -0
- package/dist/services/cloud-auth.d.ts +1 -1
- package/dist/services/cloud-auth.d.ts.map +1 -1
- package/dist/services/cloud-auth.js +7 -2
- package/dist/services/cloud-auth.js.map +4 -4
- package/dist/services/cloud-backup.js.map +2 -2
- package/dist/services/cloud-bootstrap.d.ts.map +1 -1
- package/dist/services/cloud-bootstrap.js.map +2 -2
- package/dist/services/cloud-bridge.js.map +3 -3
- package/dist/services/cloud-container.d.ts +5 -1
- package/dist/services/cloud-container.d.ts.map +1 -1
- package/dist/services/cloud-container.js +52 -1
- package/dist/services/cloud-container.js.map +4 -4
- package/dist/services/cloud-credential-provider.js.map +2 -2
- package/dist/services/cloud-model-registry.js.map +2 -2
- package/dist/types/cloud.d.ts +1 -0
- package/dist/types/cloud.d.ts.map +1 -1
- package/dist/types/cloud.js.map +2 -2
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/cloud-sdk/client.d.ts.map +1 -1
- package/dist/utils/cloud-sdk/client.js +136 -4
- package/dist/utils/cloud-sdk/client.js.map +5 -5
- package/dist/utils/cloud-sdk/http.js.map +1 -1
- package/dist/utils/cloud-sdk/public-routes.d.ts +186 -0
- package/dist/utils/cloud-sdk/public-routes.d.ts.map +1 -1
- package/dist/utils/cloud-sdk/public-routes.js +99 -1
- package/dist/utils/cloud-sdk/public-routes.js.map +3 -3
- package/dist/utils/cloud-sdk/types.d.ts +0 -2
- package/dist/utils/cloud-sdk/types.d.ts.map +1 -1
- package/dist/utils/cloud-sdk/types.js.map +1 -1
- package/dist/utils/config.d.ts +10 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +12 -2
- package/dist/utils/config.js.map +3 -3
- package/dist/utils/events.d.ts +23 -2
- package/dist/utils/events.d.ts.map +1 -1
- package/dist/utils/events.js +5 -3
- package/dist/utils/events.js.map +3 -3
- package/dist/utils/sdk-client.d.ts.map +1 -1
- package/dist/utils/sdk-client.js +17 -4
- package/dist/utils/sdk-client.js.map +4 -4
- package/dist/utils/waifu-metering.d.ts +108 -0
- package/dist/utils/waifu-metering.d.ts.map +1 -0
- package/dist/utils/waifu-metering.js +166 -0
- package/dist/utils/waifu-metering.js.map +10 -0
- package/package.json +51 -22
- package/src/cloud/auth-service-types.ts +24 -0
- package/src/cloud/base-url.ts +6 -62
- package/src/cloud/clack-observer.ts +189 -0
- package/src/cloud/duffel-client.ts +847 -0
- package/src/cloud/index.ts +10 -0
- package/src/cloud/lifeops-schedule-sync-client.ts +245 -0
- package/src/cloud/lifeops-schedule-sync-contracts.ts +124 -0
- package/src/cloud/managed-payment-clients.ts +374 -0
- package/src/cloud/null-observer.ts +45 -0
- package/src/cloud/setup-observer.ts +125 -0
- package/src/cloud/validate-url.ts +7 -1
- package/src/cloud/x402-payment-handler.ts +215 -0
- package/src/cloud-setup.ts +531 -0
- package/src/cloud-voice-catalog.test.ts +254 -0
- package/src/cloud-voice-catalog.ts +246 -0
- package/src/index.browser.ts +29 -0
- package/src/index.node.ts +31 -1
- package/src/index.ts +76 -4
- package/src/lib/cloud-connection.ts +2 -4
- package/src/lib/cloud-secrets.ts +10 -54
- package/src/lib/config-like.ts +1 -1
- package/src/lib/credential-type-map.ts +2 -2
- package/src/lib/http.ts +0 -17
- package/src/lib/server-cloud-tts.ts +33 -341
- package/src/lib/tts-debug.ts +5 -34
- package/src/models/embeddings.ts +140 -76
- package/src/models/image.ts +29 -14
- package/src/models/research.ts +11 -1
- package/src/models/speech.ts +269 -23
- package/src/models/text.ts +704 -110
- package/src/models/tokenization.ts +2 -2
- package/src/models/transcription.ts +7 -3
- package/src/plugin.ts +38 -0
- package/src/routes/cloud-billing-routes.ts +4 -14
- package/src/routes/cloud-coding-container-routes.ts +198 -0
- package/src/routes/cloud-compat-routes.ts +4 -14
- package/src/routes/cloud-features-routes.ts +1 -1
- package/src/routes/cloud-relay-routes.ts +47 -1
- package/src/routes/cloud-routes-autonomous.ts +7 -10
- package/src/routes/cloud-routes.ts +68 -7
- package/src/routes/cloud-status-routes-autonomous.ts +6 -2
- package/src/routes/home-remote-runner-access-url.ts +83 -0
- package/src/routes/travel-provider-relay-routes.ts +193 -0
- package/src/services/cloud-auth.ts +9 -2
- package/src/services/cloud-bootstrap.ts +1 -3
- package/src/services/cloud-bridge.ts +1 -1
- package/src/services/cloud-container.ts +93 -0
- package/src/services/cloud-credential-provider.ts +1 -1
- package/src/services/cloud-model-registry.ts +1 -1
- package/src/types/cloud.ts +22 -0
- package/src/types/index.ts +19 -0
- package/src/utils/cloud-sdk/client.ts +42 -3
- package/src/utils/cloud-sdk/public-routes.ts +168 -0
- package/src/utils/cloud-sdk/types.ts +0 -2
- package/src/utils/config.ts +20 -1
- package/src/utils/events.ts +30 -2
- package/src/utils/sdk-client.ts +5 -1
- package/src/utils/waifu-metering.ts +302 -0
- package/dist/onboarding.d.ts +0 -35
- package/dist/onboarding.d.ts.map +0 -1
- package/dist/onboarding.js.map +0 -14
- package/src/onboarding.ts +0 -396
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-billing-routes.d.ts","sourceRoot":"","sources":["../../src/routes/cloud-billing-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"cloud-billing-routes.d.ts","sourceRoot":"","sources":["../../src/routes/cloud-billing-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,eAAe,CAAC;AAQ3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CAC/B;AA+fD,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,OAAO,CAAC,CAmNlB"}
|
|
@@ -17,56 +17,8 @@ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
|
17
17
|
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
18
18
|
|
|
19
19
|
// src/cloud/base-url.ts
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
});
|
|
20
|
+
import { normalizeCloudSiteUrl, resolveCloudApiBaseUrl } from "@elizaos/shared";
|
|
21
|
+
var init_base_url = () => {};
|
|
70
22
|
|
|
71
23
|
// src/cloud/validate-url.ts
|
|
72
24
|
import dns from "node:dns";
|
|
@@ -177,6 +129,7 @@ async function validateCloudBaseUrl(rawUrl) {
|
|
|
177
129
|
if (hostname === "localhost" || hostname.endsWith(".localhost") || hostname.endsWith(".local")) {
|
|
178
130
|
return `Cloud base URL "${rawUrl}" points to a blocked local hostname.`;
|
|
179
131
|
}
|
|
132
|
+
const elizaDev = process.env.ELIZA_DEV?.trim().toLowerCase();
|
|
180
133
|
if (true) {
|
|
181
134
|
return null;
|
|
182
135
|
}
|
|
@@ -218,6 +171,19 @@ var init_validate_url = __esm(() => {
|
|
|
218
171
|
];
|
|
219
172
|
});
|
|
220
173
|
|
|
174
|
+
// src/cloud/auth-service-types.ts
|
|
175
|
+
function isCloudAuthApiKeyService(value) {
|
|
176
|
+
return value !== null && value !== undefined && typeof value.isAuthenticated === "function";
|
|
177
|
+
}
|
|
178
|
+
function normalizeCloudApiKey(value) {
|
|
179
|
+
if (typeof value !== "string")
|
|
180
|
+
return null;
|
|
181
|
+
const trimmed = value.trim();
|
|
182
|
+
if (!trimmed || trimmed.toUpperCase() === "[REDACTED]")
|
|
183
|
+
return null;
|
|
184
|
+
return trimmed;
|
|
185
|
+
}
|
|
186
|
+
|
|
221
187
|
// src/cloud/cloud-api-key.ts
|
|
222
188
|
function normalizeCloudSecret(value) {
|
|
223
189
|
if (typeof value !== "string")
|
|
@@ -361,15 +327,6 @@ async function fetchCryptoStatusCached(baseUrl, headers) {
|
|
|
361
327
|
function resolveCloudBaseUrl(config) {
|
|
362
328
|
return normalizeCloudSiteUrl(config.cloud?.baseUrl);
|
|
363
329
|
}
|
|
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
330
|
function resolveProxyApiKey(state) {
|
|
374
331
|
const cloudAuth = state.runtime ? state.runtime.getService("CLOUD_AUTH") : null;
|
|
375
332
|
const runtimeApiKey = cloudAuth?.isAuthenticated() === true ? normalizeCloudApiKey(cloudAuth.getApiKey?.()) : null;
|
|
@@ -804,4 +761,4 @@ export {
|
|
|
804
761
|
handleCloudBillingRoute
|
|
805
762
|
};
|
|
806
763
|
|
|
807
|
-
//# debugId=
|
|
764
|
+
//# debugId=2B7279AD0FDA269964756E2164756E21
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/cloud/base-url.ts", "../src/cloud/validate-url.ts", "../src/cloud/cloud-api-key.ts", "../src/lib/http.ts", "../src/routes/cloud-billing-routes.ts"],
|
|
3
|
+
"sources": ["../src/cloud/base-url.ts", "../src/cloud/validate-url.ts", "../src/cloud/auth-service-types.ts", "../src/cloud/cloud-api-key.ts", "../src/lib/http.ts", "../src/routes/cloud-billing-routes.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"
|
|
6
|
-
"import dns from \"node:dns\";\nimport net from \"node:net\";\nimport { promisify } from \"node:util\";\n\nconst dnsLookupAll = promisify(dns.lookup);\n\nconst BLOCKED_IPV4_CIDRS: Array<{ base: number; mask: number }> = [\n cidrV4(\"0.0.0.0\", 8),\n cidrV4(\"10.0.0.0\", 8),\n cidrV4(\"172.16.0.0\", 12),\n cidrV4(\"192.168.0.0\", 16),\n cidrV4(\"100.64.0.0\", 10),\n cidrV4(\"127.0.0.0\", 8),\n cidrV4(\"169.254.0.0\", 16),\n cidrV4(\"192.0.0.0\", 24),\n cidrV4(\"198.18.0.0\", 15),\n cidrV4(\"192.0.2.0\", 24),\n cidrV4(\"198.51.100.0\", 24),\n cidrV4(\"203.0.113.0\", 24),\n cidrV4(\"224.0.0.0\", 4),\n cidrV4(\"240.0.0.0\", 4),\n];\n\nfunction normalizeHostLike(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/^\\[|\\]$/g, \"\");\n}\n\nfunction decodeIpv6MappedHex(mapped: string): string | null {\n const parts = mapped.split(\":\");\n if (parts.length < 1 || parts.length > 2) return null;\n\n const parsed = parts.map((part) => {\n if (!/^[0-9a-f]{1,4}$/i.test(part)) return Number.NaN;\n return Number.parseInt(part, 16);\n });\n if (parsed.some((value) => !Number.isFinite(value))) return null;\n\n const [hi, lo] = parsed.length === 1 ? [0, parsed[0]] : parsed;\n const octets = [hi >> 8, hi & 0xff, lo >> 8, lo & 0xff];\n return octets.join(\".\");\n}\n\nfunction canonicalizeIpv6(ip: string): string | null {\n try {\n return new URL(`http://[${ip}]/`).hostname.replace(/^\\[|\\]$/g, \"\");\n } catch {\n return null;\n }\n}\n\nfunction normalizeIpForPolicy(ip: string): string {\n const base = normalizeHostLike(ip).split(\"%\")[0];\n if (!base) return base;\n\n let normalized = base;\n if (net.isIP(normalized) === 6) {\n normalized = canonicalizeIpv6(normalized) ?? normalized;\n }\n\n let mapped: string | null = null;\n if (normalized.startsWith(\"::ffff:\")) {\n mapped = normalized.slice(\"::ffff:\".length);\n } else if (normalized.startsWith(\"0:0:0:0:0:ffff:\")) {\n mapped = normalized.slice(\"0:0:0:0:0:ffff:\".length);\n }\n if (!mapped) return normalized;\n\n if (net.isIP(mapped) === 4) return mapped;\n return decodeIpv6MappedHex(mapped) ?? normalized;\n}\n\nfunction cidrV4(base: string, prefix: number): { base: number; mask: number } {\n const parsed = parseIpv4ToInt(base);\n if (parsed === null) {\n throw new Error(`Invalid CIDR base IPv4 address: ${base}`);\n }\n const shift = 32 - prefix;\n const mask = shift === 32 ? 0 : (0xffffffff << shift) >>> 0;\n return { base: parsed & mask, mask };\n}\n\nfunction parseIpv4ToInt(ip: string): number | null {\n const parts = ip.split(\".\");\n if (parts.length !== 4) return null;\n\n let value = 0;\n for (const part of parts) {\n if (!/^\\d{1,3}$/.test(part)) return null;\n const octet = Number.parseInt(part, 10);\n if (!Number.isInteger(octet) || octet < 0 || octet > 255) return null;\n value = (value << 8) | octet;\n }\n\n return value >>> 0;\n}\n\nfunction isBlockedIpv4(ip: string): boolean {\n const asInt = parseIpv4ToInt(ip);\n if (asInt === null) return true;\n return BLOCKED_IPV4_CIDRS.some((cidr) => (asInt & cidr.mask) === cidr.base);\n}\n\nfunction isBlockedIpv6(ip: string): boolean {\n const normalized = ip.toLowerCase();\n return (\n normalized === \"::\" ||\n normalized === \"::1\" ||\n /^fe[89ab][0-9a-f]:/.test(normalized) ||\n /^f[cd][0-9a-f]{2}:/i.test(normalized) ||\n normalized.startsWith(\"ff\")\n );\n}\n\nfunction isBlockedIp(ip: string): boolean {\n const normalized = normalizeIpForPolicy(ip);\n const family = net.isIP(normalized);\n if (family === 4) return isBlockedIpv4(normalized);\n if (family === 6) return isBlockedIpv6(normalized);\n return false;\n}\n\nexport async function validateCloudBaseUrl(\n rawUrl: string,\n): Promise<string | null> {\n let parsed: URL;\n try {\n parsed = new URL(rawUrl);\n } catch {\n return `Invalid cloud base URL: \"${rawUrl}\"`;\n }\n\n if (parsed.protocol !== \"https:\") {\n return `Cloud base URL must use HTTPS, got \"${parsed.protocol}\" in \"${rawUrl}\"`;\n }\n\n const hostname = normalizeHostLike(parsed.hostname);\n if (!hostname) {\n return `Invalid cloud base URL: \"${rawUrl}\"`;\n }\n\n if (\n hostname === \"localhost\" ||\n hostname.endsWith(\".localhost\") ||\n hostname.endsWith(\".local\")\n ) {\n return `Cloud base URL \"${rawUrl}\" points to a blocked local hostname.`;\n }\n\n // Dev-mode bypass: skip IP-range blocking but keep URL format checks above.\n if (process.env.NODE_ENV === \"development\"
|
|
5
|
+
"/**\n * Cloud site/API URL normalizer. The implementation moved to\n * `@elizaos/shared/elizacloud/base-url` so host-layer packages can normalize\n * URLs without reverse-importing this plugin.\n */\nexport { normalizeCloudSiteUrl, resolveCloudApiBaseUrl } from \"@elizaos/shared\";\n",
|
|
6
|
+
"import dns from \"node:dns\";\nimport net from \"node:net\";\nimport { promisify } from \"node:util\";\n\nconst dnsLookupAll = promisify(dns.lookup);\n\nconst BLOCKED_IPV4_CIDRS: Array<{ base: number; mask: number }> = [\n cidrV4(\"0.0.0.0\", 8),\n cidrV4(\"10.0.0.0\", 8),\n cidrV4(\"172.16.0.0\", 12),\n cidrV4(\"192.168.0.0\", 16),\n cidrV4(\"100.64.0.0\", 10),\n cidrV4(\"127.0.0.0\", 8),\n cidrV4(\"169.254.0.0\", 16),\n cidrV4(\"192.0.0.0\", 24),\n cidrV4(\"198.18.0.0\", 15),\n cidrV4(\"192.0.2.0\", 24),\n cidrV4(\"198.51.100.0\", 24),\n cidrV4(\"203.0.113.0\", 24),\n cidrV4(\"224.0.0.0\", 4),\n cidrV4(\"240.0.0.0\", 4),\n];\n\nfunction normalizeHostLike(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/^\\[|\\]$/g, \"\");\n}\n\nfunction decodeIpv6MappedHex(mapped: string): string | null {\n const parts = mapped.split(\":\");\n if (parts.length < 1 || parts.length > 2) return null;\n\n const parsed = parts.map((part) => {\n if (!/^[0-9a-f]{1,4}$/i.test(part)) return Number.NaN;\n return Number.parseInt(part, 16);\n });\n if (parsed.some((value) => !Number.isFinite(value))) return null;\n\n const [hi, lo] = parsed.length === 1 ? [0, parsed[0]] : parsed;\n const octets = [hi >> 8, hi & 0xff, lo >> 8, lo & 0xff];\n return octets.join(\".\");\n}\n\nfunction canonicalizeIpv6(ip: string): string | null {\n try {\n return new URL(`http://[${ip}]/`).hostname.replace(/^\\[|\\]$/g, \"\");\n } catch {\n return null;\n }\n}\n\nfunction normalizeIpForPolicy(ip: string): string {\n const base = normalizeHostLike(ip).split(\"%\")[0];\n if (!base) return base;\n\n let normalized = base;\n if (net.isIP(normalized) === 6) {\n normalized = canonicalizeIpv6(normalized) ?? normalized;\n }\n\n let mapped: string | null = null;\n if (normalized.startsWith(\"::ffff:\")) {\n mapped = normalized.slice(\"::ffff:\".length);\n } else if (normalized.startsWith(\"0:0:0:0:0:ffff:\")) {\n mapped = normalized.slice(\"0:0:0:0:0:ffff:\".length);\n }\n if (!mapped) return normalized;\n\n if (net.isIP(mapped) === 4) return mapped;\n return decodeIpv6MappedHex(mapped) ?? normalized;\n}\n\nfunction cidrV4(base: string, prefix: number): { base: number; mask: number } {\n const parsed = parseIpv4ToInt(base);\n if (parsed === null) {\n throw new Error(`Invalid CIDR base IPv4 address: ${base}`);\n }\n const shift = 32 - prefix;\n const mask = shift === 32 ? 0 : (0xffffffff << shift) >>> 0;\n return { base: parsed & mask, mask };\n}\n\nfunction parseIpv4ToInt(ip: string): number | null {\n const parts = ip.split(\".\");\n if (parts.length !== 4) return null;\n\n let value = 0;\n for (const part of parts) {\n if (!/^\\d{1,3}$/.test(part)) return null;\n const octet = Number.parseInt(part, 10);\n if (!Number.isInteger(octet) || octet < 0 || octet > 255) return null;\n value = (value << 8) | octet;\n }\n\n return value >>> 0;\n}\n\nfunction isBlockedIpv4(ip: string): boolean {\n const asInt = parseIpv4ToInt(ip);\n if (asInt === null) return true;\n return BLOCKED_IPV4_CIDRS.some((cidr) => (asInt & cidr.mask) === cidr.base);\n}\n\nfunction isBlockedIpv6(ip: string): boolean {\n const normalized = ip.toLowerCase();\n return (\n normalized === \"::\" ||\n normalized === \"::1\" ||\n /^fe[89ab][0-9a-f]:/.test(normalized) ||\n /^f[cd][0-9a-f]{2}:/i.test(normalized) ||\n normalized.startsWith(\"ff\")\n );\n}\n\nfunction isBlockedIp(ip: string): boolean {\n const normalized = normalizeIpForPolicy(ip);\n const family = net.isIP(normalized);\n if (family === 4) return isBlockedIpv4(normalized);\n if (family === 6) return isBlockedIpv6(normalized);\n return false;\n}\n\nexport async function validateCloudBaseUrl(\n rawUrl: string,\n): Promise<string | null> {\n let parsed: URL;\n try {\n parsed = new URL(rawUrl);\n } catch {\n return `Invalid cloud base URL: \"${rawUrl}\"`;\n }\n\n if (parsed.protocol !== \"https:\") {\n return `Cloud base URL must use HTTPS, got \"${parsed.protocol}\" in \"${rawUrl}\"`;\n }\n\n const hostname = normalizeHostLike(parsed.hostname);\n if (!hostname) {\n return `Invalid cloud base URL: \"${rawUrl}\"`;\n }\n\n if (\n hostname === \"localhost\" ||\n hostname.endsWith(\".localhost\") ||\n hostname.endsWith(\".local\")\n ) {\n return `Cloud base URL \"${rawUrl}\" points to a blocked local hostname.`;\n }\n\n // Dev-mode bypass: skip IP-range blocking but keep URL format checks above.\n const elizaDev = process.env.ELIZA_DEV?.trim().toLowerCase();\n if (\n process.env.NODE_ENV === \"development\" ||\n elizaDev === \"1\" ||\n elizaDev === \"true\" ||\n elizaDev === \"yes\"\n ) {\n return null;\n }\n\n if (isBlockedIp(hostname)) {\n return `Cloud base URL \"${rawUrl}\" points to a blocked address.`;\n }\n\n try {\n const results = await dnsLookupAll(hostname, { all: true });\n const addresses = Array.isArray(results) ? results : [results];\n for (const entry of addresses) {\n const ip =\n typeof entry === \"string\"\n ? entry\n : (entry as { address: string }).address;\n if (isBlockedIp(ip)) {\n return (\n `Cloud base URL \"${rawUrl}\" resolves to ${ip}, ` +\n \"which is a blocked internal/metadata address.\"\n );\n }\n }\n } catch {\n return `Cloud base URL \"${rawUrl}\" could not be resolved via DNS.`;\n }\n\n return null;\n}\n",
|
|
7
|
+
"import type { Service } from \"@elizaos/core\";\n\nexport interface CloudAuthApiKeyService {\n isAuthenticated: () => boolean;\n getApiKey?: () => string | undefined;\n}\n\nexport function isCloudAuthApiKeyService(\n value: Service | null | undefined,\n): value is Service & CloudAuthApiKeyService {\n return (\n value !== null &&\n value !== undefined &&\n typeof (value as Partial<CloudAuthApiKeyService>).isAuthenticated ===\n \"function\"\n );\n}\n\nexport function normalizeCloudApiKey(value: string | null | undefined): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n if (!trimmed || trimmed.toUpperCase() === \"[REDACTED]\") return null;\n return trimmed;\n}\n",
|
|
7
8
|
"/**\n * Cloud API key + base URL resolution.\n *\n * Resolves the Eliza Cloud API key and base URL from (in priority order):\n * 1. Explicit `config.cloud.apiKey` / `config.cloud.baseUrl`\n * 2. Runtime settings + character secrets (`ELIZAOS_CLOUD_API_KEY`)\n * 3. Process env (`ELIZAOS_CLOUD_API_KEY`, `ELIZAOS_CLOUD_BASE_URL`)\n *\n * Previously these helpers lived in `packages/agent/src/api/wallet-rpc.ts`\n * because the wallet uses Cloud RPC proxies. They are NOT wallet-specific —\n * cloud auth is consumed by cloud-status, cloud-billing, cloud-compat,\n * health, x-relay, and travel-provider-relay routes. Hosting them under\n * `cloud/` matches their actual ownership.\n */\n\nimport type { ElizaConfig } from \"../lib/config-like\";\n\nexport const DEFAULT_CLOUD_API_BASE_URL = \"https://elizacloud.ai/api/v1\";\n\nexport type CloudApiKeyRuntimeLike = {\n getSetting?: (key: string) => unknown;\n character?: {\n secrets?: Record<string, unknown>;\n } | null;\n} | null;\n\nexport function normalizeCloudSecret(\n value: string | null | undefined,\n): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction resolveRuntimeCloudApiKey(\n runtime?: CloudApiKeyRuntimeLike,\n): string | null {\n const fromSetting = runtime?.getSetting?.(\"ELIZAOS_CLOUD_API_KEY\");\n if (typeof fromSetting === \"string\") {\n return normalizeCloudSecret(fromSetting);\n }\n\n const fromSecrets = runtime?.character?.secrets?.ELIZAOS_CLOUD_API_KEY;\n return typeof fromSecrets === \"string\"\n ? normalizeCloudSecret(fromSecrets)\n : null;\n}\n\nexport function resolveCloudApiBaseUrl(\n rawBaseUrl?: string | null,\n): string | null {\n const candidate =\n normalizeCloudSecret(rawBaseUrl ?? process.env.ELIZAOS_CLOUD_BASE_URL) ??\n DEFAULT_CLOUD_API_BASE_URL;\n try {\n const parsed = new URL(candidate);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n return null;\n }\n parsed.hash = \"\";\n parsed.search = \"\";\n const normalizedBase = parsed.toString().replace(/\\/+$/, \"\");\n return normalizedBase.endsWith(\"/api/v1\")\n ? normalizedBase\n : `${normalizedBase}/api/v1`;\n } catch {\n return null;\n }\n}\n\nexport function resolveCloudApiKey(\n config?: Pick<ElizaConfig, \"cloud\"> | null,\n runtime?: CloudApiKeyRuntimeLike,\n): string | null {\n return normalizeCloudSecret(\n config?.cloud?.apiKey ??\n resolveRuntimeCloudApiKey(runtime) ??\n process.env.ELIZAOS_CLOUD_API_KEY,\n );\n}\n",
|
|
8
|
-
"import type http from \"node:http\";\n\nexport interface ReadJsonBodyOptions {\n maxBytes?: number;\n tooLargeMessage?: string;\n destroyOnTooLarge?: boolean;\n requireObject?: boolean;\n}\n\
|
|
9
|
-
"import type http from \"node:http\";\nimport type { AgentRuntime, Service } from \"@elizaos/core\";\nimport { normalizeCloudSiteUrl } from \"../cloud/base-url.js\";\nimport { resolveCloudApiKey } from \"../cloud/cloud-api-key.js\";\nimport { validateCloudBaseUrl } from \"../cloud/validate-url.js\";\nimport type { CloudProxyConfigLike } from \"../lib/config-like\";\nimport { sendJson, sendJsonError } from \"../lib/http\";\n\nexport interface CloudBillingRouteState {\n config: CloudProxyConfigLike;\n runtime?: AgentRuntime | null;\n}\n\nconst PROXY_TIMEOUT_MS = 15_000;\nconst MAX_BODY_BYTES = 1_048_576;\nconst MAX_REDIRECTS = 4;\n/**\n * crypto/status changes rarely (it advertises whether crypto top-ups are\n * enabled and which networks). Caching it amortises the second upstream call\n * `forwardSummary` makes per dashboard refresh against the per-key rate limit.\n *\n * Keyed by `(baseUrl, Authorization header)` so multi-account hosts (or hosts\n * that switch keys via re-login) never serve one account's cached status to\n * another. The Authorization header is already present in process memory at\n * the time of caching, so this introduces no new exposure.\n */\nconst CRYPTO_STATUS_CACHE_MS = 60_000;\nconst cryptoStatusCache = new Map<\n string,\n { value: unknown; expiresAt: number }\n>();\n\nfunction cryptoStatusCacheKey(\n baseUrl: string,\n headers: Record<string, string>,\n): string {\n return `${baseUrl}|${headers.Authorization ?? \"\"}`;\n}\n\nasync function fetchCryptoStatusCached(\n baseUrl: string,\n headers: Record<string, string>,\n): Promise<unknown> {\n const now = Date.now();\n const cacheKey = cryptoStatusCacheKey(baseUrl, headers);\n const cached = cryptoStatusCache.get(cacheKey);\n if (cached && cached.expiresAt > now) {\n return cached.value;\n }\n const response = await fetchUpstream(\n `${baseUrl}/api/crypto/status`,\n \"GET\",\n headers,\n undefined,\n ).catch(() => null);\n if (!response?.ok) {\n return cached?.value ?? null;\n }\n const value = await readJsonResponse(response).catch(() => ({}));\n cryptoStatusCache.set(cacheKey, {\n value,\n expiresAt: now + CRYPTO_STATUS_CACHE_MS,\n });\n return value;\n}\n\ninterface CloudAuthApiKeyService {\n isAuthenticated: () => boolean;\n getApiKey?: () => string | undefined;\n}\n\nfunction resolveCloudBaseUrl(config: CloudProxyConfigLike): string {\n return normalizeCloudSiteUrl(config.cloud?.baseUrl);\n}\n\nfunction normalizeCloudApiKey(value: string | null | undefined): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n if (!trimmed || trimmed.toUpperCase() === \"[REDACTED]\") {\n return null;\n }\n return trimmed;\n}\n\nfunction resolveProxyApiKey(state: CloudBillingRouteState): string | null {\n const cloudAuth = state.runtime\n ? state.runtime.getService<Service & CloudAuthApiKeyService>(\"CLOUD_AUTH\")\n : null;\n const runtimeApiKey =\n cloudAuth?.isAuthenticated() === true\n ? normalizeCloudApiKey(cloudAuth.getApiKey?.())\n : null;\n\n return runtimeApiKey ?? resolveCloudApiKey(state.config, state.runtime);\n}\n\nfunction buildAuthHeaders(\n config: CloudProxyConfigLike,\n apiKeyOverride?: string | null,\n): Record<string, string> {\n const serviceKey = config.cloud?.serviceKey?.trim();\n const apiKey =\n normalizeCloudApiKey(apiKeyOverride) ?? resolveCloudApiKey(config);\n\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n };\n\n if (serviceKey) {\n headers[\"X-Service-Key\"] = serviceKey;\n }\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n\n return headers;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction readNumber(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nfunction readBoolean(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction readBody(req: http.IncomingMessage): Promise<string | undefined> {\n const preParsedBody = (req as http.IncomingMessage & { body?: unknown }).body;\n if (preParsedBody !== undefined) {\n return Promise.resolve(\n typeof preParsedBody === \"string\"\n ? preParsedBody\n : JSON.stringify(preParsedBody),\n );\n }\n\n if (req.readableEnded) {\n return Promise.resolve(undefined);\n }\n\n return new Promise<string | undefined>((resolve, reject) => {\n const chunks: Buffer[] = [];\n let size = 0;\n\n req.on(\"data\", (chunk: Buffer) => {\n size += chunk.length;\n if (size > MAX_BODY_BYTES) {\n reject(new Error(\"Request body too large\"));\n return;\n }\n chunks.push(chunk);\n });\n req.on(\"end\", () =>\n resolve(\n chunks.length > 0 ? Buffer.concat(chunks).toString(\"utf-8\") : undefined,\n ),\n );\n req.on(\"error\", reject);\n });\n}\n\nasync function fetchUpstream(\n url: string,\n method: string,\n headers: Record<string, string>,\n body: string | undefined,\n): Promise<Response> {\n let currentUrl = url;\n let currentMethod = method;\n let currentBody = body;\n\n for (\n let redirectCount = 0;\n redirectCount <= MAX_REDIRECTS;\n redirectCount += 1\n ) {\n const response = await fetch(currentUrl, {\n method: currentMethod,\n headers,\n body: currentBody,\n redirect: \"manual\",\n signal: AbortSignal.timeout(PROXY_TIMEOUT_MS),\n });\n\n if (response.status < 300 || response.status >= 400) {\n return response;\n }\n\n const location = response.headers.get(\"location\");\n if (!location) {\n throw Object.assign(new Error(\"redirect\"), { code: \"REDIRECT\" });\n }\n\n const nextUrl = new URL(location, currentUrl).toString();\n const currentOrigin = normalizeCloudSiteUrl(new URL(currentUrl).origin);\n const nextOrigin = normalizeCloudSiteUrl(new URL(nextUrl).origin);\n if (\n new URL(currentUrl).origin !== new URL(nextUrl).origin &&\n currentOrigin !== nextOrigin\n ) {\n throw Object.assign(new Error(\"redirect\"), { code: \"REDIRECT\" });\n }\n\n currentUrl = nextUrl;\n if (\n currentMethod !== \"GET\" &&\n currentMethod !== \"HEAD\" &&\n (response.status === 301 ||\n response.status === 302 ||\n response.status === 303)\n ) {\n currentMethod = \"GET\";\n currentBody = undefined;\n }\n }\n\n throw Object.assign(new Error(\"redirect\"), { code: \"REDIRECT\" });\n}\n\nasync function readJsonResponse(response: Response): Promise<unknown> {\n return response.json().catch(async () => ({\n success: response.ok,\n error: await response.text().catch(() => \"Billing request failed\"),\n }));\n}\n\nfunction buildRedirectUrl(\n baseUrl: string,\n pathname: string,\n params: Record<string, string>,\n): string {\n const url = new URL(pathname, `${baseUrl}/`);\n for (const [key, value] of Object.entries(params)) {\n url.searchParams.set(key, value);\n }\n return url.toString();\n}\n\nfunction normalizeCryptoNetwork(value: string | undefined): string | undefined {\n if (!value) return undefined;\n\n const normalized = value.trim().toUpperCase();\n switch (normalized) {\n case \"BSC\":\n case \"BEP20\":\n return \"BEP20\";\n case \"ETH\":\n case \"ERC20\":\n return \"ERC20\";\n case \"MATIC\":\n case \"POLYGON\":\n return \"POLYGON\";\n case \"SOL\":\n case \"SOLANA\":\n return \"SOL\";\n case \"BASE\":\n return \"BASE\";\n case \"ARB\":\n case \"ARBITRUM\":\n return \"ARB\";\n case \"OP\":\n case \"OPTIMISM\":\n return \"OP\";\n case \"TRON\":\n case \"TRC20\":\n return \"TRC20\";\n default:\n return undefined;\n }\n}\n\nfunction mapBillingSummary(\n payload: unknown,\n baseUrl: string,\n cryptoStatus: unknown,\n): Record<string, unknown> {\n const source = isRecord(payload) ? payload : {};\n const organization = isRecord(source.organization) ? source.organization : {};\n const pricing = isRecord(source.pricing) ? source.pricing : {};\n const crypto = isRecord(cryptoStatus) ? cryptoStatus : {};\n const balance = readNumber(organization.creditBalance) ?? 0;\n\n return {\n success: source.success ?? true,\n balance,\n currency: \"USD\",\n topUpUrl: `${baseUrl}/dashboard/settings?tab=billing`,\n embeddedCheckoutEnabled: false,\n hostedCheckoutEnabled: true,\n cryptoEnabled:\n readBoolean(crypto.enabled) ?? readBoolean(pricing.x402Enabled) ?? false,\n low: balance < 2,\n critical: balance < 0.5,\n hasPaymentMethod: readBoolean(organization.hasPaymentMethod) ?? false,\n autoTopUpEnabled: readBoolean(organization.autoTopUpEnabled) ?? false,\n autoTopUpAmount: readNumber(organization.autoTopUpAmount),\n autoTopUpThreshold: readNumber(organization.autoTopUpThreshold),\n minimumTopUp: readNumber(pricing.minimumTopUp),\n };\n}\n\nfunction mapPaymentMethods(payload: unknown): Record<string, unknown> {\n const source = isRecord(payload) ? payload : {};\n const organization = isRecord(source.organization) ? source.organization : {};\n const hasPaymentMethod = readBoolean(organization.hasPaymentMethod) ?? false;\n\n return {\n success: true,\n data: hasPaymentMethod\n ? [\n {\n id: \"stripe-default\",\n type: \"card\",\n label: \"Saved payment method\",\n brand: \"Card\",\n isDefault: true,\n },\n ]\n : [],\n };\n}\n\nfunction mapBillingHistory(payload: unknown): Record<string, unknown> {\n const source = isRecord(payload) ? payload : {};\n const rawTransactions = Array.isArray(source.transactions)\n ? source.transactions\n : [];\n\n return {\n success: true,\n data: rawTransactions.filter(isRecord).map((item, index) => ({\n id: readString(item.id) ?? `txn-${index}`,\n kind: readString(item.type),\n provider: readString(item.stripe_payment_intent_id)\n ? \"stripe\"\n : undefined,\n status: (readNumber(item.amount) ?? 0) >= 0 ? \"credited\" : \"usage\",\n amount: readNumber(item.amount) ?? 0,\n currency: \"USD\",\n description: readString(item.description),\n createdAt: readString(item.created_at) ?? new Date().toISOString(),\n })),\n total: readNumber(source.total),\n period: source.period,\n };\n}\n\nfunction mapCheckoutResponse(payload: unknown): Record<string, unknown> {\n const source = isRecord(payload) ? payload : {};\n return {\n success: true,\n provider: \"stripe\",\n mode: \"hosted\",\n checkoutUrl: readString(source.url) ?? readString(source.checkoutUrl),\n sessionId: readString(source.sessionId),\n };\n}\n\nfunction mapCryptoQuoteResponse(\n payload: unknown,\n amountUsd: number,\n payCurrency: string,\n network: string | undefined,\n): Record<string, unknown> {\n const source = isRecord(payload) ? payload : {};\n return {\n success: true,\n provider: \"oxapay\",\n invoiceId: readString(source.paymentId) ?? readString(source.trackId),\n trackId: readString(source.trackId),\n network,\n currency: payCurrency,\n amount: readString(source.creditsToAdd) ?? String(amountUsd),\n amountUsd,\n paymentLinkUrl: readString(source.payLink),\n expiresAt: readString(source.expiresAt),\n };\n}\n\nfunction parseJsonBody(body: string | undefined): Record<string, unknown> {\n if (!body) return {};\n const parsed = JSON.parse(body);\n return isRecord(parsed) ? parsed : {};\n}\n\nasync function forwardSummary(\n baseUrl: string,\n headers: Record<string, string>,\n): Promise<{ status: number; payload: Record<string, unknown> | unknown }> {\n const summaryResponse = await fetchUpstream(\n `${baseUrl}/api/v1/credits/summary`,\n \"GET\",\n headers,\n undefined,\n );\n const summaryPayload = await readJsonResponse(summaryResponse);\n if (!summaryResponse.ok) {\n return { status: summaryResponse.status, payload: summaryPayload };\n }\n\n // Fetch crypto/status only when summary succeeded; cache it across requests\n // so we don't burn a per-key rate-limit slot every time the dashboard\n // refreshes (it changes rarely).\n const cryptoPayload = (await fetchCryptoStatusCached(baseUrl, headers)) ?? {};\n\n return {\n status: summaryResponse.status,\n payload: mapBillingSummary(summaryPayload, baseUrl, cryptoPayload),\n };\n}\n\n/**\n * Wraps `sendJson` to also set the HTTP `Retry-After` header when the upstream\n * payload describes a rate-limit (status 429 + `retryAfter` in the body).\n * The body's `retryAfter` field is preserved for clients that read JSON.\n */\nfunction sendJsonWithRetry(\n res: http.ServerResponse,\n payload: unknown,\n status: number,\n): void {\n if (status === 429 && isRecord(payload)) {\n const retryAfter = readNumber(payload.retryAfter);\n if (retryAfter && retryAfter > 0) {\n res.setHeader(\"Retry-After\", String(Math.ceil(retryAfter)));\n }\n }\n sendJson(res, payload, status);\n}\n\nfunction mirrorPaymentHeaders(\n res: http.ServerResponse,\n upstreamResponse: Response,\n): void {\n for (const header of [\n \"PAYMENT-REQUIRED\",\n \"Payment-Required\",\n \"PAYMENT-RESPONSE\",\n \"Payment-Response\",\n \"Access-Control-Expose-Headers\",\n ]) {\n const value = upstreamResponse.headers.get(header);\n if (value) {\n res.setHeader(header, value);\n }\n }\n}\n\nfunction isAllowedAppMoneyPath(pathname: string): boolean {\n const appMoneyPath =\n /^\\/api\\/cloud\\/billing\\/apps\\/[^/]+\\/(charges|earnings|monetization)(?:\\/|$)/;\n return appMoneyPath.test(pathname);\n}\n\nfunction mapBillingProxyPath(pathname: string): string | null {\n if (pathname === \"/api/cloud/billing/x402\") return \"/api/v1/x402\";\n if (pathname.startsWith(\"/api/cloud/billing/x402/\")) {\n return pathname.replace(\"/api/cloud/billing/x402\", \"/api/v1/x402\");\n }\n\n if (pathname === \"/api/cloud/billing/app-credits\") {\n return \"/api/v1/app-credits\";\n }\n if (pathname.startsWith(\"/api/cloud/billing/app-credits/\")) {\n return pathname.replace(\n \"/api/cloud/billing/app-credits\",\n \"/api/v1/app-credits\",\n );\n }\n\n if (pathname === \"/api/cloud/billing/affiliates\") {\n return \"/api/v1/affiliates\";\n }\n if (pathname.startsWith(\"/api/cloud/billing/affiliates/\")) {\n return pathname.replace(\n \"/api/cloud/billing/affiliates\",\n \"/api/v1/affiliates\",\n );\n }\n\n if (pathname === \"/api/cloud/billing/redemptions\") {\n return \"/api/v1/redemptions\";\n }\n if (pathname.startsWith(\"/api/cloud/billing/redemptions/\")) {\n return pathname.replace(\n \"/api/cloud/billing/redemptions\",\n \"/api/v1/redemptions\",\n );\n }\n\n if (isAllowedAppMoneyPath(pathname)) {\n return pathname.replace(\"/api/cloud/billing/apps\", \"/api/v1/apps\");\n }\n\n return null;\n}\n\nasync function forwardBillingProxy(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n method: string,\n baseUrl: string,\n headers: Record<string, string>,\n upstreamPath: string,\n search: string,\n): Promise<void> {\n let body: string | undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n body = await readBody(req);\n }\n\n const upstreamResponse = await fetchUpstream(\n `${baseUrl}${upstreamPath}${search}`,\n method,\n headers,\n body,\n );\n const responseData = await readJsonResponse(upstreamResponse);\n mirrorPaymentHeaders(res, upstreamResponse);\n sendJsonWithRetry(res, responseData, upstreamResponse.status);\n}\n\nexport async function handleCloudBillingRoute(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string,\n method: string,\n state: CloudBillingRouteState,\n): Promise<boolean> {\n if (!pathname.startsWith(\"/api/cloud/billing\")) return false;\n\n const apiKey = resolveProxyApiKey(state);\n if (!apiKey) {\n sendJsonError(\n res,\n \"Not connected to Eliza Cloud. Please log in first.\",\n 401,\n );\n return true;\n }\n\n const baseUrl = resolveCloudBaseUrl(state.config);\n const urlError = await validateCloudBaseUrl(baseUrl);\n if (urlError) {\n sendJsonError(res, urlError, 502);\n return true;\n }\n\n const headers = buildAuthHeaders(state.config, apiKey);\n\n const fullUrl = new URL(req.url ?? pathname, \"http://localhost\");\n const proxiedMoneyPath = mapBillingProxyPath(pathname);\n if (proxiedMoneyPath) {\n await forwardBillingProxy(\n req,\n res,\n method,\n baseUrl,\n headers,\n proxiedMoneyPath,\n fullUrl.search,\n );\n return true;\n }\n\n if (pathname === \"/api/cloud/billing/summary\" && method === \"GET\") {\n const { status, payload } = await forwardSummary(baseUrl, headers);\n sendJsonWithRetry(res, payload, status);\n return true;\n }\n\n if (pathname === \"/api/cloud/billing/payment-methods\" && method === \"GET\") {\n const summaryResponse = await fetchUpstream(\n `${baseUrl}/api/v1/credits/summary`,\n \"GET\",\n headers,\n undefined,\n );\n const summaryPayload = await readJsonResponse(summaryResponse);\n sendJsonWithRetry(\n res,\n summaryResponse.ok ? mapPaymentMethods(summaryPayload) : summaryPayload,\n summaryResponse.status,\n );\n return true;\n }\n\n if (pathname === \"/api/cloud/billing/history\" && method === \"GET\") {\n const upstreamUrl = `${baseUrl}/api/credits/transactions${fullUrl.search}`;\n const historyResponse = await fetchUpstream(\n upstreamUrl,\n \"GET\",\n headers,\n undefined,\n );\n const historyPayload = await readJsonResponse(historyResponse);\n sendJsonWithRetry(\n res,\n historyResponse.ok ? mapBillingHistory(historyPayload) : historyPayload,\n historyResponse.status,\n );\n return true;\n }\n\n if (pathname === \"/api/cloud/billing/checkout\" && method === \"POST\") {\n const body = await readBody(req);\n const requestBody = parseJsonBody(body);\n const amountUsd = readNumber(requestBody.amountUsd);\n\n if (!amountUsd || amountUsd <= 0) {\n sendJsonError(res, \"Invalid top-up amount\", 400);\n return true;\n }\n\n const upstreamBody = JSON.stringify({\n credits: amountUsd,\n success_url: buildRedirectUrl(baseUrl, \"/dashboard/billing/success\", {\n from: \"eliza\",\n }),\n cancel_url: buildRedirectUrl(baseUrl, \"/dashboard/settings\", {\n from: \"eliza\",\n tab: \"billing\",\n canceled: \"1\",\n }),\n });\n\n const checkoutResponse = await fetchUpstream(\n `${baseUrl}/api/v1/credits/checkout`,\n \"POST\",\n headers,\n upstreamBody,\n );\n const checkoutPayload = await readJsonResponse(checkoutResponse);\n sendJsonWithRetry(\n res,\n checkoutResponse.ok\n ? mapCheckoutResponse(checkoutPayload)\n : checkoutPayload,\n checkoutResponse.status,\n );\n return true;\n }\n\n if (pathname === \"/api/cloud/billing/crypto/quote\" && method === \"POST\") {\n const body = await readBody(req);\n const requestBody = parseJsonBody(body);\n const amountUsd = readNumber(requestBody.amountUsd);\n\n if (!amountUsd || amountUsd <= 0) {\n sendJsonError(res, \"Invalid top-up amount\", 400);\n return true;\n }\n\n const payCurrency =\n readString(requestBody.currency)?.trim().toUpperCase() ?? \"USDC\";\n const network = normalizeCryptoNetwork(readString(requestBody.network));\n const upstreamBody = JSON.stringify({\n amount: amountUsd,\n payCurrency,\n network,\n });\n\n const cryptoResponse = await fetchUpstream(\n `${baseUrl}/api/crypto/payments`,\n \"POST\",\n headers,\n upstreamBody,\n );\n const cryptoPayload = await readJsonResponse(cryptoResponse);\n sendJsonWithRetry(\n res,\n cryptoResponse.ok\n ? mapCryptoQuoteResponse(cryptoPayload, amountUsd, payCurrency, network)\n : cryptoPayload,\n cryptoResponse.status,\n );\n return true;\n }\n\n if (pathname.startsWith(\"/api/cloud/billing/credits/\")) {\n let body: string | undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n body = await readBody(req);\n }\n\n const upstreamPath = pathname.replace(\n \"/api/cloud/billing/credits\",\n \"/api/v1/credits\",\n );\n const upstreamResponse = await fetchUpstream(\n `${baseUrl}${upstreamPath}${fullUrl.search}`,\n method,\n headers,\n body,\n );\n const responseData = await readJsonResponse(upstreamResponse);\n sendJsonWithRetry(res, responseData, upstreamResponse.status);\n return true;\n }\n\n if (\n pathname.startsWith(\"/api/cloud/billing/crypto/\") &&\n pathname !== \"/api/cloud/billing/crypto/quote\"\n ) {\n let body: string | undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n body = await readBody(req);\n }\n\n const upstreamPath = pathname.replace(\n \"/api/cloud/billing/crypto\",\n \"/api/crypto\",\n );\n const upstreamResponse = await fetchUpstream(\n `${baseUrl}${upstreamPath}${fullUrl.search}`,\n method,\n headers,\n body,\n );\n const responseData = await readJsonResponse(upstreamResponse);\n sendJsonWithRetry(res, responseData, upstreamResponse.status);\n return true;\n }\n\n let body: string | undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n body = await readBody(req);\n }\n\n const billingPath = pathname.replace(\"/api/cloud/billing\", \"/api/v1/billing\");\n const upstreamResponse = await fetchUpstream(\n `${baseUrl}${billingPath}${fullUrl.search}`,\n method,\n headers,\n body,\n );\n const responseData = await readJsonResponse(upstreamResponse);\n sendJsonWithRetry(res, responseData, upstreamResponse.status);\n return true;\n}\n"
|
|
9
|
+
"import type http from \"node:http\";\n\nexport interface ReadJsonBodyOptions {\n maxBytes?: number;\n tooLargeMessage?: string;\n destroyOnTooLarge?: boolean;\n requireObject?: boolean;\n}\n\nfunction scrubStackFields(value: unknown): unknown {\n if (value instanceof Error) {\n return { error: value.message || \"Internal error\" };\n }\n if (Array.isArray(value)) {\n return value.map(scrubStackFields);\n }\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [key, nested] of Object.entries(value)) {\n if (key === \"stack\" || key === \"stackTrace\") continue;\n out[key] = scrubStackFields(nested);\n }\n return out;\n }\n return value;\n}\n\nexport function sendJson(\n res: http.ServerResponse,\n body: unknown,\n status = 200,\n): void {\n if (res.headersSent) return;\n res.statusCode = status;\n res.setHeader(\"content-type\", \"application/json; charset=utf-8\");\n res.end(JSON.stringify(scrubStackFields(body)));\n}\n\nexport function sendJsonError(\n res: http.ServerResponse,\n message: string,\n status = 400,\n): void {\n sendJson(res, { error: message }, status);\n}\n\nasync function readRequestBody(\n req: http.IncomingMessage,\n options: ReadJsonBodyOptions,\n): Promise<string | null> {\n const maxBytes = options.maxBytes ?? 1_048_576;\n const chunks: Buffer[] = [];\n let size = 0;\n\n for await (const chunk of req) {\n const buffer = typeof chunk === \"string\" ? Buffer.from(chunk) : chunk;\n size += buffer.length;\n if (size > maxBytes) {\n if (options.destroyOnTooLarge) req.destroy();\n throw new Error(options.tooLargeMessage ?? \"Request body too large\");\n }\n chunks.push(buffer);\n }\n\n if (chunks.length === 0) return null;\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n\nexport async function readJsonBody<T extends object = Record<string, unknown>>(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n options: ReadJsonBodyOptions = {},\n): Promise<T | null> {\n const cached = (req as http.IncomingMessage & { body?: unknown }).body;\n if (cached !== undefined) {\n if (\n options.requireObject !== false &&\n (!cached || typeof cached !== \"object\" || Array.isArray(cached))\n ) {\n sendJsonError(res, \"Request body must be a JSON object\", 400);\n return null;\n }\n return cached as T;\n }\n\n let raw: string | null;\n try {\n raw = await readRequestBody(req, options);\n } catch (error) {\n sendJsonError(\n res,\n error instanceof Error ? error.message : \"Failed to read request body\",\n 413,\n );\n return null;\n }\n\n if (!raw?.trim()) {\n const empty = {} as T;\n (req as http.IncomingMessage & { body?: unknown }).body = empty;\n return empty;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n sendJsonError(res, \"Invalid JSON in request body\", 400);\n return null;\n }\n\n if (\n options.requireObject !== false &&\n (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed))\n ) {\n sendJsonError(res, \"Request body must be a JSON object\", 400);\n return null;\n }\n\n (req as http.IncomingMessage & { body?: unknown }).body = parsed;\n return parsed as T;\n}\n",
|
|
10
|
+
"import type http from \"node:http\";\nimport type { AgentRuntime, Service } from \"@elizaos/core\";\nimport { normalizeCloudSiteUrl } from \"../cloud/base-url.js\";\nimport {\n type CloudAuthApiKeyService,\n normalizeCloudApiKey,\n} from \"../cloud/auth-service-types\";\nimport { resolveCloudApiKey } from \"../cloud/cloud-api-key.js\";\nimport { validateCloudBaseUrl } from \"../cloud/validate-url.js\";\nimport type { CloudProxyConfigLike } from \"../lib/config-like\";\nimport { sendJson, sendJsonError } from \"../lib/http\";\n\nexport interface CloudBillingRouteState {\n config: CloudProxyConfigLike;\n runtime?: AgentRuntime | null;\n}\n\nconst PROXY_TIMEOUT_MS = 15_000;\nconst MAX_BODY_BYTES = 1_048_576;\nconst MAX_REDIRECTS = 4;\n/**\n * crypto/status changes rarely (it advertises whether crypto top-ups are\n * enabled and which networks). Caching it amortises the second upstream call\n * `forwardSummary` makes per dashboard refresh against the per-key rate limit.\n *\n * Keyed by `(baseUrl, Authorization header)` so multi-account hosts (or hosts\n * that switch keys via re-login) never serve one account's cached status to\n * another. The Authorization header is already present in process memory at\n * the time of caching, so this introduces no new exposure.\n */\nconst CRYPTO_STATUS_CACHE_MS = 60_000;\nconst cryptoStatusCache = new Map<\n string,\n { value: unknown; expiresAt: number }\n>();\n\nfunction cryptoStatusCacheKey(\n baseUrl: string,\n headers: Record<string, string>,\n): string {\n return `${baseUrl}|${headers.Authorization ?? \"\"}`;\n}\n\nasync function fetchCryptoStatusCached(\n baseUrl: string,\n headers: Record<string, string>,\n): Promise<unknown> {\n const now = Date.now();\n const cacheKey = cryptoStatusCacheKey(baseUrl, headers);\n const cached = cryptoStatusCache.get(cacheKey);\n if (cached && cached.expiresAt > now) {\n return cached.value;\n }\n const response = await fetchUpstream(\n `${baseUrl}/api/crypto/status`,\n \"GET\",\n headers,\n undefined,\n ).catch(() => null);\n if (!response?.ok) {\n return cached?.value ?? null;\n }\n const value = await readJsonResponse(response).catch(() => ({}));\n cryptoStatusCache.set(cacheKey, {\n value,\n expiresAt: now + CRYPTO_STATUS_CACHE_MS,\n });\n return value;\n}\n\nfunction resolveCloudBaseUrl(config: CloudProxyConfigLike): string {\n return normalizeCloudSiteUrl(config.cloud?.baseUrl);\n}\n\nfunction resolveProxyApiKey(state: CloudBillingRouteState): string | null {\n const cloudAuth = state.runtime\n ? state.runtime.getService<Service & CloudAuthApiKeyService>(\"CLOUD_AUTH\")\n : null;\n const runtimeApiKey =\n cloudAuth?.isAuthenticated() === true\n ? normalizeCloudApiKey(cloudAuth.getApiKey?.())\n : null;\n\n return runtimeApiKey ?? resolveCloudApiKey(state.config, state.runtime);\n}\n\nfunction buildAuthHeaders(\n config: CloudProxyConfigLike,\n apiKeyOverride?: string | null,\n): Record<string, string> {\n const serviceKey = config.cloud?.serviceKey?.trim();\n const apiKey =\n normalizeCloudApiKey(apiKeyOverride) ?? resolveCloudApiKey(config);\n\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n };\n\n if (serviceKey) {\n headers[\"X-Service-Key\"] = serviceKey;\n }\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n\n return headers;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction readNumber(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nfunction readBoolean(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction readBody(req: http.IncomingMessage): Promise<string | undefined> {\n const preParsedBody = (req as http.IncomingMessage & { body?: unknown }).body;\n if (preParsedBody !== undefined) {\n return Promise.resolve(\n typeof preParsedBody === \"string\"\n ? preParsedBody\n : JSON.stringify(preParsedBody),\n );\n }\n\n if (req.readableEnded) {\n return Promise.resolve(undefined);\n }\n\n return new Promise<string | undefined>((resolve, reject) => {\n const chunks: Buffer[] = [];\n let size = 0;\n\n req.on(\"data\", (chunk: Buffer) => {\n size += chunk.length;\n if (size > MAX_BODY_BYTES) {\n reject(new Error(\"Request body too large\"));\n return;\n }\n chunks.push(chunk);\n });\n req.on(\"end\", () =>\n resolve(\n chunks.length > 0 ? Buffer.concat(chunks).toString(\"utf-8\") : undefined,\n ),\n );\n req.on(\"error\", reject);\n });\n}\n\nasync function fetchUpstream(\n url: string,\n method: string,\n headers: Record<string, string>,\n body: string | undefined,\n): Promise<Response> {\n let currentUrl = url;\n let currentMethod = method;\n let currentBody = body;\n\n for (\n let redirectCount = 0;\n redirectCount <= MAX_REDIRECTS;\n redirectCount += 1\n ) {\n const response = await fetch(currentUrl, {\n method: currentMethod,\n headers,\n body: currentBody,\n redirect: \"manual\",\n signal: AbortSignal.timeout(PROXY_TIMEOUT_MS),\n });\n\n if (response.status < 300 || response.status >= 400) {\n return response;\n }\n\n const location = response.headers.get(\"location\");\n if (!location) {\n throw Object.assign(new Error(\"redirect\"), { code: \"REDIRECT\" });\n }\n\n const nextUrl = new URL(location, currentUrl).toString();\n const currentOrigin = normalizeCloudSiteUrl(new URL(currentUrl).origin);\n const nextOrigin = normalizeCloudSiteUrl(new URL(nextUrl).origin);\n if (\n new URL(currentUrl).origin !== new URL(nextUrl).origin &&\n currentOrigin !== nextOrigin\n ) {\n throw Object.assign(new Error(\"redirect\"), { code: \"REDIRECT\" });\n }\n\n currentUrl = nextUrl;\n if (\n currentMethod !== \"GET\" &&\n currentMethod !== \"HEAD\" &&\n (response.status === 301 ||\n response.status === 302 ||\n response.status === 303)\n ) {\n currentMethod = \"GET\";\n currentBody = undefined;\n }\n }\n\n throw Object.assign(new Error(\"redirect\"), { code: \"REDIRECT\" });\n}\n\nasync function readJsonResponse(response: Response): Promise<unknown> {\n return response.json().catch(async () => ({\n success: response.ok,\n error: await response.text().catch(() => \"Billing request failed\"),\n }));\n}\n\nfunction buildRedirectUrl(\n baseUrl: string,\n pathname: string,\n params: Record<string, string>,\n): string {\n const url = new URL(pathname, `${baseUrl}/`);\n for (const [key, value] of Object.entries(params)) {\n url.searchParams.set(key, value);\n }\n return url.toString();\n}\n\nfunction normalizeCryptoNetwork(value: string | undefined): string | undefined {\n if (!value) return undefined;\n\n const normalized = value.trim().toUpperCase();\n switch (normalized) {\n case \"BSC\":\n case \"BEP20\":\n return \"BEP20\";\n case \"ETH\":\n case \"ERC20\":\n return \"ERC20\";\n case \"MATIC\":\n case \"POLYGON\":\n return \"POLYGON\";\n case \"SOL\":\n case \"SOLANA\":\n return \"SOL\";\n case \"BASE\":\n return \"BASE\";\n case \"ARB\":\n case \"ARBITRUM\":\n return \"ARB\";\n case \"OP\":\n case \"OPTIMISM\":\n return \"OP\";\n case \"TRON\":\n case \"TRC20\":\n return \"TRC20\";\n default:\n return undefined;\n }\n}\n\nfunction mapBillingSummary(\n payload: unknown,\n baseUrl: string,\n cryptoStatus: unknown,\n): Record<string, unknown> {\n const source = isRecord(payload) ? payload : {};\n const organization = isRecord(source.organization) ? source.organization : {};\n const pricing = isRecord(source.pricing) ? source.pricing : {};\n const crypto = isRecord(cryptoStatus) ? cryptoStatus : {};\n const balance = readNumber(organization.creditBalance) ?? 0;\n\n return {\n success: source.success ?? true,\n balance,\n currency: \"USD\",\n topUpUrl: `${baseUrl}/dashboard/settings?tab=billing`,\n embeddedCheckoutEnabled: false,\n hostedCheckoutEnabled: true,\n cryptoEnabled:\n readBoolean(crypto.enabled) ?? readBoolean(pricing.x402Enabled) ?? false,\n low: balance < 2,\n critical: balance < 0.5,\n hasPaymentMethod: readBoolean(organization.hasPaymentMethod) ?? false,\n autoTopUpEnabled: readBoolean(organization.autoTopUpEnabled) ?? false,\n autoTopUpAmount: readNumber(organization.autoTopUpAmount),\n autoTopUpThreshold: readNumber(organization.autoTopUpThreshold),\n minimumTopUp: readNumber(pricing.minimumTopUp),\n };\n}\n\nfunction mapPaymentMethods(payload: unknown): Record<string, unknown> {\n const source = isRecord(payload) ? payload : {};\n const organization = isRecord(source.organization) ? source.organization : {};\n const hasPaymentMethod = readBoolean(organization.hasPaymentMethod) ?? false;\n\n return {\n success: true,\n data: hasPaymentMethod\n ? [\n {\n id: \"stripe-default\",\n type: \"card\",\n label: \"Saved payment method\",\n brand: \"Card\",\n isDefault: true,\n },\n ]\n : [],\n };\n}\n\nfunction mapBillingHistory(payload: unknown): Record<string, unknown> {\n const source = isRecord(payload) ? payload : {};\n const rawTransactions = Array.isArray(source.transactions)\n ? source.transactions\n : [];\n\n return {\n success: true,\n data: rawTransactions.filter(isRecord).map((item, index) => ({\n id: readString(item.id) ?? `txn-${index}`,\n kind: readString(item.type),\n provider: readString(item.stripe_payment_intent_id)\n ? \"stripe\"\n : undefined,\n status: (readNumber(item.amount) ?? 0) >= 0 ? \"credited\" : \"usage\",\n amount: readNumber(item.amount) ?? 0,\n currency: \"USD\",\n description: readString(item.description),\n createdAt: readString(item.created_at) ?? new Date().toISOString(),\n })),\n total: readNumber(source.total),\n period: source.period,\n };\n}\n\nfunction mapCheckoutResponse(payload: unknown): Record<string, unknown> {\n const source = isRecord(payload) ? payload : {};\n return {\n success: true,\n provider: \"stripe\",\n mode: \"hosted\",\n checkoutUrl: readString(source.url) ?? readString(source.checkoutUrl),\n sessionId: readString(source.sessionId),\n };\n}\n\nfunction mapCryptoQuoteResponse(\n payload: unknown,\n amountUsd: number,\n payCurrency: string,\n network: string | undefined,\n): Record<string, unknown> {\n const source = isRecord(payload) ? payload : {};\n return {\n success: true,\n provider: \"oxapay\",\n invoiceId: readString(source.paymentId) ?? readString(source.trackId),\n trackId: readString(source.trackId),\n network,\n currency: payCurrency,\n amount: readString(source.creditsToAdd) ?? String(amountUsd),\n amountUsd,\n paymentLinkUrl: readString(source.payLink),\n expiresAt: readString(source.expiresAt),\n };\n}\n\nfunction parseJsonBody(body: string | undefined): Record<string, unknown> {\n if (!body) return {};\n const parsed = JSON.parse(body);\n return isRecord(parsed) ? parsed : {};\n}\n\nasync function forwardSummary(\n baseUrl: string,\n headers: Record<string, string>,\n): Promise<{ status: number; payload: Record<string, unknown> | unknown }> {\n const summaryResponse = await fetchUpstream(\n `${baseUrl}/api/v1/credits/summary`,\n \"GET\",\n headers,\n undefined,\n );\n const summaryPayload = await readJsonResponse(summaryResponse);\n if (!summaryResponse.ok) {\n return { status: summaryResponse.status, payload: summaryPayload };\n }\n\n // Fetch crypto/status only when summary succeeded; cache it across requests\n // so we don't burn a per-key rate-limit slot every time the dashboard\n // refreshes (it changes rarely).\n const cryptoPayload = (await fetchCryptoStatusCached(baseUrl, headers)) ?? {};\n\n return {\n status: summaryResponse.status,\n payload: mapBillingSummary(summaryPayload, baseUrl, cryptoPayload),\n };\n}\n\n/**\n * Wraps `sendJson` to also set the HTTP `Retry-After` header when the upstream\n * payload describes a rate-limit (status 429 + `retryAfter` in the body).\n * The body's `retryAfter` field is preserved for clients that read JSON.\n */\nfunction sendJsonWithRetry(\n res: http.ServerResponse,\n payload: unknown,\n status: number,\n): void {\n if (status === 429 && isRecord(payload)) {\n const retryAfter = readNumber(payload.retryAfter);\n if (retryAfter && retryAfter > 0) {\n res.setHeader(\"Retry-After\", String(Math.ceil(retryAfter)));\n }\n }\n sendJson(res, payload, status);\n}\n\nfunction mirrorPaymentHeaders(\n res: http.ServerResponse,\n upstreamResponse: Response,\n): void {\n for (const header of [\n \"PAYMENT-REQUIRED\",\n \"Payment-Required\",\n \"PAYMENT-RESPONSE\",\n \"Payment-Response\",\n \"Access-Control-Expose-Headers\",\n ]) {\n const value = upstreamResponse.headers.get(header);\n if (value) {\n res.setHeader(header, value);\n }\n }\n}\n\nfunction isAllowedAppMoneyPath(pathname: string): boolean {\n const appMoneyPath =\n /^\\/api\\/cloud\\/billing\\/apps\\/[^/]+\\/(charges|earnings|monetization)(?:\\/|$)/;\n return appMoneyPath.test(pathname);\n}\n\nfunction mapBillingProxyPath(pathname: string): string | null {\n if (pathname === \"/api/cloud/billing/x402\") return \"/api/v1/x402\";\n if (pathname.startsWith(\"/api/cloud/billing/x402/\")) {\n return pathname.replace(\"/api/cloud/billing/x402\", \"/api/v1/x402\");\n }\n\n if (pathname === \"/api/cloud/billing/app-credits\") {\n return \"/api/v1/app-credits\";\n }\n if (pathname.startsWith(\"/api/cloud/billing/app-credits/\")) {\n return pathname.replace(\n \"/api/cloud/billing/app-credits\",\n \"/api/v1/app-credits\",\n );\n }\n\n if (pathname === \"/api/cloud/billing/affiliates\") {\n return \"/api/v1/affiliates\";\n }\n if (pathname.startsWith(\"/api/cloud/billing/affiliates/\")) {\n return pathname.replace(\n \"/api/cloud/billing/affiliates\",\n \"/api/v1/affiliates\",\n );\n }\n\n if (pathname === \"/api/cloud/billing/redemptions\") {\n return \"/api/v1/redemptions\";\n }\n if (pathname.startsWith(\"/api/cloud/billing/redemptions/\")) {\n return pathname.replace(\n \"/api/cloud/billing/redemptions\",\n \"/api/v1/redemptions\",\n );\n }\n\n if (isAllowedAppMoneyPath(pathname)) {\n return pathname.replace(\"/api/cloud/billing/apps\", \"/api/v1/apps\");\n }\n\n return null;\n}\n\nasync function forwardBillingProxy(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n method: string,\n baseUrl: string,\n headers: Record<string, string>,\n upstreamPath: string,\n search: string,\n): Promise<void> {\n let body: string | undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n body = await readBody(req);\n }\n\n const upstreamResponse = await fetchUpstream(\n `${baseUrl}${upstreamPath}${search}`,\n method,\n headers,\n body,\n );\n const responseData = await readJsonResponse(upstreamResponse);\n mirrorPaymentHeaders(res, upstreamResponse);\n sendJsonWithRetry(res, responseData, upstreamResponse.status);\n}\n\nexport async function handleCloudBillingRoute(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string,\n method: string,\n state: CloudBillingRouteState,\n): Promise<boolean> {\n if (!pathname.startsWith(\"/api/cloud/billing\")) return false;\n\n const apiKey = resolveProxyApiKey(state);\n if (!apiKey) {\n sendJsonError(\n res,\n \"Not connected to Eliza Cloud. Please log in first.\",\n 401,\n );\n return true;\n }\n\n const baseUrl = resolveCloudBaseUrl(state.config);\n const urlError = await validateCloudBaseUrl(baseUrl);\n if (urlError) {\n sendJsonError(res, urlError, 502);\n return true;\n }\n\n const headers = buildAuthHeaders(state.config, apiKey);\n\n const fullUrl = new URL(req.url ?? pathname, \"http://localhost\");\n const proxiedMoneyPath = mapBillingProxyPath(pathname);\n if (proxiedMoneyPath) {\n await forwardBillingProxy(\n req,\n res,\n method,\n baseUrl,\n headers,\n proxiedMoneyPath,\n fullUrl.search,\n );\n return true;\n }\n\n if (pathname === \"/api/cloud/billing/summary\" && method === \"GET\") {\n const { status, payload } = await forwardSummary(baseUrl, headers);\n sendJsonWithRetry(res, payload, status);\n return true;\n }\n\n if (pathname === \"/api/cloud/billing/payment-methods\" && method === \"GET\") {\n const summaryResponse = await fetchUpstream(\n `${baseUrl}/api/v1/credits/summary`,\n \"GET\",\n headers,\n undefined,\n );\n const summaryPayload = await readJsonResponse(summaryResponse);\n sendJsonWithRetry(\n res,\n summaryResponse.ok ? mapPaymentMethods(summaryPayload) : summaryPayload,\n summaryResponse.status,\n );\n return true;\n }\n\n if (pathname === \"/api/cloud/billing/history\" && method === \"GET\") {\n const upstreamUrl = `${baseUrl}/api/credits/transactions${fullUrl.search}`;\n const historyResponse = await fetchUpstream(\n upstreamUrl,\n \"GET\",\n headers,\n undefined,\n );\n const historyPayload = await readJsonResponse(historyResponse);\n sendJsonWithRetry(\n res,\n historyResponse.ok ? mapBillingHistory(historyPayload) : historyPayload,\n historyResponse.status,\n );\n return true;\n }\n\n if (pathname === \"/api/cloud/billing/checkout\" && method === \"POST\") {\n const body = await readBody(req);\n const requestBody = parseJsonBody(body);\n const amountUsd = readNumber(requestBody.amountUsd);\n\n if (!amountUsd || amountUsd <= 0) {\n sendJsonError(res, \"Invalid top-up amount\", 400);\n return true;\n }\n\n const upstreamBody = JSON.stringify({\n credits: amountUsd,\n success_url: buildRedirectUrl(baseUrl, \"/dashboard/billing/success\", {\n from: \"eliza\",\n }),\n cancel_url: buildRedirectUrl(baseUrl, \"/dashboard/settings\", {\n from: \"eliza\",\n tab: \"billing\",\n canceled: \"1\",\n }),\n });\n\n const checkoutResponse = await fetchUpstream(\n `${baseUrl}/api/v1/credits/checkout`,\n \"POST\",\n headers,\n upstreamBody,\n );\n const checkoutPayload = await readJsonResponse(checkoutResponse);\n sendJsonWithRetry(\n res,\n checkoutResponse.ok\n ? mapCheckoutResponse(checkoutPayload)\n : checkoutPayload,\n checkoutResponse.status,\n );\n return true;\n }\n\n if (pathname === \"/api/cloud/billing/crypto/quote\" && method === \"POST\") {\n const body = await readBody(req);\n const requestBody = parseJsonBody(body);\n const amountUsd = readNumber(requestBody.amountUsd);\n\n if (!amountUsd || amountUsd <= 0) {\n sendJsonError(res, \"Invalid top-up amount\", 400);\n return true;\n }\n\n const payCurrency =\n readString(requestBody.currency)?.trim().toUpperCase() ?? \"USDC\";\n const network = normalizeCryptoNetwork(readString(requestBody.network));\n const upstreamBody = JSON.stringify({\n amount: amountUsd,\n payCurrency,\n network,\n });\n\n const cryptoResponse = await fetchUpstream(\n `${baseUrl}/api/crypto/payments`,\n \"POST\",\n headers,\n upstreamBody,\n );\n const cryptoPayload = await readJsonResponse(cryptoResponse);\n sendJsonWithRetry(\n res,\n cryptoResponse.ok\n ? mapCryptoQuoteResponse(cryptoPayload, amountUsd, payCurrency, network)\n : cryptoPayload,\n cryptoResponse.status,\n );\n return true;\n }\n\n if (pathname.startsWith(\"/api/cloud/billing/credits/\")) {\n let body: string | undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n body = await readBody(req);\n }\n\n const upstreamPath = pathname.replace(\n \"/api/cloud/billing/credits\",\n \"/api/v1/credits\",\n );\n const upstreamResponse = await fetchUpstream(\n `${baseUrl}${upstreamPath}${fullUrl.search}`,\n method,\n headers,\n body,\n );\n const responseData = await readJsonResponse(upstreamResponse);\n sendJsonWithRetry(res, responseData, upstreamResponse.status);\n return true;\n }\n\n if (\n pathname.startsWith(\"/api/cloud/billing/crypto/\") &&\n pathname !== \"/api/cloud/billing/crypto/quote\"\n ) {\n let body: string | undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n body = await readBody(req);\n }\n\n const upstreamPath = pathname.replace(\n \"/api/cloud/billing/crypto\",\n \"/api/crypto\",\n );\n const upstreamResponse = await fetchUpstream(\n `${baseUrl}${upstreamPath}${fullUrl.search}`,\n method,\n headers,\n body,\n );\n const responseData = await readJsonResponse(upstreamResponse);\n sendJsonWithRetry(res, responseData, upstreamResponse.status);\n return true;\n }\n\n let body: string | undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n body = await readBody(req);\n }\n\n const billingPath = pathname.replace(\"/api/cloud/billing\", \"/api/v1/billing\");\n const upstreamResponse = await fetchUpstream(\n `${baseUrl}${billingPath}${fullUrl.search}`,\n method,\n headers,\n body,\n );\n const responseData = await readJsonResponse(upstreamResponse);\n sendJsonWithRetry(res, responseData, upstreamResponse.status);\n return true;\n}\n"
|
|
10
11
|
],
|
|
11
|
-
"mappings": "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",
|
|
12
|
-
"debugId": "
|
|
12
|
+
"mappings": "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",
|
|
13
|
+
"debugId": "2B7279AD0FDA269964756E2164756E21",
|
|
13
14
|
"names": []
|
|
14
15
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type http from "node:http";
|
|
2
|
+
export interface CloudCodingContainerRouteState {
|
|
3
|
+
runtime: {
|
|
4
|
+
getService?: (name: string) => unknown;
|
|
5
|
+
} | null;
|
|
6
|
+
}
|
|
7
|
+
export declare function handleCloudCodingContainerRoute(req: http.IncomingMessage, res: http.ServerResponse, pathname: string, method: string, state: CloudCodingContainerRouteState): Promise<boolean>;
|
|
8
|
+
//# sourceMappingURL=cloud-coding-container-routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-coding-container-routes.d.ts","sourceRoot":"","sources":["../../src/routes/cloud-coding-container-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAgBlC,MAAM,WAAW,8BAA8B;IAC7C,OAAO,EAAE;QACP,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;KACxC,GAAG,IAAI,CAAC;CACV;AAeD,wBAAsB,+BAA+B,CACnD,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,8BAA8B,GACpC,OAAO,CAAC,OAAO,CAAC,CAqFlB"}
|
|
@@ -0,0 +1,214 @@
|
|
|
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/lib/http.ts
|
|
20
|
+
function scrubStackFields(value) {
|
|
21
|
+
if (value instanceof Error) {
|
|
22
|
+
return { error: value.message || "Internal error" };
|
|
23
|
+
}
|
|
24
|
+
if (Array.isArray(value)) {
|
|
25
|
+
return value.map(scrubStackFields);
|
|
26
|
+
}
|
|
27
|
+
if (value && typeof value === "object") {
|
|
28
|
+
const out = {};
|
|
29
|
+
for (const [key, nested] of Object.entries(value)) {
|
|
30
|
+
if (key === "stack" || key === "stackTrace")
|
|
31
|
+
continue;
|
|
32
|
+
out[key] = scrubStackFields(nested);
|
|
33
|
+
}
|
|
34
|
+
return out;
|
|
35
|
+
}
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
function sendJson(res, body, status = 200) {
|
|
39
|
+
if (res.headersSent)
|
|
40
|
+
return;
|
|
41
|
+
res.statusCode = status;
|
|
42
|
+
res.setHeader("content-type", "application/json; charset=utf-8");
|
|
43
|
+
res.end(JSON.stringify(scrubStackFields(body)));
|
|
44
|
+
}
|
|
45
|
+
function sendJsonError(res, message, status = 400) {
|
|
46
|
+
sendJson(res, { error: message }, status);
|
|
47
|
+
}
|
|
48
|
+
async function readRequestBody(req, options) {
|
|
49
|
+
const maxBytes = options.maxBytes ?? 1048576;
|
|
50
|
+
const chunks = [];
|
|
51
|
+
let size = 0;
|
|
52
|
+
for await (const chunk of req) {
|
|
53
|
+
const buffer = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
|
|
54
|
+
size += buffer.length;
|
|
55
|
+
if (size > maxBytes) {
|
|
56
|
+
if (options.destroyOnTooLarge)
|
|
57
|
+
req.destroy();
|
|
58
|
+
throw new Error(options.tooLargeMessage ?? "Request body too large");
|
|
59
|
+
}
|
|
60
|
+
chunks.push(buffer);
|
|
61
|
+
}
|
|
62
|
+
if (chunks.length === 0)
|
|
63
|
+
return null;
|
|
64
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
65
|
+
}
|
|
66
|
+
async function readJsonBody(req, res, options = {}) {
|
|
67
|
+
const cached = req.body;
|
|
68
|
+
if (cached !== undefined) {
|
|
69
|
+
if (options.requireObject !== false && (!cached || typeof cached !== "object" || Array.isArray(cached))) {
|
|
70
|
+
sendJsonError(res, "Request body must be a JSON object", 400);
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
return cached;
|
|
74
|
+
}
|
|
75
|
+
let raw;
|
|
76
|
+
try {
|
|
77
|
+
raw = await readRequestBody(req, options);
|
|
78
|
+
} catch (error) {
|
|
79
|
+
sendJsonError(res, error instanceof Error ? error.message : "Failed to read request body", 413);
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
if (!raw?.trim()) {
|
|
83
|
+
const empty = {};
|
|
84
|
+
req.body = empty;
|
|
85
|
+
return empty;
|
|
86
|
+
}
|
|
87
|
+
let parsed;
|
|
88
|
+
try {
|
|
89
|
+
parsed = JSON.parse(raw);
|
|
90
|
+
} catch {
|
|
91
|
+
sendJsonError(res, "Invalid JSON in request body", 400);
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
if (options.requireObject !== false && (!parsed || typeof parsed !== "object" || Array.isArray(parsed))) {
|
|
95
|
+
sendJsonError(res, "Request body must be a JSON object", 400);
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
req.body = parsed;
|
|
99
|
+
return parsed;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// src/routes/cloud-coding-container-routes.ts
|
|
103
|
+
import {
|
|
104
|
+
PromoteVfsToCloudContainerRequestSchema,
|
|
105
|
+
RequestCodingAgentContainerRequestSchema,
|
|
106
|
+
SyncCloudCodingContainerRequestSchema
|
|
107
|
+
} from "@elizaos/shared";
|
|
108
|
+
async function handleCloudCodingContainerRoute(req, res, pathname, method, state) {
|
|
109
|
+
if (method === "POST" && pathname === "/api/cloud/coding-containers/promotions") {
|
|
110
|
+
const service = getCloudContainerService(state);
|
|
111
|
+
if (!service) {
|
|
112
|
+
sendJsonError(res, "Cloud container service is not available", 503);
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
const body = await readJsonBody2(req, res);
|
|
116
|
+
if (!body)
|
|
117
|
+
return true;
|
|
118
|
+
const parsed = PromoteVfsToCloudContainerRequestSchema.safeParse(body);
|
|
119
|
+
if (!parsed.success) {
|
|
120
|
+
sendJsonError(res, parsed.error.issues[0]?.message ?? "Invalid promotion request", 400);
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
await sendServiceResponse(res, () => service.promoteVfsToCloudContainer(parsed.data));
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
if (method === "POST" && pathname === "/api/cloud/coding-containers") {
|
|
127
|
+
const service = getCloudContainerService(state);
|
|
128
|
+
if (!service) {
|
|
129
|
+
sendJsonError(res, "Cloud container service is not available", 503);
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
const body = await readJsonBody2(req, res);
|
|
133
|
+
if (!body)
|
|
134
|
+
return true;
|
|
135
|
+
const parsed = RequestCodingAgentContainerRequestSchema.safeParse(body);
|
|
136
|
+
if (!parsed.success) {
|
|
137
|
+
sendJsonError(res, parsed.error.issues[0]?.message ?? "Invalid coding container request", 400);
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
await sendServiceResponse(res, () => service.requestCodingAgentContainer(parsed.data));
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
const syncMatch = /^\/api\/cloud\/coding-containers\/([^/]+)\/sync$/.exec(pathname);
|
|
144
|
+
if (method === "POST" && syncMatch) {
|
|
145
|
+
const service = getCloudContainerService(state);
|
|
146
|
+
if (!service) {
|
|
147
|
+
sendJsonError(res, "Cloud container service is not available", 503);
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
const containerId = decodeURIComponent(syncMatch[1]);
|
|
151
|
+
const body = await readJsonBody2(req, res);
|
|
152
|
+
if (!body)
|
|
153
|
+
return true;
|
|
154
|
+
const parsed = SyncCloudCodingContainerRequestSchema.safeParse(body);
|
|
155
|
+
if (!parsed.success) {
|
|
156
|
+
sendJsonError(res, parsed.error.issues[0]?.message ?? "Invalid sync request", 400);
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
await sendServiceResponse(res, () => service.syncCodingContainerChanges(containerId, parsed.data));
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
function getCloudContainerService(state) {
|
|
165
|
+
const service = state.runtime?.getService?.("CLOUD_CONTAINER") ?? state.runtime?.getService?.("cloud-container") ?? state.runtime?.getService?.("cloudContainer");
|
|
166
|
+
if (!service || typeof service !== "object")
|
|
167
|
+
return null;
|
|
168
|
+
const candidate = service;
|
|
169
|
+
if (typeof candidate.promoteVfsToCloudContainer === "function" && typeof candidate.requestCodingAgentContainer === "function" && typeof candidate.syncCodingContainerChanges === "function") {
|
|
170
|
+
return candidate;
|
|
171
|
+
}
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
async function readJsonBody2(req, res) {
|
|
175
|
+
const preParsed = req.body;
|
|
176
|
+
if (preParsed && typeof preParsed === "object" && !Array.isArray(preParsed)) {
|
|
177
|
+
return preParsed;
|
|
178
|
+
}
|
|
179
|
+
const chunks = [];
|
|
180
|
+
for await (const chunk of req) {
|
|
181
|
+
chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
|
|
182
|
+
}
|
|
183
|
+
const raw = Buffer.concat(chunks).toString("utf8").trim();
|
|
184
|
+
if (!raw)
|
|
185
|
+
return {};
|
|
186
|
+
let parsed;
|
|
187
|
+
try {
|
|
188
|
+
parsed = JSON.parse(raw);
|
|
189
|
+
} catch {
|
|
190
|
+
sendJsonError(res, "Invalid JSON body", 400);
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
194
|
+
sendJsonError(res, "Invalid JSON body", 400);
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
return parsed;
|
|
198
|
+
}
|
|
199
|
+
async function sendServiceResponse(res, fn) {
|
|
200
|
+
try {
|
|
201
|
+
sendJson(res, await fn());
|
|
202
|
+
} catch (error) {
|
|
203
|
+
const status = typeof error?.statusCode === "number" ? error.statusCode : 500;
|
|
204
|
+
sendJsonError(res, error instanceof Error ? error.message : String(error), status);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
var init_cloud_coding_container_routes = () => {};
|
|
208
|
+
init_cloud_coding_container_routes();
|
|
209
|
+
|
|
210
|
+
export {
|
|
211
|
+
handleCloudCodingContainerRoute
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
//# debugId=A57BC083DCAF0CF764756E2164756E21
|