@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.
Files changed (285) hide show
  1. package/README.md +20 -44
  2. package/auto-enable.ts +10 -5
  3. package/dist/browser/index.browser.js +2 -2
  4. package/dist/browser/index.browser.js.map +4 -4
  5. package/dist/cjs/index.node.cjs +2874 -5915
  6. package/dist/cjs/index.node.js.map +47 -116
  7. package/dist/cloud/auth-service-types.d.ts +8 -0
  8. package/dist/cloud/auth-service-types.d.ts.map +1 -0
  9. package/dist/cloud/auth-service-types.js +36 -0
  10. package/dist/cloud/auth-service-types.js.map +10 -0
  11. package/dist/cloud/auth.js +4 -51
  12. package/dist/cloud/auth.js.map +4 -4
  13. package/dist/cloud/base-url.d.ts +6 -2
  14. package/dist/cloud/base-url.d.ts.map +1 -1
  15. package/dist/cloud/base-url.js +3 -51
  16. package/dist/cloud/base-url.js.map +3 -3
  17. package/dist/cloud/bridge-client.d.ts +3 -3
  18. package/dist/cloud/bridge-client.d.ts.map +1 -1
  19. package/dist/cloud/bridge-client.js +3 -51
  20. package/dist/cloud/bridge-client.js.map +3 -3
  21. package/dist/cloud/clack-observer.d.ts +35 -0
  22. package/dist/cloud/clack-observer.d.ts.map +1 -0
  23. package/dist/cloud/clack-observer.js +143 -0
  24. package/dist/cloud/clack-observer.js.map +10 -0
  25. package/dist/cloud/cloud-manager.js +45 -92
  26. package/dist/cloud/cloud-manager.js.map +6 -6
  27. package/dist/cloud/cloud-wallet.js +2 -4835
  28. package/dist/cloud/cloud-wallet.js.map +3 -82
  29. package/dist/cloud/duffel-client.d.ts +181 -0
  30. package/dist/cloud/duffel-client.d.ts.map +1 -0
  31. package/dist/cloud/duffel-client.js +506 -0
  32. package/dist/cloud/duffel-client.js.map +11 -0
  33. package/dist/cloud/index.d.ts +6 -0
  34. package/dist/cloud/index.d.ts.map +1 -1
  35. package/dist/cloud/index.js +1782 -1
  36. package/dist/cloud/index.js.map +18 -3
  37. package/dist/cloud/lifeops-schedule-sync-client.d.ts +43 -0
  38. package/dist/cloud/lifeops-schedule-sync-client.d.ts.map +1 -0
  39. package/dist/cloud/lifeops-schedule-sync-client.js +180 -0
  40. package/dist/cloud/lifeops-schedule-sync-client.js.map +11 -0
  41. package/dist/cloud/lifeops-schedule-sync-contracts.d.ts +89 -0
  42. package/dist/cloud/lifeops-schedule-sync-contracts.d.ts.map +1 -0
  43. package/dist/cloud/lifeops-schedule-sync-contracts.js +39 -0
  44. package/dist/cloud/lifeops-schedule-sync-contracts.js.map +10 -0
  45. package/dist/cloud/managed-payment-clients.d.ts +166 -0
  46. package/dist/cloud/managed-payment-clients.d.ts.map +1 -0
  47. package/dist/cloud/managed-payment-clients.js +238 -0
  48. package/dist/cloud/managed-payment-clients.js.map +11 -0
  49. package/dist/cloud/null-observer.d.ts +35 -0
  50. package/dist/cloud/null-observer.d.ts.map +1 -0
  51. package/dist/cloud/null-observer.js +45 -0
  52. package/dist/cloud/null-observer.js.map +10 -0
  53. package/dist/cloud/setup-observer.d.ts +98 -0
  54. package/dist/cloud/setup-observer.d.ts.map +1 -0
  55. package/dist/cloud/setup-observer.js +2 -0
  56. package/dist/cloud/setup-observer.js.map +9 -0
  57. package/dist/cloud/validate-url.d.ts.map +1 -1
  58. package/dist/cloud/validate-url.js +2 -1
  59. package/dist/cloud/validate-url.js.map +3 -3
  60. package/dist/cloud/x402-payment-handler.d.ts +85 -0
  61. package/dist/cloud/x402-payment-handler.d.ts.map +1 -0
  62. package/dist/cloud/x402-payment-handler.js +119 -0
  63. package/dist/cloud/x402-payment-handler.js.map +10 -0
  64. package/dist/cloud-setup.d.ts +36 -0
  65. package/dist/cloud-setup.d.ts.map +1 -0
  66. package/dist/{onboarding.js → cloud-setup.js} +139 -139
  67. package/dist/cloud-setup.js.map +14 -0
  68. package/dist/cloud-voice-catalog.d.ts +65 -0
  69. package/dist/cloud-voice-catalog.d.ts.map +1 -0
  70. package/dist/cloud-voice-catalog.js +278 -0
  71. package/dist/cloud-voice-catalog.js.map +12 -0
  72. package/dist/index.browser.d.ts +11 -0
  73. package/dist/index.browser.d.ts.map +1 -1
  74. package/dist/index.d.ts +7 -1
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +5416 -8405
  77. package/dist/index.js.map +48 -116
  78. package/dist/index.node.d.ts +8 -1
  79. package/dist/index.node.d.ts.map +1 -1
  80. package/dist/init.js +17 -4
  81. package/dist/init.js.map +4 -4
  82. package/dist/lib/cloud-connection.d.ts +0 -1
  83. package/dist/lib/cloud-connection.d.ts.map +1 -1
  84. package/dist/lib/cloud-connection.js +14 -91
  85. package/dist/lib/cloud-connection.js.map +7 -7
  86. package/dist/lib/cloud-secrets.d.ts +5 -18
  87. package/dist/lib/cloud-secrets.d.ts.map +1 -1
  88. package/dist/lib/cloud-secrets.js +8 -36
  89. package/dist/lib/cloud-secrets.js.map +3 -3
  90. package/dist/lib/config-like.d.ts +1 -1
  91. package/dist/lib/config-like.d.ts.map +1 -1
  92. package/dist/lib/config-like.js +3 -3
  93. package/dist/lib/config-like.js.map +3 -3
  94. package/dist/lib/credential-type-map.d.ts +1 -1
  95. package/dist/lib/credential-type-map.js.map +1 -1
  96. package/dist/lib/http.d.ts +0 -11
  97. package/dist/lib/http.d.ts.map +1 -1
  98. package/dist/lib/http.js.map +2 -2
  99. package/dist/lib/server-cloud-tts.d.ts +12 -25
  100. package/dist/lib/server-cloud-tts.d.ts.map +1 -1
  101. package/dist/lib/server-cloud-tts.js +31 -329
  102. package/dist/lib/server-cloud-tts.js.map +4 -7
  103. package/dist/lib/tts-debug.d.ts +5 -3
  104. package/dist/lib/tts-debug.d.ts.map +1 -1
  105. package/dist/lib/tts-debug.js +1 -34
  106. package/dist/lib/tts-debug.js.map +3 -4
  107. package/dist/models/embeddings.d.ts.map +1 -1
  108. package/dist/models/embeddings.js +79 -69
  109. package/dist/models/embeddings.js.map +6 -6
  110. package/dist/models/image.d.ts.map +1 -1
  111. package/dist/models/image.js +42 -15
  112. package/dist/models/image.js.map +6 -6
  113. package/dist/models/index.js +676 -166
  114. package/dist/models/index.js.map +11 -12
  115. package/dist/models/research.d.ts.map +1 -1
  116. package/dist/models/research.js +24 -7
  117. package/dist/models/research.js.map +6 -6
  118. package/dist/models/speech.d.ts +61 -3
  119. package/dist/models/speech.d.ts.map +1 -1
  120. package/dist/models/speech.js +173 -17
  121. package/dist/models/speech.js.map +5 -5
  122. package/dist/models/text.d.ts +106 -1
  123. package/dist/models/text.d.ts.map +1 -1
  124. package/dist/models/text.js +452 -82
  125. package/dist/models/text.js.map +7 -8
  126. package/dist/models/tokenization.d.ts.map +1 -1
  127. package/dist/models/tokenization.js.map +2 -2
  128. package/dist/models/transcription.d.ts.map +1 -1
  129. package/dist/models/transcription.js +20 -6
  130. package/dist/models/transcription.js.map +5 -5
  131. package/dist/node/index.node.js +2828 -5838
  132. package/dist/node/index.node.js.map +47 -116
  133. package/dist/plugin.d.ts.map +1 -1
  134. package/dist/plugin.js +376 -5050
  135. package/dist/plugin.js.map +16 -92
  136. package/dist/providers/openai.js +11 -2
  137. package/dist/providers/openai.js.map +3 -3
  138. package/dist/register-routes.js +376 -5050
  139. package/dist/register-routes.js.map +16 -92
  140. package/dist/routes/cloud-billing-routes.d.ts.map +1 -1
  141. package/dist/routes/cloud-billing-routes.js +17 -60
  142. package/dist/routes/cloud-billing-routes.js.map +8 -7
  143. package/dist/routes/cloud-coding-container-routes.d.ts +8 -0
  144. package/dist/routes/cloud-coding-container-routes.d.ts.map +1 -0
  145. package/dist/routes/cloud-coding-container-routes.js +214 -0
  146. package/dist/routes/cloud-coding-container-routes.js.map +11 -0
  147. package/dist/routes/cloud-compat-routes.d.ts.map +1 -1
  148. package/dist/routes/cloud-compat-routes.js +17 -60
  149. package/dist/routes/cloud-compat-routes.js.map +8 -7
  150. package/dist/routes/cloud-features-routes.js +2 -2
  151. package/dist/routes/cloud-features-routes.js.map +4 -4
  152. package/dist/routes/cloud-relay-routes.d.ts +2 -1
  153. package/dist/routes/cloud-relay-routes.d.ts.map +1 -1
  154. package/dist/routes/cloud-relay-routes.js +84 -2
  155. package/dist/routes/cloud-relay-routes.js.map +5 -4
  156. package/dist/routes/cloud-routes-autonomous.d.ts +3 -4
  157. package/dist/routes/cloud-routes-autonomous.d.ts.map +1 -1
  158. package/dist/routes/cloud-routes-autonomous.js +11 -4893
  159. package/dist/routes/cloud-routes-autonomous.js.map +8 -87
  160. package/dist/routes/cloud-routes.d.ts +2 -2
  161. package/dist/routes/cloud-routes.d.ts.map +1 -1
  162. package/dist/routes/cloud-routes.js +343 -5058
  163. package/dist/routes/cloud-routes.js.map +13 -90
  164. package/dist/routes/cloud-status-routes-autonomous.d.ts +1 -2
  165. package/dist/routes/cloud-status-routes-autonomous.d.ts.map +1 -1
  166. package/dist/routes/cloud-status-routes-autonomous.js +4 -51
  167. package/dist/routes/cloud-status-routes-autonomous.js.map +5 -5
  168. package/dist/routes/cloud-status-routes.js +14 -90
  169. package/dist/routes/cloud-status-routes.js.map +7 -7
  170. package/dist/routes/home-remote-runner-access-url.d.ts +16 -0
  171. package/dist/routes/home-remote-runner-access-url.d.ts.map +1 -0
  172. package/dist/routes/home-remote-runner-access-url.js +91 -0
  173. package/dist/routes/home-remote-runner-access-url.js.map +10 -0
  174. package/dist/routes/travel-provider-relay-routes.d.ts +9 -0
  175. package/dist/routes/travel-provider-relay-routes.d.ts.map +1 -0
  176. package/dist/routes/travel-provider-relay-routes.js +358 -0
  177. package/dist/routes/travel-provider-relay-routes.js.map +14 -0
  178. package/dist/services/cloud-auth.d.ts +1 -1
  179. package/dist/services/cloud-auth.d.ts.map +1 -1
  180. package/dist/services/cloud-auth.js +7 -2
  181. package/dist/services/cloud-auth.js.map +4 -4
  182. package/dist/services/cloud-backup.js.map +2 -2
  183. package/dist/services/cloud-bootstrap.d.ts.map +1 -1
  184. package/dist/services/cloud-bootstrap.js.map +2 -2
  185. package/dist/services/cloud-bridge.js.map +3 -3
  186. package/dist/services/cloud-container.d.ts +5 -1
  187. package/dist/services/cloud-container.d.ts.map +1 -1
  188. package/dist/services/cloud-container.js +52 -1
  189. package/dist/services/cloud-container.js.map +4 -4
  190. package/dist/services/cloud-credential-provider.js.map +2 -2
  191. package/dist/services/cloud-model-registry.js.map +2 -2
  192. package/dist/types/cloud.d.ts +1 -0
  193. package/dist/types/cloud.d.ts.map +1 -1
  194. package/dist/types/cloud.js.map +2 -2
  195. package/dist/types/index.d.ts +1 -1
  196. package/dist/types/index.d.ts.map +1 -1
  197. package/dist/utils/cloud-sdk/client.d.ts.map +1 -1
  198. package/dist/utils/cloud-sdk/client.js +136 -4
  199. package/dist/utils/cloud-sdk/client.js.map +5 -5
  200. package/dist/utils/cloud-sdk/http.js.map +1 -1
  201. package/dist/utils/cloud-sdk/public-routes.d.ts +186 -0
  202. package/dist/utils/cloud-sdk/public-routes.d.ts.map +1 -1
  203. package/dist/utils/cloud-sdk/public-routes.js +99 -1
  204. package/dist/utils/cloud-sdk/public-routes.js.map +3 -3
  205. package/dist/utils/cloud-sdk/types.d.ts +0 -2
  206. package/dist/utils/cloud-sdk/types.d.ts.map +1 -1
  207. package/dist/utils/cloud-sdk/types.js.map +1 -1
  208. package/dist/utils/config.d.ts +10 -1
  209. package/dist/utils/config.d.ts.map +1 -1
  210. package/dist/utils/config.js +12 -2
  211. package/dist/utils/config.js.map +3 -3
  212. package/dist/utils/events.d.ts +23 -2
  213. package/dist/utils/events.d.ts.map +1 -1
  214. package/dist/utils/events.js +5 -3
  215. package/dist/utils/events.js.map +3 -3
  216. package/dist/utils/sdk-client.d.ts.map +1 -1
  217. package/dist/utils/sdk-client.js +17 -4
  218. package/dist/utils/sdk-client.js.map +4 -4
  219. package/dist/utils/waifu-metering.d.ts +108 -0
  220. package/dist/utils/waifu-metering.d.ts.map +1 -0
  221. package/dist/utils/waifu-metering.js +166 -0
  222. package/dist/utils/waifu-metering.js.map +10 -0
  223. package/package.json +51 -22
  224. package/src/cloud/auth-service-types.ts +24 -0
  225. package/src/cloud/base-url.ts +6 -62
  226. package/src/cloud/clack-observer.ts +189 -0
  227. package/src/cloud/duffel-client.ts +847 -0
  228. package/src/cloud/index.ts +10 -0
  229. package/src/cloud/lifeops-schedule-sync-client.ts +245 -0
  230. package/src/cloud/lifeops-schedule-sync-contracts.ts +124 -0
  231. package/src/cloud/managed-payment-clients.ts +374 -0
  232. package/src/cloud/null-observer.ts +45 -0
  233. package/src/cloud/setup-observer.ts +125 -0
  234. package/src/cloud/validate-url.ts +7 -1
  235. package/src/cloud/x402-payment-handler.ts +215 -0
  236. package/src/cloud-setup.ts +531 -0
  237. package/src/cloud-voice-catalog.test.ts +254 -0
  238. package/src/cloud-voice-catalog.ts +246 -0
  239. package/src/index.browser.ts +29 -0
  240. package/src/index.node.ts +31 -1
  241. package/src/index.ts +76 -4
  242. package/src/lib/cloud-connection.ts +2 -4
  243. package/src/lib/cloud-secrets.ts +10 -54
  244. package/src/lib/config-like.ts +1 -1
  245. package/src/lib/credential-type-map.ts +2 -2
  246. package/src/lib/http.ts +0 -17
  247. package/src/lib/server-cloud-tts.ts +33 -341
  248. package/src/lib/tts-debug.ts +5 -34
  249. package/src/models/embeddings.ts +140 -76
  250. package/src/models/image.ts +29 -14
  251. package/src/models/research.ts +11 -1
  252. package/src/models/speech.ts +269 -23
  253. package/src/models/text.ts +704 -110
  254. package/src/models/tokenization.ts +2 -2
  255. package/src/models/transcription.ts +7 -3
  256. package/src/plugin.ts +38 -0
  257. package/src/routes/cloud-billing-routes.ts +4 -14
  258. package/src/routes/cloud-coding-container-routes.ts +198 -0
  259. package/src/routes/cloud-compat-routes.ts +4 -14
  260. package/src/routes/cloud-features-routes.ts +1 -1
  261. package/src/routes/cloud-relay-routes.ts +47 -1
  262. package/src/routes/cloud-routes-autonomous.ts +7 -10
  263. package/src/routes/cloud-routes.ts +68 -7
  264. package/src/routes/cloud-status-routes-autonomous.ts +6 -2
  265. package/src/routes/home-remote-runner-access-url.ts +83 -0
  266. package/src/routes/travel-provider-relay-routes.ts +193 -0
  267. package/src/services/cloud-auth.ts +9 -2
  268. package/src/services/cloud-bootstrap.ts +1 -3
  269. package/src/services/cloud-bridge.ts +1 -1
  270. package/src/services/cloud-container.ts +93 -0
  271. package/src/services/cloud-credential-provider.ts +1 -1
  272. package/src/services/cloud-model-registry.ts +1 -1
  273. package/src/types/cloud.ts +22 -0
  274. package/src/types/index.ts +19 -0
  275. package/src/utils/cloud-sdk/client.ts +42 -3
  276. package/src/utils/cloud-sdk/public-routes.ts +168 -0
  277. package/src/utils/cloud-sdk/types.ts +0 -2
  278. package/src/utils/config.ts +20 -1
  279. package/src/utils/events.ts +30 -2
  280. package/src/utils/sdk-client.ts +5 -1
  281. package/src/utils/waifu-metering.ts +302 -0
  282. package/dist/onboarding.d.ts +0 -35
  283. package/dist/onboarding.d.ts.map +0 -1
  284. package/dist/onboarding.js.map +0 -14
  285. package/src/onboarding.ts +0 -396
@@ -0,0 +1,358 @@
1
+ import { createRequire } from "node:module";
2
+ var __defProp = Object.defineProperty;
3
+ var __returnValue = (v) => v;
4
+ function __exportSetter(name, newValue) {
5
+ this[name] = __returnValue.bind(null, newValue);
6
+ }
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, {
10
+ get: all[name],
11
+ enumerable: true,
12
+ configurable: true,
13
+ set: __exportSetter.bind(all, name)
14
+ });
15
+ };
16
+ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
17
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
18
+
19
+ // src/cloud/base-url.ts
20
+ import { normalizeCloudSiteUrl, resolveCloudApiBaseUrl } from "@elizaos/shared";
21
+ var init_base_url = () => {};
22
+
23
+ // src/cloud/validate-url.ts
24
+ import dns from "node:dns";
25
+ import net from "node:net";
26
+ import { promisify } from "node:util";
27
+ function normalizeHostLike(value) {
28
+ return value.trim().toLowerCase().replace(/^\[|\]$/g, "");
29
+ }
30
+ function decodeIpv6MappedHex(mapped) {
31
+ const parts = mapped.split(":");
32
+ if (parts.length < 1 || parts.length > 2)
33
+ return null;
34
+ const parsed = parts.map((part) => {
35
+ if (!/^[0-9a-f]{1,4}$/i.test(part))
36
+ return Number.NaN;
37
+ return Number.parseInt(part, 16);
38
+ });
39
+ if (parsed.some((value) => !Number.isFinite(value)))
40
+ return null;
41
+ const [hi, lo] = parsed.length === 1 ? [0, parsed[0]] : parsed;
42
+ const octets = [hi >> 8, hi & 255, lo >> 8, lo & 255];
43
+ return octets.join(".");
44
+ }
45
+ function canonicalizeIpv6(ip) {
46
+ try {
47
+ return new URL(`http://[${ip}]/`).hostname.replace(/^\[|\]$/g, "");
48
+ } catch {
49
+ return null;
50
+ }
51
+ }
52
+ function normalizeIpForPolicy(ip) {
53
+ const base = normalizeHostLike(ip).split("%")[0];
54
+ if (!base)
55
+ return base;
56
+ let normalized = base;
57
+ if (net.isIP(normalized) === 6) {
58
+ normalized = canonicalizeIpv6(normalized) ?? normalized;
59
+ }
60
+ let mapped = null;
61
+ if (normalized.startsWith("::ffff:")) {
62
+ mapped = normalized.slice("::ffff:".length);
63
+ } else if (normalized.startsWith("0:0:0:0:0:ffff:")) {
64
+ mapped = normalized.slice("0:0:0:0:0:ffff:".length);
65
+ }
66
+ if (!mapped)
67
+ return normalized;
68
+ if (net.isIP(mapped) === 4)
69
+ return mapped;
70
+ return decodeIpv6MappedHex(mapped) ?? normalized;
71
+ }
72
+ function cidrV4(base, prefix) {
73
+ const parsed = parseIpv4ToInt(base);
74
+ if (parsed === null) {
75
+ throw new Error(`Invalid CIDR base IPv4 address: ${base}`);
76
+ }
77
+ const shift = 32 - prefix;
78
+ const mask = shift === 32 ? 0 : 4294967295 << shift >>> 0;
79
+ return { base: parsed & mask, mask };
80
+ }
81
+ function parseIpv4ToInt(ip) {
82
+ const parts = ip.split(".");
83
+ if (parts.length !== 4)
84
+ return null;
85
+ let value = 0;
86
+ for (const part of parts) {
87
+ if (!/^\d{1,3}$/.test(part))
88
+ return null;
89
+ const octet = Number.parseInt(part, 10);
90
+ if (!Number.isInteger(octet) || octet < 0 || octet > 255)
91
+ return null;
92
+ value = value << 8 | octet;
93
+ }
94
+ return value >>> 0;
95
+ }
96
+ function isBlockedIpv4(ip) {
97
+ const asInt = parseIpv4ToInt(ip);
98
+ if (asInt === null)
99
+ return true;
100
+ return BLOCKED_IPV4_CIDRS.some((cidr) => (asInt & cidr.mask) === cidr.base);
101
+ }
102
+ function isBlockedIpv6(ip) {
103
+ const normalized = ip.toLowerCase();
104
+ return normalized === "::" || normalized === "::1" || /^fe[89ab][0-9a-f]:/.test(normalized) || /^f[cd][0-9a-f]{2}:/i.test(normalized) || normalized.startsWith("ff");
105
+ }
106
+ function isBlockedIp(ip) {
107
+ const normalized = normalizeIpForPolicy(ip);
108
+ const family = net.isIP(normalized);
109
+ if (family === 4)
110
+ return isBlockedIpv4(normalized);
111
+ if (family === 6)
112
+ return isBlockedIpv6(normalized);
113
+ return false;
114
+ }
115
+ async function validateCloudBaseUrl(rawUrl) {
116
+ let parsed;
117
+ try {
118
+ parsed = new URL(rawUrl);
119
+ } catch {
120
+ return `Invalid cloud base URL: "${rawUrl}"`;
121
+ }
122
+ if (parsed.protocol !== "https:") {
123
+ return `Cloud base URL must use HTTPS, got "${parsed.protocol}" in "${rawUrl}"`;
124
+ }
125
+ const hostname = normalizeHostLike(parsed.hostname);
126
+ if (!hostname) {
127
+ return `Invalid cloud base URL: "${rawUrl}"`;
128
+ }
129
+ if (hostname === "localhost" || hostname.endsWith(".localhost") || hostname.endsWith(".local")) {
130
+ return `Cloud base URL "${rawUrl}" points to a blocked local hostname.`;
131
+ }
132
+ const elizaDev = process.env.ELIZA_DEV?.trim().toLowerCase();
133
+ if (true) {
134
+ return null;
135
+ }
136
+ if (isBlockedIp(hostname)) {
137
+ return `Cloud base URL "${rawUrl}" points to a blocked address.`;
138
+ }
139
+ try {
140
+ const results = await dnsLookupAll(hostname, { all: true });
141
+ const addresses = Array.isArray(results) ? results : [results];
142
+ for (const entry of addresses) {
143
+ const ip = typeof entry === "string" ? entry : entry.address;
144
+ if (isBlockedIp(ip)) {
145
+ return `Cloud base URL "${rawUrl}" resolves to ${ip}, ` + "which is a blocked internal/metadata address.";
146
+ }
147
+ }
148
+ } catch {
149
+ return `Cloud base URL "${rawUrl}" could not be resolved via DNS.`;
150
+ }
151
+ return null;
152
+ }
153
+ var dnsLookupAll, BLOCKED_IPV4_CIDRS;
154
+ var init_validate_url = __esm(() => {
155
+ dnsLookupAll = promisify(dns.lookup);
156
+ BLOCKED_IPV4_CIDRS = [
157
+ cidrV4("0.0.0.0", 8),
158
+ cidrV4("10.0.0.0", 8),
159
+ cidrV4("172.16.0.0", 12),
160
+ cidrV4("192.168.0.0", 16),
161
+ cidrV4("100.64.0.0", 10),
162
+ cidrV4("127.0.0.0", 8),
163
+ cidrV4("169.254.0.0", 16),
164
+ cidrV4("192.0.0.0", 24),
165
+ cidrV4("198.18.0.0", 15),
166
+ cidrV4("192.0.2.0", 24),
167
+ cidrV4("198.51.100.0", 24),
168
+ cidrV4("203.0.113.0", 24),
169
+ cidrV4("224.0.0.0", 4),
170
+ cidrV4("240.0.0.0", 4)
171
+ ];
172
+ });
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
+
187
+ // src/cloud/cloud-api-key.ts
188
+ function normalizeCloudSecret(value) {
189
+ if (typeof value !== "string")
190
+ return null;
191
+ const trimmed = value.trim();
192
+ return trimmed.length > 0 ? trimmed : null;
193
+ }
194
+ function resolveRuntimeCloudApiKey(runtime) {
195
+ const fromSetting = runtime?.getSetting?.("ELIZAOS_CLOUD_API_KEY");
196
+ if (typeof fromSetting === "string") {
197
+ return normalizeCloudSecret(fromSetting);
198
+ }
199
+ const fromSecrets = runtime?.character?.secrets?.ELIZAOS_CLOUD_API_KEY;
200
+ return typeof fromSecrets === "string" ? normalizeCloudSecret(fromSecrets) : null;
201
+ }
202
+ function resolveCloudApiBaseUrl2(rawBaseUrl) {
203
+ const candidate = normalizeCloudSecret(rawBaseUrl ?? process.env.ELIZAOS_CLOUD_BASE_URL) ?? DEFAULT_CLOUD_API_BASE_URL;
204
+ try {
205
+ const parsed = new URL(candidate);
206
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
207
+ return null;
208
+ }
209
+ parsed.hash = "";
210
+ parsed.search = "";
211
+ const normalizedBase = parsed.toString().replace(/\/+$/, "");
212
+ return normalizedBase.endsWith("/api/v1") ? normalizedBase : `${normalizedBase}/api/v1`;
213
+ } catch {
214
+ return null;
215
+ }
216
+ }
217
+ function resolveCloudApiKey(config, runtime) {
218
+ return normalizeCloudSecret(config?.cloud?.apiKey ?? resolveRuntimeCloudApiKey(runtime) ?? process.env.ELIZAOS_CLOUD_API_KEY);
219
+ }
220
+ var DEFAULT_CLOUD_API_BASE_URL = "https://elizacloud.ai/api/v1";
221
+
222
+ // src/routes/travel-provider-relay-routes.ts
223
+ init_base_url();
224
+ init_validate_url();
225
+ import {
226
+ sendJson,
227
+ sendJsonError
228
+ } from "@elizaos/core";
229
+ var PROXY_TIMEOUT_MS = 30000;
230
+ var MAX_BODY_BYTES = 1048576;
231
+ var TRAVEL_PROVIDER_PATH_RE = /^\/api\/cloud\/travel-providers\/([a-z0-9][a-z0-9-]*)(\/.*)$/;
232
+ function resolveProxyApiKey(state) {
233
+ const cloudAuth = state.runtime?.getService("CLOUD_AUTH");
234
+ const runtimeApiKey = isCloudAuthApiKeyService(cloudAuth) && cloudAuth.isAuthenticated() === true ? normalizeCloudApiKey(cloudAuth.getApiKey?.()) : null;
235
+ return runtimeApiKey ?? resolveCloudApiKey(state.config, state.runtime);
236
+ }
237
+ function buildAuthHeaders(config, apiKey) {
238
+ const serviceKey = config.cloud?.serviceKey?.trim();
239
+ const headers = {
240
+ Accept: "application/json",
241
+ "Content-Type": "application/json",
242
+ Authorization: `Bearer ${apiKey}`
243
+ };
244
+ if (serviceKey)
245
+ headers["X-Service-Key"] = serviceKey;
246
+ return headers;
247
+ }
248
+ function readBody(req) {
249
+ return new Promise((resolve, reject) => {
250
+ const chunks = [];
251
+ let size = 0;
252
+ req.on("data", (chunk) => {
253
+ size += chunk.length;
254
+ if (size > MAX_BODY_BYTES) {
255
+ reject(new Error("Request body too large"));
256
+ return;
257
+ }
258
+ chunks.push(chunk);
259
+ });
260
+ req.on("end", () => resolve(chunks.length > 0 ? Buffer.concat(chunks).toString("utf-8") : undefined));
261
+ req.on("error", reject);
262
+ });
263
+ }
264
+ async function readJsonResponse(response) {
265
+ return response.json().catch(async () => ({
266
+ success: response.ok,
267
+ error: await response.text().catch(() => "Travel-provider relay request failed")
268
+ }));
269
+ }
270
+ function buildUpstreamPath(localPath) {
271
+ const parsed = parseTravelProviderPath(localPath);
272
+ if (!parsed) {
273
+ throw new Error("Invalid travel-provider relay path");
274
+ }
275
+ return `/api/v1/${parsed.provider}${parsed.providerPath}`;
276
+ }
277
+ var TRAVEL_PROVIDER_RELAY_ROUTES = [
278
+ { method: "POST", pattern: /^\/offer-requests$/ },
279
+ { method: "GET", pattern: /^\/offers\/[^/]+$/ },
280
+ { method: "POST", pattern: /^\/orders$/ },
281
+ { method: "GET", pattern: /^\/orders\/[^/]+$/ },
282
+ { method: "POST", pattern: /^\/payments$/ }
283
+ ];
284
+ function parseTravelProviderPath(pathname) {
285
+ const match = TRAVEL_PROVIDER_PATH_RE.exec(pathname);
286
+ if (!match)
287
+ return null;
288
+ const [, provider, providerPath] = match;
289
+ return provider ? { provider, providerPath } : null;
290
+ }
291
+ function matchRoute(method, pathname) {
292
+ const parsed = parseTravelProviderPath(pathname);
293
+ if (!parsed)
294
+ return false;
295
+ return TRAVEL_PROVIDER_RELAY_ROUTES.some((route) => route.method === method && route.pattern.test(parsed.providerPath));
296
+ }
297
+ async function handleTravelProviderRelayRoute(req, res, pathname, method, state) {
298
+ const parsed = parseTravelProviderPath(pathname);
299
+ if (!parsed)
300
+ return false;
301
+ if (!matchRoute(method, pathname)) {
302
+ sendJsonError(res, "Unknown travel-provider relay route", 404);
303
+ return true;
304
+ }
305
+ const apiKey = resolveProxyApiKey(state);
306
+ if (!apiKey) {
307
+ sendJsonError(res, "Not connected to Eliza Cloud. Sign in to use travel search.", 401);
308
+ return true;
309
+ }
310
+ const baseUrl = normalizeCloudSiteUrl(state.config.cloud?.baseUrl);
311
+ const urlError = await validateCloudBaseUrl(baseUrl);
312
+ if (urlError) {
313
+ sendJsonError(res, urlError, 502);
314
+ return true;
315
+ }
316
+ const headers = buildAuthHeaders(state.config, apiKey);
317
+ let body;
318
+ if (method === "POST") {
319
+ try {
320
+ body = await readBody(req);
321
+ } catch (err) {
322
+ const msg = err instanceof Error ? err.message : "Failed to read body";
323
+ sendJsonError(res, msg, 413);
324
+ return true;
325
+ }
326
+ }
327
+ const fullUrl = new URL(req.url ?? pathname, "http://localhost");
328
+ const upstreamUrl = `${baseUrl}${buildUpstreamPath(pathname)}${fullUrl.search}`;
329
+ const upstreamResponse = await fetch(upstreamUrl, {
330
+ method,
331
+ headers,
332
+ body,
333
+ redirect: "manual",
334
+ signal: AbortSignal.timeout(PROXY_TIMEOUT_MS)
335
+ });
336
+ if (upstreamResponse.status === 402) {
337
+ await forward402(res, upstreamResponse);
338
+ return true;
339
+ }
340
+ const payload = await readJsonResponse(upstreamResponse);
341
+ sendJson(res, payload, upstreamResponse.status);
342
+ return true;
343
+ }
344
+ async function forward402(res, upstream) {
345
+ const wwwAuth = upstream.headers.get("www-authenticate");
346
+ const contentType = upstream.headers.get("content-type") ?? "application/json";
347
+ const bodyText = await upstream.text();
348
+ res.statusCode = 402;
349
+ res.setHeader("Content-Type", contentType);
350
+ if (wwwAuth)
351
+ res.setHeader("WWW-Authenticate", wwwAuth);
352
+ res.end(bodyText);
353
+ }
354
+ export {
355
+ handleTravelProviderRelayRoute
356
+ };
357
+
358
+ //# debugId=868735A1EE187E7764756E2164756E21
@@ -0,0 +1,14 @@
1
+ {
2
+ "version": 3,
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/routes/travel-provider-relay-routes.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Cloud site/API URL normalizer. The implementation moved to\n * `@elizaos/shared/elizacloud/base-url` so host-layer packages can normalize\n * URLs without reverse-importing this plugin.\n */\nexport { normalizeCloudSiteUrl, resolveCloudApiBaseUrl } from \"@elizaos/shared\";\n",
6
+ "import dns from \"node:dns\";\nimport net from \"node:net\";\nimport { promisify } from \"node:util\";\n\nconst dnsLookupAll = promisify(dns.lookup);\n\nconst BLOCKED_IPV4_CIDRS: Array<{ base: number; mask: number }> = [\n cidrV4(\"0.0.0.0\", 8),\n cidrV4(\"10.0.0.0\", 8),\n cidrV4(\"172.16.0.0\", 12),\n cidrV4(\"192.168.0.0\", 16),\n cidrV4(\"100.64.0.0\", 10),\n cidrV4(\"127.0.0.0\", 8),\n cidrV4(\"169.254.0.0\", 16),\n cidrV4(\"192.0.0.0\", 24),\n cidrV4(\"198.18.0.0\", 15),\n cidrV4(\"192.0.2.0\", 24),\n cidrV4(\"198.51.100.0\", 24),\n cidrV4(\"203.0.113.0\", 24),\n cidrV4(\"224.0.0.0\", 4),\n cidrV4(\"240.0.0.0\", 4),\n];\n\nfunction normalizeHostLike(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/^\\[|\\]$/g, \"\");\n}\n\nfunction decodeIpv6MappedHex(mapped: string): string | null {\n const parts = mapped.split(\":\");\n if (parts.length < 1 || parts.length > 2) return null;\n\n const parsed = parts.map((part) => {\n if (!/^[0-9a-f]{1,4}$/i.test(part)) return Number.NaN;\n return Number.parseInt(part, 16);\n });\n if (parsed.some((value) => !Number.isFinite(value))) return null;\n\n const [hi, lo] = parsed.length === 1 ? [0, parsed[0]] : parsed;\n const octets = [hi >> 8, hi & 0xff, lo >> 8, lo & 0xff];\n return octets.join(\".\");\n}\n\nfunction canonicalizeIpv6(ip: string): string | null {\n try {\n return new URL(`http://[${ip}]/`).hostname.replace(/^\\[|\\]$/g, \"\");\n } catch {\n return null;\n }\n}\n\nfunction normalizeIpForPolicy(ip: string): string {\n const base = normalizeHostLike(ip).split(\"%\")[0];\n if (!base) return base;\n\n let normalized = base;\n if (net.isIP(normalized) === 6) {\n normalized = canonicalizeIpv6(normalized) ?? normalized;\n }\n\n let mapped: string | null = null;\n if (normalized.startsWith(\"::ffff:\")) {\n mapped = normalized.slice(\"::ffff:\".length);\n } else if (normalized.startsWith(\"0:0:0:0:0:ffff:\")) {\n mapped = normalized.slice(\"0:0:0:0:0:ffff:\".length);\n }\n if (!mapped) return normalized;\n\n if (net.isIP(mapped) === 4) return mapped;\n return decodeIpv6MappedHex(mapped) ?? normalized;\n}\n\nfunction cidrV4(base: string, prefix: number): { base: number; mask: number } {\n const parsed = parseIpv4ToInt(base);\n if (parsed === null) {\n throw new Error(`Invalid CIDR base IPv4 address: ${base}`);\n }\n const shift = 32 - prefix;\n const mask = shift === 32 ? 0 : (0xffffffff << shift) >>> 0;\n return { base: parsed & mask, mask };\n}\n\nfunction parseIpv4ToInt(ip: string): number | null {\n const parts = ip.split(\".\");\n if (parts.length !== 4) return null;\n\n let value = 0;\n for (const part of parts) {\n if (!/^\\d{1,3}$/.test(part)) return null;\n const octet = Number.parseInt(part, 10);\n if (!Number.isInteger(octet) || octet < 0 || octet > 255) return null;\n value = (value << 8) | octet;\n }\n\n return value >>> 0;\n}\n\nfunction isBlockedIpv4(ip: string): boolean {\n const asInt = parseIpv4ToInt(ip);\n if (asInt === null) return true;\n return BLOCKED_IPV4_CIDRS.some((cidr) => (asInt & cidr.mask) === cidr.base);\n}\n\nfunction isBlockedIpv6(ip: string): boolean {\n const normalized = ip.toLowerCase();\n return (\n normalized === \"::\" ||\n normalized === \"::1\" ||\n /^fe[89ab][0-9a-f]:/.test(normalized) ||\n /^f[cd][0-9a-f]{2}:/i.test(normalized) ||\n normalized.startsWith(\"ff\")\n );\n}\n\nfunction isBlockedIp(ip: string): boolean {\n const normalized = normalizeIpForPolicy(ip);\n const family = net.isIP(normalized);\n if (family === 4) return isBlockedIpv4(normalized);\n if (family === 6) return isBlockedIpv6(normalized);\n return false;\n}\n\nexport async function validateCloudBaseUrl(\n rawUrl: string,\n): Promise<string | null> {\n let parsed: URL;\n try {\n parsed = new URL(rawUrl);\n } catch {\n return `Invalid cloud base URL: \"${rawUrl}\"`;\n }\n\n if (parsed.protocol !== \"https:\") {\n return `Cloud base URL must use HTTPS, got \"${parsed.protocol}\" in \"${rawUrl}\"`;\n }\n\n const hostname = normalizeHostLike(parsed.hostname);\n if (!hostname) {\n return `Invalid cloud base URL: \"${rawUrl}\"`;\n }\n\n if (\n hostname === \"localhost\" ||\n hostname.endsWith(\".localhost\") ||\n hostname.endsWith(\".local\")\n ) {\n return `Cloud base URL \"${rawUrl}\" points to a blocked local hostname.`;\n }\n\n // Dev-mode bypass: skip IP-range blocking but keep URL format checks above.\n const elizaDev = process.env.ELIZA_DEV?.trim().toLowerCase();\n if (\n process.env.NODE_ENV === \"development\" ||\n elizaDev === \"1\" ||\n elizaDev === \"true\" ||\n elizaDev === \"yes\"\n ) {\n return null;\n }\n\n if (isBlockedIp(hostname)) {\n return `Cloud base URL \"${rawUrl}\" points to a blocked address.`;\n }\n\n try {\n const results = await dnsLookupAll(hostname, { all: true });\n const addresses = Array.isArray(results) ? results : [results];\n for (const entry of addresses) {\n const ip =\n typeof entry === \"string\"\n ? entry\n : (entry as { address: string }).address;\n if (isBlockedIp(ip)) {\n return (\n `Cloud base URL \"${rawUrl}\" resolves to ${ip}, ` +\n \"which is a blocked internal/metadata address.\"\n );\n }\n }\n } catch {\n return `Cloud base URL \"${rawUrl}\" could not be resolved via DNS.`;\n }\n\n return null;\n}\n",
7
+ "import type { Service } from \"@elizaos/core\";\n\nexport interface CloudAuthApiKeyService {\n isAuthenticated: () => boolean;\n getApiKey?: () => string | undefined;\n}\n\nexport function isCloudAuthApiKeyService(\n value: Service | null | undefined,\n): value is Service & CloudAuthApiKeyService {\n return (\n value !== null &&\n value !== undefined &&\n typeof (value as Partial<CloudAuthApiKeyService>).isAuthenticated ===\n \"function\"\n );\n}\n\nexport function normalizeCloudApiKey(value: string | null | undefined): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n if (!trimmed || trimmed.toUpperCase() === \"[REDACTED]\") return null;\n return trimmed;\n}\n",
8
+ "/**\n * 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",
9
+ "import type http from \"node:http\";\nimport {\n type IAgentRuntime,\n type Service,\n sendJson,\n sendJsonError,\n} from \"@elizaos/core\";\nimport {\n isCloudAuthApiKeyService,\n normalizeCloudApiKey,\n} from \"../cloud/auth-service-types.js\";\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\";\n\nexport interface TravelProviderRelayRouteState {\n config: CloudProxyConfigLike;\n runtime?: IAgentRuntime | null;\n}\n\nconst PROXY_TIMEOUT_MS = 30_000;\nconst MAX_BODY_BYTES = 1_048_576;\nconst TRAVEL_PROVIDER_PATH_RE =\n /^\\/api\\/cloud\\/travel-providers\\/([a-z0-9][a-z0-9-]*)(\\/.*)$/;\n\nfunction resolveProxyApiKey(\n state: TravelProviderRelayRouteState,\n): string | null {\n const cloudAuth = state.runtime?.getService<Service>(\"CLOUD_AUTH\");\n const runtimeApiKey =\n isCloudAuthApiKeyService(cloudAuth) && cloudAuth.isAuthenticated() === true\n ? normalizeCloudApiKey(cloudAuth.getApiKey?.())\n : null;\n return runtimeApiKey ?? resolveCloudApiKey(state.config, state.runtime);\n}\n\nfunction buildAuthHeaders(\n config: CloudProxyConfigLike,\n apiKey: string,\n): Record<string, string> {\n const serviceKey = config.cloud?.serviceKey?.trim();\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n };\n if (serviceKey) headers[\"X-Service-Key\"] = serviceKey;\n return headers;\n}\n\nfunction readBody(req: http.IncomingMessage): Promise<string | undefined> {\n return new Promise<string | undefined>((resolve, reject) => {\n const chunks: Buffer[] = [];\n let size = 0;\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 readJsonResponse(response: Response): Promise<unknown> {\n return response.json().catch(async () => ({\n success: response.ok,\n error: await response\n .text()\n .catch(() => \"Travel-provider relay request failed\"),\n }));\n}\n\nfunction buildUpstreamPath(localPath: string): string {\n const parsed = parseTravelProviderPath(localPath);\n if (!parsed) {\n throw new Error(\"Invalid travel-provider relay path\");\n }\n return `/api/v1/${parsed.provider}${parsed.providerPath}`;\n}\n\nconst TRAVEL_PROVIDER_RELAY_ROUTES: ReadonlyArray<{\n method: \"GET\" | \"POST\";\n pattern: RegExp;\n}> = [\n { method: \"POST\", pattern: /^\\/offer-requests$/ },\n { method: \"GET\", pattern: /^\\/offers\\/[^/]+$/ },\n { method: \"POST\", pattern: /^\\/orders$/ },\n { method: \"GET\", pattern: /^\\/orders\\/[^/]+$/ },\n { method: \"POST\", pattern: /^\\/payments$/ },\n];\n\nfunction parseTravelProviderPath(\n pathname: string,\n): { provider: string; providerPath: string } | null {\n const match = TRAVEL_PROVIDER_PATH_RE.exec(pathname);\n if (!match) return null;\n const [, provider, providerPath] = match;\n return provider ? { provider, providerPath } : null;\n}\n\nfunction matchRoute(method: string, pathname: string): boolean {\n const parsed = parseTravelProviderPath(pathname);\n if (!parsed) return false;\n return TRAVEL_PROVIDER_RELAY_ROUTES.some(\n (route) => route.method === method && route.pattern.test(parsed.providerPath),\n );\n}\n\nexport async function handleTravelProviderRelayRoute(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string,\n method: string,\n state: TravelProviderRelayRouteState,\n): Promise<boolean> {\n const parsed = parseTravelProviderPath(pathname);\n if (!parsed) return false;\n\n if (!matchRoute(method, pathname)) {\n sendJsonError(res, \"Unknown travel-provider relay route\", 404);\n return true;\n }\n\n const apiKey = resolveProxyApiKey(state);\n if (!apiKey) {\n sendJsonError(\n res,\n \"Not connected to Eliza Cloud. Sign in to use travel search.\",\n 401,\n );\n return true;\n }\n\n const baseUrl = normalizeCloudSiteUrl(state.config.cloud?.baseUrl);\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 let body: string | undefined;\n if (method === \"POST\") {\n try {\n body = await readBody(req);\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Failed to read body\";\n sendJsonError(res, msg, 413);\n return true;\n }\n }\n\n const fullUrl = new URL(req.url ?? pathname, \"http://localhost\");\n const upstreamUrl = `${baseUrl}${buildUpstreamPath(pathname)}${fullUrl.search}`;\n const upstreamResponse = await fetch(upstreamUrl, {\n method,\n headers,\n body,\n redirect: \"manual\",\n signal: AbortSignal.timeout(PROXY_TIMEOUT_MS),\n });\n\n if (upstreamResponse.status === 402) {\n await forward402(res, upstreamResponse);\n return true;\n }\n\n const payload = await readJsonResponse(upstreamResponse);\n sendJson(res, payload, upstreamResponse.status);\n return true;\n}\n\nasync function forward402(\n res: http.ServerResponse,\n upstream: Response,\n): Promise<void> {\n const wwwAuth = upstream.headers.get(\"www-authenticate\");\n const contentType = upstream.headers.get(\"content-type\") ?? \"application/json\";\n const bodyText = await upstream.text();\n res.statusCode = 402;\n res.setHeader(\"Content-Type\", contentType);\n if (wwwAuth) res.setHeader(\"WWW-Authenticate\", wwwAuth);\n res.end(bodyText);\n}\n"
10
+ ],
11
+ "mappings": "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",
12
+ "debugId": "868735A1EE187E7764756E2164756E21",
13
+ "names": []
14
+ }
@@ -50,7 +50,7 @@ export interface CloudSsoSession {
50
50
  export interface SsoRedirectArgs {
51
51
  /**
52
52
  * Local URL the user should land on after the SSO round-trip
53
- * (e.g. `/onboarding/setup`). The dashboard's callback route forwards
53
+ * (e.g. `/first-run/setup`). The dashboard's callback route forwards
54
54
  * to this once the session cookie is set; it is NOT sent to the cloud
55
55
  * issuer.
56
56
  */
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-auth.d.ts","sourceRoot":"","sources":["../../src/services/cloud-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAElB,OAAO,EAGR,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,gBAAgB,EAAsC,MAAM,gBAAgB,CAAC;AAE3F,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AA8B/D;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,qBAAqB,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,GAAG,CAAC,EAAE,gBAAgB,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,SAAS,EAAE,qBAAqB,CAAC;IACjC,kEAAkE;IAClE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,qDAAqD;IACrD,GAAG,CAAC,EAAE,gBAAgB,CAAC;IACvB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAUD,UAAU,eAAe;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAgDD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,qBAAqB,EAAE,IAAI,EAAE,eAAe,GAAG,MAAM,CAuBjG;AAqED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAiE7F;AAID,qBAAa,gBAAiB,SAAQ,OAAO;IAC3C,MAAM,CAAC,WAAW,SAAgB;IAClC,qBAAqB,SAA+D;IAEpF,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,WAAW,CAAiC;gBAExC,OAAO,CAAC,EAAE,aAAa;WAKtB,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAMtD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAIb,UAAU;YA+DV,cAAc;IAY5B;;;;;;;;OAQG;IACG,sBAAsB,IAAI,OAAO,CAAC,gBAAgB,CAAC;IA6BzD,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB;IAkBhE,SAAS,IAAI,IAAI;IAKjB,eAAe,IAAI,OAAO;IAG1B,cAAc,IAAI,gBAAgB,GAAG,IAAI;IAGzC,SAAS,IAAI,MAAM,GAAG,SAAS;IAG/B,SAAS,IAAI,cAAc;IAG3B,SAAS,IAAI,MAAM,GAAG,SAAS;IAG/B,iBAAiB,IAAI,MAAM,GAAG,SAAS;CAGxC"}
1
+ {"version":3,"file":"cloud-auth.d.ts","sourceRoot":"","sources":["../../src/services/cloud-auth.ts"],"names":[],"mappings":"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"}
@@ -59,6 +59,7 @@ import {
59
59
  resolveApiSecurityConfig,
60
60
  resolveDesktopApiPort
61
61
  } from "@elizaos/core";
62
+ import { isCloudReachable } from "@elizaos/shared";
62
63
  import { createRemoteJWKSet, jwtVerify } from "jose";
63
64
  async function deriveDeviceId() {
64
65
  const os = await import("node:os");
@@ -283,9 +284,13 @@ class CloudAuthService extends Service {
283
284
  }
284
285
  }
285
286
  async validateApiKey(key) {
287
+ if (!await isCloudReachable()) {
288
+ logger.warn("[CloudAuth] Cloud unreachable at boot — skipping API key validation; key will be used as-is");
289
+ return false;
290
+ }
286
291
  try {
287
292
  const validationClient = new CloudApiClient(this.client.getBaseUrl(), key);
288
- await validationClient.get("/models", { timeoutMs: 1e4 });
293
+ await validationClient.get("/models", { timeoutMs: 2500 });
289
294
  return true;
290
295
  } catch (err) {
291
296
  const msg = err instanceof Error ? err.message : String(err);
@@ -360,4 +365,4 @@ export {
360
365
  CloudAuthService
361
366
  };
362
367
 
363
- //# debugId=500754D72B6C3D2B64756E2164756E21
368
+ //# debugId=C706585F0178D71764756E2164756E21