zevairouter 1.0.36 → 1.0.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 (299) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/cli/app/.next-cli-build/BUILD_ID +1 -1
  3. package/cli/app/.next-cli-build/app-path-routes-manifest.json +2 -2
  4. package/cli/app/.next-cli-build/build-manifest.json +2 -2
  5. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/automation/page_client-reference-manifest.js +1 -1
  6. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  7. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  8. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  9. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  10. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  11. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/context/page_client-reference-manifest.js +1 -1
  12. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  13. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  14. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  15. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  16. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  17. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  18. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  19. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  20. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js +2 -2
  21. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  22. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  23. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  24. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  25. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  26. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  27. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  28. package/cli/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  29. package/cli/app/.next-cli-build/server/app/_global-error.html +1 -1
  30. package/cli/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  31. package/cli/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  32. package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  33. package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  34. package/cli/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
  35. package/cli/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
  36. package/cli/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  37. package/cli/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  38. package/cli/app/.next-cli-build/server/app/_not-found.html +1 -1
  39. package/cli/app/.next-cli-build/server/app/_not-found.rsc +3 -3
  40. package/cli/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +3 -3
  41. package/cli/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
  42. package/cli/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +3 -3
  43. package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  44. package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  45. package/cli/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  46. package/cli/app/.next-cli-build/server/app/api/models/route.js +1 -1
  47. package/cli/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
  48. package/cli/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
  49. package/cli/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  50. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  51. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  52. package/cli/app/.next-cli-build/server/app/api/v1/audio/speech/route.js +1 -1
  53. package/cli/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js +1 -1
  54. package/cli/app/.next-cli-build/server/app/api/version/route.js +1 -1
  55. package/cli/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  56. package/cli/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  57. package/cli/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  58. package/cli/app/.next-cli-build/server/app/callback.html +1 -1
  59. package/cli/app/.next-cli-build/server/app/callback.rsc +3 -3
  60. package/cli/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +3 -3
  61. package/cli/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
  62. package/cli/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +3 -3
  63. package/cli/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
  64. package/cli/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  65. package/cli/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
  66. package/cli/app/.next-cli-build/server/app/dashboard/automation.html +1 -1
  67. package/cli/app/.next-cli-build/server/app/dashboard/automation.rsc +5 -5
  68. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation/__PAGE__.segment.rsc +2 -2
  69. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation.segment.rsc +1 -1
  70. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  71. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  72. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_full.segment.rsc +5 -5
  73. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_head.segment.rsc +1 -1
  74. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_index.segment.rsc +3 -3
  75. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_tree.segment.rsc +1 -1
  76. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  77. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +5 -5
  78. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  79. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  80. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  81. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  82. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +5 -5
  83. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  84. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +3 -3
  85. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  86. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  87. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +5 -5
  88. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  89. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  90. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  91. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  92. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +5 -5
  93. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  94. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +3 -3
  95. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  96. package/cli/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  97. package/cli/app/.next-cli-build/server/app/dashboard/combos.rsc +5 -5
  98. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  99. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  100. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  101. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  102. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +5 -5
  103. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  104. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +3 -3
  105. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  106. package/cli/app/.next-cli-build/server/app/dashboard/context.html +1 -1
  107. package/cli/app/.next-cli-build/server/app/dashboard/context.rsc +5 -5
  108. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context/__PAGE__.segment.rsc +2 -2
  109. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context.segment.rsc +1 -1
  110. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  111. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  112. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_full.segment.rsc +5 -5
  113. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_head.segment.rsc +1 -1
  114. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_index.segment.rsc +3 -3
  115. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_tree.segment.rsc +1 -1
  116. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  117. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.rsc +5 -5
  118. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  119. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  120. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  121. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  122. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +5 -5
  123. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  124. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +3 -3
  125. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  126. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  127. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +5 -5
  128. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  129. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  130. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  131. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  132. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  133. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +5 -5
  134. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  135. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +3 -3
  136. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
  137. package/cli/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  138. package/cli/app/.next-cli-build/server/app/dashboard/mitm.rsc +5 -5
  139. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  140. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  141. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  142. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  143. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +5 -5
  144. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  145. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +3 -3
  146. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
  147. package/cli/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  148. package/cli/app/.next-cli-build/server/app/dashboard/profile.rsc +5 -5
  149. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  150. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  151. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  152. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  153. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +5 -5
  154. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  155. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +3 -3
  156. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  157. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  158. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.rsc +5 -5
  159. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  160. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  161. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  162. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  163. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  164. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +5 -5
  165. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  166. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +3 -3
  167. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  168. package/cli/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  169. package/cli/app/.next-cli-build/server/app/dashboard/providers.rsc +5 -5
  170. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  171. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  172. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  173. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  174. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +5 -5
  175. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  176. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +3 -3
  177. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  178. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  179. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +5 -5
  180. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  181. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  182. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  183. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  184. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +5 -5
  185. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  186. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +3 -3
  187. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  188. package/cli/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
  189. package/cli/app/.next-cli-build/server/app/dashboard/quota.rsc +6 -6
  190. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  191. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  192. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  193. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  194. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +6 -6
  195. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  196. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +3 -3
  197. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  198. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  199. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  200. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +3 -3
  201. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
  202. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  203. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +3 -3
  204. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  205. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  206. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  207. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  208. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  209. package/cli/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  210. package/cli/app/.next-cli-build/server/app/dashboard/translator.rsc +5 -5
  211. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  212. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  213. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  214. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  215. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +5 -5
  216. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  217. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +3 -3
  218. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  219. package/cli/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  220. package/cli/app/.next-cli-build/server/app/dashboard/usage.rsc +5 -5
  221. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  222. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  223. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  224. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  225. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +5 -5
  226. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  227. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +3 -3
  228. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  229. package/cli/app/.next-cli-build/server/app/dashboard.html +1 -1
  230. package/cli/app/.next-cli-build/server/app/dashboard.rsc +5 -5
  231. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  232. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  233. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  234. package/cli/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +5 -5
  235. package/cli/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
  236. package/cli/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +3 -3
  237. package/cli/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  238. package/cli/app/.next-cli-build/server/app/index.html +1 -1
  239. package/cli/app/.next-cli-build/server/app/index.rsc +3 -3
  240. package/cli/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  241. package/cli/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +3 -3
  242. package/cli/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
  243. package/cli/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +3 -3
  244. package/cli/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
  245. package/cli/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  246. package/cli/app/.next-cli-build/server/app/landing.html +1 -1
  247. package/cli/app/.next-cli-build/server/app/landing.rsc +3 -3
  248. package/cli/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +3 -3
  249. package/cli/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
  250. package/cli/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +3 -3
  251. package/cli/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
  252. package/cli/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  253. package/cli/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
  254. package/cli/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  255. package/cli/app/.next-cli-build/server/app/login.html +1 -1
  256. package/cli/app/.next-cli-build/server/app/login.rsc +4 -4
  257. package/cli/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +4 -4
  258. package/cli/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
  259. package/cli/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +3 -3
  260. package/cli/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
  261. package/cli/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  262. package/cli/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
  263. package/cli/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  264. package/cli/app/.next-cli-build/server/app-paths-manifest.json +2 -2
  265. package/cli/app/.next-cli-build/server/chunks/2777.js +1 -1
  266. package/cli/app/.next-cli-build/server/chunks/3110.js +1 -1
  267. package/cli/app/.next-cli-build/server/chunks/318.js +2 -2
  268. package/cli/app/.next-cli-build/server/chunks/4404.js +1 -1
  269. package/cli/app/.next-cli-build/server/chunks/4746.js +1 -1
  270. package/cli/app/.next-cli-build/server/chunks/5024.js +1 -1
  271. package/cli/app/.next-cli-build/server/chunks/5681.js +1 -1
  272. package/cli/app/.next-cli-build/server/chunks/6896.js +1 -1
  273. package/cli/app/.next-cli-build/server/chunks/7153.js +1 -1
  274. package/cli/app/.next-cli-build/server/chunks/8895.js +3 -3
  275. package/cli/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  276. package/cli/app/.next-cli-build/server/pages/404.html +1 -1
  277. package/cli/app/.next-cli-build/server/pages/500.html +1 -1
  278. package/cli/app/.next-cli-build/static/chunks/1321-1c8d1bf3bb5f6953.js +1 -0
  279. package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/[id]/page-41ea0d0c8e98a115.js +3 -0
  280. package/cli/app/package.json +1 -1
  281. package/cli/package.json +1 -1
  282. package/open-sse/config/providerModels.js +32 -1
  283. package/open-sse/config/providers.js +14 -0
  284. package/open-sse/executors/codebuddy-cn.js +31 -0
  285. package/open-sse/executors/index.js +7 -0
  286. package/open-sse/executors/mimo-free.js +156 -0
  287. package/open-sse/handlers/chatCore.js +12 -21
  288. package/open-sse/services/model.js +5 -0
  289. package/open-sse/services/usage.js +76 -24
  290. package/open-sse/utils/stream.js +14 -0
  291. package/open-sse/utils/thinkingSuffix.js +64 -0
  292. package/package.json +1 -1
  293. package/src/app/(dashboard)/dashboard/providers/[id]/ModelRow.js +7 -3
  294. package/src/app/(dashboard)/dashboard/providers/[id]/page.js +17 -16
  295. package/src/shared/constants/providers.js +59 -1
  296. package/cli/app/.next-cli-build/static/chunks/1321-1915f34ac5033b82.js +0 -1
  297. package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/[id]/page-00b727c93ebc0e37.js +0 -3
  298. /package/cli/app/.next-cli-build/static/{w0R4xFPIyjPTTgiJ8h4Lz → Jh26f1tVQgrKUbeB6pi5A}/_buildManifest.js +0 -0
  299. /package/cli/app/.next-cli-build/static/{w0R4xFPIyjPTTgiJ8h4Lz → Jh26f1tVQgrKUbeB6pi5A}/_ssgManifest.js +0 -0
@@ -191,11 +191,16 @@ export const PROVIDER_MODELS = {
191
191
  { id: "kimi-k2.6", name: "Kimi-K2.6", maxInputTokens: 256000, maxOutputTokens: 32000 },
192
192
  { id: "kimi-k2.5", name: "Kimi-K2.5", maxInputTokens: 164000, maxOutputTokens: 32000 },
193
193
  ],
194
- "cb-cn": [ // CodeBuddy CN - verified available on copilot.tencent.com (2026-06-24)
194
+ "cb-cn": [ // CodeBuddy CN - verified available on copilot.tencent.com / www.codebuddy.cn
195
195
  { id: "default-model-lite", name: "Default-Lite", maxInputTokens: 176000, maxOutputTokens: 24000 },
196
+ { id: "default-model", name: "Default", maxInputTokens: 176000, maxOutputTokens: 24000 },
196
197
  { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", maxInputTokens: 128000, maxOutputTokens: 8192, strip: ["image", "audio"] },
197
198
  { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", maxInputTokens: 128000, maxOutputTokens: 8192, strip: ["image", "audio"] },
198
199
  { id: "glm-5.0", name: "GLM-5.0", maxInputTokens: 200000, maxOutputTokens: 48000, strip: ["image", "audio"] },
200
+ { id: "glm-5.1", name: "GLM-5.1", maxInputTokens: 200000, maxOutputTokens: 48000, strip: ["image", "audio"] },
201
+ { id: "kimi-k2.5", name: "Kimi-K2.5", maxInputTokens: 164000, maxOutputTokens: 32000 },
202
+ { id: "kimi-k2.6", name: "Kimi-K2.6", maxInputTokens: 256000, maxOutputTokens: 32000 },
203
+ { id: "minimax-m2.5", name: "MiniMax-M2.5", maxInputTokens: 200000, maxOutputTokens: 32000, strip: ["image", "audio"] },
199
204
  ],
200
205
  cu: [ // Cursor IDE
201
206
  { id: "default", name: "Auto (Server Picks)" },
@@ -534,6 +539,29 @@ export const PROVIDER_MODELS = {
534
539
  { id: "accounts/fireworks/models/qwen3-235b-a22b", name: "Qwen3 235B" },
535
540
  { id: "nomic-ai/nomic-embed-text-v1.5", name: "Nomic Embed Text v1.5", type: "embedding" },
536
541
  ],
542
+ // Wave-1 ports from 9router (keys = provider alias used by getModelsByProviderId)
543
+ mmf: [
544
+ { id: "mimo-auto", name: "MiMo Auto" },
545
+ ],
546
+ venice: [
547
+ { id: "venice-uncensored-1-2", name: "Venice Uncensored 1.2" },
548
+ { id: "zai-org-glm-5", name: "GLM-5" },
549
+ { id: "qwen3-235b-a22b-instruct-2507", name: "Qwen3 235B A22B Instruct" },
550
+ { id: "qwen3-coder-480b-a35b-instruct-turbo", name: "Qwen3 Coder 480B A35B Turbo" },
551
+ { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro" },
552
+ { id: "llama-3.3-70b", name: "Llama 3.3 70B" },
553
+ { id: "text-embedding-3-large", name: "Text Embedding 3 Large", type: "embedding" },
554
+ { id: "text-embedding-bge-m3", name: "BGE-M3 Embedding", type: "embedding" },
555
+ ],
556
+ fl: [
557
+ { id: "deepseek-ai/DeepSeek-V4-Pro", name: "DeepSeek V4 Pro" },
558
+ { id: "deepseek-ai/DeepSeek-V4-Flash", name: "DeepSeek V4 Flash" },
559
+ { id: "zai-org/GLM-5.2", name: "GLM 5.2" },
560
+ { id: "zai-org/GLM-5.1", name: "GLM 5.1" },
561
+ { id: "moonshotai/Kimi-K2.7-Code", name: "Kimi K2.7 Code" },
562
+ { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6" },
563
+ { id: "moonshotai/Kimi-K2.5", name: "Kimi K2.5" },
564
+ ],
537
565
  cerebras: [
538
566
  { id: "gpt-oss-120b", name: "GPT OSS 120B" },
539
567
  { id: "zai-glm-4.7", name: "ZAI GLM 4.7" },
@@ -939,6 +967,9 @@ const OAUTH_ALIASES = {
939
967
  "codebuddy-cn": "cb-cn",
940
968
  vertex: "vertex",
941
969
  "vertex-partner": "vertex-partner",
970
+ "mimo-free": "mmf",
971
+ venice: "venice",
972
+ featherless: "fl",
942
973
  };
943
974
 
944
975
  // Derived from PROVIDERS — no need to maintain manually
@@ -416,6 +416,20 @@ export const PROVIDERS = {
416
416
  baseUrl: "https://token-plan-sgp.xiaomimimo.com/v1/chat/completions",
417
417
  format: "openai"
418
418
  },
419
+ // Free Xiaomi MiMo Code (no user key; executor bootstraps JWT)
420
+ "mimo-free": {
421
+ baseUrl: "https://api.xiaomimimo.com/api/free-ai/openai/chat",
422
+ format: "openai",
423
+ noAuth: true,
424
+ },
425
+ venice: {
426
+ baseUrl: "https://api.venice.ai/api/v1/chat/completions",
427
+ format: "openai",
428
+ },
429
+ featherless: {
430
+ baseUrl: "https://api.featherless.ai/v1/chat/completions",
431
+ format: "openai",
432
+ },
419
433
  // Region map for Xiaomi MiMo Token Plan (keys are cluster-specific)
420
434
  // Used by resolveXiaomiTokenplanBaseUrl below
421
435
  // === Free-tier providers (synced from OmniRoute) ===
@@ -0,0 +1,31 @@
1
+ import { DefaultExecutor } from "./default.js";
2
+
3
+ /**
4
+ * CodeBuddy CN — OpenAI-compatible gateway at codebuddy.cn / copilot.tencent.com.
5
+ *
6
+ * Forces streaming (upstream rejects non-stream chat with 11101) and only
7
+ * attaches reasoning_summary when the client asked for reasoning_effort
8
+ * (forcing reasoning on plain requests trips content filters).
9
+ *
10
+ * Ported from 9router executors/codebuddy-cn.js.
11
+ */
12
+ export class CodeBuddyCnExecutor extends DefaultExecutor {
13
+ constructor() {
14
+ super("codebuddy-cn");
15
+ }
16
+
17
+ transformRequest(model, body, stream, credentials) {
18
+ const transformed = super.transformRequest(model, body, stream, credentials);
19
+ transformed.stream = true;
20
+
21
+ const eff = transformed.reasoning_effort;
22
+ if (eff === "none" || eff === "off") {
23
+ delete transformed.reasoning_effort;
24
+ } else if (eff) {
25
+ transformed.reasoning_summary = "auto";
26
+ }
27
+ return transformed;
28
+ }
29
+ }
30
+
31
+ export default CodeBuddyCnExecutor;
@@ -17,6 +17,8 @@ import { OllamaLocalExecutor } from "./ollama-local.js";
17
17
  import { CommandCodeExecutor } from "./commandcode.js";
18
18
  import { XiaomiTokenplanExecutor } from "./xiaomi-tokenplan.js";
19
19
  import { AutoClawExecutor } from "./autoclaw.js";
20
+ import { MimoFreeExecutor } from "./mimo-free.js";
21
+ import { CodeBuddyCnExecutor } from "./codebuddy-cn.js";
20
22
  import { DefaultExecutor } from "./default.js";
21
23
 
22
24
  const executors = {
@@ -41,6 +43,9 @@ const executors = {
41
43
  commandcode: new CommandCodeExecutor(),
42
44
  "xiaomi-tokenplan": new XiaomiTokenplanExecutor(),
43
45
  autoclaw: new AutoClawExecutor(),
46
+ "mimo-free": new MimoFreeExecutor(),
47
+ mmf: new MimoFreeExecutor(),
48
+ "codebuddy-cn": new CodeBuddyCnExecutor(),
44
49
  };
45
50
 
46
51
  const defaultCache = new Map();
@@ -76,3 +81,5 @@ export { OllamaLocalExecutor } from "./ollama-local.js";
76
81
  export { CommandCodeExecutor } from "./commandcode.js";
77
82
  export { XiaomiTokenplanExecutor } from "./xiaomi-tokenplan.js";
78
83
  export { AutoClawExecutor } from "./autoclaw.js";
84
+ export { MimoFreeExecutor } from "./mimo-free.js";
85
+ export { CodeBuddyCnExecutor } from "./codebuddy-cn.js";
@@ -0,0 +1,156 @@
1
+ import { BaseExecutor } from "./base.js";
2
+ import { PROVIDERS } from "../config/providers.js";
3
+ import { proxyAwareFetch } from "../utils/proxyFetch.js";
4
+ import { createHash } from "crypto";
5
+ import os from "os";
6
+
7
+ const BOOTSTRAP_URL = "https://api.xiaomimimo.com/api/free-ai/bootstrap";
8
+ const CHAT_URL = PROVIDERS["mimo-free"]?.baseUrl || "https://api.xiaomimimo.com/api/free-ai/openai/chat";
9
+ const SESSION_AFFINITY_PREFIX = "ses_";
10
+ const SESSION_ID_LENGTH = 24;
11
+ const JWT_FALLBACK_TTL_SEC = 3000;
12
+ const JWT_EXPIRY_BUFFER_MS = 300000;
13
+ const SESSION_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789";
14
+
15
+ // Anti-abuse gate: upstream rejects requests without a Chrome-like User-Agent with 403 "Illegal access"
16
+ const USER_AGENTS = [
17
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
18
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
19
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
20
+ ];
21
+
22
+ // Anti-abuse gate marker: free chat endpoint returns 403 unless a system message contains this.
23
+ export const MIMO_SYSTEM_MARKER =
24
+ "You are MiMoCode, an interactive CLI tool that helps users with software engineering tasks.";
25
+
26
+ let cachedJwt = null;
27
+ let jwtExpiresAt = 0;
28
+
29
+ function generateFingerprint() {
30
+ let username = "unknown-user";
31
+ try {
32
+ username = os.userInfo().username;
33
+ } catch {
34
+ // ignore
35
+ }
36
+ const cpu = (os.cpus()[0]?.model || "unknown-cpu").trim();
37
+ const seed = `${os.hostname()}|${os.platform()}|${os.arch()}|${cpu}|${username}`;
38
+ return createHash("sha256").update(seed).digest("hex");
39
+ }
40
+
41
+ function generateSessionId() {
42
+ let id = SESSION_AFFINITY_PREFIX;
43
+ for (let i = 0; i < SESSION_ID_LENGTH; i++) {
44
+ id += SESSION_CHARS[Math.floor(Math.random() * SESSION_CHARS.length)];
45
+ }
46
+ return id;
47
+ }
48
+
49
+ function parseJwtExp(jwt) {
50
+ try {
51
+ const payload = JSON.parse(Buffer.from(jwt.split(".")[1], "base64").toString());
52
+ if (payload.exp) return payload.exp * 1000;
53
+ } catch {
54
+ // ignore
55
+ }
56
+ return Date.now() + JWT_FALLBACK_TTL_SEC * 1000;
57
+ }
58
+
59
+ function injectSystemMarker(body) {
60
+ const messages = body?.messages;
61
+ if (!Array.isArray(messages)) return body;
62
+ const hasMarker = messages.some(
63
+ (m) => m?.role === "system" && typeof m.content === "string" && m.content.includes(MIMO_SYSTEM_MARKER),
64
+ );
65
+ if (hasMarker) return body;
66
+ return { ...body, messages: [{ role: "system", content: MIMO_SYSTEM_MARKER }, ...messages] };
67
+ }
68
+
69
+ function resetJwtCache() {
70
+ cachedJwt = null;
71
+ jwtExpiresAt = 0;
72
+ }
73
+
74
+ async function bootstrapJwt(proxyOptions = null) {
75
+ if (cachedJwt && Date.now() < jwtExpiresAt - JWT_EXPIRY_BUFFER_MS) {
76
+ return cachedJwt;
77
+ }
78
+
79
+ const response = await proxyAwareFetch(BOOTSTRAP_URL, {
80
+ method: "POST",
81
+ headers: {
82
+ "Content-Type": "application/json",
83
+ "User-Agent": USER_AGENTS[Math.floor(Math.random() * USER_AGENTS.length)],
84
+ },
85
+ body: JSON.stringify({ client: generateFingerprint() }),
86
+ }, proxyOptions);
87
+
88
+ if (!response.ok) {
89
+ throw new Error(`MiMo bootstrap failed: ${response.status}`);
90
+ }
91
+
92
+ const data = await response.json();
93
+ if (!data.jwt) {
94
+ throw new Error("MiMo bootstrap returned no JWT");
95
+ }
96
+
97
+ cachedJwt = data.jwt;
98
+ jwtExpiresAt = parseJwtExp(data.jwt);
99
+ return cachedJwt;
100
+ }
101
+
102
+ export class MimoFreeExecutor extends BaseExecutor {
103
+ constructor() {
104
+ super("mimo-free", PROVIDERS["mimo-free"]);
105
+ this.sessionId = generateSessionId();
106
+ }
107
+
108
+ buildUrl() {
109
+ return CHAT_URL;
110
+ }
111
+
112
+ buildHeaders(credentials, stream = true) {
113
+ return {
114
+ "Content-Type": "application/json",
115
+ "X-Mimo-Source": "mimocode-cli-free",
116
+ "User-Agent": USER_AGENTS[Math.floor(Math.random() * USER_AGENTS.length)],
117
+ "x-session-affinity": this.sessionId,
118
+ Accept: stream ? "text/event-stream" : "application/json",
119
+ };
120
+ }
121
+
122
+ transformRequest(model, body) {
123
+ return injectSystemMarker(body);
124
+ }
125
+
126
+ async execute({ model, body, stream, credentials, signal, log, proxyOptions = null }) {
127
+ let jwt;
128
+ try {
129
+ jwt = await bootstrapJwt(proxyOptions);
130
+ } catch (error) {
131
+ log?.error?.("AUTH", `MiMo bootstrap failed: ${error.message}`);
132
+ throw error;
133
+ }
134
+
135
+ const url = this.buildUrl();
136
+ const transformedBody = this.transformRequest(model, body);
137
+ const headers = { ...this.buildHeaders(credentials, stream), Authorization: `Bearer ${jwt}` };
138
+ const bodyStr = JSON.stringify(transformedBody);
139
+ log?.debug?.("FETCH", `MIMO-FREE → ${url} | body=${bodyStr.length}B`);
140
+
141
+ const response = await proxyAwareFetch(url, { method: "POST", headers, body: bodyStr, signal }, proxyOptions);
142
+
143
+ if (response.status === 401 || response.status === 403) {
144
+ log?.debug?.("AUTH", `MiMo auth failed (${response.status}), re-bootstrapping...`);
145
+ resetJwtCache();
146
+ jwt = await bootstrapJwt(proxyOptions);
147
+ headers.Authorization = `Bearer ${jwt}`;
148
+ const retryResponse = await proxyAwareFetch(url, { method: "POST", headers, body: bodyStr, signal }, proxyOptions);
149
+ return { response: retryResponse, url, headers, transformedBody };
150
+ }
151
+
152
+ return { response, url, headers, transformedBody };
153
+ }
154
+ }
155
+
156
+ export default MimoFreeExecutor;
@@ -22,6 +22,7 @@ import { injectCaveman } from "../rtk/caveman.js";
22
22
  import { injectPonytail } from "../rtk/ponytail.js";
23
23
  import { injectContextFiles } from "../context/injectContext.js";
24
24
  import { compressMessages, formatRtkLog } from "../rtk/index.js";
25
+ import { applyThinkingFromModelAndSettings, stripThinkingSuffix } from "../utils/thinkingSuffix.js";
25
26
 
26
27
  /**
27
28
  * Core chat handler - shared between SSE and Worker
@@ -31,38 +32,28 @@ import { compressMessages, formatRtkLog } from "../rtk/index.js";
31
32
  * @param {string} options.sourceFormatOverride - Override detected source format (e.g. "openai-responses")
32
33
  */
33
34
  export async function handleChatCore({ body, modelInfo, credentials, log, onCredentialsRefreshed, onRequestSuccess, onDisconnect, clientRawRequest, connectionId, userAgent, apiKey, ccFilterNaming, rtkEnabled, cavemanEnabled, cavemanLevel, contextInjectionEnabled, ponytailEnabled, ponytailLevel, sourceFormatOverride, providerThinking }) {
34
- const { provider, model } = modelInfo;
35
+ const { provider } = modelInfo;
35
36
  const requestStartTime = Date.now();
36
37
 
37
38
  const sourceFormat = sourceFormatOverride || detectFormat(body);
38
39
 
39
40
  // Check for bypass patterns (warmup, skip, cc naming)
40
- const bypassResponse = handleBypassRequest(body, model, userAgent, ccFilterNaming);
41
+ const bypassResponse = handleBypassRequest(body, modelInfo.model, userAgent, ccFilterNaming);
41
42
  if (bypassResponse) return bypassResponse;
42
43
 
44
+ // model(high) suffix + per-provider thinking settings → reasoning_effort / thinking
45
+ const thinkingApplied = applyThinkingFromModelAndSettings(modelInfo.model, body, providerThinking);
46
+ body = thinkingApplied.body;
47
+ const model = thinkingApplied.cleanModel;
48
+ if (thinkingApplied.applied) {
49
+ log?.debug?.("THINKING", `Applied thinking mode=${thinkingApplied.applied} (model=${modelInfo.model})`);
50
+ }
51
+
43
52
  const alias = PROVIDER_ID_TO_ALIAS[provider] || provider;
44
53
  const modelTargetFormat = getModelTargetFormat(alias, model);
45
54
  const targetFormat = modelTargetFormat || getTargetFormat(provider);
46
55
  const stripList = getModelStrip(alias, model);
47
- const upstreamModel = getModelUpstreamId(alias, model);
48
-
49
- // Inject provider-level thinking config override (only if client hasn't set)
50
- // on/off → extended type (body.thinking), none/low/medium/high → effort type (body.reasoning_effort)
51
- if (providerThinking?.mode && providerThinking.mode !== "auto") {
52
- const mode = providerThinking.mode;
53
- if (mode === "on" && !body.thinking) {
54
- console.log("Injecting provider-level thinking config override: on");
55
- body = { ...body, thinking: { type: "enabled", budget_tokens: 10000 } };
56
- } else if (mode === "off") {
57
- body = { ...body, thinking: { type: "disabled" } };
58
- delete body.reasoning_effort;
59
- if (body.reasoning && typeof body.reasoning === "object") {
60
- body.reasoning = { ...body.reasoning, effort: "none" };
61
- }
62
- } else if (!body.reasoning_effort) {
63
- body = { ...body, reasoning_effort: mode };
64
- }
65
- }
56
+ const upstreamModel = stripThinkingSuffix(getModelUpstreamId(alias, model));
66
57
 
67
58
  const clientRequestedStreaming = body.stream === true || sourceFormat === FORMATS.ANTIGRAVITY || sourceFormat === FORMATS.GEMINI || sourceFormat === FORMATS.GEMINI_CLI;
68
59
  const providerRequiresStreaming = provider === "openai" || provider === "codex" || provider === "commandcode";
@@ -81,6 +81,11 @@ const ALIAS_TO_PROVIDER_ID = {
81
81
  "xiaomi-mimo": "xiaomi-mimo",
82
82
  xmtp: "xiaomi-tokenplan",
83
83
  "xiaomi-tokenplan": "xiaomi-tokenplan",
84
+ mmf: "mimo-free",
85
+ "mimo-free": "mimo-free",
86
+ venice: "venice",
87
+ fl: "featherless",
88
+ featherless: "featherless",
84
89
  cf: "cloudflare-ai",
85
90
  "cloudflare-ai": "cloudflare-ai",
86
91
  // Image/video providers
@@ -343,21 +343,33 @@ function parseCodeBuddyUsage(payload) {
343
343
  };
344
344
  }
345
345
 
346
+ // Split refill packs (monthly cycle resets) vs one-shot bonus packs so the UI
347
+ // does not imply bonus credits replenish every month (ported from 9router).
348
+ const REFILL_GAP_MS = 2 * 24 * 60 * 60 * 1000;
349
+ const cycleEndMs = (acc) => {
350
+ const r = parseResetTime(acc.CycleEndTime);
351
+ return r ? new Date(r).getTime() : Number.POSITIVE_INFINITY;
352
+ };
353
+ const isRefill = (acc) => {
354
+ const ce = cycleEndMs(acc);
355
+ const de = Number(acc.DeductionEndTime);
356
+ return Number.isFinite(ce) && Number.isFinite(de) && de - ce > REFILL_GAP_MS;
357
+ };
358
+ const byExpiry = (a, b) => cycleEndMs(a) - cycleEndMs(b);
359
+
360
+ const refills = accounts.filter(isRefill).sort(byExpiry);
361
+ const bonuses = accounts.filter((a) => !isRefill(a)).sort(byExpiry);
362
+
346
363
  const quotas = {};
347
364
  let hasProPackage = false;
348
365
 
349
- for (const account of accounts) {
350
- if (!account || typeof account !== "object") continue;
351
- const label = getCodeBuddyQuotaLabel(account.PackageCode);
352
- if (!label) continue;
353
-
354
- if (account.PackageCode === CODEBUDDY_CONFIG.packageCodes.proMon || account.PackageCode === CODEBUDDY_CONFIG.packageCodes.proYear) {
366
+ const addQuota = (label, account, { recurring }) => {
367
+ const quota = getCodeBuddyQuotaValues(account, { useCycle: recurring });
368
+ if (!quota) return;
369
+ if (account.PackageCode === CODEBUDDY_CONFIG.packageCodes.proMon
370
+ || account.PackageCode === CODEBUDDY_CONFIG.packageCodes.proYear) {
355
371
  hasProPackage = true;
356
372
  }
357
-
358
- const quota = getCodeBuddyQuotaValues(account);
359
- if (!quota) continue;
360
-
361
373
  if (!quotas[label]) {
362
374
  quotas[label] = {
363
375
  used: 0,
@@ -366,13 +378,37 @@ function parseCodeBuddyUsage(payload) {
366
378
  resetAt: null,
367
379
  unit: "credits",
368
380
  unlimited: false,
381
+ recurring,
369
382
  };
370
383
  }
371
-
372
384
  quotas[label].used += quota.used;
373
385
  quotas[label].total += quota.total;
374
386
  quotas[label].remaining += quota.remaining;
375
387
  quotas[label].resetAt = getEarlierReset(quotas[label].resetAt, quota.resetAt);
388
+ quotas[label].recurring = quotas[label].recurring && recurring;
389
+ };
390
+
391
+ // Aggregate ALL refill packs into one Monthly row and ALL bonus packs into one
392
+ // Bonus row — Tencent often returns many small gift packages (10–20 rows) for a
393
+ // single account, which flooded the dashboard as Bonus Pack 1..N.
394
+ for (const account of refills) {
395
+ addQuota("Monthly Credits", account, { recurring: true });
396
+ }
397
+ for (const account of bonuses) {
398
+ addQuota("Bonus Credits", account, { recurring: false });
399
+ }
400
+ if (bonuses.length > 0 && quotas["Bonus Credits"]) {
401
+ quotas["Bonus Credits"].packCount = bonuses.length;
402
+ }
403
+
404
+ // Fallback: if classification produced nothing, keep old package-label merge.
405
+ if (Object.keys(quotas).length === 0) {
406
+ for (const account of accounts) {
407
+ if (!account || typeof account !== "object") continue;
408
+ const label = getCodeBuddyQuotaLabel(account.PackageCode) || "Other Credits";
409
+ const recurring = label !== "Activity Credits" && label !== "Gift Credits";
410
+ addQuota(recurring ? "Monthly Credits" : "Bonus Credits", account, { recurring });
411
+ }
376
412
  }
377
413
 
378
414
  if (Object.keys(quotas).length === 0) {
@@ -389,8 +425,10 @@ function parseCodeBuddyUsage(payload) {
389
425
  : 0;
390
426
  }
391
427
 
428
+ const plan = hasProPackage ? "Pro" : "Free";
392
429
  return {
393
- plan: hasProPackage ? "Pro" : "Free",
430
+ plan,
431
+ // packCount stays on Bonus Credits for UI/detail if needed; no noisy top-level message
394
432
  quotas,
395
433
  };
396
434
  }
@@ -414,18 +452,32 @@ function getCodeBuddyQuotaLabel(packageCode) {
414
452
  }
415
453
  }
416
454
 
417
- function getCodeBuddyQuotaValues(account) {
418
- const total = firstFiniteNumber(
419
- account.CycleCapacitySizePrecise,
420
- account.CycleCapacitySize,
421
- account.CapacitySizePrecise,
422
- account.CapacitySize,
423
- );
424
- const remaining = firstFiniteNumber(
425
- account.CycleCapacityRemainPrecise,
426
- account.CapacityRemainPrecise,
427
- account.CapacityRemain,
428
- );
455
+ function getCodeBuddyQuotaValues(account, { useCycle = true } = {}) {
456
+ // Refill packs: Cycle* fields = current period. Bonus packs: plain Capacity* = lifetime one-shot.
457
+ const total = useCycle
458
+ ? firstFiniteNumber(
459
+ account.CycleCapacitySizePrecise,
460
+ account.CycleCapacitySize,
461
+ account.CapacitySizePrecise,
462
+ account.CapacitySize,
463
+ )
464
+ : firstFiniteNumber(
465
+ account.CapacitySizePrecise,
466
+ account.CapacitySize,
467
+ account.CycleCapacitySizePrecise,
468
+ account.CycleCapacitySize,
469
+ );
470
+ const remaining = useCycle
471
+ ? firstFiniteNumber(
472
+ account.CycleCapacityRemainPrecise,
473
+ account.CapacityRemainPrecise,
474
+ account.CapacityRemain,
475
+ )
476
+ : firstFiniteNumber(
477
+ account.CapacityRemainPrecise,
478
+ account.CapacityRemain,
479
+ account.CycleCapacityRemainPrecise,
480
+ );
429
481
  const used = firstFiniteNumber(
430
482
  account.CapacityUsedPrecise,
431
483
  account.CapacityUsed,
@@ -126,6 +126,20 @@ export function createSSEStream(options = {}) {
126
126
  }
127
127
  }
128
128
 
129
+ // Strip empty tool_calls arrays that break AI SDK reasoning tracking.
130
+ // Some providers (e.g. CodeBuddy CN) include `"tool_calls": []` in
131
+ // every streaming delta. @ai-sdk/openai-compatible checks
132
+ // `delta.tool_calls != null` — an empty array passes this check,
133
+ // causing premature `reasoning-end` on every chunk.
134
+ if (parsed?.choices) {
135
+ for (const choice of parsed.choices) {
136
+ if (choice.delta?.tool_calls && Array.isArray(choice.delta.tool_calls) && choice.delta.tool_calls.length === 0) {
137
+ delete choice.delta.tool_calls;
138
+ fieldsInjected = true;
139
+ }
140
+ }
141
+ }
142
+
129
143
  if (!hasValuableContent(parsed, FORMATS.OPENAI)) {
130
144
  continue;
131
145
  }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Model-name thinking suffix helpers: `provider/model(high)` → clean model + effort.
3
+ * Lightweight port of 9router thinkingUnified strip/parse (no full capabilities matrix).
4
+ */
5
+
6
+ const KNOWN_LEVELS = new Set([
7
+ "none", "off", "auto", "minimal", "low", "medium", "high", "xhigh", "max", "on", "thinking",
8
+ ]);
9
+
10
+ /** Strip trailing `model(value)` → `model` (no-op when absent). */
11
+ export function stripThinkingSuffix(model) {
12
+ if (typeof model !== "string") return model;
13
+ const m = model.match(/^(.*)\([^()]+\)\s*$/);
14
+ return m ? m[1].trim() : model;
15
+ }
16
+
17
+ /**
18
+ * Parse `model(value)` → { cleanModel, level }.
19
+ * level is null when no valid suffix is present.
20
+ */
21
+ export function parseThinkingSuffix(model) {
22
+ if (typeof model !== "string") return { cleanModel: model, level: null };
23
+ const m = model.match(/^(.*)\(([^()]+)\)\s*$/);
24
+ if (!m) return { cleanModel: model, level: null };
25
+ const cleanModel = m[1].trim();
26
+ const raw = m[2].trim().toLowerCase();
27
+ if (!KNOWN_LEVELS.has(raw) && !/^\d+$/.test(raw)) {
28
+ return { cleanModel: model, level: null };
29
+ }
30
+ if (raw === "off") return { cleanModel, level: "none" };
31
+ if (raw === "on" || raw === "thinking") return { cleanModel, level: "high" };
32
+ return { cleanModel, level: raw };
33
+ }
34
+
35
+ /**
36
+ * Apply parsed suffix (or providerThinking.mode) onto body as reasoning_effort / thinking.
37
+ * Mutates a shallow copy of body; returns { body, cleanModel }.
38
+ */
39
+ export function applyThinkingFromModelAndSettings(model, body, providerThinking) {
40
+ const { cleanModel, level: suffixLevel } = parseThinkingSuffix(model);
41
+ let next = body && typeof body === "object" ? { ...body } : body || {};
42
+
43
+ const mode = suffixLevel || (providerThinking?.mode && providerThinking.mode !== "auto"
44
+ ? providerThinking.mode
45
+ : null);
46
+
47
+ if (!mode) {
48
+ return { body: next, cleanModel, applied: null };
49
+ }
50
+
51
+ if (mode === "on") {
52
+ if (!next.thinking) next = { ...next, thinking: { type: "enabled", budget_tokens: 10000 } };
53
+ } else if (mode === "off" || mode === "none") {
54
+ next = { ...next, thinking: { type: "disabled" } };
55
+ delete next.reasoning_effort;
56
+ if (next.reasoning && typeof next.reasoning === "object") {
57
+ next.reasoning = { ...next.reasoning, effort: "none" };
58
+ }
59
+ } else if (!next.reasoning_effort) {
60
+ next = { ...next, reasoning_effort: mode };
61
+ }
62
+
63
+ return { body: next, cleanModel, applied: mode };
64
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zevairouter",
3
- "version": "1.0.36",
3
+ "version": "1.0.37",
4
4
  "description": "ZevaiRouter - AI Router with provider automation, multi-account workflows, and quota tracking",
5
5
  "bin": {
6
6
  "zevai": "./cli/cli.js"
@@ -1,6 +1,6 @@
1
1
  import PropTypes from "prop-types";
2
2
 
3
- export default function ModelRow({ model, fullModel, alias, copied, onCopy, testStatus, isCustom, isFree, onDeleteAlias, onTest, isTesting, onDisable }) {
3
+ export default function ModelRow({ model, fullModel, alias, copied, onCopy, testStatus, isCustom, isFree, onDeleteAlias, onTest, isTesting, onDisable, thinkingSuffix }) {
4
4
  const borderColor = testStatus === "ok"
5
5
  ? "border-green-500/40"
6
6
  : testStatus === "error"
@@ -13,6 +13,9 @@ export default function ModelRow({ model, fullModel, alias, copied, onCopy, test
13
13
  ? "#ef4444"
14
14
  : undefined;
15
15
 
16
+ // Copy/display includes optional thinking level: alias/model(high)
17
+ const displayModel = thinkingSuffix ? `${fullModel}(${thinkingSuffix})` : fullModel;
18
+
16
19
  return (
17
20
  <div className={`group min-w-0 max-w-full rounded-lg border px-3 py-2 ${borderColor} hover:bg-sidebar/50`}>
18
21
  <div className="flex min-w-0 items-start gap-2 sm:items-center">
@@ -23,7 +26,7 @@ export default function ModelRow({ model, fullModel, alias, copied, onCopy, test
23
26
  {testStatus === "ok" ? "check_circle" : testStatus === "error" ? "cancel" : "smart_toy"}
24
27
  </span>
25
28
  <div className="flex min-w-0 flex-1 flex-col gap-1">
26
- <code className="max-w-[72vw] truncate rounded bg-sidebar px-1.5 py-0.5 font-mono text-xs text-text-muted sm:max-w-[360px]">{fullModel}</code>
29
+ <code className="max-w-[72vw] truncate rounded bg-sidebar px-1.5 py-0.5 font-mono text-xs text-text-muted sm:max-w-[360px]">{displayModel}</code>
27
30
  {model.name && <span className="truncate pl-1 text-[9px] italic text-text-muted/70">{model.name}</span>}
28
31
  </div>
29
32
  {onTest && (
@@ -44,7 +47,7 @@ export default function ModelRow({ model, fullModel, alias, copied, onCopy, test
44
47
  )}
45
48
  <div className="relative shrink-0 group/btn">
46
49
  <button
47
- onClick={() => onCopy(fullModel, `model-${model.id}`)}
50
+ onClick={() => onCopy(displayModel, `model-${model.id}`)}
48
51
  className="rounded p-0.5 text-text-muted hover:bg-sidebar hover:text-primary"
49
52
  >
50
53
  <span className="material-symbols-outlined text-sm">
@@ -92,4 +95,5 @@ ModelRow.propTypes = {
92
95
  onTest: PropTypes.func,
93
96
  isTesting: PropTypes.bool,
94
97
  onDisable: PropTypes.func,
98
+ thinkingSuffix: PropTypes.string,
95
99
  };