@elizaos/plugin-elizacloud 2.0.0-alpha.7 → 2.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +220 -0
  3. package/auto-enable.ts +17 -0
  4. package/dist/browser/index.browser.js +2 -21
  5. package/dist/browser/index.browser.js.map +5 -37
  6. package/dist/cjs/index.d.ts +2 -2
  7. package/dist/cjs/index.node.cjs +12173 -2271
  8. package/dist/cjs/index.node.js.map +135 -27
  9. package/dist/cloud/auth.d.ts +19 -0
  10. package/dist/cloud/auth.d.ts.map +1 -0
  11. package/dist/cloud/auth.js +330 -0
  12. package/dist/cloud/auth.js.map +12 -0
  13. package/dist/cloud/backup.d.ts +18 -0
  14. package/dist/cloud/backup.d.ts.map +1 -0
  15. package/dist/cloud/backup.js +63 -0
  16. package/dist/cloud/backup.js.map +10 -0
  17. package/dist/cloud/base-url.d.ts +3 -0
  18. package/dist/cloud/base-url.d.ts.map +1 -0
  19. package/dist/cloud/base-url.js +77 -0
  20. package/dist/cloud/base-url.js.map +10 -0
  21. package/dist/cloud/bridge-client.d.ts +126 -0
  22. package/dist/cloud/bridge-client.d.ts.map +1 -0
  23. package/dist/cloud/bridge-client.js +432 -0
  24. package/dist/cloud/bridge-client.js.map +11 -0
  25. package/dist/cloud/cloud-api-key.d.ts +26 -0
  26. package/dist/cloud/cloud-api-key.d.ts.map +1 -0
  27. package/dist/cloud/cloud-api-key.js +60 -0
  28. package/dist/cloud/cloud-api-key.js.map +10 -0
  29. package/dist/cloud/cloud-manager.d.ts +33 -0
  30. package/dist/cloud/cloud-manager.d.ts.map +1 -0
  31. package/dist/cloud/cloud-manager.js +853 -0
  32. package/dist/cloud/cloud-manager.js.map +16 -0
  33. package/dist/cloud/cloud-proxy.d.ts +20 -0
  34. package/dist/cloud/cloud-proxy.d.ts.map +1 -0
  35. package/dist/cloud/cloud-proxy.js +54 -0
  36. package/dist/cloud/cloud-proxy.js.map +10 -0
  37. package/dist/cloud/cloud-wallet.d.ts +94 -0
  38. package/dist/cloud/cloud-wallet.d.ts.map +1 -0
  39. package/dist/cloud/cloud-wallet.js +5195 -0
  40. package/dist/cloud/cloud-wallet.js.map +92 -0
  41. package/dist/cloud/index.d.ts +9 -0
  42. package/dist/cloud/index.d.ts.map +1 -0
  43. package/dist/cloud/index.js +30 -0
  44. package/dist/cloud/index.js.map +9 -0
  45. package/dist/cloud/reconnect.d.ts +26 -0
  46. package/dist/cloud/reconnect.d.ts.map +1 -0
  47. package/dist/cloud/reconnect.js +104 -0
  48. package/dist/cloud/reconnect.js.map +10 -0
  49. package/dist/cloud/validate-url.d.ts +2 -0
  50. package/dist/cloud/validate-url.d.ts.map +1 -0
  51. package/dist/cloud/validate-url.js +174 -0
  52. package/dist/cloud/validate-url.js.map +10 -0
  53. package/dist/cloud-providers/cloud-status.d.ts.map +1 -1
  54. package/dist/cloud-providers/cloud-status.js +78 -0
  55. package/dist/cloud-providers/cloud-status.js.map +10 -0
  56. package/dist/cloud-providers/container-health.d.ts.map +1 -1
  57. package/dist/cloud-providers/container-health.js +74 -0
  58. package/dist/cloud-providers/container-health.js.map +10 -0
  59. package/dist/cloud-providers/credit-balance.d.ts.map +1 -1
  60. package/dist/cloud-providers/credit-balance.js +85 -0
  61. package/dist/cloud-providers/credit-balance.js.map +10 -0
  62. package/dist/cloud-providers/index.d.ts.map +1 -1
  63. package/dist/cloud-providers/index.js +24 -0
  64. package/dist/cloud-providers/index.js.map +9 -0
  65. package/dist/cloud-providers/model-registry.d.ts.map +1 -1
  66. package/dist/cloud-providers/model-registry.js +71 -0
  67. package/dist/cloud-providers/model-registry.js.map +10 -0
  68. package/dist/index.browser.d.ts +4 -2
  69. package/dist/index.browser.d.ts.map +1 -1
  70. package/dist/index.d.ts +18 -0
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +12851 -0
  73. package/dist/index.js.map +145 -0
  74. package/dist/index.node.d.ts +15 -2
  75. package/dist/index.node.d.ts.map +1 -1
  76. package/dist/init.d.ts.map +1 -1
  77. package/dist/init.js +169 -0
  78. package/dist/init.js.map +12 -0
  79. package/dist/lib/cloud-connection.d.ts +78 -0
  80. package/dist/lib/cloud-connection.d.ts.map +1 -0
  81. package/dist/lib/cloud-connection.js +731 -0
  82. package/dist/lib/cloud-connection.js.map +14 -0
  83. package/dist/lib/cloud-secrets.d.ts +23 -0
  84. package/dist/lib/cloud-secrets.d.ts.map +1 -0
  85. package/dist/lib/cloud-secrets.js +64 -0
  86. package/dist/lib/cloud-secrets.js.map +10 -0
  87. package/dist/lib/config-env.d.ts +5 -0
  88. package/dist/lib/config-env.d.ts.map +1 -0
  89. package/dist/lib/config-env.js +191 -0
  90. package/dist/lib/config-env.js.map +11 -0
  91. package/dist/lib/config-like.d.ts +40 -0
  92. package/dist/lib/config-like.d.ts.map +1 -0
  93. package/dist/lib/config-like.js +103 -0
  94. package/dist/lib/config-like.js.map +10 -0
  95. package/dist/lib/credential-type-map.d.ts +53 -0
  96. package/dist/lib/credential-type-map.d.ts.map +1 -0
  97. package/dist/lib/credential-type-map.js +88 -0
  98. package/dist/lib/credential-type-map.js.map +10 -0
  99. package/dist/lib/feature-flags.d.ts +2 -0
  100. package/dist/lib/feature-flags.d.ts.map +1 -0
  101. package/dist/lib/feature-flags.js +40 -0
  102. package/dist/lib/feature-flags.js.map +10 -0
  103. package/dist/lib/http.d.ts +22 -0
  104. package/dist/lib/http.d.ts.map +1 -0
  105. package/dist/lib/http.js +107 -0
  106. package/dist/lib/http.js.map +10 -0
  107. package/dist/lib/server-cloud-tts.d.ts +34 -0
  108. package/dist/lib/server-cloud-tts.d.ts.map +1 -0
  109. package/dist/lib/server-cloud-tts.js +549 -0
  110. package/dist/lib/server-cloud-tts.js.map +13 -0
  111. package/dist/lib/state-paths.d.ts +4 -0
  112. package/dist/lib/state-paths.d.ts.map +1 -0
  113. package/dist/lib/state-paths.js +52 -0
  114. package/dist/lib/state-paths.js.map +10 -0
  115. package/dist/lib/tts-debug.d.ts +4 -0
  116. package/dist/lib/tts-debug.d.ts.map +1 -0
  117. package/dist/lib/tts-debug.js +57 -0
  118. package/dist/lib/tts-debug.js.map +10 -0
  119. package/dist/models/embeddings.d.ts.map +1 -1
  120. package/dist/models/embeddings.js +319 -0
  121. package/dist/models/embeddings.js.map +13 -0
  122. package/dist/models/image.d.ts.map +1 -1
  123. package/dist/models/image.js +374 -0
  124. package/dist/models/image.js.map +14 -0
  125. package/dist/models/index.d.ts +1 -2
  126. package/dist/models/index.d.ts.map +1 -1
  127. package/dist/models/index.js +1386 -0
  128. package/dist/models/index.js.map +20 -0
  129. package/dist/models/research.d.ts.map +1 -1
  130. package/dist/models/research.js +324 -0
  131. package/dist/models/research.js.map +13 -0
  132. package/dist/models/speech.d.ts.map +1 -1
  133. package/dist/models/speech.js +273 -0
  134. package/dist/models/speech.js.map +13 -0
  135. package/dist/models/text.d.ts +5 -2
  136. package/dist/models/text.d.ts.map +1 -1
  137. package/dist/models/text.js +803 -0
  138. package/dist/models/text.js.map +15 -0
  139. package/dist/models/tokenization.d.ts.map +1 -1
  140. package/dist/models/tokenization.js +65 -0
  141. package/dist/models/tokenization.js.map +10 -0
  142. package/dist/models/transcription.d.ts.map +1 -1
  143. package/dist/models/transcription.js +283 -0
  144. package/dist/models/transcription.js.map +13 -0
  145. package/dist/node/index.d.ts +2 -2
  146. package/dist/node/index.node.js +12171 -2266
  147. package/dist/node/index.node.js.map +135 -27
  148. package/dist/onboarding.d.ts +35 -0
  149. package/dist/onboarding.d.ts.map +1 -0
  150. package/dist/onboarding.js +883 -0
  151. package/dist/onboarding.js.map +14 -0
  152. package/dist/plugin.d.ts +20 -0
  153. package/dist/plugin.d.ts.map +1 -0
  154. package/dist/plugin.js +7611 -0
  155. package/dist/plugin.js.map +104 -0
  156. package/dist/providers/openai.d.ts.map +1 -1
  157. package/dist/providers/openai.js +127 -0
  158. package/dist/providers/openai.js.map +11 -0
  159. package/dist/register-routes.d.ts +2 -0
  160. package/dist/register-routes.d.ts.map +1 -0
  161. package/dist/register-routes.js +7612 -0
  162. package/dist/register-routes.js.map +105 -0
  163. package/dist/routes/cloud-billing-routes.d.ts +9 -0
  164. package/dist/routes/cloud-billing-routes.d.ts.map +1 -0
  165. package/dist/routes/cloud-billing-routes.js +807 -0
  166. package/dist/routes/cloud-billing-routes.js.map +14 -0
  167. package/dist/routes/cloud-compat-routes.d.ts +10 -0
  168. package/dist/routes/cloud-compat-routes.d.ts.map +1 -0
  169. package/dist/routes/cloud-compat-routes.js +538 -0
  170. package/dist/routes/cloud-compat-routes.js.map +14 -0
  171. package/dist/routes/cloud-features-routes.d.ts +9 -0
  172. package/dist/routes/cloud-features-routes.d.ts.map +1 -0
  173. package/dist/routes/cloud-features-routes.js +124 -0
  174. package/dist/routes/cloud-features-routes.js.map +11 -0
  175. package/dist/routes/cloud-provisioning.d.ts +14 -0
  176. package/dist/routes/cloud-provisioning.d.ts.map +1 -0
  177. package/dist/routes/cloud-provisioning.js +37 -0
  178. package/dist/routes/cloud-provisioning.js.map +10 -0
  179. package/dist/routes/cloud-relay-routes.d.ts +22 -0
  180. package/dist/routes/cloud-relay-routes.d.ts.map +1 -0
  181. package/dist/routes/cloud-relay-routes.js +60 -0
  182. package/dist/routes/cloud-relay-routes.js.map +10 -0
  183. package/dist/routes/cloud-routes-autonomous.d.ts +83 -0
  184. package/dist/routes/cloud-routes-autonomous.d.ts.map +1 -0
  185. package/dist/routes/cloud-routes-autonomous.js +6134 -0
  186. package/dist/routes/cloud-routes-autonomous.js.map +97 -0
  187. package/dist/routes/cloud-routes.d.ts +35 -0
  188. package/dist/routes/cloud-routes.d.ts.map +1 -0
  189. package/dist/routes/cloud-routes.js +6888 -0
  190. package/dist/routes/cloud-routes.js.map +100 -0
  191. package/dist/routes/cloud-status-routes-autonomous.d.ts +15 -0
  192. package/dist/routes/cloud-status-routes-autonomous.d.ts.map +1 -0
  193. package/dist/routes/cloud-status-routes-autonomous.js +396 -0
  194. package/dist/routes/cloud-status-routes-autonomous.js.map +13 -0
  195. package/dist/routes/cloud-status-routes.d.ts +4 -0
  196. package/dist/routes/cloud-status-routes.d.ts.map +1 -0
  197. package/dist/routes/cloud-status-routes.js +771 -0
  198. package/dist/routes/cloud-status-routes.js.map +15 -0
  199. package/dist/services/cloud-auth.d.ts +140 -5
  200. package/dist/services/cloud-auth.d.ts.map +1 -1
  201. package/dist/services/cloud-auth.js +363 -0
  202. package/dist/services/cloud-auth.js.map +12 -0
  203. package/dist/services/cloud-backup.d.ts.map +1 -1
  204. package/dist/services/cloud-backup.js +176 -0
  205. package/dist/services/cloud-backup.js.map +11 -0
  206. package/dist/services/cloud-bootstrap.d.ts +38 -0
  207. package/dist/services/cloud-bootstrap.d.ts.map +1 -0
  208. package/dist/services/cloud-bootstrap.js +84 -0
  209. package/dist/services/cloud-bootstrap.js.map +10 -0
  210. package/dist/services/cloud-bridge.d.ts +1 -1
  211. package/dist/services/cloud-bridge.d.ts.map +1 -1
  212. package/dist/services/cloud-bridge.js +308 -0
  213. package/dist/services/cloud-bridge.js.map +11 -0
  214. package/dist/services/cloud-container.d.ts.map +1 -1
  215. package/dist/services/cloud-container.js +241 -0
  216. package/dist/services/cloud-container.js.map +11 -0
  217. package/dist/services/cloud-credential-provider.d.ts +55 -0
  218. package/dist/services/cloud-credential-provider.d.ts.map +1 -0
  219. package/dist/services/cloud-credential-provider.js +190 -0
  220. package/dist/services/cloud-credential-provider.js.map +11 -0
  221. package/dist/services/cloud-managed-gateway-relay.d.ts +38 -0
  222. package/dist/services/cloud-managed-gateway-relay.d.ts.map +1 -0
  223. package/dist/services/cloud-managed-gateway-relay.js +479 -0
  224. package/dist/services/cloud-managed-gateway-relay.js.map +10 -0
  225. package/dist/services/cloud-model-registry.d.ts.map +1 -1
  226. package/dist/services/cloud-model-registry.js +175 -0
  227. package/dist/services/cloud-model-registry.js.map +10 -0
  228. package/dist/services/index.d.ts +3 -1
  229. package/dist/services/index.d.ts.map +1 -1
  230. package/dist/services/index.js +29 -0
  231. package/dist/services/index.js.map +9 -0
  232. package/dist/types/cloud.d.ts +41 -19
  233. package/dist/types/cloud.d.ts.map +1 -1
  234. package/dist/types/cloud.js +52 -0
  235. package/dist/types/cloud.js.map +10 -0
  236. package/dist/types/index.d.ts +1 -1
  237. package/dist/types/index.d.ts.map +1 -1
  238. package/dist/types/index.js +24 -0
  239. package/dist/types/index.js.map +9 -0
  240. package/dist/utils/cloud-api.d.ts +2 -27
  241. package/dist/utils/cloud-api.d.ts.map +1 -1
  242. package/dist/utils/cloud-api.js +33 -0
  243. package/dist/utils/cloud-api.js.map +10 -0
  244. package/dist/utils/cloud-sdk/client.d.ts +133 -0
  245. package/dist/utils/cloud-sdk/client.d.ts.map +1 -0
  246. package/dist/utils/cloud-sdk/client.js +3561 -0
  247. package/dist/utils/cloud-sdk/client.js.map +13 -0
  248. package/dist/utils/cloud-sdk/http.d.ts +37 -0
  249. package/dist/utils/cloud-sdk/http.d.ts.map +1 -0
  250. package/dist/utils/cloud-sdk/http.js +237 -0
  251. package/dist/utils/cloud-sdk/http.js.map +11 -0
  252. package/dist/utils/cloud-sdk/index.d.ts +6 -0
  253. package/dist/utils/cloud-sdk/index.d.ts.map +1 -0
  254. package/dist/utils/cloud-sdk/index.js +29 -0
  255. package/dist/utils/cloud-sdk/index.js.map +9 -0
  256. package/dist/utils/cloud-sdk/public-routes.d.ts +5377 -0
  257. package/dist/utils/cloud-sdk/public-routes.d.ts.map +1 -0
  258. package/dist/utils/cloud-sdk/public-routes.js +2950 -0
  259. package/dist/utils/cloud-sdk/public-routes.js.map +10 -0
  260. package/dist/utils/cloud-sdk/types.cloud-api.d.ts +101 -0
  261. package/dist/utils/cloud-sdk/types.cloud-api.d.ts.map +1 -0
  262. package/dist/utils/cloud-sdk/types.cloud-api.js +2 -0
  263. package/dist/utils/cloud-sdk/types.cloud-api.js.map +9 -0
  264. package/dist/utils/cloud-sdk/types.d.ts +655 -0
  265. package/dist/utils/cloud-sdk/types.d.ts.map +1 -0
  266. package/dist/utils/cloud-sdk/types.js +29 -0
  267. package/dist/utils/cloud-sdk/types.js.map +10 -0
  268. package/dist/utils/config.d.ts +7 -3
  269. package/dist/utils/config.d.ts.map +1 -1
  270. package/dist/utils/config.js +137 -0
  271. package/dist/utils/config.js.map +10 -0
  272. package/dist/utils/events.d.ts.map +1 -1
  273. package/dist/utils/events.js +43 -0
  274. package/dist/utils/events.js.map +10 -0
  275. package/dist/utils/helpers.d.ts.map +1 -1
  276. package/dist/utils/helpers.js +103 -0
  277. package/dist/utils/helpers.js.map +10 -0
  278. package/dist/utils/responses-output.d.ts +13 -0
  279. package/dist/utils/responses-output.d.ts.map +1 -0
  280. package/dist/utils/responses-output.js +102 -0
  281. package/dist/utils/responses-output.js.map +10 -0
  282. package/dist/utils/sdk-client.d.ts +5 -0
  283. package/dist/utils/sdk-client.d.ts.map +1 -0
  284. package/dist/utils/sdk-client.js +144 -0
  285. package/dist/utils/sdk-client.js.map +11 -0
  286. package/package.json +108 -19
  287. package/src/cloud/auth.ts +175 -0
  288. package/src/cloud/backup.ts +46 -0
  289. package/src/cloud/base-url.ts +62 -0
  290. package/src/cloud/bridge-client.ts +602 -0
  291. package/src/cloud/cloud-api-key.ts +80 -0
  292. package/src/cloud/cloud-manager.ts +163 -0
  293. package/src/cloud/cloud-proxy.ts +52 -0
  294. package/src/cloud/cloud-wallet.ts +341 -0
  295. package/src/cloud/index.ts +28 -0
  296. package/src/cloud/reconnect.ts +111 -0
  297. package/src/cloud/validate-url.ts +181 -0
  298. package/src/cloud-providers/cloud-status.ts +75 -0
  299. package/src/cloud-providers/container-health.ts +68 -0
  300. package/src/cloud-providers/credit-balance.ts +70 -0
  301. package/src/cloud-providers/index.ts +3 -0
  302. package/src/cloud-providers/model-registry.ts +74 -0
  303. package/src/index.browser.ts +10 -0
  304. package/src/index.node.ts +39 -0
  305. package/src/index.ts +347 -0
  306. package/src/init.ts +39 -0
  307. package/src/lib/cloud-connection.ts +663 -0
  308. package/src/lib/cloud-secrets.ts +58 -0
  309. package/src/lib/config-env.ts +168 -0
  310. package/src/lib/config-like.ts +149 -0
  311. package/src/lib/credential-type-map.ts +130 -0
  312. package/src/lib/feature-flags.ts +26 -0
  313. package/src/lib/http.ts +139 -0
  314. package/src/lib/server-cloud-tts.ts +609 -0
  315. package/src/lib/state-paths.ts +28 -0
  316. package/src/lib/tts-debug.ts +34 -0
  317. package/src/models/embeddings.ts +234 -0
  318. package/src/models/image.ts +219 -0
  319. package/src/models/index.ts +16 -0
  320. package/src/models/research.ts +265 -0
  321. package/src/models/speech.ts +78 -0
  322. package/src/models/text.ts +899 -0
  323. package/src/models/tokenization.ts +67 -0
  324. package/src/models/transcription.ts +97 -0
  325. package/src/onboarding.ts +396 -0
  326. package/src/plugin.ts +243 -0
  327. package/src/providers/openai.ts +16 -0
  328. package/src/register-routes.ts +6 -0
  329. package/src/routes/cloud-billing-routes.ts +754 -0
  330. package/src/routes/cloud-compat-routes.ts +314 -0
  331. package/src/routes/cloud-features-routes.ts +57 -0
  332. package/src/routes/cloud-provisioning.ts +37 -0
  333. package/src/routes/cloud-relay-routes.ts +89 -0
  334. package/src/routes/cloud-routes-autonomous.ts +996 -0
  335. package/src/routes/cloud-routes.ts +576 -0
  336. package/src/routes/cloud-status-routes-autonomous.ts +234 -0
  337. package/src/routes/cloud-status-routes.ts +73 -0
  338. package/src/services/cloud-auth.ts +567 -0
  339. package/src/services/cloud-backup.ts +208 -0
  340. package/src/services/cloud-bootstrap.ts +108 -0
  341. package/src/services/cloud-bridge.ts +386 -0
  342. package/src/services/cloud-container.ts +297 -0
  343. package/src/services/cloud-credential-provider.ts +210 -0
  344. package/src/services/cloud-managed-gateway-relay.ts +663 -0
  345. package/src/services/cloud-model-registry.ts +202 -0
  346. package/src/services/index.ts +17 -0
  347. package/{types → src/types}/cloud.ts +52 -29
  348. package/{types → src/types}/index.ts +6 -0
  349. package/src/utils/cloud-api.ts +10 -0
  350. package/src/utils/cloud-sdk/client.ts +735 -0
  351. package/src/utils/cloud-sdk/http.ts +291 -0
  352. package/src/utils/cloud-sdk/index.ts +23 -0
  353. package/src/utils/cloud-sdk/public-routes.ts +5070 -0
  354. package/src/utils/cloud-sdk/types.cloud-api.ts +120 -0
  355. package/src/utils/cloud-sdk/types.ts +762 -0
  356. package/src/utils/config.ts +174 -0
  357. package/src/utils/events.ts +37 -0
  358. package/src/utils/helpers.ts +107 -0
  359. package/src/utils/responses-output.ts +115 -0
  360. package/src/utils/sdk-client.ts +37 -0
  361. package/dist/actions/check-credits.d.ts +0 -6
  362. package/dist/actions/check-credits.d.ts.map +0 -1
  363. package/dist/actions/freeze-agent.d.ts +0 -9
  364. package/dist/actions/freeze-agent.d.ts.map +0 -1
  365. package/dist/actions/index.d.ts +0 -5
  366. package/dist/actions/index.d.ts.map +0 -1
  367. package/dist/actions/provision-agent.d.ts +0 -8
  368. package/dist/actions/provision-agent.d.ts.map +0 -1
  369. package/dist/actions/resume-agent.d.ts +0 -9
  370. package/dist/actions/resume-agent.d.ts.map +0 -1
  371. package/dist/build.d.ts +0 -3
  372. package/dist/build.d.ts.map +0 -1
  373. package/dist/generated/specs/specs.d.ts +0 -55
  374. package/dist/generated/specs/specs.d.ts.map +0 -1
  375. package/dist/models/object.d.ts +0 -4
  376. package/dist/models/object.d.ts.map +0 -1
  377. package/dist/utils/forwarded-settings.d.ts +0 -8
  378. package/dist/utils/forwarded-settings.d.ts.map +0 -1
@@ -0,0 +1,609 @@
1
+ /**
2
+ * Cloud TTS helpers — proxy to Eliza Cloud (`elizacloud.ai`).
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.
7
+ */
8
+ import fs from "node:fs";
9
+ 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
+ }
33
+
34
+ /** Browser → API correlation (never forwarded to Eliza Cloud). */
35
+ export function readTtsDebugClientHeaders(
36
+ req: Pick<http.IncomingMessage, "headers">,
37
+ ): {
38
+ messageId?: string;
39
+ clipSegment?: string;
40
+ hearingFull?: string;
41
+ } {
42
+ const pick = (name: string): string | undefined => {
43
+ const raw = req.headers[name];
44
+ if (raw == null) return undefined;
45
+ const v = Array.isArray(raw) ? raw[0] : raw;
46
+ return typeof v === "string" && v.trim() ? v.trim() : undefined;
47
+ };
48
+ const decode = (enc: string | undefined): string | undefined => {
49
+ if (!enc) return undefined;
50
+ try {
51
+ return decodeURIComponent(enc);
52
+ } catch {
53
+ return enc;
54
+ }
55
+ };
56
+ return {
57
+ messageId: decode(pick("x-elizaos-tts-message-id")),
58
+ clipSegment: decode(pick("x-elizaos-tts-clip-segment")),
59
+ hearingFull: decode(pick("x-elizaos-tts-full-preview")),
60
+ };
61
+ }
62
+
63
+ function ttsClientDbgFields(
64
+ hdr: ReturnType<typeof readTtsDebugClientHeaders>,
65
+ ): Record<string, string> {
66
+ const o: Record<string, string> = {};
67
+ if (hdr.messageId) o.messageId = hdr.messageId;
68
+ if (hdr.clipSegment) o.clipSegment = hdr.clipSegment;
69
+ if (hdr.hearingFull) o.hearingFull = hdr.hearingFull;
70
+ return o;
71
+ }
72
+
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
+ function pickBodyString(
208
+ body: Record<string, unknown>,
209
+ camel: string,
210
+ snake: string,
211
+ ): unknown {
212
+ const a = body[camel];
213
+ if (typeof a === "string" && a.trim()) return a;
214
+ const b = body[snake];
215
+ if (typeof b === "string" && b.trim()) return b;
216
+ return undefined;
217
+ }
218
+
219
+ async function readRawRequestBody(req: http.IncomingMessage): Promise<Buffer> {
220
+ const chunks: Buffer[] = [];
221
+ for await (const chunk of req) {
222
+ chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
223
+ }
224
+ return Buffer.concat(chunks);
225
+ }
226
+
227
+ function sendJsonResponse(
228
+ res: http.ServerResponse,
229
+ status: number,
230
+ body: unknown,
231
+ ): void {
232
+ if (res.headersSent) return;
233
+ res.statusCode = status;
234
+ res.setHeader("content-type", "application/json; charset=utf-8");
235
+ res.end(JSON.stringify(body));
236
+ }
237
+
238
+ function sendJsonErrorResponse(
239
+ res: http.ServerResponse,
240
+ status: number,
241
+ message: string,
242
+ ): void {
243
+ sendJsonResponse(res, status, { error: message });
244
+ }
245
+
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
+ function forwardCloudTtsUpstreamError(
255
+ res: http.ServerResponse,
256
+ status: number,
257
+ bodyText: string,
258
+ ): void {
259
+ if (res.headersSent) return;
260
+ const trimmed = bodyText.trim();
261
+ if (
262
+ (trimmed.startsWith("{") && trimmed.endsWith("}")) ||
263
+ (trimmed.startsWith("[") && trimmed.endsWith("]"))
264
+ ) {
265
+ try {
266
+ const parsed: unknown = JSON.parse(trimmed);
267
+ sendJsonResponse(res, status, parsed);
268
+ return;
269
+ } catch {
270
+ /* fall through */
271
+ }
272
+ }
273
+ res.statusCode = status;
274
+ res.setHeader("content-type", "application/json; charset=utf-8");
275
+ res.end(
276
+ JSON.stringify({ error: trimmed || "Eliza Cloud TTS request failed" }),
277
+ );
278
+ }
279
+
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
+ export async function handleCloudTtsPreviewRoute(
426
+ req: http.IncomingMessage,
427
+ res: http.ServerResponse,
428
+ ): Promise<boolean> {
429
+ const clientTtsDbg = readTtsDebugClientHeaders(req);
430
+ const dbgExtra = ttsClientDbgFields(clientTtsDbg);
431
+
432
+ const cloudApiKey = resolveCloudApiKey();
433
+ if (!cloudApiKey) {
434
+ ttsDebug("server:cloud-tts:reject", {
435
+ reason: "no_api_key",
436
+ ...dbgExtra,
437
+ });
438
+ sendJsonErrorResponse(
439
+ res,
440
+ 401,
441
+ "Eliza Cloud is not connected. Connect your Eliza Cloud account first.",
442
+ );
443
+ return true;
444
+ }
445
+
446
+ const rawBody = await readRawRequestBody(req);
447
+ let body: Record<string, unknown>;
448
+ try {
449
+ body = JSON.parse(rawBody.toString("utf8")) as Record<string, unknown>;
450
+ } catch {
451
+ sendJsonErrorResponse(res, 400, "Invalid JSON request body");
452
+ return true;
453
+ }
454
+
455
+ const text = sanitizeSpeechText(
456
+ typeof body.text === "string" ? body.text : "",
457
+ );
458
+ if (!text) {
459
+ sendJsonErrorResponse(res, 400, "Missing text");
460
+ return true;
461
+ }
462
+
463
+ if (text.length > ELIZA_CLOUD_TTS_MAX_TEXT_CHARS) {
464
+ sendJsonErrorResponse(
465
+ res,
466
+ 400,
467
+ `Text too long. Maximum length is ${ELIZA_CLOUD_TTS_MAX_TEXT_CHARS} characters`,
468
+ );
469
+ return true;
470
+ }
471
+
472
+ const cloudModel = resolveCloudProxyTtsModel(
473
+ pickBodyString(body, "modelId", "model_id"),
474
+ );
475
+ const cloudVoice = resolveElizaCloudTtsVoiceId(
476
+ pickBodyString(body, "voiceId", "voice_id"),
477
+ );
478
+ const cloudUrls = resolveCloudTtsCandidateUrls();
479
+
480
+ const ttsPreview = ttsDebugTextPreview(text);
481
+ ttsDebug("server:cloud-tts:proxy", {
482
+ textChars: text.length,
483
+ preview: ttsPreview,
484
+ modelId: cloudModel,
485
+ voiceId: cloudVoice,
486
+ urlCandidates: cloudUrls.length,
487
+ ...dbgExtra,
488
+ });
489
+
490
+ try {
491
+ let lastStatus = 0;
492
+ let lastDetails = "unknown error";
493
+ let cloudResponse: Response | null = null;
494
+ for (let i = 0; i < cloudUrls.length; i++) {
495
+ const cloudUrl = cloudUrls[i];
496
+ if (cloudUrl === undefined) {
497
+ continue;
498
+ }
499
+ const attempt = await fetch(cloudUrl, {
500
+ method: "POST",
501
+ headers: {
502
+ Authorization: `Bearer ${cloudApiKey}`,
503
+ "x-api-key": cloudApiKey,
504
+ "Content-Type": "application/json",
505
+ Accept: "audio/mpeg",
506
+ },
507
+ body: JSON.stringify({
508
+ text,
509
+ voiceId: cloudVoice,
510
+ modelId: cloudModel,
511
+ }),
512
+ });
513
+
514
+ if (attempt.ok) {
515
+ cloudResponse = attempt;
516
+ ttsDebug("server:cloud-tts:upstream-ok", {
517
+ urlIndex: i,
518
+ status: attempt.status,
519
+ preview: ttsPreview,
520
+ ...dbgExtra,
521
+ });
522
+ break;
523
+ }
524
+
525
+ lastStatus = attempt.status;
526
+ lastDetails = await attempt.text().catch(() => "unknown error");
527
+ ttsDebug("server:cloud-tts:upstream-retry", {
528
+ urlIndex: i,
529
+ status: attempt.status,
530
+ preview: ttsPreview,
531
+ ...dbgExtra,
532
+ });
533
+
534
+ const hasMoreCandidates = i < cloudUrls.length - 1;
535
+ if (!hasMoreCandidates || !shouldRetryCloudTtsUpstream(attempt.status)) {
536
+ break;
537
+ }
538
+ }
539
+ if (!cloudResponse) {
540
+ ttsDebug("server:cloud-tts:reject", {
541
+ reason: "upstream_failed",
542
+ lastStatus,
543
+ preview: ttsPreview,
544
+ ...dbgExtra,
545
+ });
546
+ if (
547
+ lastStatus === 400 ||
548
+ lastStatus === 401 ||
549
+ lastStatus === 402 ||
550
+ lastStatus === 403 ||
551
+ lastStatus === 429
552
+ ) {
553
+ forwardCloudTtsUpstreamError(res, lastStatus, lastDetails);
554
+ return true;
555
+ }
556
+ sendJsonErrorResponse(
557
+ res,
558
+ 502,
559
+ `Eliza Cloud TTS failed (${lastStatus || 502}): ${lastDetails}`,
560
+ );
561
+ return true;
562
+ }
563
+
564
+ const audioBuffer = Buffer.from(await cloudResponse.arrayBuffer());
565
+ ttsDebug("server:cloud-tts:success", {
566
+ bytes: audioBuffer.length,
567
+ preview: ttsPreview,
568
+ ...dbgExtra,
569
+ });
570
+ res.statusCode = 200;
571
+ res.setHeader("Content-Type", "audio/mpeg");
572
+ res.setHeader("Cache-Control", "no-store");
573
+ res.end(audioBuffer);
574
+ return true;
575
+ } catch (err) {
576
+ sendJsonErrorResponse(
577
+ res,
578
+ 502,
579
+ `Eliza Cloud TTS request failed: ${err instanceof Error ? err.message : String(err)}`,
580
+ );
581
+ return true;
582
+ }
583
+ }
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
+ }
@@ -0,0 +1,28 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import {
4
+ getElizaNamespace,
5
+ resolveStateDir,
6
+ resolveUserPath,
7
+ } from "@elizaos/core";
8
+
9
+ export { getElizaNamespace, resolveStateDir, resolveUserPath };
10
+
11
+ export function resolveConfigPath(
12
+ env: NodeJS.ProcessEnv = process.env,
13
+ stateDirPath: string = resolveStateDir(env),
14
+ ): string {
15
+ const override = env.ELIZA_CONFIG_PATH?.trim();
16
+ if (override) return resolveUserPath(override);
17
+
18
+ const namespace = getElizaNamespace(env);
19
+ const primaryPath = path.join(stateDirPath, `${namespace}.json`);
20
+ if (fs.existsSync(primaryPath)) return primaryPath;
21
+
22
+ if (namespace !== "eliza") {
23
+ const legacyPath = path.join(stateDirPath, "eliza.json");
24
+ if (fs.existsSync(legacyPath)) return legacyPath;
25
+ }
26
+
27
+ return primaryPath;
28
+ }
@@ -0,0 +1,34 @@
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
+ }