9router 0.4.33 → 0.4.37

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 (696) hide show
  1. package/README.md +16 -3
  2. package/app/.next/BUILD_ID +1 -1
  3. package/app/.next/app-path-routes-manifest.json +8 -7
  4. package/app/.next/build-manifest.json +2 -2
  5. package/app/.next/required-server-files.json +0 -1
  6. package/app/.next/routes-manifest.json +6 -0
  7. package/app/.next/server/app/(dashboard)/dashboard/basic-chat/page.js +2 -2
  8. package/app/.next/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  9. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page.js +2 -2
  10. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  11. package/app/.next/server/app/(dashboard)/dashboard/combos/page.js +2 -2
  12. package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  13. package/app/.next/server/app/(dashboard)/dashboard/console-log/page.js +2 -2
  14. package/app/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  15. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page.js +2 -2
  16. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  17. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js +4 -4
  18. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  19. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js +2 -2
  20. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  21. package/app/.next/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +2 -2
  22. package/app/.next/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  23. package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/page.js +2 -2
  24. package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  25. package/app/.next/server/app/(dashboard)/dashboard/mitm/page.js +2 -2
  26. package/app/.next/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  27. package/app/.next/server/app/(dashboard)/dashboard/page.js +2 -2
  28. package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  29. package/app/.next/server/app/(dashboard)/dashboard/profile/page.js +2 -2
  30. package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  31. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js +3 -3
  32. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  33. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page.js +2 -2
  34. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  35. package/app/.next/server/app/(dashboard)/dashboard/providers/page.js +2 -2
  36. package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  37. package/app/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js +4 -4
  38. package/app/.next/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  39. package/app/.next/server/app/(dashboard)/dashboard/quota/page.js +2 -2
  40. package/app/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  41. package/app/.next/server/app/(dashboard)/dashboard/skills/page.js +2 -2
  42. package/app/.next/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  43. package/app/.next/server/app/(dashboard)/dashboard/translator/page.js +2 -2
  44. package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  45. package/app/.next/server/app/(dashboard)/dashboard/usage/page.js +2 -2
  46. package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  47. package/app/.next/server/app/_global-error/page.js +2 -2
  48. package/app/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  49. package/app/.next/server/app/_global-error.html +1 -1
  50. package/app/.next/server/app/_global-error.rsc +1 -1
  51. package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  52. package/app/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  53. package/app/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  54. package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  55. package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  56. package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  57. package/app/.next/server/app/_not-found/page.js +2 -2
  58. package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  59. package/app/.next/server/app/_not-found.html +1 -1
  60. package/app/.next/server/app/_not-found.rsc +4 -4
  61. package/app/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  62. package/app/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  63. package/app/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  64. package/app/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  65. package/app/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  66. package/app/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  67. package/app/.next/server/app/api/auth/login/route.js +1 -1
  68. package/app/.next/server/app/api/auth/logout/route.js +1 -1
  69. package/app/.next/server/app/api/auth/oidc/callback/route.js +1 -1
  70. package/app/.next/server/app/api/auth/oidc/start/route.js +1 -1
  71. package/app/.next/server/app/api/auth/oidc/test/route.js +1 -1
  72. package/app/.next/server/app/api/auth/status/route.js +1 -1
  73. package/app/.next/server/app/api/cli-tools/all-statuses/route.js +2 -2
  74. package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js +2 -2
  75. package/app/.next/server/app/api/cli-tools/antigravity-mitm/route.js +1 -1
  76. package/app/.next/server/app/api/cli-tools/claude-settings/route.js +1 -1
  77. package/app/.next/server/app/api/cli-tools/cline-settings/route.js +2 -2
  78. package/app/.next/server/app/api/cli-tools/codex-settings/route.js +1 -1
  79. package/app/.next/server/app/api/cli-tools/copilot-settings/route.js +2 -2
  80. package/app/.next/server/app/api/cli-tools/cowork-mcp-registry/route.js +1 -1
  81. package/app/.next/server/app/api/cli-tools/cowork-mcp-tools/route.js +1 -1
  82. package/app/.next/server/app/api/cli-tools/cowork-settings/route.js +2 -2
  83. package/app/.next/server/app/api/cli-tools/droid-settings/route.js +1 -1
  84. package/app/.next/server/app/api/cli-tools/hermes-settings/route.js +2 -2
  85. package/app/.next/server/app/api/cli-tools/kilo-settings/route.js +2 -2
  86. package/app/.next/server/app/api/cli-tools/openclaw-settings/route.js +2 -2
  87. package/app/.next/server/app/api/cli-tools/opencode-settings/route.js +2 -2
  88. package/app/.next/server/app/api/cloud/auth/route.js +1 -1
  89. package/app/.next/server/app/api/cloud/credentials/update/route.js +1 -1
  90. package/app/.next/server/app/api/cloud/model/resolve/route.js +1 -1
  91. package/app/.next/server/app/api/cloud/models/alias/route.js +1 -1
  92. package/app/.next/server/app/api/combos/[id]/route.js +1 -1
  93. package/app/.next/server/app/api/combos/route.js +1 -1
  94. package/app/.next/server/app/api/health/route.js +1 -1
  95. package/app/.next/server/app/api/init/route.js +1 -1
  96. package/app/.next/server/app/api/keys/[id]/route.js +1 -1
  97. package/app/.next/server/app/api/keys/route.js +1 -1
  98. package/app/.next/server/app/api/locale/route.js +1 -1
  99. package/app/.next/server/app/api/mcp/[plugin]/message/route.js +3 -3
  100. package/app/.next/server/app/api/mcp/[plugin]/sse/route.js +4 -4
  101. package/app/.next/server/app/api/media-providers/tts/deepgram/voices/route.js +1 -1
  102. package/app/.next/server/app/api/media-providers/tts/elevenlabs/voices/route.js +1 -1
  103. package/app/.next/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
  104. package/app/.next/server/app/api/media-providers/tts/inworld/voices/route.js +1 -1
  105. package/app/.next/server/app/api/media-providers/tts/minimax/voices/route.js +1 -0
  106. package/app/.next/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -0
  107. package/app/.next/server/app/api/media-providers/tts/minimax/voices/route_client-reference-manifest.js +1 -0
  108. package/app/.next/server/app/api/media-providers/tts/voices/route.js +1 -1
  109. package/app/.next/server/app/api/media-providers/tts/voices/route.js.nft.json +1 -1
  110. package/app/.next/server/app/api/models/alias/route.js +1 -1
  111. package/app/.next/server/app/api/models/availability/route.js +1 -1
  112. package/app/.next/server/app/api/models/custom/route.js +1 -1
  113. package/app/.next/server/app/api/models/disabled/route.js +1 -1
  114. package/app/.next/server/app/api/models/route.js +1 -1
  115. package/app/.next/server/app/api/models/test/route.js +1 -1
  116. package/app/.next/server/app/api/oauth/[provider]/[action]/route.js +1 -1
  117. package/app/.next/server/app/api/oauth/cursor/auto-import/route.js +2 -2
  118. package/app/.next/server/app/api/oauth/cursor/import/route.js +1 -1
  119. package/app/.next/server/app/api/oauth/gitlab/pat/route.js +1 -1
  120. package/app/.next/server/app/api/oauth/iflow/cookie/route.js +1 -1
  121. package/app/.next/server/app/api/oauth/kiro/auto-import/route.js +1 -1
  122. package/app/.next/server/app/api/oauth/kiro/import/route.js +1 -1
  123. package/app/.next/server/app/api/oauth/kiro/social-authorize/route.js +1 -1
  124. package/app/.next/server/app/api/oauth/kiro/social-exchange/route.js +1 -1
  125. package/app/.next/server/app/api/pricing/route.js +1 -1
  126. package/app/.next/server/app/api/provider-nodes/[id]/route.js +1 -1
  127. package/app/.next/server/app/api/provider-nodes/route.js +1 -1
  128. package/app/.next/server/app/api/provider-nodes/validate/route.js +1 -1
  129. package/app/.next/server/app/api/providers/[id]/models/route.js +1 -1
  130. package/app/.next/server/app/api/providers/[id]/route.js +1 -1
  131. package/app/.next/server/app/api/providers/[id]/test/route.js +1 -1
  132. package/app/.next/server/app/api/providers/[id]/test-models/route.js +1 -1
  133. package/app/.next/server/app/api/providers/client/route.js +1 -1
  134. package/app/.next/server/app/api/providers/kilo/free-models/route.js +1 -1
  135. package/app/.next/server/app/api/providers/route.js +1 -1
  136. package/app/.next/server/app/api/providers/suggested-models/route.js +1 -1
  137. package/app/.next/server/app/api/providers/test-batch/route.js +1 -1
  138. package/app/.next/server/app/api/providers/validate/route.js +1 -1
  139. package/app/.next/server/app/api/proxy-pools/[id]/route.js +1 -1
  140. package/app/.next/server/app/api/proxy-pools/[id]/test/route.js +1 -1
  141. package/app/.next/server/app/api/proxy-pools/route.js +1 -1
  142. package/app/.next/server/app/api/proxy-pools/vercel-deploy/route.js +2 -2
  143. package/app/.next/server/app/api/settings/database/route.js +1 -1
  144. package/app/.next/server/app/api/settings/proxy-test/route.js +1 -1
  145. package/app/.next/server/app/api/settings/require-login/route.js +1 -1
  146. package/app/.next/server/app/api/settings/route.js +1 -1
  147. package/app/.next/server/app/api/shutdown/route.js +1 -1
  148. package/app/.next/server/app/api/tags/route.js +1 -1
  149. package/app/.next/server/app/api/translator/console-logs/route.js +1 -1
  150. package/app/.next/server/app/api/translator/console-logs/stream/route.js +2 -2
  151. package/app/.next/server/app/api/translator/load/route.js +1 -1
  152. package/app/.next/server/app/api/translator/save/route.js +1 -1
  153. package/app/.next/server/app/api/translator/send/route.js +1 -1
  154. package/app/.next/server/app/api/translator/translate/route.js +1 -1
  155. package/app/.next/server/app/api/tunnel/disable/route.js +1 -1
  156. package/app/.next/server/app/api/tunnel/enable/route.js +1 -1
  157. package/app/.next/server/app/api/tunnel/status/route.js +1 -1
  158. package/app/.next/server/app/api/tunnel/tailscale-check/route.js +1 -1
  159. package/app/.next/server/app/api/tunnel/tailscale-disable/route.js +1 -1
  160. package/app/.next/server/app/api/tunnel/tailscale-enable/route.js +1 -1
  161. package/app/.next/server/app/api/tunnel/tailscale-install/route.js +3 -3
  162. package/app/.next/server/app/api/tunnel/tailscale-login/route.js +1 -1
  163. package/app/.next/server/app/api/tunnel/tailscale-start-daemon/route.js +1 -1
  164. package/app/.next/server/app/api/usage/[connectionId]/route.js +1 -1
  165. package/app/.next/server/app/api/usage/chart/route.js +1 -1
  166. package/app/.next/server/app/api/usage/history/route.js +1 -1
  167. package/app/.next/server/app/api/usage/providers/route.js +1 -1
  168. package/app/.next/server/app/api/usage/request-details/route.js +1 -1
  169. package/app/.next/server/app/api/usage/request-logs/route.js +1 -1
  170. package/app/.next/server/app/api/usage/stats/route.js +1 -1
  171. package/app/.next/server/app/api/usage/stream/route.js +2 -2
  172. package/app/.next/server/app/api/v1/api/chat/route.js +1 -1
  173. package/app/.next/server/app/api/v1/audio/speech/route.js +1 -1
  174. package/app/.next/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  175. package/app/.next/server/app/api/v1/audio/transcriptions/route.js +1 -1
  176. package/app/.next/server/app/api/v1/audio/voices/route.js +1 -1
  177. package/app/.next/server/app/api/v1/chat/completions/route.js +1 -1
  178. package/app/.next/server/app/api/v1/embeddings/route.js +1 -1
  179. package/app/.next/server/app/api/v1/images/generations/route.js +2 -2
  180. package/app/.next/server/app/api/v1/messages/count_tokens/route.js +1 -1
  181. package/app/.next/server/app/api/v1/messages/route.js +1 -1
  182. package/app/.next/server/app/api/v1/models/[kind]/route.js +1 -1
  183. package/app/.next/server/app/api/v1/models/info/route.js +1 -1
  184. package/app/.next/server/app/api/v1/models/route.js +1 -1
  185. package/app/.next/server/app/api/v1/responses/compact/route.js +1 -1
  186. package/app/.next/server/app/api/v1/responses/route.js +1 -1
  187. package/app/.next/server/app/api/v1/route.js +1 -1
  188. package/app/.next/server/app/api/v1/search/route.js +1 -1
  189. package/app/.next/server/app/api/v1/web/fetch/route.js +1 -1
  190. package/app/.next/server/app/api/v1beta/models/[...path]/route.js +1 -1
  191. package/app/.next/server/app/api/v1beta/models/route.js +1 -1
  192. package/app/.next/server/app/api/version/route.js +1 -1
  193. package/app/.next/server/app/api/version/shutdown/route.js +1 -1
  194. package/app/.next/server/app/api/version/update/route.js +1 -1
  195. package/app/.next/server/app/callback/page.js +2 -2
  196. package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  197. package/app/.next/server/app/callback.html +1 -1
  198. package/app/.next/server/app/callback.rsc +4 -4
  199. package/app/.next/server/app/callback.segments/_full.segment.rsc +4 -4
  200. package/app/.next/server/app/callback.segments/_head.segment.rsc +1 -1
  201. package/app/.next/server/app/callback.segments/_index.segment.rsc +4 -4
  202. package/app/.next/server/app/callback.segments/_tree.segment.rsc +2 -2
  203. package/app/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  204. package/app/.next/server/app/callback.segments/callback.segment.rsc +1 -1
  205. package/app/.next/server/app/dashboard/basic-chat.html +1 -1
  206. package/app/.next/server/app/dashboard/basic-chat.rsc +6 -6
  207. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  208. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  209. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  210. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  211. package/app/.next/server/app/dashboard/basic-chat.segments/_full.segment.rsc +6 -6
  212. package/app/.next/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  213. package/app/.next/server/app/dashboard/basic-chat.segments/_index.segment.rsc +4 -4
  214. package/app/.next/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
  215. package/app/.next/server/app/dashboard/cli-tools.html +1 -1
  216. package/app/.next/server/app/dashboard/cli-tools.rsc +6 -6
  217. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  218. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  219. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  220. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  221. package/app/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +6 -6
  222. package/app/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  223. package/app/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +4 -4
  224. package/app/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
  225. package/app/.next/server/app/dashboard/combos.html +1 -1
  226. package/app/.next/server/app/dashboard/combos.rsc +6 -6
  227. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  228. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  229. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  230. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  231. package/app/.next/server/app/dashboard/combos.segments/_full.segment.rsc +6 -6
  232. package/app/.next/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  233. package/app/.next/server/app/dashboard/combos.segments/_index.segment.rsc +4 -4
  234. package/app/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
  235. package/app/.next/server/app/dashboard/endpoint.html +1 -1
  236. package/app/.next/server/app/dashboard/endpoint.rsc +6 -6
  237. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  238. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  239. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  240. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  241. package/app/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +6 -6
  242. package/app/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  243. package/app/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +4 -4
  244. package/app/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
  245. package/app/.next/server/app/dashboard/media-providers/web.html +1 -1
  246. package/app/.next/server/app/dashboard/media-providers/web.rsc +6 -6
  247. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  248. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  249. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  250. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  251. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  252. package/app/.next/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +6 -6
  253. package/app/.next/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  254. package/app/.next/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +4 -4
  255. package/app/.next/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +2 -2
  256. package/app/.next/server/app/dashboard/mitm.html +1 -1
  257. package/app/.next/server/app/dashboard/mitm.rsc +6 -6
  258. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  259. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  260. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  261. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  262. package/app/.next/server/app/dashboard/mitm.segments/_full.segment.rsc +6 -6
  263. package/app/.next/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  264. package/app/.next/server/app/dashboard/mitm.segments/_index.segment.rsc +4 -4
  265. package/app/.next/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
  266. package/app/.next/server/app/dashboard/profile.html +1 -1
  267. package/app/.next/server/app/dashboard/profile.rsc +6 -6
  268. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  269. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  270. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  271. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  272. package/app/.next/server/app/dashboard/profile.segments/_full.segment.rsc +6 -6
  273. package/app/.next/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  274. package/app/.next/server/app/dashboard/profile.segments/_index.segment.rsc +4 -4
  275. package/app/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
  276. package/app/.next/server/app/dashboard/providers/new.html +1 -1
  277. package/app/.next/server/app/dashboard/providers/new.rsc +6 -6
  278. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  279. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  280. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  281. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  282. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  283. package/app/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +6 -6
  284. package/app/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  285. package/app/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +4 -4
  286. package/app/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
  287. package/app/.next/server/app/dashboard/providers.html +1 -1
  288. package/app/.next/server/app/dashboard/providers.rsc +6 -6
  289. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  290. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  291. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  292. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  293. package/app/.next/server/app/dashboard/providers.segments/_full.segment.rsc +6 -6
  294. package/app/.next/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  295. package/app/.next/server/app/dashboard/providers.segments/_index.segment.rsc +4 -4
  296. package/app/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
  297. package/app/.next/server/app/dashboard/proxy-pools.html +1 -1
  298. package/app/.next/server/app/dashboard/proxy-pools.rsc +6 -6
  299. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  300. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  301. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  302. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  303. package/app/.next/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +6 -6
  304. package/app/.next/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  305. package/app/.next/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +4 -4
  306. package/app/.next/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
  307. package/app/.next/server/app/dashboard/quota.html +2 -2
  308. package/app/.next/server/app/dashboard/quota.rsc +7 -7
  309. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  310. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  311. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  312. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  313. package/app/.next/server/app/dashboard/quota.segments/_full.segment.rsc +7 -7
  314. package/app/.next/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  315. package/app/.next/server/app/dashboard/quota.segments/_index.segment.rsc +4 -4
  316. package/app/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
  317. package/app/.next/server/app/dashboard/settings/pricing/page.js +2 -2
  318. package/app/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  319. package/app/.next/server/app/dashboard/settings/pricing.html +1 -1
  320. package/app/.next/server/app/dashboard/settings/pricing.rsc +4 -4
  321. package/app/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +4 -4
  322. package/app/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  323. package/app/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +4 -4
  324. package/app/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
  325. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  326. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  327. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  328. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  329. package/app/.next/server/app/dashboard/skills.html +1 -1
  330. package/app/.next/server/app/dashboard/skills.rsc +6 -6
  331. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +2 -2
  332. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills.segment.rsc +1 -1
  333. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  334. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  335. package/app/.next/server/app/dashboard/skills.segments/_full.segment.rsc +6 -6
  336. package/app/.next/server/app/dashboard/skills.segments/_head.segment.rsc +1 -1
  337. package/app/.next/server/app/dashboard/skills.segments/_index.segment.rsc +4 -4
  338. package/app/.next/server/app/dashboard/skills.segments/_tree.segment.rsc +2 -2
  339. package/app/.next/server/app/dashboard/translator.html +1 -1
  340. package/app/.next/server/app/dashboard/translator.rsc +6 -6
  341. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  342. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  343. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  344. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  345. package/app/.next/server/app/dashboard/translator.segments/_full.segment.rsc +6 -6
  346. package/app/.next/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  347. package/app/.next/server/app/dashboard/translator.segments/_index.segment.rsc +4 -4
  348. package/app/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
  349. package/app/.next/server/app/dashboard/usage.html +1 -1
  350. package/app/.next/server/app/dashboard/usage.rsc +6 -6
  351. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  352. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  353. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  354. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  355. package/app/.next/server/app/dashboard/usage.segments/_full.segment.rsc +6 -6
  356. package/app/.next/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  357. package/app/.next/server/app/dashboard/usage.segments/_index.segment.rsc +4 -4
  358. package/app/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
  359. package/app/.next/server/app/dashboard.html +1 -1
  360. package/app/.next/server/app/dashboard.rsc +6 -6
  361. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  362. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  363. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  364. package/app/.next/server/app/dashboard.segments/_full.segment.rsc +6 -6
  365. package/app/.next/server/app/dashboard.segments/_head.segment.rsc +1 -1
  366. package/app/.next/server/app/dashboard.segments/_index.segment.rsc +4 -4
  367. package/app/.next/server/app/dashboard.segments/_tree.segment.rsc +2 -2
  368. package/app/.next/server/app/favicon.ico/route.js +1 -1
  369. package/app/.next/server/app/index.html +1 -1
  370. package/app/.next/server/app/index.rsc +4 -4
  371. package/app/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  372. package/app/.next/server/app/index.segments/_full.segment.rsc +4 -4
  373. package/app/.next/server/app/index.segments/_head.segment.rsc +1 -1
  374. package/app/.next/server/app/index.segments/_index.segment.rsc +4 -4
  375. package/app/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  376. package/app/.next/server/app/landing/page.js +2 -2
  377. package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  378. package/app/.next/server/app/landing.html +1 -1
  379. package/app/.next/server/app/landing.rsc +4 -4
  380. package/app/.next/server/app/landing.segments/_full.segment.rsc +4 -4
  381. package/app/.next/server/app/landing.segments/_head.segment.rsc +1 -1
  382. package/app/.next/server/app/landing.segments/_index.segment.rsc +4 -4
  383. package/app/.next/server/app/landing.segments/_tree.segment.rsc +2 -2
  384. package/app/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  385. package/app/.next/server/app/landing.segments/landing.segment.rsc +1 -1
  386. package/app/.next/server/app/login/page.js +2 -2
  387. package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
  388. package/app/.next/server/app/login.html +1 -1
  389. package/app/.next/server/app/login.rsc +5 -5
  390. package/app/.next/server/app/login.segments/_full.segment.rsc +5 -5
  391. package/app/.next/server/app/login.segments/_head.segment.rsc +1 -1
  392. package/app/.next/server/app/login.segments/_index.segment.rsc +4 -4
  393. package/app/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  394. package/app/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  395. package/app/.next/server/app/login.segments/login.segment.rsc +1 -1
  396. package/app/.next/server/app/manifest.webmanifest/route.js +2 -2
  397. package/app/.next/server/app/page.js +2 -2
  398. package/app/.next/server/app/page_client-reference-manifest.js +1 -1
  399. package/app/.next/server/app-paths-manifest.json +8 -7
  400. package/app/.next/server/chunks/1574.js +2 -2
  401. package/app/.next/server/chunks/1795.js +1 -1
  402. package/app/.next/server/chunks/21.js +1 -1
  403. package/app/.next/server/chunks/4343.js +1 -0
  404. package/app/.next/server/chunks/450.js +1 -1
  405. package/app/.next/server/chunks/6263.js +1 -1
  406. package/app/.next/server/chunks/6283.js +1 -1
  407. package/app/.next/server/chunks/6634.js +3 -3
  408. package/app/.next/server/functions-config-manifest.json +8 -0
  409. package/app/.next/server/middleware-build-manifest.js +1 -1
  410. package/app/.next/server/middleware.js +3 -3
  411. package/app/.next/server/pages/404.html +1 -1
  412. package/app/.next/server/pages/500.html +1 -1
  413. package/app/.next/static/9mPauyOl8u-Sqt2ym2tAO/_buildManifest.js +1 -0
  414. package/app/.next/static/chunks/{4156-c8bd7124d8219ccc.js → 4156-fb6ac946bb0d8b36.js} +2 -2
  415. package/app/.next/static/chunks/505-3ecd0e783054a926.js +1 -0
  416. package/app/.next/static/chunks/8035-fcb662f21e288a06.js +3 -0
  417. package/app/.next/static/chunks/app/(dashboard)/dashboard/combos/page-b460baa9a0a252cc.js +1 -0
  418. package/app/.next/static/chunks/app/(dashboard)/dashboard/media-providers/[kind]/[id]/{page-015ed627bb40b0d1.js → page-c8ed0db5955a05a5.js} +11 -11
  419. package/app/.next/static/chunks/app/(dashboard)/dashboard/providers/[id]/{page-597b5dde6cf827f1.js → page-7f9c8937e17f949b.js} +2 -2
  420. package/app/.next/static/chunks/app/(dashboard)/dashboard/proxy-pools/page-884603e61682c07d.js +4 -0
  421. package/app/.next/static/chunks/app/_global-error/page-cfba9d5b02060fc3.js +1 -0
  422. package/app/.next/static/chunks/app/api/auth/login/route-cfba9d5b02060fc3.js +1 -0
  423. package/app/.next/static/chunks/app/api/auth/logout/route-cfba9d5b02060fc3.js +1 -0
  424. package/app/.next/static/chunks/app/api/auth/oidc/callback/route-cfba9d5b02060fc3.js +1 -0
  425. package/app/.next/static/chunks/app/api/auth/oidc/start/route-cfba9d5b02060fc3.js +1 -0
  426. package/app/.next/static/chunks/app/api/auth/oidc/test/route-cfba9d5b02060fc3.js +1 -0
  427. package/app/.next/static/chunks/app/api/auth/status/route-cfba9d5b02060fc3.js +1 -0
  428. package/app/.next/static/chunks/app/api/cli-tools/all-statuses/route-cfba9d5b02060fc3.js +1 -0
  429. package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-cfba9d5b02060fc3.js +1 -0
  430. package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/route-cfba9d5b02060fc3.js +1 -0
  431. package/app/.next/static/chunks/app/api/cli-tools/claude-settings/route-cfba9d5b02060fc3.js +1 -0
  432. package/app/.next/static/chunks/app/api/cli-tools/cline-settings/route-cfba9d5b02060fc3.js +1 -0
  433. package/app/.next/static/chunks/app/api/cli-tools/codex-settings/route-cfba9d5b02060fc3.js +1 -0
  434. package/app/.next/static/chunks/app/api/cli-tools/copilot-settings/route-cfba9d5b02060fc3.js +1 -0
  435. package/app/.next/static/chunks/app/api/cli-tools/cowork-mcp-registry/route-cfba9d5b02060fc3.js +1 -0
  436. package/app/.next/static/chunks/app/api/cli-tools/cowork-mcp-tools/route-cfba9d5b02060fc3.js +1 -0
  437. package/app/.next/static/chunks/app/api/cli-tools/cowork-settings/route-cfba9d5b02060fc3.js +1 -0
  438. package/app/.next/static/chunks/app/api/cli-tools/droid-settings/route-cfba9d5b02060fc3.js +1 -0
  439. package/app/.next/static/chunks/app/api/cli-tools/hermes-settings/route-cfba9d5b02060fc3.js +1 -0
  440. package/app/.next/static/chunks/app/api/cli-tools/kilo-settings/route-cfba9d5b02060fc3.js +1 -0
  441. package/app/.next/static/chunks/app/api/cli-tools/openclaw-settings/route-cfba9d5b02060fc3.js +1 -0
  442. package/app/.next/static/chunks/app/api/cli-tools/opencode-settings/route-cfba9d5b02060fc3.js +1 -0
  443. package/app/.next/static/chunks/app/api/cloud/auth/route-cfba9d5b02060fc3.js +1 -0
  444. package/app/.next/static/chunks/app/api/cloud/credentials/update/route-cfba9d5b02060fc3.js +1 -0
  445. package/app/.next/static/chunks/app/api/cloud/model/resolve/route-cfba9d5b02060fc3.js +1 -0
  446. package/app/.next/static/chunks/app/api/cloud/models/alias/route-cfba9d5b02060fc3.js +1 -0
  447. package/app/.next/static/chunks/app/api/combos/[id]/route-cfba9d5b02060fc3.js +1 -0
  448. package/app/.next/static/chunks/app/api/combos/route-cfba9d5b02060fc3.js +1 -0
  449. package/app/.next/static/chunks/app/api/health/route-cfba9d5b02060fc3.js +1 -0
  450. package/app/.next/static/chunks/app/api/init/route-cfba9d5b02060fc3.js +1 -0
  451. package/app/.next/static/chunks/app/api/keys/[id]/route-cfba9d5b02060fc3.js +1 -0
  452. package/app/.next/static/chunks/app/api/keys/route-cfba9d5b02060fc3.js +1 -0
  453. package/app/.next/static/chunks/app/api/locale/route-cfba9d5b02060fc3.js +1 -0
  454. package/app/.next/static/chunks/app/api/mcp/[plugin]/message/route-cfba9d5b02060fc3.js +1 -0
  455. package/app/.next/static/chunks/app/api/mcp/[plugin]/sse/route-cfba9d5b02060fc3.js +1 -0
  456. package/app/.next/static/chunks/app/api/media-providers/tts/deepgram/voices/route-cfba9d5b02060fc3.js +1 -0
  457. package/app/.next/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-cfba9d5b02060fc3.js +1 -0
  458. package/app/.next/static/chunks/app/api/media-providers/tts/inworld/voices/route-cfba9d5b02060fc3.js +1 -0
  459. package/app/.next/static/chunks/app/api/media-providers/tts/minimax/voices/route-cfba9d5b02060fc3.js +1 -0
  460. package/app/.next/static/chunks/app/api/media-providers/tts/voices/route-cfba9d5b02060fc3.js +1 -0
  461. package/app/.next/static/chunks/app/api/models/alias/route-cfba9d5b02060fc3.js +1 -0
  462. package/app/.next/static/chunks/app/api/models/availability/route-cfba9d5b02060fc3.js +1 -0
  463. package/app/.next/static/chunks/app/api/models/custom/route-cfba9d5b02060fc3.js +1 -0
  464. package/app/.next/static/chunks/app/api/models/disabled/route-cfba9d5b02060fc3.js +1 -0
  465. package/app/.next/static/chunks/app/api/models/route-cfba9d5b02060fc3.js +1 -0
  466. package/app/.next/static/chunks/app/api/models/test/route-cfba9d5b02060fc3.js +1 -0
  467. package/app/.next/static/chunks/app/api/oauth/[provider]/[action]/route-cfba9d5b02060fc3.js +1 -0
  468. package/app/.next/static/chunks/app/api/oauth/cursor/auto-import/route-cfba9d5b02060fc3.js +1 -0
  469. package/app/.next/static/chunks/app/api/oauth/cursor/import/route-cfba9d5b02060fc3.js +1 -0
  470. package/app/.next/static/chunks/app/api/oauth/gitlab/pat/route-cfba9d5b02060fc3.js +1 -0
  471. package/app/.next/static/chunks/app/api/oauth/iflow/cookie/route-cfba9d5b02060fc3.js +1 -0
  472. package/app/.next/static/chunks/app/api/oauth/kiro/auto-import/route-cfba9d5b02060fc3.js +1 -0
  473. package/app/.next/static/chunks/app/api/oauth/kiro/import/route-cfba9d5b02060fc3.js +1 -0
  474. package/app/.next/static/chunks/app/api/oauth/kiro/social-authorize/route-cfba9d5b02060fc3.js +1 -0
  475. package/app/.next/static/chunks/app/api/oauth/kiro/social-exchange/route-cfba9d5b02060fc3.js +1 -0
  476. package/app/.next/static/chunks/app/api/pricing/route-cfba9d5b02060fc3.js +1 -0
  477. package/app/.next/static/chunks/app/api/provider-nodes/[id]/route-cfba9d5b02060fc3.js +1 -0
  478. package/app/.next/static/chunks/app/api/provider-nodes/route-cfba9d5b02060fc3.js +1 -0
  479. package/app/.next/static/chunks/app/api/provider-nodes/validate/route-cfba9d5b02060fc3.js +1 -0
  480. package/app/.next/static/chunks/app/api/providers/[id]/models/route-cfba9d5b02060fc3.js +1 -0
  481. package/app/.next/static/chunks/app/api/providers/[id]/route-cfba9d5b02060fc3.js +1 -0
  482. package/app/.next/static/chunks/app/api/providers/[id]/test/route-cfba9d5b02060fc3.js +1 -0
  483. package/app/.next/static/chunks/app/api/providers/[id]/test-models/route-cfba9d5b02060fc3.js +1 -0
  484. package/app/.next/static/chunks/app/api/providers/client/route-cfba9d5b02060fc3.js +1 -0
  485. package/app/.next/static/chunks/app/api/providers/kilo/free-models/route-cfba9d5b02060fc3.js +1 -0
  486. package/app/.next/static/chunks/app/api/providers/route-cfba9d5b02060fc3.js +1 -0
  487. package/app/.next/static/chunks/app/api/providers/suggested-models/route-cfba9d5b02060fc3.js +1 -0
  488. package/app/.next/static/chunks/app/api/providers/test-batch/route-cfba9d5b02060fc3.js +1 -0
  489. package/app/.next/static/chunks/app/api/providers/validate/route-cfba9d5b02060fc3.js +1 -0
  490. package/app/.next/static/chunks/app/api/proxy-pools/[id]/route-cfba9d5b02060fc3.js +1 -0
  491. package/app/.next/static/chunks/app/api/proxy-pools/[id]/test/route-cfba9d5b02060fc3.js +1 -0
  492. package/app/.next/static/chunks/app/api/proxy-pools/route-cfba9d5b02060fc3.js +1 -0
  493. package/app/.next/static/chunks/app/api/proxy-pools/vercel-deploy/route-cfba9d5b02060fc3.js +1 -0
  494. package/app/.next/static/chunks/app/api/settings/database/route-cfba9d5b02060fc3.js +1 -0
  495. package/app/.next/static/chunks/app/api/settings/proxy-test/route-cfba9d5b02060fc3.js +1 -0
  496. package/app/.next/static/chunks/app/api/settings/require-login/route-cfba9d5b02060fc3.js +1 -0
  497. package/app/.next/static/chunks/app/api/settings/route-cfba9d5b02060fc3.js +1 -0
  498. package/app/.next/static/chunks/app/api/shutdown/route-cfba9d5b02060fc3.js +1 -0
  499. package/app/.next/static/chunks/app/api/tags/route-cfba9d5b02060fc3.js +1 -0
  500. package/app/.next/static/chunks/app/api/translator/console-logs/route-cfba9d5b02060fc3.js +1 -0
  501. package/app/.next/static/chunks/app/api/translator/console-logs/stream/route-cfba9d5b02060fc3.js +1 -0
  502. package/app/.next/static/chunks/app/api/translator/load/route-cfba9d5b02060fc3.js +1 -0
  503. package/app/.next/static/chunks/app/api/translator/save/route-cfba9d5b02060fc3.js +1 -0
  504. package/app/.next/static/chunks/app/api/translator/send/route-cfba9d5b02060fc3.js +1 -0
  505. package/app/.next/static/chunks/app/api/translator/translate/route-cfba9d5b02060fc3.js +1 -0
  506. package/app/.next/static/chunks/app/api/tunnel/disable/route-cfba9d5b02060fc3.js +1 -0
  507. package/app/.next/static/chunks/app/api/tunnel/enable/route-cfba9d5b02060fc3.js +1 -0
  508. package/app/.next/static/chunks/app/api/tunnel/status/route-cfba9d5b02060fc3.js +1 -0
  509. package/app/.next/static/chunks/app/api/tunnel/tailscale-check/route-cfba9d5b02060fc3.js +1 -0
  510. package/app/.next/static/chunks/app/api/tunnel/tailscale-disable/route-cfba9d5b02060fc3.js +1 -0
  511. package/app/.next/static/chunks/app/api/tunnel/tailscale-enable/route-cfba9d5b02060fc3.js +1 -0
  512. package/app/.next/static/chunks/app/api/tunnel/tailscale-install/route-cfba9d5b02060fc3.js +1 -0
  513. package/app/.next/static/chunks/app/api/tunnel/tailscale-login/route-cfba9d5b02060fc3.js +1 -0
  514. package/app/.next/static/chunks/app/api/tunnel/tailscale-start-daemon/route-cfba9d5b02060fc3.js +1 -0
  515. package/app/.next/static/chunks/app/api/usage/[connectionId]/route-cfba9d5b02060fc3.js +1 -0
  516. package/app/.next/static/chunks/app/api/usage/chart/route-cfba9d5b02060fc3.js +1 -0
  517. package/app/.next/static/chunks/app/api/usage/history/route-cfba9d5b02060fc3.js +1 -0
  518. package/app/.next/static/chunks/app/api/usage/providers/route-cfba9d5b02060fc3.js +1 -0
  519. package/app/.next/static/chunks/app/api/usage/request-details/route-cfba9d5b02060fc3.js +1 -0
  520. package/app/.next/static/chunks/app/api/usage/request-logs/route-cfba9d5b02060fc3.js +1 -0
  521. package/app/.next/static/chunks/app/api/usage/stats/route-cfba9d5b02060fc3.js +1 -0
  522. package/app/.next/static/chunks/app/api/usage/stream/route-cfba9d5b02060fc3.js +1 -0
  523. package/app/.next/static/chunks/app/api/v1/api/chat/route-cfba9d5b02060fc3.js +1 -0
  524. package/app/.next/static/chunks/app/api/v1/audio/speech/route-cfba9d5b02060fc3.js +1 -0
  525. package/app/.next/static/chunks/app/api/v1/audio/transcriptions/route-cfba9d5b02060fc3.js +1 -0
  526. package/app/.next/static/chunks/app/api/v1/audio/voices/route-cfba9d5b02060fc3.js +1 -0
  527. package/app/.next/static/chunks/app/api/v1/chat/completions/route-cfba9d5b02060fc3.js +1 -0
  528. package/app/.next/static/chunks/app/api/v1/embeddings/route-cfba9d5b02060fc3.js +1 -0
  529. package/app/.next/static/chunks/app/api/v1/images/generations/route-cfba9d5b02060fc3.js +1 -0
  530. package/app/.next/static/chunks/app/api/v1/messages/count_tokens/route-cfba9d5b02060fc3.js +1 -0
  531. package/app/.next/static/chunks/app/api/v1/messages/route-cfba9d5b02060fc3.js +1 -0
  532. package/app/.next/static/chunks/app/api/v1/models/[kind]/route-cfba9d5b02060fc3.js +1 -0
  533. package/app/.next/static/chunks/app/api/v1/models/info/route-cfba9d5b02060fc3.js +1 -0
  534. package/app/.next/static/chunks/app/api/v1/models/route-cfba9d5b02060fc3.js +1 -0
  535. package/app/.next/static/chunks/app/api/v1/responses/compact/route-cfba9d5b02060fc3.js +1 -0
  536. package/app/.next/static/chunks/app/api/v1/responses/route-cfba9d5b02060fc3.js +1 -0
  537. package/app/.next/static/chunks/app/api/v1/route-cfba9d5b02060fc3.js +1 -0
  538. package/app/.next/static/chunks/app/api/v1/search/route-cfba9d5b02060fc3.js +1 -0
  539. package/app/.next/static/chunks/app/api/v1/web/fetch/route-cfba9d5b02060fc3.js +1 -0
  540. package/app/.next/static/chunks/app/api/v1beta/models/[...path]/route-cfba9d5b02060fc3.js +1 -0
  541. package/app/.next/static/chunks/app/api/v1beta/models/route-cfba9d5b02060fc3.js +1 -0
  542. package/app/.next/static/chunks/app/api/version/route-cfba9d5b02060fc3.js +1 -0
  543. package/app/.next/static/chunks/app/api/version/shutdown/route-cfba9d5b02060fc3.js +1 -0
  544. package/app/.next/static/chunks/app/api/version/update/route-cfba9d5b02060fc3.js +1 -0
  545. package/app/.next/static/chunks/app/manifest.webmanifest/route-cfba9d5b02060fc3.js +1 -0
  546. package/app/.next/static/chunks/app/page-cfba9d5b02060fc3.js +1 -0
  547. package/app/.next/static/chunks/{main-6b8adb338308ee3c.js → main-c15d476fd3e476c5.js} +1 -1
  548. package/app/.next/static/chunks/next/dist/client/components/builtin/app-error-cfba9d5b02060fc3.js +1 -0
  549. package/app/.next/static/chunks/next/dist/client/components/builtin/forbidden-cfba9d5b02060fc3.js +1 -0
  550. package/app/.next/static/chunks/next/dist/client/components/builtin/not-found-cfba9d5b02060fc3.js +1 -0
  551. package/app/.next/static/chunks/next/dist/client/components/builtin/unauthorized-cfba9d5b02060fc3.js +1 -0
  552. package/app/.next/static/css/ae73e0a7859fa2fc.css +1 -0
  553. package/app/package.json +1 -1
  554. package/app/server.js +1 -1
  555. package/app/src/mitm/server.js +29 -30
  556. package/hooks/trayRuntime.js +43 -16
  557. package/package.json +12 -4
  558. package/src/cli/tray/tray.js +64 -13
  559. package/src/cli/utils/input.js +100 -182
  560. package/app/.next/server/chunks/7301.js +0 -1
  561. package/app/.next/static/chunks/505-b06cfc156450639a.js +0 -1
  562. package/app/.next/static/chunks/8035-49b6b5ee48c18a8f.js +0 -3
  563. package/app/.next/static/chunks/app/(dashboard)/dashboard/combos/page-4e109bbbffbc2e16.js +0 -1
  564. package/app/.next/static/chunks/app/(dashboard)/dashboard/proxy-pools/page-a38a16ee9a757333.js +0 -4
  565. package/app/.next/static/chunks/app/_global-error/page-42ea861e9cbd3f66.js +0 -1
  566. package/app/.next/static/chunks/app/api/auth/login/route-42ea861e9cbd3f66.js +0 -1
  567. package/app/.next/static/chunks/app/api/auth/logout/route-42ea861e9cbd3f66.js +0 -1
  568. package/app/.next/static/chunks/app/api/auth/oidc/callback/route-42ea861e9cbd3f66.js +0 -1
  569. package/app/.next/static/chunks/app/api/auth/oidc/start/route-42ea861e9cbd3f66.js +0 -1
  570. package/app/.next/static/chunks/app/api/auth/oidc/test/route-42ea861e9cbd3f66.js +0 -1
  571. package/app/.next/static/chunks/app/api/auth/status/route-42ea861e9cbd3f66.js +0 -1
  572. package/app/.next/static/chunks/app/api/cli-tools/all-statuses/route-42ea861e9cbd3f66.js +0 -1
  573. package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-42ea861e9cbd3f66.js +0 -1
  574. package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/route-42ea861e9cbd3f66.js +0 -1
  575. package/app/.next/static/chunks/app/api/cli-tools/claude-settings/route-42ea861e9cbd3f66.js +0 -1
  576. package/app/.next/static/chunks/app/api/cli-tools/cline-settings/route-42ea861e9cbd3f66.js +0 -1
  577. package/app/.next/static/chunks/app/api/cli-tools/codex-settings/route-42ea861e9cbd3f66.js +0 -1
  578. package/app/.next/static/chunks/app/api/cli-tools/copilot-settings/route-42ea861e9cbd3f66.js +0 -1
  579. package/app/.next/static/chunks/app/api/cli-tools/cowork-mcp-registry/route-42ea861e9cbd3f66.js +0 -1
  580. package/app/.next/static/chunks/app/api/cli-tools/cowork-mcp-tools/route-42ea861e9cbd3f66.js +0 -1
  581. package/app/.next/static/chunks/app/api/cli-tools/cowork-settings/route-42ea861e9cbd3f66.js +0 -1
  582. package/app/.next/static/chunks/app/api/cli-tools/droid-settings/route-42ea861e9cbd3f66.js +0 -1
  583. package/app/.next/static/chunks/app/api/cli-tools/hermes-settings/route-42ea861e9cbd3f66.js +0 -1
  584. package/app/.next/static/chunks/app/api/cli-tools/kilo-settings/route-42ea861e9cbd3f66.js +0 -1
  585. package/app/.next/static/chunks/app/api/cli-tools/openclaw-settings/route-42ea861e9cbd3f66.js +0 -1
  586. package/app/.next/static/chunks/app/api/cli-tools/opencode-settings/route-42ea861e9cbd3f66.js +0 -1
  587. package/app/.next/static/chunks/app/api/cloud/auth/route-42ea861e9cbd3f66.js +0 -1
  588. package/app/.next/static/chunks/app/api/cloud/credentials/update/route-42ea861e9cbd3f66.js +0 -1
  589. package/app/.next/static/chunks/app/api/cloud/model/resolve/route-42ea861e9cbd3f66.js +0 -1
  590. package/app/.next/static/chunks/app/api/cloud/models/alias/route-42ea861e9cbd3f66.js +0 -1
  591. package/app/.next/static/chunks/app/api/combos/[id]/route-42ea861e9cbd3f66.js +0 -1
  592. package/app/.next/static/chunks/app/api/combos/route-42ea861e9cbd3f66.js +0 -1
  593. package/app/.next/static/chunks/app/api/health/route-42ea861e9cbd3f66.js +0 -1
  594. package/app/.next/static/chunks/app/api/init/route-42ea861e9cbd3f66.js +0 -1
  595. package/app/.next/static/chunks/app/api/keys/[id]/route-42ea861e9cbd3f66.js +0 -1
  596. package/app/.next/static/chunks/app/api/keys/route-42ea861e9cbd3f66.js +0 -1
  597. package/app/.next/static/chunks/app/api/locale/route-42ea861e9cbd3f66.js +0 -1
  598. package/app/.next/static/chunks/app/api/mcp/[plugin]/message/route-42ea861e9cbd3f66.js +0 -1
  599. package/app/.next/static/chunks/app/api/mcp/[plugin]/sse/route-42ea861e9cbd3f66.js +0 -1
  600. package/app/.next/static/chunks/app/api/media-providers/tts/deepgram/voices/route-42ea861e9cbd3f66.js +0 -1
  601. package/app/.next/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-42ea861e9cbd3f66.js +0 -1
  602. package/app/.next/static/chunks/app/api/media-providers/tts/inworld/voices/route-42ea861e9cbd3f66.js +0 -1
  603. package/app/.next/static/chunks/app/api/media-providers/tts/voices/route-42ea861e9cbd3f66.js +0 -1
  604. package/app/.next/static/chunks/app/api/models/alias/route-42ea861e9cbd3f66.js +0 -1
  605. package/app/.next/static/chunks/app/api/models/availability/route-42ea861e9cbd3f66.js +0 -1
  606. package/app/.next/static/chunks/app/api/models/custom/route-42ea861e9cbd3f66.js +0 -1
  607. package/app/.next/static/chunks/app/api/models/disabled/route-42ea861e9cbd3f66.js +0 -1
  608. package/app/.next/static/chunks/app/api/models/route-42ea861e9cbd3f66.js +0 -1
  609. package/app/.next/static/chunks/app/api/models/test/route-42ea861e9cbd3f66.js +0 -1
  610. package/app/.next/static/chunks/app/api/oauth/[provider]/[action]/route-42ea861e9cbd3f66.js +0 -1
  611. package/app/.next/static/chunks/app/api/oauth/cursor/auto-import/route-42ea861e9cbd3f66.js +0 -1
  612. package/app/.next/static/chunks/app/api/oauth/cursor/import/route-42ea861e9cbd3f66.js +0 -1
  613. package/app/.next/static/chunks/app/api/oauth/gitlab/pat/route-42ea861e9cbd3f66.js +0 -1
  614. package/app/.next/static/chunks/app/api/oauth/iflow/cookie/route-42ea861e9cbd3f66.js +0 -1
  615. package/app/.next/static/chunks/app/api/oauth/kiro/auto-import/route-42ea861e9cbd3f66.js +0 -1
  616. package/app/.next/static/chunks/app/api/oauth/kiro/import/route-42ea861e9cbd3f66.js +0 -1
  617. package/app/.next/static/chunks/app/api/oauth/kiro/social-authorize/route-42ea861e9cbd3f66.js +0 -1
  618. package/app/.next/static/chunks/app/api/oauth/kiro/social-exchange/route-42ea861e9cbd3f66.js +0 -1
  619. package/app/.next/static/chunks/app/api/pricing/route-42ea861e9cbd3f66.js +0 -1
  620. package/app/.next/static/chunks/app/api/provider-nodes/[id]/route-42ea861e9cbd3f66.js +0 -1
  621. package/app/.next/static/chunks/app/api/provider-nodes/route-42ea861e9cbd3f66.js +0 -1
  622. package/app/.next/static/chunks/app/api/provider-nodes/validate/route-42ea861e9cbd3f66.js +0 -1
  623. package/app/.next/static/chunks/app/api/providers/[id]/models/route-42ea861e9cbd3f66.js +0 -1
  624. package/app/.next/static/chunks/app/api/providers/[id]/route-42ea861e9cbd3f66.js +0 -1
  625. package/app/.next/static/chunks/app/api/providers/[id]/test/route-42ea861e9cbd3f66.js +0 -1
  626. package/app/.next/static/chunks/app/api/providers/[id]/test-models/route-42ea861e9cbd3f66.js +0 -1
  627. package/app/.next/static/chunks/app/api/providers/client/route-42ea861e9cbd3f66.js +0 -1
  628. package/app/.next/static/chunks/app/api/providers/kilo/free-models/route-42ea861e9cbd3f66.js +0 -1
  629. package/app/.next/static/chunks/app/api/providers/route-42ea861e9cbd3f66.js +0 -1
  630. package/app/.next/static/chunks/app/api/providers/suggested-models/route-42ea861e9cbd3f66.js +0 -1
  631. package/app/.next/static/chunks/app/api/providers/test-batch/route-42ea861e9cbd3f66.js +0 -1
  632. package/app/.next/static/chunks/app/api/providers/validate/route-42ea861e9cbd3f66.js +0 -1
  633. package/app/.next/static/chunks/app/api/proxy-pools/[id]/route-42ea861e9cbd3f66.js +0 -1
  634. package/app/.next/static/chunks/app/api/proxy-pools/[id]/test/route-42ea861e9cbd3f66.js +0 -1
  635. package/app/.next/static/chunks/app/api/proxy-pools/route-42ea861e9cbd3f66.js +0 -1
  636. package/app/.next/static/chunks/app/api/proxy-pools/vercel-deploy/route-42ea861e9cbd3f66.js +0 -1
  637. package/app/.next/static/chunks/app/api/settings/database/route-42ea861e9cbd3f66.js +0 -1
  638. package/app/.next/static/chunks/app/api/settings/proxy-test/route-42ea861e9cbd3f66.js +0 -1
  639. package/app/.next/static/chunks/app/api/settings/require-login/route-42ea861e9cbd3f66.js +0 -1
  640. package/app/.next/static/chunks/app/api/settings/route-42ea861e9cbd3f66.js +0 -1
  641. package/app/.next/static/chunks/app/api/shutdown/route-42ea861e9cbd3f66.js +0 -1
  642. package/app/.next/static/chunks/app/api/tags/route-42ea861e9cbd3f66.js +0 -1
  643. package/app/.next/static/chunks/app/api/translator/console-logs/route-42ea861e9cbd3f66.js +0 -1
  644. package/app/.next/static/chunks/app/api/translator/console-logs/stream/route-42ea861e9cbd3f66.js +0 -1
  645. package/app/.next/static/chunks/app/api/translator/load/route-42ea861e9cbd3f66.js +0 -1
  646. package/app/.next/static/chunks/app/api/translator/save/route-42ea861e9cbd3f66.js +0 -1
  647. package/app/.next/static/chunks/app/api/translator/send/route-42ea861e9cbd3f66.js +0 -1
  648. package/app/.next/static/chunks/app/api/translator/translate/route-42ea861e9cbd3f66.js +0 -1
  649. package/app/.next/static/chunks/app/api/tunnel/disable/route-42ea861e9cbd3f66.js +0 -1
  650. package/app/.next/static/chunks/app/api/tunnel/enable/route-42ea861e9cbd3f66.js +0 -1
  651. package/app/.next/static/chunks/app/api/tunnel/status/route-42ea861e9cbd3f66.js +0 -1
  652. package/app/.next/static/chunks/app/api/tunnel/tailscale-check/route-42ea861e9cbd3f66.js +0 -1
  653. package/app/.next/static/chunks/app/api/tunnel/tailscale-disable/route-42ea861e9cbd3f66.js +0 -1
  654. package/app/.next/static/chunks/app/api/tunnel/tailscale-enable/route-42ea861e9cbd3f66.js +0 -1
  655. package/app/.next/static/chunks/app/api/tunnel/tailscale-install/route-42ea861e9cbd3f66.js +0 -1
  656. package/app/.next/static/chunks/app/api/tunnel/tailscale-login/route-42ea861e9cbd3f66.js +0 -1
  657. package/app/.next/static/chunks/app/api/tunnel/tailscale-start-daemon/route-42ea861e9cbd3f66.js +0 -1
  658. package/app/.next/static/chunks/app/api/usage/[connectionId]/route-42ea861e9cbd3f66.js +0 -1
  659. package/app/.next/static/chunks/app/api/usage/chart/route-42ea861e9cbd3f66.js +0 -1
  660. package/app/.next/static/chunks/app/api/usage/history/route-42ea861e9cbd3f66.js +0 -1
  661. package/app/.next/static/chunks/app/api/usage/providers/route-42ea861e9cbd3f66.js +0 -1
  662. package/app/.next/static/chunks/app/api/usage/request-details/route-42ea861e9cbd3f66.js +0 -1
  663. package/app/.next/static/chunks/app/api/usage/request-logs/route-42ea861e9cbd3f66.js +0 -1
  664. package/app/.next/static/chunks/app/api/usage/stats/route-42ea861e9cbd3f66.js +0 -1
  665. package/app/.next/static/chunks/app/api/usage/stream/route-42ea861e9cbd3f66.js +0 -1
  666. package/app/.next/static/chunks/app/api/v1/api/chat/route-42ea861e9cbd3f66.js +0 -1
  667. package/app/.next/static/chunks/app/api/v1/audio/speech/route-42ea861e9cbd3f66.js +0 -1
  668. package/app/.next/static/chunks/app/api/v1/audio/transcriptions/route-42ea861e9cbd3f66.js +0 -1
  669. package/app/.next/static/chunks/app/api/v1/audio/voices/route-42ea861e9cbd3f66.js +0 -1
  670. package/app/.next/static/chunks/app/api/v1/chat/completions/route-42ea861e9cbd3f66.js +0 -1
  671. package/app/.next/static/chunks/app/api/v1/embeddings/route-42ea861e9cbd3f66.js +0 -1
  672. package/app/.next/static/chunks/app/api/v1/images/generations/route-42ea861e9cbd3f66.js +0 -1
  673. package/app/.next/static/chunks/app/api/v1/messages/count_tokens/route-42ea861e9cbd3f66.js +0 -1
  674. package/app/.next/static/chunks/app/api/v1/messages/route-42ea861e9cbd3f66.js +0 -1
  675. package/app/.next/static/chunks/app/api/v1/models/[kind]/route-42ea861e9cbd3f66.js +0 -1
  676. package/app/.next/static/chunks/app/api/v1/models/info/route-42ea861e9cbd3f66.js +0 -1
  677. package/app/.next/static/chunks/app/api/v1/models/route-42ea861e9cbd3f66.js +0 -1
  678. package/app/.next/static/chunks/app/api/v1/responses/compact/route-42ea861e9cbd3f66.js +0 -1
  679. package/app/.next/static/chunks/app/api/v1/responses/route-42ea861e9cbd3f66.js +0 -1
  680. package/app/.next/static/chunks/app/api/v1/route-42ea861e9cbd3f66.js +0 -1
  681. package/app/.next/static/chunks/app/api/v1/search/route-42ea861e9cbd3f66.js +0 -1
  682. package/app/.next/static/chunks/app/api/v1/web/fetch/route-42ea861e9cbd3f66.js +0 -1
  683. package/app/.next/static/chunks/app/api/v1beta/models/[...path]/route-42ea861e9cbd3f66.js +0 -1
  684. package/app/.next/static/chunks/app/api/v1beta/models/route-42ea861e9cbd3f66.js +0 -1
  685. package/app/.next/static/chunks/app/api/version/route-42ea861e9cbd3f66.js +0 -1
  686. package/app/.next/static/chunks/app/api/version/shutdown/route-42ea861e9cbd3f66.js +0 -1
  687. package/app/.next/static/chunks/app/api/version/update/route-42ea861e9cbd3f66.js +0 -1
  688. package/app/.next/static/chunks/app/manifest.webmanifest/route-42ea861e9cbd3f66.js +0 -1
  689. package/app/.next/static/chunks/app/page-42ea861e9cbd3f66.js +0 -1
  690. package/app/.next/static/chunks/next/dist/client/components/builtin/app-error-42ea861e9cbd3f66.js +0 -1
  691. package/app/.next/static/chunks/next/dist/client/components/builtin/forbidden-42ea861e9cbd3f66.js +0 -1
  692. package/app/.next/static/chunks/next/dist/client/components/builtin/not-found-42ea861e9cbd3f66.js +0 -1
  693. package/app/.next/static/chunks/next/dist/client/components/builtin/unauthorized-42ea861e9cbd3f66.js +0 -1
  694. package/app/.next/static/css/a6ccc343d8389dcd.css +0 -1
  695. package/app/.next/static/xilRJjRhqJhUZ2VStWKZh/_buildManifest.js +0 -1
  696. /package/app/.next/static/{xilRJjRhqJhUZ2VStWKZh → 9mPauyOl8u-Sqt2ym2tAO}/_ssgManifest.js +0 -0
@@ -1,27 +1,34 @@
1
- // Lazy install systray for macOS/Linux into USER_DATA_DIR/runtime/node_modules.
1
+ // Lazy install systray2 for macOS/Linux into USER_DATA_DIR/runtime/node_modules.
2
2
  // Windows uses PowerShell NotifyIcon (no binary) → no systray needed.
3
3
  // This keeps the published npm tarball free of unsigned Go binaries that
4
4
  // trigger antivirus false positives (e.g. Kaspersky flagging tray_windows.exe).
5
+ //
6
+ // We use the maintained `systray2` fork. The original `systray@1.0.5` package
7
+ // bundles a 2017 x86_64 Go binary whose Mach-O headers are rejected by modern
8
+ // dyld (macOS 14+), so the tray silently fails to register on Apple Silicon.
5
9
  const { spawnSync } = require("child_process");
6
10
  const fs = require("fs");
7
11
  const path = require("path");
8
12
  const { getRuntimeDir, getRuntimeNodeModules } = require("./sqliteRuntime");
9
13
 
10
- const SYSTRAY_VERSION = "1.0.5";
14
+ const SYSTRAY_PKG = "systray2";
15
+ const SYSTRAY_VERSION = "2.1.4";
16
+ const LEGACY_SYSTRAY_PKG = "systray";
11
17
 
12
18
  function hasSystray() {
13
- return fs.existsSync(path.join(getRuntimeNodeModules(), "systray", "package.json"));
19
+ return fs.existsSync(path.join(getRuntimeNodeModules(), SYSTRAY_PKG, "package.json"));
14
20
  }
15
21
 
16
- // Remove legacy systray from all known locations on Windows (AV false positive cleanup)
17
- function cleanupWindowsSystray({ silent = false } = {}) {
18
- if (process.platform !== "win32") return;
19
- // 1) Runtime dir: %APPDATA%\9router\runtime\node_modules\systray
20
- // 2) npm global nested: <npm_prefix>\node_modules\9router\node_modules\systray
21
- // __dirname here = <npm_prefix>\node_modules\9router\hooks → up 1 = pkg root
22
+ // Remove the legacy `systray` package from all known locations.
23
+ // On Windows it was an AV false-positive risk; on macOS/Linux its bundled
24
+ // binary is broken on modern OS versions.
25
+ function cleanupLegacySystray({ silent = false } = {}) {
26
+ // 1) Runtime dir: ~/.9router/runtime/node_modules/systray (or %APPDATA% on Win)
27
+ // 2) npm global nested: <npm_prefix>/node_modules/9router/node_modules/systray
28
+ // __dirname here = <pkg root>/hooks → up 1 = pkg root
22
29
  const targets = [
23
- path.join(getRuntimeNodeModules(), "systray"),
24
- path.join(__dirname, "..", "node_modules", "systray")
30
+ path.join(getRuntimeNodeModules(), LEGACY_SYSTRAY_PKG),
31
+ path.join(__dirname, "..", "node_modules", LEGACY_SYSTRAY_PKG)
25
32
  ];
26
33
  for (const dir of targets) {
27
34
  if (fs.existsSync(dir)) {
@@ -35,6 +42,21 @@ function cleanupWindowsSystray({ silent = false } = {}) {
35
42
  }
36
43
  }
37
44
 
45
+ // systray2's npm tarball sometimes ships the bundled Go binary without the
46
+ // executable bit set on macOS, causing spawn() to fail with EACCES. Set +x
47
+ // best-effort so the tray actually starts.
48
+ function chmodSystrayBin({ silent = false } = {}) {
49
+ if (process.platform === "win32") return;
50
+ const binName = process.platform === "darwin" ? "tray_darwin_release" : "tray_linux_release";
51
+ const binPath = path.join(getRuntimeNodeModules(), SYSTRAY_PKG, "traybin", binName);
52
+ if (!fs.existsSync(binPath)) return;
53
+ try {
54
+ fs.chmodSync(binPath, 0o755);
55
+ } catch (e) {
56
+ if (!silent) console.warn(`[9router][runtime] chmod tray bin failed: ${e.message}`);
57
+ }
58
+ }
59
+
38
60
  function ensureRuntimeDir() {
39
61
  const dir = getRuntimeDir();
40
62
  if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
@@ -63,20 +85,25 @@ function npmInstall(pkgs, { silent = false } = {}) {
63
85
  return res.status === 0;
64
86
  }
65
87
 
66
- // Public: ensure systray is installed on macOS/Linux only.
88
+ // Public: ensure systray2 is installed on macOS/Linux only.
67
89
  // Windows skips entirely (uses PowerShell tray).
68
90
  function ensureTrayRuntime({ silent = false } = {}) {
91
+ // Always evict the legacy `systray` package — its binary is broken on
92
+ // modern macOS and an AV false-positive on Windows.
93
+ cleanupLegacySystray({ silent });
94
+
69
95
  if (process.platform === "win32") {
70
- cleanupWindowsSystray({ silent });
71
96
  return { systray: false, skipped: true };
72
97
  }
73
98
  if (hasSystray()) {
74
- if (!silent) console.log("[9router][runtime] systray OK");
99
+ chmodSystrayBin({ silent });
100
+ if (!silent) console.log("[9router][runtime] systray2 OK");
75
101
  return { systray: true };
76
102
  }
77
- const ok = npmInstall([`systray@${SYSTRAY_VERSION}`], { silent });
103
+ const ok = npmInstall([`${SYSTRAY_PKG}@${SYSTRAY_VERSION}`], { silent });
104
+ if (ok) chmodSystrayBin({ silent });
78
105
  if (!ok && !silent) {
79
- console.warn("[9router][runtime] systray install failed (tray will be disabled)");
106
+ console.warn("[9router][runtime] systray2 install failed (tray will be disabled)");
80
107
  }
81
108
  return { systray: ok && hasSystray() };
82
109
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "9router",
3
- "version": "0.4.33",
3
+ "version": "0.4.37",
4
4
  "description": "9Router CLI - Start and manage 9Router server",
5
5
  "bin": {
6
6
  "9router": "./cli.js"
@@ -14,17 +14,22 @@
14
14
  "LICENSE"
15
15
  ],
16
16
  "scripts": {
17
+ "dev": "nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js",
18
+ "build": "node scripts/build-cli.js",
19
+ "pack:cli": "npm run build && npm pack --pack-destination ../..",
20
+ "publish:cli": "npm run build && npm publish",
17
21
  "postinstall": "node hooks/postinstall.js",
18
- "prepublishOnly": "cd .. && npm run build:cli"
22
+ "prepublishOnly": "npm run build"
19
23
  },
20
24
  "dependencies": {
25
+ "enquirer": "^2.4.1",
21
26
  "node-forge": "^1.3.3",
22
27
  "node-machine-id": "^1.1.12",
23
28
  "react": "19.2.1",
24
29
  "react-dom": "19.2.1"
25
30
  },
26
31
  "comment_sqlite": "sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.9router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.",
27
- "comment_systray": "systray is NOT bundled here. It is lazy-installed into ~/.9router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping the unsigned Go binary tray_windows.exe that triggers antivirus false positives (Kaspersky).",
32
+ "comment_systray": "systray2 is NOT bundled here. It is lazy-installed into ~/.9router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.",
28
33
  "engines": {
29
34
  "node": ">=18.0.0"
30
35
  },
@@ -35,5 +40,8 @@
35
40
  "ai",
36
41
  "api"
37
42
  ],
38
- "license": "MIT"
43
+ "license": "MIT",
44
+ "devDependencies": {
45
+ "nodemon": "^3.1.14"
46
+ }
39
47
  }
@@ -140,37 +140,75 @@ function initWindowsTray(options) {
140
140
 
141
141
  /**
142
142
  * macOS/Linux tray via systray binary
143
+ *
144
+ * Prefers `systray2` (active fork of `systray`, ships newer
145
+ * getlantern/systray-portable binaries that work on macOS 14+ and Apple
146
+ * Silicon under Rosetta). Falls back to legacy `systray@1.0.5` if systray2
147
+ * is not available, though that binary's Mach-O headers are rejected by
148
+ * modern dyld and the icon will not appear.
143
149
  */
144
150
  function resolveSystray() {
145
- // Try local first (dev), then runtime dir (production lazy install)
151
+ let runtimeDir = null;
146
152
  try {
147
- return require("systray").default;
153
+ const { getRuntimeNodeModules } = require("../../../hooks/sqliteRuntime");
154
+ runtimeDir = getRuntimeNodeModules();
148
155
  } catch (e) {}
156
+
157
+ // 1) systray2 in runtime dir (where ensureTrayRuntime installs it)
158
+ if (runtimeDir) {
159
+ try { return { mod: require(path.join(runtimeDir, "systray2")).default, isV2: true }; } catch (e) {}
160
+ }
161
+ // 2) systray2 resolvable from the package's own node_modules / NODE_PATH
162
+ try { return { mod: require("systray2").default, isV2: true }; } catch (e) {}
163
+ // 3) Legacy systray fallback (unlikely to render on modern macOS)
164
+ try { return { mod: require("systray").default, isV2: false }; } catch (e) {}
165
+ if (runtimeDir) {
166
+ try { return { mod: require(path.join(runtimeDir, "systray")).default, isV2: false }; } catch (e) {}
167
+ }
168
+ return null;
169
+ }
170
+
171
+ function chmodTrayBin(pkgName) {
172
+ // systray2's npm tarball occasionally lands without +x on the bundled Go
173
+ // binary (observed on macOS). spawn() then fails with EACCES. Best-effort
174
+ // chmod on every init avoids a hard-to-diagnose silent tray failure.
149
175
  try {
150
176
  const { getRuntimeNodeModules } = require("../../../hooks/sqliteRuntime");
151
- const systrayPath = path.join(getRuntimeNodeModules(), "systray");
152
- return require(systrayPath).default;
153
- } catch (e) {
154
- return null;
155
- }
177
+ const binName = process.platform === "darwin" ? "tray_darwin_release" : "tray_linux_release";
178
+ const candidates = [
179
+ path.join(getRuntimeNodeModules(), pkgName, "traybin", binName),
180
+ path.join(__dirname, "..", "..", "..", "node_modules", pkgName, "traybin", binName)
181
+ ];
182
+ for (const p of candidates) {
183
+ if (fs.existsSync(p)) fs.chmodSync(p, 0o755);
184
+ }
185
+ } catch (e) {}
156
186
  }
157
187
 
158
188
  function initUnixTray(options) {
159
189
  const { port } = options;
160
190
  try {
161
- const SysTray = resolveSystray();
162
- if (!SysTray) return null;
191
+ const resolved = resolveSystray();
192
+ if (!resolved) return null;
193
+ const { mod: SysTray, isV2 } = resolved;
194
+
195
+ chmodTrayBin(isV2 ? "systray2" : "systray");
196
+
163
197
  const autostartEnabled = getAutostartEnabled();
164
198
  const items = buildMenuItems(port, autostartEnabled);
165
199
 
166
200
  const menu = {
167
201
  icon: getIconBase64(),
202
+ // The bundled icon.png is a full-color RGBA logo. Don't mark it as a
203
+ // template icon: macOS would then render it as a solid white square
204
+ // because template mode only uses the alpha channel.
205
+ isTemplateIcon: false,
168
206
  title: "",
169
207
  tooltip: `9Router - Port ${port}`,
170
208
  items
171
209
  };
172
210
 
173
- trayInstance = new SysTray({ menu, debug: false, copyDir: true });
211
+ trayInstance = new SysTray({ menu, debug: false, copyDir: false });
174
212
  isWinTray = false;
175
213
 
176
214
  trayInstance.onClick((action) => {
@@ -187,11 +225,21 @@ function initUnixTray(options) {
187
225
  });
188
226
  });
189
227
 
190
- trayInstance.onReady(() => {});
191
- trayInstance.onError(() => {});
228
+ if (isV2) {
229
+ // systray2 exposes a ready() promise instead of onReady/onError. Surface
230
+ // failures (binary crash, EACCES, etc.) so users can see why the icon
231
+ // didn't appear instead of getting a misleading "running in tray" log.
232
+ trayInstance.ready().catch((err) => {
233
+ process.stderr.write(`[9router] tray failed to start: ${err && err.message ? err.message : err}\n`);
234
+ });
235
+ } else {
236
+ trayInstance.onReady(() => {});
237
+ trayInstance.onError(() => {});
238
+ }
192
239
 
193
240
  return trayInstance;
194
241
  } catch (err) {
242
+ process.stderr.write(`[9router] tray init error: ${err.message}\n`);
195
243
  return null;
196
244
  }
197
245
  }
@@ -207,7 +255,10 @@ function killTray() {
207
255
  if (instance) {
208
256
  try {
209
257
  if (wasWin) instance.kill();
210
- else instance.kill(true);
258
+ // systray2.kill(true) defaults to calling process.exit(0) which aborts
259
+ // the rest of cleanup (server SIGKILL, MITM/tunnel cleanup). Pass false
260
+ // so callers stay in control of process exit.
261
+ else instance.kill(false);
211
262
  } catch (e) {}
212
263
  }
213
264
  }
@@ -1,4 +1,4 @@
1
- const readline = require("readline");
1
+ const { Input, Confirm, Select } = require("enquirer");
2
2
 
3
3
  const COLORS = {
4
4
  reset: "\x1b[0m",
@@ -14,210 +14,127 @@ const COLORS = {
14
14
  bgGreen: "\x1b[42m",
15
15
  bgBlue: "\x1b[44m",
16
16
  black: "\x1b[30m",
17
- // Terracotta/Earth orange - using RGB escape code
18
- terracotta: "\x1b[38;2;217;119;87m", // #D97757
17
+ terracotta: "\x1b[38;2;217;119;87m",
19
18
  bgTerracotta: "\x1b[48;2;217;119;87m"
20
19
  };
21
20
 
22
- /**
23
- * Ask a question and return the user's answer
24
- * @param {string} question - The question to ask
25
- * @returns {Promise<string>} The user's answer
26
- */
27
- async function prompt(question) {
28
- const rl = readline.createInterface({
29
- input: process.stdin,
30
- output: process.stdout
31
- });
21
+ // Hex color used by enquirer styles
22
+ const TERRACOTTA_HEX = "#D97757";
32
23
 
33
- return new Promise((resolve) => {
34
- rl.question(question, (answer) => {
35
- rl.close();
36
- resolve(answer.trim());
37
- });
38
- });
24
+ function handleCancel(err) {
25
+ // Enquirer throws empty string on ESC/Ctrl+C — treat as cancel
26
+ if (err === "" || err === undefined) return null;
27
+ throw err;
39
28
  }
40
29
 
41
- /**
42
- * Show a numbered menu and return the selected option number
43
- * @param {string} question - The question to ask
44
- * @param {string[]} options - Array of options to display
45
- * @returns {Promise<number>} The selected option index (0-based)
46
- */
47
- async function select(question, options) {
48
- console.log(question);
49
- options.forEach((option, index) => {
50
- console.log(` ${index + 1}. ${option}`);
51
- });
52
-
53
- while (true) {
54
- const answer = await prompt("\nSelect option (number): ");
55
- const num = parseInt(answer, 10);
30
+ // Workaround enquirer raw-mode bug (PR #460): prime stdin into raw mode
31
+ // + utf8 encoding BEFORE each prompt so arrow keys don't leak as ^[[A/^[[B.
32
+ function primeStdin() {
33
+ if (!process.stdin.isTTY) return;
34
+ try {
35
+ process.stdin.setRawMode(true);
36
+ process.stdin.setEncoding("utf8");
37
+ process.stdin.resume();
38
+ } catch {}
39
+ }
56
40
 
57
- if (!isNaN(num) && num >= 1 && num <= options.length) {
58
- return num - 1;
59
- }
41
+ function restoreStdin() {
42
+ if (!process.stdin.isTTY) return;
43
+ try {
44
+ process.stdin.setRawMode(false);
45
+ } catch {}
46
+ process.stdin.pause();
47
+ }
60
48
 
61
- console.log(`Invalid selection. Please enter a number between 1 and ${options.length}`);
49
+ async function runPrompt(p) {
50
+ primeStdin();
51
+ try {
52
+ return await p.run();
53
+ } finally {
54
+ restoreStdin();
62
55
  }
63
56
  }
64
57
 
65
- /**
66
- * Ask a yes/no question and return boolean
67
- * @param {string} question - The question to ask
68
- * @returns {Promise<boolean>} True for yes, false for no
69
- */
70
- async function confirm(question) {
71
- while (true) {
72
- const answer = await prompt(`${question} (y/n): `);
73
- const lower = answer.toLowerCase();
58
+ async function prompt(question) {
59
+ const p = new Input({ name: "value", message: question.replace(/:\s*$/, "") });
60
+ try {
61
+ const answer = await runPrompt(p);
62
+ return (answer || "").trim();
63
+ } catch (err) {
64
+ return handleCancel(err) ?? "";
65
+ }
66
+ }
74
67
 
75
- if (lower === "y" || lower === "yes") {
76
- return true;
77
- }
78
- if (lower === "n" || lower === "no") {
79
- return false;
80
- }
68
+ async function select(question, options) {
69
+ const p = new Select({
70
+ name: "value",
71
+ message: question,
72
+ choices: options.map((label, i) => ({ name: String(i), message: label })),
73
+ });
74
+ try {
75
+ const answer = await runPrompt(p);
76
+ return parseInt(answer, 10);
77
+ } catch (err) {
78
+ handleCancel(err);
79
+ return -1;
80
+ }
81
+ }
81
82
 
82
- console.log("Please answer 'y' or 'n'");
83
+ async function confirm(question) {
84
+ const p = new Confirm({ name: "value", message: question });
85
+ try {
86
+ return await runPrompt(p);
87
+ } catch (err) {
88
+ handleCancel(err);
89
+ return false;
83
90
  }
84
91
  }
85
92
 
86
- /**
87
- * Pause execution until user presses Enter
88
- * @param {string} [message="Press Enter to continue..."] - Message to display
89
- * @returns {Promise<void>}
90
- */
91
93
  async function pause(message = "Press Enter to continue...") {
92
- const rl = readline.createInterface({
93
- input: process.stdin,
94
- output: process.stdout
95
- });
96
-
97
- return new Promise((resolve) => {
98
- rl.question(message, () => {
99
- rl.close();
100
- resolve();
101
- });
102
- });
94
+ const p = new Input({ name: "value", message });
95
+ try {
96
+ await runPrompt(p);
97
+ } catch (err) {
98
+ handleCancel(err);
99
+ }
103
100
  }
104
101
 
105
102
  /**
106
- * Show interactive menu with arrow key navigation
107
- * @param {string} title - Menu title
108
- * @param {Array<{label: string, icon?: string}>} items - Menu items
109
- * @param {number} defaultIndex - Default selected index
110
- * @param {string} headerContent - Optional content to show above menu
111
- * @param {Array<string>} breadcrumb - Optional breadcrumb path
112
- * @returns {Promise<number>} Selected index, or -1 if ESC pressed
103
+ * Interactive arrow-key menu using enquirer Select.
104
+ * Header (title/subtitle/breadcrumb/headerContent) rendered before prompt.
113
105
  */
114
106
  async function selectMenu(title, items, defaultIndex = 0, subtitle = "", headerContent = "", breadcrumb = []) {
115
- return new Promise((resolve) => {
116
- let selectedIndex = defaultIndex;
117
- let isActive = true;
118
-
119
- // Remove any existing keypress listeners first
120
- process.stdin.removeAllListeners("keypress");
121
-
122
- readline.emitKeypressEvents(process.stdin);
123
- if (process.stdin.isTTY) {
124
- try {
125
- process.stdin.setRawMode(true);
126
- } catch (err) {
127
- // TTY disconnected or EIO error - exit gracefully
128
- resolve(-1);
129
- return;
130
- }
131
- }
132
-
133
- const renderMenu = () => {
134
- if (!isActive) return;
135
-
136
- // Clear previous menu
137
- process.stdout.write("\x1b[2J\x1b[H");
138
-
139
- // Show title with terracotta color
140
- const width = Math.min(process.stdout.columns || 40, 40);
141
- console.log(`\n${COLORS.terracotta}${"=".repeat(width)}${COLORS.reset}`);
142
- console.log(` ${COLORS.bright}${COLORS.terracotta}${title}${COLORS.reset}`);
143
-
144
- // Show subtitle inside the frame
145
- if (subtitle) {
146
- console.log(` ${COLORS.dim}${subtitle}${COLORS.reset}`);
147
- }
148
-
149
- console.log(`${COLORS.terracotta}${"=".repeat(width)}${COLORS.reset}`);
150
-
151
- // Show breadcrumb if provided
152
- if (breadcrumb.length > 0) {
153
- console.log(` ${COLORS.dim}${breadcrumb.join(" > ")}${COLORS.reset}`);
154
- }
155
- console.log();
156
-
157
- // Show header content if provided
158
- if (headerContent) {
159
- console.log(headerContent);
160
- console.log();
161
- }
162
-
163
- // Show menu items with proper alignment
164
- items.forEach((item, index) => {
165
- const isSelected = index === selectedIndex;
166
-
167
- // Fallback to ASCII on Windows (cmd/powershell can't render unicode stars)
168
- const isWin = process.platform === "win32";
169
- const icon = isSelected ? (isWin ? ">" : "★") : (isWin ? " " : "☆");
170
-
171
- if (isSelected) {
172
- // Selected: reverse + bright for high visibility on any terminal
173
- console.log(` ${COLORS.reverse}${COLORS.bright}${icon} ${item.label}${COLORS.reset}`);
174
- } else {
175
- // Not selected: plain text with empty star
176
- console.log(` ${icon} ${item.label}`);
177
- }
178
- });
179
- };
180
-
181
- const cleanup = () => {
182
- if (!isActive) return;
183
- isActive = false;
184
-
185
- if (process.stdin.isTTY) {
186
- try {
187
- process.stdin.setRawMode(false);
188
- } catch (err) {
189
- // Ignore cleanup errors
190
- }
191
- }
192
- process.stdin.removeListener("keypress", onKeypress);
193
- process.stdin.pause();
194
- };
195
-
196
- const onKeypress = (str, key) => {
197
- if (!isActive || !key) return;
198
-
199
- if (key.name === "up") {
200
- selectedIndex = (selectedIndex - 1 + items.length) % items.length;
201
- renderMenu();
202
- } else if (key.name === "down") {
203
- selectedIndex = (selectedIndex + 1) % items.length;
204
- renderMenu();
205
- } else if (key.name === "return") {
206
- cleanup();
207
- resolve(selectedIndex);
208
- } else if (key.name === "escape") {
209
- cleanup();
210
- resolve(-1);
211
- } else if (key.ctrl && key.name === "c") {
212
- cleanup();
213
- process.exit(0);
214
- }
215
- };
107
+ process.stdout.write("\x1b[2J\x1b[H");
108
+ const width = Math.min(process.stdout.columns || 40, 40);
109
+ console.log(`\n${COLORS.terracotta}${"=".repeat(width)}${COLORS.reset}`);
110
+ console.log(` ${COLORS.bright}${COLORS.terracotta}${title}${COLORS.reset}`);
111
+ if (subtitle) {
112
+ console.log(` ${COLORS.dim}${subtitle}${COLORS.reset}`);
113
+ }
114
+ console.log(`${COLORS.terracotta}${"=".repeat(width)}${COLORS.reset}`);
115
+ if (breadcrumb.length > 0) {
116
+ console.log(` ${COLORS.dim}${breadcrumb.join(" > ")}${COLORS.reset}`);
117
+ }
118
+ console.log();
119
+ if (headerContent) {
120
+ console.log(headerContent);
121
+ console.log();
122
+ }
216
123
 
217
- process.stdin.on("keypress", onKeypress);
218
- process.stdin.resume();
219
- renderMenu();
124
+ const p = new Select({
125
+ name: "menu",
126
+ message: "Select",
127
+ initial: defaultIndex,
128
+ choices: items.map((item, i) => ({ name: String(i), message: item.label })),
220
129
  });
130
+
131
+ try {
132
+ const answer = await runPrompt(p);
133
+ return parseInt(answer, 10);
134
+ } catch (err) {
135
+ handleCancel(err);
136
+ return -1;
137
+ }
221
138
  }
222
139
 
223
140
  module.exports = {
@@ -225,5 +142,6 @@ module.exports = {
225
142
  select,
226
143
  confirm,
227
144
  pause,
228
- selectMenu
145
+ selectMenu,
146
+ COLORS
229
147
  };
@@ -1 +0,0 @@
1
- "use strict";exports.id=7301,exports.ids=[7301],exports.modules={23016:(a,b,c)=>{c.d(b,{C8:()=>k,DR:()=>j,Uc:()=>g,cI:()=>i,eo:()=>h,gx:()=>d,v1:()=>e,xM:()=>f}),c(73714);let d={BAD_REQUEST:400,UNAUTHORIZED:401,PAYMENT_REQUIRED:402,FORBIDDEN:403,NOT_FOUND:404,NOT_ACCEPTABLE:406,REQUEST_TIMEOUT:408,RATE_LIMITED:429,SERVER_ERROR:500,BAD_GATEWAY:502,SERVICE_UNAVAILABLE:503,GATEWAY_TIMEOUT:504},e={sessionTtlMs:72e5,sessionCleanupIntervalMs:18e5,dnsCacheTtlMs:3e5,proxyDispatchersMaxSize:20},f=18e4,g=64e3,h=32e3,i={429:{attempts:0,delayMs:0},502:{attempts:3,delayMs:3e3},503:{attempts:3,delayMs:2e3},504:{attempts:2,delayMs:3e3}};function j(a){return null==a?{attempts:0,delayMs:2e3}:"number"==typeof a?{attempts:a,delayMs:2e3}:{attempts:a.attempts||0,delayMs:null!=a.delayMs?a.delayMs:2e3}}let k=["Please write a 5-10 word title for the following conversation:"]},73714:(a,b,c)=>{c.d(b,{EQ:()=>f,LY:()=>d,O:()=>e,fh:()=>h,t2:()=>i,wf:()=>g});let d={400:{type:"invalid_request_error",code:"bad_request"},401:{type:"authentication_error",code:"invalid_api_key"},402:{type:"billing_error",code:"payment_required"},403:{type:"permission_error",code:"insufficient_quota"},404:{type:"invalid_request_error",code:"model_not_found"},406:{type:"invalid_request_error",code:"model_not_supported"},429:{type:"rate_limit_error",code:"rate_limit_exceeded"},500:{type:"server_error",code:"internal_server_error"},502:{type:"server_error",code:"bad_gateway"},503:{type:"server_error",code:"service_unavailable"},504:{type:"server_error",code:"gateway_timeout"}},e={400:"Bad request",401:"Invalid API key provided",402:"Payment required",403:"You exceeded your current quota",404:"Model not found",406:"Model not supported",429:"Rate limit exceeded",500:"Internal server error",502:"Bad gateway - upstream provider error",503:"Service temporarily unavailable",504:"Gateway timeout"},f={base:2e3,max:3e5,maxLevel:15},g=3e4,h=18e5,i=[{text:"no credentials",cooldownMs:12e4},{text:"request not allowed",cooldownMs:5e3},{text:"improperly formed request",cooldownMs:12e4},{text:"rate limit",backoff:!0},{text:"too many requests",backoff:!0},{text:"quota exceeded",backoff:!0},{text:"capacity",backoff:!0},{text:"overloaded",backoff:!0},{status:401,cooldownMs:12e4},{status:402,cooldownMs:12e4},{status:403,cooldownMs:12e4},{status:404,cooldownMs:12e4},{status:429,backoff:!0}]},77301:(a,b,c)=>{c.d(b,{Op:()=>N,Nq:()=>E,PE:()=>P});var d=c(4573),e=c(29807),f=c(23016);let g="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36";async function h(a,b="mp3"){let c=await a.arrayBuffer();if(c.byteLength<100)throw Error("Upstream returned empty audio");let e=a.headers.get("content-type")||"",f=b;return e.includes("wav")?f="wav":e.includes("mpeg")||e.includes("mp3")?f="mp3":e.includes("ogg")&&(f="ogg"),{base64:d.Buffer.from(c).toString("base64"),format:f}}async function i(a){let b=await a.text().catch(()=>""),c=`Upstream error (${a.status})`;try{let a=JSON.parse(b);c=a?.error?.message||a?.message||a?.detail?.message||("string"==typeof a?.detail?a.detail:null)||b||c}catch{c=b||c}throw Error(c)}let j={token:null,tokenTime:0},k=0;async function l(){let a=Date.now();if(j.token&&a-j.tokenTime<66e4)return j.token;let b=await fetch("https://translate.google.com/",{headers:{"User-Agent":g}});if(!b.ok)throw Error(`Google translate fetch failed: ${b.status}`);let c=await b.text(),d=c.match(/"FdrFJe":"(.*?)"/)?.[1],e=c.match(/"cfb2h":"(.*?)"/)?.[1];if(!d||!e)throw Error("Failed to parse Google token");return j.token={"f.sid":d,bl:e},j.tokenTime=a,j.token}let m={token:null,tokenTime:0},n=null,o=0;async function p(){let a=Date.now();if(m.token&&a-m.tokenTime<3e5)return m.token;let b=await fetch("https://www.bing.com/translator",{headers:{"User-Agent":g,"Accept-Language":"vi,en-US;q=0.9,en;q=0.8"}});if(!b.ok)throw Error(`Bing translator fetch failed: ${b.status}`);let c=(b.headers.getSetCookie?.()||[]).map(a=>a.split(";")[0]).join("; "),d=(await b.text()).match(/params_AbusePreventionHelper\s*=\s*\[([^,]+),([^,]+),/);if(!d)throw Error("Failed to parse Bing token");return m.token={key:d[1],token:d[2].replace(/"/g,""),cookie:c},m.tokenTime=a,m.token}async function q(a,b,c){let d=b.split("-").slice(0,2).join("-"),e=b.toLowerCase().includes("male")?"Male":"Female",f=`<speak version='1.0' xml:lang='${d}'><voice xml:lang='${d}' xml:gender='${e}' name='${b}'><prosody rate='0.00%'>${a}</prosody></voice></speak>`,h=new URLSearchParams;return h.append("ssml",f),h.append("token",c.token),h.append("key",c.key),fetch("https://www.bing.com/tfettts?isVertical=1&&IG=1&IID=translator.5023&SFX=1",{method:"POST",body:h.toString(),headers:{"Content-Type":"application/x-www-form-urlencoded",Accept:"*/*",Origin:"https://www.bing.com",Referer:"https://www.bing.com/translator","User-Agent":g,...c.cookie?{Cookie:c.cookie}:{}}})}async function r(){let a=Date.now();if(n&&a-o<864e5)return n;let b=await fetch("https://speech.platform.bing.com/consumer/speech/synthesize/readaloud/voices/list?trustedclienttoken=6A5AA1D4EAFF4E9FB37E23D68491D6F4",{headers:{"User-Agent":g}});if(!b.ok)throw Error(`Edge TTS voices fetch failed: ${b.status}`);let c=await b.json();return n=c,o=a,c}var s=c(31421),t=c(57975),u=c(51455),v=c(48161),w=c(76760);let x=(0,t.promisify)(s.execFile),y=null;async function z(){let{stdout:a}=await x("say",["-v","?"]),b=[];for(let c of a.split("\n")){let a=c.match(/^([^\s].*?)\s{2,}([a-z]{2}_[A-Z]{2})/);if(!a)continue;let d=a[1].trim(),e=a[2].trim(),f=e.split("_")[0],g=e.split("_")[1];b.push({id:d,name:d,locale:e,lang:f,country:g,gender:""})}return b}async function A(){let{stdout:a}=await x("powershell.exe",["-NoProfile","-NonInteractive","-WindowStyle","Hidden","-Command","Add-Type -AssemblyName System.Speech; $s = New-Object System.Speech.Synthesis.SpeechSynthesizer; $s.GetInstalledVoices() | ForEach-Object { $v = $_.VoiceInfo; [PSCustomObject]@{ Name=$v.Name; Culture=$v.Culture.Name; Gender=$v.Gender } } | ConvertTo-Json -Compress"],{windowsHide:!0}),b=JSON.parse(a.trim()||"[]");return(Array.isArray(b)?b:[b]).map(a=>{let b=a.Culture||"en-US",[c,d=""]=b.split("-");return{id:a.Name,name:a.Name,locale:b.replace("-","_"),lang:c,country:d,gender:({1:"Male",2:"Female",Male:"Male",Female:"Female"})[a.Gender]||""}})}async function B(){if(y)return y;try{let a="win32"===process.platform?await A():await z();return y=a,a}catch{return[]}}async function C(a,b){let c=await (0,u.mkdtemp)((0,w.join)((0,v.tmpdir)(),"tts-")),d=(0,w.join)(c,"out.aiff"),e=(0,w.join)(c,"out.mp3");try{let c=b?["-v",b,"-o",d,a]:["-o",d,a];return await x("say",c),await x("ffmpeg",["-y","-i",d,"-codec:a","libmp3lame","-qscale:a","4",e]),(await (0,u.readFile)(e)).toString("base64")}finally{await (0,u.rm)(c,{recursive:!0,force:!0})}}let D=new Map;async function E(a){if(!a)throw Error("ElevenLabs API key required");let b=Date.now(),c=D.get(a);if(c&&b-c.time<864e5)return c.voices;let d=await fetch("https://api.elevenlabs.io/v1/voices",{headers:{"xi-api-key":a,"Content-Type":"application/json"}});if(!d.ok)throw Error(`ElevenLabs voices fetch failed: ${d.status}`);let e=((await d.json()).voices||[]).map(a=>({...a,lang:a.labels?.language||"en"}));return D.set(a,{voices:e,time:b}),e}let F="gemini-2.5-flash-preview-tts",G="Kore",H=["gemini-2.5-flash-preview-tts","gemini-2.5-pro-preview-tts"],I=[{id:"Zephyr",lang:"en",gender:"Female"},{id:"Puck",lang:"en",gender:"Male"},{id:"Charon",lang:"en",gender:"Male"},{id:"Kore",lang:"en",gender:"Female"},{id:"Fenrir",lang:"en",gender:"Male"},{id:"Leda",lang:"en",gender:"Female"},{id:"Orus",lang:"en",gender:"Male"},{id:"Aoede",lang:"en",gender:"Female"},{id:"Callirrhoe",lang:"en",gender:"Female"},{id:"Autonoe",lang:"en",gender:"Female"},{id:"Enceladus",lang:"en",gender:"Male"},{id:"Iapetus",lang:"en",gender:"Male"},{id:"Umbriel",lang:"en",gender:"Male"},{id:"Algieba",lang:"en",gender:"Male"},{id:"Despina",lang:"en",gender:"Female"},{id:"Erinome",lang:"en",gender:"Female"},{id:"Algenib",lang:"en",gender:"Male"},{id:"Rasalgethi",lang:"en",gender:"Male"},{id:"Laomedeia",lang:"en",gender:"Female"},{id:"Achernar",lang:"en",gender:"Female"},{id:"Alnilam",lang:"en",gender:"Male"},{id:"Schedar",lang:"en",gender:"Male"},{id:"Gacrux",lang:"en",gender:"Female"},{id:"Pulcherrima",lang:"en",gender:"Female"},{id:"Achird",lang:"en",gender:"Male"},{id:"Zubenelgenubi",lang:"en",gender:"Male"},{id:"Vindemiatrix",lang:"en",gender:"Female"},{id:"Sadachbia",lang:"en",gender:"Male"},{id:"Sadaltager",lang:"en",gender:"Male"},{id:"Sulafat",lang:"en",gender:"Female"}];async function J(){return I.map(a=>({voice_id:a.id,name:a.id,labels:{language:a.lang,gender:a.gender}}))}let K={hyperbolic:async function({baseUrl:a,apiKey:b,text:c}){let d=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${b}`},body:JSON.stringify({text:c})});return d.ok||await i(d),{base64:(await d.json()).audio,format:"mp3"}},deepgram:async function({baseUrl:a,apiKey:b,text:c,modelId:d}){let e=new URL(a);e.searchParams.set("model",d||"aura-asteria-en");let f=await fetch(e.toString(),{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Token ${b}`},body:JSON.stringify({text:c})});return f.ok||await i(f),h(f,"mp3")},"nvidia-tts":async function({baseUrl:a,apiKey:b,text:c,modelId:d,voiceId:e}){let f=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${b}`},body:JSON.stringify({input:{text:c},voice:e||"default",model:d})});return f.ok||await i(f),h(f,"wav")},"huggingface-tts":async function({baseUrl:a,apiKey:b,text:c,modelId:d}){if(!d||d.includes(".."))throw Error("Invalid HuggingFace model ID");let e=await fetch(`${a}/${d}`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${b}`},body:JSON.stringify({inputs:c})});return e.ok||await i(e),h(e,"wav")},inworld:async function({baseUrl:a,apiKey:b,text:c,modelId:d,voiceId:e}){let f=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Basic ${b}`},body:JSON.stringify({text:c,voiceId:e||"Alex",modelId:d||"inworld-tts-1.5-mini",audioConfig:{audioEncoding:"MP3"}})});f.ok||await i(f);let g=await f.json();if(!g.audioContent)throw Error("Inworld TTS returned no audio");return{base64:g.audioContent,format:"mp3"}},cartesia:async function({baseUrl:a,apiKey:b,text:c,modelId:d,voiceId:e}){let f=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":b,"Cartesia-Version":"2024-06-10"},body:JSON.stringify({model_id:d||"sonic-2",transcript:c,...e?{voice:{mode:"id",id:e}}:{},output_format:{container:"mp3",bit_rate:128e3,sample_rate:44100}})});return f.ok||await i(f),h(f,"mp3")},playht:async function({baseUrl:a,apiKey:b,text:c,modelId:d,voiceId:e}){let[f,g]=(b||":").split(":"),j=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Accept:"audio/mpeg","X-USER-ID":f||"",Authorization:`Bearer ${g||b}`},body:JSON.stringify({text:c,voice:e||"s3://voice-cloning-zero-shot/d9ff78ba-d016-47f6-b0ef-dd630f59414e/female-cs/manifest.json",voice_engine:d||"PlayDialog",output_format:"mp3",speed:1})});return j.ok||await i(j),h(j,"mp3")},coqui:async function({baseUrl:a,text:b,voiceId:c}){let d=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({text:b,...c?{speaker_id:c}:{}})});return d.ok||await i(d),h(d,"wav")},tortoise:async function({baseUrl:a,text:b,voiceId:c}){let d=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({text:b,voice:c||"random"})});return d.ok||await i(d),h(d,"wav")},openai:async function({baseUrl:a,apiKey:b,text:c,modelId:d,voiceId:e}){let f={"Content-Type":"application/json"};b&&(f.Authorization=`Bearer ${b}`);let g=await fetch(a,{method:"POST",headers:f,body:JSON.stringify({model:d,input:c,voice:e||"alloy",response_format:"mp3",speed:1})});return g.ok||await i(g),h(g,"mp3")}},L={"google-tts":{noAuth:!0,async synthesize(a,b){let c=b||"en",d=await l(),e=a.replace(/[@^*()\\/\-_+=><"'\u201c\u201d\u3010\u3011]/g," ").replaceAll(", ",". "),f="jQ1olc",g=1e5*++k+Math.floor(1e3+9e3*Math.random()),h=new URLSearchParams({rpcids:f,"f.sid":d["f.sid"],bl:d.bl,hl:c,"soc-app":1,"soc-platform":1,"soc-device":1,_reqid:g,rt:"c"}),i=[e,c,null,"undefined",[0]],j=new URLSearchParams;j.append("f.req",JSON.stringify([[[f,JSON.stringify(i),null,"generic"]]]));let m=await fetch(`https://translate.google.com/_/TranslateWebserverUi/data/batchexecute?${h}`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Referer:"https://translate.google.com/"},body:j.toString()});if(!m.ok)throw Error(`Google TTS failed: ${m.status}`);let n=JSON.parse(JSON.parse((await m.text()).split("\n")[3])[0][2])[0];if(!n||n.length<100)throw Error("Google TTS returned empty audio");return{base64:n,format:"mp3"}}},"edge-tts":{noAuth:!0,async synthesize(a,b){let c=b||"vi-VN-HoaiMyNeural",e=await p(),f=await q(a,c,e);if((429===f.status||403===f.status)&&(m.token=null,m.tokenTime=0,e=await p(),f=await q(a,c,e)),!f.ok){let a=await f.text().catch(()=>"");throw Error(`Bing TTS failed: ${f.status}${a?" - "+a:""}`)}let g=await f.arrayBuffer();if(g.byteLength<1024)throw Error("Bing TTS returned empty audio");return{base64:d.Buffer.from(g).toString("base64"),format:"mp3"}}},"local-device":{noAuth:!0,synthesize:async(a,b)=>({base64:await C(a,b),format:"mp3"})},elevenlabs:{async synthesize(a,b,c){if(!c?.apiKey)throw Error("ElevenLabs API key required");let e="eleven_flash_v2_5",f=b;b&&b.includes("/")&&([e,f]=b.split("/"));let g=await fetch(`https://api.elevenlabs.io/v1/text-to-speech/${f}`,{method:"POST",headers:{"xi-api-key":c.apiKey,"Content-Type":"application/json"},body:JSON.stringify({text:a,model_id:e,voice_settings:{stability:.5,similarity_boost:.75}})});if(!g.ok){let a=await g.json().catch(()=>({}));throw Error(a?.detail?.message||`ElevenLabs TTS failed: ${g.status}`)}let h=await g.arrayBuffer();if(h.byteLength<1024)throw Error("ElevenLabs TTS returned empty audio");return{base64:d.Buffer.from(h).toString("base64"),format:"mp3"}}},openai:{async synthesize(a,b,c){if(!c?.apiKey)throw Error("No OpenAI API key configured");let e="gpt-4o-mini-tts",f="alloy";if(b&&b.includes("/")){let a=b.split("/");2===a.length&&([e,f]=a)}else b&&(f=b);let g=(c.baseUrl||"https://api.openai.com").replace(/\/+$/,""),h=await fetch(`${g}/v1/audio/speech`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${c.apiKey}`},body:JSON.stringify({model:e,voice:f,input:a})});if(!h.ok){let a=await h.json().catch(()=>({}));throw Error(a?.error?.message||`OpenAI TTS failed: ${h.status}`)}let i=await h.arrayBuffer();return{base64:d.Buffer.from(i).toString("base64"),format:"mp3"}}},openrouter:{async synthesize(a,b,c){if(!c?.apiKey)throw Error("No OpenRouter API key configured");let d="openai/gpt-4o-mini-tts",e="alloy";if(b&&b.includes("/")){let a=b.lastIndexOf("/"),c=b.slice(a+1),f=b.slice(0,a);f.includes("/")?(d=f,e=c):e=b}else b&&(e=b);let f=await fetch("https://openrouter.ai/api/v1/chat/completions",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${c.apiKey}`,"HTTP-Referer":"https://endpoint-proxy.local","X-Title":"Endpoint Proxy"},body:JSON.stringify({model:d,modalities:["text","audio"],audio:{voice:e,format:"wav"},stream:!0,messages:[{role:"user",content:a}]})});if(!f.ok){let a=await f.json().catch(()=>({}));throw Error(a?.error?.message||`OpenRouter TTS failed: ${f.status}`)}let g=[],h=f.body.getReader(),i=new TextDecoder,j="";for(;;){let{done:a,value:b}=await h.read();if(a)break;let c=(j+=i.decode(b,{stream:!0})).split("\n");for(let a of(j=c.pop(),c))if(a.startsWith("data: ")&&"data: [DONE]"!==a)try{let b=JSON.parse(a.slice(6)),c=b.choices?.[0]?.delta?.audio?.data;c&&g.push(c)}catch{}}if(0===g.length)throw Error("OpenRouter TTS returned no audio data");return{base64:g.join(""),format:"wav"}}},gemini:{async synthesize(a,b,c,e,f={}){var g,h;let i,j;if(!c?.apiKey)throw Error("No Gemini API key configured");let{modelId:k,voiceId:l}=function(a){if(!a)return{modelId:F,voiceId:G};for(let b of H){if(a===b)return{modelId:b,voiceId:G};if(a.startsWith(`${b}/`))return{modelId:b,voiceId:a.slice(b.length+1)}}return{modelId:F,voiceId:a}}(b),m=`https://generativelanguage.googleapis.com/v1beta/models/${k}:generateContent?key=${c.apiKey}`,n=await fetch(m,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({contents:[{parts:[{text:(g=f.language,/:\s/.test(a)?a:g?`Say in ${g}: ${a}`:`Say: ${a}`)}]}],generationConfig:{responseModalities:["AUDIO"],speechConfig:{voiceConfig:{prebuiltVoiceConfig:{voiceName:l}}}}})});if(!n.ok){let a=await n.json().catch(()=>({}));throw Error(a?.error?.message||`Gemini TTS failed: ${n.status}`)}let o=await n.json(),p=o?.candidates?.[0]?.content?.parts?.find(a=>a.inlineData?.data)?.inlineData?.data;if(!p){let a=o?.candidates?.[0]?.finishReason||o?.promptFeedback?.blockReason||"unknown";throw Error(`Gemini TTS returned no audio (finishReason: ${a}, voice: ${l}, model: ${k})`)}return{base64:(i=(h=d.Buffer.from(p,"base64")).length,(j=d.Buffer.alloc(44)).write("RIFF",0),j.writeUInt32LE(36+i,4),j.write("WAVE",8),j.write("fmt ",12),j.writeUInt32LE(16,16),j.writeUInt16LE(1,20),j.writeUInt16LE(1,22),j.writeUInt32LE(24e3,24),j.writeUInt32LE(48e3,28),j.writeUInt16LE(2,32),j.writeUInt16LE(16,34),j.write("data",36),j.writeUInt32LE(i,40),d.Buffer.concat([j,h])).toString("base64"),format:"wav"}}}};async function M(a,b,d,e){let{AI_PROVIDERS:f}=await c.e(21).then(c.bind(c,50021)),g=f[a]?.ttsConfig;if(!g)return null;let h=K[g.format];if(!h)return null;let i=e?.apiKey;if("none"!==g.authType&&!i)throw Error(`${a} API key required`);let{modelId:j,voiceId:k}=function(a,b="",c="",d=[]){if(!a)return{modelId:b,voiceId:c};for(let b of d.map(a=>a.id||a).filter(Boolean).sort((a,b)=>b.length-a.length)){if(a===b)return{modelId:b,voiceId:c};if(a.startsWith(`${b}/`))return{modelId:b,voiceId:a.slice(b.length+1)}}let e=a.lastIndexOf("/");return e>0?{modelId:a.slice(0,e),voiceId:a.slice(e+1)}:{modelId:b||a,voiceId:c||a}}(d,g.models?.[0]?.id||"","",g.models||[]);return h({baseUrl:g.baseUrl,apiKey:i,text:b,modelId:j,voiceId:k})}let N={"edge-tts":r,"local-device":B,elevenlabs:E,gemini:J};function O(a,b,c){let e=d.Buffer.from(a,"base64");return"json"===c?{success:!0,response:new Response(JSON.stringify({audio:a,format:b}),{headers:{"Content-Type":"application/json","Access-Control-Allow-Origin":"*"}})}:{success:!0,response:new Response(e,{headers:{"Content-Type":`audio/${b}`,"Content-Length":String(e.length),"Access-Control-Allow-Origin":"*"}})}}async function P({provider:a,model:b,input:c,credentials:d,responseFormat:g="mp3",language:h}){if(!c?.trim())return(0,e.A1)(f.gx.BAD_REQUEST,"Missing required field: input");try{let i=L[a]||null;if(i){let a=await i.synthesize(c.trim(),b,d,g,{language:h});if(void 0!==a.success)return a;return O(a.base64,a.format,g)}let j=await M(a,c.trim(),b,d);if(j)return O(j.base64,j.format,g);return(0,e.A1)(f.gx.BAD_REQUEST,`Provider '${a}' does not support TTS via this route.`)}catch(a){return(0,e.A1)(f.gx.BAD_GATEWAY,a.message||"TTS synthesis failed")}}}};