@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
@@ -1,35 +1,40 @@
1
1
  /**
2
2
  * Cloud TTS helpers — proxy to Eliza Cloud (`elizacloud.ai`).
3
3
  *
4
- * Upstream routes (see eliza-cloud-v2): `POST /api/v1/voice/tts` and legacy
5
- * `POST /api/elevenlabs/tts`. Both accept `{ text, voiceId?, modelId? }` with
6
- * **ElevenLabs** voice and model ids; the cloud runs ElevenLabs server-side.
4
+ * Pure / config-driven helpers (TTS API key resolution, base URL resolution,
5
+ * voice / model id normalization, compat header mirroring) live in
6
+ * `@elizaos/shared/elizacloud/server-cloud-tts` so host-layer packages can
7
+ * resolve cloud TTS configuration without reverse-importing this plugin.
8
+ *
9
+ * The HTTP request handler (`handleCloudTtsPreviewRoute`) stays here because
10
+ * it wires together the runtime route system.
7
11
  */
8
- import fs from "node:fs";
9
12
  import type http from "node:http";
10
- import { isElizaCloudServiceSelectedInConfig, sanitizeSpeechText } from "@elizaos/core";
11
- import { getCloudSecret } from "./cloud-secrets";
12
- import { resolveConfigPath } from "./state-paths";
13
- import { ttsDebug, ttsDebugTextPreview } from "./tts-debug";
14
-
15
- // ---------------------------------------------------------------------------
16
- // Internal helpers (not exported)
17
- // ---------------------------------------------------------------------------
18
-
19
- type ConfigLike = Record<string, unknown> & {
20
- cloud?: {
21
- apiKey?: unknown;
22
- baseUrl?: unknown;
23
- };
24
- };
25
-
26
- function loadElizaConfig(): ConfigLike {
27
- const raw = fs.readFileSync(resolveConfigPath(), "utf8");
28
- const parsed = JSON.parse(raw) as unknown;
29
- return parsed && typeof parsed === "object" && !Array.isArray(parsed)
30
- ? (parsed as ConfigLike)
31
- : {};
32
- }
13
+ import { sanitizeSpeechText } from "@elizaos/core";
14
+ import {
15
+ _internalResolveCloudApiKey,
16
+ ELIZA_CLOUD_TTS_MAX_TEXT_CHARS,
17
+ resolveCloudProxyTtsModel,
18
+ resolveCloudTtsCandidateUrls,
19
+ resolveElizaCloudTtsVoiceId,
20
+ shouldRetryCloudTtsUpstream,
21
+ ttsDebug,
22
+ ttsDebugTextPreview,
23
+ } from "@elizaos/shared";
24
+
25
+ export {
26
+ __resetCloudBaseUrlCache,
27
+ ELIZA_CLOUD_TTS_MAX_TEXT_CHARS,
28
+ ensureCloudTtsApiKeyAlias,
29
+ mirrorCompatHeaders,
30
+ normalizeElizaCloudTtsModelId,
31
+ resolveCloudProxyTtsModel,
32
+ resolveCloudTtsBaseUrl,
33
+ resolveCloudTtsCandidateUrls,
34
+ resolveElevenLabsApiKeyForCloudMode,
35
+ resolveElizaCloudTtsVoiceId,
36
+ shouldRetryCloudTtsUpstream,
37
+ } from "@elizaos/shared";
33
38
 
34
39
  /** Browser → API correlation (never forwarded to Eliza Cloud). */
35
40
  export function readTtsDebugClientHeaders(
@@ -70,140 +75,6 @@ function ttsClientDbgFields(
70
75
  return o;
71
76
  }
72
77
 
73
- function normalizeSecretEnvValue(value: string | undefined): string | null {
74
- const trimmed = value?.trim();
75
- if (!trimmed) {
76
- return null;
77
- }
78
- if (
79
- trimmed === "REDACTED" ||
80
- trimmed === "[REDACTED]" ||
81
- /^\*+$/.test(trimmed)
82
- ) {
83
- return null;
84
- }
85
- return trimmed;
86
- }
87
-
88
- /** OpenAI-style names — not valid ElevenLabs `voiceId`; map to default voice. */
89
- const OPENAI_STYLE_VOICE_ALIASES = new Set([
90
- "alloy",
91
- "ash",
92
- "ballad",
93
- "coral",
94
- "echo",
95
- "nova",
96
- "sage",
97
- "shimmer",
98
- "verse",
99
- ]);
100
-
101
- /** Eliza Cloud default premade voice (matches eliza-cloud-v2 ElevenLabs service). */
102
- const DEFAULT_ELIZA_CLOUD_TTS_VOICE_ID = "EXAVITQu4vr4xnSDxMaL";
103
- const DEFAULT_ELIZA_CLOUD_TTS_MODEL_ID = "eleven_flash_v2_5";
104
-
105
- /** Matches `MAX_TEXT_LENGTH` in eliza-cloud-v2 `app/api/v1/voice/tts/route.ts`. */
106
- export const ELIZA_CLOUD_TTS_MAX_TEXT_CHARS = 5000;
107
-
108
- /** Edge / Azure neural ids (e.g. `en-US-AriaNeural`) are not ElevenLabs `voiceId`s. */
109
- function isLikelyEdgeOrAzureNeuralVoiceId(raw: string): boolean {
110
- const t = raw.trim();
111
- return /^[a-z]{2}-[A-Z]{2}-/i.test(t) && /Neural$/i.test(t);
112
- }
113
-
114
- function normalizeElizaCloudVoiceId(raw: string): string {
115
- const trimmed = raw.trim();
116
- if (!trimmed) return DEFAULT_ELIZA_CLOUD_TTS_VOICE_ID;
117
- const lower = trimmed.toLowerCase();
118
- if (OPENAI_STYLE_VOICE_ALIASES.has(lower)) {
119
- return DEFAULT_ELIZA_CLOUD_TTS_VOICE_ID;
120
- }
121
- if (isLikelyEdgeOrAzureNeuralVoiceId(trimmed)) {
122
- return DEFAULT_ELIZA_CLOUD_TTS_VOICE_ID;
123
- }
124
- return trimmed;
125
- }
126
-
127
- /**
128
- * Resolve `voiceId` for Eliza Cloud TTS (ElevenLabs ids). OpenAI-style names
129
- * in the request are replaced with the default premade voice.
130
- */
131
- export function resolveElizaCloudTtsVoiceId(
132
- bodyVoiceId: unknown,
133
- env: NodeJS.ProcessEnv = process.env,
134
- ): string {
135
- if (typeof bodyVoiceId === "string" && bodyVoiceId.trim()) {
136
- return normalizeElizaCloudVoiceId(bodyVoiceId);
137
- }
138
- const envVoice = env.ELIZAOS_CLOUD_TTS_VOICE?.trim() ?? "";
139
- if (envVoice) {
140
- return normalizeElizaCloudVoiceId(envVoice);
141
- }
142
- return DEFAULT_ELIZA_CLOUD_TTS_VOICE_ID;
143
- }
144
-
145
- function resolveCloudApiKey(
146
- env: NodeJS.ProcessEnv = process.env,
147
- ): string | null {
148
- const envKey = normalizeSecretEnvValue(env.ELIZAOS_CLOUD_API_KEY);
149
- if (envKey) {
150
- return envKey;
151
- }
152
-
153
- try {
154
- const config = loadElizaConfig();
155
- const configKey = normalizeSecretEnvValue(
156
- typeof config.cloud?.apiKey === "string"
157
- ? config.cloud.apiKey
158
- : undefined,
159
- );
160
- if (configKey) {
161
- return configKey;
162
- }
163
- } catch {
164
- // ignore config load errors and continue with secret store fallback
165
- }
166
-
167
- const sealedKey = normalizeSecretEnvValue(
168
- getCloudSecret("ELIZAOS_CLOUD_API_KEY"),
169
- );
170
- if (sealedKey) {
171
- return sealedKey;
172
- }
173
-
174
- return null;
175
- }
176
-
177
- let cachedCloudBaseUrlFromConfig: string | null | undefined;
178
- let hasResolvedCloudBaseUrlFromConfig = false;
179
-
180
- export function __resetCloudBaseUrlCache(): void {
181
- cachedCloudBaseUrlFromConfig = undefined;
182
- hasResolvedCloudBaseUrlFromConfig = false;
183
- }
184
-
185
- function resolveCloudBaseUrlFromConfig(): string | null {
186
- if (hasResolvedCloudBaseUrlFromConfig) {
187
- return cachedCloudBaseUrlFromConfig ?? null;
188
- }
189
-
190
- try {
191
- const config = loadElizaConfig();
192
- const raw =
193
- typeof config.cloud?.baseUrl === "string"
194
- ? config.cloud.baseUrl.trim()
195
- : "";
196
- cachedCloudBaseUrlFromConfig = raw.length > 0 ? raw : null;
197
- hasResolvedCloudBaseUrlFromConfig = true;
198
- return cachedCloudBaseUrlFromConfig;
199
- } catch {
200
- // On failure, remember that we attempted resolution to avoid repeated I/O.
201
- cachedCloudBaseUrlFromConfig = null;
202
- hasResolvedCloudBaseUrlFromConfig = true;
203
- return null;
204
- }
205
- }
206
-
207
78
  function pickBodyString(
208
79
  body: Record<string, unknown>,
209
80
  camel: string,
@@ -243,14 +114,6 @@ function sendJsonErrorResponse(
243
114
  sendJsonResponse(res, status, { error: message });
244
115
  }
245
116
 
246
- /**
247
- * After a non-OK upstream response, only try the next URL for likely-transient /
248
- * wrong-route issues. Avoid retrying 401/402/429 etc. so we do not double-charge TTS.
249
- */
250
- export function shouldRetryCloudTtsUpstream(status: number): boolean {
251
- return status === 404 || status === 502 || status === 503;
252
- }
253
-
254
117
  function forwardCloudTtsUpstreamError(
255
118
  res: http.ServerResponse,
256
119
  status: number,
@@ -277,151 +140,6 @@ function forwardCloudTtsUpstreamError(
277
140
  );
278
141
  }
279
142
 
280
- /**
281
- * Coerce stored/configured values to an ElevenLabs model id Eliza Cloud accepts.
282
- * Maps OpenAI TTS ids and common copy-paste mistakes; passes through real `eleven_*` ids.
283
- */
284
- export function normalizeElizaCloudTtsModelId(raw: string): string {
285
- const trimmed = raw.trim();
286
- if (!trimmed) return DEFAULT_ELIZA_CLOUD_TTS_MODEL_ID;
287
- const lower = trimmed.toLowerCase();
288
- if (OPENAI_STYLE_VOICE_ALIASES.has(lower)) {
289
- return DEFAULT_ELIZA_CLOUD_TTS_MODEL_ID;
290
- }
291
- if (/^gpt-/i.test(trimmed)) {
292
- return DEFAULT_ELIZA_CLOUD_TTS_MODEL_ID;
293
- }
294
- if (/^tts-1/i.test(trimmed)) {
295
- return DEFAULT_ELIZA_CLOUD_TTS_MODEL_ID;
296
- }
297
- if (/mini-tts/i.test(trimmed)) {
298
- return DEFAULT_ELIZA_CLOUD_TTS_MODEL_ID;
299
- }
300
- return trimmed;
301
- }
302
-
303
- /** Eliza Cloud TTS `modelId` (ElevenLabs), from body or env or default. */
304
- export function resolveCloudProxyTtsModel(
305
- bodyModel: unknown,
306
- env: NodeJS.ProcessEnv = process.env,
307
- ): string {
308
- const envModel = env.ELIZAOS_CLOUD_TTS_MODEL?.trim() ?? "";
309
- const raw =
310
- typeof bodyModel === "string" && bodyModel.trim() ? bodyModel.trim() : "";
311
- const chosen = raw || envModel;
312
- if (!chosen) return DEFAULT_ELIZA_CLOUD_TTS_MODEL_ID;
313
- return normalizeElizaCloudTtsModelId(chosen);
314
- }
315
-
316
- // ---------------------------------------------------------------------------
317
- // Exported Cloud TTS functions
318
- // ---------------------------------------------------------------------------
319
-
320
- export function resolveElevenLabsApiKeyForCloudMode(
321
- env: NodeJS.ProcessEnv = process.env,
322
- ): string | null {
323
- const directKey = normalizeSecretEnvValue(env.ELEVENLABS_API_KEY);
324
- if (directKey) {
325
- return directKey;
326
- }
327
- let configWantsCloudTts = false;
328
- try {
329
- configWantsCloudTts = isElizaCloudServiceSelectedInConfig(
330
- loadElizaConfig() as Record<string, unknown>,
331
- "tts",
332
- );
333
- } catch {
334
- configWantsCloudTts = false;
335
- }
336
- const cloudTtsEnabled =
337
- env.ELIZAOS_CLOUD_USE_TTS === "true" ||
338
- (env.ELIZAOS_CLOUD_USE_TTS === undefined && configWantsCloudTts);
339
- if (!cloudTtsEnabled) {
340
- return null;
341
- }
342
- if (env.ELIZA_CLOUD_TTS_DISABLED === "true") {
343
- return null;
344
- }
345
- return resolveCloudApiKey(env);
346
- }
347
-
348
- export function ensureCloudTtsApiKeyAlias(
349
- env: NodeJS.ProcessEnv = process.env,
350
- ): boolean {
351
- const directKey = normalizeSecretEnvValue(env.ELEVENLABS_API_KEY);
352
- if (directKey) {
353
- return false;
354
- }
355
- const cloudBackedKey = resolveElevenLabsApiKeyForCloudMode(env);
356
- if (!cloudBackedKey) {
357
- return false;
358
- }
359
- env.ELEVENLABS_API_KEY = cloudBackedKey;
360
- return true;
361
- }
362
-
363
- export function resolveCloudTtsBaseUrl(
364
- env: NodeJS.ProcessEnv = process.env,
365
- ): string {
366
- const fromEnv = env.ELIZAOS_CLOUD_BASE_URL?.trim() ?? "";
367
- const fromConfig =
368
- fromEnv.length > 0 ? null : resolveCloudBaseUrlFromConfig();
369
- const configured = fromEnv.length > 0 ? fromEnv : (fromConfig?.trim() ?? "");
370
- const fallback = "https://www.elizacloud.ai/api/v1";
371
- const base = configured.length > 0 ? configured : fallback;
372
-
373
- try {
374
- const parsed = new URL(base);
375
- let path = parsed.pathname.replace(/\/+$/, "");
376
- if (!path || path === "/") {
377
- path = "/api/v1";
378
- }
379
- parsed.pathname = path;
380
- return parsed.toString().replace(/\/$/, "");
381
- } catch {
382
- return fallback;
383
- }
384
- }
385
-
386
- export function resolveCloudTtsCandidateUrls(
387
- env: NodeJS.ProcessEnv = process.env,
388
- ): string[] {
389
- const base = resolveCloudTtsBaseUrl(env).replace(/\/+$/, "");
390
- const candidates = new Set<string>();
391
-
392
- const addEndpointsForApiV1Base = (baseUrl: string): void => {
393
- const trimmed = baseUrl.replace(/\/+$/, "");
394
- candidates.add(`${trimmed}/voice/tts`);
395
- try {
396
- const u = new URL(trimmed);
397
- const path = u.pathname.replace(/\/+$/, "");
398
- if (path.endsWith("/api/v1")) {
399
- // Preserve the ElevenLabs-shaped compat route; `/audio/speech` would
400
- // require OpenAI-style model/voice ids and is intentionally not used.
401
- candidates.add(`${u.origin}/api/elevenlabs/tts`);
402
- }
403
- } catch {
404
- /* ignore */
405
- }
406
- };
407
-
408
- addEndpointsForApiV1Base(base);
409
- try {
410
- const parsed = new URL(base);
411
- if (parsed.hostname.startsWith("www.")) {
412
- parsed.hostname = parsed.hostname.slice(4);
413
- addEndpointsForApiV1Base(parsed.toString().replace(/\/$/, ""));
414
- } else {
415
- parsed.hostname = `www.${parsed.hostname}`;
416
- addEndpointsForApiV1Base(parsed.toString().replace(/\/$/, ""));
417
- }
418
- } catch {
419
- // no-op
420
- }
421
-
422
- return [...candidates];
423
- }
424
-
425
143
  export async function handleCloudTtsPreviewRoute(
426
144
  req: http.IncomingMessage,
427
145
  res: http.ServerResponse,
@@ -429,7 +147,7 @@ export async function handleCloudTtsPreviewRoute(
429
147
  const clientTtsDbg = readTtsDebugClientHeaders(req);
430
148
  const dbgExtra = ttsClientDbgFields(clientTtsDbg);
431
149
 
432
- const cloudApiKey = resolveCloudApiKey();
150
+ const cloudApiKey = _internalResolveCloudApiKey();
433
151
  if (!cloudApiKey) {
434
152
  ttsDebug("server:cloud-tts:reject", {
435
153
  reason: "no_api_key",
@@ -581,29 +299,3 @@ export async function handleCloudTtsPreviewRoute(
581
299
  return true;
582
300
  }
583
301
  }
584
-
585
- export function mirrorCompatHeaders(
586
- req: Pick<http.IncomingMessage, "headers">,
587
- ): void {
588
- const HEADER_ALIASES = [
589
- ["x-elizaos-token", "x-eliza-token"],
590
- ["x-elizaos-export-token", "x-eliza-export-token"],
591
- ["x-elizaos-client-id", "x-eliza-client-id"],
592
- ["x-elizaos-terminal-token", "x-eliza-terminal-token"],
593
- ["x-elizaos-ui-language", "x-eliza-ui-language"],
594
- ["x-elizaos-agent-action", "x-eliza-agent-action"],
595
- ] as const;
596
-
597
- for (const [appHeader, elizaHeader] of HEADER_ALIASES) {
598
- const appValue = req.headers[appHeader];
599
- const elizaValue = req.headers[elizaHeader];
600
-
601
- if (appValue != null && elizaValue == null) {
602
- req.headers[elizaHeader] = appValue;
603
- }
604
-
605
- if (elizaValue != null && appValue == null) {
606
- req.headers[appHeader] = elizaValue;
607
- }
608
- }
609
- }
@@ -1,34 +1,5 @@
1
- function truthy(raw: string | undefined | null): boolean {
2
- if (raw == null) return false;
3
- const value = String(raw).trim().toLowerCase();
4
- return value === "1" || value === "true" || value === "yes" || value === "on";
5
- }
6
-
7
- function ttsDebugEnabled(): boolean {
8
- if (typeof process !== "undefined" && process.env) {
9
- if (truthy(process.env.ELIZA_TTS_DEBUG)) return true;
10
- }
11
- return false;
12
- }
13
-
14
- export function isTtsDebugEnabled(): boolean {
15
- return ttsDebugEnabled();
16
- }
17
-
18
- export function ttsDebugTextPreview(text: string, maxChars = 160): string {
19
- const singleLine = text.replace(/\r?\n/g, "↵ ").replace(/\s+/g, " ").trim();
20
- if (singleLine.length <= maxChars) return singleLine;
21
- return `${singleLine.slice(0, maxChars)}…`;
22
- }
23
-
24
- export function ttsDebug(
25
- phase: string,
26
- detail?: Record<string, unknown>,
27
- ): void {
28
- if (!ttsDebugEnabled()) return;
29
- if (detail && Object.keys(detail).length > 0) {
30
- console.info(`[eliza][tts] ${phase}`, detail);
31
- } else {
32
- console.info(`[eliza][tts] ${phase}`);
33
- }
34
- }
1
+ /**
2
+ * TTS debug logging. Implementation moved to
3
+ * `@elizaos/shared/elizacloud/tts-debug`.
4
+ */
5
+ export { isTtsDebugEnabled, ttsDebug, ttsDebugTextPreview } from "@elizaos/shared";