@yina-npm/openrouterx 0.4.22 → 0.4.24

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 (596) hide show
  1. package/README.md +2 -0
  2. package/app/.next/BUILD_ID +1 -1
  3. package/app/.next/app-path-routes-manifest.json +3 -1
  4. package/app/.next/build-manifest.json +2 -2
  5. package/app/.next/routes-manifest.json +12 -0
  6. package/app/.next/server/app/(dashboard)/dashboard/admin/keys/page.js +2 -2
  7. package/app/.next/server/app/(dashboard)/dashboard/admin/keys/page_client-reference-manifest.js +1 -1
  8. package/app/.next/server/app/(dashboard)/dashboard/admin/users/page.js +2 -2
  9. package/app/.next/server/app/(dashboard)/dashboard/admin/users/page_client-reference-manifest.js +1 -1
  10. package/app/.next/server/app/(dashboard)/dashboard/basic-chat/page.js +2 -2
  11. package/app/.next/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  12. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page.js +2 -2
  13. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  14. package/app/.next/server/app/(dashboard)/dashboard/combos/page.js +2 -2
  15. package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  16. package/app/.next/server/app/(dashboard)/dashboard/console-log/page.js +2 -2
  17. package/app/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  18. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page.js +2 -2
  19. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  20. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js +12 -12
  21. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  22. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js +2 -2
  23. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  24. package/app/.next/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +3 -3
  25. package/app/.next/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  26. package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/page.js +2 -2
  27. package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  28. package/app/.next/server/app/(dashboard)/dashboard/mitm/page.js +2 -2
  29. package/app/.next/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  30. package/app/.next/server/app/(dashboard)/dashboard/page.js +2 -2
  31. package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  32. package/app/.next/server/app/(dashboard)/dashboard/profile/page.js +2 -2
  33. package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  34. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js +2 -2
  35. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  36. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page.js +2 -2
  37. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  38. package/app/.next/server/app/(dashboard)/dashboard/providers/page.js +2 -2
  39. package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  40. package/app/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js +2 -2
  41. package/app/.next/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  42. package/app/.next/server/app/(dashboard)/dashboard/quota/page.js +2 -2
  43. package/app/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  44. package/app/.next/server/app/(dashboard)/dashboard/skills/page.js +2 -2
  45. package/app/.next/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  46. package/app/.next/server/app/(dashboard)/dashboard/translator/page.js +2 -2
  47. package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  48. package/app/.next/server/app/(dashboard)/dashboard/usage/page.js +2 -2
  49. package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  50. package/app/.next/server/app/(dashboard)/dashboard/user/page.js +2 -2
  51. package/app/.next/server/app/(dashboard)/dashboard/user/page_client-reference-manifest.js +1 -1
  52. package/app/.next/server/app/_global-error/page.js +2 -2
  53. package/app/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  54. package/app/.next/server/app/_global-error.html +1 -1
  55. package/app/.next/server/app/_global-error.rsc +1 -1
  56. package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  57. package/app/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  58. package/app/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  59. package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  60. package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  61. package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  62. package/app/.next/server/app/_not-found/page.js +2 -2
  63. package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  64. package/app/.next/server/app/_not-found.html +1 -1
  65. package/app/.next/server/app/_not-found.rsc +4 -4
  66. package/app/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  67. package/app/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  68. package/app/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  69. package/app/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  70. package/app/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  71. package/app/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  72. package/app/.next/server/app/api/auth/login/route.js +1 -1
  73. package/app/.next/server/app/api/auth/logout/route.js +1 -1
  74. package/app/.next/server/app/api/auth/me/route.js +1 -1
  75. package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js +2 -2
  76. package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  77. package/app/.next/server/app/api/cli-tools/antigravity-mitm/inject-auth/route.js +1 -0
  78. package/app/.next/server/app/api/cli-tools/antigravity-mitm/inject-auth/route.js.nft.json +1 -0
  79. package/app/.next/server/app/api/cli-tools/antigravity-mitm/inject-auth/route_client-reference-manifest.js +1 -0
  80. package/app/.next/server/app/api/cli-tools/antigravity-mitm/restart/route.js +1 -0
  81. package/app/.next/server/app/api/cli-tools/antigravity-mitm/restart/route.js.nft.json +1 -0
  82. package/app/.next/server/app/api/cli-tools/antigravity-mitm/restart/route_client-reference-manifest.js +1 -0
  83. package/app/.next/server/app/api/cli-tools/antigravity-mitm/route.js +1 -1
  84. package/app/.next/server/app/api/cli-tools/antigravity-mitm/test/route.js +1 -1
  85. package/app/.next/server/app/api/cli-tools/claude-settings/route.js +2 -2
  86. package/app/.next/server/app/api/cli-tools/codex-settings/route.js +2 -2
  87. package/app/.next/server/app/api/cli-tools/copilot-settings/route.js +1 -1
  88. package/app/.next/server/app/api/cli-tools/cowork-mcp-registry/route.js +1 -1
  89. package/app/.next/server/app/api/cli-tools/cowork-settings/route.js +2 -2
  90. package/app/.next/server/app/api/cli-tools/droid-settings/route.js +2 -2
  91. package/app/.next/server/app/api/cli-tools/hermes-settings/route.js +2 -2
  92. package/app/.next/server/app/api/cli-tools/openclaw-settings/route.js +2 -2
  93. package/app/.next/server/app/api/cli-tools/opencode-settings/route.js +2 -2
  94. package/app/.next/server/app/api/cloud/auth/route.js +1 -1
  95. package/app/.next/server/app/api/cloud/credentials/update/route.js +1 -1
  96. package/app/.next/server/app/api/cloud/model/resolve/route.js +1 -1
  97. package/app/.next/server/app/api/cloud/models/alias/route.js +1 -1
  98. package/app/.next/server/app/api/combos/[id]/route.js +1 -1
  99. package/app/.next/server/app/api/combos/route.js +1 -1
  100. package/app/.next/server/app/api/health/route.js +1 -1
  101. package/app/.next/server/app/api/init/route.js +1 -1
  102. package/app/.next/server/app/api/keys/[id]/route.js +1 -1
  103. package/app/.next/server/app/api/keys/route.js +1 -1
  104. package/app/.next/server/app/api/locale/route.js +1 -1
  105. package/app/.next/server/app/api/media-providers/tts/deepgram/voices/route.js +1 -1
  106. package/app/.next/server/app/api/media-providers/tts/elevenlabs/voices/route.js +1 -1
  107. package/app/.next/server/app/api/media-providers/tts/inworld/voices/route.js +1 -1
  108. package/app/.next/server/app/api/media-providers/tts/voices/route.js +1 -1
  109. package/app/.next/server/app/api/models/alias/route.js +1 -1
  110. package/app/.next/server/app/api/models/availability/route.js +1 -1
  111. package/app/.next/server/app/api/models/custom/route.js +1 -1
  112. package/app/.next/server/app/api/models/disabled/route.js +1 -1
  113. package/app/.next/server/app/api/models/route.js +1 -1
  114. package/app/.next/server/app/api/models/test/route.js +1 -1
  115. package/app/.next/server/app/api/models/test/route.js.nft.json +1 -1
  116. package/app/.next/server/app/api/oauth/[provider]/[action]/route.js +2 -2
  117. package/app/.next/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  118. package/app/.next/server/app/api/oauth/cursor/auto-import/route.js +2 -2
  119. package/app/.next/server/app/api/oauth/cursor/import/route.js +1 -1
  120. package/app/.next/server/app/api/oauth/gitlab/pat/route.js +1 -1
  121. package/app/.next/server/app/api/oauth/iflow/cookie/route.js +1 -1
  122. package/app/.next/server/app/api/oauth/kiro/auto-import/route.js +1 -1
  123. package/app/.next/server/app/api/oauth/kiro/import/route.js +1 -1
  124. package/app/.next/server/app/api/oauth/kiro/social-authorize/route.js +1 -1
  125. package/app/.next/server/app/api/oauth/kiro/social-exchange/route.js +1 -1
  126. package/app/.next/server/app/api/pricing/route.js +1 -1
  127. package/app/.next/server/app/api/provider-nodes/[id]/route.js +1 -1
  128. package/app/.next/server/app/api/provider-nodes/route.js +1 -1
  129. package/app/.next/server/app/api/provider-nodes/route.js.nft.json +1 -1
  130. package/app/.next/server/app/api/provider-nodes/validate/route.js +1 -1
  131. package/app/.next/server/app/api/providers/[id]/models/route.js +1 -1
  132. package/app/.next/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  133. package/app/.next/server/app/api/providers/[id]/route.js +1 -1
  134. package/app/.next/server/app/api/providers/[id]/route.js.nft.json +1 -1
  135. package/app/.next/server/app/api/providers/[id]/test/route.js +1 -1
  136. package/app/.next/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  137. package/app/.next/server/app/api/providers/[id]/test-models/route.js +1 -1
  138. package/app/.next/server/app/api/providers/client/route.js +1 -1
  139. package/app/.next/server/app/api/providers/client/route.js.nft.json +1 -1
  140. package/app/.next/server/app/api/providers/kilo/free-models/route.js +1 -1
  141. package/app/.next/server/app/api/providers/route.js +1 -1
  142. package/app/.next/server/app/api/providers/route.js.nft.json +1 -1
  143. package/app/.next/server/app/api/providers/suggested-models/route.js +1 -1
  144. package/app/.next/server/app/api/providers/test-batch/route.js +1 -1
  145. package/app/.next/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  146. package/app/.next/server/app/api/providers/validate/route.js +1 -1
  147. package/app/.next/server/app/api/providers/validate/route.js.nft.json +1 -1
  148. package/app/.next/server/app/api/proxy-pools/[id]/route.js +1 -1
  149. package/app/.next/server/app/api/proxy-pools/[id]/test/route.js +1 -1
  150. package/app/.next/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
  151. package/app/.next/server/app/api/proxy-pools/route.js +1 -1
  152. package/app/.next/server/app/api/proxy-pools/vercel-deploy/route.js +2 -2
  153. package/app/.next/server/app/api/settings/database/route.js +1 -1
  154. package/app/.next/server/app/api/settings/proxy-test/route.js +1 -1
  155. package/app/.next/server/app/api/settings/proxy-test/route.js.nft.json +1 -1
  156. package/app/.next/server/app/api/settings/require-login/route.js +1 -1
  157. package/app/.next/server/app/api/settings/route.js +1 -1
  158. package/app/.next/server/app/api/shutdown/route.js +1 -1
  159. package/app/.next/server/app/api/tags/route.js +1 -1
  160. package/app/.next/server/app/api/translator/console-logs/route.js +1 -1
  161. package/app/.next/server/app/api/translator/console-logs/stream/route.js +2 -2
  162. package/app/.next/server/app/api/translator/load/route.js +1 -1
  163. package/app/.next/server/app/api/translator/save/route.js +1 -1
  164. package/app/.next/server/app/api/translator/send/route.js +1 -1
  165. package/app/.next/server/app/api/translator/send/route.js.nft.json +1 -1
  166. package/app/.next/server/app/api/translator/translate/route.js +1 -1
  167. package/app/.next/server/app/api/translator/translate/route.js.nft.json +1 -1
  168. package/app/.next/server/app/api/tunnel/disable/route.js +1 -1
  169. package/app/.next/server/app/api/tunnel/enable/route.js +1 -1
  170. package/app/.next/server/app/api/tunnel/status/route.js +1 -1
  171. package/app/.next/server/app/api/tunnel/tailscale-check/route.js +1 -1
  172. package/app/.next/server/app/api/tunnel/tailscale-disable/route.js +1 -1
  173. package/app/.next/server/app/api/tunnel/tailscale-enable/route.js +1 -1
  174. package/app/.next/server/app/api/tunnel/tailscale-install/route.js +1 -1
  175. package/app/.next/server/app/api/tunnel/tailscale-login/route.js +1 -1
  176. package/app/.next/server/app/api/tunnel/tailscale-start-daemon/route.js +1 -1
  177. package/app/.next/server/app/api/usage/[connectionId]/route.js +1 -1
  178. package/app/.next/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  179. package/app/.next/server/app/api/usage/api-keys/route.js +1 -1
  180. package/app/.next/server/app/api/usage/chart/route.js +1 -1
  181. package/app/.next/server/app/api/usage/history/route.js +1 -1
  182. package/app/.next/server/app/api/usage/logs/route.js +1 -1
  183. package/app/.next/server/app/api/usage/providers/route.js +1 -1
  184. package/app/.next/server/app/api/usage/request-details/route.js +1 -1
  185. package/app/.next/server/app/api/usage/request-logs/route.js +1 -1
  186. package/app/.next/server/app/api/usage/stats/route.js +1 -1
  187. package/app/.next/server/app/api/usage/stream/route.js +2 -2
  188. package/app/.next/server/app/api/users/[id]/route.js +1 -1
  189. package/app/.next/server/app/api/users/route.js +1 -1
  190. package/app/.next/server/app/api/v1/api/chat/route.js +1 -1
  191. package/app/.next/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  192. package/app/.next/server/app/api/v1/audio/speech/route.js +1 -1
  193. package/app/.next/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  194. package/app/.next/server/app/api/v1/audio/transcriptions/route.js +1 -1
  195. package/app/.next/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
  196. package/app/.next/server/app/api/v1/audio/voices/route.js +1 -1
  197. package/app/.next/server/app/api/v1/chat/completions/route.js +1 -1
  198. package/app/.next/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  199. package/app/.next/server/app/api/v1/embeddings/route.js +1 -1
  200. package/app/.next/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  201. package/app/.next/server/app/api/v1/images/generations/route.js +2 -2
  202. package/app/.next/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  203. package/app/.next/server/app/api/v1/messages/count_tokens/route.js +1 -1
  204. package/app/.next/server/app/api/v1/messages/route.js +1 -1
  205. package/app/.next/server/app/api/v1/messages/route.js.nft.json +1 -1
  206. package/app/.next/server/app/api/v1/models/[kind]/route.js +1 -1
  207. package/app/.next/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
  208. package/app/.next/server/app/api/v1/models/info/route.js +1 -1
  209. package/app/.next/server/app/api/v1/models/route.js +1 -1
  210. package/app/.next/server/app/api/v1/models/route.js.nft.json +1 -1
  211. package/app/.next/server/app/api/v1/responses/compact/route.js +1 -1
  212. package/app/.next/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  213. package/app/.next/server/app/api/v1/responses/route.js +1 -1
  214. package/app/.next/server/app/api/v1/responses/route.js.nft.json +1 -1
  215. package/app/.next/server/app/api/v1/route.js +1 -1
  216. package/app/.next/server/app/api/v1/route.js.nft.json +1 -1
  217. package/app/.next/server/app/api/v1/search/route.js +1 -1
  218. package/app/.next/server/app/api/v1/search/route.js.nft.json +1 -1
  219. package/app/.next/server/app/api/v1/web/fetch/route.js +1 -1
  220. package/app/.next/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
  221. package/app/.next/server/app/api/v1beta/models/[...path]/route.js +1 -1
  222. package/app/.next/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  223. package/app/.next/server/app/api/v1beta/models/route.js +1 -1
  224. package/app/.next/server/app/api/version/route.js +1 -1
  225. package/app/.next/server/app/api/version/update/route.js +1 -1
  226. package/app/.next/server/app/callback/page.js +2 -2
  227. package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  228. package/app/.next/server/app/callback.html +1 -1
  229. package/app/.next/server/app/callback.rsc +4 -4
  230. package/app/.next/server/app/callback.segments/_full.segment.rsc +4 -4
  231. package/app/.next/server/app/callback.segments/_head.segment.rsc +1 -1
  232. package/app/.next/server/app/callback.segments/_index.segment.rsc +4 -4
  233. package/app/.next/server/app/callback.segments/_tree.segment.rsc +2 -2
  234. package/app/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  235. package/app/.next/server/app/callback.segments/callback.segment.rsc +1 -1
  236. package/app/.next/server/app/dashboard/settings/pricing/page.js +2 -2
  237. package/app/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  238. package/app/.next/server/app/dashboard/settings/pricing.html +1 -1
  239. package/app/.next/server/app/dashboard/settings/pricing.rsc +4 -4
  240. package/app/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +4 -4
  241. package/app/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  242. package/app/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +4 -4
  243. package/app/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
  244. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  245. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  246. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  247. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  248. package/app/.next/server/app/favicon.ico/route.js +1 -1
  249. package/app/.next/server/app/index.html +1 -1
  250. package/app/.next/server/app/index.rsc +4 -4
  251. package/app/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  252. package/app/.next/server/app/index.segments/_full.segment.rsc +4 -4
  253. package/app/.next/server/app/index.segments/_head.segment.rsc +1 -1
  254. package/app/.next/server/app/index.segments/_index.segment.rsc +4 -4
  255. package/app/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  256. package/app/.next/server/app/landing/page.js +2 -2
  257. package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  258. package/app/.next/server/app/landing.html +1 -1
  259. package/app/.next/server/app/landing.rsc +5 -5
  260. package/app/.next/server/app/landing.segments/_full.segment.rsc +5 -5
  261. package/app/.next/server/app/landing.segments/_head.segment.rsc +1 -1
  262. package/app/.next/server/app/landing.segments/_index.segment.rsc +4 -4
  263. package/app/.next/server/app/landing.segments/_tree.segment.rsc +2 -2
  264. package/app/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +2 -2
  265. package/app/.next/server/app/landing.segments/landing.segment.rsc +1 -1
  266. package/app/.next/server/app/login/page.js +2 -2
  267. package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
  268. package/app/.next/server/app/login.html +1 -1
  269. package/app/.next/server/app/login.rsc +5 -5
  270. package/app/.next/server/app/login.segments/_full.segment.rsc +5 -5
  271. package/app/.next/server/app/login.segments/_head.segment.rsc +1 -1
  272. package/app/.next/server/app/login.segments/_index.segment.rsc +4 -4
  273. package/app/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  274. package/app/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  275. package/app/.next/server/app/login.segments/login.segment.rsc +1 -1
  276. package/app/.next/server/app/manifest.webmanifest/route.js +2 -2
  277. package/app/.next/server/app/page.js +2 -2
  278. package/app/.next/server/app/page_client-reference-manifest.js +1 -1
  279. package/app/.next/server/app-paths-manifest.json +3 -1
  280. package/app/.next/server/chunks/1679.js +1 -0
  281. package/app/.next/server/chunks/2506.js +2 -2
  282. package/app/.next/server/chunks/2574.js +1 -0
  283. package/app/.next/server/chunks/3110.js +14 -0
  284. package/app/.next/server/chunks/3605.js +1 -0
  285. package/app/.next/server/chunks/3855.js +1 -1
  286. package/app/.next/server/chunks/3913.js +1 -1
  287. package/app/.next/server/chunks/4122.js +1 -1
  288. package/app/.next/server/chunks/4664.js +1 -1
  289. package/app/.next/server/chunks/4989.js +2 -2
  290. package/app/.next/server/chunks/5627.js +6 -4
  291. package/app/.next/server/chunks/5681.js +1 -1
  292. package/app/.next/server/chunks/6108.js +1 -1
  293. package/app/.next/server/chunks/6182.js +5 -4
  294. package/app/.next/server/chunks/6774.js +1 -1
  295. package/app/.next/server/chunks/7341.js +1 -1
  296. package/app/.next/server/chunks/7595.js +1 -1
  297. package/app/.next/server/chunks/7937.js +7 -16
  298. package/app/.next/server/chunks/8590.js +1 -1
  299. package/app/.next/server/chunks/8760.js +1 -1
  300. package/app/.next/server/chunks/8895.js +1 -1
  301. package/app/.next/server/chunks/9489.js +1 -1
  302. package/app/.next/server/chunks/9547.js +4 -14
  303. package/app/.next/server/chunks/9609.js +1 -1
  304. package/app/.next/server/chunks/9718.js +1 -1
  305. package/app/.next/server/functions-config-manifest.json +1 -0
  306. package/app/.next/server/middleware-build-manifest.js +1 -1
  307. package/app/.next/server/middleware.js +3 -3
  308. package/app/.next/server/pages/404.html +1 -1
  309. package/app/.next/server/pages/500.html +1 -1
  310. package/app/.next/static/SQn85l_D0P4BshNJQkGiZ/_buildManifest.js +1 -0
  311. package/app/.next/static/chunks/1321-e48fd14f5bef6d7a.js +1 -0
  312. package/app/.next/static/chunks/2336-36a1f30358e691c6.js +28 -0
  313. package/app/.next/static/chunks/app/(dashboard)/dashboard/admin/users/page-adc5d5e8da3a0761.js +1 -0
  314. package/app/.next/static/chunks/app/(dashboard)/dashboard/media-providers/[kind]/[id]/{page-eb5193b550d3e8de.js → page-c77fedcd9ba7bcac.js} +14 -14
  315. package/app/.next/static/chunks/app/(dashboard)/dashboard/profile/page-ceb9bffbc34711bc.js +1 -0
  316. package/app/.next/static/chunks/app/(dashboard)/dashboard/translator/page-6ec61ce021cdb9a6.js +1 -0
  317. package/app/.next/static/chunks/app/_global-error/page-6ec61ce021cdb9a6.js +1 -0
  318. package/app/.next/static/chunks/app/api/auth/login/route-6ec61ce021cdb9a6.js +1 -0
  319. package/app/.next/static/chunks/app/api/auth/logout/route-6ec61ce021cdb9a6.js +1 -0
  320. package/app/.next/static/chunks/app/api/auth/me/route-6ec61ce021cdb9a6.js +1 -0
  321. package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-6ec61ce021cdb9a6.js +1 -0
  322. package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/inject-auth/route-6ec61ce021cdb9a6.js +1 -0
  323. package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/restart/route-6ec61ce021cdb9a6.js +1 -0
  324. package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/route-6ec61ce021cdb9a6.js +1 -0
  325. package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/test/route-6ec61ce021cdb9a6.js +1 -0
  326. package/app/.next/static/chunks/app/api/cli-tools/claude-settings/route-6ec61ce021cdb9a6.js +1 -0
  327. package/app/.next/static/chunks/app/api/cli-tools/codex-settings/route-6ec61ce021cdb9a6.js +1 -0
  328. package/app/.next/static/chunks/app/api/cli-tools/copilot-settings/route-6ec61ce021cdb9a6.js +1 -0
  329. package/app/.next/static/chunks/app/api/cli-tools/cowork-mcp-registry/route-6ec61ce021cdb9a6.js +1 -0
  330. package/app/.next/static/chunks/app/api/cli-tools/cowork-settings/route-6ec61ce021cdb9a6.js +1 -0
  331. package/app/.next/static/chunks/app/api/cli-tools/droid-settings/route-6ec61ce021cdb9a6.js +1 -0
  332. package/app/.next/static/chunks/app/api/cli-tools/hermes-settings/route-6ec61ce021cdb9a6.js +1 -0
  333. package/app/.next/static/chunks/app/api/cli-tools/openclaw-settings/route-6ec61ce021cdb9a6.js +1 -0
  334. package/app/.next/static/chunks/app/api/cli-tools/opencode-settings/route-6ec61ce021cdb9a6.js +1 -0
  335. package/app/.next/static/chunks/app/api/cloud/auth/route-6ec61ce021cdb9a6.js +1 -0
  336. package/app/.next/static/chunks/app/api/cloud/credentials/update/route-6ec61ce021cdb9a6.js +1 -0
  337. package/app/.next/static/chunks/app/api/cloud/model/resolve/route-6ec61ce021cdb9a6.js +1 -0
  338. package/app/.next/static/chunks/app/api/cloud/models/alias/route-6ec61ce021cdb9a6.js +1 -0
  339. package/app/.next/static/chunks/app/api/combos/[id]/route-6ec61ce021cdb9a6.js +1 -0
  340. package/app/.next/static/chunks/app/api/combos/route-6ec61ce021cdb9a6.js +1 -0
  341. package/app/.next/static/chunks/app/api/health/route-6ec61ce021cdb9a6.js +1 -0
  342. package/app/.next/static/chunks/app/api/init/route-6ec61ce021cdb9a6.js +1 -0
  343. package/app/.next/static/chunks/app/api/keys/[id]/route-6ec61ce021cdb9a6.js +1 -0
  344. package/app/.next/static/chunks/app/api/keys/route-6ec61ce021cdb9a6.js +1 -0
  345. package/app/.next/static/chunks/app/api/locale/route-6ec61ce021cdb9a6.js +1 -0
  346. package/app/.next/static/chunks/app/api/media-providers/tts/deepgram/voices/route-6ec61ce021cdb9a6.js +1 -0
  347. package/app/.next/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-6ec61ce021cdb9a6.js +1 -0
  348. package/app/.next/static/chunks/app/api/media-providers/tts/inworld/voices/route-6ec61ce021cdb9a6.js +1 -0
  349. package/app/.next/static/chunks/app/api/media-providers/tts/voices/route-6ec61ce021cdb9a6.js +1 -0
  350. package/app/.next/static/chunks/app/api/models/alias/route-6ec61ce021cdb9a6.js +1 -0
  351. package/app/.next/static/chunks/app/api/models/availability/route-6ec61ce021cdb9a6.js +1 -0
  352. package/app/.next/static/chunks/app/api/models/custom/route-6ec61ce021cdb9a6.js +1 -0
  353. package/app/.next/static/chunks/app/api/models/disabled/route-6ec61ce021cdb9a6.js +1 -0
  354. package/app/.next/static/chunks/app/api/models/route-6ec61ce021cdb9a6.js +1 -0
  355. package/app/.next/static/chunks/app/api/models/test/route-6ec61ce021cdb9a6.js +1 -0
  356. package/app/.next/static/chunks/app/api/oauth/[provider]/[action]/route-6ec61ce021cdb9a6.js +1 -0
  357. package/app/.next/static/chunks/app/api/oauth/cursor/auto-import/route-6ec61ce021cdb9a6.js +1 -0
  358. package/app/.next/static/chunks/app/api/oauth/cursor/import/route-6ec61ce021cdb9a6.js +1 -0
  359. package/app/.next/static/chunks/app/api/oauth/gitlab/pat/route-6ec61ce021cdb9a6.js +1 -0
  360. package/app/.next/static/chunks/app/api/oauth/iflow/cookie/route-6ec61ce021cdb9a6.js +1 -0
  361. package/app/.next/static/chunks/app/api/oauth/kiro/auto-import/route-6ec61ce021cdb9a6.js +1 -0
  362. package/app/.next/static/chunks/app/api/oauth/kiro/import/route-6ec61ce021cdb9a6.js +1 -0
  363. package/app/.next/static/chunks/app/api/oauth/kiro/social-authorize/route-6ec61ce021cdb9a6.js +1 -0
  364. package/app/.next/static/chunks/app/api/oauth/kiro/social-exchange/route-6ec61ce021cdb9a6.js +1 -0
  365. package/app/.next/static/chunks/app/api/pricing/route-6ec61ce021cdb9a6.js +1 -0
  366. package/app/.next/static/chunks/app/api/provider-nodes/[id]/route-6ec61ce021cdb9a6.js +1 -0
  367. package/app/.next/static/chunks/app/api/provider-nodes/route-6ec61ce021cdb9a6.js +1 -0
  368. package/app/.next/static/chunks/app/api/provider-nodes/validate/route-6ec61ce021cdb9a6.js +1 -0
  369. package/app/.next/static/chunks/app/api/providers/[id]/models/route-6ec61ce021cdb9a6.js +1 -0
  370. package/app/.next/static/chunks/app/api/providers/[id]/route-6ec61ce021cdb9a6.js +1 -0
  371. package/app/.next/static/chunks/app/api/providers/[id]/test/route-6ec61ce021cdb9a6.js +1 -0
  372. package/app/.next/static/chunks/app/api/providers/[id]/test-models/route-6ec61ce021cdb9a6.js +1 -0
  373. package/app/.next/static/chunks/app/api/providers/client/route-6ec61ce021cdb9a6.js +1 -0
  374. package/app/.next/static/chunks/app/api/providers/kilo/free-models/route-6ec61ce021cdb9a6.js +1 -0
  375. package/app/.next/static/chunks/app/api/providers/route-6ec61ce021cdb9a6.js +1 -0
  376. package/app/.next/static/chunks/app/api/providers/suggested-models/route-6ec61ce021cdb9a6.js +1 -0
  377. package/app/.next/static/chunks/app/api/providers/test-batch/route-6ec61ce021cdb9a6.js +1 -0
  378. package/app/.next/static/chunks/app/api/providers/validate/route-6ec61ce021cdb9a6.js +1 -0
  379. package/app/.next/static/chunks/app/api/proxy-pools/[id]/route-6ec61ce021cdb9a6.js +1 -0
  380. package/app/.next/static/chunks/app/api/proxy-pools/[id]/test/route-6ec61ce021cdb9a6.js +1 -0
  381. package/app/.next/static/chunks/app/api/proxy-pools/route-6ec61ce021cdb9a6.js +1 -0
  382. package/app/.next/static/chunks/app/api/proxy-pools/vercel-deploy/route-6ec61ce021cdb9a6.js +1 -0
  383. package/app/.next/static/chunks/app/api/settings/database/route-6ec61ce021cdb9a6.js +1 -0
  384. package/app/.next/static/chunks/app/api/settings/proxy-test/route-6ec61ce021cdb9a6.js +1 -0
  385. package/app/.next/static/chunks/app/api/settings/require-login/route-6ec61ce021cdb9a6.js +1 -0
  386. package/app/.next/static/chunks/app/api/settings/route-6ec61ce021cdb9a6.js +1 -0
  387. package/app/.next/static/chunks/app/api/shutdown/route-6ec61ce021cdb9a6.js +1 -0
  388. package/app/.next/static/chunks/app/api/tags/route-6ec61ce021cdb9a6.js +1 -0
  389. package/app/.next/static/chunks/app/api/translator/console-logs/route-6ec61ce021cdb9a6.js +1 -0
  390. package/app/.next/static/chunks/app/api/translator/console-logs/stream/route-6ec61ce021cdb9a6.js +1 -0
  391. package/app/.next/static/chunks/app/api/translator/load/route-6ec61ce021cdb9a6.js +1 -0
  392. package/app/.next/static/chunks/app/api/translator/save/route-6ec61ce021cdb9a6.js +1 -0
  393. package/app/.next/static/chunks/app/api/translator/send/route-6ec61ce021cdb9a6.js +1 -0
  394. package/app/.next/static/chunks/app/api/translator/translate/route-6ec61ce021cdb9a6.js +1 -0
  395. package/app/.next/static/chunks/app/api/tunnel/disable/route-6ec61ce021cdb9a6.js +1 -0
  396. package/app/.next/static/chunks/app/api/tunnel/enable/route-6ec61ce021cdb9a6.js +1 -0
  397. package/app/.next/static/chunks/app/api/tunnel/status/route-6ec61ce021cdb9a6.js +1 -0
  398. package/app/.next/static/chunks/app/api/tunnel/tailscale-check/route-6ec61ce021cdb9a6.js +1 -0
  399. package/app/.next/static/chunks/app/api/tunnel/tailscale-disable/route-6ec61ce021cdb9a6.js +1 -0
  400. package/app/.next/static/chunks/app/api/tunnel/tailscale-enable/route-6ec61ce021cdb9a6.js +1 -0
  401. package/app/.next/static/chunks/app/api/tunnel/tailscale-install/route-6ec61ce021cdb9a6.js +1 -0
  402. package/app/.next/static/chunks/app/api/tunnel/tailscale-login/route-6ec61ce021cdb9a6.js +1 -0
  403. package/app/.next/static/chunks/app/api/tunnel/tailscale-start-daemon/route-6ec61ce021cdb9a6.js +1 -0
  404. package/app/.next/static/chunks/app/api/usage/[connectionId]/route-6ec61ce021cdb9a6.js +1 -0
  405. package/app/.next/static/chunks/app/api/usage/api-keys/route-6ec61ce021cdb9a6.js +1 -0
  406. package/app/.next/static/chunks/app/api/usage/chart/route-6ec61ce021cdb9a6.js +1 -0
  407. package/app/.next/static/chunks/app/api/usage/history/route-6ec61ce021cdb9a6.js +1 -0
  408. package/app/.next/static/chunks/app/api/usage/logs/route-6ec61ce021cdb9a6.js +1 -0
  409. package/app/.next/static/chunks/app/api/usage/providers/route-6ec61ce021cdb9a6.js +1 -0
  410. package/app/.next/static/chunks/app/api/usage/request-details/route-6ec61ce021cdb9a6.js +1 -0
  411. package/app/.next/static/chunks/app/api/usage/request-logs/route-6ec61ce021cdb9a6.js +1 -0
  412. package/app/.next/static/chunks/app/api/usage/stats/route-6ec61ce021cdb9a6.js +1 -0
  413. package/app/.next/static/chunks/app/api/usage/stream/route-6ec61ce021cdb9a6.js +1 -0
  414. package/app/.next/static/chunks/app/api/users/[id]/route-6ec61ce021cdb9a6.js +1 -0
  415. package/app/.next/static/chunks/app/api/users/route-6ec61ce021cdb9a6.js +1 -0
  416. package/app/.next/static/chunks/app/api/v1/api/chat/route-6ec61ce021cdb9a6.js +1 -0
  417. package/app/.next/static/chunks/app/api/v1/audio/speech/route-6ec61ce021cdb9a6.js +1 -0
  418. package/app/.next/static/chunks/app/api/v1/audio/transcriptions/route-6ec61ce021cdb9a6.js +1 -0
  419. package/app/.next/static/chunks/app/api/v1/audio/voices/route-6ec61ce021cdb9a6.js +1 -0
  420. package/app/.next/static/chunks/app/api/v1/chat/completions/route-6ec61ce021cdb9a6.js +1 -0
  421. package/app/.next/static/chunks/app/api/v1/embeddings/route-6ec61ce021cdb9a6.js +1 -0
  422. package/app/.next/static/chunks/app/api/v1/images/generations/route-6ec61ce021cdb9a6.js +1 -0
  423. package/app/.next/static/chunks/app/api/v1/messages/count_tokens/route-6ec61ce021cdb9a6.js +1 -0
  424. package/app/.next/static/chunks/app/api/v1/messages/route-6ec61ce021cdb9a6.js +1 -0
  425. package/app/.next/static/chunks/app/api/v1/models/[kind]/route-6ec61ce021cdb9a6.js +1 -0
  426. package/app/.next/static/chunks/app/api/v1/models/info/route-6ec61ce021cdb9a6.js +1 -0
  427. package/app/.next/static/chunks/app/api/v1/models/route-6ec61ce021cdb9a6.js +1 -0
  428. package/app/.next/static/chunks/app/api/v1/responses/compact/route-6ec61ce021cdb9a6.js +1 -0
  429. package/app/.next/static/chunks/app/api/v1/responses/route-6ec61ce021cdb9a6.js +1 -0
  430. package/app/.next/static/chunks/app/api/v1/route-6ec61ce021cdb9a6.js +1 -0
  431. package/app/.next/static/chunks/app/api/v1/search/route-6ec61ce021cdb9a6.js +1 -0
  432. package/app/.next/static/chunks/app/api/v1/web/fetch/route-6ec61ce021cdb9a6.js +1 -0
  433. package/app/.next/static/chunks/app/api/v1beta/models/[...path]/route-6ec61ce021cdb9a6.js +1 -0
  434. package/app/.next/static/chunks/app/api/v1beta/models/route-6ec61ce021cdb9a6.js +1 -0
  435. package/app/.next/static/chunks/app/api/version/route-6ec61ce021cdb9a6.js +1 -0
  436. package/app/.next/static/chunks/app/api/version/update/route-6ec61ce021cdb9a6.js +1 -0
  437. package/app/.next/static/chunks/app/landing/{page-c7ae6a40e2a2228d.js → page-4644660041715534.js} +1 -1
  438. package/app/.next/static/chunks/app/manifest.webmanifest/route-6ec61ce021cdb9a6.js +1 -0
  439. package/app/.next/static/chunks/app/page-6ec61ce021cdb9a6.js +1 -0
  440. package/app/.next/static/chunks/next/dist/client/components/builtin/app-error-6ec61ce021cdb9a6.js +1 -0
  441. package/app/.next/static/chunks/next/dist/client/components/builtin/forbidden-6ec61ce021cdb9a6.js +1 -0
  442. package/app/.next/static/chunks/next/dist/client/components/builtin/not-found-6ec61ce021cdb9a6.js +1 -0
  443. package/app/.next/static/chunks/next/dist/client/components/builtin/unauthorized-6ec61ce021cdb9a6.js +1 -0
  444. package/app/.next/static/css/d726e4e5a2cfbfd1.css +1 -0
  445. package/app/package.json +1 -1
  446. package/app/public/providers/commandcode.png +0 -0
  447. package/app/src/mitm/antigravityAvailableModels.fixture.json +632 -0
  448. package/app/src/mitm/antigravityModels.js +265 -0
  449. package/app/src/mitm/cert/install.js +13 -8
  450. package/app/src/mitm/cert/rootCA.js +20 -5
  451. package/app/src/mitm/config.js +30 -3
  452. package/app/src/mitm/dns/dnsConfig.js +115 -2
  453. package/app/src/mitm/handlers/antigravity.js +29 -2
  454. package/app/src/mitm/handlers/openrouter.js +82 -3
  455. package/app/src/mitm/logger.js +1 -1
  456. package/app/src/mitm/manager.js +11 -3
  457. package/app/src/mitm/server.js +219 -18
  458. package/app/src/shared/constants/mitmToolHosts.js +5 -1
  459. package/package.json +1 -1
  460. package/src/cli/api/client.js +2 -2
  461. package/src/cli/terminalUI.js +2 -2
  462. package/src/cli/tray/autostart.js +25 -24
  463. package/src/cli/tray/tray.js +3 -3
  464. package/app/.next/server/chunks/2343.js +0 -1
  465. package/app/.next/static/5xyYjBoSvv2Kb5BwIi7pF/_buildManifest.js +0 -1
  466. package/app/.next/static/chunks/1321-8d71ef3958ddd91f.js +0 -1
  467. package/app/.next/static/chunks/2336-9fd2cc8ed73b0db4.js +0 -38
  468. package/app/.next/static/chunks/app/(dashboard)/dashboard/admin/users/page-15091159f6d63fb7.js +0 -1
  469. package/app/.next/static/chunks/app/(dashboard)/dashboard/profile/page-6289612ce5f7c181.js +0 -1
  470. package/app/.next/static/chunks/app/(dashboard)/dashboard/translator/page-e26f08039efe859c.js +0 -1
  471. package/app/.next/static/chunks/app/_global-error/page-e26f08039efe859c.js +0 -1
  472. package/app/.next/static/chunks/app/api/auth/login/route-e26f08039efe859c.js +0 -1
  473. package/app/.next/static/chunks/app/api/auth/logout/route-e26f08039efe859c.js +0 -1
  474. package/app/.next/static/chunks/app/api/auth/me/route-e26f08039efe859c.js +0 -1
  475. package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-e26f08039efe859c.js +0 -1
  476. package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/route-e26f08039efe859c.js +0 -1
  477. package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/test/route-e26f08039efe859c.js +0 -1
  478. package/app/.next/static/chunks/app/api/cli-tools/claude-settings/route-e26f08039efe859c.js +0 -1
  479. package/app/.next/static/chunks/app/api/cli-tools/codex-settings/route-e26f08039efe859c.js +0 -1
  480. package/app/.next/static/chunks/app/api/cli-tools/copilot-settings/route-e26f08039efe859c.js +0 -1
  481. package/app/.next/static/chunks/app/api/cli-tools/cowork-mcp-registry/route-e26f08039efe859c.js +0 -1
  482. package/app/.next/static/chunks/app/api/cli-tools/cowork-settings/route-e26f08039efe859c.js +0 -1
  483. package/app/.next/static/chunks/app/api/cli-tools/droid-settings/route-e26f08039efe859c.js +0 -1
  484. package/app/.next/static/chunks/app/api/cli-tools/hermes-settings/route-e26f08039efe859c.js +0 -1
  485. package/app/.next/static/chunks/app/api/cli-tools/openclaw-settings/route-e26f08039efe859c.js +0 -1
  486. package/app/.next/static/chunks/app/api/cli-tools/opencode-settings/route-e26f08039efe859c.js +0 -1
  487. package/app/.next/static/chunks/app/api/cloud/auth/route-e26f08039efe859c.js +0 -1
  488. package/app/.next/static/chunks/app/api/cloud/credentials/update/route-e26f08039efe859c.js +0 -1
  489. package/app/.next/static/chunks/app/api/cloud/model/resolve/route-e26f08039efe859c.js +0 -1
  490. package/app/.next/static/chunks/app/api/cloud/models/alias/route-e26f08039efe859c.js +0 -1
  491. package/app/.next/static/chunks/app/api/combos/[id]/route-e26f08039efe859c.js +0 -1
  492. package/app/.next/static/chunks/app/api/combos/route-e26f08039efe859c.js +0 -1
  493. package/app/.next/static/chunks/app/api/health/route-e26f08039efe859c.js +0 -1
  494. package/app/.next/static/chunks/app/api/init/route-e26f08039efe859c.js +0 -1
  495. package/app/.next/static/chunks/app/api/keys/[id]/route-e26f08039efe859c.js +0 -1
  496. package/app/.next/static/chunks/app/api/keys/route-e26f08039efe859c.js +0 -1
  497. package/app/.next/static/chunks/app/api/locale/route-e26f08039efe859c.js +0 -1
  498. package/app/.next/static/chunks/app/api/media-providers/tts/deepgram/voices/route-e26f08039efe859c.js +0 -1
  499. package/app/.next/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-e26f08039efe859c.js +0 -1
  500. package/app/.next/static/chunks/app/api/media-providers/tts/inworld/voices/route-e26f08039efe859c.js +0 -1
  501. package/app/.next/static/chunks/app/api/media-providers/tts/voices/route-e26f08039efe859c.js +0 -1
  502. package/app/.next/static/chunks/app/api/models/alias/route-e26f08039efe859c.js +0 -1
  503. package/app/.next/static/chunks/app/api/models/availability/route-e26f08039efe859c.js +0 -1
  504. package/app/.next/static/chunks/app/api/models/custom/route-e26f08039efe859c.js +0 -1
  505. package/app/.next/static/chunks/app/api/models/disabled/route-e26f08039efe859c.js +0 -1
  506. package/app/.next/static/chunks/app/api/models/route-e26f08039efe859c.js +0 -1
  507. package/app/.next/static/chunks/app/api/models/test/route-e26f08039efe859c.js +0 -1
  508. package/app/.next/static/chunks/app/api/oauth/[provider]/[action]/route-e26f08039efe859c.js +0 -1
  509. package/app/.next/static/chunks/app/api/oauth/cursor/auto-import/route-e26f08039efe859c.js +0 -1
  510. package/app/.next/static/chunks/app/api/oauth/cursor/import/route-e26f08039efe859c.js +0 -1
  511. package/app/.next/static/chunks/app/api/oauth/gitlab/pat/route-e26f08039efe859c.js +0 -1
  512. package/app/.next/static/chunks/app/api/oauth/iflow/cookie/route-e26f08039efe859c.js +0 -1
  513. package/app/.next/static/chunks/app/api/oauth/kiro/auto-import/route-e26f08039efe859c.js +0 -1
  514. package/app/.next/static/chunks/app/api/oauth/kiro/import/route-e26f08039efe859c.js +0 -1
  515. package/app/.next/static/chunks/app/api/oauth/kiro/social-authorize/route-e26f08039efe859c.js +0 -1
  516. package/app/.next/static/chunks/app/api/oauth/kiro/social-exchange/route-e26f08039efe859c.js +0 -1
  517. package/app/.next/static/chunks/app/api/pricing/route-e26f08039efe859c.js +0 -1
  518. package/app/.next/static/chunks/app/api/provider-nodes/[id]/route-e26f08039efe859c.js +0 -1
  519. package/app/.next/static/chunks/app/api/provider-nodes/route-e26f08039efe859c.js +0 -1
  520. package/app/.next/static/chunks/app/api/provider-nodes/validate/route-e26f08039efe859c.js +0 -1
  521. package/app/.next/static/chunks/app/api/providers/[id]/models/route-e26f08039efe859c.js +0 -1
  522. package/app/.next/static/chunks/app/api/providers/[id]/route-e26f08039efe859c.js +0 -1
  523. package/app/.next/static/chunks/app/api/providers/[id]/test/route-e26f08039efe859c.js +0 -1
  524. package/app/.next/static/chunks/app/api/providers/[id]/test-models/route-e26f08039efe859c.js +0 -1
  525. package/app/.next/static/chunks/app/api/providers/client/route-e26f08039efe859c.js +0 -1
  526. package/app/.next/static/chunks/app/api/providers/kilo/free-models/route-e26f08039efe859c.js +0 -1
  527. package/app/.next/static/chunks/app/api/providers/route-e26f08039efe859c.js +0 -1
  528. package/app/.next/static/chunks/app/api/providers/suggested-models/route-e26f08039efe859c.js +0 -1
  529. package/app/.next/static/chunks/app/api/providers/test-batch/route-e26f08039efe859c.js +0 -1
  530. package/app/.next/static/chunks/app/api/providers/validate/route-e26f08039efe859c.js +0 -1
  531. package/app/.next/static/chunks/app/api/proxy-pools/[id]/route-e26f08039efe859c.js +0 -1
  532. package/app/.next/static/chunks/app/api/proxy-pools/[id]/test/route-e26f08039efe859c.js +0 -1
  533. package/app/.next/static/chunks/app/api/proxy-pools/route-e26f08039efe859c.js +0 -1
  534. package/app/.next/static/chunks/app/api/proxy-pools/vercel-deploy/route-e26f08039efe859c.js +0 -1
  535. package/app/.next/static/chunks/app/api/settings/database/route-e26f08039efe859c.js +0 -1
  536. package/app/.next/static/chunks/app/api/settings/proxy-test/route-e26f08039efe859c.js +0 -1
  537. package/app/.next/static/chunks/app/api/settings/require-login/route-e26f08039efe859c.js +0 -1
  538. package/app/.next/static/chunks/app/api/settings/route-e26f08039efe859c.js +0 -1
  539. package/app/.next/static/chunks/app/api/shutdown/route-e26f08039efe859c.js +0 -1
  540. package/app/.next/static/chunks/app/api/tags/route-e26f08039efe859c.js +0 -1
  541. package/app/.next/static/chunks/app/api/translator/console-logs/route-e26f08039efe859c.js +0 -1
  542. package/app/.next/static/chunks/app/api/translator/console-logs/stream/route-e26f08039efe859c.js +0 -1
  543. package/app/.next/static/chunks/app/api/translator/load/route-e26f08039efe859c.js +0 -1
  544. package/app/.next/static/chunks/app/api/translator/save/route-e26f08039efe859c.js +0 -1
  545. package/app/.next/static/chunks/app/api/translator/send/route-e26f08039efe859c.js +0 -1
  546. package/app/.next/static/chunks/app/api/translator/translate/route-e26f08039efe859c.js +0 -1
  547. package/app/.next/static/chunks/app/api/tunnel/disable/route-e26f08039efe859c.js +0 -1
  548. package/app/.next/static/chunks/app/api/tunnel/enable/route-e26f08039efe859c.js +0 -1
  549. package/app/.next/static/chunks/app/api/tunnel/status/route-e26f08039efe859c.js +0 -1
  550. package/app/.next/static/chunks/app/api/tunnel/tailscale-check/route-e26f08039efe859c.js +0 -1
  551. package/app/.next/static/chunks/app/api/tunnel/tailscale-disable/route-e26f08039efe859c.js +0 -1
  552. package/app/.next/static/chunks/app/api/tunnel/tailscale-enable/route-e26f08039efe859c.js +0 -1
  553. package/app/.next/static/chunks/app/api/tunnel/tailscale-install/route-e26f08039efe859c.js +0 -1
  554. package/app/.next/static/chunks/app/api/tunnel/tailscale-login/route-e26f08039efe859c.js +0 -1
  555. package/app/.next/static/chunks/app/api/tunnel/tailscale-start-daemon/route-e26f08039efe859c.js +0 -1
  556. package/app/.next/static/chunks/app/api/usage/[connectionId]/route-e26f08039efe859c.js +0 -1
  557. package/app/.next/static/chunks/app/api/usage/api-keys/route-e26f08039efe859c.js +0 -1
  558. package/app/.next/static/chunks/app/api/usage/chart/route-e26f08039efe859c.js +0 -1
  559. package/app/.next/static/chunks/app/api/usage/history/route-e26f08039efe859c.js +0 -1
  560. package/app/.next/static/chunks/app/api/usage/logs/route-e26f08039efe859c.js +0 -1
  561. package/app/.next/static/chunks/app/api/usage/providers/route-e26f08039efe859c.js +0 -1
  562. package/app/.next/static/chunks/app/api/usage/request-details/route-e26f08039efe859c.js +0 -1
  563. package/app/.next/static/chunks/app/api/usage/request-logs/route-e26f08039efe859c.js +0 -1
  564. package/app/.next/static/chunks/app/api/usage/stats/route-e26f08039efe859c.js +0 -1
  565. package/app/.next/static/chunks/app/api/usage/stream/route-e26f08039efe859c.js +0 -1
  566. package/app/.next/static/chunks/app/api/users/[id]/route-e26f08039efe859c.js +0 -1
  567. package/app/.next/static/chunks/app/api/users/route-e26f08039efe859c.js +0 -1
  568. package/app/.next/static/chunks/app/api/v1/api/chat/route-e26f08039efe859c.js +0 -1
  569. package/app/.next/static/chunks/app/api/v1/audio/speech/route-e26f08039efe859c.js +0 -1
  570. package/app/.next/static/chunks/app/api/v1/audio/transcriptions/route-e26f08039efe859c.js +0 -1
  571. package/app/.next/static/chunks/app/api/v1/audio/voices/route-e26f08039efe859c.js +0 -1
  572. package/app/.next/static/chunks/app/api/v1/chat/completions/route-e26f08039efe859c.js +0 -1
  573. package/app/.next/static/chunks/app/api/v1/embeddings/route-e26f08039efe859c.js +0 -1
  574. package/app/.next/static/chunks/app/api/v1/images/generations/route-e26f08039efe859c.js +0 -1
  575. package/app/.next/static/chunks/app/api/v1/messages/count_tokens/route-e26f08039efe859c.js +0 -1
  576. package/app/.next/static/chunks/app/api/v1/messages/route-e26f08039efe859c.js +0 -1
  577. package/app/.next/static/chunks/app/api/v1/models/[kind]/route-e26f08039efe859c.js +0 -1
  578. package/app/.next/static/chunks/app/api/v1/models/info/route-e26f08039efe859c.js +0 -1
  579. package/app/.next/static/chunks/app/api/v1/models/route-e26f08039efe859c.js +0 -1
  580. package/app/.next/static/chunks/app/api/v1/responses/compact/route-e26f08039efe859c.js +0 -1
  581. package/app/.next/static/chunks/app/api/v1/responses/route-e26f08039efe859c.js +0 -1
  582. package/app/.next/static/chunks/app/api/v1/route-e26f08039efe859c.js +0 -1
  583. package/app/.next/static/chunks/app/api/v1/search/route-e26f08039efe859c.js +0 -1
  584. package/app/.next/static/chunks/app/api/v1/web/fetch/route-e26f08039efe859c.js +0 -1
  585. package/app/.next/static/chunks/app/api/v1beta/models/[...path]/route-e26f08039efe859c.js +0 -1
  586. package/app/.next/static/chunks/app/api/v1beta/models/route-e26f08039efe859c.js +0 -1
  587. package/app/.next/static/chunks/app/api/version/route-e26f08039efe859c.js +0 -1
  588. package/app/.next/static/chunks/app/api/version/update/route-e26f08039efe859c.js +0 -1
  589. package/app/.next/static/chunks/app/manifest.webmanifest/route-e26f08039efe859c.js +0 -1
  590. package/app/.next/static/chunks/app/page-e26f08039efe859c.js +0 -1
  591. package/app/.next/static/chunks/next/dist/client/components/builtin/app-error-e26f08039efe859c.js +0 -1
  592. package/app/.next/static/chunks/next/dist/client/components/builtin/forbidden-e26f08039efe859c.js +0 -1
  593. package/app/.next/static/chunks/next/dist/client/components/builtin/not-found-e26f08039efe859c.js +0 -1
  594. package/app/.next/static/chunks/next/dist/client/components/builtin/unauthorized-e26f08039efe859c.js +0 -1
  595. package/app/.next/static/css/48caf49054c81db9.css +0 -1
  596. /package/app/.next/static/{5xyYjBoSvv2Kb5BwIi7pF → SQn85l_D0P4BshNJQkGiZ}/_ssgManifest.js +0 -0
@@ -0,0 +1,265 @@
1
+ const REAL_AVAILABLE_MODELS_FIXTURE = require("./antigravityAvailableModels.fixture.json");
2
+
3
+ const BASE_MODEL_EXPERIMENTS = {
4
+ experiments: {
5
+ CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
6
+ stringValue: JSON.stringify({
7
+ strategy: "CHECKPOINT_STRATEGY_SINGLE_PROMPT",
8
+ max_token_limit: "128000",
9
+ token_threshold: "50000",
10
+ max_overhead_ratio: "0.15",
11
+ moving_window_size: "1",
12
+ enabled: true,
13
+ max_output_tokens: "16384",
14
+ checkpoint_model: "MODEL_PLACEHOLDER_M50",
15
+ retry_config: {
16
+ max_retries: 0,
17
+ initial_sleep_duration_ms: 1000,
18
+ exponential_multiplier: 2,
19
+ include_error_feedback: false,
20
+ },
21
+ }, null, 4),
22
+ },
23
+ },
24
+ };
25
+
26
+ const COMMON_CODE_MIME_TYPES = {
27
+ "application/json": true,
28
+ "application/pdf": true,
29
+ "application/rtf": true,
30
+ "application/x-ipynb+json": true,
31
+ "application/x-javascript": true,
32
+ "application/x-python-code": true,
33
+ "application/x-typescript": true,
34
+ "image/heic": true,
35
+ "image/heif": true,
36
+ "image/jpeg": true,
37
+ "image/png": true,
38
+ "image/webp": true,
39
+ "text/css": true,
40
+ "text/csv": true,
41
+ "text/html": true,
42
+ "text/javascript": true,
43
+ "text/markdown": true,
44
+ "text/plain": true,
45
+ "text/rtf": true,
46
+ "text/x-python": true,
47
+ "text/x-python-script": true,
48
+ "text/x-typescript": true,
49
+ "text/xml": true,
50
+ "video/mp4": true,
51
+ "video/webm": true,
52
+ };
53
+
54
+ function quota(resetDays = 7) {
55
+ const resetTime = new Date(Date.now() + resetDays * 24 * 60 * 60 * 1000).toISOString();
56
+ return { remainingFraction: 1, resetTime };
57
+ }
58
+
59
+ function geminiModel(displayName, model, options = {}) {
60
+ return {
61
+ displayName,
62
+ supportsImages: true,
63
+ supportsThinking: true,
64
+ thinkingBudget: options.thinkingBudget ?? 1024,
65
+ minThinkingBudget: options.minThinkingBudget ?? 128,
66
+ recommended: true,
67
+ maxTokens: 1048576,
68
+ maxOutputTokens: 65535,
69
+ tokenizerType: "LLAMA_WITH_SPECIAL",
70
+ quotaInfo: quota(options.resetDays),
71
+ model,
72
+ apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
73
+ modelProvider: "MODEL_PROVIDER_GOOGLE",
74
+ supportsVideo: true,
75
+ supportedMimeTypes: COMMON_CODE_MIME_TYPES,
76
+ requiresImageOutputOutsideFunctionResponses: options.requiresImageOutputOutsideFunctionResponses,
77
+ modelExperiments: BASE_MODEL_EXPERIMENTS,
78
+ };
79
+ }
80
+
81
+ function anthropicModel(displayName, model) {
82
+ return {
83
+ displayName,
84
+ supportsImages: true,
85
+ supportsThinking: true,
86
+ thinkingBudget: 1024,
87
+ recommended: true,
88
+ maxTokens: 250000,
89
+ maxOutputTokens: 64000,
90
+ tokenizerType: "LLAMA_WITH_SPECIAL",
91
+ quotaInfo: quota(),
92
+ model,
93
+ apiProvider: "API_PROVIDER_ANTHROPIC_VERTEX",
94
+ modelProvider: "MODEL_PROVIDER_ANTHROPIC",
95
+ supportedMimeTypes: {
96
+ "image/heic": true,
97
+ "image/heif": true,
98
+ "image/jpeg": true,
99
+ "image/png": true,
100
+ "image/webp": true,
101
+ },
102
+ modelExperiments: BASE_MODEL_EXPERIMENTS,
103
+ };
104
+ }
105
+
106
+ function openAiModel(displayName, model) {
107
+ return {
108
+ displayName,
109
+ supportsThinking: true,
110
+ thinkingBudget: 8192,
111
+ recommended: true,
112
+ maxTokens: 131072,
113
+ maxOutputTokens: 32768,
114
+ tokenizerType: "LLAMA_WITH_SPECIAL",
115
+ quotaInfo: quota(),
116
+ model,
117
+ apiProvider: "API_PROVIDER_OPENAI_VERTEX",
118
+ modelProvider: "MODEL_PROVIDER_OPENAI",
119
+ modelExperiments: BASE_MODEL_EXPERIMENTS,
120
+ };
121
+ }
122
+
123
+ function tabModel(model, maxTokens = 16384) {
124
+ return {
125
+ maxTokens,
126
+ maxOutputTokens: 4096,
127
+ tokenizerType: "QWEN2",
128
+ quotaInfo: { remainingFraction: 1 },
129
+ model,
130
+ apiProvider: "API_PROVIDER_INTERNAL",
131
+ supportsCumulativeContext: true,
132
+ supportsEstimateTokenCounter: true,
133
+ isInternal: true,
134
+ promptTemplaterType: "PROMPT_TEMPLATER_TYPE_CHATML",
135
+ toolFormatterType: "TOOL_FORMATTER_TYPE_XML",
136
+ requiresLeadInGeneration: true,
137
+ };
138
+ }
139
+
140
+ function googleTabModel(model, maxTokens = 16384) {
141
+ return {
142
+ maxTokens,
143
+ maxOutputTokens: 4096,
144
+ tokenizerType: "LLAMA_WITH_SPECIAL",
145
+ quotaInfo: { remainingFraction: 1 },
146
+ model,
147
+ apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
148
+ modelProvider: "MODEL_PROVIDER_GOOGLE",
149
+ supportsCumulativeContext: true,
150
+ supportsEstimateTokenCounter: true,
151
+ isInternal: true,
152
+ promptTemplaterType: "PROMPT_TEMPLATER_TYPE_CHATML",
153
+ toolFormatterType: "TOOL_FORMATTER_TYPE_XML",
154
+ requiresLeadInGeneration: true,
155
+ };
156
+ }
157
+
158
+ function imageModel(displayName, model) {
159
+ return {
160
+ displayName,
161
+ supportsImages: true,
162
+ maxTokens: 32768,
163
+ maxOutputTokens: 8192,
164
+ tokenizerType: "LLAMA_WITH_SPECIAL",
165
+ quotaInfo: quota(),
166
+ model,
167
+ apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
168
+ modelProvider: "MODEL_PROVIDER_GOOGLE",
169
+ supportedMimeTypes: COMMON_CODE_MIME_TYPES,
170
+ };
171
+ }
172
+
173
+ function freshResetTime(days = 7) {
174
+ return new Date(Date.now() + days * 24 * 60 * 60 * 1000).toISOString();
175
+ }
176
+
177
+ function cloneFixtureWithFreshQuota() {
178
+ const payload = JSON.parse(JSON.stringify(REAL_AVAILABLE_MODELS_FIXTURE));
179
+ const agentIds = new Set(
180
+ (payload.agentModelSorts || [])
181
+ .flatMap((sort) => sort.groups || [])
182
+ .flatMap((group) => group.modelIds || []),
183
+ );
184
+
185
+ for (const [id, model] of Object.entries(payload.models || {})) {
186
+ if (!model.quotaInfo) model.quotaInfo = { remainingFraction: 1 };
187
+ model.quotaInfo.remainingFraction = typeof model.quotaInfo.remainingFraction === "number"
188
+ ? model.quotaInfo.remainingFraction
189
+ : 1;
190
+ if (model.quotaInfo.resetTime) {
191
+ model.quotaInfo.resetTime = freshResetTime(agentIds.has(id) ? 7 : 1);
192
+ }
193
+ }
194
+
195
+ return payload;
196
+ }
197
+
198
+ function buildAntigravityAvailableModelsResponse() {
199
+ if (REAL_AVAILABLE_MODELS_FIXTURE?.models) return cloneFixtureWithFreshQuota();
200
+
201
+ const models = {
202
+ "gemini-2.5-flash-thinking": geminiModel("Gemini 3.1 Flash Lite", "MODEL_GOOGLE_GEMINI_2_5_FLASH_THINKING"),
203
+ "gemini-2.5-pro": geminiModel("Gemini 2.5 Pro", "MODEL_GOOGLE_GEMINI_2_5_PRO", {
204
+ requiresImageOutputOutsideFunctionResponses: true,
205
+ }),
206
+ "gemini-2.5-flash-lite": geminiModel("Gemini 3.1 Flash Lite", "MODEL_GOOGLE_GEMINI_2_5_FLASH_LITE"),
207
+ "gemini-2.5-flash": geminiModel("Gemini 3.1 Flash Lite", "MODEL_GOOGLE_GEMINI_2_5_FLASH"),
208
+ "gemini-3.1-flash-lite": geminiModel("Gemini 3.1 Flash Lite", "MODEL_PLACEHOLDER_M50"),
209
+ "gemini-3.1-pro-high": geminiModel("Gemini 3.1 Pro (High)", "MODEL_PLACEHOLDER_M37", {
210
+ thinkingBudget: 10001,
211
+ }),
212
+ "gemini-3.1-pro-low": geminiModel("Gemini 3.1 Pro (Low)", "MODEL_PLACEHOLDER_M36", {
213
+ thinkingBudget: 1001,
214
+ }),
215
+ "gemini-3-flash-agent": geminiModel("Gemini 3 Flash", "MODEL_PLACEHOLDER_M84", {
216
+ thinkingBudget: -1,
217
+ minThinkingBudget: 32,
218
+ }),
219
+ "gemini-3-flash": geminiModel("Gemini 3 Flash", "MODEL_PLACEHOLDER_M18", {
220
+ thinkingBudget: -1,
221
+ minThinkingBudget: 32,
222
+ }),
223
+ "gemini-3.1-flash-image": imageModel("Gemini 3.1 Flash Image", "MODEL_PLACEHOLDER_M21"),
224
+ "claude-sonnet-4-6": anthropicModel("Claude Sonnet 4.6 (Thinking)", "MODEL_PLACEHOLDER_M35"),
225
+ "claude-opus-4-6-thinking": anthropicModel("Claude Opus 4.6 (Thinking)", "MODEL_PLACEHOLDER_M26"),
226
+ "gpt-oss-120b-medium": openAiModel("GPT-OSS 120B (Medium)", "MODEL_OPENAI_GPT_OSS_120B_MEDIUM"),
227
+ "tab_flash_lite_preview": googleTabModel("MODEL_PLACEHOLDER_M19"),
228
+ "tab_jump_flash_lite_preview": googleTabModel("MODEL_PLACEHOLDER_M28"),
229
+ "chat_20706": tabModel("MODEL_CHAT_20706"),
230
+ "chat_23310": tabModel("MODEL_CHAT_23310", 32768),
231
+ };
232
+
233
+ return {
234
+ models,
235
+ defaultAgentModelId: "gemini-3.1-pro-high",
236
+ agentModelSorts: [
237
+ {
238
+ displayName: "Recommended",
239
+ groups: [
240
+ {
241
+ modelIds: [
242
+ "gemini-3.1-pro-high",
243
+ "gemini-3.1-pro-low",
244
+ "gemini-3-flash-agent",
245
+ "claude-sonnet-4-6",
246
+ "claude-opus-4-6-thinking",
247
+ "gpt-oss-120b-medium",
248
+ ],
249
+ },
250
+ ],
251
+ },
252
+ ],
253
+ commandModelIds: ["gemini-3-flash"],
254
+ tabModelIds: ["chat_20706", "chat_23310"],
255
+ imageGenerationModelIds: [],
256
+ mqueryModelIds: ["gemini-3.1-flash-lite"],
257
+ webSearchModelIds: ["gemini-3.1-flash-lite"],
258
+ commitMessageModelIds: ["gemini-3-flash"],
259
+ audioTranscriptionModelIds: [],
260
+ experimentIds: [],
261
+ tieredModelIds: {},
262
+ };
263
+ }
264
+
265
+ module.exports = { buildAntigravityAvailableModelsResponse };
@@ -4,11 +4,14 @@ const { exec } = require("child_process");
4
4
  const { execWithPassword, isSudoAvailable } = require("../dns/dnsConfig.js");
5
5
  const { runElevatedPowerShell, quotePs } = require("../winElevated.js");
6
6
  const { log, err } = require("../logger");
7
+ const { ROOT_CA_CN } = require("./rootCA.js");
7
8
 
8
9
  const IS_WIN = process.platform === "win32";
9
10
  const IS_MAC = process.platform === "darwin";
10
11
  const LINUX_CERT_DIR = "/usr/local/share/ca-certificates";
11
- const ROOT_CA_CN = "9Router MITM Root CA";
12
+ const LEGACY_ROOT_CA_CN = "9Router MITM Root CA";
13
+ const LINUX_CERT_FILE = `${LINUX_CERT_DIR}/openrouterx-root-ca.crt`;
14
+ const LEGACY_LINUX_CERT_FILE = `${LINUX_CERT_DIR}/9router-root-ca.crt`;
12
15
 
13
16
  // Get SHA1 fingerprint from cert file using Node.js crypto
14
17
  function getCertFingerprint(certPath) {
@@ -84,7 +87,10 @@ async function installCert(sudoPassword, certPath) {
84
87
 
85
88
  async function installCertMac(sudoPassword, certPath) {
86
89
  // Remove all old certs with same name first to avoid duplicate/stale cert conflict
87
- const deleteOld = `security delete-certificate -c "9Router MITM Root CA" /Library/Keychains/System.keychain 2>/dev/null || true`;
90
+ const deleteOld = [
91
+ `security delete-certificate -c "${LEGACY_ROOT_CA_CN}" /Library/Keychains/System.keychain 2>/dev/null || true`,
92
+ `security delete-certificate -c "${ROOT_CA_CN}" /Library/Keychains/System.keychain 2>/dev/null || true`,
93
+ ].join(" && ");
88
94
  const install = `security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain "${certPath}"`;
89
95
  try {
90
96
  await execWithPassword(`${deleteOld} && ${install}`, sudoPassword);
@@ -99,6 +105,7 @@ async function installCertWindows(certPath) {
99
105
  // Auto-elevate via UAC popup if not admin (zero popup if already admin).
100
106
  // Delete any stale cert with same CN before adding to avoid duplicates.
101
107
  const script = `
108
+ certutil -delstore Root ${quotePs(LEGACY_ROOT_CA_CN)} 2>$null | Out-Null
102
109
  certutil -delstore Root ${quotePs(ROOT_CA_CN)} 2>$null | Out-Null
103
110
  $exit = & certutil -addstore Root ${quotePs(certPath)} 2>&1
104
111
  if ($LASTEXITCODE -ne 0) { throw "certutil exit $LASTEXITCODE" }
@@ -153,8 +160,7 @@ async function uninstallCertWindows() {
153
160
  }
154
161
 
155
162
  function checkCertInstalledLinux() {
156
- const certFile = `${LINUX_CERT_DIR}/9router-root-ca.crt`;
157
- return Promise.resolve(fs.existsSync(certFile));
163
+ return Promise.resolve(fs.existsSync(LINUX_CERT_FILE));
158
164
  }
159
165
 
160
166
  async function installCertLinux(sudoPassword, certPath) {
@@ -162,9 +168,9 @@ async function installCertLinux(sudoPassword, certPath) {
162
168
  log(`🔐 Cert: cannot install to system store without sudo — trust this file on clients: ${certPath}`);
163
169
  return;
164
170
  }
165
- const destFile = `${LINUX_CERT_DIR}/9router-root-ca.crt`;
171
+ const destFile = LINUX_CERT_FILE;
166
172
  // Try update-ca-certificates (Debian/Ubuntu), fallback to update-ca-trust (Fedora/RHEL)
167
- const cmd = `cp "${certPath}" "${destFile}" && (update-ca-certificates 2>/dev/null || update-ca-trust 2>/dev/null || true)`;
173
+ const cmd = `rm -f "${LEGACY_LINUX_CERT_FILE}" && cp "${certPath}" "${destFile}" && (update-ca-certificates 2>/dev/null || update-ca-trust 2>/dev/null || true)`;
168
174
  try {
169
175
  await execWithPassword(cmd, sudoPassword);
170
176
  log("🔐 Cert: ✅ installed to Linux trust store");
@@ -177,8 +183,7 @@ async function uninstallCertLinux(sudoPassword) {
177
183
  if (!isSudoAvailable()) {
178
184
  return;
179
185
  }
180
- const destFile = `${LINUX_CERT_DIR}/9router-root-ca.crt`;
181
- const cmd = `rm -f "${destFile}" && (update-ca-certificates 2>/dev/null || update-ca-trust 2>/dev/null || true)`;
186
+ const cmd = `rm -f "${LINUX_CERT_FILE}" "${LEGACY_LINUX_CERT_FILE}" && (update-ca-certificates 2>/dev/null || update-ca-trust 2>/dev/null || true)`;
182
187
  try {
183
188
  await execWithPassword(cmd, sudoPassword);
184
189
  log("🔐 Cert: ✅ uninstalled from Linux trust store");
@@ -5,6 +5,8 @@ const { MITM_DIR } = require("../paths");
5
5
 
6
6
  const ROOT_CA_KEY_PATH = path.join(MITM_DIR, "rootCA.key");
7
7
  const ROOT_CA_CERT_PATH = path.join(MITM_DIR, "rootCA.crt");
8
+ const ROOT_CA_CN = "OpenRouterX MITM Root CA";
9
+ const ROOT_CA_ORG = "OpenRouterX";
8
10
 
9
11
  /**
10
12
  * Check if cert file is expired or expiring within 30 days
@@ -19,18 +21,29 @@ function isCertExpired(certPath) {
19
21
  }
20
22
  }
21
23
 
24
+ function isOpenRouterXRootCA(certPath) {
25
+ try {
26
+ const cert = forge.pki.certificateFromPem(fs.readFileSync(certPath, "utf8"));
27
+ const cn = cert.subject.getField("CN")?.value;
28
+ const org = cert.subject.getField("O")?.value;
29
+ return cn === ROOT_CA_CN && org === ROOT_CA_ORG;
30
+ } catch {
31
+ return false;
32
+ }
33
+ }
34
+
22
35
  /**
23
36
  * Generate Root CA certificate (only once, auto-regenerate if expired)
24
37
  * This Root CA will sign all dynamic leaf certificates
25
38
  */
26
39
  async function generateRootCA() {
27
40
  const exists = fs.existsSync(ROOT_CA_KEY_PATH) && fs.existsSync(ROOT_CA_CERT_PATH);
28
- if (exists && !isCertExpired(ROOT_CA_CERT_PATH)) {
41
+ if (exists && !isCertExpired(ROOT_CA_CERT_PATH) && isOpenRouterXRootCA(ROOT_CA_CERT_PATH)) {
29
42
  console.log("✅ Root CA already exists");
30
43
  return { key: ROOT_CA_KEY_PATH, cert: ROOT_CA_CERT_PATH };
31
44
  }
32
45
  if (exists) {
33
- console.log("🔐 Root CA expired or expiring soon — regenerating...");
46
+ console.log("🔐 Root CA expired, stale, or branded for legacy 9Router — regenerating...");
34
47
  try { fs.unlinkSync(ROOT_CA_KEY_PATH); } catch { /* ignore */ }
35
48
  try { fs.unlinkSync(ROOT_CA_CERT_PATH); } catch { /* ignore */ }
36
49
  }
@@ -53,8 +66,8 @@ async function generateRootCA() {
53
66
  cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 10);
54
67
 
55
68
  const attrs = [
56
- { name: "commonName", value: "9Router MITM Root CA" },
57
- { name: "organizationName", value: "9Router" },
69
+ { name: "commonName", value: ROOT_CA_CN },
70
+ { name: "organizationName", value: ROOT_CA_ORG },
58
71
  { name: "countryName", value: "US" }
59
72
  ];
60
73
 
@@ -169,5 +182,7 @@ module.exports = {
169
182
  generateLeafCert,
170
183
  isCertExpired,
171
184
  ROOT_CA_CERT_PATH,
172
- ROOT_CA_KEY_PATH
185
+ ROOT_CA_KEY_PATH,
186
+ ROOT_CA_CN,
187
+ ROOT_CA_ORG
173
188
  };
@@ -3,6 +3,7 @@
3
3
  const TARGET_HOSTS = [
4
4
  "daily-cloudcode-pa.googleapis.com",
5
5
  "cloudcode-pa.googleapis.com",
6
+ "daily-cloudcode-pa.sandbox.googleapis.com",
6
7
  "api.individual.githubcopilot.com",
7
8
  "q.us-east-1.amazonaws.com",
8
9
  "api2.cursor.sh",
@@ -15,12 +16,38 @@ const URL_PATTERNS = {
15
16
  copilot: ["/chat/completions", "/v1/messages", "/responses"],
16
17
  kiro: ["/generateAssistantResponse"],
17
18
  cursor: ["/BidiAppend", "/RunSSE", "/RunPoll", "/Run"],
18
- openrouter: ["/models", "/api/v1/models", "/chat/completions", "/v1/chat/completions", "/v1/messages", "/responses"],
19
+ openrouter: [
20
+ "/models",
21
+ "/api/v1/models",
22
+ "/api/v1/key",
23
+ "/api/v1/auth/key",
24
+ "/chat/completions",
25
+ "/v1/chat/completions",
26
+ "/api/v1/chat/completions",
27
+ "/v1/messages",
28
+ "/responses",
29
+ "/api/v1/responses",
30
+ ],
19
31
  };
20
32
 
21
33
  // Synonym map: rawModel from request → canonical alias key in mitmAlias DB
22
34
  const MODEL_SYNONYMS = {
23
- antigravity: { "gemini-default": "gemini-3-flash" },
35
+ antigravity: {
36
+ "gemini-default": "gemini-3-flash",
37
+ "gemini-3-flash-agent": "gemini-3-flash",
38
+ "gemini-3.1-flash-lite": "gemini-3-flash",
39
+ "gemini-2.5-flash-lite": "gemini-3-flash",
40
+ "gemini-2.5-flash": "gemini-3-flash",
41
+ __defaults: {
42
+ "gemini-3.1-pro-high": "gemini-3.1-pro-high",
43
+ "gemini-3.1-pro-low": "gemini-3.1-pro-low",
44
+ "gemini-3-flash-agent": "cx/gpt-5.5",
45
+ "gemini-3-flash": "cx/gpt-5.5",
46
+ "claude-sonnet-4-6": "claude-sonnet-4-6",
47
+ "claude-opus-4-6-thinking": "claude-opus-4-6-thinking",
48
+ "gpt-oss-120b-medium": "gpt-oss-120b-medium",
49
+ },
50
+ },
24
51
  };
25
52
 
26
53
  // URL substrings whose request/response should NOT be dumped to file (telemetry, polling, empty)
@@ -35,7 +62,7 @@ const LOG_BLACKLIST_URL_PARTS = [
35
62
  function getToolForHost(host) {
36
63
  const h = (host || "").split(":")[0];
37
64
  if (h === "api.individual.githubcopilot.com") return "copilot";
38
- if (h === "daily-cloudcode-pa.googleapis.com" || h === "cloudcode-pa.googleapis.com") return "antigravity";
65
+ if (h === "daily-cloudcode-pa.googleapis.com" || h === "cloudcode-pa.googleapis.com" || h === "daily-cloudcode-pa.sandbox.googleapis.com") return "antigravity";
39
66
  if (h === "q.us-east-1.amazonaws.com") return "kiro";
40
67
  if (h === "api2.cursor.sh") return "cursor";
41
68
  if (h === "openrouter.ai" || h === "api.openrouter.ai") return "openrouter";
@@ -12,8 +12,8 @@ const { runElevatedPowerShell, isAdmin } = require("../winElevated.js");
12
12
  * If anything fails mid-way, restore from `.bak`. Same-volume renames are atomic on NTFS.
13
13
  */
14
14
  function atomicWriteHostsWin(target, originalContent, newContent) {
15
- const tmpNew = `${target}.9router.new`;
16
- const tmpBak = `${target}.9router.bak`;
15
+ const tmpNew = `${target}.openrouterx.new`;
16
+ const tmpBak = `${target}.openrouterx.bak`;
17
17
  try {
18
18
  fs.writeFileSync(tmpNew, newContent, "utf8");
19
19
  try { fs.unlinkSync(tmpBak); } catch { /* none */ }
@@ -36,6 +36,18 @@ const IS_MAC = process.platform === "darwin";
36
36
  const HOSTS_FILE = IS_WIN
37
37
  ? path.join(process.env.SystemRoot || "C:\\Windows", "System32", "drivers", "etc", "hosts")
38
38
  : "/etc/hosts";
39
+ const MAC_PF_ANTIGRAVITY_ANCHOR = "com.apple/openrouterx-mitm-antigravity";
40
+ const MAC_ANTIGRAVITY_FALLBACK_IPS = [
41
+ "216.239.32.223",
42
+ "216.239.34.223",
43
+ "216.239.36.223",
44
+ "216.239.38.223",
45
+ ];
46
+ const MAC_ANTIGRAVITY_LEGACY_SHARED_IP_PREFIXES = [
47
+ "142.250.",
48
+ "142.251.",
49
+ "172.217.",
50
+ ];
39
51
 
40
52
  /** True when `sudo` exists (e.g. missing on minimal Docker images like Alpine). */
41
53
  function isSudoAvailable() {
@@ -110,6 +122,97 @@ async function flushDNS(sudoPassword) {
110
122
  }
111
123
  }
112
124
 
125
+ function shellQuoteSingle(str) {
126
+ return `'${String(str).replace(/'/g, "'\\''")}'`;
127
+ }
128
+
129
+ function getDefaultMacInterface() {
130
+ if (!IS_MAC) return "";
131
+ try {
132
+ const out = execSync("route -n get default 2>/dev/null | awk '/interface:/{print $2; exit}'", {
133
+ encoding: "utf8",
134
+ windowsHide: true,
135
+ }).trim();
136
+ return out || "en0";
137
+ } catch {
138
+ return "en0";
139
+ }
140
+ }
141
+
142
+ async function getMacAntigravityRedirectIPs() {
143
+ return [...MAC_ANTIGRAVITY_FALLBACK_IPS];
144
+ }
145
+
146
+ function getMacLoopbackIPv4Aliases() {
147
+ if (!IS_MAC) return [];
148
+ try {
149
+ const out = execSync("ifconfig lo0", { encoding: "utf8", windowsHide: true });
150
+ return [...out.matchAll(/^\s+inet\s+(\d+\.\d+\.\d+\.\d+)\s+/gm)].map((m) => m[1]);
151
+ } catch {
152
+ return [];
153
+ }
154
+ }
155
+
156
+ function getMacLegacyAntigravityAliases() {
157
+ return getMacLoopbackIPv4Aliases().filter((ip) =>
158
+ MAC_ANTIGRAVITY_LEGACY_SHARED_IP_PREFIXES.some((prefix) => ip.startsWith(prefix))
159
+ );
160
+ }
161
+
162
+ async function enableMacAntigravityRedirect(sudoPassword) {
163
+ if (!IS_MAC) return;
164
+ const ips = await getMacAntigravityRedirectIPs();
165
+ if (ips.length === 0) return;
166
+
167
+ await enableMacAntigravityLoopbackAliases(sudoPassword, ips);
168
+
169
+ const iface = getDefaultMacInterface();
170
+ const rules = [
171
+ `table <openrouterx_antigravity> persist { ${ips.join(", ")} }`,
172
+ `rdr pass on ${iface} inet proto tcp from any to <openrouterx_antigravity> port 443 -> 127.0.0.1 port 443`,
173
+ "",
174
+ ].join("\n");
175
+ const command = [
176
+ "pfctl -E >/dev/null 2>&1 || true",
177
+ `printf '%s' ${shellQuoteSingle(rules)} | pfctl -a ${shellQuoteSingle(MAC_PF_ANTIGRAVITY_ANCHOR)} -f -`,
178
+ ].join(" && ");
179
+
180
+ await execWithPassword(command, sudoPassword);
181
+ log(`🌐 PF antigravity: ✅ redirect active on ${iface} (${ips.length} IPs)`);
182
+ }
183
+
184
+ async function disableMacAntigravityRedirect(sudoPassword) {
185
+ if (!IS_MAC) return;
186
+ const ips = [...new Set([
187
+ ...await getMacAntigravityRedirectIPs(),
188
+ ...getMacLegacyAntigravityAliases(),
189
+ ])];
190
+ await execWithPassword(`pfctl -a ${shellQuoteSingle(MAC_PF_ANTIGRAVITY_ANCHOR)} -F all >/dev/null 2>&1 || true`, sudoPassword);
191
+ await disableMacAntigravityLoopbackAliases(sudoPassword, ips);
192
+ log("🌐 PF antigravity: ✅ redirect removed");
193
+ }
194
+
195
+ async function enableMacAntigravityLoopbackAliases(sudoPassword, ips) {
196
+ if (!IS_MAC || !ips.length) return;
197
+ const commands = ips.map((ip) => `ifconfig lo0 alias ${ip}/32 2>/dev/null || true`);
198
+ await execWithPassword(commands.join("; "), sudoPassword);
199
+ log(`🌐 lo0 antigravity: ✅ aliases active (${ips.length} IPs)`);
200
+ }
201
+
202
+ async function disableMacAntigravityLoopbackAliases(sudoPassword, ips) {
203
+ if (!IS_MAC || !ips.length) return;
204
+ const commands = ips.map((ip) => `ifconfig lo0 -alias ${ip} 2>/dev/null || true`);
205
+ await execWithPassword(commands.join("; "), sudoPassword);
206
+ }
207
+
208
+ async function ensureToolNetworkRedirect(tool, sudoPassword) {
209
+ if (tool === "antigravity") await enableMacAntigravityRedirect(sudoPassword);
210
+ }
211
+
212
+ async function removeToolNetworkRedirect(tool, sudoPassword) {
213
+ if (tool === "antigravity") await disableMacAntigravityRedirect(sudoPassword);
214
+ }
215
+
113
216
  /**
114
217
  * Check if DNS entry exists for a specific host
115
218
  */
@@ -150,6 +253,7 @@ async function addDNSEntry(tool, sudoPassword) {
150
253
  const entriesToAdd = hosts.filter(h => !checkDNSEntry(h));
151
254
  if (entriesToAdd.length === 0) {
152
255
  log(`🌐 DNS ${tool}: already active`);
256
+ await ensureToolNetworkRedirect(tool, sudoPassword);
153
257
  return;
154
258
  }
155
259
 
@@ -172,6 +276,7 @@ async function addDNSEntry(tool, sudoPassword) {
172
276
  await execWithPassword(`printf '%s' '${escaped}' | tee ${HOSTS_FILE} > /dev/null`, sudoPassword);
173
277
  await flushDNS(sudoPassword);
174
278
  }
279
+ await ensureToolNetworkRedirect(tool, sudoPassword);
175
280
  log(`🌐 DNS ${tool}: ✅ added ${entriesToAdd.join(", ")}`);
176
281
  } catch (error) {
177
282
  const msg = error.message?.includes("incorrect password") ? "Wrong sudo password" : `Failed to add DNS entry: ${error.message}`;
@@ -189,6 +294,7 @@ async function removeDNSEntry(tool, sudoPassword) {
189
294
  const entriesToRemove = hosts.filter(h => checkDNSEntry(h));
190
295
  if (entriesToRemove.length === 0) {
191
296
  log(`🌐 DNS ${tool}: already inactive`);
297
+ await removeToolNetworkRedirect(tool, sudoPassword);
192
298
  return;
193
299
  }
194
300
 
@@ -207,6 +313,7 @@ async function removeDNSEntry(tool, sudoPassword) {
207
313
  await execWithPassword(`printf '%s' '${escaped}' | tee ${HOSTS_FILE} > /dev/null`, sudoPassword);
208
314
  await flushDNS(sudoPassword);
209
315
  }
316
+ await removeToolNetworkRedirect(tool, sudoPassword);
210
317
  log(`🌐 DNS ${tool}: ✅ removed ${entriesToRemove.join(", ")}`);
211
318
  } catch (error) {
212
319
  const msg = error.message?.includes("incorrect password") ? "Wrong sudo password" : `Failed to remove DNS entry: ${error.message}`;
@@ -233,6 +340,12 @@ async function removeAllDNSEntries(sudoPassword) {
233
340
  */
234
341
  function removeAllDNSEntriesSync() {
235
342
  try {
343
+ if (IS_MAC) {
344
+ try { execSync(`pfctl -a ${MAC_PF_ANTIGRAVITY_ANCHOR} -F all >/dev/null 2>&1 || true`, { stdio: "ignore" }); } catch { /* ignore */ }
345
+ for (const ip of MAC_ANTIGRAVITY_FALLBACK_IPS) {
346
+ try { execSync(`ifconfig lo0 -alias ${ip} 2>/dev/null || true`, { stdio: "ignore" }); } catch { /* ignore */ }
347
+ }
348
+ }
236
349
  if (!fs.existsSync(HOSTS_FILE)) return;
237
350
  const allHosts = Object.values(TOOL_HOSTS).flat();
238
351
  const content = fs.readFileSync(HOSTS_FILE, "utf8");
@@ -1,12 +1,18 @@
1
- const { err, createResponseDumper } = require("../logger");
1
+ const { log, err, createResponseDumper } = require("../logger");
2
2
  const { fetchRouter, pipeSSE } = require("./base");
3
3
 
4
+ const NO_CREDENTIALS_MARKER = "No active credentials for provider";
5
+
4
6
  /**
5
7
  * Intercept Antigravity request — forward Gemini body as-is to /v1/chat/completions.
6
8
  * Router auto-detects format via body.userAgent==="antigravity" + body.request.contents,
7
9
  * runs antigravity→openai→provider→openai→antigravity translators internally.
10
+ *
11
+ * Graceful fallback: if Router returns 404 because no provider credentials are
12
+ * configured, passthrough to the real upstream so Antigravity works out-of-the-box
13
+ * without requiring a login in the Router dashboard.
8
14
  */
9
- async function intercept(req, res, bodyBuffer, mappedModel) {
15
+ async function intercept(req, res, bodyBuffer, mappedModel, passthrough) {
10
16
  const dumper = createResponseDumper(req, "intercept-antigravity");
11
17
  const isStream = req.url.includes(":streamGenerateContent");
12
18
  try {
@@ -14,6 +20,27 @@ async function intercept(req, res, bodyBuffer, mappedModel) {
14
20
  if (body.model) body.model = mappedModel;
15
21
 
16
22
  const routerRes = await fetchRouter(body, "/v1/chat/completions", req.headers);
23
+
24
+ // Graceful fallback: no credentials in Router → passthrough to real upstream
25
+ if (routerRes.status === 404) {
26
+ const text = await routerRes.text();
27
+ if (text.includes(NO_CREDENTIALS_MARKER)) {
28
+ log(`⏩ passthrough | antigravity | no credentials for mapped model "${mappedModel || "unknown"}" — forwarding to real upstream`);
29
+ if (dumper) {
30
+ dumper.writeHeader(routerRes.status, Object.fromEntries(routerRes.headers));
31
+ dumper.writeChunk(text);
32
+ dumper.end();
33
+ }
34
+ return passthrough(req, res, bodyBuffer);
35
+ }
36
+ // Other 404 errors: propagate as-is
37
+ if (!res.headersSent) {
38
+ res.writeHead(404, { "Content-Type": "application/json" });
39
+ res.end(text);
40
+ }
41
+ return;
42
+ }
43
+
17
44
  await pipeSSE(routerRes, res, dumper);
18
45
  } catch (error) {
19
46
  err(`[antigravity] ${error.message}`);