@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,11 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/lib/http.ts", "../src/routes/cloud-coding-container-routes.ts"],
4
+ "sourcesContent": [
5
+ "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",
6
+ "import type http from \"node:http\";\nimport {\n PromoteVfsToCloudContainerRequestSchema,\n RequestCodingAgentContainerRequestSchema,\n SyncCloudCodingContainerRequestSchema,\n} from \"@elizaos/shared\";\nimport type {\n PromoteVfsToCloudContainerRequest,\n PromoteVfsToCloudContainerResponse,\n RequestCodingAgentContainerRequest,\n RequestCodingAgentContainerResponse,\n SyncCloudCodingContainerRequest,\n SyncCloudCodingContainerResponse,\n} from \"../types/cloud\";\nimport { sendJson, sendJsonError } from \"../lib/http\";\n\nexport interface CloudCodingContainerRouteState {\n runtime: {\n getService?: (name: string) => unknown;\n } | null;\n}\n\ninterface CodingContainerServiceLike {\n promoteVfsToCloudContainer(\n request: PromoteVfsToCloudContainerRequest,\n ): Promise<PromoteVfsToCloudContainerResponse>;\n requestCodingAgentContainer(\n request: RequestCodingAgentContainerRequest,\n ): Promise<RequestCodingAgentContainerResponse>;\n syncCodingContainerChanges(\n containerId: string,\n request: SyncCloudCodingContainerRequest,\n ): Promise<SyncCloudCodingContainerResponse>;\n}\n\nexport async function handleCloudCodingContainerRoute(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string,\n method: string,\n state: CloudCodingContainerRouteState,\n): Promise<boolean> {\n if (\n method === \"POST\" &&\n pathname === \"/api/cloud/coding-containers/promotions\"\n ) {\n const service = getCloudContainerService(state);\n if (!service) {\n sendJsonError(res, \"Cloud container service is not available\", 503);\n return true;\n }\n const body = await readJsonBody(req, res);\n if (!body) return true;\n const parsed = PromoteVfsToCloudContainerRequestSchema.safeParse(body);\n if (!parsed.success) {\n sendJsonError(\n res,\n parsed.error.issues[0]?.message ?? \"Invalid promotion request\",\n 400,\n );\n return true;\n }\n await sendServiceResponse(res, () =>\n service.promoteVfsToCloudContainer(\n parsed.data as PromoteVfsToCloudContainerRequest,\n ),\n );\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/cloud/coding-containers\") {\n const service = getCloudContainerService(state);\n if (!service) {\n sendJsonError(res, \"Cloud container service is not available\", 503);\n return true;\n }\n const body = await readJsonBody(req, res);\n if (!body) return true;\n const parsed = RequestCodingAgentContainerRequestSchema.safeParse(body);\n if (!parsed.success) {\n sendJsonError(\n res,\n parsed.error.issues[0]?.message ?? \"Invalid coding container request\",\n 400,\n );\n return true;\n }\n await sendServiceResponse(res, () =>\n service.requestCodingAgentContainer(\n parsed.data as RequestCodingAgentContainerRequest,\n ),\n );\n return true;\n }\n\n const syncMatch = /^\\/api\\/cloud\\/coding-containers\\/([^/]+)\\/sync$/.exec(\n pathname,\n );\n if (method === \"POST\" && syncMatch) {\n const service = getCloudContainerService(state);\n if (!service) {\n sendJsonError(res, \"Cloud container service is not available\", 503);\n return true;\n }\n const containerId = decodeURIComponent(syncMatch[1]);\n const body = await readJsonBody(req, res);\n if (!body) return true;\n const parsed = SyncCloudCodingContainerRequestSchema.safeParse(body);\n if (!parsed.success) {\n sendJsonError(\n res,\n parsed.error.issues[0]?.message ?? \"Invalid sync request\",\n 400,\n );\n return true;\n }\n await sendServiceResponse(res, () =>\n service.syncCodingContainerChanges(\n containerId,\n parsed.data as SyncCloudCodingContainerRequest,\n ),\n );\n return true;\n }\n\n return false;\n}\n\nfunction getCloudContainerService(\n state: CloudCodingContainerRouteState,\n): CodingContainerServiceLike | null {\n const service =\n state.runtime?.getService?.(\"CLOUD_CONTAINER\") ??\n state.runtime?.getService?.(\"cloud-container\") ??\n state.runtime?.getService?.(\"cloudContainer\");\n if (!service || typeof service !== \"object\") return null;\n const candidate = service as Partial<CodingContainerServiceLike>;\n if (\n typeof candidate.promoteVfsToCloudContainer === \"function\" &&\n typeof candidate.requestCodingAgentContainer === \"function\" &&\n typeof candidate.syncCodingContainerChanges === \"function\"\n ) {\n return candidate as CodingContainerServiceLike;\n }\n return null;\n}\n\nasync function readJsonBody(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n): Promise<Record<string, unknown> | null> {\n const preParsed = (req as http.IncomingMessage & { body?: unknown }).body;\n if (\n preParsed &&\n typeof preParsed === \"object\" &&\n !Array.isArray(preParsed)\n ) {\n return preParsed as Record<string, unknown>;\n }\n\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n }\n const raw = Buffer.concat(chunks).toString(\"utf8\").trim();\n if (!raw) return {};\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw) as unknown;\n } catch {\n sendJsonError(res, \"Invalid JSON body\", 400);\n return null;\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n sendJsonError(res, \"Invalid JSON body\", 400);\n return null;\n }\n return parsed as Record<string, unknown>;\n}\n\nasync function sendServiceResponse(\n res: http.ServerResponse,\n fn: () => Promise<unknown>,\n): Promise<void> {\n try {\n sendJson(res, await fn());\n } catch (error) {\n const status =\n typeof (error as { statusCode?: unknown })?.statusCode === \"number\"\n ? (error as { statusCode: number }).statusCode\n : 500;\n sendJsonError(\n res,\n error instanceof Error ? error.message : String(error),\n status,\n );\n }\n}\n"
7
+ ],
8
+ "mappings": "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",
9
+ "debugId": "A57BC083DCAF0CF764756E2164756E21",
10
+ "names": []
11
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-compat-routes.d.ts","sourceRoot":"","sources":["../../src/routes/cloud-compat-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,eAAe,CAAC;AAK3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CAC/B;AAWD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAExE;AA+LD,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,OAAO,CAAC,CA2FlB"}
1
+ {"version":3,"file":"cloud-compat-routes.d.ts","sourceRoot":"","sources":["../../src/routes/cloud-compat-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,eAAe,CAAC;AAS3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CAC/B;AAMD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAExE;AAsLD,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,OAAO,CAAC,CA2FlB"}
@@ -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
- function isLoopbackHost(hostname) {
21
- const normalized = hostname.toLowerCase();
22
- return normalized === "localhost" || normalized === "::1" || normalized === "0:0:0:0:0:0:0:1" || normalized.startsWith("127.");
23
- }
24
- function trimApiPath(pathname) {
25
- const normalized = pathname.trim().replace(/\/+$/, "");
26
- if (!normalized)
27
- return "";
28
- if (normalized === "/api/v1")
29
- return "";
30
- if (normalized.endsWith("/api/v1")) {
31
- return normalized.slice(0, -"/api/v1".length);
32
- }
33
- return normalized;
34
- }
35
- function normalizeCloudSiteUrl(rawUrl) {
36
- const envOverride = process.env.ELIZAOS_CLOUD_BASE_URL?.trim();
37
- const candidate = envOverride || rawUrl?.trim() || DEFAULT_CLOUD_SITE_URL;
38
- try {
39
- const parsed = new URL(candidate);
40
- const pathname = trimApiPath(parsed.pathname);
41
- const host = parsed.hostname.toLowerCase();
42
- const preserveLocalOrigin = isLoopbackHost(host);
43
- parsed.hash = "";
44
- parsed.search = "";
45
- if (!preserveLocalOrigin) {
46
- parsed.protocol = "https:";
47
- parsed.port = "";
48
- }
49
- parsed.pathname = pathname;
50
- if (LEGACY_CLOUD_HOST_ALIASES.has(host)) {
51
- parsed.hostname = "www.elizacloud.ai";
52
- parsed.pathname = "";
53
- }
54
- return parsed.toString().replace(/\/{1,1024}$/, "");
55
- } catch {
56
- const safeCandidate = candidate.length > 8192 ? candidate.slice(0, 8192) : candidate;
57
- return safeCandidate.replace(/\/{1,1024}$/, "");
58
- }
59
- }
60
- function resolveCloudApiBaseUrl(rawUrl) {
61
- return `${normalizeCloudSiteUrl(rawUrl)}/api/v1`;
62
- }
63
- var DEFAULT_CLOUD_SITE_URL = "https://www.elizacloud.ai", LEGACY_CLOUD_HOST_ALIASES;
64
- var init_base_url = __esm(() => {
65
- LEGACY_CLOUD_HOST_ALIASES = new Set([
66
- "elizacloud.ai",
67
- "www.elizacloud.ai"
68
- ]);
69
- });
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")
@@ -346,15 +312,6 @@ var JSON_CONTENT_TYPE_RE = /\b(?:application\/json|[^;\s]+\+json)\b/i;
346
312
  function resolveCloudBaseUrl(config) {
347
313
  return normalizeCloudSiteUrl(config.cloud?.baseUrl);
348
314
  }
349
- function normalizeCloudApiKey(value) {
350
- if (typeof value !== "string")
351
- return null;
352
- const trimmed = value.trim();
353
- if (!trimmed || trimmed.toUpperCase() === "[REDACTED]") {
354
- return null;
355
- }
356
- return trimmed;
357
- }
358
315
  function resolveProxyApiKey(state) {
359
316
  const cloudAuth = state.runtime ? state.runtime.getService("CLOUD_AUTH") : null;
360
317
  const runtimeApiKey = cloudAuth?.isAuthenticated() === true ? normalizeCloudApiKey(cloudAuth.getApiKey?.()) : null;
@@ -535,4 +492,4 @@ export {
535
492
  handleCloudCompatRoute
536
493
  };
537
494
 
538
- //# debugId=7CCCEE0EFACDF9D964756E2164756E21
495
+ //# debugId=3F00383B2A2A88D364756E2164756E21
@@ -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-compat-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-compat-routes.ts"],
4
4
  "sourcesContent": [
5
- "const DEFAULT_CLOUD_SITE_URL = \"https://www.elizacloud.ai\";\n\nconst LEGACY_CLOUD_HOST_ALIASES = new Set([\n \"elizacloud.ai\",\n \"www.elizacloud.ai\",\n]);\n\nfunction isLoopbackHost(hostname: string): boolean {\n const normalized = hostname.toLowerCase();\n return (\n normalized === \"localhost\" ||\n normalized === \"::1\" ||\n normalized === \"0:0:0:0:0:0:0:1\" ||\n normalized.startsWith(\"127.\")\n );\n}\n\nfunction trimApiPath(pathname: string): string {\n const normalized = pathname.trim().replace(/\\/+$/, \"\");\n if (!normalized) return \"\";\n if (normalized === \"/api/v1\") return \"\";\n if (normalized.endsWith(\"/api/v1\")) {\n return normalized.slice(0, -\"/api/v1\".length);\n }\n return normalized;\n}\n\nexport function normalizeCloudSiteUrl(rawUrl?: string): string {\n // Allow cloud-provisioned containers to override the base URL via env var\n const envOverride = process.env.ELIZAOS_CLOUD_BASE_URL?.trim();\n const candidate = envOverride || rawUrl?.trim() || DEFAULT_CLOUD_SITE_URL;\n\n try {\n const parsed = new URL(candidate);\n const pathname = trimApiPath(parsed.pathname);\n const host = parsed.hostname.toLowerCase();\n const preserveLocalOrigin = isLoopbackHost(host);\n\n parsed.hash = \"\";\n parsed.search = \"\";\n if (!preserveLocalOrigin) {\n parsed.protocol = \"https:\";\n parsed.port = \"\";\n }\n parsed.pathname = pathname;\n\n if (LEGACY_CLOUD_HOST_ALIASES.has(host)) {\n parsed.hostname = \"www.elizacloud.ai\";\n parsed.pathname = \"\";\n }\n\n return parsed.toString().replace(/\\/{1,1024}$/, \"\");\n } catch {\n const safeCandidate =\n candidate.length > 8192 ? candidate.slice(0, 8192) : candidate;\n return safeCandidate.replace(/\\/{1,1024}$/, \"\");\n }\n}\n\nexport function resolveCloudApiBaseUrl(rawUrl?: string): string {\n return `${normalizeCloudSiteUrl(rawUrl)}/api/v1`;\n}\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 if (process.env.NODE_ENV === \"development\" || process.env.ELIZA_DEV) {\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",
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\nexport interface RouteRequestMeta {\n req: http.IncomingMessage;\n res: http.ServerResponse;\n method: string;\n pathname: string;\n}\n\nexport interface RouteHelpers {\n json: (res: http.ServerResponse, data: unknown, status?: number) => void;\n error: (res: http.ServerResponse, message: string, status?: number) => void;\n readJsonBody: <T extends object>(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n options?: ReadJsonBodyOptions,\n ) => Promise<T | null>;\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",
9
- "import type http from \"node:http\";\nimport type { AgentRuntime, Service } from \"@elizaos/core\";\nimport { logger } 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 CloudCompatRouteState {\n config: CloudProxyConfigLike;\n runtime?: AgentRuntime | null;\n}\n\nconst PROXY_TIMEOUT_MS = 15_000;\nconst MAX_BODY_BYTES = 1_048_576;\nconst JSON_CONTENT_TYPE_RE = /\\b(?:application\\/json|[^;\\s]+\\+json)\\b/i;\n\ninterface CloudAuthApiKeyService {\n isAuthenticated: () => boolean;\n getApiKey?: () => string | undefined;\n}\n\nexport function 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: CloudCompatRouteState): 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 \"Content-Type\": \"application/json\",\n Accept: \"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 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 fetchUpstream(\n url: string,\n method: string,\n headers: Record<string, string>,\n body: string | undefined,\n): Promise<Response> {\n const res = await fetch(url, {\n method,\n headers,\n body,\n redirect: \"manual\",\n signal: AbortSignal.timeout(PROXY_TIMEOUT_MS),\n });\n\n if (res.status >= 300 && res.status < 400) {\n throw Object.assign(new Error(\"redirect\"), { code: \"REDIRECT\" });\n }\n\n return res;\n}\n\nfunction summarizeUpstreamBody(bodyText: string): string {\n const trimmed = bodyText.trim();\n if (!trimmed) return \"\";\n return trimmed.length > 300 ? `${trimmed.slice(0, 297)}...` : trimmed;\n}\n\nfunction isResourceCompatPath(pathname: string): boolean {\n return pathname.split(\"/\").filter(Boolean).length >= 5;\n}\n\nfunction sendUpstreamNotFound(\n res: http.ServerResponse,\n pathname: string,\n upstreamBody?: unknown,\n): void {\n if (isResourceCompatPath(pathname)) {\n sendJson(\n res,\n upstreamBody ?? {\n success: false,\n error: \"Eliza Cloud returned 404 for this API route.\",\n code: \"CLOUD_ROUTE_NOT_FOUND\",\n },\n 404,\n );\n return;\n }\n\n sendJson(\n res,\n {\n success: false,\n error: \"This Cloud feature is not available yet.\",\n code: \"CLOUD_NOT_READY\",\n },\n 404,\n );\n}\n\nasync function parseUpstreamJsonResponse(\n upstreamRes: Response,\n method: string,\n): Promise<\n | { kind: \"head\" }\n | { kind: \"empty\" }\n | { kind: \"json\"; body: unknown }\n | { kind: \"invalid-json\"; bodyText: string }\n | { kind: \"non-json\"; bodyText: string }\n> {\n if (method === \"HEAD\") {\n return { kind: \"head\" };\n }\n\n const bodyText = await upstreamRes.text();\n if (bodyText.trim().length === 0) {\n return { kind: \"empty\" };\n }\n\n const contentType = upstreamRes.headers.get(\"content-type\");\n const expectsJson = JSON_CONTENT_TYPE_RE.test(contentType ?? \"\");\n\n if (!expectsJson && !/^\\s*[[{]/.test(bodyText)) {\n return { kind: \"non-json\", bodyText };\n }\n\n try {\n return { kind: \"json\", body: JSON.parse(bodyText) };\n } catch {\n return expectsJson\n ? { kind: \"invalid-json\", bodyText }\n : { kind: \"non-json\", bodyText };\n }\n}\n\nfunction handleUpstreamError(error: unknown, res: http.ServerResponse): void {\n if (error instanceof Error) {\n const errorCode = (error as { code?: string }).code;\n if (errorCode === \"REDIRECT\") {\n sendJsonError(res, \"Eliza Cloud returned an unexpected redirect.\", 502);\n return;\n }\n if (error.name === \"TimeoutError\" || error.name === \"AbortError\") {\n sendJsonError(res, \"Eliza Cloud request timed out.\", 504);\n return;\n }\n if (error.message === \"Request body too large\") {\n sendJsonError(res, error.message, 413);\n return;\n }\n sendJsonError(\n res,\n `Failed to reach Eliza Cloud: ${error.message || \"Unknown error\"}`,\n 502,\n );\n return;\n }\n\n sendJsonError(res, \"Failed to reach Eliza Cloud.\", 502);\n}\n\n/** Paths under /api/cloud/v1/ are forwarded directly as /api/v1/ on the cloud backend. */\nconst CLOUD_V1_PREFIX = \"/api/cloud/v1/\";\n\nexport async function handleCloudCompatRoute(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string,\n method: string,\n state: CloudCompatRouteState,\n): Promise<boolean> {\n const isCompatRoute = pathname.startsWith(\"/api/cloud/compat/\");\n const isV1Route = pathname.startsWith(CLOUD_V1_PREFIX);\n if (!isCompatRoute && !isV1Route) 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 // /api/cloud/compat/* → /api/compat/* (existing mapping)\n // /api/cloud/v1/* → /api/v1/* (eliza v1 endpoints, e.g. pairing-token)\n // Both branches strip the leading `/api/cloud` and re-prefix `/api`. The\n // earlier v1 branch used `.slice(\"/api/cloud\".length)` which left\n // `/v1/...` (no `/api/` prefix), causing upstream to return 405 for\n // valid POSTs to e.g. /api/v1/app/agents/{id}/provision.\n const compatPath = pathname.replace(\"/api/cloud\", \"/api\");\n const fullUrl = req.url ?? pathname;\n const qsIndex = fullUrl.indexOf(\"?\");\n const queryString = qsIndex >= 0 ? fullUrl.slice(qsIndex) : \"\";\n const upstreamUrl = `${baseUrl}${compatPath}${queryString}`;\n const headers = buildAuthHeaders(state.config, apiKey);\n\n try {\n let body: string | undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n body = await readBody(req);\n }\n\n const upstreamRes = await fetchUpstream(upstreamUrl, method, headers, body);\n const parsed = await parseUpstreamJsonResponse(upstreamRes, method);\n\n if (parsed.kind === \"head\") {\n res.statusCode = upstreamRes.status;\n res.end();\n return true;\n }\n\n if (parsed.kind === \"json\") {\n if (upstreamRes.status === 404) {\n sendUpstreamNotFound(res, pathname, parsed.body);\n return true;\n }\n sendJson(res, parsed.body, upstreamRes.status);\n return true;\n }\n\n if (upstreamRes.status === 404) {\n sendUpstreamNotFound(res, pathname);\n return true;\n }\n\n const upstreamStatus = upstreamRes.ok ? 502 : upstreamRes.status;\n if (parsed.kind === \"empty\") {\n const message = upstreamRes.ok\n ? \"Eliza Cloud returned an empty response.\"\n : `Eliza Cloud returned HTTP ${upstreamRes.status} with an empty response body.`;\n sendJsonError(res, message, upstreamStatus);\n return true;\n }\n\n const message =\n parsed.kind === \"invalid-json\"\n ? \"Eliza Cloud returned malformed JSON.\"\n : \"Eliza Cloud returned a non-JSON response.\";\n const detail = summarizeUpstreamBody(parsed.bodyText);\n logger.warn(\n `[cloud-compat] ${message} ${method} ${compatPath} (${upstreamRes.status})${detail ? `: ${detail}` : \"\"}`,\n );\n sendJsonError(\n res,\n detail ? `${message} ${detail}` : message,\n upstreamStatus,\n );\n return true;\n } catch (error) {\n handleUpstreamError(error, res);\n return true;\n }\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 { logger } 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 CloudCompatRouteState {\n config: CloudProxyConfigLike;\n runtime?: AgentRuntime | null;\n}\n\nconst PROXY_TIMEOUT_MS = 15_000;\nconst MAX_BODY_BYTES = 1_048_576;\nconst JSON_CONTENT_TYPE_RE = /\\b(?:application\\/json|[^;\\s]+\\+json)\\b/i;\n\nexport function resolveCloudBaseUrl(config: CloudProxyConfigLike): string {\n return normalizeCloudSiteUrl(config.cloud?.baseUrl);\n}\n\nfunction resolveProxyApiKey(state: CloudCompatRouteState): 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 \"Content-Type\": \"application/json\",\n Accept: \"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 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 fetchUpstream(\n url: string,\n method: string,\n headers: Record<string, string>,\n body: string | undefined,\n): Promise<Response> {\n const res = await fetch(url, {\n method,\n headers,\n body,\n redirect: \"manual\",\n signal: AbortSignal.timeout(PROXY_TIMEOUT_MS),\n });\n\n if (res.status >= 300 && res.status < 400) {\n throw Object.assign(new Error(\"redirect\"), { code: \"REDIRECT\" });\n }\n\n return res;\n}\n\nfunction summarizeUpstreamBody(bodyText: string): string {\n const trimmed = bodyText.trim();\n if (!trimmed) return \"\";\n return trimmed.length > 300 ? `${trimmed.slice(0, 297)}...` : trimmed;\n}\n\nfunction isResourceCompatPath(pathname: string): boolean {\n return pathname.split(\"/\").filter(Boolean).length >= 5;\n}\n\nfunction sendUpstreamNotFound(\n res: http.ServerResponse,\n pathname: string,\n upstreamBody?: unknown,\n): void {\n if (isResourceCompatPath(pathname)) {\n sendJson(\n res,\n upstreamBody ?? {\n success: false,\n error: \"Eliza Cloud returned 404 for this API route.\",\n code: \"CLOUD_ROUTE_NOT_FOUND\",\n },\n 404,\n );\n return;\n }\n\n sendJson(\n res,\n {\n success: false,\n error: \"This Cloud feature is not available yet.\",\n code: \"CLOUD_NOT_READY\",\n },\n 404,\n );\n}\n\nasync function parseUpstreamJsonResponse(\n upstreamRes: Response,\n method: string,\n): Promise<\n | { kind: \"head\" }\n | { kind: \"empty\" }\n | { kind: \"json\"; body: unknown }\n | { kind: \"invalid-json\"; bodyText: string }\n | { kind: \"non-json\"; bodyText: string }\n> {\n if (method === \"HEAD\") {\n return { kind: \"head\" };\n }\n\n const bodyText = await upstreamRes.text();\n if (bodyText.trim().length === 0) {\n return { kind: \"empty\" };\n }\n\n const contentType = upstreamRes.headers.get(\"content-type\");\n const expectsJson = JSON_CONTENT_TYPE_RE.test(contentType ?? \"\");\n\n if (!expectsJson && !/^\\s*[[{]/.test(bodyText)) {\n return { kind: \"non-json\", bodyText };\n }\n\n try {\n return { kind: \"json\", body: JSON.parse(bodyText) };\n } catch {\n return expectsJson\n ? { kind: \"invalid-json\", bodyText }\n : { kind: \"non-json\", bodyText };\n }\n}\n\nfunction handleUpstreamError(error: unknown, res: http.ServerResponse): void {\n if (error instanceof Error) {\n const errorCode = (error as { code?: string }).code;\n if (errorCode === \"REDIRECT\") {\n sendJsonError(res, \"Eliza Cloud returned an unexpected redirect.\", 502);\n return;\n }\n if (error.name === \"TimeoutError\" || error.name === \"AbortError\") {\n sendJsonError(res, \"Eliza Cloud request timed out.\", 504);\n return;\n }\n if (error.message === \"Request body too large\") {\n sendJsonError(res, error.message, 413);\n return;\n }\n sendJsonError(\n res,\n `Failed to reach Eliza Cloud: ${error.message || \"Unknown error\"}`,\n 502,\n );\n return;\n }\n\n sendJsonError(res, \"Failed to reach Eliza Cloud.\", 502);\n}\n\n/** Paths under /api/cloud/v1/ are forwarded directly as /api/v1/ on the cloud backend. */\nconst CLOUD_V1_PREFIX = \"/api/cloud/v1/\";\n\nexport async function handleCloudCompatRoute(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string,\n method: string,\n state: CloudCompatRouteState,\n): Promise<boolean> {\n const isCompatRoute = pathname.startsWith(\"/api/cloud/compat/\");\n const isV1Route = pathname.startsWith(CLOUD_V1_PREFIX);\n if (!isCompatRoute && !isV1Route) 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 // /api/cloud/compat/* → /api/compat/* (existing mapping)\n // /api/cloud/v1/* → /api/v1/* (eliza v1 endpoints, e.g. pairing-token)\n // Both branches strip the leading `/api/cloud` and re-prefix `/api`. The\n // earlier v1 branch used `.slice(\"/api/cloud\".length)` which left\n // `/v1/...` (no `/api/` prefix), causing upstream to return 405 for\n // valid POSTs to e.g. /api/v1/app/agents/{id}/provision.\n const compatPath = pathname.replace(\"/api/cloud\", \"/api\");\n const fullUrl = req.url ?? pathname;\n const qsIndex = fullUrl.indexOf(\"?\");\n const queryString = qsIndex >= 0 ? fullUrl.slice(qsIndex) : \"\";\n const upstreamUrl = `${baseUrl}${compatPath}${queryString}`;\n const headers = buildAuthHeaders(state.config, apiKey);\n\n try {\n let body: string | undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n body = await readBody(req);\n }\n\n const upstreamRes = await fetchUpstream(upstreamUrl, method, headers, body);\n const parsed = await parseUpstreamJsonResponse(upstreamRes, method);\n\n if (parsed.kind === \"head\") {\n res.statusCode = upstreamRes.status;\n res.end();\n return true;\n }\n\n if (parsed.kind === \"json\") {\n if (upstreamRes.status === 404) {\n sendUpstreamNotFound(res, pathname, parsed.body);\n return true;\n }\n sendJson(res, parsed.body, upstreamRes.status);\n return true;\n }\n\n if (upstreamRes.status === 404) {\n sendUpstreamNotFound(res, pathname);\n return true;\n }\n\n const upstreamStatus = upstreamRes.ok ? 502 : upstreamRes.status;\n if (parsed.kind === \"empty\") {\n const message = upstreamRes.ok\n ? \"Eliza Cloud returned an empty response.\"\n : `Eliza Cloud returned HTTP ${upstreamRes.status} with an empty response body.`;\n sendJsonError(res, message, upstreamStatus);\n return true;\n }\n\n const message =\n parsed.kind === \"invalid-json\"\n ? \"Eliza Cloud returned malformed JSON.\"\n : \"Eliza Cloud returned a non-JSON response.\";\n const detail = summarizeUpstreamBody(parsed.bodyText);\n logger.warn(\n `[cloud-compat] ${message} ${method} ${compatPath} (${upstreamRes.status})${detail ? `: ${detail}` : \"\"}`,\n );\n sendJsonError(\n res,\n detail ? `${message} ${detail}` : message,\n upstreamStatus,\n );\n return true;\n } catch (error) {\n handleUpstreamError(error, res);\n return true;\n }\n}\n"
10
11
  ],
11
- "mappings": "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",
12
- "debugId": "7CCCEE0EFACDF9D964756E2164756E21",
12
+ "mappings": "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",
13
+ "debugId": "3F00383B2A2A88D364756E2164756E21",
13
14
  "names": []
14
15
  }
@@ -100,7 +100,7 @@ async function readJsonBody(req, res, options = {}) {
100
100
  }
101
101
 
102
102
  // src/routes/cloud-features-routes.ts
103
- var LIFEOPS_CLOUD_FEATURES_MODULE = "@elizaos/app-lifeops";
103
+ var LIFEOPS_CLOUD_FEATURES_MODULE = "@elizaos/plugin-personal-assistant/routes/cloud-features-routes";
104
104
  async function handleCloudFeaturesRoute(req, res, pathname, method, state) {
105
105
  if (pathname !== "/api/cloud/features" && pathname !== "/api/cloud/features/sync") {
106
106
  return false;
@@ -121,4 +121,4 @@ export {
121
121
  handleCloudFeaturesRoute
122
122
  };
123
123
 
124
- //# debugId=4BEC6681664CAA8664756E2164756E21
124
+ //# debugId=2CE8E9E6DD09850C64756E2164756E21
@@ -2,10 +2,10 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/lib/http.ts", "../src/routes/cloud-features-routes.ts"],
4
4
  "sourcesContent": [
5
- "import type http from \"node:http\";\n\nexport interface ReadJsonBodyOptions {\n maxBytes?: number;\n tooLargeMessage?: string;\n destroyOnTooLarge?: boolean;\n requireObject?: boolean;\n}\n\nexport interface RouteRequestMeta {\n req: http.IncomingMessage;\n res: http.ServerResponse;\n method: string;\n pathname: string;\n}\n\nexport interface RouteHelpers {\n json: (res: http.ServerResponse, data: unknown, status?: number) => void;\n error: (res: http.ServerResponse, message: string, status?: number) => void;\n readJsonBody: <T extends object>(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n options?: ReadJsonBodyOptions,\n ) => Promise<T | null>;\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",
6
- "import type http from \"node:http\";\nimport type { AgentRuntime } from \"@elizaos/core\";\nimport type { CloudProxyConfigLike } from \"../lib/config-like\";\nimport { sendJsonError } from \"../lib/http\";\n\nconst LIFEOPS_CLOUD_FEATURES_MODULE: string =\n \"@elizaos/app-lifeops\";\n\nexport interface CloudFeaturesRouteState {\n config: CloudProxyConfigLike;\n runtime?: AgentRuntime | null;\n}\n\ntype CloudFeaturesRoutesModule = {\n handleCloudFeaturesRoute?: (\n req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string,\n method: string,\n state: CloudFeaturesRouteState,\n ) => Promise<boolean> | boolean;\n};\n\nexport async function handleCloudFeaturesRoute(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string,\n method: string,\n state: CloudFeaturesRouteState,\n): Promise<boolean> {\n if (\n pathname !== \"/api/cloud/features\" &&\n pathname !== \"/api/cloud/features/sync\"\n ) {\n return false;\n }\n\n try {\n const loaded = (await import(\n /* @vite-ignore */ LIFEOPS_CLOUD_FEATURES_MODULE\n )) as CloudFeaturesRoutesModule;\n if (typeof loaded.handleCloudFeaturesRoute !== \"function\") {\n sendJsonError(res, \"LifeOps cloud feature routes are not available\", 503);\n return true;\n }\n return await loaded.handleCloudFeaturesRoute(\n req,\n res,\n pathname,\n method,\n state,\n );\n } catch {\n sendJsonError(res, \"LifeOps cloud feature routes are not available\", 503);\n return true;\n }\n}\n"
5
+ "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",
6
+ "import type http from \"node:http\";\nimport type { AgentRuntime } from \"@elizaos/core\";\nimport type { CloudProxyConfigLike } from \"../lib/config-like\";\nimport { sendJsonError } from \"../lib/http\";\n\nconst LIFEOPS_CLOUD_FEATURES_MODULE: string =\n \"@elizaos/plugin-personal-assistant/routes/cloud-features-routes\";\n\nexport interface CloudFeaturesRouteState {\n config: CloudProxyConfigLike;\n runtime?: AgentRuntime | null;\n}\n\ntype CloudFeaturesRoutesModule = {\n handleCloudFeaturesRoute?: (\n req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string,\n method: string,\n state: CloudFeaturesRouteState,\n ) => Promise<boolean> | boolean;\n};\n\nexport async function handleCloudFeaturesRoute(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string,\n method: string,\n state: CloudFeaturesRouteState,\n): Promise<boolean> {\n if (\n pathname !== \"/api/cloud/features\" &&\n pathname !== \"/api/cloud/features/sync\"\n ) {\n return false;\n }\n\n try {\n const loaded = (await import(\n /* @vite-ignore */ LIFEOPS_CLOUD_FEATURES_MODULE\n )) as CloudFeaturesRoutesModule;\n if (typeof loaded.handleCloudFeaturesRoute !== \"function\") {\n sendJsonError(res, \"LifeOps cloud feature routes are not available\", 503);\n return true;\n }\n return await loaded.handleCloudFeaturesRoute(\n req,\n res,\n pathname,\n method,\n state,\n );\n } catch {\n sendJsonError(res, \"LifeOps cloud feature routes are not available\", 503);\n return true;\n }\n}\n"
7
7
  ],
8
- "mappings": "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",
9
- "debugId": "4BEC6681664CAA8664756E2164756E21",
8
+ "mappings": "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",
9
+ "debugId": "2CE8E9E6DD09850C64756E2164756E21",
10
10
  "names": []
11
11
  }
@@ -12,10 +12,11 @@
12
12
  * it via the runtime.getService interface to avoid a build-time dep.
13
13
  */
14
14
  import type http from "node:http";
15
- import type { RouteHelpers } from "../lib/http";
15
+ import type { RouteHelpers } from "@elizaos/core";
16
16
  export interface CloudRelayRouteState {
17
17
  runtime?: {
18
18
  getService(type: string): unknown;
19
+ getSetting?: (key: string) => string | boolean | number | null;
19
20
  };
20
21
  }
21
22
  export declare function handleCloudRelayRoute(_req: http.IncomingMessage, res: http.ServerResponse, pathname: string, method: string, state: CloudRelayRouteState, helpers: RouteHelpers): Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-relay-routes.d.ts","sourceRoot":"","sources":["../../src/routes/cloud-relay-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAchD,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;KACnC,CAAC;CACH;AAED,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,IAAI,CAAC,eAAe,EAC1B,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,OAAO,CAAC,CA8ClB"}
1
+ {"version":3,"file":"cloud-relay-routes.d.ts","sourceRoot":"","sources":["../../src/routes/cloud-relay-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAkBlD,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAClC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC;KAChE,CAAC;CACH;AAED,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,IAAI,CAAC,eAAe,EAC1B,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,OAAO,CAAC,CA6ElB"}
@@ -16,7 +16,73 @@ var __export = (target, all) => {
16
16
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
17
17
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
18
18
 
19
+ // src/routes/home-remote-runner-access-url.ts
20
+ import { normalizeCloudSiteUrl } from "@elizaos/shared";
21
+ function buildHomeRemoteRunnerAccessUrl(input) {
22
+ const sessionId = input.sessionId?.trim();
23
+ if (!sessionId)
24
+ return null;
25
+ try {
26
+ const url = new URL(normalizeCloudSiteUrl(input.cloudBaseUrl ?? undefined));
27
+ url.pathname = "/dashboard/app";
28
+ url.search = "";
29
+ url.hash = "";
30
+ url.searchParams.set(HOME_REMOTE_RUNNER_ACCESS_SESSION_PARAM, sessionId);
31
+ return url.toString();
32
+ } catch {
33
+ return null;
34
+ }
35
+ }
36
+ function buildHomeRemoteRunnerSshTunnel(input) {
37
+ const sshTarget = normalizeSshTarget(input.sshTarget);
38
+ if (!sshTarget)
39
+ return null;
40
+ let parsed;
41
+ try {
42
+ parsed = new URL(input.remoteBaseUrl?.trim() ?? "");
43
+ } catch {
44
+ return null;
45
+ }
46
+ if (parsed.protocol !== "http:") {
47
+ return null;
48
+ }
49
+ const remotePort = parsed.port || "80";
50
+ const localPort = normalizePort(input.localPort) ?? remotePort;
51
+ const remoteHost = parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1" ? "127.0.0.1" : parsed.hostname;
52
+ const identityArg = input.sshIdentity?.trim() ? ` -i ${quoteShellArg(input.sshIdentity.trim())}` : "";
53
+ const command = `ssh -N${identityArg} -L 127.0.0.1:${localPort}:${remoteHost}:${remotePort} ${sshTarget}`;
54
+ return {
55
+ command,
56
+ localUrl: `${parsed.protocol}//127.0.0.1:${localPort}`
57
+ };
58
+ }
59
+ function normalizePort(value) {
60
+ if (value === null || value === undefined)
61
+ return null;
62
+ const raw = String(value).trim();
63
+ if (!/^\d+$/.test(raw))
64
+ return null;
65
+ const port = Number(raw);
66
+ if (!Number.isInteger(port) || port < 1 || port > 65535)
67
+ return null;
68
+ return String(port);
69
+ }
70
+ function normalizeSshTarget(value) {
71
+ const target = value?.trim();
72
+ if (!target)
73
+ return null;
74
+ if (!/^[A-Za-z0-9._~%+-]+@[A-Za-z0-9.-]+$/.test(target))
75
+ return null;
76
+ return target;
77
+ }
78
+ function quoteShellArg(value) {
79
+ return `'${value.replace(/'/g, "'\\''")}'`;
80
+ }
81
+ var HOME_REMOTE_RUNNER_ACCESS_SESSION_PARAM = "homeRemoteRunnerSession";
82
+ var init_home_remote_runner_access_url = () => {};
83
+
19
84
  // src/routes/cloud-relay-routes.ts
85
+ init_home_remote_runner_access_url();
20
86
  async function handleCloudRelayRoute(_req, res, pathname, method, state, helpers) {
21
87
  if (method !== "GET" || pathname !== "/api/cloud/relay-status") {
22
88
  return false;
@@ -42,7 +108,16 @@ async function handleCloudRelayRoute(_req, res, pathname, method, state, helpers
42
108
  const info = service.getSessionInfo();
43
109
  helpers.json(res, {
44
110
  available: true,
45
- ...info
111
+ ...info,
112
+ accessUrl: buildHomeRemoteRunnerAccessUrl({
113
+ sessionId: info.sessionId
114
+ }),
115
+ ssh: buildHomeRemoteRunnerSshTunnel({
116
+ remoteBaseUrl: readRuntimeSetting(state.runtime, "ELIZA_HOME_REMOTE_RUNNER_URL") ?? process.env.ELIZA_HOME_REMOTE_RUNNER_URL ?? readRuntimeSetting(state.runtime, "ELIZA_HOME_RUNNER_URL") ?? process.env.ELIZA_HOME_RUNNER_URL,
117
+ sshTarget: readRuntimeSetting(state.runtime, "ELIZA_HOME_REMOTE_RUNNER_SSH_TARGET") ?? process.env.ELIZA_HOME_REMOTE_RUNNER_SSH_TARGET ?? readRuntimeSetting(state.runtime, "ELIZA_HOME_SSH_TARGET") ?? process.env.ELIZA_HOME_SSH_TARGET,
118
+ sshIdentity: readRuntimeSetting(state.runtime, "ELIZA_HOME_REMOTE_RUNNER_SSH_IDENTITY") ?? process.env.ELIZA_HOME_REMOTE_RUNNER_SSH_IDENTITY ?? readRuntimeSetting(state.runtime, "ELIZA_HOME_SSH_IDENTITY") ?? process.env.ELIZA_HOME_SSH_IDENTITY,
119
+ localPort: readRuntimeSetting(state.runtime, "ELIZA_HOME_REMOTE_RUNNER_SSH_LOCAL_PORT") ?? process.env.ELIZA_HOME_REMOTE_RUNNER_SSH_LOCAL_PORT
120
+ })
46
121
  });
47
122
  } catch (err) {
48
123
  helpers.json(res, {
@@ -53,8 +128,15 @@ async function handleCloudRelayRoute(_req, res, pathname, method, state, helpers
53
128
  }
54
129
  return true;
55
130
  }
131
+ function readRuntimeSetting(runtime, key) {
132
+ const value = runtime?.getSetting?.(key);
133
+ if (typeof value !== "string")
134
+ return null;
135
+ const trimmed = value.trim();
136
+ return trimmed ? trimmed : null;
137
+ }
56
138
  export {
57
139
  handleCloudRelayRoute
58
140
  };
59
141
 
60
- //# debugId=58E55DD1D02A7A0B64756E2164756E21
142
+ //# debugId=578D35D05AD3F50164756E2164756E21
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/routes/cloud-relay-routes.ts"],
3
+ "sources": ["../src/routes/home-remote-runner-access-url.ts", "../src/routes/cloud-relay-routes.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * Cloud gateway relay status route.\n *\n * Exposes the current state of the CloudManagedGatewayRelayService\n * so the UI can show whether this local instance is registered with\n * Eliza Cloud and actively receiving routed messages.\n *\n * GET /api/cloud/relay-status\n *\n * The relay service lives in plugin-elizacloud and registers itself\n * as a runtime service named \"cloud-managed-gateway-relay\". We query\n * it via the runtime.getService interface to avoid a build-time dep.\n */\n\nimport type http from \"node:http\";\nimport type { RouteHelpers } from \"../lib/http\";\n\ninterface RelayServiceLike {\n getSessionInfo(): {\n sessionId: string | null;\n organizationId: string | null;\n userId: string | null;\n agentName: string | null;\n platform: string | null;\n lastSeenAt: string | null;\n status: \"idle\" | \"registered\" | \"polling\" | \"error\" | \"stopped\";\n };\n}\n\nexport interface CloudRelayRouteState {\n runtime?: {\n getService(type: string): unknown;\n };\n}\n\nexport async function handleCloudRelayRoute(\n _req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string,\n method: string,\n state: CloudRelayRouteState,\n helpers: RouteHelpers,\n): Promise<boolean> {\n if (method !== \"GET\" || pathname !== \"/api/cloud/relay-status\") {\n return false;\n }\n\n if (!state.runtime) {\n helpers.json(res, {\n available: false,\n status: \"no_runtime\",\n reason: \"Runtime not initialized\",\n });\n return true;\n }\n\n // Try known service names used across package boundaries.\n const service = (state.runtime.getService(\"CLOUD_MANAGED_GATEWAY_RELAY\") ??\n state.runtime.getService(\"cloud-managed-gateway-relay\") ??\n state.runtime.getService(\n \"cloudManagedGatewayRelay\",\n )) as RelayServiceLike | null;\n\n if (!service || typeof service.getSessionInfo !== \"function\") {\n helpers.json(res, {\n available: false,\n status: \"not_registered\",\n reason:\n \"Gateway relay service not active. Connect to Eliza Cloud in Settings to enable instance routing.\",\n });\n return true;\n }\n\n try {\n const info = service.getSessionInfo();\n helpers.json(res, {\n available: true,\n ...info,\n });\n } catch (err) {\n helpers.json(res, {\n available: false,\n status: \"error\",\n reason: err instanceof Error ? err.message : String(err),\n });\n }\n\n return true;\n}\n"
5
+ "import { normalizeCloudSiteUrl } from \"@elizaos/shared\";\n\nexport const HOME_REMOTE_RUNNER_ACCESS_SESSION_PARAM = \"homeRemoteRunnerSession\";\n\nexport interface HomeRemoteRunnerSshTunnel {\n command: string;\n localUrl: string;\n}\n\nexport function buildHomeRemoteRunnerAccessUrl(input: {\n cloudBaseUrl?: string | null;\n sessionId?: string | null;\n}): string | null {\n const sessionId = input.sessionId?.trim();\n if (!sessionId) return null;\n\n try {\n const url = new URL(normalizeCloudSiteUrl(input.cloudBaseUrl ?? undefined));\n url.pathname = \"/dashboard/app\";\n url.search = \"\";\n url.hash = \"\";\n url.searchParams.set(HOME_REMOTE_RUNNER_ACCESS_SESSION_PARAM, sessionId);\n return url.toString();\n } catch {\n return null;\n }\n}\n\nexport function buildHomeRemoteRunnerSshTunnel(input: {\n remoteBaseUrl?: string | null;\n sshTarget?: string | null;\n sshIdentity?: string | null;\n localPort?: string | number | null;\n}): HomeRemoteRunnerSshTunnel | null {\n const sshTarget = normalizeSshTarget(input.sshTarget);\n if (!sshTarget) return null;\n\n let parsed: URL;\n try {\n parsed = new URL(input.remoteBaseUrl?.trim() ?? \"\");\n } catch {\n return null;\n }\n\n if (parsed.protocol !== \"http:\") {\n return null;\n }\n\n const remotePort = parsed.port || \"80\";\n const localPort = normalizePort(input.localPort) ?? remotePort;\n const remoteHost =\n parsed.hostname === \"localhost\" || parsed.hostname === \"127.0.0.1\"\n ? \"127.0.0.1\"\n : parsed.hostname;\n const identityArg = input.sshIdentity?.trim()\n ? ` -i ${quoteShellArg(input.sshIdentity.trim())}`\n : \"\";\n const command = `ssh -N${identityArg} -L 127.0.0.1:${localPort}:${remoteHost}:${remotePort} ${sshTarget}`;\n return {\n command,\n localUrl: `${parsed.protocol}//127.0.0.1:${localPort}`,\n };\n}\n\nfunction normalizePort(value: string | number | null | undefined): string | null {\n if (value === null || value === undefined) return null;\n const raw = String(value).trim();\n if (!/^\\d+$/.test(raw)) return null;\n const port = Number(raw);\n if (!Number.isInteger(port) || port < 1 || port > 65535) return null;\n return String(port);\n}\n\nfunction normalizeSshTarget(value: string | null | undefined): string | null {\n const target = value?.trim();\n if (!target) return null;\n if (!/^[A-Za-z0-9._~%+-]+@[A-Za-z0-9.-]+$/.test(target)) return null;\n return target;\n}\n\nfunction quoteShellArg(value: string): string {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n",
6
+ "/**\n * Cloud gateway relay status route.\n *\n * Exposes the current state of the CloudManagedGatewayRelayService\n * so the UI can show whether this local instance is registered with\n * Eliza Cloud and actively receiving routed messages.\n *\n * GET /api/cloud/relay-status\n *\n * The relay service lives in plugin-elizacloud and registers itself\n * as a runtime service named \"cloud-managed-gateway-relay\". We query\n * it via the runtime.getService interface to avoid a build-time dep.\n */\n\nimport type http from \"node:http\";\nimport type { RouteHelpers } from \"@elizaos/core\";\nimport {\n buildHomeRemoteRunnerAccessUrl,\n buildHomeRemoteRunnerSshTunnel,\n} from \"./home-remote-runner-access-url\";\n\ninterface RelayServiceLike {\n getSessionInfo(): {\n sessionId: string | null;\n organizationId: string | null;\n userId: string | null;\n agentName: string | null;\n platform: string | null;\n lastSeenAt: string | null;\n status: \"idle\" | \"registered\" | \"polling\" | \"error\" | \"stopped\";\n };\n}\n\nexport interface CloudRelayRouteState {\n runtime?: {\n getService(type: string): unknown;\n getSetting?: (key: string) => string | boolean | number | null;\n };\n}\n\nexport async function handleCloudRelayRoute(\n _req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string,\n method: string,\n state: CloudRelayRouteState,\n helpers: RouteHelpers,\n): Promise<boolean> {\n if (method !== \"GET\" || pathname !== \"/api/cloud/relay-status\") {\n return false;\n }\n\n if (!state.runtime) {\n helpers.json(res, {\n available: false,\n status: \"no_runtime\",\n reason: \"Runtime not initialized\",\n });\n return true;\n }\n\n // Try known service names used across package boundaries.\n const service = (state.runtime.getService(\"CLOUD_MANAGED_GATEWAY_RELAY\") ??\n state.runtime.getService(\"cloud-managed-gateway-relay\") ??\n state.runtime.getService(\n \"cloudManagedGatewayRelay\",\n )) as RelayServiceLike | null;\n\n if (!service || typeof service.getSessionInfo !== \"function\") {\n helpers.json(res, {\n available: false,\n status: \"not_registered\",\n reason:\n \"Gateway relay service not active. Connect to Eliza Cloud in Settings to enable instance routing.\",\n });\n return true;\n }\n\n try {\n const info = service.getSessionInfo();\n helpers.json(res, {\n available: true,\n ...info,\n accessUrl: buildHomeRemoteRunnerAccessUrl({\n sessionId: info.sessionId,\n }),\n ssh: buildHomeRemoteRunnerSshTunnel({\n remoteBaseUrl:\n readRuntimeSetting(state.runtime, \"ELIZA_HOME_REMOTE_RUNNER_URL\") ??\n process.env.ELIZA_HOME_REMOTE_RUNNER_URL ??\n readRuntimeSetting(state.runtime, \"ELIZA_HOME_RUNNER_URL\") ??\n process.env.ELIZA_HOME_RUNNER_URL,\n sshTarget:\n readRuntimeSetting(\n state.runtime,\n \"ELIZA_HOME_REMOTE_RUNNER_SSH_TARGET\",\n ) ??\n process.env.ELIZA_HOME_REMOTE_RUNNER_SSH_TARGET ??\n readRuntimeSetting(state.runtime, \"ELIZA_HOME_SSH_TARGET\") ??\n process.env.ELIZA_HOME_SSH_TARGET,\n sshIdentity:\n readRuntimeSetting(\n state.runtime,\n \"ELIZA_HOME_REMOTE_RUNNER_SSH_IDENTITY\",\n ) ??\n process.env.ELIZA_HOME_REMOTE_RUNNER_SSH_IDENTITY ??\n readRuntimeSetting(state.runtime, \"ELIZA_HOME_SSH_IDENTITY\") ??\n process.env.ELIZA_HOME_SSH_IDENTITY,\n localPort:\n readRuntimeSetting(\n state.runtime,\n \"ELIZA_HOME_REMOTE_RUNNER_SSH_LOCAL_PORT\",\n ) ?? process.env.ELIZA_HOME_REMOTE_RUNNER_SSH_LOCAL_PORT,\n }),\n });\n } catch (err) {\n helpers.json(res, {\n available: false,\n status: \"error\",\n reason: err instanceof Error ? err.message : String(err),\n });\n }\n\n return true;\n}\n\nfunction readRuntimeSetting(\n runtime: CloudRelayRouteState[\"runtime\"],\n key: string,\n): string | null {\n const value = runtime?.getSetting?.(key);\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n"
6
7
  ],
7
- "mappings": ";;;;;;;;;;;;;;;;;;;AAmCA,eAAsB,qBAAqB,CACzC,MACA,KACA,UACA,QACA,OACA,SACkB;AAAA,EAClB,IAAI,WAAW,SAAS,aAAa,2BAA2B;AAAA,IAC9D,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,CAAC,MAAM,SAAS;AAAA,IAClB,QAAQ,KAAK,KAAK;AAAA,MAChB,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAAA,IACD,OAAO;AAAA,EACT;AAAA,EAGA,MAAM,UAAW,MAAM,QAAQ,WAAW,6BAA6B,KACrE,MAAM,QAAQ,WAAW,6BAA6B,KACtD,MAAM,QAAQ,WACZ,0BACF;AAAA,EAEF,IAAI,CAAC,WAAW,OAAO,QAAQ,mBAAmB,YAAY;AAAA,IAC5D,QAAQ,KAAK,KAAK;AAAA,MAChB,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,QACE;AAAA,IACJ,CAAC;AAAA,IACD,OAAO;AAAA,EACT;AAAA,EAEA,IAAI;AAAA,IACF,MAAM,OAAO,QAAQ,eAAe;AAAA,IACpC,QAAQ,KAAK,KAAK;AAAA,MAChB,WAAW;AAAA,SACR;AAAA,IACL,CAAC;AAAA,IACD,OAAO,KAAK;AAAA,IACZ,QAAQ,KAAK,KAAK;AAAA,MAChB,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IACzD,CAAC;AAAA;AAAA,EAGH,OAAO;AAAA;",
8
- "debugId": "58E55DD1D02A7A0B64756E2164756E21",
8
+ "mappings": "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",
9
+ "debugId": "578D35D05AD3F50164756E2164756E21",
9
10
  "names": []
10
11
  }
@@ -71,10 +71,9 @@ export interface CloudRouteState {
71
71
  saveConfig?: (config: CloudConfigLike) => void;
72
72
  createTelemetrySpan?: CreateTelemetrySpanLike;
73
73
  /**
74
- * Optional runtime restart hook. When Phase 8 lands the cloud-wallet
75
- * provisioning integration, the cloud-login handler will call this to
76
- * rebind plugin-wallet to the cloud provider. Threaded
77
- * from server.ts the same way provider-switch-routes does.
74
+ * Optional runtime restart hook used after cloud-login provisioning to
75
+ * rebind plugin-wallet to the cloud provider. Threaded from server.ts the
76
+ * same way provider-switch-routes does.
78
77
  */
79
78
  restartRuntime?: (reason: string) => Promise<boolean> | boolean;
80
79
  }