n9router 0.3.94 → 0.3.95

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 (331) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/build-manifest.json +3 -3
  3. package/.next/standalone/.next/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
  4. package/.next/standalone/.next/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  5. package/.next/standalone/.next/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  6. package/.next/standalone/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  7. package/.next/standalone/.next/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
  8. package/.next/standalone/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
  10. package/.next/standalone/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  12. package/.next/standalone/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
  14. package/.next/standalone/.next/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  16. package/.next/standalone/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  17. package/.next/standalone/.next/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
  18. package/.next/standalone/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  23. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  27. package/.next/standalone/.next/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  29. package/.next/standalone/.next/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  31. package/.next/standalone/.next/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  33. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  34. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  35. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  36. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  37. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  38. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  39. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  40. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  43. package/.next/standalone/.next/server/app/_not-found.rsc +10 -10
  44. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +10 -10
  45. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  46. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +5 -5
  47. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  48. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  49. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  50. package/.next/standalone/.next/server/app/api/antigravity-tools/import/route.js.nft.json +1 -1
  51. package/.next/standalone/.next/server/app/api/antigravity-tools/import-refresh-tokens/route.js.nft.json +1 -1
  52. package/.next/standalone/.next/server/app/api/auth/login/route.js.nft.json +1 -1
  53. package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  54. package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
  55. package/.next/standalone/.next/server/app/api/cloud/auth/route.js.nft.json +1 -1
  56. package/.next/standalone/.next/server/app/api/cloud/credentials/update/route.js.nft.json +1 -1
  57. package/.next/standalone/.next/server/app/api/cloud/model/resolve/route.js.nft.json +1 -1
  58. package/.next/standalone/.next/server/app/api/cloud/models/alias/route.js.nft.json +1 -1
  59. package/.next/standalone/.next/server/app/api/combos/[id]/route.js.nft.json +1 -1
  60. package/.next/standalone/.next/server/app/api/combos/route.js.nft.json +1 -1
  61. package/.next/standalone/.next/server/app/api/init/route.js.nft.json +1 -1
  62. package/.next/standalone/.next/server/app/api/internal/request-detail/route.js.nft.json +1 -1
  63. package/.next/standalone/.next/server/app/api/internal/usage/route.js.nft.json +1 -1
  64. package/.next/standalone/.next/server/app/api/keys/[id]/route.js.nft.json +1 -1
  65. package/.next/standalone/.next/server/app/api/keys/route.js.nft.json +1 -1
  66. package/.next/standalone/.next/server/app/api/models/alias/route.js.nft.json +1 -1
  67. package/.next/standalone/.next/server/app/api/models/availability/route.js.nft.json +1 -1
  68. package/.next/standalone/.next/server/app/api/models/route.js.nft.json +1 -1
  69. package/.next/standalone/.next/server/app/api/models/test/route.js.nft.json +1 -1
  70. package/.next/standalone/.next/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  71. package/.next/standalone/.next/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
  72. package/.next/standalone/.next/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
  73. package/.next/standalone/.next/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
  74. package/.next/standalone/.next/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
  75. package/.next/standalone/.next/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
  76. package/.next/standalone/.next/server/app/api/pricing/route.js.nft.json +1 -1
  77. package/.next/standalone/.next/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
  78. package/.next/standalone/.next/server/app/api/provider-nodes/route.js.nft.json +1 -1
  79. package/.next/standalone/.next/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  80. package/.next/standalone/.next/server/app/api/providers/[id]/route.js.nft.json +1 -1
  81. package/.next/standalone/.next/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  82. package/.next/standalone/.next/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
  83. package/.next/standalone/.next/server/app/api/providers/client/route.js.nft.json +1 -1
  84. package/.next/standalone/.next/server/app/api/providers/route.js.nft.json +1 -1
  85. package/.next/standalone/.next/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  86. package/.next/standalone/.next/server/app/api/providers/validate/route.js.nft.json +1 -1
  87. package/.next/standalone/.next/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
  88. package/.next/standalone/.next/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
  89. package/.next/standalone/.next/server/app/api/proxy-pools/route.js.nft.json +1 -1
  90. package/.next/standalone/.next/server/app/api/settings/database/route.js.nft.json +1 -1
  91. package/.next/standalone/.next/server/app/api/settings/require-login/route.js.nft.json +1 -1
  92. package/.next/standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  93. package/.next/standalone/.next/server/app/api/translator/send/route.js.nft.json +1 -1
  94. package/.next/standalone/.next/server/app/api/translator/translate/route.js.nft.json +1 -1
  95. package/.next/standalone/.next/server/app/api/tunnel/disable/route.js.nft.json +1 -1
  96. package/.next/standalone/.next/server/app/api/tunnel/enable/route.js.nft.json +1 -1
  97. package/.next/standalone/.next/server/app/api/tunnel/status/route.js.nft.json +1 -1
  98. package/.next/standalone/.next/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  99. package/.next/standalone/.next/server/app/api/usage/chart/route.js.nft.json +1 -1
  100. package/.next/standalone/.next/server/app/api/usage/history/route.js.nft.json +1 -1
  101. package/.next/standalone/.next/server/app/api/usage/logs/route.js.nft.json +1 -1
  102. package/.next/standalone/.next/server/app/api/usage/providers/route.js.nft.json +1 -1
  103. package/.next/standalone/.next/server/app/api/usage/request-details/route.js.nft.json +1 -1
  104. package/.next/standalone/.next/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  105. package/.next/standalone/.next/server/app/api/usage/stats/route.js.nft.json +1 -1
  106. package/.next/standalone/.next/server/app/api/usage/stream/route.js.nft.json +1 -1
  107. package/.next/standalone/.next/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  108. package/.next/standalone/.next/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  109. package/.next/standalone/.next/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  110. package/.next/standalone/.next/server/app/api/v1/messages/route.js.nft.json +1 -1
  111. package/.next/standalone/.next/server/app/api/v1/models/route.js.nft.json +1 -1
  112. package/.next/standalone/.next/server/app/api/v1/responses/route.js.nft.json +1 -1
  113. package/.next/standalone/.next/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  114. package/.next/standalone/.next/server/app/callback/page.js.nft.json +1 -1
  115. package/.next/standalone/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  116. package/.next/standalone/.next/server/app/callback.html +1 -1
  117. package/.next/standalone/.next/server/app/callback.rsc +12 -12
  118. package/.next/standalone/.next/server/app/callback.segments/_full.segment.rsc +12 -12
  119. package/.next/standalone/.next/server/app/callback.segments/_head.segment.rsc +4 -4
  120. package/.next/standalone/.next/server/app/callback.segments/_index.segment.rsc +5 -5
  121. package/.next/standalone/.next/server/app/callback.segments/_tree.segment.rsc +1 -1
  122. package/.next/standalone/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +4 -4
  123. package/.next/standalone/.next/server/app/callback.segments/callback.segment.rsc +3 -3
  124. package/.next/standalone/.next/server/app/dashboard/basic-chat.html +1 -1
  125. package/.next/standalone/.next/server/app/dashboard/basic-chat.rsc +12 -12
  126. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +3 -3
  127. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +3 -3
  128. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
  129. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
  130. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_full.segment.rsc +12 -12
  131. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_head.segment.rsc +4 -4
  132. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_index.segment.rsc +5 -5
  133. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  134. package/.next/standalone/.next/server/app/dashboard/cli-tools.html +1 -1
  135. package/.next/standalone/.next/server/app/dashboard/cli-tools.rsc +12 -12
  136. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +3 -3
  137. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +3 -3
  138. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
  139. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
  140. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +12 -12
  141. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +4 -4
  142. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +5 -5
  143. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  144. package/.next/standalone/.next/server/app/dashboard/combos.html +1 -1
  145. package/.next/standalone/.next/server/app/dashboard/combos.rsc +13 -13
  146. package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +4 -4
  147. package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +3 -3
  148. package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
  149. package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
  150. package/.next/standalone/.next/server/app/dashboard/combos.segments/_full.segment.rsc +13 -13
  151. package/.next/standalone/.next/server/app/dashboard/combos.segments/_head.segment.rsc +4 -4
  152. package/.next/standalone/.next/server/app/dashboard/combos.segments/_index.segment.rsc +5 -5
  153. package/.next/standalone/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  154. package/.next/standalone/.next/server/app/dashboard/endpoint.html +1 -1
  155. package/.next/standalone/.next/server/app/dashboard/endpoint.rsc +12 -12
  156. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +3 -3
  157. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +3 -3
  158. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
  159. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
  160. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +12 -12
  161. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +4 -4
  162. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +5 -5
  163. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  164. package/.next/standalone/.next/server/app/dashboard/mitm.html +1 -1
  165. package/.next/standalone/.next/server/app/dashboard/mitm.rsc +12 -12
  166. package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +3 -3
  167. package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +3 -3
  168. package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
  169. package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
  170. package/.next/standalone/.next/server/app/dashboard/mitm.segments/_full.segment.rsc +12 -12
  171. package/.next/standalone/.next/server/app/dashboard/mitm.segments/_head.segment.rsc +4 -4
  172. package/.next/standalone/.next/server/app/dashboard/mitm.segments/_index.segment.rsc +5 -5
  173. package/.next/standalone/.next/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
  174. package/.next/standalone/.next/server/app/dashboard/profile.html +1 -1
  175. package/.next/standalone/.next/server/app/dashboard/profile.rsc +13 -13
  176. package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +4 -4
  177. package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +3 -3
  178. package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
  179. package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
  180. package/.next/standalone/.next/server/app/dashboard/profile.segments/_full.segment.rsc +13 -13
  181. package/.next/standalone/.next/server/app/dashboard/profile.segments/_head.segment.rsc +4 -4
  182. package/.next/standalone/.next/server/app/dashboard/profile.segments/_index.segment.rsc +5 -5
  183. package/.next/standalone/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  184. package/.next/standalone/.next/server/app/dashboard/providers/new.html +1 -1
  185. package/.next/standalone/.next/server/app/dashboard/providers/new.rsc +13 -13
  186. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +4 -4
  187. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +3 -3
  188. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +3 -3
  189. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
  190. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
  191. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +13 -13
  192. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +4 -4
  193. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +5 -5
  194. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  195. package/.next/standalone/.next/server/app/dashboard/providers.html +1 -1
  196. package/.next/standalone/.next/server/app/dashboard/providers.rsc +13 -13
  197. package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +4 -4
  198. package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +3 -3
  199. package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
  200. package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
  201. package/.next/standalone/.next/server/app/dashboard/providers.segments/_full.segment.rsc +13 -13
  202. package/.next/standalone/.next/server/app/dashboard/providers.segments/_head.segment.rsc +4 -4
  203. package/.next/standalone/.next/server/app/dashboard/providers.segments/_index.segment.rsc +5 -5
  204. package/.next/standalone/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  205. package/.next/standalone/.next/server/app/dashboard/proxy-pools.html +1 -1
  206. package/.next/standalone/.next/server/app/dashboard/proxy-pools.rsc +13 -13
  207. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +4 -4
  208. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +3 -3
  209. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
  210. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
  211. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +13 -13
  212. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +4 -4
  213. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +5 -5
  214. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  215. package/.next/standalone/.next/server/app/dashboard/quota.html +2 -2
  216. package/.next/standalone/.next/server/app/dashboard/quota.rsc +13 -13
  217. package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +4 -4
  218. package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +3 -3
  219. package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
  220. package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
  221. package/.next/standalone/.next/server/app/dashboard/quota.segments/_full.segment.rsc +13 -13
  222. package/.next/standalone/.next/server/app/dashboard/quota.segments/_head.segment.rsc +4 -4
  223. package/.next/standalone/.next/server/app/dashboard/quota.segments/_index.segment.rsc +5 -5
  224. package/.next/standalone/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  225. package/.next/standalone/.next/server/app/dashboard/settings/pricing/page.js.nft.json +1 -1
  226. package/.next/standalone/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  227. package/.next/standalone/.next/server/app/dashboard/settings/pricing.html +1 -1
  228. package/.next/standalone/.next/server/app/dashboard/settings/pricing.rsc +12 -12
  229. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +12 -12
  230. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +4 -4
  231. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +5 -5
  232. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  233. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +4 -4
  234. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +3 -3
  235. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +3 -3
  236. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +3 -3
  237. package/.next/standalone/.next/server/app/dashboard/translator.html +1 -1
  238. package/.next/standalone/.next/server/app/dashboard/translator.rsc +13 -13
  239. package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +4 -4
  240. package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +3 -3
  241. package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
  242. package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
  243. package/.next/standalone/.next/server/app/dashboard/translator.segments/_full.segment.rsc +13 -13
  244. package/.next/standalone/.next/server/app/dashboard/translator.segments/_head.segment.rsc +4 -4
  245. package/.next/standalone/.next/server/app/dashboard/translator.segments/_index.segment.rsc +5 -5
  246. package/.next/standalone/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  247. package/.next/standalone/.next/server/app/dashboard/usage.html +1 -1
  248. package/.next/standalone/.next/server/app/dashboard/usage.rsc +13 -13
  249. package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +4 -4
  250. package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +3 -3
  251. package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
  252. package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
  253. package/.next/standalone/.next/server/app/dashboard/usage.segments/_full.segment.rsc +13 -13
  254. package/.next/standalone/.next/server/app/dashboard/usage.segments/_head.segment.rsc +4 -4
  255. package/.next/standalone/.next/server/app/dashboard/usage.segments/_index.segment.rsc +5 -5
  256. package/.next/standalone/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  257. package/.next/standalone/.next/server/app/dashboard.html +1 -1
  258. package/.next/standalone/.next/server/app/dashboard.rsc +12 -12
  259. package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +3 -3
  260. package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
  261. package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
  262. package/.next/standalone/.next/server/app/dashboard.segments/_full.segment.rsc +12 -12
  263. package/.next/standalone/.next/server/app/dashboard.segments/_head.segment.rsc +4 -4
  264. package/.next/standalone/.next/server/app/dashboard.segments/_index.segment.rsc +5 -5
  265. package/.next/standalone/.next/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  266. package/.next/standalone/.next/server/app/index.html +1 -1
  267. package/.next/standalone/.next/server/app/index.rsc +10 -10
  268. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  269. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +10 -10
  270. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
  271. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +5 -5
  272. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  273. package/.next/standalone/.next/server/app/landing/page.js.nft.json +1 -1
  274. package/.next/standalone/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  275. package/.next/standalone/.next/server/app/landing.html +1 -1
  276. package/.next/standalone/.next/server/app/landing.rsc +12 -12
  277. package/.next/standalone/.next/server/app/landing.segments/_full.segment.rsc +12 -12
  278. package/.next/standalone/.next/server/app/landing.segments/_head.segment.rsc +4 -4
  279. package/.next/standalone/.next/server/app/landing.segments/_index.segment.rsc +5 -5
  280. package/.next/standalone/.next/server/app/landing.segments/_tree.segment.rsc +1 -1
  281. package/.next/standalone/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +4 -4
  282. package/.next/standalone/.next/server/app/landing.segments/landing.segment.rsc +3 -3
  283. package/.next/standalone/.next/server/app/login/page.js.nft.json +1 -1
  284. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  285. package/.next/standalone/.next/server/app/login.html +1 -1
  286. package/.next/standalone/.next/server/app/login.rsc +12 -12
  287. package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +12 -12
  288. package/.next/standalone/.next/server/app/login.segments/_head.segment.rsc +4 -4
  289. package/.next/standalone/.next/server/app/login.segments/_index.segment.rsc +5 -5
  290. package/.next/standalone/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  291. package/.next/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
  292. package/.next/standalone/.next/server/app/login.segments/login.segment.rsc +3 -3
  293. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  294. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  295. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.yvcis._.js +1 -1
  296. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0148t9m._.js +1 -1
  297. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0b802lh._.js +1 -1
  298. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0kpc-o6._.js +1 -1
  299. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0lc~.sk._.js +1 -1
  300. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0lp_pm5._.js +1 -1
  301. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pwrfp1._.js +1 -1
  302. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0uw3x8s._.js +1 -1
  303. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0y.reft._.js +1 -1
  304. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0y5ae.7._.js +1 -1
  305. package/.next/standalone/.next/server/chunks/_0__-aqg._.js +1 -1
  306. package/.next/standalone/.next/server/chunks/_0_ovl1h._.js +1 -1
  307. package/.next/standalone/.next/server/chunks/ssr/src_0_xhepz._.js +1 -1
  308. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  309. package/.next/standalone/.next/server/pages/404.html +1 -1
  310. package/.next/standalone/.next/server/pages/500.html +1 -1
  311. package/.next/{static/chunks/02suuzz60dp3d.js → standalone/.next/static/chunks/11q6656-lc_oz.js} +1 -1
  312. package/.next/standalone/mitm/server.js +3 -2
  313. package/.next/standalone/mitm/tokenPool.js +108 -8
  314. package/.next/standalone/package-lock.json +2 -2
  315. package/.next/standalone/package.json +1 -1
  316. package/.next/standalone/plans/tauri-app/01-scope-and-architecture.md +218 -0
  317. package/.next/standalone/plans/tauri-app/02-backend-plan.md +237 -0
  318. package/.next/standalone/plans/tauri-app/03-tauri-native-plan.md +194 -0
  319. package/.next/standalone/plans/tauri-app/04-react-ui-plan.md +155 -0
  320. package/.next/standalone/plans/tauri-app/05-delivery-phases.md +171 -0
  321. package/.next/standalone/plans/tauri-app/README.md +87 -0
  322. package/.next/standalone/src/mitm/server.js +3 -2
  323. package/.next/standalone/src/mitm/tokenPool.js +108 -8
  324. package/.next/{standalone/.next/static/chunks/02suuzz60dp3d.js → static/chunks/11q6656-lc_oz.js} +1 -1
  325. package/package.json +1 -1
  326. /package/.next/standalone/.next/static/{SBId4_Ewcg0cJ2p2zlKeg → 03mW5vaG0Fogum-tDkkOQ}/_buildManifest.js +0 -0
  327. /package/.next/standalone/.next/static/{SBId4_Ewcg0cJ2p2zlKeg → 03mW5vaG0Fogum-tDkkOQ}/_clientMiddlewareManifest.js +0 -0
  328. /package/.next/standalone/.next/static/{SBId4_Ewcg0cJ2p2zlKeg → 03mW5vaG0Fogum-tDkkOQ}/_ssgManifest.js +0 -0
  329. /package/.next/static/{SBId4_Ewcg0cJ2p2zlKeg → 03mW5vaG0Fogum-tDkkOQ}/_buildManifest.js +0 -0
  330. /package/.next/static/{SBId4_Ewcg0cJ2p2zlKeg → 03mW5vaG0Fogum-tDkkOQ}/_clientMiddlewareManifest.js +0 -0
  331. /package/.next/static/{SBId4_Ewcg0cJ2p2zlKeg → 03mW5vaG0Fogum-tDkkOQ}/_ssgManifest.js +0 -0
@@ -0,0 +1,237 @@
1
+ # Backend Plan
2
+
3
+ ## Goal
4
+
5
+ Create a standalone local backend service that replaces only the needed Next.js APIs for the desktop app.
6
+
7
+ The backend must remain OS-agnostic so the same service can run unchanged on macOS, Windows, and Linux.
8
+
9
+ ## Backend responsibilities
10
+
11
+ - manage Antigravity accounts and settings
12
+ - expose APIs for desktop UI
13
+ - host OAuth helper flow
14
+ - run and control MITM server
15
+ - maintain token swap state
16
+ - persist usage and request detail records
17
+ - avoid embedding OS-specific privilege logic that should live in Tauri
18
+
19
+ ## Source modules to extract
20
+
21
+ ### Keep mostly as-is
22
+
23
+ - `src/mitm/server.js`
24
+ - `src/mitm/tokenPool.js`
25
+ - `src/mitm/usageTracker.js`
26
+ - `src/mitm/config.js`
27
+ - `src/mitm/handlers/antigravity.js`
28
+ - `src/mitm/logger.js`
29
+ - `src/mitm/paths.js`
30
+ - `src/lib/localDb.js`
31
+ - `src/lib/usageDb.js`
32
+ - `src/lib/oauth/services/antigravity.js`
33
+ - `open-sse/services/projectId.js`
34
+
35
+ ### Replace Next-specific wrappers
36
+
37
+ - `src/app/api/cli-tools/antigravity-mitm/route.js`
38
+ - `src/app/api/antigravity-tools/import/route.js`
39
+ - `src/app/api/usage/stats/route.js`
40
+ - `src/app/api/usage/history/route.js`
41
+ - `src/app/api/usage/request-details/route.js`
42
+ - `src/app/api/internal/usage/route.js`
43
+ - `src/app/api/internal/request-detail/route.js`
44
+
45
+ ## Backend package structure
46
+
47
+ ```text
48
+ apps/desktop-backend/
49
+ src/
50
+ server/
51
+ app.ts
52
+ routes/
53
+ services/
54
+ accounts/
55
+ mitm/
56
+ tokenSwap/
57
+ usage/
58
+ storage/
59
+ shared/
60
+ ```
61
+
62
+ ## Required REST API
63
+
64
+ ### Accounts
65
+
66
+ - `GET /api/accounts/antigravity`
67
+ - `POST /api/accounts/antigravity/oauth/start`
68
+ - `POST /api/accounts/antigravity/oauth/complete`
69
+ - `POST /api/accounts/antigravity/import`
70
+ - `PATCH /api/accounts/antigravity/:id`
71
+ - `DELETE /api/accounts/antigravity/:id`
72
+
73
+ ### MITM and DNS
74
+
75
+ - `GET /api/mitm/status`
76
+ - `POST /api/mitm/start`
77
+ - `POST /api/mitm/stop`
78
+ - `POST /api/mitm/dns/enable`
79
+ - `POST /api/mitm/dns/disable`
80
+ - `POST /api/mitm/cert/trust`
81
+ - `POST /api/mitm/cert/untrust`
82
+
83
+ Note:
84
+
85
+ - backend routes may delegate privileged actions to Tauri-native commands
86
+ - the UI-facing contract should stay identical on all OSes
87
+
88
+ ### Token swap
89
+
90
+ - `GET /api/token-swap/status`
91
+ - `PATCH /api/token-swap/settings`
92
+ - `GET /api/token-swap/pool`
93
+
94
+ ### Usage
95
+
96
+ - `GET /api/usage/stats`
97
+ - `GET /api/usage/history`
98
+ - `GET /api/usage/request-details`
99
+ - `GET /api/usage/logs`
100
+ - `POST /api/internal/usage`
101
+ - `POST /api/internal/request-detail`
102
+
103
+ ## Implementation steps
104
+
105
+ ### 1. Extract persistence layer
106
+
107
+ Tasks:
108
+
109
+ - move `localDb` and `usageDb` into backend package
110
+ - remove `@/` alias imports
111
+ - create shared app data path resolver
112
+ - preserve current data shapes for compatibility
113
+
114
+ Definition of done:
115
+
116
+ - backend can read existing `db.json`
117
+ - backend can read/write `usage.json` and `log.txt`
118
+
119
+ ### 2. Extract Antigravity account service
120
+
121
+ Tasks:
122
+
123
+ - move OAuth service logic
124
+ - adapt callback flow to backend route or local callback listener
125
+ - implement account import from `~/.antigravity_tools`
126
+ - preserve project ID handling
127
+
128
+ Definition of done:
129
+
130
+ - user can add account via browser OAuth
131
+ - user can import existing local Antigravity accounts
132
+
133
+ ### 3. Extract MITM server service
134
+
135
+ Tasks:
136
+
137
+ - encapsulate MITM start/stop/health operations
138
+ - convert current manager API into backend services
139
+ - separate privileged operations behind Tauri bridge
140
+ - preserve current host matching and request interception logic
141
+ - remove direct dependency on platform shell commands where possible
142
+
143
+ Definition of done:
144
+
145
+ - backend can start/stop MITM
146
+ - backend can report running state, cert status, DNS status
147
+
148
+ ### 4. Extract token swap logic
149
+
150
+ Tasks:
151
+
152
+ - preserve round-robin and sticky strategy behavior
153
+ - preserve cooldown maps:
154
+ - quota cooldown
155
+ - auth cooldown
156
+ - model cooldown
157
+ - expose pool state for UI
158
+
159
+ Definition of done:
160
+
161
+ - MITM can route through pooled Antigravity accounts
162
+ - pool state is queryable from the UI
163
+
164
+ ### 5. Extract usage APIs
165
+
166
+ Tasks:
167
+
168
+ - port stats endpoint
169
+ - port request details endpoint
170
+ - port internal ingestion endpoints
171
+ - preserve request detail merge behavior
172
+
173
+ Definition of done:
174
+
175
+ - usage tracker can post records to backend
176
+ - UI can fetch aggregate and detail views
177
+
178
+ ## Backend refactors required
179
+
180
+ ### Remove Next coupling
181
+
182
+ - replace `NextResponse` with Express response helpers
183
+ - replace route module exports with Express routers
184
+ - replace lazy `@/lib/*` imports with package-local imports
185
+
186
+ ### Add explicit config
187
+
188
+ - `APP_DATA_DIR`
189
+ - `BACKEND_PORT`
190
+ - `MITM_PORT`
191
+ - `INTERNAL_API_TOKEN` or local loopback guard
192
+ - `PLATFORM` or equivalent runtime flag only if strictly required for diagnostics, not feature branching
193
+
194
+ ### Normalize module system
195
+
196
+ The current code mixes ESM and CJS. The backend package should choose one runtime model.
197
+
198
+ Recommendation:
199
+
200
+ - backend app in ESM/TypeScript
201
+ - keep MITM internals in CJS temporarily if extraction is faster
202
+ - wrap with compatibility adapters
203
+
204
+ ## Risks
205
+
206
+ ### High
207
+
208
+ - current MITM manager mixes process management and privileged actions
209
+ - current code expects localhost APIs at fixed ports
210
+ - current path aliases are tied to the existing repo root
211
+ - 443 binding behavior differs across macOS, Windows, and Linux
212
+
213
+ ### Medium
214
+
215
+ - account import paths differ by OS
216
+ - request detail and usage writes may race under heavier load
217
+ - native action failures may be misreported if backend owns too much platform logic
218
+
219
+ ## Backend test plan
220
+
221
+ - unit:
222
+ - token pool cooldown behavior
223
+ - usage merge behavior
224
+ - account import parsing
225
+ - integration:
226
+ - OAuth happy path with mocked responses
227
+ - MITM status/start/stop lifecycle
228
+ - internal usage ingestion
229
+ - manual:
230
+ - intercept real Antigravity traffic
231
+ - verify rotation across multiple accounts
232
+
233
+ ## Cross-platform backend acceptance
234
+
235
+ - same backend bundle starts under Tauri on macOS, Windows, and Linux
236
+ - no backend route assumes `/etc/hosts`, Windows cert store, or `sudo` directly
237
+ - all OS-specific failures are returned as structured errors, not raw shell output
@@ -0,0 +1,194 @@
1
+ # Tauri Native Plan
2
+
3
+ ## Goal
4
+
5
+ Use Tauri as the desktop control plane and native privilege boundary.
6
+
7
+ Windows and Linux support are required for v1, alongside macOS.
8
+
9
+ ## Native responsibilities
10
+
11
+ - determine app data directories
12
+ - manage secure secret persistence
13
+ - request elevation when needed
14
+ - modify cert trust and hosts/DNS entries
15
+ - start/stop backend process
16
+ - surface backend and OS status to UI
17
+ - normalize OS-specific privilege flows into one stable app behavior
18
+
19
+ ## Why these responsibilities belong in Tauri
20
+
21
+ Current Node code directly handles:
22
+
23
+ - sudo password flow
24
+ - hosts file changes
25
+ - cert store changes
26
+ - process launching
27
+
28
+ That works in a web app context, but it is the wrong long-term boundary for a desktop product. Native desktop concerns should live in the shell layer.
29
+
30
+ ## Native command set
31
+
32
+ ### Process control
33
+
34
+ - `start_backend`
35
+ - `stop_backend`
36
+ - `backend_status`
37
+ - `start_mitm`
38
+ - `stop_mitm`
39
+
40
+ ### Certificate operations
41
+
42
+ - `generate_root_ca`
43
+ - `trust_root_ca`
44
+ - `untrust_root_ca`
45
+ - `cert_status`
46
+
47
+ ### DNS / hosts operations
48
+
49
+ - `enable_antigravity_dns`
50
+ - `disable_antigravity_dns`
51
+ - `dns_status`
52
+
53
+ ### Secure storage
54
+
55
+ - `store_secret`
56
+ - `read_secret`
57
+ - `delete_secret`
58
+
59
+ ## Tauri app structure
60
+
61
+ ```text
62
+ apps/desktop-shell/
63
+ src-tauri/
64
+ src/
65
+ commands/
66
+ backend.rs
67
+ cert.rs
68
+ dns.rs
69
+ secrets.rs
70
+ state.rs
71
+ main.rs
72
+ ```
73
+
74
+ ## Implementation steps
75
+
76
+ ### 1. Backend supervision
77
+
78
+ Tasks:
79
+
80
+ - start Express backend sidecar on app launch
81
+ - wait for health endpoint
82
+ - stop backend gracefully on quit
83
+ - restart on crash with bounded retries
84
+
85
+ Definition of done:
86
+
87
+ - desktop app always knows whether backend is healthy
88
+
89
+ ### 2. Certificate management
90
+
91
+ Tasks:
92
+
93
+ - decide ownership of root CA files
94
+ - call backend or shared library to generate CA if absent
95
+ - trust/untrust via native OS-specific implementation
96
+ - report:
97
+ - exists
98
+ - trusted
99
+ - expired
100
+
101
+ Definition of done:
102
+
103
+ - user can trust the cert from desktop UI without raw password entry in the React layer
104
+
105
+ ### 3. DNS / hosts control
106
+
107
+ Tasks:
108
+
109
+ - own `/etc/hosts` or Windows hosts mutation via native command
110
+ - flush DNS cache as required per OS
111
+ - expose enabled/disabled status for Antigravity host set
112
+
113
+ Definition of done:
114
+
115
+ - DNS toggling is reliable and idempotent
116
+
117
+ ### 4. Secret storage
118
+
119
+ Tasks:
120
+
121
+ - store refresh-sensitive material outside plain UI state
122
+ - persist OAuth or local-service secrets in secure storage where possible
123
+ - avoid long-term Node-managed encrypted sudo-password cache design
124
+
125
+ Definition of done:
126
+
127
+ - desktop app no longer depends on plain password caching in JS globals
128
+
129
+ ## OS-specific notes
130
+
131
+ ### macOS
132
+
133
+ - hosts mutation and certificate trust require privileged operations
134
+ - DNS cache flush must handle `mDNSResponder`
135
+ - test on recent supported macOS versions, not only one machine
136
+
137
+ ### Windows
138
+
139
+ - hosts path and cert store differ
140
+ - UAC elevation flow is mandatory
141
+ - process binding to 443 may need elevated startup path
142
+ - avoid shell-window popups during common actions
143
+ - certificate trust should target the Windows root store explicitly
144
+
145
+ ### Linux
146
+
147
+ - distro differences in DNS flush behavior
148
+ - `sudo` may not exist in all environments
149
+ - root trust path can vary
150
+ - define a supported baseline, such as Ubuntu/Debian first, then document others as best effort
151
+ - if system trust installation cannot be fully automated on some distros, surface guided remediation in UI
152
+
153
+ ## Cross-platform design constraints
154
+
155
+ - React UI must never need to know platform-specific shell commands
156
+ - backend must not directly own elevation or cert-store logic
157
+ - Tauri commands must return normalized status objects across all OSes
158
+ - every privileged action must have:
159
+ - success result
160
+ - actionable failure message
161
+ - remediation hint when possible
162
+
163
+ ## Native risks
164
+
165
+ - binding port 443
166
+ - cert trust differences across OS versions
167
+ - installer permissions and first-run UX
168
+
169
+ ## Native verification
170
+
171
+ - backend launches automatically
172
+ - cert can be trusted/untrusted
173
+ - hosts entries can be enabled/disabled
174
+ - app surfaces actionable errors instead of raw shell failures
175
+
176
+ ## Per-OS exit criteria
177
+
178
+ ### macOS
179
+
180
+ - MITM can be started
181
+ - Antigravity hosts can be enabled and disabled
182
+ - cert can be trusted
183
+
184
+ ### Windows
185
+
186
+ - backend and MITM can be started from installed app
187
+ - UAC flow works for hosts and cert operations
188
+ - cert can be trusted in Windows root store
189
+
190
+ ### Linux
191
+
192
+ - backend and MITM can be started from installed app
193
+ - hosts mutation works on supported distro baseline
194
+ - documented cert trust flow works for supported distro baseline
@@ -0,0 +1,155 @@
1
+ # React UI Plan
2
+
3
+ ## Goal
4
+
5
+ Ship a desktop-first operations UI for Antigravity MITM, token swap, and usage analytics.
6
+
7
+ The UI must support macOS, Windows, and Linux without changing information architecture.
8
+
9
+ ## UI principles
10
+
11
+ - operational clarity over marketing polish
12
+ - fast state visibility
13
+ - desktop layout first
14
+ - no hidden state for cert, DNS, MITM, or account cooldowns
15
+
16
+ ## Routes / screens
17
+
18
+ ### 1. Accounts
19
+
20
+ Purpose:
21
+
22
+ - connect Antigravity accounts
23
+ - import existing accounts
24
+ - manage active/inactive status
25
+
26
+ Sections:
27
+
28
+ - account list
29
+ - add account button
30
+ - import from local install
31
+ - token expiry and refresh state
32
+ - project ID / account metadata if useful
33
+
34
+ ### 2. MITM
35
+
36
+ Purpose:
37
+
38
+ - operate cert, DNS, and server lifecycle
39
+
40
+ Sections:
41
+
42
+ - cert status card
43
+ - backend status card
44
+ - MITM status card
45
+ - DNS state for Antigravity hosts
46
+ - start/stop and enable/disable actions
47
+
48
+ ### 3. Token Swap
49
+
50
+ Purpose:
51
+
52
+ - visualize and configure pool behavior
53
+
54
+ Sections:
55
+
56
+ - enabled toggle
57
+ - strategy selector
58
+ - sticky round-robin settings if retained
59
+ - account pool table
60
+ - cooldown badges
61
+ - active eligibility summary
62
+
63
+ ### 4. Usage
64
+
65
+ Purpose:
66
+
67
+ - inspect intercepted traffic and cost estimates
68
+
69
+ Sections:
70
+
71
+ - overview cards
72
+ - recent requests
73
+ - request details table
74
+ - detail drawer
75
+ - filters by provider/account/model/date
76
+
77
+ ## Components to reuse from current app
78
+
79
+ - cards and layout primitives from `src/shared/components`
80
+ - MITM screen ideas from `src/app/(dashboard)/dashboard/mitm/MitmPageClient.js`
81
+ - usage screens from `src/app/(dashboard)/dashboard/usage/*`
82
+
83
+ ## UI package structure
84
+
85
+ ```text
86
+ apps/desktop-ui/
87
+ src/
88
+ app/
89
+ pages/
90
+ features/
91
+ accounts/
92
+ mitm/
93
+ token-swap/
94
+ usage/
95
+ shared/
96
+ api/
97
+ components/
98
+ types/
99
+ ```
100
+
101
+ ## API client plan
102
+
103
+ - single typed client for all backend endpoints
104
+ - polling for status endpoints
105
+ - optimistic updates only where safe
106
+ - explicit loading and error states
107
+
108
+ ## State plan
109
+
110
+ - route-local state for filters and forms
111
+ - small shared store for:
112
+ - backend health
113
+ - MITM status
114
+ - DNS status
115
+ - current account summary
116
+
117
+ ## UX requirements
118
+
119
+ - clear destructive or privileged action prompts
120
+ - direct explanation when cert trust or hosts mutation fails
121
+ - visible distinction between:
122
+ - MITM server not running
123
+ - DNS not enabled
124
+ - cert not trusted
125
+ - no eligible token-swap accounts
126
+ - platform-specific remediation copy when an operation is blocked by OS permissions or unsupported configuration
127
+
128
+ ## Cross-platform UI requirements
129
+
130
+ - no OS should expose raw shell commands as the primary remediation path
131
+ - Windows users should see UAC-oriented guidance
132
+ - Linux users should see distro-aware guidance where automation is partial
133
+ - macOS users should see cert and DNS-specific guidance when trust or cache flush fails
134
+
135
+ ## UI milestones
136
+
137
+ ### MVP
138
+
139
+ - accounts list and import
140
+ - MITM status and controls
141
+ - token swap status and pool table
142
+ - usage overview and detail list
143
+
144
+ ### Post-MVP
145
+
146
+ - richer request detail rendering
147
+ - live event stream for in-progress requests
148
+ - tray quick actions
149
+
150
+ ## UI verification
151
+
152
+ - all major states are visible without reading logs
153
+ - user can tell exactly why interception is not working
154
+ - token swap pool is understandable without opening raw JSON
155
+ - Windows and Linux states are presented as first-class supported flows, not fallback/debug views