n9router 0.4.55 → 0.4.57

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 (497) hide show
  1. package/app/.next/BUILD_ID +1 -1
  2. package/app/.next/app-path-routes-manifest.json +16 -16
  3. package/app/.next/build-manifest.json +2 -2
  4. package/app/.next/prerender-manifest.json +3 -3
  5. package/app/.next/required-server-files.json +1 -3
  6. package/app/.next/server/app/(dashboard)/dashboard/basic-chat/page.js +1 -1
  7. package/app/.next/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
  8. package/app/.next/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  9. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js +1 -1
  10. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
  11. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  12. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page.js +1 -1
  13. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  14. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  15. package/app/.next/server/app/(dashboard)/dashboard/combos/page.js +1 -1
  16. package/app/.next/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
  17. package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  18. package/app/.next/server/app/(dashboard)/dashboard/console-log/page.js +1 -1
  19. package/app/.next/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
  20. package/app/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  21. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page.js +1 -1
  22. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  23. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  24. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js +1 -1
  25. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
  26. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  27. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js +1 -1
  28. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +1 -1
  29. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  30. package/app/.next/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +1 -1
  31. package/app/.next/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js.nft.json +1 -1
  32. package/app/.next/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  33. package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/page.js +1 -1
  34. package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/page.js.nft.json +1 -1
  35. package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  36. package/app/.next/server/app/(dashboard)/dashboard/mitm/page.js +1 -1
  37. package/app/.next/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
  38. package/app/.next/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  39. package/app/.next/server/app/(dashboard)/dashboard/page.js +1 -1
  40. package/app/.next/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  41. package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  42. package/app/.next/server/app/(dashboard)/dashboard/profile/page.js +1 -1
  43. package/app/.next/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
  44. package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  45. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js +1 -1
  46. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
  47. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  48. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page.js +1 -1
  49. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
  50. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  51. package/app/.next/server/app/(dashboard)/dashboard/providers/page.js +1 -1
  52. package/app/.next/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
  53. package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  54. package/app/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js +1 -1
  55. package/app/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
  56. package/app/.next/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  57. package/app/.next/server/app/(dashboard)/dashboard/pxpipe/page.js +1 -1
  58. package/app/.next/server/app/(dashboard)/dashboard/pxpipe/page.js.nft.json +1 -1
  59. package/app/.next/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -1
  60. package/app/.next/server/app/(dashboard)/dashboard/quota/page.js +1 -1
  61. package/app/.next/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
  62. package/app/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  63. package/app/.next/server/app/(dashboard)/dashboard/skills/page.js +1 -1
  64. package/app/.next/server/app/(dashboard)/dashboard/skills/page.js.nft.json +1 -1
  65. package/app/.next/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  66. package/app/.next/server/app/(dashboard)/dashboard/token-saver/page.js +1 -1
  67. package/app/.next/server/app/(dashboard)/dashboard/token-saver/page.js.nft.json +1 -1
  68. package/app/.next/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  69. package/app/.next/server/app/(dashboard)/dashboard/translator/page.js +1 -1
  70. package/app/.next/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
  71. package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  72. package/app/.next/server/app/(dashboard)/dashboard/usage/page.js +1 -1
  73. package/app/.next/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
  74. package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  75. package/app/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  76. package/app/.next/server/app/_global-error.html +1 -1
  77. package/app/.next/server/app/_global-error.rsc +1 -1
  78. package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  79. package/app/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  80. package/app/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  81. package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  82. package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  83. package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  84. package/app/.next/server/app/_not-found/page.js +1 -1
  85. package/app/.next/server/app/_not-found/page.js.nft.json +1 -1
  86. package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  87. package/app/.next/server/app/_not-found.html +1 -1
  88. package/app/.next/server/app/_not-found.rsc +3 -3
  89. package/app/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  90. package/app/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  91. package/app/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  92. package/app/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  93. package/app/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  94. package/app/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  95. package/app/.next/server/app/api/antigravity-tools/import/route.js +1 -1
  96. package/app/.next/server/app/api/antigravity-tools/import/route.js.nft.json +1 -1
  97. package/app/.next/server/app/api/antigravity-tools/import-refresh-tokens/route.js +1 -1
  98. package/app/.next/server/app/api/antigravity-tools/import-refresh-tokens/route.js.nft.json +1 -1
  99. package/app/.next/server/app/api/cli-tools/all-statuses/route.js +5 -5
  100. package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js +1 -1
  101. package/app/.next/server/app/api/cli-tools/antigravity-mitm/route.js +1 -1
  102. package/app/.next/server/app/api/cli-tools/claude-settings/route.js +2 -2
  103. package/app/.next/server/app/api/cli-tools/cline-settings/route.js +1 -1
  104. package/app/.next/server/app/api/cli-tools/codex-settings/route.js +1 -1
  105. package/app/.next/server/app/api/cli-tools/copilot-settings/route.js +2 -2
  106. package/app/.next/server/app/api/cli-tools/cowork-mcp-registry/route.js +1 -1
  107. package/app/.next/server/app/api/cli-tools/cowork-mcp-tools/route.js +2 -2
  108. package/app/.next/server/app/api/cli-tools/cowork-settings/route.js +1 -1
  109. package/app/.next/server/app/api/cli-tools/deepseek-tui-settings/route.js +3 -3
  110. package/app/.next/server/app/api/cli-tools/devin-settings/route.js +2 -2
  111. package/app/.next/server/app/api/cli-tools/droid-settings/route.js +1 -1
  112. package/app/.next/server/app/api/cli-tools/grok-build-settings/route.js +2 -2
  113. package/app/.next/server/app/api/cli-tools/hermes-settings/route.js +2 -2
  114. package/app/.next/server/app/api/cli-tools/jcode-settings/route.js +2 -2
  115. package/app/.next/server/app/api/cli-tools/kilo-settings/route.js +2 -2
  116. package/app/.next/server/app/api/cli-tools/openclaw-settings/route.js +2 -2
  117. package/app/.next/server/app/api/cli-tools/opencode-settings/route.js +1 -1
  118. package/app/.next/server/app/api/internal/request-detail/route.js +1 -1
  119. package/app/.next/server/app/api/internal/request-detail/route.js.nft.json +1 -1
  120. package/app/.next/server/app/api/internal/usage/route.js +1 -1
  121. package/app/.next/server/app/api/internal/usage/route.js.nft.json +1 -1
  122. package/app/.next/server/app/api/keys/[id]/reset-usage/route.js +1 -1
  123. package/app/.next/server/app/api/keys/[id]/reset-usage/route.js.nft.json +1 -1
  124. package/app/.next/server/app/api/keys/[id]/route.js +1 -1
  125. package/app/.next/server/app/api/keys/[id]/route.js.nft.json +1 -1
  126. package/app/.next/server/app/api/keys/[id]/usage/route.js +1 -1
  127. package/app/.next/server/app/api/keys/[id]/usage/route.js.nft.json +1 -1
  128. package/app/.next/server/app/api/oauth/[provider]/[action]/route.js +1 -1
  129. package/app/.next/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  130. package/app/.next/server/app/api/oauth/codex/bulk-import/route.js +1 -1
  131. package/app/.next/server/app/api/oauth/codex/bulk-import/route.js.nft.json +1 -1
  132. package/app/.next/server/app/api/oauth/codex/import-token/route.js +1 -1
  133. package/app/.next/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
  134. package/app/.next/server/app/api/oauth/cursor/auto-import/route.js +2 -2
  135. package/app/.next/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
  136. package/app/.next/server/app/api/providers/[id]/models/route.js +1 -1
  137. package/app/.next/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  138. package/app/.next/server/app/api/providers/[id]/test/route.js +1 -1
  139. package/app/.next/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  140. package/app/.next/server/app/api/providers/client/route.js +1 -1
  141. package/app/.next/server/app/api/providers/client/route.js.nft.json +1 -1
  142. package/app/.next/server/app/api/providers/test-batch/route.js +1 -1
  143. package/app/.next/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  144. package/app/.next/server/app/api/providers/validate/route.js +1 -1
  145. package/app/.next/server/app/api/providers/validate/route.js.nft.json +1 -1
  146. package/app/.next/server/app/api/settings/route.js +1 -1
  147. package/app/.next/server/app/api/settings/route.js.nft.json +1 -1
  148. package/app/.next/server/app/api/translator/send/route.js +1 -1
  149. package/app/.next/server/app/api/translator/send/route.js.nft.json +1 -1
  150. package/app/.next/server/app/api/translator/translate/route.js +1 -1
  151. package/app/.next/server/app/api/translator/translate/route.js.nft.json +1 -1
  152. package/app/.next/server/app/api/tunnel/disable/route.js +1 -1
  153. package/app/.next/server/app/api/tunnel/disable/route.js.nft.json +1 -1
  154. package/app/.next/server/app/api/tunnel/enable/route.js +1 -1
  155. package/app/.next/server/app/api/tunnel/enable/route.js.nft.json +1 -1
  156. package/app/.next/server/app/api/tunnel/tailscale-disable/route.js +1 -1
  157. package/app/.next/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
  158. package/app/.next/server/app/api/tunnel/tailscale-enable/route.js +1 -1
  159. package/app/.next/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
  160. package/app/.next/server/app/api/tunnel/tailscale-install/route.js +2 -2
  161. package/app/.next/server/app/api/usage/[connectionId]/codex-reset-credits/route.js +1 -1
  162. package/app/.next/server/app/api/usage/[connectionId]/codex-reset-credits/route.js.nft.json +1 -1
  163. package/app/.next/server/app/api/usage/[connectionId]/route.js +1 -1
  164. package/app/.next/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  165. package/app/.next/server/app/api/usage/chart/route.js +1 -1
  166. package/app/.next/server/app/api/usage/chart/route.js.nft.json +1 -1
  167. package/app/.next/server/app/api/usage/history/route.js +1 -1
  168. package/app/.next/server/app/api/usage/history/route.js.nft.json +1 -1
  169. package/app/.next/server/app/api/usage/logs/route.js +1 -1
  170. package/app/.next/server/app/api/usage/logs/route.js.nft.json +1 -1
  171. package/app/.next/server/app/api/usage/report/route.js +1 -1
  172. package/app/.next/server/app/api/usage/report/route.js.nft.json +1 -1
  173. package/app/.next/server/app/api/usage/request-details/route.js +1 -1
  174. package/app/.next/server/app/api/usage/request-details/route.js.nft.json +1 -1
  175. package/app/.next/server/app/api/usage/request-logs/route.js +1 -1
  176. package/app/.next/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  177. package/app/.next/server/app/api/usage/stats/route.js +1 -1
  178. package/app/.next/server/app/api/usage/stats/route.js.nft.json +1 -1
  179. package/app/.next/server/app/api/usage/stream/route.js +1 -1
  180. package/app/.next/server/app/api/usage/stream/route.js.nft.json +1 -1
  181. package/app/.next/server/app/api/v1/api/chat/route.js +1 -1
  182. package/app/.next/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  183. package/app/.next/server/app/api/v1/chat/completions/route.js +1 -1
  184. package/app/.next/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  185. package/app/.next/server/app/api/v1/embeddings/route.js +1 -1
  186. package/app/.next/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  187. package/app/.next/server/app/api/v1/images/generations/route.js +1 -1
  188. package/app/.next/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  189. package/app/.next/server/app/api/v1/messages/route.js +1 -1
  190. package/app/.next/server/app/api/v1/messages/route.js.nft.json +1 -1
  191. package/app/.next/server/app/api/v1/models/[kind]/route.js +1 -1
  192. package/app/.next/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
  193. package/app/.next/server/app/api/v1/models/route.js +1 -1
  194. package/app/.next/server/app/api/v1/models/route.js.nft.json +1 -1
  195. package/app/.next/server/app/api/v1/responses/compact/route.js +1 -1
  196. package/app/.next/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  197. package/app/.next/server/app/api/v1/responses/route.js +1 -1
  198. package/app/.next/server/app/api/v1/responses/route.js.nft.json +1 -1
  199. package/app/.next/server/app/api/v1/route.js +1 -1
  200. package/app/.next/server/app/api/v1/route.js.nft.json +1 -1
  201. package/app/.next/server/app/api/v1/search/route.js +1 -1
  202. package/app/.next/server/app/api/v1/search/route.js.nft.json +1 -1
  203. package/app/.next/server/app/api/v1/videos/[id]/route.js +1 -1
  204. package/app/.next/server/app/api/v1/videos/[id]/route.js.nft.json +1 -1
  205. package/app/.next/server/app/api/v1/videos/edits/route.js +1 -1
  206. package/app/.next/server/app/api/v1/videos/edits/route.js.nft.json +1 -1
  207. package/app/.next/server/app/api/v1/videos/extensions/route.js +1 -1
  208. package/app/.next/server/app/api/v1/videos/extensions/route.js.nft.json +1 -1
  209. package/app/.next/server/app/api/v1/videos/generations/route.js +1 -1
  210. package/app/.next/server/app/api/v1/videos/generations/route.js.nft.json +1 -1
  211. package/app/.next/server/app/api/v1/web/fetch/route.js +1 -1
  212. package/app/.next/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
  213. package/app/.next/server/app/api/v1beta/models/[...path]/route.js +1 -1
  214. package/app/.next/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  215. package/app/.next/server/app/api/version/route.js +1 -1
  216. package/app/.next/server/app/callback/page.js +1 -1
  217. package/app/.next/server/app/callback/page.js.nft.json +1 -1
  218. package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  219. package/app/.next/server/app/callback.html +1 -1
  220. package/app/.next/server/app/callback.rsc +3 -3
  221. package/app/.next/server/app/callback.segments/_full.segment.rsc +3 -3
  222. package/app/.next/server/app/callback.segments/_head.segment.rsc +1 -1
  223. package/app/.next/server/app/callback.segments/_index.segment.rsc +3 -3
  224. package/app/.next/server/app/callback.segments/_tree.segment.rsc +1 -1
  225. package/app/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  226. package/app/.next/server/app/callback.segments/callback.segment.rsc +1 -1
  227. package/app/.next/server/app/dashboard/basic-chat.html +1 -1
  228. package/app/.next/server/app/dashboard/basic-chat.rsc +5 -5
  229. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  230. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  231. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  232. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  233. package/app/.next/server/app/dashboard/basic-chat.segments/_full.segment.rsc +5 -5
  234. package/app/.next/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  235. package/app/.next/server/app/dashboard/basic-chat.segments/_index.segment.rsc +3 -3
  236. package/app/.next/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  237. package/app/.next/server/app/dashboard/cli-tools.html +1 -1
  238. package/app/.next/server/app/dashboard/cli-tools.rsc +5 -5
  239. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  240. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  241. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  242. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  243. package/app/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +5 -5
  244. package/app/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  245. package/app/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +3 -3
  246. package/app/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  247. package/app/.next/server/app/dashboard/combos.html +1 -1
  248. package/app/.next/server/app/dashboard/combos.rsc +5 -5
  249. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  250. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  251. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  252. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  253. package/app/.next/server/app/dashboard/combos.segments/_full.segment.rsc +5 -5
  254. package/app/.next/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  255. package/app/.next/server/app/dashboard/combos.segments/_index.segment.rsc +3 -3
  256. package/app/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  257. package/app/.next/server/app/dashboard/endpoint.html +1 -1
  258. package/app/.next/server/app/dashboard/endpoint.rsc +5 -5
  259. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  260. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  261. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  262. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  263. package/app/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +5 -5
  264. package/app/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  265. package/app/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +3 -3
  266. package/app/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  267. package/app/.next/server/app/dashboard/media-providers/web.html +1 -1
  268. package/app/.next/server/app/dashboard/media-providers/web.rsc +5 -5
  269. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  270. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  271. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  272. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  273. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  274. package/app/.next/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +5 -5
  275. package/app/.next/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  276. package/app/.next/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +3 -3
  277. package/app/.next/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
  278. package/app/.next/server/app/dashboard/mitm.html +1 -1
  279. package/app/.next/server/app/dashboard/mitm.rsc +5 -5
  280. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  281. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  282. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  283. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  284. package/app/.next/server/app/dashboard/mitm.segments/_full.segment.rsc +5 -5
  285. package/app/.next/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  286. package/app/.next/server/app/dashboard/mitm.segments/_index.segment.rsc +3 -3
  287. package/app/.next/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
  288. package/app/.next/server/app/dashboard/profile.html +1 -1
  289. package/app/.next/server/app/dashboard/profile.rsc +5 -5
  290. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  291. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  292. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  293. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  294. package/app/.next/server/app/dashboard/profile.segments/_full.segment.rsc +5 -5
  295. package/app/.next/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  296. package/app/.next/server/app/dashboard/profile.segments/_index.segment.rsc +3 -3
  297. package/app/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  298. package/app/.next/server/app/dashboard/providers/new.html +1 -1
  299. package/app/.next/server/app/dashboard/providers/new.rsc +5 -5
  300. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  301. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  302. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  303. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  304. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  305. package/app/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +5 -5
  306. package/app/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  307. package/app/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +3 -3
  308. package/app/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  309. package/app/.next/server/app/dashboard/providers.html +1 -1
  310. package/app/.next/server/app/dashboard/providers.rsc +5 -5
  311. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  312. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  313. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  314. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  315. package/app/.next/server/app/dashboard/providers.segments/_full.segment.rsc +5 -5
  316. package/app/.next/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  317. package/app/.next/server/app/dashboard/providers.segments/_index.segment.rsc +3 -3
  318. package/app/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  319. package/app/.next/server/app/dashboard/proxy-pools.html +1 -1
  320. package/app/.next/server/app/dashboard/proxy-pools.rsc +5 -5
  321. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  322. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  323. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  324. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  325. package/app/.next/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +5 -5
  326. package/app/.next/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  327. package/app/.next/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +3 -3
  328. package/app/.next/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  329. package/app/.next/server/app/dashboard/pxpipe.html +1 -1
  330. package/app/.next/server/app/dashboard/pxpipe.rsc +5 -5
  331. package/app/.next/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +2 -2
  332. package/app/.next/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe.segment.rsc +1 -1
  333. package/app/.next/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  334. package/app/.next/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  335. package/app/.next/server/app/dashboard/pxpipe.segments/_full.segment.rsc +5 -5
  336. package/app/.next/server/app/dashboard/pxpipe.segments/_head.segment.rsc +1 -1
  337. package/app/.next/server/app/dashboard/pxpipe.segments/_index.segment.rsc +3 -3
  338. package/app/.next/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +1 -1
  339. package/app/.next/server/app/dashboard/quota.html +2 -2
  340. package/app/.next/server/app/dashboard/quota.rsc +6 -6
  341. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  342. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  343. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  344. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  345. package/app/.next/server/app/dashboard/quota.segments/_full.segment.rsc +6 -6
  346. package/app/.next/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  347. package/app/.next/server/app/dashboard/quota.segments/_index.segment.rsc +3 -3
  348. package/app/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  349. package/app/.next/server/app/dashboard/settings/pricing/page.js +1 -1
  350. package/app/.next/server/app/dashboard/settings/pricing/page.js.nft.json +1 -1
  351. package/app/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  352. package/app/.next/server/app/dashboard/settings/pricing.html +1 -1
  353. package/app/.next/server/app/dashboard/settings/pricing.rsc +3 -3
  354. package/app/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
  355. package/app/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  356. package/app/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +3 -3
  357. package/app/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  358. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  359. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  360. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  361. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  362. package/app/.next/server/app/dashboard/skills.html +1 -1
  363. package/app/.next/server/app/dashboard/skills.rsc +5 -5
  364. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +2 -2
  365. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills.segment.rsc +1 -1
  366. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  367. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  368. package/app/.next/server/app/dashboard/skills.segments/_full.segment.rsc +5 -5
  369. package/app/.next/server/app/dashboard/skills.segments/_head.segment.rsc +1 -1
  370. package/app/.next/server/app/dashboard/skills.segments/_index.segment.rsc +3 -3
  371. package/app/.next/server/app/dashboard/skills.segments/_tree.segment.rsc +1 -1
  372. package/app/.next/server/app/dashboard/token-saver.html +1 -1
  373. package/app/.next/server/app/dashboard/token-saver.rsc +5 -5
  374. package/app/.next/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +2 -2
  375. package/app/.next/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver.segment.rsc +1 -1
  376. package/app/.next/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  377. package/app/.next/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  378. package/app/.next/server/app/dashboard/token-saver.segments/_full.segment.rsc +5 -5
  379. package/app/.next/server/app/dashboard/token-saver.segments/_head.segment.rsc +1 -1
  380. package/app/.next/server/app/dashboard/token-saver.segments/_index.segment.rsc +3 -3
  381. package/app/.next/server/app/dashboard/token-saver.segments/_tree.segment.rsc +1 -1
  382. package/app/.next/server/app/dashboard/translator.html +1 -1
  383. package/app/.next/server/app/dashboard/translator.rsc +5 -5
  384. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  385. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  386. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  387. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  388. package/app/.next/server/app/dashboard/translator.segments/_full.segment.rsc +5 -5
  389. package/app/.next/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  390. package/app/.next/server/app/dashboard/translator.segments/_index.segment.rsc +3 -3
  391. package/app/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  392. package/app/.next/server/app/dashboard/usage.html +1 -1
  393. package/app/.next/server/app/dashboard/usage.rsc +5 -5
  394. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  395. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  396. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  397. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  398. package/app/.next/server/app/dashboard/usage.segments/_full.segment.rsc +5 -5
  399. package/app/.next/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  400. package/app/.next/server/app/dashboard/usage.segments/_index.segment.rsc +3 -3
  401. package/app/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  402. package/app/.next/server/app/dashboard.html +1 -1
  403. package/app/.next/server/app/dashboard.rsc +5 -5
  404. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  405. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  406. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  407. package/app/.next/server/app/dashboard.segments/_full.segment.rsc +5 -5
  408. package/app/.next/server/app/dashboard.segments/_head.segment.rsc +1 -1
  409. package/app/.next/server/app/dashboard.segments/_index.segment.rsc +3 -3
  410. package/app/.next/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  411. package/app/.next/server/app/index.html +1 -1
  412. package/app/.next/server/app/index.rsc +3 -3
  413. package/app/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  414. package/app/.next/server/app/index.segments/_full.segment.rsc +3 -3
  415. package/app/.next/server/app/index.segments/_head.segment.rsc +1 -1
  416. package/app/.next/server/app/index.segments/_index.segment.rsc +3 -3
  417. package/app/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  418. package/app/.next/server/app/landing/page.js +1 -1
  419. package/app/.next/server/app/landing/page.js.nft.json +1 -1
  420. package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  421. package/app/.next/server/app/landing.html +1 -1
  422. package/app/.next/server/app/landing.rsc +3 -3
  423. package/app/.next/server/app/landing.segments/_full.segment.rsc +3 -3
  424. package/app/.next/server/app/landing.segments/_head.segment.rsc +1 -1
  425. package/app/.next/server/app/landing.segments/_index.segment.rsc +3 -3
  426. package/app/.next/server/app/landing.segments/_tree.segment.rsc +1 -1
  427. package/app/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  428. package/app/.next/server/app/landing.segments/landing.segment.rsc +1 -1
  429. package/app/.next/server/app/login/page.js +1 -1
  430. package/app/.next/server/app/login/page.js.nft.json +1 -1
  431. package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
  432. package/app/.next/server/app/login.html +1 -1
  433. package/app/.next/server/app/login.rsc +4 -4
  434. package/app/.next/server/app/login.segments/_full.segment.rsc +4 -4
  435. package/app/.next/server/app/login.segments/_head.segment.rsc +1 -1
  436. package/app/.next/server/app/login.segments/_index.segment.rsc +3 -3
  437. package/app/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  438. package/app/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  439. package/app/.next/server/app/login.segments/login.segment.rsc +1 -1
  440. package/app/.next/server/app/page.js +1 -1
  441. package/app/.next/server/app/page.js.nft.json +1 -1
  442. package/app/.next/server/app/page_client-reference-manifest.js +1 -1
  443. package/app/.next/server/app-paths-manifest.json +16 -16
  444. package/app/.next/server/chunks/112.js +1 -1
  445. package/app/.next/server/chunks/1470.js +1 -1
  446. package/app/.next/server/chunks/3481.js +1 -1
  447. package/app/.next/server/chunks/3913.js +1 -1
  448. package/app/.next/server/chunks/4037.js +1 -1
  449. package/app/.next/server/chunks/412.js +1 -1
  450. package/app/.next/server/chunks/4334.js +2 -2
  451. package/app/.next/server/chunks/4705.js +1 -1
  452. package/app/.next/server/chunks/4953.js +1 -1
  453. package/app/.next/server/chunks/5285.js +1 -1
  454. package/app/.next/server/chunks/6306.js +1 -1
  455. package/app/.next/server/chunks/6671.js +1 -1
  456. package/app/.next/server/chunks/6763.js +1 -1
  457. package/app/.next/server/chunks/7137.js +1 -1
  458. package/app/.next/server/chunks/7211.js +1 -1
  459. package/app/.next/server/chunks/8145.js +1 -1
  460. package/app/.next/server/chunks/8301.js +1 -1
  461. package/app/.next/server/chunks/8499.js +1 -1
  462. package/app/.next/server/chunks/869.js +1 -1
  463. package/app/.next/server/chunks/8895.js +1 -1
  464. package/app/.next/server/chunks/8920.js +1 -1
  465. package/app/.next/server/middleware-build-manifest.js +1 -1
  466. package/app/.next/server/pages/404.html +1 -1
  467. package/app/.next/server/pages/500.html +1 -1
  468. package/app/.next/server/server-reference-manifest.js +1 -1
  469. package/app/.next/server/server-reference-manifest.json +1 -1
  470. package/app/.next/static/chunks/1321-13f12c43bc4c573f.js +1 -0
  471. package/app/.next/static/chunks/3277-5ccea691719301a1.js +64 -0
  472. package/app/.next/static/chunks/{4028-9d0d68c835868df5.js → 4028-85ab0e23e6b475d3.js} +7 -7
  473. package/app/.next/static/chunks/5497-b32d50ab4f6874e1.js +7 -0
  474. package/app/.next/static/chunks/{8198-bf66ab4ae1cda8e0.js → 8198-8a92496ac8c02cb7.js} +1 -1
  475. package/app/open-sse/providers/capabilities.js +16 -0
  476. package/app/open-sse/providers/pricing.js +4 -0
  477. package/app/open-sse/providers/registry/antigravity.js +3 -0
  478. package/app/open-sse/providers/registry/commandcode.js +7 -0
  479. package/app/open-sse/providers/registry/gemini.js +1 -0
  480. package/app/open-sse/services/usage/google.js +34 -1
  481. package/app/open-sse/translator/concerns/prefetch.js +3 -0
  482. package/app/open-sse/translator/request/openai-to-commandcode.js +36 -1
  483. package/app/package.json +4 -2
  484. package/app/server.js +1 -1
  485. package/app/src/mitm/config.js +5 -2
  486. package/app/src/shared/constants/cliTools.js +4 -1
  487. package/hooks/postinstall.js +9 -182
  488. package/package.json +1 -1
  489. package/app/.next/static/chunks/1321-99f0141dbac9848a.js +0 -1
  490. package/app/.next/static/chunks/3277-443e21d6166585f4.js +0 -64
  491. package/app/.next/static/chunks/5497-017258c3c16b719e.js +0 -7
  492. package/app/node_modules/bindings/bindings.js +0 -221
  493. package/app/node_modules/bindings/package.json +0 -28
  494. package/app/node_modules/file-uri-to-path/index.js +0 -66
  495. package/app/node_modules/file-uri-to-path/package.json +0 -32
  496. /package/app/.next/static/{flxITMsAmoXf-wWjPORMD → KyRBZmQI6kYmOhE879dai}/_buildManifest.js +0 -0
  497. /package/app/.next/static/{flxITMsAmoXf-wWjPORMD → KyRBZmQI6kYmOhE879dai}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8198],{11017:(e,t,r)=>{function n(e){if(null==e)return null;let t=String(e).trim();if(!t)return null;let r=t.toLowerCase();return r.includes("ultra")?"Ultra":r.includes("pro")?"Pro":r.includes("plus")?"Plus":r.includes("free")?"Free":null}function a(e){if(!e)return null;if("string"==typeof e)return n(e);for(let t of[e.accountType,e.plan,e.paidTier?.name,e.subscriptionTier,e.subscription_tier,e.currentTier?.name,e.subscriptionInfo?.paidTier?.name,e.quota?.subscription_tier,e.subscriptionInfo?.currentTier?.name]){let e=n(t);if(e)return e}return null}r.d(t,{_P:()=>a,fd:()=>n}),["Free","Plus","Pro","Ultra"].map(e=>({value:e,label:e}))},57294:(e,t,r)=>{r.d(t,{$4:()=>j,$L:()=>_,AA:()=>g,AI:()=>a,ED:()=>A,Ih:()=>M,JJ:()=>h,J_:()=>i,Jp:()=>O,Ld:()=>C,Uh:()=>E,WA:()=>l,W_:()=>I,Wg:()=>s,Xr:()=>q,ZS:()=>S,b8:()=>f,dE:()=>k,dR:()=>z,fZ:()=>u,fr:()=>D,g5:()=>y,ku:()=>b,kx:()=>w,mO:()=>$,pT:()=>c,sL:()=>F,sQ:()=>T,uf:()=>p,vF:()=>d,w2:()=>o,wU:()=>P,wi:()=>v});var n=r(45564);let a="quotaCacheData",i=6e4,o=6e5,u=5,l="quotaAutoRefresh",s=20,c=[10,20,50,100],f=500,g=[{value:"all",label:"All accounts"},{value:"active",label:"Active"},{value:"inactive",label:"Turned off"}],d=[{value:"default",label:"Default quota order"},{value:"remaining-asc",label:"% quota: low to high"},{value:"remaining-desc",label:"% quota: high to low"}];function h(e){return e.name?.trim()||e.email?.trim()||e.displayName?.trim()||null}function m(e,t){let r=t[e.id]?.quotas?.[0];return r&&"number"==typeof r.remaining?r.remaining:1/0}function p(e,t,r,n,a){if("codex"===n&&"default"!==a)return[...e].sort((e,r)=>{let n=m(e,t),i=m(r,t),o="remaining-asc"===a?n-i:i-n;return 0!==o?o:(h(e)||"").localeCompare(h(r)||"")});if(!r){let t=new Map;for(let r of e){let e=r.provider||"";t.has(e)||t.set(e,[]),t.get(e).push(r)}return Array.from(t.values()).flat()}let i=e=>{let r=(t[e.id]?.quotas||[]).map(e=>e.resetAt?new Date(e.resetAt).getTime():1/0).filter(e=>Number.isFinite(e));return r.length>0?Math.min(...r):1/0};return[...e].sort((e,t)=>{let r=i(e)-i(t);return 0!==r?r:(e.provider||"").localeCompare(t.provider||"")||(h(e)||"").localeCompare(h(t)||"")})}function b(e){let t={};return e.forEach(e=>{t[e.id]=!0}),t}function A(e,t){let r=new Set(t.map(e=>e.id));return Object.fromEntries(Object.entries(e).filter(([e])=>r.has(e)))}function y(e,t,r){return e.eligibleConnections?e.providerFilteredConnections?{icon:"filter_alt_off",title:"No Accounts On This Page",description:"Try moving to another page or refreshing the current filters."}:{icon:"filter_alt_off",title:"No Accounts Match Current Filters",description:"all"===t?"Try changing the account status filter to see more quota trackers.":`No ${"inactive"===r?"turned off":"active"===r?"active":"matching"} accounts found for ${t}.`}:{icon:"cloud_off",title:"No Providers Connected",description:"Connect to providers with OAuth to track your API quota limits and usage."}}function q(e,t){return t?`Custom: ${e} / page`:`${e} / page`}function w(e){var t;let{start:r,end:n}=(t=e).total?{start:(t.page-1)*t.pageSize+1,end:Math.min(t.page*t.pageSize,t.total)}:{start:0,end:0};return`Showing ${r}-${n} of ${e.total}`}function v(e,t){return e||{page:1,pageSize:t,total:0,totalPages:1}}function k(e,t=0){return e||{eligibleConnections:t,providerFilteredConnections:t}}function P(e,t){return e!==t}function S(e,t){return e?.page||t}function E(e){return e||[]}async function O(e,t){return await e(t)}function C(){try{let e=window.localStorage.getItem(a);return e?JSON.parse(e):{}}catch(e){return console.error("Error reading quota cache:",e),{}}}function D(e,t){try{let r=C();r[e]={...t,cachedAt:new Date().toISOString()},window.localStorage.setItem(a,JSON.stringify(r))}catch(e){console.error("Error writing quota cache:",e)}}function $(e){if(!e)return"-";try{let t="string"==typeof e?new Date(e):e,r=new Date,n=t-r;if(n<=0)return"-";let a=Math.ceil(n/6e4);if(a<60)return`${a}m`;let i=Math.floor(a/60),o=a%60;if(i<24)return`${i}h ${o}m`;let u=Math.floor(i/24);return`${u}d ${i%24}h ${o}m`}catch(e){return"-"}}function T(e){if(!e)return null;try{let t="string"==typeof e?new Date(e):e,r=new Date,n=new Date(r.getFullYear(),r.getMonth(),r.getDate()),a=new Date(n);a.setDate(a.getDate()+1);let i=new Date(a);i.setDate(i.getDate()+1);let o="";o=t>=n&&t<a?"Today":t>=a&&t<i?"Tomorrow":t.toLocaleDateString("en-US",{month:"short",day:"numeric"});let u=t.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0});return`${o}, ${u}`}catch{return null}}function j(e,t){return t&&0!==t?!e||e<0?100:e>=t?0:Math.round((t-e)/t*100):0}function _(e){return e?.remaining!==void 0?Math.max(0,Math.round(e.remaining)):e?.remainingPercentage!==void 0?Math.round(e.remainingPercentage):j(e?.used,e?.total)}function M(e){return e&&"object"==typeof e?String(e.modelKey||e.name||"").trim():""}function N(e,t){let r=t?.[e]?.hidden;return new Set(Array.isArray(r)?r.map(String):[])}function z(e,t=[],r={}){if(!Array.isArray(t)||0===t.length)return[];let n=N(e,r);return 0===n.size?t:t.filter(e=>!n.has(M(e)))}function F(e,t=[],r={}){if(!Array.isArray(t)||0===t.length)return[];let n=N(e,r);return 0===n.size?[]:t.filter(e=>n.has(M(e)))}function I(e,t){if(!t||"object"!=typeof t)return[];let r=[];try{switch(e.toLowerCase()){case"github":default:t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"antigravity":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:t.displayName||e,modelKey:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null,remainingPercentage:t.remainingPercentage})});break;case"codex":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,remaining:t.remaining,resetAt:t.resetAt||null})});break;case"kiro":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"qoder":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{("organization"!==e||t&&0!==(Number(t.total)||0))&&r.push({name:"user"===e?"Personal":"organization"===e?"Organization":e,used:t.used||0,total:t.total||0,unit:t.unit,resetAt:t.resetAt||null})});break;case"claude":t.message?r.push({name:"error",used:0,total:0,resetAt:null,message:t.message}):t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"vercel-ai-gateway":case"ollama":case"deepseek":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null,remainingPercentage:t.remainingPercentage})});break;case"codebuddy-cn":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null,recurring:!1!==t.recurring})});break;case"grok-cli":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null,remainingPercentage:t.remainingPercentage})});break;case"kimi":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null,remainingPercentage:t.remainingPercentage})})}}catch(t){return console.error(`Error parsing quota data for ${e}:`,t),[]}let a=(0,n.KC)(e);if(a.length>0){let t=new Map(a.map((e,t)=>[e.id,t]));if("antigravity"===e.toLowerCase()&&!t.has("gemini-3.7-flash-tiered")){let e=t.has("gemini-3.7-flash-high")?t.get("gemini-3.7-flash-high"):0;t.set("gemini-3.7-flash-tiered",e-.5)}r.sort((e,r)=>{let n=e.modelKey||e.name,a=r.modelKey||r.name;return(t.get(n)??999)-(t.get(a)??999)})}return r}}}]);
1
+ "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8198],{11017:(e,t,r)=>{function n(e){if(null==e)return null;let t=String(e).trim();if(!t)return null;let r=t.toLowerCase();return r.includes("ultra")?"Ultra":r.includes("pro")?"Pro":r.includes("plus")?"Plus":r.includes("free")?"Free":null}function a(e){if(!e)return null;if("string"==typeof e)return n(e);for(let t of[e.accountType,e.plan,e.paidTier?.name,e.subscriptionTier,e.subscription_tier,e.currentTier?.name,e.subscriptionInfo?.paidTier?.name,e.quota?.subscription_tier,e.subscriptionInfo?.currentTier?.name]){let e=n(t);if(e)return e}return null}r.d(t,{_P:()=>a,fd:()=>n}),["Free","Plus","Pro","Ultra"].map(e=>({value:e,label:e}))},57294:(e,t,r)=>{r.d(t,{$4:()=>j,$L:()=>_,AA:()=>g,AI:()=>a,ED:()=>A,Ih:()=>M,JJ:()=>d,J_:()=>i,Jp:()=>O,Ld:()=>C,Uh:()=>E,WA:()=>s,W_:()=>I,Wg:()=>l,Xr:()=>q,ZS:()=>S,b8:()=>f,dE:()=>k,dR:()=>z,fZ:()=>u,fr:()=>D,g5:()=>y,ku:()=>b,kx:()=>w,mO:()=>$,pT:()=>c,sL:()=>F,sQ:()=>T,uf:()=>p,vF:()=>h,w2:()=>o,wU:()=>P,wi:()=>v});var n=r(45564);let a="quotaCacheData",i=6e4,o=6e5,u=5,s="quotaAutoRefresh",l=20,c=[10,20,50,100],f=500,g=[{value:"all",label:"All accounts"},{value:"active",label:"Active"},{value:"inactive",label:"Turned off"}],h=[{value:"default",label:"Default quota order"},{value:"remaining-asc",label:"% quota: low to high"},{value:"remaining-desc",label:"% quota: high to low"}];function d(e){return e.name?.trim()||e.email?.trim()||e.displayName?.trim()||null}function m(e,t){let r=t[e.id]?.quotas?.[0];return r&&"number"==typeof r.remaining?r.remaining:1/0}function p(e,t,r,n,a){if("codex"===n&&"default"!==a)return[...e].sort((e,r)=>{let n=m(e,t),i=m(r,t),o="remaining-asc"===a?n-i:i-n;return 0!==o?o:(d(e)||"").localeCompare(d(r)||"")});if(!r){let t=new Map;for(let r of e){let e=r.provider||"";t.has(e)||t.set(e,[]),t.get(e).push(r)}return Array.from(t.values()).flat()}let i=e=>{let r=(t[e.id]?.quotas||[]).map(e=>e.resetAt?new Date(e.resetAt).getTime():1/0).filter(e=>Number.isFinite(e));return r.length>0?Math.min(...r):1/0};return[...e].sort((e,t)=>{let r=i(e)-i(t);return 0!==r?r:(e.provider||"").localeCompare(t.provider||"")||(d(e)||"").localeCompare(d(t)||"")})}function b(e){let t={};return e.forEach(e=>{t[e.id]=!0}),t}function A(e,t){let r=new Set(t.map(e=>e.id));return Object.fromEntries(Object.entries(e).filter(([e])=>r.has(e)))}function y(e,t,r){return e.eligibleConnections?e.providerFilteredConnections?{icon:"filter_alt_off",title:"No Accounts On This Page",description:"Try moving to another page or refreshing the current filters."}:{icon:"filter_alt_off",title:"No Accounts Match Current Filters",description:"all"===t?"Try changing the account status filter to see more quota trackers.":`No ${"inactive"===r?"turned off":"active"===r?"active":"matching"} accounts found for ${t}.`}:{icon:"cloud_off",title:"No Providers Connected",description:"Connect to providers with OAuth to track your API quota limits and usage."}}function q(e,t){return t?`Custom: ${e} / page`:`${e} / page`}function w(e){var t;let{start:r,end:n}=(t=e).total?{start:(t.page-1)*t.pageSize+1,end:Math.min(t.page*t.pageSize,t.total)}:{start:0,end:0};return`Showing ${r}-${n} of ${e.total}`}function v(e,t){return e||{page:1,pageSize:t,total:0,totalPages:1}}function k(e,t=0){return e||{eligibleConnections:t,providerFilteredConnections:t}}function P(e,t){return e!==t}function S(e,t){return e?.page||t}function E(e){return e||[]}async function O(e,t){return await e(t)}function C(){try{let e=window.localStorage.getItem(a);return e?JSON.parse(e):{}}catch(e){return console.error("Error reading quota cache:",e),{}}}function D(e,t){try{let r=C();r[e]={...t,cachedAt:new Date().toISOString()},window.localStorage.setItem(a,JSON.stringify(r))}catch(e){console.error("Error writing quota cache:",e)}}function $(e){if(!e)return"-";try{let t="string"==typeof e?new Date(e):e,r=new Date,n=t-r;if(n<=0)return"-";let a=Math.ceil(n/6e4);if(a<60)return`${a}m`;let i=Math.floor(a/60),o=a%60;if(i<24)return`${i}h ${o}m`;let u=Math.floor(i/24);return`${u}d ${i%24}h ${o}m`}catch(e){return"-"}}function T(e){if(!e)return null;try{let t="string"==typeof e?new Date(e):e,r=new Date,n=new Date(r.getFullYear(),r.getMonth(),r.getDate()),a=new Date(n);a.setDate(a.getDate()+1);let i=new Date(a);i.setDate(i.getDate()+1);let o="";o=t>=n&&t<a?"Today":t>=a&&t<i?"Tomorrow":t.toLocaleDateString("en-US",{month:"short",day:"numeric"});let u=t.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0});return`${o}, ${u}`}catch{return null}}function j(e,t){return t&&0!==t?!e||e<0?100:e>=t?0:Math.round((t-e)/t*100):0}function _(e){return e?.remaining!==void 0?Math.max(0,Math.round(e.remaining)):e?.remainingPercentage!==void 0?Math.round(e.remainingPercentage):j(e?.used,e?.total)}function M(e){return e&&"object"==typeof e?String(e.modelKey||e.name||"").trim():""}function N(e,t){let r=t?.[e]?.hidden;return new Set(Array.isArray(r)?r.map(String):[])}function z(e,t=[],r={}){if(!Array.isArray(t)||0===t.length)return[];let n=N(e,r);return 0===n.size?t:t.filter(e=>!n.has(M(e)))}function F(e,t=[],r={}){if(!Array.isArray(t)||0===t.length)return[];let n=N(e,r);return 0===n.size?[]:t.filter(e=>n.has(M(e)))}function I(e,t){if(!t||"object"!=typeof t)return[];let r=[];try{switch(e.toLowerCase()){case"github":default:t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"antigravity":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:t.displayName||e,modelKey:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null,remainingPercentage:t.remainingPercentage})});break;case"codex":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,remaining:t.remaining,resetAt:t.resetAt||null})});break;case"kiro":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"qoder":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{("organization"!==e||t&&0!==(Number(t.total)||0))&&r.push({name:"user"===e?"Personal":"organization"===e?"Organization":e,used:t.used||0,total:t.total||0,unit:t.unit,resetAt:t.resetAt||null})});break;case"claude":t.message?r.push({name:"error",used:0,total:0,resetAt:null,message:t.message}):t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"vercel-ai-gateway":case"ollama":case"deepseek":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null,remainingPercentage:t.remainingPercentage})});break;case"codebuddy-cn":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null,recurring:!1!==t.recurring})});break;case"grok-cli":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null,remainingPercentage:t.remainingPercentage})});break;case"kimi":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null,remainingPercentage:t.remainingPercentage})})}}catch(t){return console.error(`Error parsing quota data for ${e}:`,t),[]}let a=(0,n.KC)(e);if(a.length>0){let t=new Map(a.map((e,t)=>[e.id,t]));if("antigravity"===e.toLowerCase()){if(!t.has("gemini-3.8-flash")){let e=t.has("gemini-3.8-flash-high")?t.get("gemini-3.8-flash-high"):0;t.set("gemini-3.8-flash",e-.5)}if(!t.has("gemini-3.8-flash-tiered")){let e=t.has("gemini-3.8-flash-high")?t.get("gemini-3.8-flash-high"):0;t.set("gemini-3.8-flash-tiered",e-.5)}if(!t.has("gemini-3.7-flash-tiered")){let e=t.has("gemini-3.7-flash-high")?t.get("gemini-3.7-flash-high"):0;t.set("gemini-3.7-flash-tiered",e-.5)}}r.sort((e,r)=>{let n=e.modelKey||e.name,a=r.modelKey||r.name;return(t.get(n)??999)-(t.get(a)??999)})}return r}}}]);
@@ -205,6 +205,7 @@ export const PATTERN_CAPABILITIES = [
205
205
 
206
206
  // ── Gemini (all 2.0+ multimodal + google_search grounding, 1M ctx) ─
207
207
  { pattern: "*gemini*image*", caps: { vision: true, imageOutput: true, contextWindow: 1048576 } },
208
+ { pattern: "*gemini-3.8*", caps: { vision: true, audioInput: true, videoInput: true, reasoning: true, search: true, thinkingFormat: "gemini-level", thinkingCanDisable: false, contextWindow: 1048576, maxOutput: 65536 } },
208
209
  { pattern: "*gemini-3.7*", caps: { vision: true, audioInput: true, videoInput: true, reasoning: true, search: true, thinkingFormat: "gemini-level", thinkingCanDisable: false, contextWindow: 1048576, maxOutput: 65536 } },
209
210
  { pattern: "*gemini-3*pro*", caps: { vision: true, audioInput: true, videoInput: true, reasoning: true, search: true, thinkingFormat: "gemini-level", thinkingCanDisable: false, contextWindow: 1048576, maxOutput: 65535 } },
210
211
  { pattern: "*gemini-3*", caps: { vision: true, audioInput: true, videoInput: true, reasoning: true, search: true, thinkingFormat: "gemini-level", thinkingCanDisable: false, contextWindow: 1048576, maxOutput: 65536 } },
@@ -244,10 +245,18 @@ export const PATTERN_CAPABILITIES = [
244
245
  { pattern: "*qwen*vl*", caps: { vision: true, reasoning: true, thinkingFormat: "qwen", contextWindow: 262144 } },
245
246
  { pattern: "*qwen*omni*", caps: { vision: true, audioInput: true, videoInput: true, reasoning: true, thinkingFormat: "qwen", contextWindow: 262144, maxOutput: 65536 } },
246
247
  { pattern: "*qwen*coder*", caps: { reasoning: true, thinkingFormat: "qwen", contextWindow: 1000000 } },
248
+ // Qwen3.8-Max reads images (verified live 2026-09-04), unlike Qwen3.6-Max-Preview
249
+ // which does not — so the version-specific entry must precede the text-only
250
+ // "*qwen*max*" family pattern below. Limits inherited from that pattern.
251
+ { pattern: "*qwen3.8*max*", caps: { vision: true, reasoning: true, thinkingFormat: "qwen", contextWindow: 1000000, maxOutput: 65536 } },
247
252
  { pattern: "*qwen*max*", caps: { reasoning: true, thinkingFormat: "qwen", contextWindow: 1000000, maxOutput: 65536 } },
248
253
  { pattern: "*qwen3.5*", caps: { vision: true, videoInput: true, reasoning: true, thinkingFormat: "qwen", contextWindow: 1000000, maxOutput: 65536 } },
249
254
  { pattern: "*qwen3.6*", caps: { vision: true, videoInput: true, reasoning: true, thinkingFormat: "qwen", contextWindow: 1000000, maxOutput: 65536 } },
250
255
  { pattern: "*qwen3.7*", caps: { vision: true, videoInput: true, reasoning: true, thinkingFormat: "qwen", contextWindow: 1000000, maxOutput: 65536 } },
256
+ // Qwen3.8-Flash vision verified live 2026-09-04. videoInput and the larger
257
+ // context of the 3.5-3.7 entries above are NOT verified for 3.8, so this keeps
258
+ // the conservative "*qwen*" family limits and only lifts the vision flag.
259
+ { pattern: "*qwen3.8*", caps: { vision: true, reasoning: true, thinkingFormat: "qwen", contextWindow: 262144 } },
251
260
  { pattern: "*qwen*plus*", caps: { vision: true, reasoning: true, thinkingFormat: "qwen", contextWindow: 1000000, maxOutput: 65536 } },
252
261
  { pattern: "*qwen*235b*", caps: { reasoning: true, thinkingFormat: "qwen", contextWindow: 262144 } },
253
262
  { pattern: "*qwq*", caps: { reasoning: true, thinkingFormat: "qwen", thinkingCanDisable: false, contextWindow: 131072 } },
@@ -261,12 +270,19 @@ export const PATTERN_CAPABILITIES = [
261
270
  { pattern: "*kimi*", caps: { reasoning: true, thinkingFormat: "kimi", contextWindow: 262144 } },
262
271
 
263
272
  // ── GLM / Z.ai (thinking.enabled; disable via enable_thinking:false) ─
273
+ // GLM is text-only apart from explicit vision variants (see glm-4.6v / glm-5v-turbo),
274
+ // but glm-5.3-flash reads images (verified live 2026-09-04) despite carrying no "v"
275
+ // marker — so it needs its own entry ahead of the text-only "*glm-5*" family.
276
+ { pattern: "*glm-5.3*flash*", caps: { vision: true, reasoning: true, thinkingFormat: "zai", contextWindow: 200000, maxOutput: 128000 } },
264
277
  { pattern: "*glm-5*", caps: { reasoning: true, thinkingFormat: "zai", contextWindow: 200000, maxOutput: 128000 } },
265
278
  { pattern: "*glm-4.7*", caps: { reasoning: true, thinkingFormat: "zai", contextWindow: 200000, maxOutput: 128000 } },
266
279
  { pattern: "*glm-4*", caps: { reasoning: true, thinkingFormat: "zai", contextWindow: 200000 } },
267
280
  { pattern: "*glm*", caps: { reasoning: true, thinkingFormat: "zai", contextWindow: 200000 } },
268
281
 
269
282
  // ── DeepSeek (thinking.enabled + reasoning_effort; r1 = thinking-only) ─
283
+ // Vision variant must precede the plain family pattern below, or "*deepseek-v4*"
284
+ // swallows it and the model resolves to vision:false (media stripped upstream).
285
+ { pattern: "*deepseek-v4*vision*", caps: { vision: true, reasoning: true, thinkingFormat: "deepseek", contextWindow: 1000000, maxOutput: 384000 } },
270
286
  { pattern: "*deepseek-v4*", caps: { reasoning: true, thinkingFormat: "deepseek", contextWindow: 1000000, maxOutput: 384000 } },
271
287
  { pattern: "*reasoner*", caps: { reasoning: true, thinkingFormat: "deepseek", thinkingCanDisable: false, contextWindow: 128000 } },
272
288
  { pattern: "*deepseek-r*", caps: { reasoning: true, thinkingFormat: "deepseek", thinkingCanDisable: false, contextWindow: 128000 } },
@@ -65,6 +65,10 @@ export const MODEL_PRICING = {
65
65
  "gpt-5.4-nano": { input: 0.10, output: 0.40, cached: 0.05, reasoning: 0.60, cache_creation: 0.10 },
66
66
 
67
67
  // === Gemini ===
68
+ "gemini-3.8-flash": { input: 1.50, output: 7.50, cached: 0.15, reasoning: 11.25, cache_creation: 1.875 },
69
+ "gemini-3.8-flash-high": { input: 1.50, output: 7.50, cached: 0.15, reasoning: 11.25, cache_creation: 1.875 },
70
+ "gemini-3.8-flash-medium": { input: 1.50, output: 7.50, cached: 0.15, reasoning: 11.25, cache_creation: 1.875 },
71
+ "gemini-3.8-flash-low": { input: 1.50, output: 7.50, cached: 0.15, reasoning: 11.25, cache_creation: 1.875 },
68
72
  "gemini-3.7-flash": { input: 1.50, output: 7.50, cached: 0.15, reasoning: 11.25, cache_creation: 1.875 },
69
73
  "gemini-3.7-flash-high": { input: 1.50, output: 7.50, cached: 0.15, reasoning: 11.25, cache_creation: 1.875 },
70
74
  "gemini-3.7-flash-medium": { input: 1.50, output: 7.50, cached: 0.15, reasoning: 11.25, cache_creation: 1.875 },
@@ -45,6 +45,9 @@ export default {
45
45
  clientSecret: "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",
46
46
  },
47
47
  models: [
48
+ { id: "gemini-3.8-flash-high", name: "Gemini 3.8 Flash (High)", upstreamModelId: "gemini-3.8-flash-tiered(high)" },
49
+ { id: "gemini-3.8-flash-medium", name: "Gemini 3.8 Flash (Medium)", upstreamModelId: "gemini-3.8-flash-tiered(medium)" },
50
+ { id: "gemini-3.8-flash-low", name: "Gemini 3.8 Flash (Low)", upstreamModelId: "gemini-3.8-flash-tiered(low)" },
48
51
  { id: "gemini-3.7-flash-high", name: "Gemini 3.7 Flash (High)", upstreamModelId: "gemini-3.7-flash-tiered(high)" },
49
52
  { id: "gemini-3.7-flash-medium", name: "Gemini 3.7 Flash (Medium)", upstreamModelId: "gemini-3.7-flash-tiered(medium)" },
50
53
  { id: "gemini-3.7-flash-low", name: "Gemini 3.7 Flash (Low)", upstreamModelId: "gemini-3.7-flash-tiered(low)" },
@@ -30,6 +30,7 @@ export default {
30
30
  models: [
31
31
  { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro" },
32
32
  { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash" },
33
+ { id: "deepseek/deepseek-v4-flash-vision-exp", name: "DeepSeek V4 Flash Vision (exp)" },
33
34
  { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6" },
34
35
  { id: "moonshotai/Kimi-K2.5", name: "Kimi K2.5" },
35
36
  { id: "zai-org/GLM-5.1", name: "GLM 5.1" },
@@ -38,6 +39,12 @@ export default {
38
39
  { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax M2.5" },
39
40
  { id: "Qwen/Qwen3.6-Max-Preview", name: "Qwen 3.6 Max Preview" },
40
41
  { id: "Qwen/Qwen3.6-Plus", name: "Qwen 3.6 Plus" },
42
+ { id: "Qwen/Qwen3.8-Flash", name: "Qwen 3.8 Flash" },
43
+ { id: "Qwen/Qwen3.8-Max", name: "Qwen 3.8 Max" },
44
+ // Vendor prefix is "z-ai/" here, not the "zai-org/" used by GLM-5/5.1 above:
45
+ // that is what CommandCode actually serves (verified — "zai-org/glm-5.3-flash"
46
+ // and "z-ai/glm-5.1" are not entitled), not a typo.
47
+ { id: "z-ai/glm-5.3-flash", name: "GLM 5.3 Flash" },
41
48
  { id: "stepfun/Step-3.5-Flash", name: "Step 3.5 Flash" },
42
49
  ],
43
50
  };
@@ -36,6 +36,7 @@ export default {
36
36
  },
37
37
  },
38
38
  models: [
39
+ { id: "gemini-3.8-flash", name: "Gemini 3.8 Flash" },
39
40
  { id: "gemini-3.7-flash", name: "Gemini 3.7 Flash" },
40
41
  { id: "gemini-3.6-flash", name: "Gemini 3.6 Flash" },
41
42
  { id: "gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite" },
@@ -155,6 +155,34 @@ export async function getAntigravityUsage(accessToken, providerSpecificData, pro
155
155
  }
156
156
 
157
157
  const data = await response.json();
158
+ // Production can lag behind the IDE daily endpoint when new model buckets
159
+ // roll out. Merge only missing models so production values stay authoritative.
160
+ if (data.models && !Object.keys(data.models).some((modelKey) => modelKey.includes("gemini-3.8-flash"))) {
161
+ try {
162
+ const dailyResponse = await fetchWithTimeout(
163
+ "https://daily-cloudcode-pa.googleapis.com/v1internal:fetchAvailableModels",
164
+ {
165
+ method: "POST",
166
+ headers: {
167
+ "Authorization": `Bearer ${accessToken}`,
168
+ "User-Agent": ANTIGRAVITY_CONFIG.userAgent,
169
+ "Content-Type": "application/json",
170
+ "X-Client-Name": "antigravity",
171
+ "X-Client-Version": ANTIGRAVITY_IDE_VERSION,
172
+ },
173
+ body: JSON.stringify({ ...(projectId ? { project: projectId } : {}) }),
174
+ },
175
+ 10000,
176
+ proxyOptions
177
+ );
178
+ if (dailyResponse.ok) {
179
+ const dailyData = await dailyResponse.json();
180
+ data.models = { ...dailyData.models, ...data.models };
181
+ }
182
+ } catch {
183
+ // Production quota data is still usable if the daily endpoint is unavailable.
184
+ }
185
+ }
158
186
  const quotas = {};
159
187
 
160
188
  // Parse model quotas (inspired by vscode-antigravity-cockpit)
@@ -162,7 +190,12 @@ export async function getAntigravityUsage(accessToken, providerSpecificData, pro
162
190
  // Filter only recommended/important models (must match PROVIDER_MODELS ag ids,
163
191
  // plus live fetchAvailableModels keys that have not been split into tiers yet).
164
192
  const importantModels = {
165
- // Live API currently ships 3.7 as one `*-tiered` bucket, not high/medium/low.
193
+ // Live API may ship base or `*-tiered` buckets instead of split tiers.
194
+ "gemini-3.8-flash": "Gemini 3.8 Flash",
195
+ "gemini-3.8-flash-tiered": "Gemini 3.8 Flash",
196
+ "gemini-3.8-flash-high": "Gemini 3.8 Flash (High)",
197
+ "gemini-3.8-flash-medium": "Gemini 3.8 Flash (Medium)",
198
+ "gemini-3.8-flash-low": "Gemini 3.8 Flash (Low)",
166
199
  "gemini-3.7-flash-tiered": "Gemini 3.7 Flash",
167
200
  "gemini-3.7-flash-high": "Gemini 3.7 Flash (High)",
168
201
  "gemini-3.7-flash-medium": "Gemini 3.7 Flash (Medium)",
@@ -8,6 +8,9 @@ import { fetchImageAsBase64, parseDataUri } from "./image.js";
8
8
  const TARGETS_NEED_BASE64 = new Set([
9
9
  FORMATS.GEMINI, FORMATS.GEMINI_CLI, FORMATS.VERTEX,
10
10
  FORMATS.ANTIGRAVITY, FORMATS.OLLAMA, FORMATS.KIRO,
11
+ // CommandCode accepts an https URL in an image part but its backend fails the
12
+ // fetch ("Failed to download image from ..."), so URLs must arrive as base64.
13
+ FORMATS.COMMANDCODE,
11
14
  ]);
12
15
 
13
16
  function isRemoteUrl(url) {
@@ -7,7 +7,16 @@
7
7
  * - params.messages[*].content: Array of content blocks (NEVER a string)
8
8
  * - tool_use blocks (assistant): {type:"tool-call", toolCallId, toolName, input}
9
9
  * - tool_result blocks (role=user): {type:"tool-result", toolCallId, toolName, output}
10
+ * - image blocks (role=user): {type:"image", image:"data:<mime>;base64,<data>"}
10
11
  * - tools[*]: Anthropic plain {name, description, input_schema}
12
+ *
13
+ * Image support verified live against /alpha/generate (2026-09-04): an AI SDK v5
14
+ * `image` part carrying a data URL (or bare base64 + mediaType) is accepted; AI SDK
15
+ * `file` parts and OpenAI `image_url` parts are both rejected with HTTP 400. A remote
16
+ * https URL passes validation but the backend cannot fetch it, so chatCore prefetches
17
+ * remote images to base64 first (FORMATS.COMMANDCODE is in TARGETS_NEED_BASE64).
18
+ * Models without vision still get the text placeholder, but that decision belongs to
19
+ * stripUnsupportedModalities upstream — not to this translator.
11
20
  */
12
21
  import { register } from "../index.js";
13
22
  import { FORMATS } from "../formats.js";
@@ -29,6 +38,32 @@ function flattenText(content) {
29
38
  return String(content);
30
39
  }
31
40
 
41
+ // OpenAI/Claude-shaped image part -> AI SDK v5 image part. Returns null when no
42
+ // usable source is present, so the caller can fall back to the text placeholder.
43
+ function toImagePart(part) {
44
+ // `image_url` is either {url} or a flat string. Both shapes occur here — see
45
+ // prefetch.js, which rewrites a flat string in place, so a prefetched remote
46
+ // image arrives as a bare data-URI string and would otherwise be dropped
47
+ // after having already been fetched over the network.
48
+ const imageUrl = typeof part?.image_url === "string" ? part.image_url : part?.image_url?.url;
49
+ const direct = imageUrl ?? part?.image ?? part?.url;
50
+ if (typeof direct === "string" && direct) {
51
+ // Upstream does accept bare base64 with no mediaType (verified), but when the
52
+ // caller states a type, keep it rather than making upstream sniff the bytes.
53
+ const isUri = /^(data:|https?:)/.test(direct);
54
+ const mime = part?.mediaType || part?.media_type || "image/png";
55
+ return { type: OPENAI_BLOCK.IMAGE, image: isUri ? direct : `data:${mime};base64,${direct}` };
56
+ }
57
+ const src = part?.source;
58
+ if (src?.type === "base64" && src.data) {
59
+ return { type: OPENAI_BLOCK.IMAGE, image: `data:${src.media_type || "image/png"};base64,${src.data}` };
60
+ }
61
+ if (src?.type === "url" && typeof src.url === "string" && src.url) {
62
+ return { type: OPENAI_BLOCK.IMAGE, image: src.url };
63
+ }
64
+ return null;
65
+ }
66
+
32
67
  function toContentBlocks(content) {
33
68
  if (content == null) return [{ type: OPENAI_BLOCK.TEXT, text: "" }];
34
69
  if (typeof content === "string") return [{ type: OPENAI_BLOCK.TEXT, text: content }];
@@ -41,7 +76,7 @@ function toContentBlocks(content) {
41
76
  if (part.type === OPENAI_BLOCK.TEXT && typeof part.text === "string") {
42
77
  blocks.push({ type: OPENAI_BLOCK.TEXT, text: part.text });
43
78
  } else if (part.type === OPENAI_BLOCK.IMAGE_URL || part.type === OPENAI_BLOCK.IMAGE) {
44
- blocks.push({ type: OPENAI_BLOCK.TEXT, text: "[image omitted]" });
79
+ blocks.push(toImagePart(part) || { type: OPENAI_BLOCK.TEXT, text: "[image omitted]" });
45
80
  } else if (typeof part.text === "string") {
46
81
  blocks.push({ type: OPENAI_BLOCK.TEXT, text: part.text });
47
82
  }
package/app/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n9router",
3
- "version": "0.4.55",
3
+ "version": "0.4.57",
4
4
  "description": "Self-hosted AI routing gateway — local proxy for Claude, Gemini, OpenAI and 40+ providers",
5
5
  "keywords": [
6
6
  "ai",
@@ -59,7 +59,6 @@
59
59
  "@node-saml/node-saml": "^5.1.0",
60
60
  "@xyflow/react": "^12.10.1",
61
61
  "bcryptjs": "^3.0.3",
62
- "better-sqlite3": "^12.6.2",
63
62
  "confbox": "^0.2.4",
64
63
  "express": "^5.2.1",
65
64
  "fs": "^0.0.1-security",
@@ -93,5 +92,8 @@
93
92
  "eslint-config-next": "16.1.6",
94
93
  "postcss": "^8.5.6",
95
94
  "tailwindcss": "^4"
95
+ },
96
+ "engines": {
97
+ "node": ">=22.13.0"
96
98
  }
97
99
  }
package/app/server.js CHANGED
@@ -9,7 +9,7 @@ const currentPort = parseInt(process.env.PORT, 10) || 3000
9
9
  const hostname = process.env.HOSTNAME || '0.0.0.0'
10
10
 
11
11
  let keepAliveTimeout = parseInt(process.env.KEEP_ALIVE_TIMEOUT, 10)
12
- const nextConfig = {"env":{},"typescript":{"ignoreBuildErrors":false},"typedRoutes":false,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.mjs","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":true,"customCacheHandler":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{"serverFunctions":true,"browserToTerminal":"warn"},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/Users/cuongquach/projects/vibe/n9router","cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"appNewScrollHandler":false,"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"cachedNavigations":false,"partialFallbacks":false,"dynamicOnHover":false,"varyParams":false,"prefetchInlining":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":9,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"imgOptSkipMetadata":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"strictRouteTypes":false,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":true,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"gestureTransition":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":"warn","lockDistDir":true,"proxyClientMaxBodySize":134217728,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":true,"turbopackPluginRuntimeStrategy":"childProcesses","optimizePackageImports":["@xyflow/react","@dnd-kit/core","@dnd-kit/sortable","material-symbols","marked","lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.mjs","outputFileTracingIncludes":{"/*":["src/mitm/**/*","src/shared/constants/**/*","src/lib/dbFileSafety.js","open-sse/rtk/**/*"]},"serverExternalPackages":["better-sqlite3"],"turbopack":{"root":"/Users/cuongquach/projects/vibe/n9router"},"outputFileTracingExcludes":{"*":["./gitbook/**/*"]},"distDirRoot":".next","_originalRewrites":{"beforeFiles":[],"afterFiles":[{"source":"/v1/v1/:path*","destination":"/api/v1/:path*"},{"source":"/v1/v1","destination":"/api/v1"},{"source":"/codex/:path*","destination":"/api/v1/responses"},{"source":"/responses","destination":"/api/v1/responses"},{"source":"/v1beta/:path*","destination":"/api/v1beta/:path*"},{"source":"/v1beta","destination":"/api/v1beta"},{"source":"/v1/:path*","destination":"/api/v1/:path*"},{"source":"/v1","destination":"/api/v1"}],"fallback":[]}}
12
+ const nextConfig = {"env":{},"typescript":{"ignoreBuildErrors":false},"typedRoutes":false,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.mjs","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":true,"customCacheHandler":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{"serverFunctions":true,"browserToTerminal":"warn"},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/Users/cuongquach/projects/vibe/n9router","cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"appNewScrollHandler":false,"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"cachedNavigations":false,"partialFallbacks":false,"dynamicOnHover":false,"varyParams":false,"prefetchInlining":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":9,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"imgOptSkipMetadata":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"strictRouteTypes":false,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":true,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"gestureTransition":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":"warn","lockDistDir":true,"proxyClientMaxBodySize":134217728,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":true,"turbopackPluginRuntimeStrategy":"childProcesses","optimizePackageImports":["@xyflow/react","@dnd-kit/core","@dnd-kit/sortable","material-symbols","marked","lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.mjs","outputFileTracingIncludes":{"/*":["src/mitm/**/*","src/shared/constants/**/*","src/lib/dbFileSafety.js","open-sse/rtk/**/*"]},"serverExternalPackages":[],"turbopack":{"root":"/Users/cuongquach/projects/vibe/n9router"},"outputFileTracingExcludes":{"*":["./gitbook/**/*"]},"distDirRoot":".next","_originalRewrites":{"beforeFiles":[],"afterFiles":[{"source":"/v1/v1/:path*","destination":"/api/v1/:path*"},{"source":"/v1/v1","destination":"/api/v1"},{"source":"/codex/:path*","destination":"/api/v1/responses"},{"source":"/responses","destination":"/api/v1/responses"},{"source":"/v1beta/:path*","destination":"/api/v1beta/:path*"},{"source":"/v1beta","destination":"/api/v1beta"},{"source":"/v1/:path*","destination":"/api/v1/:path*"},{"source":"/v1","destination":"/api/v1"}],"fallback":[]}}
13
13
 
14
14
  process.env.__NEXT_PRIVATE_STANDALONE_CONFIG = JSON.stringify(nextConfig)
15
15
 
@@ -55,6 +55,9 @@ const MODEL_SYNONYMS = {
55
55
  "gemini-3.5-flash-high": "gemini-3-flash-agent",
56
56
  "gemini-3.5-flash-medium": "gemini-3.5-flash-low",
57
57
  "gemini-3.5-flash-extra-low": "gemini-3.5-flash-extra-low",
58
+ "gemini-3.8-flash-high": "gemini-3.8-flash-high",
59
+ "gemini-3.8-flash-medium": "gemini-3.8-flash-medium",
60
+ "gemini-3.8-flash-low": "gemini-3.8-flash-low",
58
61
  "gemini-3.7-flash-high": "gemini-3.7-flash-high",
59
62
  "gemini-3.7-flash-medium": "gemini-3.7-flash-medium",
60
63
  "gemini-3.7-flash-low": "gemini-3.7-flash-low",
@@ -135,8 +138,8 @@ function extractModel(url, body) {
135
138
  }
136
139
  const model = urlModel || parsed.model || null;
137
140
  const cleanModelName = String(model).replace(/^models\//, "");
138
- if (cleanModelName === "gemini-3.6-flash-tiered" || cleanModelName === "gemini-3.7-flash-tiered") {
139
- const ver = cleanModelName.includes("3.7") ? "3.7" : "3.6";
141
+ if (cleanModelName === "gemini-3.6-flash-tiered" || cleanModelName === "gemini-3.7-flash-tiered" || cleanModelName === "gemini-3.8-flash-tiered") {
142
+ const ver = cleanModelName.includes("3.8") ? "3.8" : cleanModelName.includes("3.7") ? "3.7" : "3.6";
140
143
  const rawLevel = parsed.request?.generationConfig?.thinkingConfig?.thinkingLevel
141
144
  || parsed.generationConfig?.thinkingConfig?.thinkingLevel;
142
145
  const level = ["high", "medium", "low"].includes(String(rawLevel).toLowerCase())
@@ -10,8 +10,11 @@ export const MITM_TOOLS = {
10
10
  mitmDomain: "daily-cloudcode-pa.googleapis.com",
11
11
  supportsTokenSwap: true,
12
12
  tokenSwapProvider: "antigravity",
13
- modelAliases: ["gemini-3.7-flash-high", "gemini-3.7-flash-medium", "gemini-3.7-flash-low", "gemini-3.6-flash-high", "gemini-3.6-flash-medium", "gemini-3.6-flash-low", "gemini-3.5-flash-low", "gemini-3-flash-agent", "gemini-3.5-flash-extra-low", "gemini-3.1-pro-low", "gemini-pro-agent", "claude-sonnet-4-6", "claude-opus-4-6-thinking", "gpt-oss-120b-medium", "gemini-3-flash"],
13
+ modelAliases: ["gemini-3.8-flash-high", "gemini-3.8-flash-medium", "gemini-3.8-flash-low", "gemini-3.7-flash-high", "gemini-3.7-flash-medium", "gemini-3.7-flash-low", "gemini-3.6-flash-high", "gemini-3.6-flash-medium", "gemini-3.6-flash-low", "gemini-3.5-flash-low", "gemini-3-flash-agent", "gemini-3.5-flash-extra-low", "gemini-3.1-pro-low", "gemini-pro-agent", "claude-sonnet-4-6", "claude-opus-4-6-thinking", "gpt-oss-120b-medium", "gemini-3-flash"],
14
14
  defaultModels: [
15
+ { id: "gemini-3.8-flash-high", name: "Gemini 3.8 Flash (High)", alias: "gemini-3.8-flash-high" },
16
+ { id: "gemini-3.8-flash-medium", name: "Gemini 3.8 Flash (Medium)", alias: "gemini-3.8-flash-medium" },
17
+ { id: "gemini-3.8-flash-low", name: "Gemini 3.8 Flash (Low)", alias: "gemini-3.8-flash-low" },
15
18
  { id: "gemini-3.7-flash-high", name: "Gemini 3.7 Flash (High)", alias: "gemini-3.7-flash-high" },
16
19
  { id: "gemini-3.7-flash-medium", name: "Gemini 3.7 Flash (Medium)", alias: "gemini-3.7-flash-medium" },
17
20
  { id: "gemini-3.7-flash-low", name: "Gemini 3.7 Flash (Low)", alias: "gemini-3.7-flash-low" },
@@ -4,16 +4,14 @@
4
4
  * Postinstall hook for n9router.
5
5
  *
6
6
  * Purpose:
7
- * - Repair native modules that may be bundled from a different OS/arch
8
- * - Keep install non-fatal if rebuild fails (CLI should still start)
7
+ * - Verify node:sqlite runtime availability
8
+ * - Copy open-sse assets for standalone installations
9
9
  */
10
10
 
11
11
  const fs = require("fs");
12
12
  const path = require("path");
13
- const { execSync } = require("child_process");
14
13
 
15
14
  const pkgRoot = path.join(__dirname, "..");
16
- const npmCmd = process.platform === "win32" ? "npm.cmd" : "npm";
17
15
 
18
16
  function info(msg) {
19
17
  console.log(`[n9router:postinstall] ${msg}`);
@@ -42,152 +40,6 @@ function resolveStandaloneRoot() {
42
40
  );
43
41
  }
44
42
 
45
- function readMagic(binaryPath) {
46
- const fd = fs.openSync(binaryPath, "r");
47
- const buffer = Buffer.alloc(4);
48
- fs.readSync(fd, buffer, 0, 4, 0);
49
- fs.closeSync(fd);
50
- return buffer.toString("hex");
51
- }
52
-
53
- function isBinaryValidForPlatform(binaryPath) {
54
- if (!pathExists(binaryPath)) return false;
55
-
56
- let magic = "";
57
- try {
58
- magic = readMagic(binaryPath);
59
- } catch {
60
- return false;
61
- }
62
-
63
- const isLinux = magic.startsWith("7f454c46"); // ELF
64
- const isMacOS = magic.startsWith("cffaedfe") || magic.startsWith("cefaedfe"); // Mach-O
65
- const isWindows = magic.startsWith("4d5a"); // PE (MZ)
66
-
67
- if (process.platform === "linux") return isLinux;
68
- if (process.platform === "darwin") return isMacOS;
69
- if (process.platform === "win32") return isWindows;
70
-
71
- return false;
72
- }
73
-
74
- function rebuildModule(moduleName, cwd) {
75
- execSync(`${npmCmd} rebuild ${moduleName} --build-from-source`, {
76
- cwd,
77
- stdio: "inherit",
78
- timeout: 180000,
79
- });
80
- }
81
-
82
- function installModule(moduleName, cwd) {
83
- // When running inside `npm install -g`, npm sets npm_config_global=true and
84
- // npm_config_prefix to the global prefix. Clear these so the inner npm install
85
- // installs locally into cwd/node_modules instead of global node_modules.
86
- const env = { ...process.env };
87
- delete env.npm_config_global;
88
- delete env.npm_config_prefix;
89
- execSync(`${npmCmd} install ${moduleName} --prefix "${cwd}"`, {
90
- env,
91
- stdio: "inherit",
92
- timeout: 180000,
93
- });
94
- }
95
-
96
- function tryPrebuildInstall(moduleRoot) {
97
- try {
98
- info("Attempting to download prebuilt better-sqlite3 binary...");
99
- execSync("npx prebuild-install --runtime electron --target 22.0.0 || npx prebuild-install", {
100
- cwd: moduleRoot,
101
- stdio: "pipe",
102
- timeout: 60000,
103
- });
104
- return true;
105
- } catch {
106
- return false;
107
- }
108
- }
109
-
110
- function ensureBetterSqlite3(locationName, moduleRoot) {
111
- if (!pathExists(moduleRoot)) {
112
- const installCwd = path.dirname(path.dirname(moduleRoot));
113
- const packageJsonPath = path.join(installCwd, "package.json");
114
-
115
- if (!pathExists(packageJsonPath)) {
116
- info(`Skipping ${locationName}: package.json not present`);
117
- return;
118
- }
119
-
120
- info(`Installing better-sqlite3 in ${locationName}`);
121
- try {
122
- installModule("better-sqlite3", installCwd);
123
- } catch (error) {
124
- warn(`Install failed in ${locationName}: ${error.message}`);
125
- return;
126
- }
127
-
128
- if (!pathExists(moduleRoot)) {
129
- warn(`better-sqlite3 still missing in ${locationName} after install`);
130
- return;
131
- }
132
- }
133
-
134
- const binaryPath = path.join(moduleRoot, "build", "Release", "better_sqlite3.node");
135
- if (isBinaryValidForPlatform(binaryPath)) {
136
- info(`better-sqlite3 already valid in ${locationName}`);
137
- return;
138
- }
139
-
140
- info(`Rebuilding better-sqlite3 in ${locationName} for ${process.platform}/${process.arch}`);
141
-
142
- // 1. Try to copy from root if this is the standalone target and root is already valid
143
- const rootModuleRoot = path.join(pkgRoot, "node_modules", "better-sqlite3");
144
- const rootBinaryPath = path.join(rootModuleRoot, "build", "Release", "better_sqlite3.node");
145
-
146
- if (moduleRoot !== rootModuleRoot && isBinaryValidForPlatform(rootBinaryPath)) {
147
- info(`Copying valid better-sqlite3 from root node_modules to ${locationName}`);
148
- try {
149
- fs.mkdirSync(path.dirname(binaryPath), { recursive: true });
150
- fs.copyFileSync(rootBinaryPath, binaryPath);
151
- return;
152
- } catch (err) {
153
- warn(`Failed to copy better-sqlite3 from root: ${err.message}`);
154
- }
155
- }
156
-
157
- // 2. Try to download prebuilt binaries using prebuild-install
158
- const prebuiltPath = path.join(moduleRoot, "build", "Release", "better_sqlite3.node");
159
- if (tryPrebuildInstall(moduleRoot) && isBinaryValidForPlatform(prebuiltPath)) {
160
- info(`Downloaded prebuilt better-sqlite3 for ${locationName}`);
161
- return;
162
- }
163
-
164
- // 3. Fall back to rebuild from source, but only if we have the source files
165
- if (!pathExists(path.join(moduleRoot, "binding.gyp"))) {
166
- warn(`Cannot rebuild better-sqlite3 in ${locationName}: binding.gyp not found`);
167
- warn("API key usage limiting will be disabled. To fix, install build tools:");
168
- warn(" macOS: xcode-select --install");
169
- warn(" Linux: sudo apt-get install build-essential python3");
170
- warn(" Windows: npm install --global windows-build-tools");
171
- return;
172
- }
173
-
174
- try {
175
- rebuildModule("better-sqlite3", path.dirname(path.dirname(moduleRoot)));
176
- } catch (error) {
177
- warn(`Rebuild failed in ${locationName}: ${error.message}`);
178
- warn("API key usage limiting will be disabled.");
179
- warn("The app will still work - install just won't track per-key usage limits.");
180
- return;
181
- }
182
-
183
- if (isBinaryValidForPlatform(binaryPath)) {
184
- info(`better-sqlite3 rebuild succeeded in ${locationName}`);
185
- } else {
186
- warn(`better-sqlite3 still not valid in ${locationName} after rebuild`);
187
- warn("API key usage limiting will be disabled.");
188
- }
189
- }
190
-
191
43
  function copyDirSync(src, dest) {
192
44
  fs.mkdirSync(dest, { recursive: true });
193
45
  for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
@@ -232,38 +84,13 @@ function copyOpenSse() {
232
84
  }
233
85
 
234
86
  function main() {
235
- const standaloneRoot = resolveStandaloneRoot();
236
- const targets = [];
237
-
238
- // Only include root node_modules if it already exists (dev install).
239
- // Published packages don't ship with root node_modules/better-sqlite3.
240
- const rootModuleRoot = path.join(pkgRoot, "node_modules", "better-sqlite3");
241
- if (pathExists(rootModuleRoot)) {
242
- targets.push({ name: "root node_modules", moduleRoot: rootModuleRoot });
243
- }
244
-
245
- if (standaloneRoot) {
246
- targets.push({
247
- name: `${path.relative(pkgRoot, standaloneRoot)}/node_modules`,
248
- moduleRoot: path.join(standaloneRoot, "node_modules", "better-sqlite3"),
249
- });
250
- }
251
-
252
- let anySuccess = false;
253
- for (const target of targets) {
254
- const binaryPath = path.join(target.moduleRoot, "build", "Release", "better_sqlite3.node");
255
- ensureBetterSqlite3(target.name, target.moduleRoot);
256
- if (isBinaryValidForPlatform(binaryPath)) {
257
- anySuccess = true;
258
- }
259
- }
260
-
261
- // Summary message
262
- if (anySuccess) {
263
- info("better-sqlite3 is ready. API key usage limiting enabled.");
264
- } else if (targets.some(t => pathExists(t.moduleRoot))) {
265
- warn("better-sqlite3 could not be built. API key usage limiting disabled.");
266
- warn("To enable usage limits, reinstall with build tools installed.");
87
+ // Check node:sqlite availability
88
+ try {
89
+ require("node:sqlite");
90
+ info("node:sqlite is ready. API key usage limiting enabled.");
91
+ } catch {
92
+ warn("node:sqlite is not available on this Node.js version.");
93
+ warn("Node.js >= 22.13.0 is recommended for API key usage limits.");
267
94
  }
268
95
 
269
96
  copyOpenSse();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n9router",
3
- "version": "0.4.55",
3
+ "version": "0.4.57",
4
4
  "description": "Self-hosted AI routing gateway — local proxy for Claude, Gemini, OpenAI and 40+ providers",
5
5
  "keywords": [
6
6
  "ai",