n9router 0.4.21 → 0.4.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/app/.next/BUILD_ID +1 -1
  2. package/app/.next/app-path-routes-manifest.json +10 -10
  3. package/app/.next/build-manifest.json +2 -2
  4. package/app/.next/prerender-manifest.json +3 -3
  5. package/app/.next/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
  6. package/app/.next/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  7. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  8. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  9. package/app/.next/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
  10. package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  11. package/app/.next/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
  12. package/app/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  13. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  14. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  15. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
  16. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  17. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +1 -1
  18. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  19. package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/combo/[id]/page.js.nft.json +1 -1
  20. package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/combo/[id]/page_client-reference-manifest.js +1 -1
  21. package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/page.js.nft.json +1 -1
  22. package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  23. package/app/.next/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
  24. package/app/.next/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  25. package/app/.next/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  26. package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  27. package/app/.next/server/app/(dashboard)/dashboard/profile/page.js +1 -1
  28. package/app/.next/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
  29. package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  30. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
  31. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  32. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
  33. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  34. package/app/.next/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
  35. package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  36. package/app/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
  37. package/app/.next/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  38. package/app/.next/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
  39. package/app/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  40. package/app/.next/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
  41. package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  42. package/app/.next/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
  43. package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  44. package/app/.next/server/app/_global-error/page.js.nft.json +1 -1
  45. package/app/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  46. package/app/.next/server/app/_global-error.html +1 -1
  47. package/app/.next/server/app/_global-error.rsc +1 -1
  48. package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  49. package/app/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  50. package/app/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  51. package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  52. package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  53. package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  54. package/app/.next/server/app/_not-found/page.js.nft.json +1 -1
  55. package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  56. package/app/.next/server/app/_not-found.html +1 -1
  57. package/app/.next/server/app/_not-found.rsc +3 -3
  58. package/app/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  59. package/app/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  60. package/app/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  61. package/app/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  62. package/app/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  63. package/app/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  64. package/app/.next/server/app/api/antigravity-ide/route.js.nft.json +1 -1
  65. package/app/.next/server/app/api/antigravity-tools/import/route.js.nft.json +1 -1
  66. package/app/.next/server/app/api/antigravity-tools/import-refresh-tokens/route.js.nft.json +1 -1
  67. package/app/.next/server/app/api/auth/login/route.js.nft.json +1 -1
  68. package/app/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  69. package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js +2 -2
  70. package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  71. package/app/.next/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
  72. package/app/.next/server/app/api/cli-tools/claude-settings/route.js +2 -2
  73. package/app/.next/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -1
  74. package/app/.next/server/app/api/cli-tools/codex-settings/route.js +2 -2
  75. package/app/.next/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -1
  76. package/app/.next/server/app/api/cli-tools/copilot-settings/route.js +2 -2
  77. package/app/.next/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
  78. package/app/.next/server/app/api/cli-tools/droid-settings/route.js +1 -1
  79. package/app/.next/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -1
  80. package/app/.next/server/app/api/cli-tools/hermes-settings/route.js +3 -3
  81. package/app/.next/server/app/api/cli-tools/hermes-settings/route.js.nft.json +1 -1
  82. package/app/.next/server/app/api/cli-tools/openclaw-settings/route.js +2 -2
  83. package/app/.next/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -1
  84. package/app/.next/server/app/api/cli-tools/opencode-settings/route.js +2 -2
  85. package/app/.next/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -1
  86. package/app/.next/server/app/api/cloud/auth/route.js.nft.json +1 -1
  87. package/app/.next/server/app/api/cloud/credentials/update/route.js.nft.json +1 -1
  88. package/app/.next/server/app/api/cloud/model/resolve/route.js.nft.json +1 -1
  89. package/app/.next/server/app/api/cloud/models/alias/route.js.nft.json +1 -1
  90. package/app/.next/server/app/api/combos/[id]/route.js.nft.json +1 -1
  91. package/app/.next/server/app/api/combos/route.js.nft.json +1 -1
  92. package/app/.next/server/app/api/health/route.js.nft.json +1 -1
  93. package/app/.next/server/app/api/init/route.js.nft.json +1 -1
  94. package/app/.next/server/app/api/internal/account-health/route.js.nft.json +1 -1
  95. package/app/.next/server/app/api/internal/request-detail/route.js.nft.json +1 -1
  96. package/app/.next/server/app/api/internal/usage/route.js.nft.json +1 -1
  97. package/app/.next/server/app/api/keys/[id]/route.js.nft.json +1 -1
  98. package/app/.next/server/app/api/keys/route.js.nft.json +1 -1
  99. package/app/.next/server/app/api/locale/route.js.nft.json +1 -1
  100. package/app/.next/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
  101. package/app/.next/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
  102. package/app/.next/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
  103. package/app/.next/server/app/api/media-providers/tts/voices/route.js.nft.json +1 -1
  104. package/app/.next/server/app/api/models/alias/route.js.nft.json +1 -1
  105. package/app/.next/server/app/api/models/availability/route.js.nft.json +1 -1
  106. package/app/.next/server/app/api/models/custom/route.js.nft.json +1 -1
  107. package/app/.next/server/app/api/models/route.js +1 -1
  108. package/app/.next/server/app/api/models/route.js.nft.json +1 -1
  109. package/app/.next/server/app/api/models/test/route.js.nft.json +1 -1
  110. package/app/.next/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  111. package/app/.next/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
  112. package/app/.next/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
  113. package/app/.next/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
  114. package/app/.next/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
  115. package/app/.next/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -1
  116. package/app/.next/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
  117. package/app/.next/server/app/api/oauth/kiro/social-authorize/route.js.nft.json +1 -1
  118. package/app/.next/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
  119. package/app/.next/server/app/api/pricing/route.js.nft.json +1 -1
  120. package/app/.next/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
  121. package/app/.next/server/app/api/provider-nodes/route.js.nft.json +1 -1
  122. package/app/.next/server/app/api/provider-nodes/validate/route.js.nft.json +1 -1
  123. package/app/.next/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  124. package/app/.next/server/app/api/providers/[id]/route.js.nft.json +1 -1
  125. package/app/.next/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  126. package/app/.next/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
  127. package/app/.next/server/app/api/providers/client/route.js.nft.json +1 -1
  128. package/app/.next/server/app/api/providers/kilo/free-models/route.js.nft.json +1 -1
  129. package/app/.next/server/app/api/providers/route.js +1 -1
  130. package/app/.next/server/app/api/providers/route.js.nft.json +1 -1
  131. package/app/.next/server/app/api/providers/suggested-models/route.js.nft.json +1 -1
  132. package/app/.next/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  133. package/app/.next/server/app/api/providers/validate/route.js +1 -1
  134. package/app/.next/server/app/api/providers/validate/route.js.nft.json +1 -1
  135. package/app/.next/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
  136. package/app/.next/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
  137. package/app/.next/server/app/api/proxy-pools/route.js.nft.json +1 -1
  138. package/app/.next/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
  139. package/app/.next/server/app/api/settings/database/route.js.nft.json +1 -1
  140. package/app/.next/server/app/api/settings/proxy-test/route.js.nft.json +1 -1
  141. package/app/.next/server/app/api/settings/require-login/route.js.nft.json +1 -1
  142. package/app/.next/server/app/api/settings/route.js.nft.json +1 -1
  143. package/app/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  144. package/app/.next/server/app/api/tags/route.js.nft.json +1 -1
  145. package/app/.next/server/app/api/translator/console-logs/route.js +1 -1
  146. package/app/.next/server/app/api/translator/console-logs/route.js.nft.json +1 -1
  147. package/app/.next/server/app/api/translator/console-logs/stream/route.js +1 -1
  148. package/app/.next/server/app/api/translator/console-logs/stream/route.js.nft.json +1 -1
  149. package/app/.next/server/app/api/translator/load/route.js.nft.json +1 -1
  150. package/app/.next/server/app/api/translator/save/route.js.nft.json +1 -1
  151. package/app/.next/server/app/api/translator/send/route.js.nft.json +1 -1
  152. package/app/.next/server/app/api/translator/translate/route.js.nft.json +1 -1
  153. package/app/.next/server/app/api/tunnel/disable/route.js.nft.json +1 -1
  154. package/app/.next/server/app/api/tunnel/enable/route.js.nft.json +1 -1
  155. package/app/.next/server/app/api/tunnel/status/route.js.nft.json +1 -1
  156. package/app/.next/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
  157. package/app/.next/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
  158. package/app/.next/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
  159. package/app/.next/server/app/api/tunnel/tailscale-install/route.js +2 -2
  160. package/app/.next/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
  161. package/app/.next/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
  162. package/app/.next/server/app/api/tunnel/tailscale-start-daemon/route.js +1 -1
  163. package/app/.next/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
  164. package/app/.next/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  165. package/app/.next/server/app/api/usage/chart/route.js.nft.json +1 -1
  166. package/app/.next/server/app/api/usage/history/route.js.nft.json +1 -1
  167. package/app/.next/server/app/api/usage/logs/route.js.nft.json +1 -1
  168. package/app/.next/server/app/api/usage/providers/route.js +1 -1
  169. package/app/.next/server/app/api/usage/providers/route.js.nft.json +1 -1
  170. package/app/.next/server/app/api/usage/request-details/route.js.nft.json +1 -1
  171. package/app/.next/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  172. package/app/.next/server/app/api/usage/stats/route.js.nft.json +1 -1
  173. package/app/.next/server/app/api/usage/stream/route.js.nft.json +1 -1
  174. package/app/.next/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  175. package/app/.next/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  176. package/app/.next/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  177. package/app/.next/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  178. package/app/.next/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  179. package/app/.next/server/app/api/v1/messages/count_tokens/route.js.nft.json +1 -1
  180. package/app/.next/server/app/api/v1/messages/route.js.nft.json +1 -1
  181. package/app/.next/server/app/api/v1/models/route.js.nft.json +1 -1
  182. package/app/.next/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  183. package/app/.next/server/app/api/v1/responses/route.js.nft.json +1 -1
  184. package/app/.next/server/app/api/v1/route.js.nft.json +1 -1
  185. package/app/.next/server/app/api/v1/search/route.js.nft.json +1 -1
  186. package/app/.next/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
  187. package/app/.next/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  188. package/app/.next/server/app/api/v1beta/models/route.js.nft.json +1 -1
  189. package/app/.next/server/app/api/version/route.js +1 -1
  190. package/app/.next/server/app/api/version/route.js.nft.json +1 -1
  191. package/app/.next/server/app/api/version/update/route.js +1 -1
  192. package/app/.next/server/app/api/version/update/route.js.nft.json +1 -1
  193. package/app/.next/server/app/callback/page.js.nft.json +1 -1
  194. package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  195. package/app/.next/server/app/callback.html +1 -1
  196. package/app/.next/server/app/callback.rsc +3 -3
  197. package/app/.next/server/app/callback.segments/_full.segment.rsc +3 -3
  198. package/app/.next/server/app/callback.segments/_head.segment.rsc +1 -1
  199. package/app/.next/server/app/callback.segments/_index.segment.rsc +3 -3
  200. package/app/.next/server/app/callback.segments/_tree.segment.rsc +1 -1
  201. package/app/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  202. package/app/.next/server/app/callback.segments/callback.segment.rsc +1 -1
  203. package/app/.next/server/app/dashboard/basic-chat.html +1 -1
  204. package/app/.next/server/app/dashboard/basic-chat.rsc +5 -5
  205. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  206. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  207. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  208. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  209. package/app/.next/server/app/dashboard/basic-chat.segments/_full.segment.rsc +5 -5
  210. package/app/.next/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  211. package/app/.next/server/app/dashboard/basic-chat.segments/_index.segment.rsc +3 -3
  212. package/app/.next/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  213. package/app/.next/server/app/dashboard/cli-tools.html +1 -1
  214. package/app/.next/server/app/dashboard/cli-tools.rsc +5 -5
  215. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  216. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  217. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  218. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  219. package/app/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +5 -5
  220. package/app/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  221. package/app/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +3 -3
  222. package/app/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  223. package/app/.next/server/app/dashboard/combos.html +1 -1
  224. package/app/.next/server/app/dashboard/combos.rsc +5 -5
  225. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  226. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  227. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  228. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  229. package/app/.next/server/app/dashboard/combos.segments/_full.segment.rsc +5 -5
  230. package/app/.next/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  231. package/app/.next/server/app/dashboard/combos.segments/_index.segment.rsc +3 -3
  232. package/app/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  233. package/app/.next/server/app/dashboard/endpoint.html +1 -1
  234. package/app/.next/server/app/dashboard/endpoint.rsc +5 -5
  235. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  236. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  237. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  238. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  239. package/app/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +5 -5
  240. package/app/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  241. package/app/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +3 -3
  242. package/app/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  243. package/app/.next/server/app/dashboard/media-providers/web.html +1 -1
  244. package/app/.next/server/app/dashboard/media-providers/web.rsc +5 -5
  245. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  246. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  247. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  248. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  249. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  250. package/app/.next/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +5 -5
  251. package/app/.next/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  252. package/app/.next/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +3 -3
  253. package/app/.next/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
  254. package/app/.next/server/app/dashboard/mitm.html +1 -1
  255. package/app/.next/server/app/dashboard/mitm.rsc +5 -5
  256. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  257. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  258. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  259. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  260. package/app/.next/server/app/dashboard/mitm.segments/_full.segment.rsc +5 -5
  261. package/app/.next/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  262. package/app/.next/server/app/dashboard/mitm.segments/_index.segment.rsc +3 -3
  263. package/app/.next/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
  264. package/app/.next/server/app/dashboard/profile.html +1 -1
  265. package/app/.next/server/app/dashboard/profile.rsc +5 -5
  266. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  267. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  268. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  269. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  270. package/app/.next/server/app/dashboard/profile.segments/_full.segment.rsc +5 -5
  271. package/app/.next/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  272. package/app/.next/server/app/dashboard/profile.segments/_index.segment.rsc +3 -3
  273. package/app/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  274. package/app/.next/server/app/dashboard/providers/new.html +1 -1
  275. package/app/.next/server/app/dashboard/providers/new.rsc +5 -5
  276. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  277. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  278. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  279. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  280. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  281. package/app/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +5 -5
  282. package/app/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  283. package/app/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +3 -3
  284. package/app/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  285. package/app/.next/server/app/dashboard/providers.html +1 -1
  286. package/app/.next/server/app/dashboard/providers.rsc +5 -5
  287. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  288. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  289. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  290. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  291. package/app/.next/server/app/dashboard/providers.segments/_full.segment.rsc +5 -5
  292. package/app/.next/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  293. package/app/.next/server/app/dashboard/providers.segments/_index.segment.rsc +3 -3
  294. package/app/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  295. package/app/.next/server/app/dashboard/proxy-pools.html +1 -1
  296. package/app/.next/server/app/dashboard/proxy-pools.rsc +5 -5
  297. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  298. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  299. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  300. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  301. package/app/.next/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +5 -5
  302. package/app/.next/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  303. package/app/.next/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +3 -3
  304. package/app/.next/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  305. package/app/.next/server/app/dashboard/quota.html +2 -2
  306. package/app/.next/server/app/dashboard/quota.rsc +6 -6
  307. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  308. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  309. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  310. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  311. package/app/.next/server/app/dashboard/quota.segments/_full.segment.rsc +6 -6
  312. package/app/.next/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  313. package/app/.next/server/app/dashboard/quota.segments/_index.segment.rsc +3 -3
  314. package/app/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  315. package/app/.next/server/app/dashboard/settings/pricing/page.js.nft.json +1 -1
  316. package/app/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  317. package/app/.next/server/app/dashboard/settings/pricing.html +1 -1
  318. package/app/.next/server/app/dashboard/settings/pricing.rsc +3 -3
  319. package/app/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
  320. package/app/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  321. package/app/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +3 -3
  322. package/app/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  323. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  324. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  325. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  326. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  327. package/app/.next/server/app/dashboard/translator.html +1 -1
  328. package/app/.next/server/app/dashboard/translator.rsc +5 -5
  329. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  330. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  331. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  332. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  333. package/app/.next/server/app/dashboard/translator.segments/_full.segment.rsc +5 -5
  334. package/app/.next/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  335. package/app/.next/server/app/dashboard/translator.segments/_index.segment.rsc +3 -3
  336. package/app/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  337. package/app/.next/server/app/dashboard/usage.html +1 -1
  338. package/app/.next/server/app/dashboard/usage.rsc +5 -5
  339. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  340. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  341. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  342. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  343. package/app/.next/server/app/dashboard/usage.segments/_full.segment.rsc +5 -5
  344. package/app/.next/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  345. package/app/.next/server/app/dashboard/usage.segments/_index.segment.rsc +3 -3
  346. package/app/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  347. package/app/.next/server/app/dashboard.html +1 -1
  348. package/app/.next/server/app/dashboard.rsc +5 -5
  349. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  350. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  351. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  352. package/app/.next/server/app/dashboard.segments/_full.segment.rsc +5 -5
  353. package/app/.next/server/app/dashboard.segments/_head.segment.rsc +1 -1
  354. package/app/.next/server/app/dashboard.segments/_index.segment.rsc +3 -3
  355. package/app/.next/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  356. package/app/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  357. package/app/.next/server/app/index.html +1 -1
  358. package/app/.next/server/app/index.rsc +3 -3
  359. package/app/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  360. package/app/.next/server/app/index.segments/_full.segment.rsc +3 -3
  361. package/app/.next/server/app/index.segments/_head.segment.rsc +1 -1
  362. package/app/.next/server/app/index.segments/_index.segment.rsc +3 -3
  363. package/app/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  364. package/app/.next/server/app/landing/page.js.nft.json +1 -1
  365. package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  366. package/app/.next/server/app/landing.html +1 -1
  367. package/app/.next/server/app/landing.rsc +3 -3
  368. package/app/.next/server/app/landing.segments/_full.segment.rsc +3 -3
  369. package/app/.next/server/app/landing.segments/_head.segment.rsc +1 -1
  370. package/app/.next/server/app/landing.segments/_index.segment.rsc +3 -3
  371. package/app/.next/server/app/landing.segments/_tree.segment.rsc +1 -1
  372. package/app/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  373. package/app/.next/server/app/landing.segments/landing.segment.rsc +1 -1
  374. package/app/.next/server/app/login/page.js.nft.json +1 -1
  375. package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
  376. package/app/.next/server/app/login.html +1 -1
  377. package/app/.next/server/app/login.rsc +4 -4
  378. package/app/.next/server/app/login.segments/_full.segment.rsc +4 -4
  379. package/app/.next/server/app/login.segments/_head.segment.rsc +1 -1
  380. package/app/.next/server/app/login.segments/_index.segment.rsc +3 -3
  381. package/app/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  382. package/app/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  383. package/app/.next/server/app/login.segments/login.segment.rsc +1 -1
  384. package/app/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  385. package/app/.next/server/app/page.js.nft.json +1 -1
  386. package/app/.next/server/app/page_client-reference-manifest.js +1 -1
  387. package/app/.next/server/app-paths-manifest.json +10 -10
  388. package/app/.next/server/chunks/318.js +1 -1
  389. package/app/.next/server/chunks/3646.js +1 -1
  390. package/app/.next/server/chunks/4989.js +1 -1
  391. package/app/.next/server/chunks/7595.js +1 -1
  392. package/app/.next/server/chunks/9718.js +1 -1
  393. package/app/.next/server/middleware-build-manifest.js +1 -1
  394. package/app/.next/server/middleware.js +1 -1
  395. package/app/.next/server/pages/404.html +1 -1
  396. package/app/.next/server/pages/500.html +1 -1
  397. package/app/.next/server/server-reference-manifest.js +1 -1
  398. package/app/.next/server/server-reference-manifest.json +1 -1
  399. package/app/.next/static/chunks/{1321-758994bc249e4966.js → 1321-98282fa433a8e041.js} +1 -1
  400. package/app/.next/static/chunks/app/(dashboard)/dashboard/profile/page-b936fb16ef818e9e.js +1 -0
  401. package/app/package.json +1 -1
  402. package/app/src/mitm/handlers/antigravity.js +2 -2
  403. package/app/src/mitm/server.js +11 -7
  404. package/app/src/mitm/usageTracker.js +14 -1
  405. package/package.json +1 -1
  406. package/app/.next/static/chunks/app/(dashboard)/dashboard/profile/page-cf73f6db045a7e2d.js +0 -1
  407. /package/app/.next/static/{wozf5GL2edkjzl9Gac_lV → khTwXTxQMZ2IyYW4Yywuc}/_buildManifest.js +0 -0
  408. /package/app/.next/static/{wozf5GL2edkjzl9Gac_lV → khTwXTxQMZ2IyYW4Yywuc}/_ssgManifest.js +0 -0
@@ -105,6 +105,11 @@ function extractUsage(chunk) {
105
105
  return null;
106
106
  }
107
107
 
108
+ function extractModelFromResponseChunk(chunk) {
109
+ if (!chunk || typeof chunk !== "object") return null;
110
+ return chunk.model || chunk.modelVersion || chunk.response?.model || chunk.response?.modelVersion || null;
111
+ }
112
+
108
113
  function getPartsTextLength(parts) {
109
114
  if (!Array.isArray(parts)) return 0;
110
115
  return parts.reduce((total, part) => total + (typeof part?.text === "string" ? part.text.length : 0), 0);
@@ -468,6 +473,7 @@ function createTokenSwapUsageObserver({ provider, model, connectionId, accountLa
468
473
  let buffer = "";
469
474
  let contentLength = 0;
470
475
  let usage = null;
476
+ let responseModel = null;
471
477
  let finished = false;
472
478
  let responseContent = "";
473
479
  let thinkingContent = "";
@@ -477,6 +483,7 @@ function createTokenSwapUsageObserver({ provider, model, connectionId, accountLa
477
483
  const processParsedChunk = (parsed) => {
478
484
  const extracted = extractUsage(parsed);
479
485
  if (extracted) usage = extracted;
486
+ responseModel = responseModel || extractModelFromResponseChunk(parsed);
480
487
  contentLength += extractContentLength(parsed);
481
488
  if (!contentCapped) {
482
489
  const text = extractContentText(parsed);
@@ -552,6 +559,11 @@ function createTokenSwapUsageObserver({ provider, model, connectionId, accountLa
552
559
 
553
560
  if (!hasValidUsage(usage)) return;
554
561
 
562
+ const trackedModel = model
563
+ || responseModel
564
+ || detailRecord?.model
565
+ || "unknown";
566
+
555
567
  const inTokens = usage.prompt_tokens || usage.input_tokens || 0;
556
568
  const outTokens = usage.completion_tokens || usage.output_tokens || 0;
557
569
  log(`📊 [token-swap] usage "${accountLabel}" in=${inTokens} out=${outTokens}${usage.estimated ? " estimated" : ""}`);
@@ -559,7 +571,7 @@ function createTokenSwapUsageObserver({ provider, model, connectionId, accountLa
559
571
  try {
560
572
  await persistUsage({
561
573
  provider,
562
- model,
574
+ model: trackedModel,
563
575
  connectionId,
564
576
  tokens: usage,
565
577
  status: `${statusCode} OK`
@@ -573,6 +585,7 @@ function createTokenSwapUsageObserver({ provider, model, connectionId, accountLa
573
585
  try {
574
586
  await persistRequestDetail({
575
587
  ...detailRecord,
588
+ model: trackedModel,
576
589
  status: "completed",
577
590
  tokens: usage,
578
591
  latency: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n9router",
3
- "version": "0.4.21",
3
+ "version": "0.4.23",
4
4
  "description": "Self-hosted AI routing gateway — local proxy for Claude, Gemini, OpenAI and 40+ providers",
5
5
  "keywords": [
6
6
  "ai",
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3471],{64561:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>c});var a=s(95155),r=s(12115),i=s(35497),n=s(1620),o=s(11059),l=s(31474),d=s(90620);function c(){let{theme:e,setTheme:t,isDark:s}=(0,n.D)(),{copied:c,copy:m}=(0,o.C)(),[x,p]=(0,r.useState)({fallbackStrategy:"fill-first"}),[u,y]=(0,r.useState)(!0),[b,h]=(0,r.useState)({current:"",new:"",confirm:""}),[g,f]=(0,r.useState)({type:"",message:""}),[j,v]=(0,r.useState)(!1),[N,w]=(0,r.useState)(!1),[k,C]=(0,r.useState)({type:"",message:""}),P=(0,r.useRef)(null),[S,A]=(0,r.useState)({outboundProxyEnabled:!1,outboundProxyUrl:"",outboundNoProxy:""}),[O,E]=(0,r.useState)({type:"",message:""}),[T,D]=(0,r.useState)(!1),[R,L]=(0,r.useState)(!1),[F,H]=(0,r.useState)("1.23.2"),[I,q]=(0,r.useState)({type:"",message:""}),[J,M]=(0,r.useState)(!1);(0,r.useEffect)(()=>{fetch("/api/settings").then(e=>e.json()).then(e=>{p(e),A({outboundProxyEnabled:e?.outboundProxyEnabled===!0,outboundProxyUrl:e?.outboundProxyUrl||"",outboundNoProxy:e?.outboundNoProxy||""}),H(e?.mitmAntigravityIdeVersion||"1.23.2"),y(!1)}).catch(e=>{console.error("Failed to fetch settings:",e),y(!1)})},[]);let U=async e=>{if(e.preventDefault(),!0===x.outboundProxyEnabled){D(!0),E({type:"",message:""});try{let e=await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({outboundProxyUrl:S.outboundProxyUrl,outboundNoProxy:S.outboundNoProxy})}),t=await e.json();e.ok?(p(e=>({...e,...t})),E({type:"success",message:"Proxy settings applied"})):E({type:"error",message:t.error||"Failed to update proxy settings"})}catch(e){E({type:"error",message:"An error occurred"})}finally{D(!1)}}},$=async()=>{if(!0!==x.outboundProxyEnabled)return;let e=(S.outboundProxyUrl||"").trim();if(!e)return void E({type:"error",message:"Please enter a Proxy URL to test"});L(!0),E({type:"",message:""});try{let t=await fetch("/api/settings/proxy-test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({proxyUrl:e})}),s=await t.json();t.ok&&s?.ok?E({type:"success",message:`Proxy test OK (${s.status}) in ${s.elapsedMs}ms`}):E({type:"error",message:s?.error||"Proxy test failed"})}catch(e){E({type:"error",message:"An error occurred"})}finally{L(!1)}},V=async e=>{D(!0),E({type:"",message:""});try{let t=await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({outboundProxyEnabled:e})}),s=await t.json();t.ok?(p(e=>({...e,...s})),A(e=>({...e,outboundProxyEnabled:s?.outboundProxyEnabled===!0})),E({type:"success",message:e?"Proxy enabled":"Proxy disabled"})):E({type:"error",message:s.error||"Failed to update proxy settings"})}catch(e){E({type:"error",message:"An error occurred"})}finally{D(!1)}},Z=async e=>{if(e.preventDefault(),b.new!==b.confirm)return void f({type:"error",message:"Passwords do not match"});v(!0),f({type:"",message:""});try{let e=await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({currentPassword:b.current,newPassword:b.new})}),t=await e.json();e.ok?(f({type:"success",message:"Password updated successfully"}),h({current:"",new:"",confirm:""})):f({type:"error",message:t.error||"Failed to update password"})}catch(e){f({type:"error",message:"An error occurred"})}finally{v(!1)}},B=async e=>{try{(await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({fallbackStrategy:e})})).ok&&p(t=>({...t,fallbackStrategy:e}))}catch(e){console.error("Failed to update settings:",e)}},_=async e=>{try{(await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({comboStrategy:e})})).ok&&p(t=>({...t,comboStrategy:e}))}catch(e){console.error("Failed to update combo strategy:",e)}},z=async e=>{let t=parseInt(e);if(!isNaN(t)&&!(t<1))try{(await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({stickyRoundRobinLimit:t})})).ok&&p(e=>({...e,stickyRoundRobinLimit:t}))}catch(e){console.error("Failed to update sticky limit:",e)}},W=async e=>{try{(await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({requireLogin:e})})).ok&&p(t=>({...t,requireLogin:e}))}catch(e){console.error("Failed to update require login:",e)}},K=async e=>{try{(await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({enableObservability:e})})).ok&&p(t=>({...t,enableObservability:e}))}catch(e){console.error("Failed to update enableObservability:",e)}},Q=async e=>{try{(await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({mitmAntigravityDebugLogsEnabled:e})})).ok&&p(t=>({...t,mitmAntigravityDebugLogsEnabled:e}))}catch(e){console.error("Failed to update mitmAntigravityDebugLogsEnabled:",e)}},G=async e=>{try{(await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({mitmAntigravityAutoDisableOnSonnetZero:e})})).ok&&p(t=>({...t,mitmAntigravityAutoDisableOnSonnetZero:e}))}catch(e){console.error("Failed to update mitmAntigravityAutoDisableOnSonnetZero:",e)}},X=async e=>{q({type:"",message:""});try{(await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({mitmAntigravityIdeVersionOverrideEnabled:e})})).ok&&p(t=>({...t,mitmAntigravityIdeVersionOverrideEnabled:e}))}catch(e){console.error("Failed to update mitmAntigravityIdeVersionOverrideEnabled:",e)}},Y=async e=>{try{(await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({mitmAntigravityHostRewriteEnabled:e})})).ok&&p(t=>({...t,mitmAntigravityHostRewriteEnabled:e}))}catch(e){console.error("Failed to update mitmAntigravityHostRewriteEnabled:",e)}},ee=async e=>{e.preventDefault();let t=F.trim()||"1.23.2";M(!0),q({type:"",message:""});try{let e=await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({mitmAntigravityIdeVersion:t})}),s=await e.json().catch(()=>({}));e.ok?(p(e=>({...e,...s})),H(s?.mitmAntigravityIdeVersion||t),q({type:"success",message:"Antigravity IDE version saved"})):q({type:"error",message:s.error||"Failed to save Antigravity IDE version"})}catch(e){q({type:"error",message:"An error occurred"})}finally{M(!1)}},et=async e=>{try{(await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({periodicDbBackupsEnabled:e})})).ok&&p(t=>({...t,periodicDbBackupsEnabled:e}))}catch(e){console.error("Failed to update periodicDbBackupsEnabled:",e)}},es=async()=>{try{let e=await fetch("/api/settings");if(!e.ok)return;let t=await e.json();p(t),H(t?.mitmAntigravityIdeVersion||"1.23.2")}catch(e){console.error("Failed to reload settings:",e)}},ea=async()=>{w(!0),C({type:"",message:""});try{let e=await fetch("/api/settings/database");if(!e.ok){let t=await e.json().catch(()=>({}));throw Error(t.error||"Failed to export database")}let t=await e.json(),s=JSON.stringify(t,null,2),a=new Blob([s],{type:"application/json"}),r=URL.createObjectURL(a),i=document.createElement("a"),n=new Date().toISOString().replace(/[.:]/g,"-");i.href=r,i.download=`9router-backup-${n}.json`,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(r),C({type:"success",message:"Database backup downloaded"})}catch(e){C({type:"error",message:e.message||"Failed to export database"})}finally{w(!1)}},er=async e=>{let t=e.target.files?.[0];if(t){w(!0),C({type:"",message:""});try{let e=await t.text(),s=JSON.parse(e),a=await fetch("/api/settings/database",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)}),r=await a.json().catch(()=>({}));if(!a.ok)throw Error(r.error||"Failed to import database");await es(),C({type:"success",message:"Database imported successfully"})}catch(e){C({type:"error",message:e.message||"Invalid backup file"})}finally{P.current&&(P.current.value=""),w(!1)}}},ei=!0===x.enableObservability,en=!0===x.mitmAntigravityDebugLogsEnabled,eo=!1!==x.mitmAntigravityAutoDisableOnSonnetZero,el=!0===x.mitmAntigravityIdeVersionOverrideEnabled,ed=!1!==x.mitmAntigravityHostRewriteEnabled,ec=x.mitmAntigravityDebugLogDir||"",em=!1!==x.periodicDbBackupsEnabled;return(0,a.jsx)("div",{className:"max-w-2xl mx-auto",children:(0,a.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,a.jsxs)(i.Zp,{children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,a.jsxs)("div",{className:"flex items-center gap-4",children:[(0,a.jsx)("div",{className:"size-12 rounded-lg bg-green-500/10 text-green-500 flex items-center justify-center",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-2xl",children:"computer"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-xl font-semibold",children:"Local Mode"}),(0,a.jsx)("p",{className:"text-text-muted",children:"Running on your machine"})]})]}),(0,a.jsx)("div",{className:"inline-flex p-1 rounded-lg bg-black/5 dark:bg-white/5",children:["light","dark","system"].map(s=>(0,a.jsxs)("button",{type:"button",onClick:()=>t(s),className:(0,l.cn)("flex items-center gap-1.5 px-3 py-1.5 rounded-md font-medium transition-all",e===s?"bg-white dark:bg-white/10 text-text-main shadow-sm":"text-text-muted hover:text-text-main"),children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"light"===s?"light_mode":"dark"===s?"dark_mode":"contrast"}),(0,a.jsx)("span",{className:"capitalize text-sm",children:s})]},s))})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-3 pt-4 border-t border-border",children:[(0,a.jsx)("div",{className:"flex items-center justify-between p-3 rounded-lg bg-bg border border-border",children:(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Database Location"}),(0,a.jsx)("p",{className:"text-sm text-text-muted font-mono",children:"~/.n9router/db.json"})]})}),(0,a.jsxs)("div",{className:"flex items-center justify-between p-3 rounded-lg bg-bg border border-border",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Hourly Database Backups"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Keep hourly snapshots for 3 days in ~/.n9router/backups/db"})]}),(0,a.jsx)(i.lM,{checked:em,onChange:et,disabled:u})]}),(0,a.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,a.jsx)(i.$n,{variant:"secondary",icon:"download",onClick:ea,loading:N,children:"Download Backup"}),(0,a.jsx)(i.$n,{variant:"outline",icon:"upload",onClick:()=>P.current?.click(),disabled:N,children:"Import Backup"}),(0,a.jsx)("input",{ref:P,type:"file",accept:"application/json,.json",className:"hidden",onChange:er})]}),k.message&&(0,a.jsx)("p",{className:`text-sm ${"error"===k.type?"text-red-500":"text-green-600 dark:text-green-400"}`,children:k.message})]})]}),(0,a.jsxs)(i.Zp,{children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,a.jsx)("div",{className:"p-2 rounded-lg bg-primary/10 text-primary",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"shield"})}),(0,a.jsx)("h3",{className:"text-lg font-semibold",children:"Security"})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Require login"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"When ON, dashboard requires password. When OFF, access without login."})]}),(0,a.jsx)(i.lM,{checked:!0===x.requireLogin,onChange:()=>W(!x.requireLogin),disabled:u})]}),!0===x.requireLogin&&(0,a.jsxs)("form",{onSubmit:Z,className:"flex flex-col gap-4 pt-4 border-t border-border/50",children:[x.hasPassword&&(0,a.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,a.jsx)("label",{className:"text-sm font-medium",children:"Current Password"}),(0,a.jsx)(i.pd,{type:"password",placeholder:"Enter current password",value:b.current,onChange:e=>h({...b,current:e.target.value}),required:!0})]}),(0,a.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,a.jsx)("label",{className:"text-sm font-medium",children:"New Password"}),(0,a.jsx)(i.pd,{type:"password",placeholder:"Enter new password",value:b.new,onChange:e=>h({...b,new:e.target.value}),required:!0})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,a.jsx)("label",{className:"text-sm font-medium",children:"Confirm New Password"}),(0,a.jsx)(i.pd,{type:"password",placeholder:"Confirm new password",value:b.confirm,onChange:e=>h({...b,confirm:e.target.value}),required:!0})]})]}),g.message&&(0,a.jsx)("p",{className:`text-sm ${"error"===g.type?"text-red-500":"text-green-500"}`,children:g.message}),(0,a.jsx)("div",{className:"pt-2",children:(0,a.jsx)(i.$n,{type:"submit",variant:"primary",loading:j,children:x.hasPassword?"Update Password":"Set Password"})})]})]})]}),(0,a.jsxs)(i.Zp,{children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,a.jsx)("div",{className:"p-2 rounded-lg bg-blue-500/10 text-blue-500",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"route"})}),(0,a.jsx)("h3",{className:"text-lg font-semibold",children:"Routing Strategy"})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Round Robin"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Cycle through accounts to distribute load"})]}),(0,a.jsx)(i.lM,{checked:"round-robin"===x.fallbackStrategy,onChange:()=>B("round-robin"===x.fallbackStrategy?"fill-first":"round-robin"),disabled:u})]}),"round-robin"===x.fallbackStrategy&&(0,a.jsxs)("div",{className:"flex items-center justify-between pt-2 border-t border-border/50",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Sticky Limit"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Calls per account before switching"})]}),(0,a.jsx)(i.pd,{type:"number",min:"1",max:"10",value:x.stickyRoundRobinLimit||3,onChange:e=>z(e.target.value),disabled:u,className:"w-20 text-center"})]}),(0,a.jsxs)("div",{className:"flex items-center justify-between pt-4 border-t border-border/50",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Combo Round Robin"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Cycle through providers in combos instead of always starting with first"})]}),(0,a.jsx)(i.lM,{checked:"round-robin"===x.comboStrategy,onChange:()=>_("round-robin"===x.comboStrategy?"fallback":"round-robin"),disabled:u})]}),(0,a.jsx)("p",{className:"text-xs text-text-muted italic pt-2 border-t border-border/50",children:"round-robin"===x.fallbackStrategy?`Currently distributing requests across all available accounts with ${x.stickyRoundRobinLimit||3} calls per account.`:"Currently using accounts in priority order (Fill First)."})]})]}),(0,a.jsxs)(i.Zp,{children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,a.jsx)("div",{className:"p-2 rounded-lg bg-purple-500/10 text-purple-500",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"wifi"})}),(0,a.jsx)("h3",{className:"text-lg font-semibold",children:"Network"})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Outbound Proxy"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Enable proxy for OAuth + provider outbound requests."})]}),(0,a.jsx)(i.lM,{checked:!0===x.outboundProxyEnabled,onChange:()=>V(!0!==x.outboundProxyEnabled),disabled:u||T})]}),!0===x.outboundProxyEnabled&&(0,a.jsxs)("form",{onSubmit:U,className:"flex flex-col gap-4 pt-2 border-t border-border/50",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,a.jsx)("label",{className:"font-medium",children:"Proxy URL"}),(0,a.jsx)(i.pd,{placeholder:"http://127.0.0.1:7897",value:S.outboundProxyUrl,onChange:e=>A(t=>({...t,outboundProxyUrl:e.target.value})),disabled:u||T}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Leave empty to inherit existing env proxy (if any)."})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-2 pt-2 border-t border-border/50",children:[(0,a.jsx)("label",{className:"font-medium",children:"No Proxy"}),(0,a.jsx)(i.pd,{placeholder:"localhost,127.0.0.1",value:S.outboundNoProxy,onChange:e=>A(t=>({...t,outboundNoProxy:e.target.value})),disabled:u||T}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Comma-separated hostnames/domains to bypass the proxy."})]}),(0,a.jsxs)("div",{className:"pt-2 border-t border-border/50 flex items-center gap-2",children:[(0,a.jsx)(i.$n,{type:"button",variant:"secondary",loading:R,disabled:u||T,onClick:$,children:"Test proxy URL"}),(0,a.jsx)(i.$n,{type:"submit",variant:"primary",loading:T,children:"Apply"})]})]}),O.message&&(0,a.jsx)("p",{className:`text-sm ${"error"===O.type?"text-red-500":"text-green-500"} pt-2 border-t border-border/50`,children:O.message})]})]}),(0,a.jsxs)(i.Zp,{children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,a.jsx)("div",{className:"p-2 rounded-lg bg-orange-500/10 text-orange-500",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"monitoring"})}),(0,a.jsx)("h3",{className:"text-lg font-semibold",children:"Observability"})]}),(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Enable Observability"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Record request details for inspection in the logs view"})]}),(0,a.jsx)(i.lM,{checked:ei,onChange:K,disabled:u})]}),(0,a.jsxs)("div",{className:"flex items-center justify-between pt-4 mt-4 border-t border-border/50",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Antigravity MITM Debug Logs"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Write all Antigravity MITM requests to debug log files with masked tokens, related account info, and response payloads"})]}),(0,a.jsx)(i.lM,{checked:en,onChange:Q,disabled:u})]}),en&&ec&&(0,a.jsx)("div",{className:"pt-3 mt-3 border-t border-border/50",children:(0,a.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsx)("p",{className:"font-medium",children:"Log Folder"}),(0,a.jsx)("p",{className:"mt-1 break-all rounded-md bg-surface/70 px-3 py-2 font-mono text-xs text-text-muted",children:ec})]}),(0,a.jsx)(i.$n,{variant:"outline",size:"sm",onClick:()=>m(ec,"mitm-antigravity-log-dir"),children:"mitm-antigravity-log-dir"===c?"Copied!":"Copy"})]})}),(0,a.jsxs)("div",{className:"flex items-center justify-between pt-4 mt-4 border-t border-border/50",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Antigravity Auto-disable Empty Sonnet Accounts"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Disable an Antigravity token-rotation account after a failed request when its Claude Sonnet 4.6 quota is 0%"})]}),(0,a.jsx)(i.lM,{checked:eo,onChange:G,disabled:u})]}),(0,a.jsxs)("div",{className:"flex items-center justify-between pt-4 mt-4 border-t border-border/50",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Antigravity Host Rewrite"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Rewrite Antigravity requests from cloudcode-pa.googleapis.com to daily-cloudcode-pa.googleapis.com to avoid 429 rate limits"})]}),(0,a.jsx)(i.lM,{checked:ed,onChange:Y,disabled:u})]}),(0,a.jsxs)("div",{className:"pt-4 mt-4 border-t border-border/50",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between gap-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Antigravity IDE Version Override"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Replace Antigravity token-swap request metadata and user-agent version"}),(0,a.jsx)("p",{className:"mt-1 text-xs font-medium text-amber-600 dark:text-amber-400",children:"Use this feature at your own risk. Spoofing IDE versions may affect account eligibility, upstream behavior, or request reliability."})]}),(0,a.jsx)(i.lM,{checked:el,onChange:X,disabled:u})]}),el&&(0,a.jsxs)("form",{onSubmit:ee,className:"mt-4 flex flex-col gap-3",children:[(0,a.jsxs)("div",{className:"flex flex-col sm:flex-row gap-3 sm:items-end",children:[(0,a.jsx)(i.pd,{label:"Antigravity IDE Version",value:F,onChange:e=>H(e.target.value),placeholder:"1.23.2",inputMode:"decimal",disabled:J,className:"flex-1"}),(0,a.jsx)(i.$n,{type:"submit",variant:"outline",disabled:J,children:J?"Saving...":"Save"})]}),I.message&&(0,a.jsx)("p",{className:`text-sm ${"error"===I.type?"text-red-500":"text-green-500"}`,children:I.message})]})]})]}),(0,a.jsxs)("div",{className:"text-center text-sm text-text-muted py-4",children:[(0,a.jsxs)("p",{children:[d.vQ.name," v",d.vQ.version]}),(0,a.jsx)("p",{className:"mt-1",children:"Local Mode - All data stored on your machine"})]})]})})}},68594:(e,t,s)=>{Promise.resolve().then(s.bind(s,64561))}},e=>{e.O(0,[2574,3862,1051,1321,5497,8441,3794,7358],()=>e(e.s=68594)),_N_E=e.O()}]);