zevairouter 1.0.104 → 1.0.106

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 (408) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +6 -2
  3. package/cli/app/.next-cli-build/BUILD_ID +1 -1
  4. package/cli/app/.next-cli-build/app-path-routes-manifest.json +11 -11
  5. package/cli/app/.next-cli-build/build-manifest.json +2 -2
  6. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/automation/page_client-reference-manifest.js +1 -1
  7. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  8. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  9. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  10. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  11. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  12. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/context/page_client-reference-manifest.js +1 -1
  13. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  14. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  15. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  16. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  17. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  18. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  19. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  20. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
  21. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  22. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  23. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  24. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  25. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  26. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -1
  27. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  28. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/terminal/page_client-reference-manifest.js +1 -1
  29. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  30. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  31. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  32. package/cli/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  33. package/cli/app/.next-cli-build/server/app/_global-error.html +1 -1
  34. package/cli/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  35. package/cli/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  36. package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  37. package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  38. package/cli/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
  39. package/cli/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
  40. package/cli/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  41. package/cli/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  42. package/cli/app/.next-cli-build/server/app/_not-found.html +1 -1
  43. package/cli/app/.next-cli-build/server/app/_not-found.rsc +4 -4
  44. package/cli/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +4 -4
  45. package/cli/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
  46. package/cli/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +4 -4
  47. package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  48. package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  49. package/cli/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  50. package/cli/app/.next-cli-build/server/app/api/models/route.js +1 -1
  51. package/cli/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
  52. package/cli/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
  53. package/cli/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  54. package/cli/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
  55. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  56. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  57. package/cli/app/.next-cli-build/server/app/api/version/route.js +1 -1
  58. package/cli/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  59. package/cli/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  60. package/cli/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  61. package/cli/app/.next-cli-build/server/app/callback.html +1 -1
  62. package/cli/app/.next-cli-build/server/app/callback.rsc +4 -4
  63. package/cli/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +4 -4
  64. package/cli/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
  65. package/cli/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +4 -4
  66. package/cli/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +2 -2
  67. package/cli/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  68. package/cli/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
  69. package/cli/app/.next-cli-build/server/app/dashboard/automation.html +1 -1
  70. package/cli/app/.next-cli-build/server/app/dashboard/automation.rsc +6 -6
  71. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation/__PAGE__.segment.rsc +2 -2
  72. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation.segment.rsc +1 -1
  73. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  74. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  75. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_full.segment.rsc +6 -6
  76. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_head.segment.rsc +1 -1
  77. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_index.segment.rsc +4 -4
  78. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_tree.segment.rsc +2 -2
  79. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  80. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +6 -6
  81. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  82. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  83. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  84. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  85. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +6 -6
  86. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  87. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +4 -4
  88. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
  89. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  90. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +6 -6
  91. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  92. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  93. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  94. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  95. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +6 -6
  96. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  97. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +4 -4
  98. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
  99. package/cli/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  100. package/cli/app/.next-cli-build/server/app/dashboard/combos.rsc +6 -6
  101. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  102. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  103. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  104. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  105. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +6 -6
  106. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  107. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +4 -4
  108. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
  109. package/cli/app/.next-cli-build/server/app/dashboard/context.html +1 -1
  110. package/cli/app/.next-cli-build/server/app/dashboard/context.rsc +6 -6
  111. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context/__PAGE__.segment.rsc +2 -2
  112. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context.segment.rsc +1 -1
  113. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  114. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  115. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_full.segment.rsc +6 -6
  116. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_head.segment.rsc +1 -1
  117. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_index.segment.rsc +4 -4
  118. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_tree.segment.rsc +2 -2
  119. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  120. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.rsc +6 -6
  121. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  122. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  123. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  124. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  125. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +6 -6
  126. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  127. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +4 -4
  128. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
  129. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  130. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +6 -6
  131. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  132. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  133. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  134. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  135. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  136. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +6 -6
  137. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  138. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +4 -4
  139. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +2 -2
  140. package/cli/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  141. package/cli/app/.next-cli-build/server/app/dashboard/mitm.rsc +6 -6
  142. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  143. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  144. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  145. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  146. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +6 -6
  147. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  148. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +4 -4
  149. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
  150. package/cli/app/.next-cli-build/server/app/dashboard/playground.html +1 -1
  151. package/cli/app/.next-cli-build/server/app/dashboard/playground.rsc +6 -6
  152. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground/__PAGE__.segment.rsc +2 -2
  153. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground.segment.rsc +1 -1
  154. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  155. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  156. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_full.segment.rsc +6 -6
  157. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_head.segment.rsc +1 -1
  158. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_index.segment.rsc +4 -4
  159. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_tree.segment.rsc +2 -2
  160. package/cli/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  161. package/cli/app/.next-cli-build/server/app/dashboard/profile.rsc +6 -6
  162. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  163. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  164. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  165. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  166. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +6 -6
  167. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  168. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +4 -4
  169. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
  170. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  171. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.rsc +6 -6
  172. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  173. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  174. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  175. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  176. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  177. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +6 -6
  178. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  179. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +4 -4
  180. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
  181. package/cli/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  182. package/cli/app/.next-cli-build/server/app/dashboard/providers.rsc +6 -6
  183. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  184. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  185. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  186. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  187. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +6 -6
  188. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  189. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +4 -4
  190. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
  191. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  192. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +6 -6
  193. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  194. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  195. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  196. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  197. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +6 -6
  198. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  199. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +4 -4
  200. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
  201. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.html +1 -1
  202. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.rsc +6 -6
  203. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +2 -2
  204. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe.segment.rsc +1 -1
  205. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  206. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  207. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_full.segment.rsc +6 -6
  208. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_head.segment.rsc +1 -1
  209. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_index.segment.rsc +4 -4
  210. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +2 -2
  211. package/cli/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
  212. package/cli/app/.next-cli-build/server/app/dashboard/quota.rsc +7 -7
  213. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  214. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  215. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  216. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  217. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +7 -7
  218. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  219. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +4 -4
  220. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
  221. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  222. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  223. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +4 -4
  224. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +4 -4
  225. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  226. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +4 -4
  227. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
  228. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  229. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  230. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  231. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  232. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  233. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.rsc +6 -6
  234. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +2 -2
  235. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver.segment.rsc +1 -1
  236. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  237. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  238. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +6 -6
  239. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_head.segment.rsc +1 -1
  240. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_index.segment.rsc +4 -4
  241. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +2 -2
  242. package/cli/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  243. package/cli/app/.next-cli-build/server/app/dashboard/translator.rsc +6 -6
  244. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  245. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  246. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  247. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  248. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +6 -6
  249. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  250. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +4 -4
  251. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
  252. package/cli/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  253. package/cli/app/.next-cli-build/server/app/dashboard/usage.rsc +6 -6
  254. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  255. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  256. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  257. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  258. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +6 -6
  259. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  260. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +4 -4
  261. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
  262. package/cli/app/.next-cli-build/server/app/dashboard.html +1 -1
  263. package/cli/app/.next-cli-build/server/app/dashboard.rsc +6 -6
  264. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  265. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  266. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  267. package/cli/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +6 -6
  268. package/cli/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
  269. package/cli/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +4 -4
  270. package/cli/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +2 -2
  271. package/cli/app/.next-cli-build/server/app/index.html +1 -1
  272. package/cli/app/.next-cli-build/server/app/index.rsc +4 -4
  273. package/cli/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  274. package/cli/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +4 -4
  275. package/cli/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
  276. package/cli/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +4 -4
  277. package/cli/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +2 -2
  278. package/cli/app/.next-cli-build/server/app/landing/page.js +1 -1
  279. package/cli/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  280. package/cli/app/.next-cli-build/server/app/landing.html +1 -1
  281. package/cli/app/.next-cli-build/server/app/landing.rsc +5 -5
  282. package/cli/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +5 -5
  283. package/cli/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
  284. package/cli/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +4 -4
  285. package/cli/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +2 -2
  286. package/cli/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +2 -2
  287. package/cli/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
  288. package/cli/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  289. package/cli/app/.next-cli-build/server/app/login.html +1 -1
  290. package/cli/app/.next-cli-build/server/app/login.rsc +5 -5
  291. package/cli/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +5 -5
  292. package/cli/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
  293. package/cli/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +4 -4
  294. package/cli/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +2 -2
  295. package/cli/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  296. package/cli/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
  297. package/cli/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  298. package/cli/app/.next-cli-build/server/app-paths-manifest.json +11 -11
  299. package/cli/app/.next-cli-build/server/chunks/3155.js +1 -1
  300. package/cli/app/.next-cli-build/server/chunks/3407.js +1 -1
  301. package/cli/app/.next-cli-build/server/chunks/412.js +2 -2
  302. package/cli/app/.next-cli-build/server/chunks/4746.js +1 -1
  303. package/cli/app/.next-cli-build/server/chunks/5469.js +1 -1
  304. package/cli/app/.next-cli-build/server/chunks/6896.js +1 -1
  305. package/cli/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  306. package/cli/app/.next-cli-build/server/pages/404.html +1 -1
  307. package/cli/app/.next-cli-build/server/pages/500.html +1 -1
  308. package/cli/app/.next-cli-build/static/chunks/{3702-71ea2cb15f471160.js → 3702-5f034d6da865ad7a.js} +1 -1
  309. package/cli/app/.next-cli-build/static/chunks/5497-cd29d71de5a0d443.js +7 -0
  310. package/cli/app/.next-cli-build/static/chunks/9126-2efa8985d72b10b7.js +1 -0
  311. package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/{page-16cab1ed7e707419.js → page-a2d55f0103564e42.js} +1 -1
  312. package/cli/app/.next-cli-build/static/chunks/app/landing/page-a5bcf36367dce737.js +1 -0
  313. package/cli/app/.next-cli-build/static/css/b2b993ebf3c2ebd5.css +1 -0
  314. package/cli/app/CHANGELOG.md +44 -0
  315. package/cli/app/package.json +7 -2
  316. package/cli/package.json +1 -1
  317. package/open-sse/handlers/embeddingProviders/gemini.js +4 -1
  318. package/open-sse/handlers/embeddingProviders/openaiCompatNode.js +4 -1
  319. package/open-sse/handlers/imageProviders/blackForestLabs.js +4 -1
  320. package/open-sse/handlers/imageProviders/cloudflareAi.js +4 -1
  321. package/open-sse/handlers/imageProviders/codex.js +4 -1
  322. package/open-sse/handlers/imageProviders/comfyui.js +4 -1
  323. package/open-sse/handlers/imageProviders/falAi.js +4 -1
  324. package/open-sse/handlers/imageProviders/gemini.js +4 -1
  325. package/open-sse/handlers/imageProviders/huggingface.js +4 -1
  326. package/open-sse/handlers/imageProviders/nanobanana.js +4 -1
  327. package/open-sse/handlers/imageProviders/runwayml.js +4 -1
  328. package/open-sse/handlers/imageProviders/sdwebui.js +4 -1
  329. package/open-sse/handlers/imageProviders/stabilityAi.js +4 -1
  330. package/open-sse/handlers/ttsProviders/edgeTts.js +4 -1
  331. package/open-sse/handlers/ttsProviders/elevenlabs.js +4 -1
  332. package/open-sse/handlers/ttsProviders/gemini.js +4 -1
  333. package/open-sse/handlers/ttsProviders/googleTts.js +4 -1
  334. package/open-sse/handlers/ttsProviders/localDevice.js +4 -1
  335. package/open-sse/handlers/ttsProviders/openai.js +4 -1
  336. package/open-sse/handlers/ttsProviders/openrouter.js +4 -1
  337. package/open-sse/utils/cursorChecksum.js +4 -1
  338. package/open-sse/utils/cursorProtobuf.js +4 -1
  339. package/package.json +7 -2
  340. package/src/app/(dashboard)/dashboard/automation/page.js +3 -0
  341. package/src/app/(dashboard)/dashboard/basic-chat/BasicChatPageClient.js +8 -1
  342. package/src/app/(dashboard)/dashboard/cli-tools/components/AntigravityToolCard.js +6 -0
  343. package/src/app/(dashboard)/dashboard/cli-tools/components/BaseUrlSelect.js +2 -0
  344. package/src/app/(dashboard)/dashboard/cli-tools/components/ClaudeToolCard.js +6 -0
  345. package/src/app/(dashboard)/dashboard/cli-tools/components/ClineToolCard.js +6 -0
  346. package/src/app/(dashboard)/dashboard/cli-tools/components/CodexToolCard.js +7 -0
  347. package/src/app/(dashboard)/dashboard/cli-tools/components/CopilotToolCard.js +7 -0
  348. package/src/app/(dashboard)/dashboard/cli-tools/components/CoworkToolCard.js +6 -0
  349. package/src/app/(dashboard)/dashboard/cli-tools/components/DeepSeekTuiToolCard.js +6 -0
  350. package/src/app/(dashboard)/dashboard/cli-tools/components/DroidToolCard.js +6 -0
  351. package/src/app/(dashboard)/dashboard/cli-tools/components/EndpointPresetControl.js +1 -0
  352. package/src/app/(dashboard)/dashboard/cli-tools/components/HermesToolCard.js +6 -0
  353. package/src/app/(dashboard)/dashboard/cli-tools/components/JcodeToolCard.js +6 -0
  354. package/src/app/(dashboard)/dashboard/cli-tools/components/KiloToolCard.js +5 -0
  355. package/src/app/(dashboard)/dashboard/cli-tools/components/MitmToolCard.js +2 -0
  356. package/src/app/(dashboard)/dashboard/cli-tools/components/OpenClawToolCard.js +6 -0
  357. package/src/app/(dashboard)/dashboard/cli-tools/components/OpenCodeToolCard.js +6 -0
  358. package/src/app/(dashboard)/dashboard/combos/page.js +3 -0
  359. package/src/app/(dashboard)/dashboard/context/page.js +1 -0
  360. package/src/app/(dashboard)/dashboard/endpoint/EndpointPageClient.js +7 -0
  361. package/src/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js +10 -0
  362. package/src/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +3 -0
  363. package/src/app/(dashboard)/dashboard/mitm/MitmPageClient.js +4 -0
  364. package/src/app/(dashboard)/dashboard/profile/page.js +2 -0
  365. package/src/app/(dashboard)/dashboard/providers/[id]/AddCustomModelModal.js +1 -0
  366. package/src/app/(dashboard)/dashboard/providers/[id]/ConnectionRow.js +1 -0
  367. package/src/app/(dashboard)/dashboard/providers/[id]/EditCompatibleNodeModal.js +1 -0
  368. package/src/app/(dashboard)/dashboard/providers/[id]/page.js +4 -0
  369. package/src/app/(dashboard)/dashboard/providers/[id]/page.new.js +8 -6
  370. package/src/app/(dashboard)/dashboard/providers/components/ConnectionsCard.js +2 -0
  371. package/src/app/(dashboard)/dashboard/providers/components/ModelAvailabilityBadge.js +1 -0
  372. package/src/app/(dashboard)/dashboard/providers/components/ModelsCard.js +1 -0
  373. package/src/app/(dashboard)/dashboard/providers/page.js +9 -1
  374. package/src/app/(dashboard)/dashboard/proxy-pools/page.js +4 -1
  375. package/src/app/(dashboard)/dashboard/pxpipe/PxpipeClient.js +1 -0
  376. package/src/app/(dashboard)/dashboard/terminal/TerminalPageClient.js +1 -0
  377. package/src/app/(dashboard)/dashboard/token-saver/TokenSaverClient.js +3 -0
  378. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaTable.js +2 -0
  379. package/src/app/(dashboard)/dashboard/usage/components/ProviderTopology.js +11 -6
  380. package/src/app/(dashboard)/dashboard/usage/components/RequestDetailsTab.js +2 -0
  381. package/src/app/(dashboard)/dashboard/usage/components/UsageChart.js +1 -0
  382. package/src/app/(dashboard)/dashboard/usage/components/UsageTable.js +1 -0
  383. package/src/app/api/oauth/cursor/auto-import/route.js +0 -1
  384. package/src/app/callback/page.js +1 -0
  385. package/src/app/dashboard/settings/pricing/page.js +1 -0
  386. package/src/lib/db/migrations/001-initial.js +4 -1
  387. package/src/shared/components/AddCustomEmbeddingModal.js +1 -0
  388. package/src/shared/components/BulkAccountAutomationModal.js +3 -1
  389. package/src/shared/components/ChangelogModal.js +1 -0
  390. package/src/shared/components/CursorAuthModal.js +1 -0
  391. package/src/shared/components/EditConnectionModal.js +1 -0
  392. package/src/shared/components/HeaderLanguage.js +1 -0
  393. package/src/shared/components/KiroAuthModal.js +1 -0
  394. package/src/shared/components/KiroOAuthWrapper.js +1 -0
  395. package/src/shared/components/LanguageSwitcher.js +2 -0
  396. package/src/shared/components/McpMarketplaceModal.js +1 -1
  397. package/src/shared/components/ModelSelectModal.js +10 -6
  398. package/src/shared/components/OAuthModal.js +3 -1
  399. package/src/shared/components/PricingModal.js +1 -0
  400. package/src/shared/components/ProviderIcon.js +8 -3
  401. package/src/shared/components/RequestLogger.js +1 -0
  402. package/src/shared/components/Sidebar.js +1 -0
  403. package/cli/app/.next-cli-build/static/chunks/5497-667e14237552c864.js +0 -7
  404. package/cli/app/.next-cli-build/static/chunks/9126-5dc2ccda07a8c55e.js +0 -1
  405. package/cli/app/.next-cli-build/static/chunks/app/landing/page-6621ec8b157e77cc.js +0 -1
  406. package/cli/app/.next-cli-build/static/css/c7077ef89735a356.css +0 -1
  407. /package/cli/app/.next-cli-build/static/{CsjKSx0C8GBhUjd-ob2F9 → cfUGr8kYmZvImlaBuzL9m}/_buildManifest.js +0 -0
  408. /package/cli/app/.next-cli-build/static/{CsjKSx0C8GBhUjd-ob2F9 → cfUGr8kYmZvImlaBuzL9m}/_ssgManifest.js +0 -0
@@ -10,7 +10,7 @@ function modelToEndpoint(model) {
10
10
  return "core";
11
11
  }
12
12
 
13
- export default {
13
+ const stabilityAi = {
14
14
  buildUrl: (model) => `${BASE_URL}/${modelToEndpoint(model)}`,
15
15
  buildHeaders: (creds) => {
16
16
  const key = creds?.apiKey || creds?.accessToken;
@@ -32,3 +32,6 @@ export default {
32
32
  return { created: nowSec(), data: [] };
33
33
  },
34
34
  };
35
+
36
+
37
+ export default stabilityAi;
@@ -63,7 +63,7 @@ export async function fetchEdgeTtsVoices() {
63
63
  return voices;
64
64
  }
65
65
 
66
- export default {
66
+ const edgeTts = {
67
67
  noAuth: true,
68
68
  async synthesize(text, model) {
69
69
  const voiceId = model || "vi-VN-HoaiMyNeural";
@@ -87,3 +87,6 @@ export default {
87
87
  return { base64: Buffer.from(buf).toString("base64"), format: "mp3" };
88
88
  },
89
89
  };
90
+
91
+
92
+ export default edgeTts;
@@ -21,7 +21,7 @@ export async function fetchElevenLabsVoices(apiKey) {
21
21
  return voices;
22
22
  }
23
23
 
24
- export default {
24
+ const elevenlabs = {
25
25
  async synthesize(text, model, credentials) {
26
26
  if (!credentials?.apiKey) throw new Error("ElevenLabs API key required");
27
27
  let modelId = "eleven_flash_v2_5";
@@ -46,3 +46,6 @@ export default {
46
46
  return { base64: Buffer.from(buf).toString("base64"), format: "mp3" };
47
47
  },
48
48
  };
49
+
50
+
51
+ export default elevenlabs;
@@ -47,7 +47,7 @@ function buildPrompt(text, language) {
47
47
  return language ? `Say in ${language}: ${text}` : `Say: ${text}`;
48
48
  }
49
49
 
50
- export default {
50
+ const gemini = {
51
51
  async synthesize(text, model, credentials, _responseFormat, opts = {}) {
52
52
  if (!credentials?.apiKey) throw new Error("No Gemini API key configured");
53
53
  const { modelId, voiceId } = parseGeminiModelVoice(model);
@@ -115,3 +115,6 @@ const PREBUILT_VOICES = [
115
115
  export async function fetchGeminiVoices() {
116
116
  return PREBUILT_VOICES.map((v) => ({ voice_id: v.id, name: v.id, labels: { language: v.lang, gender: v.gender } }));
117
117
  }
118
+
119
+
120
+ export default gemini;
@@ -19,7 +19,7 @@ async function getToken() {
19
19
  return cache.token;
20
20
  }
21
21
 
22
- export default {
22
+ const googleTts = {
23
23
  noAuth: true,
24
24
  async synthesize(text, model) {
25
25
  const lang = model || "en";
@@ -52,3 +52,6 @@ export default {
52
52
  return { base64, format: "mp3" };
53
53
  },
54
54
  };
55
+
56
+
57
+ export default googleTts;
@@ -78,10 +78,13 @@ async function synthesizeMacOrWin(text, voiceId) {
78
78
  }
79
79
  }
80
80
 
81
- export default {
81
+ const localDevice = {
82
82
  noAuth: true,
83
83
  async synthesize(text, model) {
84
84
  const base64 = await synthesizeMacOrWin(text, model);
85
85
  return { base64, format: "mp3" };
86
86
  },
87
87
  };
88
+
89
+
90
+ export default localDevice;
@@ -1,7 +1,7 @@
1
1
  // OpenAI TTS — model format: "tts-model/voice"
2
2
  import { Buffer } from "node:buffer";
3
3
 
4
- export default {
4
+ const openai = {
5
5
  async synthesize(text, model, credentials) {
6
6
  if (!credentials?.apiKey) throw new Error("No OpenAI API key configured");
7
7
 
@@ -28,3 +28,6 @@ export default {
28
28
  return { base64: Buffer.from(buf).toString("base64"), format: "mp3" };
29
29
  },
30
30
  };
31
+
32
+
33
+ export default openai;
@@ -1,5 +1,5 @@
1
1
  // OpenRouter TTS — via chat completions + audio modality (SSE stream)
2
- export default {
2
+ const openrouter = {
3
3
  async synthesize(text, model, credentials) {
4
4
  if (!credentials?.apiKey) throw new Error("No OpenRouter API key configured");
5
5
 
@@ -68,3 +68,6 @@ export default {
68
68
  return { base64: chunks.join(""), format: "wav" };
69
69
  },
70
70
  };
71
+
72
+
73
+ export default openrouter;
@@ -141,9 +141,12 @@ export function buildCursorHeaders(accessToken, machineId = null, ghostMode = tr
141
141
  };
142
142
  }
143
143
 
144
- export default {
144
+ const cursorChecksum = {
145
145
  generateCursorChecksum,
146
146
  buildCursorHeaders,
147
147
  generateHashed64Hex,
148
148
  generateSessionId
149
149
  };
150
+
151
+
152
+ export default cursorChecksum;
@@ -889,7 +889,7 @@ export function extractTextFromResponse(payload) {
889
889
 
890
890
  // ==================== EXPORTS ====================
891
891
 
892
- export default {
892
+ const cursorProtobuf = {
893
893
  encodeVarint,
894
894
  encodeField,
895
895
  encodeMessage,
@@ -902,3 +902,6 @@ export default {
902
902
  parseConnectRPCFrame,
903
903
  extractTextFromResponse
904
904
  };
905
+
906
+
907
+ export default cursorProtobuf;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zevairouter",
3
- "version": "1.0.104",
3
+ "version": "1.0.106",
4
4
  "description": "Self-hosted AI router: many providers, one OpenAI-compatible /v1 endpoint and dashboard",
5
5
  "bin": {
6
6
  "zevai": "./cli/cli.js"
@@ -68,13 +68,18 @@
68
68
  "zustand": "^5.0.10"
69
69
  },
70
70
  "comment_optional_runtime": "Heavy packages are NOT optionalDependencies (clean `npm i -g`, no deprecated noise). postinstall warm-ups them into ~/.zevai/runtime so one command still gets full features. ZEVAI_MINIMAL_POSTINSTALL=1 skips browser downloads. Runtime code can still lazy-retry: better-sqlite3, camoufox-js, cloakbrowser, node-pty, playwright.",
71
+ "overrides": {
72
+ "dompurify": "^3.4.12",
73
+ "postcss": "^8.5.10"
74
+ },
75
+ "comment_overrides": "dompurify: monaco-editor@0.55.1 pins vulnerable dompurify@3.2.7 (multiple mXSS advisories, all fixed in 3.4.x). Override forces the patched 3.4.12 until monaco ships a stable release with the fix (currently only in 0.56.0-dev). We don't use dompurify directly; monaco only uses it to sanitize HTML hover/completion output.",
71
76
  "devDependencies": {
72
77
  "@tailwindcss/postcss": "^4.1.18",
73
78
  "better-sqlite3": "^12.6.2",
74
79
  "esbuild": "^0.28.1",
75
80
  "eslint": "^9",
76
81
  "eslint-config-next": "16.2.9",
77
- "postcss": "^8.5.6",
82
+ "postcss": "^8.5.10",
78
83
  "tailwindcss": "^4"
79
84
  },
80
85
  "engines": {
@@ -1,4 +1,5 @@
1
1
  "use client";
2
+ /* eslint-disable @next/next/no-img-element -- dynamic/blob/external image src with onError fallback; next/image requires static dims + domain allowlist */
2
3
 
3
4
  import { useCallback, useEffect, useMemo, useState } from "react";
4
5
  import { Badge, Button, BulkAccountAutomationModal, Card, CardSkeleton, CodeBuddyCnPhoneRegisterModal, KiroOAuthWrapper, OAuthModal } from "@/shared/components";
@@ -777,6 +778,7 @@ export default function AutomationPage() {
777
778
  }, []);
778
779
 
779
780
  useEffect(() => {
781
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- mount data fetch; fetchConnections sets state only after await, which the rule flags conservatively
780
782
  fetchConnections();
781
783
  }, [fetchConnections]);
782
784
 
@@ -784,6 +786,7 @@ export default function AutomationPage() {
784
786
  if (typeof window === "undefined") return;
785
787
  const requestedProvider = new URLSearchParams(window.location.search).get("provider");
786
788
  if (AUTOMATION_PROVIDERS.some((provider) => provider.id === requestedProvider)) {
789
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- one-time mount initialization from URL query param (external source, client-only)
787
790
  setActiveProviderId(requestedProvider);
788
791
  }
789
792
  }, []);
@@ -1,4 +1,5 @@
1
1
  "use client";
2
+ /* eslint-disable @next/next/no-img-element -- dynamic/blob/external image src with onError fallback; next/image requires static dims + domain allowlist */
2
3
 
3
4
  import { useEffect, useMemo, useRef, useState } from "react";
4
5
  import { marked } from "marked";
@@ -19,6 +20,10 @@ const STORAGE_KEYS = {
19
20
  systemPrompt: "basic-chat.systemPrompt",
20
21
  };
21
22
 
23
+ // Stable empty array — avoids creating a new [] every render when there's no
24
+ // active session, which would otherwise churn effects/memos keyed on messages.
25
+ const EMPTY_MESSAGES = [];
26
+
22
27
  const SUGGESTIONS = [
23
28
  "Explain this project like I'm new",
24
29
  "Write a concise PR description",
@@ -292,6 +297,7 @@ export default function BasicChatPageClient() {
292
297
  const messagesEndRef = useRef(null);
293
298
 
294
299
  useEffect(() => {
300
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- hydration gate: flags client mount so lazy localStorage reads (in useState initializers) only persist after hydration
295
301
  setIsHydrated(true);
296
302
  }, []);
297
303
 
@@ -478,7 +484,7 @@ export default function BasicChatPageClient() {
478
484
  }, [activeModelId, modelIndex, activeProviderGroup, sessions, activeSessionId]);
479
485
 
480
486
  const currentSession = useMemo(() => sessions.find((session) => session.id === activeSessionId) || null, [sessions, activeSessionId]);
481
- const currentMessages = currentSession?.messages || [];
487
+ const currentMessages = currentSession?.messages || EMPTY_MESSAGES;
482
488
  const sessionItems = useMemo(() => [...sessions].sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()), [sessions]);
483
489
  const canSend = !isSending && !!activeModel && (draft.trim().length > 0 || attachments.length > 0);
484
490
 
@@ -509,6 +515,7 @@ export default function BasicChatPageClient() {
509
515
  ? modelIndex.get(session.modelId)
510
516
  : savedModel;
511
517
  initializedRef.current = true;
518
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- one-time session/model reconciliation after async data load, guarded by initializedRef
512
519
  setActiveSessionId(session.id);
513
520
  setActiveProviderId(sessionModel?.providerId || savedProvider.providerId);
514
521
  setActiveModelId(sessionModel?.id || savedModel.id);
@@ -29,24 +29,30 @@ export default function AntigravityToolCard({
29
29
 
30
30
  useEffect(() => {
31
31
  if (apiKeys?.length > 0 && !selectedApiKey) {
32
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- controlled/uncontrolled hybrid: default selection from apiKeys prop, user can change it independently
32
33
  setSelectedApiKey(apiKeys[0].key);
33
34
  }
34
35
  }, [apiKeys, selectedApiKey]);
35
36
 
36
37
  useEffect(() => {
38
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: mirrors initialStatus prop, but status is also updated independently by fetch/user actions
37
39
  if (initialStatus) setStatus(initialStatus);
38
40
  }, [initialStatus]);
39
41
 
40
42
  useEffect(() => {
41
43
  if (isExpanded && !status) {
44
+ // eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
42
45
  fetchStatus();
46
+ // eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
43
47
  loadSavedMappings();
48
+ // eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
44
49
  fetchModelAliases();
45
50
  }
46
51
  if (isExpanded) {
47
52
  loadSavedMappings();
48
53
  fetchModelAliases();
49
54
  }
55
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest status (adding it would re-trigger on every change)
50
56
  }, [isExpanded]);
51
57
 
52
58
  const loadSavedMappings = async () => {
@@ -73,6 +73,7 @@ export default function BaseUrlSelect({
73
73
  const initializedRef = useRef(false);
74
74
 
75
75
  useEffect(() => {
76
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- one-time mount initialization from localStorage (external store), intentionally client-only
76
77
  setSavedPresets(readSavedPresets());
77
78
  }, []);
78
79
 
@@ -88,6 +89,7 @@ export default function BaseUrlSelect({
88
89
  initializedRef.current = true;
89
90
  const first = options.find((o) => o.value !== CUSTOM_VALUE);
90
91
  if (first) {
92
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- one-time default selection guarded by initializedRef; options depend on async localStorage presets so it cannot be derived during initial render
91
93
  setMode(first.value);
92
94
  onChange(first.url);
93
95
  } else {
@@ -53,20 +53,25 @@ export default function ClaudeToolCard({
53
53
 
54
54
  useEffect(() => {
55
55
  if (apiKeys?.length > 0 && !selectedApiKey) {
56
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- controlled/uncontrolled hybrid: default selection from apiKeys prop, user can change it independently
56
57
  setSelectedApiKey(apiKeys[0].key);
57
58
  }
58
59
  }, [apiKeys, selectedApiKey]);
59
60
 
60
61
  useEffect(() => {
62
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: mirrors initialStatus prop, but claudeStatus is also updated independently by fetch/user actions
61
63
  if (initialStatus) setClaudeStatus(initialStatus);
62
64
  }, [initialStatus]);
63
65
 
64
66
  useEffect(() => {
65
67
  if (isExpanded && !claudeStatus) {
68
+ // eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
66
69
  checkClaudeStatus();
70
+ // eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
67
71
  fetchModelAliases();
68
72
  }
69
73
  if (isExpanded) fetchModelAliases();
74
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest claudeStatus (adding it would re-trigger on every change)
70
75
  }, [isExpanded]);
71
76
 
72
77
  useEffect(() => {
@@ -112,6 +117,7 @@ export default function ClaudeToolCard({
112
117
  // Only set selectedApiKey if it exists in apiKeys list
113
118
  const tokenFromFile = env.ANTHROPIC_AUTH_TOKEN;
114
119
  if (tokenFromFile && apiKeys?.some(k => k.key === tokenFromFile)) {
120
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- one-time pre-fill from fetched config file, guarded by hasInitializedModels ref
115
121
  setSelectedApiKey(tokenFromFile);
116
122
  }
117
123
  }
@@ -22,22 +22,28 @@ export default function ClineToolCard({ tool, isExpanded, onToggle, baseUrl, api
22
22
  const [customBaseUrl, setCustomBaseUrl] = useState("");
23
23
 
24
24
  useEffect(() => {
25
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- controlled/uncontrolled hybrid: default selection from apiKeys prop, user can change it independently
25
26
  if (apiKeys?.length > 0 && !selectedApiKey) setSelectedApiKey(apiKeys[0].key);
26
27
  }, [apiKeys, selectedApiKey]);
27
28
 
28
29
  useEffect(() => {
30
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: mirrors initialStatus prop, but status is also updated independently by fetch/user actions
29
31
  if (initialStatus) setStatus(initialStatus);
30
32
  }, [initialStatus]);
31
33
 
32
34
  useEffect(() => {
33
35
  if (isExpanded && !status) {
36
+ // eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
34
37
  checkStatus();
38
+ // eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
35
39
  fetchModelAliases();
36
40
  }
37
41
  if (isExpanded) fetchModelAliases();
42
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest status (adding it would re-trigger on every change)
38
43
  }, [isExpanded]);
39
44
 
40
45
  useEffect(() => {
46
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- sync from fetched tool config: pre-fills selectedModel, which the user can also change via the model modal
41
47
  if (status?.settings?.openAiModelId) setSelectedModel(status.settings.openAiModelId);
42
48
  }, [status]);
43
49
 
@@ -27,24 +27,30 @@ export default function CodexToolCard({ tool, isExpanded, onToggle, baseUrl, api
27
27
 
28
28
  useEffect(() => {
29
29
  if (apiKeys?.length > 0 && !selectedApiKey) {
30
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- controlled/uncontrolled hybrid: default selection from apiKeys prop, user can change it independently
30
31
  setSelectedApiKey(apiKeys[0].key);
31
32
  }
32
33
  }, [apiKeys, selectedApiKey]);
33
34
 
34
35
  useEffect(() => {
36
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: mirrors initialStatus prop, but codexStatus is also updated independently by fetch/user actions
35
37
  if (initialStatus) setCodexStatus(initialStatus);
36
38
  }, [initialStatus]);
37
39
 
38
40
  useEffect(() => {
39
41
  if (isExpanded && !codexStatus) {
42
+ // eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
40
43
  checkCodexStatus();
44
+ // eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
41
45
  fetchModelAliases();
46
+ // eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
42
47
  fetchGatewayAccounts();
43
48
  }
44
49
  if (isExpanded) {
45
50
  fetchModelAliases();
46
51
  fetchGatewayAccounts();
47
52
  }
53
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest codexStatus (adding it would re-trigger on every change)
48
54
  }, [isExpanded]);
49
55
 
50
56
  const fetchModelAliases = async () => {
@@ -74,6 +80,7 @@ export default function CodexToolCard({ tool, isExpanded, onToggle, baseUrl, api
74
80
  useEffect(() => {
75
81
  if (codexStatus?.config) {
76
82
  const modelMatch = codexStatus.config.match(/^model\s*=\s*"([^"]+)"/m);
83
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- sync from fetched tool config: pre-fills selectedModel, which the user can also change via the model modal
77
84
  if (modelMatch) setSelectedModel(modelMatch[1]);
78
85
 
79
86
  // Parse subagent settings
@@ -27,20 +27,25 @@ export default function CopilotToolCard({ tool, isExpanded, onToggle, baseUrl, a
27
27
 
28
28
  useEffect(() => {
29
29
  if (apiKeys?.length > 0 && !selectedApiKey) {
30
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- controlled/uncontrolled hybrid: default selection from apiKeys prop, user can change it independently
30
31
  setSelectedApiKey(apiKeys[0].key);
31
32
  }
32
33
  }, [apiKeys, selectedApiKey]);
33
34
 
34
35
  useEffect(() => {
36
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: mirrors initialStatus prop, but status is also updated independently by fetch/user actions
35
37
  if (initialStatus) setStatus(initialStatus);
36
38
  }, [initialStatus]);
37
39
 
38
40
  useEffect(() => {
39
41
  if (isExpanded && !status) {
42
+ // eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
40
43
  checkStatus();
44
+ // eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
41
45
  fetchModelAliases();
42
46
  }
43
47
  if (isExpanded) fetchModelAliases();
48
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest status (adding it would re-trigger on every change)
44
49
  }, [isExpanded]);
45
50
 
46
51
  // Pre-fill from existing config
@@ -48,9 +53,11 @@ export default function CopilotToolCard({ tool, isExpanded, onToggle, baseUrl, a
48
53
  if (status?.config && Array.isArray(status.config) && selectedModels.length === 0) {
49
54
  const entry = status.config.find((e) => e.name === "ZevaiRouter");
50
55
  if (entry?.models?.length > 0) {
56
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- one-time pre-fill from fetched tool config (only when user has made no selection), user edits models independently afterwards
51
57
  setSelectedModels(entry.models.map((m) => m.id));
52
58
  }
53
59
  }
60
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [status]; read latest selectedModels.length (adding it would re-trigger on every change)
54
61
  }, [status]);
55
62
 
56
63
  const fetchModelAliases = async () => {
@@ -52,16 +52,20 @@ export default function CoworkToolCard({
52
52
 
53
53
  useEffect(() => {
54
54
  if (apiKeys?.length > 0 && !selectedApiKey) {
55
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- controlled/uncontrolled hybrid: default selection from apiKeys prop, user can change it independently
55
56
  setSelectedApiKey(apiKeys[0].key);
56
57
  }
57
58
  }, [apiKeys, selectedApiKey]);
58
59
 
59
60
  useEffect(() => {
61
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: mirrors initialStatus prop, but status is also updated independently by fetch/user actions
60
62
  if (initialStatus) setStatus(initialStatus);
61
63
  }, [initialStatus]);
62
64
 
63
65
  useEffect(() => {
66
+ // eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
64
67
  if (isExpanded && !status) checkStatus();
68
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest status (adding it would re-trigger on every change)
65
69
  }, [isExpanded]);
66
70
 
67
71
  useEffect(() => {
@@ -76,6 +80,7 @@ export default function CoworkToolCard({
76
80
 
77
81
  useEffect(() => {
78
82
  if (status?.cowork?.models?.length) {
83
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- sync from fetched tool config: pre-fills selectedModels, which the user can also edit independently
79
84
  setSelectedModels(status.cowork.models);
80
85
  }
81
86
  if (status?.cowork?.baseUrl && !customBaseUrl) {
@@ -93,6 +98,7 @@ export default function CoworkToolCard({
93
98
  if (Array.isArray(status?.cowork?.customPlugins) && status.cowork.customPlugins.length > 0) {
94
99
  setCustomPlugins(status.cowork.customPlugins);
95
100
  }
101
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [status]; read latest customBaseUrl (adding it would re-trigger on every change)
96
102
  }, [status]);
97
103
 
98
104
  const checkStatus = async () => {
@@ -49,20 +49,25 @@ export default function DeepSeekTuiToolCard({
49
49
 
50
50
  useEffect(() => {
51
51
  if (apiKeys?.length > 0 && !selectedApiKey) {
52
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- controlled/uncontrolled hybrid: default selection from apiKeys prop, user can change it independently
52
53
  setSelectedApiKey(apiKeys[0].key);
53
54
  }
54
55
  }, [apiKeys, selectedApiKey]);
55
56
 
56
57
  useEffect(() => {
58
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: mirrors initialStatus prop, but deepseekStatus is also updated independently by fetch/user actions
57
59
  if (initialStatus) setDeepseekStatus(initialStatus);
58
60
  }, [initialStatus]);
59
61
 
60
62
  useEffect(() => {
61
63
  if (isExpanded && !deepseekStatus) {
64
+ // eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
62
65
  checkStatus();
66
+ // eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
63
67
  fetchModelAliases();
64
68
  }
65
69
  if (isExpanded) fetchModelAliases();
70
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest deepseekStatus (adding it would re-trigger on every change)
66
71
  }, [isExpanded]);
67
72
 
68
73
  const fetchModelAliases = async () => {
@@ -79,6 +84,7 @@ export default function DeepSeekTuiToolCard({
79
84
  if (deepseekStatus?.installed && !hasInitializedModel.current) {
80
85
  hasInitializedModel.current = true;
81
86
  const openaiSection = deepseekStatus.settings?.["providers.openai"];
87
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- one-time pre-fill from fetched tool config, guarded by hasInitializedModel ref
82
88
  if (openaiSection?.model) setSelectedModel(openaiSection.model);
83
89
  }
84
90
  }, [deepseekStatus]);
@@ -56,20 +56,25 @@ export default function DroidToolCard({
56
56
 
57
57
  useEffect(() => {
58
58
  if (apiKeys?.length > 0 && !selectedApiKey) {
59
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- controlled/uncontrolled hybrid: default selection from apiKeys prop, user can change it independently
59
60
  setSelectedApiKey(apiKeys[0].key);
60
61
  }
61
62
  }, [apiKeys, selectedApiKey]);
62
63
 
63
64
  useEffect(() => {
65
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: mirrors initialStatus prop, but droidStatus is also updated independently by fetch/user actions
64
66
  if (initialStatus) setDroidStatus(initialStatus);
65
67
  }, [initialStatus]);
66
68
 
67
69
  useEffect(() => {
68
70
  if (isExpanded && !droidStatus) {
71
+ // eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
69
72
  checkDroidStatus();
73
+ // eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
70
74
  fetchModelAliases();
71
75
  }
72
76
  if (isExpanded) fetchModelAliases();
77
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest droidStatus (adding it would re-trigger on every change)
73
78
  }, [isExpanded]);
74
79
 
75
80
  const fetchModelAliases = async () => {
@@ -91,6 +96,7 @@ export default function DroidToolCard({
91
96
  .sort((a, b) => (a.index || 0) - (b.index || 0))
92
97
  .map(m => m.model);
93
98
  if (existingModels.length > 0) {
99
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- one-time pre-fill from fetched tool config, guarded by hasInitializedModel ref
94
100
  setModelList(existingModels);
95
101
  } else {
96
102
  // Legacy: single model stored as custom:Zevai-0
@@ -39,6 +39,7 @@ export default function EndpointPresetControl({
39
39
  const [selectedName, setSelectedName] = useState("");
40
40
 
41
41
  useEffect(() => {
42
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- one-time mount initialization from localStorage (external store), intentionally client-only
42
43
  setPresets(readPresets());
43
44
  }, []);
44
45
 
@@ -49,20 +49,25 @@ export default function HermesToolCard({
49
49
 
50
50
  useEffect(() => {
51
51
  if (apiKeys?.length > 0 && !selectedApiKey) {
52
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- controlled/uncontrolled hybrid: default selection from apiKeys prop, user can change it independently
52
53
  setSelectedApiKey(apiKeys[0].key);
53
54
  }
54
55
  }, [apiKeys, selectedApiKey]);
55
56
 
56
57
  useEffect(() => {
58
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: mirrors initialStatus prop, but hermesStatus is also updated independently by fetch/user actions
57
59
  if (initialStatus) setHermesStatus(initialStatus);
58
60
  }, [initialStatus]);
59
61
 
60
62
  useEffect(() => {
61
63
  if (isExpanded && !hermesStatus) {
64
+ // eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
62
65
  checkStatus();
66
+ // eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
63
67
  fetchModelAliases();
64
68
  }
65
69
  if (isExpanded) fetchModelAliases();
70
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest hermesStatus (adding it would re-trigger on every change)
66
71
  }, [isExpanded]);
67
72
 
68
73
  const fetchModelAliases = async () => {
@@ -79,6 +84,7 @@ export default function HermesToolCard({
79
84
  if (hermesStatus?.installed && !hasInitializedModel.current) {
80
85
  hasInitializedModel.current = true;
81
86
  const cfg = hermesStatus.settings?.model;
87
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- one-time pre-fill from fetched tool config, guarded by hasInitializedModel ref
82
88
  if (cfg?.default) setSelectedModel(cfg.default);
83
89
  }
84
90
  }, [hermesStatus]);
@@ -47,20 +47,25 @@ export default function JcodeToolCard({
47
47
 
48
48
  useEffect(() => {
49
49
  if (apiKeys?.length > 0 && !selectedApiKey) {
50
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- controlled/uncontrolled hybrid: default selection from apiKeys prop, user can change it independently
50
51
  setSelectedApiKey(apiKeys[0].key);
51
52
  }
52
53
  }, [apiKeys, selectedApiKey]);
53
54
 
54
55
  useEffect(() => {
56
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: mirrors initialStatus prop, but jcodeStatus is also updated independently by fetch/user actions
55
57
  if (initialStatus) setJcodeStatus(initialStatus);
56
58
  }, [initialStatus]);
57
59
 
58
60
  useEffect(() => {
59
61
  if (isExpanded && !jcodeStatus) {
62
+ // eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
60
63
  checkJcodeStatus();
64
+ // eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
61
65
  fetchModelAliases();
62
66
  }
63
67
  if (isExpanded) fetchModelAliases();
68
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest jcodeStatus (adding it would re-trigger on every change)
64
69
  }, [isExpanded]);
65
70
 
66
71
  const fetchModelAliases = async () => {
@@ -79,6 +84,7 @@ export default function JcodeToolCard({
79
84
  const provider = jcodeStatus.config?.providers?.["zevai"];
80
85
  if (provider) {
81
86
  if (provider.default_model) {
87
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- one-time pre-fill from fetched tool config, guarded by hasInitializedModel ref
82
88
  setSelectedModel(provider.default_model);
83
89
  }
84
90
  // Try to match API key from env file