9router 0.4.29 → 0.4.33

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 (780) hide show
  1. package/app/.next/BUILD_ID +1 -1
  2. package/app/.next/app-path-routes-manifest.json +16 -10
  3. package/app/.next/build-manifest.json +2 -2
  4. package/app/.next/required-server-files.json +6 -0
  5. package/app/.next/routes-manifest.json +40 -0
  6. package/app/.next/server/app/(dashboard)/dashboard/basic-chat/page.js +2 -2
  7. package/app/.next/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
  8. package/app/.next/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  9. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page.js +2 -2
  10. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  11. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  12. package/app/.next/server/app/(dashboard)/dashboard/combos/page.js +2 -2
  13. package/app/.next/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
  14. package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  15. package/app/.next/server/app/(dashboard)/dashboard/console-log/page.js +2 -2
  16. package/app/.next/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
  17. package/app/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  18. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page.js +2 -2
  19. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  20. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  21. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js +3 -3
  22. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
  23. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  24. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js +2 -2
  25. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +1 -1
  26. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  27. package/app/.next/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +3 -3
  28. package/app/.next/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js.nft.json +1 -1
  29. package/app/.next/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  30. package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/page.js +2 -2
  31. package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/page.js.nft.json +1 -1
  32. package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  33. package/app/.next/server/app/(dashboard)/dashboard/mitm/page.js +2 -2
  34. package/app/.next/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
  35. package/app/.next/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  36. package/app/.next/server/app/(dashboard)/dashboard/page.js +2 -2
  37. package/app/.next/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  38. package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  39. package/app/.next/server/app/(dashboard)/dashboard/profile/page.js +2 -2
  40. package/app/.next/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
  41. package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  42. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js +3 -3
  43. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
  44. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  45. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page.js +2 -2
  46. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
  47. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  48. package/app/.next/server/app/(dashboard)/dashboard/providers/page.js +2 -2
  49. package/app/.next/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
  50. package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  51. package/app/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js +3 -3
  52. package/app/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
  53. package/app/.next/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  54. package/app/.next/server/app/(dashboard)/dashboard/quota/page.js +2 -2
  55. package/app/.next/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
  56. package/app/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  57. package/app/.next/server/app/(dashboard)/dashboard/skills/page.js +2 -2
  58. package/app/.next/server/app/(dashboard)/dashboard/skills/page.js.nft.json +1 -1
  59. package/app/.next/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  60. package/app/.next/server/app/(dashboard)/dashboard/translator/page.js +2 -2
  61. package/app/.next/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
  62. package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  63. package/app/.next/server/app/(dashboard)/dashboard/usage/page.js +2 -2
  64. package/app/.next/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
  65. package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  66. package/app/.next/server/app/_global-error/page.js +2 -2
  67. package/app/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  68. package/app/.next/server/app/_global-error.html +1 -1
  69. package/app/.next/server/app/_global-error.rsc +1 -1
  70. package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  71. package/app/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  72. package/app/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  73. package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  74. package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  75. package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  76. package/app/.next/server/app/_not-found/page.js +2 -2
  77. package/app/.next/server/app/_not-found/page.js.nft.json +1 -1
  78. package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  79. package/app/.next/server/app/_not-found.html +1 -1
  80. package/app/.next/server/app/_not-found.rsc +4 -4
  81. package/app/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  82. package/app/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  83. package/app/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  84. package/app/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  85. package/app/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  86. package/app/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  87. package/app/.next/server/app/api/auth/login/route.js +1 -1
  88. package/app/.next/server/app/api/auth/login/route.js.nft.json +1 -1
  89. package/app/.next/server/app/api/auth/logout/route.js +1 -1
  90. package/app/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  91. package/app/.next/server/app/api/auth/oidc/callback/route.js +1 -0
  92. package/app/.next/server/app/api/auth/oidc/callback/route.js.nft.json +1 -0
  93. package/app/.next/server/app/api/auth/oidc/callback/route_client-reference-manifest.js +1 -0
  94. package/app/.next/server/app/api/auth/oidc/start/route.js +1 -0
  95. package/app/.next/server/app/api/auth/oidc/start/route.js.nft.json +1 -0
  96. package/app/.next/server/app/api/auth/oidc/start/route_client-reference-manifest.js +1 -0
  97. package/app/.next/server/app/api/auth/oidc/test/route.js +1 -0
  98. package/app/.next/server/app/api/auth/oidc/test/route.js.nft.json +1 -0
  99. package/app/.next/server/app/api/auth/oidc/test/route_client-reference-manifest.js +1 -0
  100. package/app/.next/server/app/api/auth/status/route.js +1 -0
  101. package/app/.next/server/app/api/auth/status/route.js.nft.json +1 -0
  102. package/app/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -0
  103. package/app/.next/server/app/api/cli-tools/all-statuses/route.js +2 -2
  104. package/app/.next/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
  105. package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js +2 -2
  106. package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  107. package/app/.next/server/app/api/cli-tools/antigravity-mitm/route.js +1 -1
  108. package/app/.next/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
  109. package/app/.next/server/app/api/cli-tools/claude-settings/route.js +2 -2
  110. package/app/.next/server/app/api/cli-tools/cline-settings/route.js +2 -2
  111. package/app/.next/server/app/api/cli-tools/codex-settings/route.js +1 -1
  112. package/app/.next/server/app/api/cli-tools/copilot-settings/route.js +1 -1
  113. package/app/.next/server/app/api/cli-tools/cowork-mcp-registry/route.js +2 -2
  114. package/app/.next/server/app/api/cli-tools/cowork-mcp-tools/route.js +1 -1
  115. package/app/.next/server/app/api/cli-tools/cowork-settings/route.js +2 -2
  116. package/app/.next/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
  117. package/app/.next/server/app/api/cli-tools/droid-settings/route.js +2 -2
  118. package/app/.next/server/app/api/cli-tools/hermes-settings/route.js +2 -2
  119. package/app/.next/server/app/api/cli-tools/kilo-settings/route.js +2 -2
  120. package/app/.next/server/app/api/cli-tools/openclaw-settings/route.js +2 -2
  121. package/app/.next/server/app/api/cli-tools/opencode-settings/route.js +1 -1
  122. package/app/.next/server/app/api/cloud/auth/route.js +1 -1
  123. package/app/.next/server/app/api/cloud/credentials/update/route.js +1 -1
  124. package/app/.next/server/app/api/cloud/model/resolve/route.js +1 -1
  125. package/app/.next/server/app/api/cloud/models/alias/route.js +1 -1
  126. package/app/.next/server/app/api/combos/[id]/route.js +1 -1
  127. package/app/.next/server/app/api/combos/route.js +1 -1
  128. package/app/.next/server/app/api/health/route.js +1 -1
  129. package/app/.next/server/app/api/init/route.js +1 -1
  130. package/app/.next/server/app/api/init/route.js.nft.json +1 -1
  131. package/app/.next/server/app/api/keys/[id]/route.js +1 -1
  132. package/app/.next/server/app/api/keys/route.js +1 -1
  133. package/app/.next/server/app/api/locale/route.js +1 -1
  134. package/app/.next/server/app/api/mcp/[plugin]/message/route.js +7 -0
  135. package/app/.next/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -0
  136. package/app/.next/server/app/api/mcp/[plugin]/message/route_client-reference-manifest.js +1 -0
  137. package/app/.next/server/app/api/mcp/[plugin]/sse/route.js +10 -0
  138. package/app/.next/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -0
  139. package/app/.next/server/app/api/mcp/[plugin]/sse/route_client-reference-manifest.js +1 -0
  140. package/app/.next/server/app/api/media-providers/tts/deepgram/voices/route.js +1 -1
  141. package/app/.next/server/app/api/media-providers/tts/elevenlabs/voices/route.js +1 -1
  142. package/app/.next/server/app/api/media-providers/tts/inworld/voices/route.js +1 -1
  143. package/app/.next/server/app/api/media-providers/tts/voices/route.js +1 -1
  144. package/app/.next/server/app/api/models/alias/route.js +1 -1
  145. package/app/.next/server/app/api/models/availability/route.js +1 -1
  146. package/app/.next/server/app/api/models/custom/route.js +1 -1
  147. package/app/.next/server/app/api/models/disabled/route.js +1 -1
  148. package/app/.next/server/app/api/models/route.js +1 -1
  149. package/app/.next/server/app/api/models/test/route.js +1 -1
  150. package/app/.next/server/app/api/oauth/[provider]/[action]/route.js +2 -2
  151. package/app/.next/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  152. package/app/.next/server/app/api/oauth/cursor/auto-import/route.js +2 -2
  153. package/app/.next/server/app/api/oauth/cursor/import/route.js +1 -1
  154. package/app/.next/server/app/api/oauth/gitlab/pat/route.js +1 -1
  155. package/app/.next/server/app/api/oauth/iflow/cookie/route.js +1 -1
  156. package/app/.next/server/app/api/oauth/kiro/auto-import/route.js +1 -1
  157. package/app/.next/server/app/api/oauth/kiro/import/route.js +1 -1
  158. package/app/.next/server/app/api/oauth/kiro/social-authorize/route.js +1 -1
  159. package/app/.next/server/app/api/oauth/kiro/social-exchange/route.js +1 -1
  160. package/app/.next/server/app/api/pricing/route.js +1 -1
  161. package/app/.next/server/app/api/provider-nodes/[id]/route.js +1 -1
  162. package/app/.next/server/app/api/provider-nodes/route.js +1 -1
  163. package/app/.next/server/app/api/provider-nodes/validate/route.js +1 -1
  164. package/app/.next/server/app/api/providers/[id]/models/route.js +1 -1
  165. package/app/.next/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  166. package/app/.next/server/app/api/providers/[id]/route.js +1 -1
  167. package/app/.next/server/app/api/providers/[id]/test/route.js +1 -1
  168. package/app/.next/server/app/api/providers/[id]/test-models/route.js +1 -1
  169. package/app/.next/server/app/api/providers/client/route.js +1 -1
  170. package/app/.next/server/app/api/providers/client/route.js.nft.json +1 -1
  171. package/app/.next/server/app/api/providers/kilo/free-models/route.js +1 -1
  172. package/app/.next/server/app/api/providers/route.js +1 -1
  173. package/app/.next/server/app/api/providers/suggested-models/route.js +1 -1
  174. package/app/.next/server/app/api/providers/test-batch/route.js +1 -1
  175. package/app/.next/server/app/api/providers/validate/route.js +1 -1
  176. package/app/.next/server/app/api/proxy-pools/[id]/route.js +1 -1
  177. package/app/.next/server/app/api/proxy-pools/[id]/test/route.js +1 -1
  178. package/app/.next/server/app/api/proxy-pools/route.js +1 -1
  179. package/app/.next/server/app/api/proxy-pools/vercel-deploy/route.js +2 -2
  180. package/app/.next/server/app/api/settings/database/route.js +1 -1
  181. package/app/.next/server/app/api/settings/proxy-test/route.js +1 -1
  182. package/app/.next/server/app/api/settings/require-login/route.js +1 -1
  183. package/app/.next/server/app/api/settings/route.js +1 -1
  184. package/app/.next/server/app/api/settings/route.js.nft.json +1 -1
  185. package/app/.next/server/app/api/shutdown/route.js +1 -1
  186. package/app/.next/server/app/api/tags/route.js +1 -1
  187. package/app/.next/server/app/api/translator/console-logs/route.js +1 -1
  188. package/app/.next/server/app/api/translator/console-logs/stream/route.js +2 -2
  189. package/app/.next/server/app/api/translator/load/route.js +1 -1
  190. package/app/.next/server/app/api/translator/save/route.js +1 -1
  191. package/app/.next/server/app/api/translator/send/route.js +1 -1
  192. package/app/.next/server/app/api/translator/send/route.js.nft.json +1 -1
  193. package/app/.next/server/app/api/translator/translate/route.js +1 -1
  194. package/app/.next/server/app/api/translator/translate/route.js.nft.json +1 -1
  195. package/app/.next/server/app/api/tunnel/disable/route.js +1 -1
  196. package/app/.next/server/app/api/tunnel/disable/route.js.nft.json +1 -1
  197. package/app/.next/server/app/api/tunnel/enable/route.js +1 -1
  198. package/app/.next/server/app/api/tunnel/enable/route.js.nft.json +1 -1
  199. package/app/.next/server/app/api/tunnel/status/route.js +1 -1
  200. package/app/.next/server/app/api/tunnel/status/route.js.nft.json +1 -1
  201. package/app/.next/server/app/api/tunnel/tailscale-check/route.js +1 -1
  202. package/app/.next/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
  203. package/app/.next/server/app/api/tunnel/tailscale-disable/route.js +1 -1
  204. package/app/.next/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
  205. package/app/.next/server/app/api/tunnel/tailscale-enable/route.js +1 -1
  206. package/app/.next/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
  207. package/app/.next/server/app/api/tunnel/tailscale-install/route.js +3 -3
  208. package/app/.next/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
  209. package/app/.next/server/app/api/tunnel/tailscale-login/route.js +1 -15
  210. package/app/.next/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
  211. package/app/.next/server/app/api/tunnel/tailscale-start-daemon/route.js +1 -1
  212. package/app/.next/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
  213. package/app/.next/server/app/api/usage/[connectionId]/route.js +1 -1
  214. package/app/.next/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  215. package/app/.next/server/app/api/usage/chart/route.js +1 -1
  216. package/app/.next/server/app/api/usage/history/route.js +1 -1
  217. package/app/.next/server/app/api/usage/providers/route.js +1 -1
  218. package/app/.next/server/app/api/usage/request-details/route.js +1 -1
  219. package/app/.next/server/app/api/usage/request-logs/route.js +1 -1
  220. package/app/.next/server/app/api/usage/stats/route.js +1 -1
  221. package/app/.next/server/app/api/usage/stream/route.js +2 -2
  222. package/app/.next/server/app/api/v1/api/chat/route.js +1 -1
  223. package/app/.next/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  224. package/app/.next/server/app/api/v1/audio/speech/route.js +1 -1
  225. package/app/.next/server/app/api/v1/audio/transcriptions/route.js +1 -1
  226. package/app/.next/server/app/api/v1/audio/voices/route.js +1 -1
  227. package/app/.next/server/app/api/v1/chat/completions/route.js +1 -1
  228. package/app/.next/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  229. package/app/.next/server/app/api/v1/embeddings/route.js +1 -1
  230. package/app/.next/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  231. package/app/.next/server/app/api/v1/images/generations/route.js +2 -2
  232. package/app/.next/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  233. package/app/.next/server/app/api/v1/messages/count_tokens/route.js +1 -1
  234. package/app/.next/server/app/api/v1/messages/route.js +1 -1
  235. package/app/.next/server/app/api/v1/messages/route.js.nft.json +1 -1
  236. package/app/.next/server/app/api/v1/models/[kind]/route.js +1 -1
  237. package/app/.next/server/app/api/v1/models/info/route.js +1 -1
  238. package/app/.next/server/app/api/v1/models/route.js +1 -1
  239. package/app/.next/server/app/api/v1/responses/compact/route.js +1 -1
  240. package/app/.next/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  241. package/app/.next/server/app/api/v1/responses/route.js +1 -1
  242. package/app/.next/server/app/api/v1/responses/route.js.nft.json +1 -1
  243. package/app/.next/server/app/api/v1/route.js +1 -1
  244. package/app/.next/server/app/api/v1/search/route.js +1 -1
  245. package/app/.next/server/app/api/v1/search/route.js.nft.json +1 -1
  246. package/app/.next/server/app/api/v1/web/fetch/route.js +1 -1
  247. package/app/.next/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
  248. package/app/.next/server/app/api/v1beta/models/[...path]/route.js +1 -1
  249. package/app/.next/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  250. package/app/.next/server/app/api/v1beta/models/route.js +1 -1
  251. package/app/.next/server/app/api/version/route.js +1 -1
  252. package/app/.next/server/app/api/version/shutdown/route.js +1 -1
  253. package/app/.next/server/app/api/version/update/route.js +1 -1
  254. package/app/.next/server/app/callback/page.js +2 -2
  255. package/app/.next/server/app/callback/page.js.nft.json +1 -1
  256. package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  257. package/app/.next/server/app/callback.html +1 -1
  258. package/app/.next/server/app/callback.rsc +5 -5
  259. package/app/.next/server/app/callback.segments/_full.segment.rsc +5 -5
  260. package/app/.next/server/app/callback.segments/_head.segment.rsc +1 -1
  261. package/app/.next/server/app/callback.segments/_index.segment.rsc +4 -4
  262. package/app/.next/server/app/callback.segments/_tree.segment.rsc +2 -2
  263. package/app/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +2 -2
  264. package/app/.next/server/app/callback.segments/callback.segment.rsc +1 -1
  265. package/app/.next/server/app/dashboard/basic-chat.html +1 -1
  266. package/app/.next/server/app/dashboard/basic-chat.rsc +6 -6
  267. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  268. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  269. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  270. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  271. package/app/.next/server/app/dashboard/basic-chat.segments/_full.segment.rsc +6 -6
  272. package/app/.next/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  273. package/app/.next/server/app/dashboard/basic-chat.segments/_index.segment.rsc +4 -4
  274. package/app/.next/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
  275. package/app/.next/server/app/dashboard/cli-tools.html +1 -1
  276. package/app/.next/server/app/dashboard/cli-tools.rsc +6 -6
  277. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  278. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  279. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  280. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  281. package/app/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +6 -6
  282. package/app/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  283. package/app/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +4 -4
  284. package/app/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
  285. package/app/.next/server/app/dashboard/combos.html +1 -1
  286. package/app/.next/server/app/dashboard/combos.rsc +6 -6
  287. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  288. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  289. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  290. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  291. package/app/.next/server/app/dashboard/combos.segments/_full.segment.rsc +6 -6
  292. package/app/.next/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  293. package/app/.next/server/app/dashboard/combos.segments/_index.segment.rsc +4 -4
  294. package/app/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
  295. package/app/.next/server/app/dashboard/endpoint.html +1 -1
  296. package/app/.next/server/app/dashboard/endpoint.rsc +6 -6
  297. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  298. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  299. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  300. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  301. package/app/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +6 -6
  302. package/app/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  303. package/app/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +4 -4
  304. package/app/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
  305. package/app/.next/server/app/dashboard/media-providers/web.html +1 -1
  306. package/app/.next/server/app/dashboard/media-providers/web.rsc +6 -6
  307. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  308. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  309. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  310. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  311. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  312. package/app/.next/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +6 -6
  313. package/app/.next/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  314. package/app/.next/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +4 -4
  315. package/app/.next/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +2 -2
  316. package/app/.next/server/app/dashboard/mitm.html +1 -1
  317. package/app/.next/server/app/dashboard/mitm.rsc +6 -6
  318. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  319. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  320. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  321. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  322. package/app/.next/server/app/dashboard/mitm.segments/_full.segment.rsc +6 -6
  323. package/app/.next/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  324. package/app/.next/server/app/dashboard/mitm.segments/_index.segment.rsc +4 -4
  325. package/app/.next/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
  326. package/app/.next/server/app/dashboard/profile.html +1 -1
  327. package/app/.next/server/app/dashboard/profile.rsc +6 -6
  328. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  329. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  330. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  331. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  332. package/app/.next/server/app/dashboard/profile.segments/_full.segment.rsc +6 -6
  333. package/app/.next/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  334. package/app/.next/server/app/dashboard/profile.segments/_index.segment.rsc +4 -4
  335. package/app/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
  336. package/app/.next/server/app/dashboard/providers/new.html +1 -1
  337. package/app/.next/server/app/dashboard/providers/new.rsc +6 -6
  338. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  339. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  340. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  341. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  342. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  343. package/app/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +6 -6
  344. package/app/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  345. package/app/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +4 -4
  346. package/app/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
  347. package/app/.next/server/app/dashboard/providers.html +1 -1
  348. package/app/.next/server/app/dashboard/providers.rsc +6 -6
  349. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  350. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  351. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  352. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  353. package/app/.next/server/app/dashboard/providers.segments/_full.segment.rsc +6 -6
  354. package/app/.next/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  355. package/app/.next/server/app/dashboard/providers.segments/_index.segment.rsc +4 -4
  356. package/app/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
  357. package/app/.next/server/app/dashboard/proxy-pools.html +1 -1
  358. package/app/.next/server/app/dashboard/proxy-pools.rsc +6 -6
  359. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  360. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  361. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  362. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  363. package/app/.next/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +6 -6
  364. package/app/.next/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  365. package/app/.next/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +4 -4
  366. package/app/.next/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
  367. package/app/.next/server/app/dashboard/quota.html +2 -2
  368. package/app/.next/server/app/dashboard/quota.rsc +7 -7
  369. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  370. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  371. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  372. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  373. package/app/.next/server/app/dashboard/quota.segments/_full.segment.rsc +7 -7
  374. package/app/.next/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  375. package/app/.next/server/app/dashboard/quota.segments/_index.segment.rsc +4 -4
  376. package/app/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
  377. package/app/.next/server/app/dashboard/settings/pricing/page.js +2 -2
  378. package/app/.next/server/app/dashboard/settings/pricing/page.js.nft.json +1 -1
  379. package/app/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  380. package/app/.next/server/app/dashboard/settings/pricing.html +1 -1
  381. package/app/.next/server/app/dashboard/settings/pricing.rsc +4 -4
  382. package/app/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +4 -4
  383. package/app/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  384. package/app/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +4 -4
  385. package/app/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
  386. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  387. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  388. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  389. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  390. package/app/.next/server/app/dashboard/skills.html +1 -1
  391. package/app/.next/server/app/dashboard/skills.rsc +6 -6
  392. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +2 -2
  393. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills.segment.rsc +1 -1
  394. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  395. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  396. package/app/.next/server/app/dashboard/skills.segments/_full.segment.rsc +6 -6
  397. package/app/.next/server/app/dashboard/skills.segments/_head.segment.rsc +1 -1
  398. package/app/.next/server/app/dashboard/skills.segments/_index.segment.rsc +4 -4
  399. package/app/.next/server/app/dashboard/skills.segments/_tree.segment.rsc +2 -2
  400. package/app/.next/server/app/dashboard/translator.html +1 -1
  401. package/app/.next/server/app/dashboard/translator.rsc +6 -6
  402. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  403. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  404. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  405. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  406. package/app/.next/server/app/dashboard/translator.segments/_full.segment.rsc +6 -6
  407. package/app/.next/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  408. package/app/.next/server/app/dashboard/translator.segments/_index.segment.rsc +4 -4
  409. package/app/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
  410. package/app/.next/server/app/dashboard/usage.html +1 -1
  411. package/app/.next/server/app/dashboard/usage.rsc +6 -6
  412. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  413. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  414. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  415. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  416. package/app/.next/server/app/dashboard/usage.segments/_full.segment.rsc +6 -6
  417. package/app/.next/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  418. package/app/.next/server/app/dashboard/usage.segments/_index.segment.rsc +4 -4
  419. package/app/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
  420. package/app/.next/server/app/dashboard.html +1 -1
  421. package/app/.next/server/app/dashboard.rsc +6 -6
  422. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  423. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  424. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  425. package/app/.next/server/app/dashboard.segments/_full.segment.rsc +6 -6
  426. package/app/.next/server/app/dashboard.segments/_head.segment.rsc +1 -1
  427. package/app/.next/server/app/dashboard.segments/_index.segment.rsc +4 -4
  428. package/app/.next/server/app/dashboard.segments/_tree.segment.rsc +2 -2
  429. package/app/.next/server/app/favicon.ico/route.js +1 -1
  430. package/app/.next/server/app/index.html +1 -1
  431. package/app/.next/server/app/index.rsc +4 -4
  432. package/app/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  433. package/app/.next/server/app/index.segments/_full.segment.rsc +4 -4
  434. package/app/.next/server/app/index.segments/_head.segment.rsc +1 -1
  435. package/app/.next/server/app/index.segments/_index.segment.rsc +4 -4
  436. package/app/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  437. package/app/.next/server/app/landing/page.js +2 -2
  438. package/app/.next/server/app/landing/page.js.nft.json +1 -1
  439. package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  440. package/app/.next/server/app/landing.html +1 -1
  441. package/app/.next/server/app/landing.rsc +4 -4
  442. package/app/.next/server/app/landing.segments/_full.segment.rsc +4 -4
  443. package/app/.next/server/app/landing.segments/_head.segment.rsc +1 -1
  444. package/app/.next/server/app/landing.segments/_index.segment.rsc +4 -4
  445. package/app/.next/server/app/landing.segments/_tree.segment.rsc +2 -2
  446. package/app/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  447. package/app/.next/server/app/landing.segments/landing.segment.rsc +1 -1
  448. package/app/.next/server/app/login/page.js +2 -2
  449. package/app/.next/server/app/login/page.js.nft.json +1 -1
  450. package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
  451. package/app/.next/server/app/login.html +1 -1
  452. package/app/.next/server/app/login.rsc +5 -5
  453. package/app/.next/server/app/login.segments/_full.segment.rsc +5 -5
  454. package/app/.next/server/app/login.segments/_head.segment.rsc +1 -1
  455. package/app/.next/server/app/login.segments/_index.segment.rsc +4 -4
  456. package/app/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  457. package/app/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  458. package/app/.next/server/app/login.segments/login.segment.rsc +1 -1
  459. package/app/.next/server/app/manifest.webmanifest/route.js +2 -2
  460. package/app/.next/server/app/page.js +2 -2
  461. package/app/.next/server/app/page.js.nft.json +1 -1
  462. package/app/.next/server/app/page_client-reference-manifest.js +1 -1
  463. package/app/.next/server/app-paths-manifest.json +16 -10
  464. package/app/.next/server/chunks/1578.js +1 -1
  465. package/app/.next/server/chunks/1795.js +1 -1
  466. package/app/.next/server/chunks/2035.js +17 -1
  467. package/app/.next/server/chunks/2701.js +1 -0
  468. package/app/.next/server/chunks/3666.js +1 -0
  469. package/app/.next/server/chunks/3774.js +2 -2
  470. package/app/.next/server/chunks/450.js +5 -5
  471. package/app/.next/server/chunks/4723.js +1 -0
  472. package/app/.next/server/chunks/514.js +38 -18
  473. package/app/.next/server/chunks/6263.js +2 -2
  474. package/app/.next/server/chunks/6283.js +1 -1
  475. package/app/.next/server/chunks/6288.js +1 -1
  476. package/app/.next/server/chunks/6379.js +2 -2
  477. package/app/.next/server/chunks/6634.js +7 -0
  478. package/app/.next/server/chunks/7417.js +1 -0
  479. package/app/.next/server/chunks/7686.js +1 -1
  480. package/app/.next/server/chunks/7973.js +1 -1
  481. package/app/.next/server/chunks/8012.js +15 -0
  482. package/app/.next/server/chunks/8035.js +1 -1
  483. package/app/.next/server/chunks/8202.js +2 -2
  484. package/app/.next/server/chunks/8647.js +1 -1
  485. package/app/.next/server/chunks/9737.js +1 -1
  486. package/app/.next/server/functions-config-manifest.json +2 -0
  487. package/app/.next/server/middleware-build-manifest.js +1 -1
  488. package/app/.next/server/middleware.js +6 -6
  489. package/app/.next/server/pages/404.html +1 -1
  490. package/app/.next/server/pages/500.html +1 -1
  491. package/app/.next/static/chunks/4156-c8bd7124d8219ccc.js +7 -0
  492. package/app/.next/static/chunks/505-b06cfc156450639a.js +1 -0
  493. package/app/.next/static/chunks/5810-9924ce14d1c08095.js +39 -0
  494. package/app/.next/static/chunks/app/(dashboard)/dashboard/basic-chat/page-03929d42abde11dc.js +1 -0
  495. package/app/.next/static/chunks/app/(dashboard)/dashboard/cli-tools/{page-5bfce2cfa6f14e2c.js → page-c59d764c4311535a.js} +1 -1
  496. package/app/.next/static/chunks/app/(dashboard)/dashboard/profile/page-3582cb03c9ef5dd8.js +1 -0
  497. package/app/.next/static/chunks/app/(dashboard)/dashboard/providers/page-4cb14309c0658008.js +1 -0
  498. package/app/.next/static/chunks/app/(dashboard)/dashboard/usage/page-5c83526aa571f533.js +1 -0
  499. package/app/.next/static/chunks/app/_global-error/page-42ea861e9cbd3f66.js +1 -0
  500. package/app/.next/static/chunks/app/api/auth/login/route-42ea861e9cbd3f66.js +1 -0
  501. package/app/.next/static/chunks/app/api/auth/logout/route-42ea861e9cbd3f66.js +1 -0
  502. package/app/.next/static/chunks/app/api/auth/oidc/callback/route-42ea861e9cbd3f66.js +1 -0
  503. package/app/.next/static/chunks/app/api/auth/oidc/start/route-42ea861e9cbd3f66.js +1 -0
  504. package/app/.next/static/chunks/app/api/auth/oidc/test/route-42ea861e9cbd3f66.js +1 -0
  505. package/app/.next/static/chunks/app/api/auth/status/route-42ea861e9cbd3f66.js +1 -0
  506. package/app/.next/static/chunks/app/api/cli-tools/all-statuses/route-42ea861e9cbd3f66.js +1 -0
  507. package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-42ea861e9cbd3f66.js +1 -0
  508. package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/route-42ea861e9cbd3f66.js +1 -0
  509. package/app/.next/static/chunks/app/api/cli-tools/claude-settings/route-42ea861e9cbd3f66.js +1 -0
  510. package/app/.next/static/chunks/app/api/cli-tools/cline-settings/route-42ea861e9cbd3f66.js +1 -0
  511. package/app/.next/static/chunks/app/api/cli-tools/codex-settings/route-42ea861e9cbd3f66.js +1 -0
  512. package/app/.next/static/chunks/app/api/cli-tools/copilot-settings/route-42ea861e9cbd3f66.js +1 -0
  513. package/app/.next/static/chunks/app/api/cli-tools/cowork-mcp-registry/route-42ea861e9cbd3f66.js +1 -0
  514. package/app/.next/static/chunks/app/api/cli-tools/cowork-mcp-tools/route-42ea861e9cbd3f66.js +1 -0
  515. package/app/.next/static/chunks/app/api/cli-tools/cowork-settings/route-42ea861e9cbd3f66.js +1 -0
  516. package/app/.next/static/chunks/app/api/cli-tools/droid-settings/route-42ea861e9cbd3f66.js +1 -0
  517. package/app/.next/static/chunks/app/api/cli-tools/hermes-settings/route-42ea861e9cbd3f66.js +1 -0
  518. package/app/.next/static/chunks/app/api/cli-tools/kilo-settings/route-42ea861e9cbd3f66.js +1 -0
  519. package/app/.next/static/chunks/app/api/cli-tools/openclaw-settings/route-42ea861e9cbd3f66.js +1 -0
  520. package/app/.next/static/chunks/app/api/cli-tools/opencode-settings/route-42ea861e9cbd3f66.js +1 -0
  521. package/app/.next/static/chunks/app/api/cloud/auth/route-42ea861e9cbd3f66.js +1 -0
  522. package/app/.next/static/chunks/app/api/cloud/credentials/update/route-42ea861e9cbd3f66.js +1 -0
  523. package/app/.next/static/chunks/app/api/cloud/model/resolve/route-42ea861e9cbd3f66.js +1 -0
  524. package/app/.next/static/chunks/app/api/cloud/models/alias/route-42ea861e9cbd3f66.js +1 -0
  525. package/app/.next/static/chunks/app/api/combos/[id]/route-42ea861e9cbd3f66.js +1 -0
  526. package/app/.next/static/chunks/app/api/combos/route-42ea861e9cbd3f66.js +1 -0
  527. package/app/.next/static/chunks/app/api/health/route-42ea861e9cbd3f66.js +1 -0
  528. package/app/.next/static/chunks/app/api/init/route-42ea861e9cbd3f66.js +1 -0
  529. package/app/.next/static/chunks/app/api/keys/[id]/route-42ea861e9cbd3f66.js +1 -0
  530. package/app/.next/static/chunks/app/api/keys/route-42ea861e9cbd3f66.js +1 -0
  531. package/app/.next/static/chunks/app/api/locale/route-42ea861e9cbd3f66.js +1 -0
  532. package/app/.next/static/chunks/app/api/mcp/[plugin]/message/route-42ea861e9cbd3f66.js +1 -0
  533. package/app/.next/static/chunks/app/api/mcp/[plugin]/sse/route-42ea861e9cbd3f66.js +1 -0
  534. package/app/.next/static/chunks/app/api/media-providers/tts/deepgram/voices/route-42ea861e9cbd3f66.js +1 -0
  535. package/app/.next/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-42ea861e9cbd3f66.js +1 -0
  536. package/app/.next/static/chunks/app/api/media-providers/tts/inworld/voices/route-42ea861e9cbd3f66.js +1 -0
  537. package/app/.next/static/chunks/app/api/media-providers/tts/voices/route-42ea861e9cbd3f66.js +1 -0
  538. package/app/.next/static/chunks/app/api/models/alias/route-42ea861e9cbd3f66.js +1 -0
  539. package/app/.next/static/chunks/app/api/models/availability/route-42ea861e9cbd3f66.js +1 -0
  540. package/app/.next/static/chunks/app/api/models/custom/route-42ea861e9cbd3f66.js +1 -0
  541. package/app/.next/static/chunks/app/api/models/disabled/route-42ea861e9cbd3f66.js +1 -0
  542. package/app/.next/static/chunks/app/api/models/route-42ea861e9cbd3f66.js +1 -0
  543. package/app/.next/static/chunks/app/api/models/test/route-42ea861e9cbd3f66.js +1 -0
  544. package/app/.next/static/chunks/app/api/oauth/[provider]/[action]/route-42ea861e9cbd3f66.js +1 -0
  545. package/app/.next/static/chunks/app/api/oauth/cursor/auto-import/route-42ea861e9cbd3f66.js +1 -0
  546. package/app/.next/static/chunks/app/api/oauth/cursor/import/route-42ea861e9cbd3f66.js +1 -0
  547. package/app/.next/static/chunks/app/api/oauth/gitlab/pat/route-42ea861e9cbd3f66.js +1 -0
  548. package/app/.next/static/chunks/app/api/oauth/iflow/cookie/route-42ea861e9cbd3f66.js +1 -0
  549. package/app/.next/static/chunks/app/api/oauth/kiro/auto-import/route-42ea861e9cbd3f66.js +1 -0
  550. package/app/.next/static/chunks/app/api/oauth/kiro/import/route-42ea861e9cbd3f66.js +1 -0
  551. package/app/.next/static/chunks/app/api/oauth/kiro/social-authorize/route-42ea861e9cbd3f66.js +1 -0
  552. package/app/.next/static/chunks/app/api/oauth/kiro/social-exchange/route-42ea861e9cbd3f66.js +1 -0
  553. package/app/.next/static/chunks/app/api/pricing/route-42ea861e9cbd3f66.js +1 -0
  554. package/app/.next/static/chunks/app/api/provider-nodes/[id]/route-42ea861e9cbd3f66.js +1 -0
  555. package/app/.next/static/chunks/app/api/provider-nodes/route-42ea861e9cbd3f66.js +1 -0
  556. package/app/.next/static/chunks/app/api/provider-nodes/validate/route-42ea861e9cbd3f66.js +1 -0
  557. package/app/.next/static/chunks/app/api/providers/[id]/models/route-42ea861e9cbd3f66.js +1 -0
  558. package/app/.next/static/chunks/app/api/providers/[id]/route-42ea861e9cbd3f66.js +1 -0
  559. package/app/.next/static/chunks/app/api/providers/[id]/test/route-42ea861e9cbd3f66.js +1 -0
  560. package/app/.next/static/chunks/app/api/providers/[id]/test-models/route-42ea861e9cbd3f66.js +1 -0
  561. package/app/.next/static/chunks/app/api/providers/client/route-42ea861e9cbd3f66.js +1 -0
  562. package/app/.next/static/chunks/app/api/providers/kilo/free-models/route-42ea861e9cbd3f66.js +1 -0
  563. package/app/.next/static/chunks/app/api/providers/route-42ea861e9cbd3f66.js +1 -0
  564. package/app/.next/static/chunks/app/api/providers/suggested-models/route-42ea861e9cbd3f66.js +1 -0
  565. package/app/.next/static/chunks/app/api/providers/test-batch/route-42ea861e9cbd3f66.js +1 -0
  566. package/app/.next/static/chunks/app/api/providers/validate/route-42ea861e9cbd3f66.js +1 -0
  567. package/app/.next/static/chunks/app/api/proxy-pools/[id]/route-42ea861e9cbd3f66.js +1 -0
  568. package/app/.next/static/chunks/app/api/proxy-pools/[id]/test/route-42ea861e9cbd3f66.js +1 -0
  569. package/app/.next/static/chunks/app/api/proxy-pools/route-42ea861e9cbd3f66.js +1 -0
  570. package/app/.next/static/chunks/app/api/proxy-pools/vercel-deploy/route-42ea861e9cbd3f66.js +1 -0
  571. package/app/.next/static/chunks/app/api/settings/database/route-42ea861e9cbd3f66.js +1 -0
  572. package/app/.next/static/chunks/app/api/settings/proxy-test/route-42ea861e9cbd3f66.js +1 -0
  573. package/app/.next/static/chunks/app/api/settings/require-login/route-42ea861e9cbd3f66.js +1 -0
  574. package/app/.next/static/chunks/app/api/settings/route-42ea861e9cbd3f66.js +1 -0
  575. package/app/.next/static/chunks/app/api/shutdown/route-42ea861e9cbd3f66.js +1 -0
  576. package/app/.next/static/chunks/app/api/tags/route-42ea861e9cbd3f66.js +1 -0
  577. package/app/.next/static/chunks/app/api/translator/console-logs/route-42ea861e9cbd3f66.js +1 -0
  578. package/app/.next/static/chunks/app/api/translator/console-logs/stream/route-42ea861e9cbd3f66.js +1 -0
  579. package/app/.next/static/chunks/app/api/translator/load/route-42ea861e9cbd3f66.js +1 -0
  580. package/app/.next/static/chunks/app/api/translator/save/route-42ea861e9cbd3f66.js +1 -0
  581. package/app/.next/static/chunks/app/api/translator/send/route-42ea861e9cbd3f66.js +1 -0
  582. package/app/.next/static/chunks/app/api/translator/translate/route-42ea861e9cbd3f66.js +1 -0
  583. package/app/.next/static/chunks/app/api/tunnel/disable/route-42ea861e9cbd3f66.js +1 -0
  584. package/app/.next/static/chunks/app/api/tunnel/enable/route-42ea861e9cbd3f66.js +1 -0
  585. package/app/.next/static/chunks/app/api/tunnel/status/route-42ea861e9cbd3f66.js +1 -0
  586. package/app/.next/static/chunks/app/api/tunnel/tailscale-check/route-42ea861e9cbd3f66.js +1 -0
  587. package/app/.next/static/chunks/app/api/tunnel/tailscale-disable/route-42ea861e9cbd3f66.js +1 -0
  588. package/app/.next/static/chunks/app/api/tunnel/tailscale-enable/route-42ea861e9cbd3f66.js +1 -0
  589. package/app/.next/static/chunks/app/api/tunnel/tailscale-install/route-42ea861e9cbd3f66.js +1 -0
  590. package/app/.next/static/chunks/app/api/tunnel/tailscale-login/route-42ea861e9cbd3f66.js +1 -0
  591. package/app/.next/static/chunks/app/api/tunnel/tailscale-start-daemon/route-42ea861e9cbd3f66.js +1 -0
  592. package/app/.next/static/chunks/app/api/usage/[connectionId]/route-42ea861e9cbd3f66.js +1 -0
  593. package/app/.next/static/chunks/app/api/usage/chart/route-42ea861e9cbd3f66.js +1 -0
  594. package/app/.next/static/chunks/app/api/usage/history/route-42ea861e9cbd3f66.js +1 -0
  595. package/app/.next/static/chunks/app/api/usage/providers/route-42ea861e9cbd3f66.js +1 -0
  596. package/app/.next/static/chunks/app/api/usage/request-details/route-42ea861e9cbd3f66.js +1 -0
  597. package/app/.next/static/chunks/app/api/usage/request-logs/route-42ea861e9cbd3f66.js +1 -0
  598. package/app/.next/static/chunks/app/api/usage/stats/route-42ea861e9cbd3f66.js +1 -0
  599. package/app/.next/static/chunks/app/api/usage/stream/route-42ea861e9cbd3f66.js +1 -0
  600. package/app/.next/static/chunks/app/api/v1/api/chat/route-42ea861e9cbd3f66.js +1 -0
  601. package/app/.next/static/chunks/app/api/v1/audio/speech/route-42ea861e9cbd3f66.js +1 -0
  602. package/app/.next/static/chunks/app/api/v1/audio/transcriptions/route-42ea861e9cbd3f66.js +1 -0
  603. package/app/.next/static/chunks/app/api/v1/audio/voices/route-42ea861e9cbd3f66.js +1 -0
  604. package/app/.next/static/chunks/app/api/v1/chat/completions/route-42ea861e9cbd3f66.js +1 -0
  605. package/app/.next/static/chunks/app/api/v1/embeddings/route-42ea861e9cbd3f66.js +1 -0
  606. package/app/.next/static/chunks/app/api/v1/images/generations/route-42ea861e9cbd3f66.js +1 -0
  607. package/app/.next/static/chunks/app/api/v1/messages/count_tokens/route-42ea861e9cbd3f66.js +1 -0
  608. package/app/.next/static/chunks/app/api/v1/messages/route-42ea861e9cbd3f66.js +1 -0
  609. package/app/.next/static/chunks/app/api/v1/models/[kind]/route-42ea861e9cbd3f66.js +1 -0
  610. package/app/.next/static/chunks/app/api/v1/models/info/route-42ea861e9cbd3f66.js +1 -0
  611. package/app/.next/static/chunks/app/api/v1/models/route-42ea861e9cbd3f66.js +1 -0
  612. package/app/.next/static/chunks/app/api/v1/responses/compact/route-42ea861e9cbd3f66.js +1 -0
  613. package/app/.next/static/chunks/app/api/v1/responses/route-42ea861e9cbd3f66.js +1 -0
  614. package/app/.next/static/chunks/app/api/v1/route-42ea861e9cbd3f66.js +1 -0
  615. package/app/.next/static/chunks/app/api/v1/search/route-42ea861e9cbd3f66.js +1 -0
  616. package/app/.next/static/chunks/app/api/v1/web/fetch/route-42ea861e9cbd3f66.js +1 -0
  617. package/app/.next/static/chunks/app/api/v1beta/models/[...path]/route-42ea861e9cbd3f66.js +1 -0
  618. package/app/.next/static/chunks/app/api/v1beta/models/route-42ea861e9cbd3f66.js +1 -0
  619. package/app/.next/static/chunks/app/api/version/route-42ea861e9cbd3f66.js +1 -0
  620. package/app/.next/static/chunks/app/api/version/shutdown/route-42ea861e9cbd3f66.js +1 -0
  621. package/app/.next/static/chunks/app/api/version/update/route-42ea861e9cbd3f66.js +1 -0
  622. package/app/.next/static/chunks/app/callback/page-6ea4675be396cdb5.js +1 -0
  623. package/app/.next/static/chunks/app/login/page-dc885cca61893e2a.js +1 -0
  624. package/app/.next/static/chunks/app/manifest.webmanifest/route-42ea861e9cbd3f66.js +1 -0
  625. package/app/.next/static/chunks/app/page-42ea861e9cbd3f66.js +1 -0
  626. package/app/.next/static/chunks/next/dist/client/components/builtin/app-error-42ea861e9cbd3f66.js +1 -0
  627. package/app/.next/static/chunks/next/dist/client/components/builtin/forbidden-42ea861e9cbd3f66.js +1 -0
  628. package/app/.next/static/chunks/next/dist/client/components/builtin/not-found-42ea861e9cbd3f66.js +1 -0
  629. package/app/.next/static/chunks/next/dist/client/components/builtin/unauthorized-42ea861e9cbd3f66.js +1 -0
  630. package/app/.next/static/css/a6ccc343d8389dcd.css +1 -0
  631. package/app/.next/static/xilRJjRhqJhUZ2VStWKZh/_buildManifest.js +1 -0
  632. package/app/package.json +1 -1
  633. package/app/server.js +1 -1
  634. package/app/src/mitm/server.js +22 -22
  635. package/cli.js +4 -0
  636. package/hooks/postinstall.js +7 -0
  637. package/hooks/trayRuntime.js +84 -0
  638. package/package.json +3 -3
  639. package/src/cli/menus/settings.js +33 -0
  640. package/src/cli/tray/tray.js +136 -104
  641. package/src/cli/tray/tray.ps1 +79 -0
  642. package/src/cli/tray/trayWin.js +89 -0
  643. package/app/.next/server/chunks/4839.js +0 -1
  644. package/app/.next/server/chunks/523.js +0 -1
  645. package/app/.next/server/chunks/7690.js +0 -1
  646. package/app/.next/static/chunks/4156-3a7b60c65001de9a.js +0 -7
  647. package/app/.next/static/chunks/505-990698fbfcc0d04a.js +0 -1
  648. package/app/.next/static/chunks/5810-bd2e4da0ce1402e5.js +0 -23
  649. package/app/.next/static/chunks/app/(dashboard)/dashboard/basic-chat/page-39cd0425e50727ce.js +0 -1
  650. package/app/.next/static/chunks/app/(dashboard)/dashboard/profile/page-d632fe470928df04.js +0 -1
  651. package/app/.next/static/chunks/app/(dashboard)/dashboard/providers/page-4e03960f4d7085d8.js +0 -1
  652. package/app/.next/static/chunks/app/(dashboard)/dashboard/usage/page-92b9dd8c50ab5e50.js +0 -1
  653. package/app/.next/static/chunks/app/_global-error/page-84de94ffd1225dd4.js +0 -1
  654. package/app/.next/static/chunks/app/api/auth/login/route-84de94ffd1225dd4.js +0 -1
  655. package/app/.next/static/chunks/app/api/auth/logout/route-84de94ffd1225dd4.js +0 -1
  656. package/app/.next/static/chunks/app/api/cli-tools/all-statuses/route-84de94ffd1225dd4.js +0 -1
  657. package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-84de94ffd1225dd4.js +0 -1
  658. package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/route-84de94ffd1225dd4.js +0 -1
  659. package/app/.next/static/chunks/app/api/cli-tools/claude-settings/route-84de94ffd1225dd4.js +0 -1
  660. package/app/.next/static/chunks/app/api/cli-tools/cline-settings/route-84de94ffd1225dd4.js +0 -1
  661. package/app/.next/static/chunks/app/api/cli-tools/codex-settings/route-84de94ffd1225dd4.js +0 -1
  662. package/app/.next/static/chunks/app/api/cli-tools/copilot-settings/route-84de94ffd1225dd4.js +0 -1
  663. package/app/.next/static/chunks/app/api/cli-tools/cowork-mcp-registry/route-84de94ffd1225dd4.js +0 -1
  664. package/app/.next/static/chunks/app/api/cli-tools/cowork-mcp-tools/route-84de94ffd1225dd4.js +0 -1
  665. package/app/.next/static/chunks/app/api/cli-tools/cowork-settings/route-84de94ffd1225dd4.js +0 -1
  666. package/app/.next/static/chunks/app/api/cli-tools/droid-settings/route-84de94ffd1225dd4.js +0 -1
  667. package/app/.next/static/chunks/app/api/cli-tools/hermes-settings/route-84de94ffd1225dd4.js +0 -1
  668. package/app/.next/static/chunks/app/api/cli-tools/kilo-settings/route-84de94ffd1225dd4.js +0 -1
  669. package/app/.next/static/chunks/app/api/cli-tools/openclaw-settings/route-84de94ffd1225dd4.js +0 -1
  670. package/app/.next/static/chunks/app/api/cli-tools/opencode-settings/route-84de94ffd1225dd4.js +0 -1
  671. package/app/.next/static/chunks/app/api/cloud/auth/route-84de94ffd1225dd4.js +0 -1
  672. package/app/.next/static/chunks/app/api/cloud/credentials/update/route-84de94ffd1225dd4.js +0 -1
  673. package/app/.next/static/chunks/app/api/cloud/model/resolve/route-84de94ffd1225dd4.js +0 -1
  674. package/app/.next/static/chunks/app/api/cloud/models/alias/route-84de94ffd1225dd4.js +0 -1
  675. package/app/.next/static/chunks/app/api/combos/[id]/route-84de94ffd1225dd4.js +0 -1
  676. package/app/.next/static/chunks/app/api/combos/route-84de94ffd1225dd4.js +0 -1
  677. package/app/.next/static/chunks/app/api/health/route-84de94ffd1225dd4.js +0 -1
  678. package/app/.next/static/chunks/app/api/init/route-84de94ffd1225dd4.js +0 -1
  679. package/app/.next/static/chunks/app/api/keys/[id]/route-84de94ffd1225dd4.js +0 -1
  680. package/app/.next/static/chunks/app/api/keys/route-84de94ffd1225dd4.js +0 -1
  681. package/app/.next/static/chunks/app/api/locale/route-84de94ffd1225dd4.js +0 -1
  682. package/app/.next/static/chunks/app/api/media-providers/tts/deepgram/voices/route-84de94ffd1225dd4.js +0 -1
  683. package/app/.next/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-84de94ffd1225dd4.js +0 -1
  684. package/app/.next/static/chunks/app/api/media-providers/tts/inworld/voices/route-84de94ffd1225dd4.js +0 -1
  685. package/app/.next/static/chunks/app/api/media-providers/tts/voices/route-84de94ffd1225dd4.js +0 -1
  686. package/app/.next/static/chunks/app/api/models/alias/route-84de94ffd1225dd4.js +0 -1
  687. package/app/.next/static/chunks/app/api/models/availability/route-84de94ffd1225dd4.js +0 -1
  688. package/app/.next/static/chunks/app/api/models/custom/route-84de94ffd1225dd4.js +0 -1
  689. package/app/.next/static/chunks/app/api/models/disabled/route-84de94ffd1225dd4.js +0 -1
  690. package/app/.next/static/chunks/app/api/models/route-84de94ffd1225dd4.js +0 -1
  691. package/app/.next/static/chunks/app/api/models/test/route-84de94ffd1225dd4.js +0 -1
  692. package/app/.next/static/chunks/app/api/oauth/[provider]/[action]/route-84de94ffd1225dd4.js +0 -1
  693. package/app/.next/static/chunks/app/api/oauth/cursor/auto-import/route-84de94ffd1225dd4.js +0 -1
  694. package/app/.next/static/chunks/app/api/oauth/cursor/import/route-84de94ffd1225dd4.js +0 -1
  695. package/app/.next/static/chunks/app/api/oauth/gitlab/pat/route-84de94ffd1225dd4.js +0 -1
  696. package/app/.next/static/chunks/app/api/oauth/iflow/cookie/route-84de94ffd1225dd4.js +0 -1
  697. package/app/.next/static/chunks/app/api/oauth/kiro/auto-import/route-84de94ffd1225dd4.js +0 -1
  698. package/app/.next/static/chunks/app/api/oauth/kiro/import/route-84de94ffd1225dd4.js +0 -1
  699. package/app/.next/static/chunks/app/api/oauth/kiro/social-authorize/route-84de94ffd1225dd4.js +0 -1
  700. package/app/.next/static/chunks/app/api/oauth/kiro/social-exchange/route-84de94ffd1225dd4.js +0 -1
  701. package/app/.next/static/chunks/app/api/pricing/route-84de94ffd1225dd4.js +0 -1
  702. package/app/.next/static/chunks/app/api/provider-nodes/[id]/route-84de94ffd1225dd4.js +0 -1
  703. package/app/.next/static/chunks/app/api/provider-nodes/route-84de94ffd1225dd4.js +0 -1
  704. package/app/.next/static/chunks/app/api/provider-nodes/validate/route-84de94ffd1225dd4.js +0 -1
  705. package/app/.next/static/chunks/app/api/providers/[id]/models/route-84de94ffd1225dd4.js +0 -1
  706. package/app/.next/static/chunks/app/api/providers/[id]/route-84de94ffd1225dd4.js +0 -1
  707. package/app/.next/static/chunks/app/api/providers/[id]/test/route-84de94ffd1225dd4.js +0 -1
  708. package/app/.next/static/chunks/app/api/providers/[id]/test-models/route-84de94ffd1225dd4.js +0 -1
  709. package/app/.next/static/chunks/app/api/providers/client/route-84de94ffd1225dd4.js +0 -1
  710. package/app/.next/static/chunks/app/api/providers/kilo/free-models/route-84de94ffd1225dd4.js +0 -1
  711. package/app/.next/static/chunks/app/api/providers/route-84de94ffd1225dd4.js +0 -1
  712. package/app/.next/static/chunks/app/api/providers/suggested-models/route-84de94ffd1225dd4.js +0 -1
  713. package/app/.next/static/chunks/app/api/providers/test-batch/route-84de94ffd1225dd4.js +0 -1
  714. package/app/.next/static/chunks/app/api/providers/validate/route-84de94ffd1225dd4.js +0 -1
  715. package/app/.next/static/chunks/app/api/proxy-pools/[id]/route-84de94ffd1225dd4.js +0 -1
  716. package/app/.next/static/chunks/app/api/proxy-pools/[id]/test/route-84de94ffd1225dd4.js +0 -1
  717. package/app/.next/static/chunks/app/api/proxy-pools/route-84de94ffd1225dd4.js +0 -1
  718. package/app/.next/static/chunks/app/api/proxy-pools/vercel-deploy/route-84de94ffd1225dd4.js +0 -1
  719. package/app/.next/static/chunks/app/api/settings/database/route-84de94ffd1225dd4.js +0 -1
  720. package/app/.next/static/chunks/app/api/settings/proxy-test/route-84de94ffd1225dd4.js +0 -1
  721. package/app/.next/static/chunks/app/api/settings/require-login/route-84de94ffd1225dd4.js +0 -1
  722. package/app/.next/static/chunks/app/api/settings/route-84de94ffd1225dd4.js +0 -1
  723. package/app/.next/static/chunks/app/api/shutdown/route-84de94ffd1225dd4.js +0 -1
  724. package/app/.next/static/chunks/app/api/tags/route-84de94ffd1225dd4.js +0 -1
  725. package/app/.next/static/chunks/app/api/translator/console-logs/route-84de94ffd1225dd4.js +0 -1
  726. package/app/.next/static/chunks/app/api/translator/console-logs/stream/route-84de94ffd1225dd4.js +0 -1
  727. package/app/.next/static/chunks/app/api/translator/load/route-84de94ffd1225dd4.js +0 -1
  728. package/app/.next/static/chunks/app/api/translator/save/route-84de94ffd1225dd4.js +0 -1
  729. package/app/.next/static/chunks/app/api/translator/send/route-84de94ffd1225dd4.js +0 -1
  730. package/app/.next/static/chunks/app/api/translator/translate/route-84de94ffd1225dd4.js +0 -1
  731. package/app/.next/static/chunks/app/api/tunnel/disable/route-84de94ffd1225dd4.js +0 -1
  732. package/app/.next/static/chunks/app/api/tunnel/enable/route-84de94ffd1225dd4.js +0 -1
  733. package/app/.next/static/chunks/app/api/tunnel/status/route-84de94ffd1225dd4.js +0 -1
  734. package/app/.next/static/chunks/app/api/tunnel/tailscale-check/route-84de94ffd1225dd4.js +0 -1
  735. package/app/.next/static/chunks/app/api/tunnel/tailscale-disable/route-84de94ffd1225dd4.js +0 -1
  736. package/app/.next/static/chunks/app/api/tunnel/tailscale-enable/route-84de94ffd1225dd4.js +0 -1
  737. package/app/.next/static/chunks/app/api/tunnel/tailscale-install/route-84de94ffd1225dd4.js +0 -1
  738. package/app/.next/static/chunks/app/api/tunnel/tailscale-login/route-84de94ffd1225dd4.js +0 -1
  739. package/app/.next/static/chunks/app/api/tunnel/tailscale-start-daemon/route-84de94ffd1225dd4.js +0 -1
  740. package/app/.next/static/chunks/app/api/usage/[connectionId]/route-84de94ffd1225dd4.js +0 -1
  741. package/app/.next/static/chunks/app/api/usage/chart/route-84de94ffd1225dd4.js +0 -1
  742. package/app/.next/static/chunks/app/api/usage/history/route-84de94ffd1225dd4.js +0 -1
  743. package/app/.next/static/chunks/app/api/usage/providers/route-84de94ffd1225dd4.js +0 -1
  744. package/app/.next/static/chunks/app/api/usage/request-details/route-84de94ffd1225dd4.js +0 -1
  745. package/app/.next/static/chunks/app/api/usage/request-logs/route-84de94ffd1225dd4.js +0 -1
  746. package/app/.next/static/chunks/app/api/usage/stats/route-84de94ffd1225dd4.js +0 -1
  747. package/app/.next/static/chunks/app/api/usage/stream/route-84de94ffd1225dd4.js +0 -1
  748. package/app/.next/static/chunks/app/api/v1/api/chat/route-84de94ffd1225dd4.js +0 -1
  749. package/app/.next/static/chunks/app/api/v1/audio/speech/route-84de94ffd1225dd4.js +0 -1
  750. package/app/.next/static/chunks/app/api/v1/audio/transcriptions/route-84de94ffd1225dd4.js +0 -1
  751. package/app/.next/static/chunks/app/api/v1/audio/voices/route-84de94ffd1225dd4.js +0 -1
  752. package/app/.next/static/chunks/app/api/v1/chat/completions/route-84de94ffd1225dd4.js +0 -1
  753. package/app/.next/static/chunks/app/api/v1/embeddings/route-84de94ffd1225dd4.js +0 -1
  754. package/app/.next/static/chunks/app/api/v1/images/generations/route-84de94ffd1225dd4.js +0 -1
  755. package/app/.next/static/chunks/app/api/v1/messages/count_tokens/route-84de94ffd1225dd4.js +0 -1
  756. package/app/.next/static/chunks/app/api/v1/messages/route-84de94ffd1225dd4.js +0 -1
  757. package/app/.next/static/chunks/app/api/v1/models/[kind]/route-84de94ffd1225dd4.js +0 -1
  758. package/app/.next/static/chunks/app/api/v1/models/info/route-84de94ffd1225dd4.js +0 -1
  759. package/app/.next/static/chunks/app/api/v1/models/route-84de94ffd1225dd4.js +0 -1
  760. package/app/.next/static/chunks/app/api/v1/responses/compact/route-84de94ffd1225dd4.js +0 -1
  761. package/app/.next/static/chunks/app/api/v1/responses/route-84de94ffd1225dd4.js +0 -1
  762. package/app/.next/static/chunks/app/api/v1/route-84de94ffd1225dd4.js +0 -1
  763. package/app/.next/static/chunks/app/api/v1/search/route-84de94ffd1225dd4.js +0 -1
  764. package/app/.next/static/chunks/app/api/v1/web/fetch/route-84de94ffd1225dd4.js +0 -1
  765. package/app/.next/static/chunks/app/api/v1beta/models/[...path]/route-84de94ffd1225dd4.js +0 -1
  766. package/app/.next/static/chunks/app/api/v1beta/models/route-84de94ffd1225dd4.js +0 -1
  767. package/app/.next/static/chunks/app/api/version/route-84de94ffd1225dd4.js +0 -1
  768. package/app/.next/static/chunks/app/api/version/shutdown/route-84de94ffd1225dd4.js +0 -1
  769. package/app/.next/static/chunks/app/api/version/update/route-84de94ffd1225dd4.js +0 -1
  770. package/app/.next/static/chunks/app/callback/page-80c520a5e353c3ac.js +0 -1
  771. package/app/.next/static/chunks/app/login/page-2f45309b2d2ca209.js +0 -1
  772. package/app/.next/static/chunks/app/manifest.webmanifest/route-84de94ffd1225dd4.js +0 -1
  773. package/app/.next/static/chunks/app/page-84de94ffd1225dd4.js +0 -1
  774. package/app/.next/static/chunks/next/dist/client/components/builtin/app-error-84de94ffd1225dd4.js +0 -1
  775. package/app/.next/static/chunks/next/dist/client/components/builtin/forbidden-84de94ffd1225dd4.js +0 -1
  776. package/app/.next/static/chunks/next/dist/client/components/builtin/not-found-84de94ffd1225dd4.js +0 -1
  777. package/app/.next/static/chunks/next/dist/client/components/builtin/unauthorized-84de94ffd1225dd4.js +0 -1
  778. package/app/.next/static/css/234ff1f50eae62d1.css +0 -1
  779. package/app/.next/static/pAkL-eAklQyioXImGSk6m/_buildManifest.js +0 -1
  780. /package/app/.next/static/{pAkL-eAklQyioXImGSk6m → xilRJjRhqJhUZ2VStWKZh}/_ssgManifest.js +0 -0
package/cli.js CHANGED
@@ -44,6 +44,7 @@ function createSpinner(text) {
44
44
 
45
45
  const pkg = require("./package.json");
46
46
  const { ensureSqliteRuntime, buildEnvWithRuntime } = require("./hooks/sqliteRuntime");
47
+ const { ensureTrayRuntime } = require("./hooks/trayRuntime");
47
48
  const args = process.argv.slice(2);
48
49
 
49
50
  // Self-heal SQLite runtime deps (sql.js + better-sqlite3) into ~/.9router/runtime
@@ -51,6 +52,9 @@ const args = process.argv.slice(2);
51
52
  // better-sqlite3 is optional. Logs to stderr only on failure.
52
53
  try { ensureSqliteRuntime({ silent: true }); } catch {}
53
54
 
55
+ // Self-heal tray runtime (systray for macOS/Linux only). Windows skipped.
56
+ try { ensureTrayRuntime({ silent: true }); } catch {}
57
+
54
58
  // Configuration constants
55
59
  const APP_NAME = pkg.name; // Use from package.json
56
60
  const INSTALL_CMD_LATEST = `npm i -g ${APP_NAME}@latest --prefer-online`;
@@ -4,6 +4,7 @@
4
4
  // `9router` start doesn't need network. Failure here is non-fatal —
5
5
  // cli.js will retry at runtime if anything is missing.
6
6
  const { ensureSqliteRuntime } = require("./sqliteRuntime");
7
+ const { ensureTrayRuntime } = require("./trayRuntime");
7
8
 
8
9
  try {
9
10
  ensureSqliteRuntime({ silent: false });
@@ -12,4 +13,10 @@ try {
12
13
  console.warn(`[9router] runtime warm-up skipped: ${e.message}`);
13
14
  }
14
15
 
16
+ try {
17
+ ensureTrayRuntime({ silent: false });
18
+ } catch (e) {
19
+ console.warn(`[9router] tray runtime skipped: ${e.message}`);
20
+ }
21
+
15
22
  process.exit(0);
@@ -0,0 +1,84 @@
1
+ // Lazy install systray for macOS/Linux into USER_DATA_DIR/runtime/node_modules.
2
+ // Windows uses PowerShell NotifyIcon (no binary) → no systray needed.
3
+ // This keeps the published npm tarball free of unsigned Go binaries that
4
+ // trigger antivirus false positives (e.g. Kaspersky flagging tray_windows.exe).
5
+ const { spawnSync } = require("child_process");
6
+ const fs = require("fs");
7
+ const path = require("path");
8
+ const { getRuntimeDir, getRuntimeNodeModules } = require("./sqliteRuntime");
9
+
10
+ const SYSTRAY_VERSION = "1.0.5";
11
+
12
+ function hasSystray() {
13
+ return fs.existsSync(path.join(getRuntimeNodeModules(), "systray", "package.json"));
14
+ }
15
+
16
+ // Remove legacy systray from all known locations on Windows (AV false positive cleanup)
17
+ function cleanupWindowsSystray({ silent = false } = {}) {
18
+ if (process.platform !== "win32") return;
19
+ // 1) Runtime dir: %APPDATA%\9router\runtime\node_modules\systray
20
+ // 2) npm global nested: <npm_prefix>\node_modules\9router\node_modules\systray
21
+ // __dirname here = <npm_prefix>\node_modules\9router\hooks → up 1 = pkg root
22
+ const targets = [
23
+ path.join(getRuntimeNodeModules(), "systray"),
24
+ path.join(__dirname, "..", "node_modules", "systray")
25
+ ];
26
+ for (const dir of targets) {
27
+ if (fs.existsSync(dir)) {
28
+ try {
29
+ fs.rmSync(dir, { recursive: true, force: true });
30
+ if (!silent) console.log(`[9router][runtime] removed legacy systray: ${dir}`);
31
+ } catch (e) {
32
+ if (!silent) console.warn(`[9router][runtime] failed to remove ${dir}: ${e.message}`);
33
+ }
34
+ }
35
+ }
36
+ }
37
+
38
+ function ensureRuntimeDir() {
39
+ const dir = getRuntimeDir();
40
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
41
+ const pkgPath = path.join(dir, "package.json");
42
+ if (!fs.existsSync(pkgPath)) {
43
+ fs.writeFileSync(pkgPath, JSON.stringify({
44
+ name: "9router-runtime",
45
+ version: "1.0.0",
46
+ private: true
47
+ }, null, 2));
48
+ }
49
+ return dir;
50
+ }
51
+
52
+ function npmInstall(pkgs, { silent = false } = {}) {
53
+ const cwd = ensureRuntimeDir();
54
+ const args = ["install", ...pkgs, "--no-audit", "--no-fund", "--no-save", "--prefer-online"];
55
+ const npmCmd = process.platform === "win32" ? "npm.cmd" : "npm";
56
+ if (!silent) console.log(`[9router][runtime] ${npmCmd} ${args.join(" ")} (cwd: ${cwd})`);
57
+ const res = spawnSync(npmCmd, args, {
58
+ cwd,
59
+ stdio: silent ? "ignore" : "inherit",
60
+ timeout: 120000,
61
+ shell: process.platform === "win32"
62
+ });
63
+ return res.status === 0;
64
+ }
65
+
66
+ // Public: ensure systray is installed on macOS/Linux only.
67
+ // Windows skips entirely (uses PowerShell tray).
68
+ function ensureTrayRuntime({ silent = false } = {}) {
69
+ if (process.platform === "win32") {
70
+ cleanupWindowsSystray({ silent });
71
+ return { systray: false, skipped: true };
72
+ }
73
+ if (hasSystray()) {
74
+ if (!silent) console.log("[9router][runtime] systray OK");
75
+ return { systray: true };
76
+ }
77
+ const ok = npmInstall([`systray@${SYSTRAY_VERSION}`], { silent });
78
+ if (!ok && !silent) {
79
+ console.warn("[9router][runtime] systray install failed (tray will be disabled)");
80
+ }
81
+ return { systray: ok && hasSystray() };
82
+ }
83
+
84
+ module.exports = { ensureTrayRuntime };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "9router",
3
- "version": "0.4.29",
3
+ "version": "0.4.33",
4
4
  "description": "9Router CLI - Start and manage 9Router server",
5
5
  "bin": {
6
6
  "9router": "./cli.js"
@@ -21,10 +21,10 @@
21
21
  "node-forge": "^1.3.3",
22
22
  "node-machine-id": "^1.1.12",
23
23
  "react": "19.2.1",
24
- "react-dom": "19.2.1",
25
- "systray": "^1.0.5"
24
+ "react-dom": "19.2.1"
26
25
  },
27
26
  "comment_sqlite": "sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.9router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.",
27
+ "comment_systray": "systray is NOT bundled here. It is lazy-installed into ~/.9router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping the unsigned Go binary tray_windows.exe that triggers antivirus false positives (Kaspersky).",
28
28
  "engines": {
29
29
  "node": ">=18.0.0"
30
30
  },
@@ -50,6 +50,11 @@ async function showSettingsMenu(breadcrumb = []) {
50
50
  const rtkOn = data?.settings?.rtkEnabled !== false;
51
51
  lines.push(` RTK: ${rtkOn ? `${COLORS.green}ON${COLORS.reset}` : `${COLORS.red}OFF${COLORS.reset}`} ${COLORS.dim}(Token Saver)${COLORS.reset}`);
52
52
 
53
+ // Auth mode section
54
+ const authMode = data?.settings?.authMode || "password";
55
+ const authColor = authMode === "password" ? COLORS.green : COLORS.yellow;
56
+ lines.push(` Auth: ${authColor}${authMode.toUpperCase()}${COLORS.reset} ${COLORS.dim}(login mode)${COLORS.reset}`);
57
+
53
58
  return lines.join("\n");
54
59
  },
55
60
  refresh: async () => {
@@ -81,11 +86,39 @@ async function showSettingsMenu(breadcrumb = []) {
81
86
  {
82
87
  label: "🔑 Reset Password to Default",
83
88
  action: async () => { await resetPassword(); return true; }
89
+ },
90
+ {
91
+ label: (d) => {
92
+ const mode = d?.settings?.authMode || "password";
93
+ return mode === "password" ? "🔓 Reset Auth Mode (already password)" : `🔓 Reset Auth Mode to Password (current: ${mode})`;
94
+ },
95
+ action: async () => { await resetAuthMode(); return true; }
84
96
  }
85
97
  ]
86
98
  });
87
99
  }
88
100
 
101
+ /**
102
+ * Reset authMode to "password" via API. Used when OIDC is misconfigured
103
+ * and user is locked out of dashboard. CLI bypasses auth via x-9r-cli-token.
104
+ */
105
+ async function resetAuthMode() {
106
+ const ok = await confirm("Reset auth mode to PASSWORD (disable OIDC)?");
107
+ if (!ok) {
108
+ showStatus("Cancelled", "info");
109
+ await pause();
110
+ return;
111
+ }
112
+
113
+ const result = await api.updateSettings({ authMode: "password" });
114
+ if (result.success) {
115
+ showStatus("Auth mode reset to password. OIDC disabled.", "success");
116
+ } else {
117
+ showStatus(`Failed: ${result.error}`, "error");
118
+ }
119
+ await pause();
120
+ }
121
+
89
122
  /**
90
123
  * Enable tunnel via API
91
124
  */
@@ -3,9 +3,10 @@ const fs = require("fs");
3
3
  const path = require("path");
4
4
 
5
5
  let trayInstance = null;
6
+ let isWinTray = false;
6
7
 
7
8
  /**
8
- * Get icon base64 from file — use .ico on Windows, .png on macOS/Linux
9
+ * Get icon base64 from file — used for systray (mac/linux)
9
10
  */
10
11
  function getIconBase64() {
11
12
  const isWin = process.platform === "win32";
@@ -26,11 +27,9 @@ function getIconBase64() {
26
27
  */
27
28
  function isTraySupported() {
28
29
  const platform = process.platform;
29
- // Supported platforms: darwin (macOS), win32 (Windows), linux
30
30
  if (!["darwin", "win32", "linux"].includes(platform)) {
31
31
  return false;
32
32
  }
33
- // Skip on Linux without display (headless server)
34
33
  if (platform === "linux" && !process.env.DISPLAY) {
35
34
  return false;
36
35
  }
@@ -43,122 +42,156 @@ function isTraySupported() {
43
42
  * @returns {Object|null} tray instance or null if not supported/failed
44
43
  */
45
44
  function initTray(options) {
46
- // Check OS support first
47
45
  if (!isTraySupported()) {
48
46
  return null;
49
47
  }
50
48
 
51
- const { port, onQuit, onOpenDashboard } = options;
49
+ // Windows uses PowerShell NotifyIcon (AV-safe), others use systray
50
+ if (process.platform === "win32") {
51
+ return initWindowsTray(options);
52
+ }
53
+ return initUnixTray(options);
54
+ }
55
+
56
+ /**
57
+ * Build menu items array shared between platforms
58
+ */
59
+ function buildMenuItems(port, autostartEnabled) {
60
+ return [
61
+ { title: `9Router (Port ${port})`, tooltip: "Server is running", enabled: false },
62
+ { title: "Open Dashboard", tooltip: "Open in browser", enabled: true },
63
+ {
64
+ title: autostartEnabled ? "✓ Auto-start Enabled" : "Enable Auto-start",
65
+ tooltip: "Run on OS startup",
66
+ enabled: true
67
+ },
68
+ { title: "Quit", tooltip: "Stop server and exit", enabled: true }
69
+ ];
70
+ }
71
+
72
+ // Menu item indexes
73
+ const MENU_INDEX = { STATUS: 0, DASHBOARD: 1, AUTOSTART: 2, QUIT: 3 };
52
74
 
75
+ /**
76
+ * Get current autostart state
77
+ */
78
+ function getAutostartEnabled() {
53
79
  try {
54
- const SysTray = require("systray").default;
80
+ const { isAutoStartEnabled } = require("./autostart");
81
+ return isAutoStartEnabled();
82
+ } catch (e) {
83
+ return false;
84
+ }
85
+ }
55
86
 
56
- // Check if autostart is enabled
57
- let autostartEnabled = false;
87
+ /**
88
+ * Handle menu item click (shared logic)
89
+ */
90
+ function handleClick(index, options, onAutostartToggle) {
91
+ const { onQuit, onOpenDashboard, port } = options;
92
+ if (index === MENU_INDEX.DASHBOARD) {
93
+ if (onOpenDashboard) onOpenDashboard();
94
+ else openBrowser(`http://localhost:${port}/dashboard`);
95
+ } else if (index === MENU_INDEX.AUTOSTART) {
96
+ const enabled = getAutostartEnabled();
58
97
  try {
59
- const { isAutoStartEnabled } = require("./autostart");
60
- autostartEnabled = isAutoStartEnabled();
98
+ const { enableAutoStart, disableAutoStart } = require("./autostart");
99
+ if (enabled) disableAutoStart();
100
+ else enableAutoStart();
101
+ onAutostartToggle(!enabled);
61
102
  } catch (e) {}
103
+ } else if (index === MENU_INDEX.QUIT) {
104
+ console.log("\n👋 Shutting down...");
105
+ if (onQuit) onQuit();
106
+ killTray();
107
+ setTimeout(() => process.exit(0), 500);
108
+ }
109
+ }
110
+
111
+ /**
112
+ * Windows tray via PowerShell NotifyIcon
113
+ */
114
+ function initWindowsTray(options) {
115
+ const { port } = options;
116
+ try {
117
+ const { initWinTray } = require("./trayWin");
118
+ const iconPath = path.join(__dirname, "icon.ico");
119
+ const autostartEnabled = getAutostartEnabled();
120
+ const items = buildMenuItems(port, autostartEnabled);
121
+
122
+ trayInstance = initWinTray({
123
+ iconPath,
124
+ tooltip: `9Router - Port ${port}`,
125
+ items,
126
+ onClick: (index) => {
127
+ handleClick(index, options, (newEnabled) => {
128
+ const newTitle = newEnabled ? "✓ Auto-start Enabled" : "Enable Auto-start";
129
+ trayInstance.updateItem(MENU_INDEX.AUTOSTART, newTitle, true);
130
+ });
131
+ }
132
+ });
133
+
134
+ isWinTray = true;
135
+ return trayInstance;
136
+ } catch (err) {
137
+ return null;
138
+ }
139
+ }
140
+
141
+ /**
142
+ * macOS/Linux tray via systray binary
143
+ */
144
+ function resolveSystray() {
145
+ // Try local first (dev), then runtime dir (production lazy install)
146
+ try {
147
+ return require("systray").default;
148
+ } catch (e) {}
149
+ try {
150
+ const { getRuntimeNodeModules } = require("../../../hooks/sqliteRuntime");
151
+ const systrayPath = path.join(getRuntimeNodeModules(), "systray");
152
+ return require(systrayPath).default;
153
+ } catch (e) {
154
+ return null;
155
+ }
156
+ }
157
+
158
+ function initUnixTray(options) {
159
+ const { port } = options;
160
+ try {
161
+ const SysTray = resolveSystray();
162
+ if (!SysTray) return null;
163
+ const autostartEnabled = getAutostartEnabled();
164
+ const items = buildMenuItems(port, autostartEnabled);
62
165
 
63
- const isWin = process.platform === "win32";
64
166
  const menu = {
65
167
  icon: getIconBase64(),
66
- // macOS requires empty title; Windows uses title as the tray icon tooltip
67
- title: isWin ? `9Router - Port ${port}` : "",
168
+ title: "",
68
169
  tooltip: `9Router - Port ${port}`,
69
- items: [
70
- {
71
- title: `9Router (Port ${port})`,
72
- tooltip: "Server is running",
73
- enabled: false
74
- },
75
- {
76
- title: "Open Dashboard",
77
- tooltip: "Open in browser",
78
- enabled: true
79
- },
80
- {
81
- title: autostartEnabled ? "✓ Auto-start Enabled" : "Enable Auto-start",
82
- tooltip: "Run on OS startup",
83
- enabled: true
84
- },
85
- {
86
- title: "Quit",
87
- tooltip: "Stop server and exit",
88
- enabled: true
89
- }
90
- ]
170
+ items
91
171
  };
92
172
 
93
- trayInstance = new SysTray({
94
- menu,
95
- debug: false,
96
- copyDir: true
97
- });
98
-
99
- // Menu item index: 0=status, 1=dashboard, 2=autostart, 3=quit
100
- const AUTOSTART_INDEX = 2;
173
+ trayInstance = new SysTray({ menu, debug: false, copyDir: true });
174
+ isWinTray = false;
101
175
 
102
176
  trayInstance.onClick((action) => {
103
- if (action.item.title === "Open Dashboard") {
104
- if (onOpenDashboard) {
105
- onOpenDashboard();
106
- } else {
107
- openBrowser(`http://localhost:${port}/dashboard`);
108
- }
109
- } else if (action.item.title === "✓ Auto-start Enabled") {
110
- // Disable autostart
111
- try {
112
- const { disableAutoStart } = require("./autostart");
113
- disableAutoStart();
114
- // Update menu item
115
- trayInstance.sendAction({
116
- type: "update-item",
117
- item: {
118
- title: "Enable Auto-start",
119
- tooltip: "Run on OS startup",
120
- enabled: true
121
- },
122
- seq_id: AUTOSTART_INDEX
123
- });
124
- } catch (e) {}
125
- } else if (action.item.title === "Enable Auto-start") {
126
- // Enable autostart
127
- try {
128
- const { enableAutoStart } = require("./autostart");
129
- enableAutoStart();
130
- // Update menu item
131
- trayInstance.sendAction({
132
- type: "update-item",
133
- item: {
134
- title: "✓ Auto-start Enabled",
135
- tooltip: "Run on OS startup",
136
- enabled: true
137
- },
138
- seq_id: AUTOSTART_INDEX
139
- });
140
- } catch (e) {}
141
- } else if (action.item.title === "Quit") {
142
- console.log("\n👋 Shutting down...");
143
- if (onQuit) {
144
- onQuit();
145
- }
146
- killTray();
147
- setTimeout(() => process.exit(0), 500);
148
- }
177
+ handleClick(action.seq_id, options, (newEnabled) => {
178
+ trayInstance.sendAction({
179
+ type: "update-item",
180
+ item: {
181
+ title: newEnabled ? "✓ Auto-start Enabled" : "Enable Auto-start",
182
+ tooltip: "Run on OS startup",
183
+ enabled: true
184
+ },
185
+ seq_id: MENU_INDEX.AUTOSTART
186
+ });
187
+ });
149
188
  });
150
189
 
151
- trayInstance.onReady(() => {
152
- // Tray ready - silent
153
- });
154
-
155
- trayInstance.onError((err) => {
156
- // Ignore errors during shutdown
157
- });
190
+ trayInstance.onReady(() => {});
191
+ trayInstance.onError(() => {});
158
192
 
159
193
  return trayInstance;
160
194
  } catch (err) {
161
- // Silent fail - tray is optional, app continues without it
162
195
  return null;
163
196
  }
164
197
  }
@@ -168,15 +201,14 @@ function initTray(options) {
168
201
  */
169
202
  function killTray() {
170
203
  const instance = trayInstance;
171
- trayInstance = null; // Set to null first to prevent error handlers
172
-
204
+ const wasWin = isWinTray;
205
+ trayInstance = null;
206
+
173
207
  if (instance) {
174
208
  try {
175
- // Kill with silent mode to avoid JSON parse errors
176
- instance.kill(true);
177
- } catch (e) {
178
- // Ignore kill errors - tray binary may already be dead
179
- }
209
+ if (wasWin) instance.kill();
210
+ else instance.kill(true);
211
+ } catch (e) {}
180
212
  }
181
213
  }
182
214
 
@@ -0,0 +1,79 @@
1
+ # 9Router tray icon for Windows using NotifyIcon
2
+ # IPC: stdin JSON commands, stdout JSON events
3
+ param([string]$IconPath, [string]$Tooltip)
4
+
5
+ Add-Type -AssemblyName System.Windows.Forms
6
+ Add-Type -AssemblyName System.Drawing
7
+
8
+ $ErrorActionPreference = "Stop"
9
+ [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
10
+ [Console]::InputEncoding = [System.Text.Encoding]::UTF8
11
+ $OutputEncoding = [System.Text.Encoding]::UTF8
12
+
13
+ $script:notifyIcon = New-Object System.Windows.Forms.NotifyIcon
14
+ $script:notifyIcon.Icon = New-Object System.Drawing.Icon($IconPath)
15
+ $script:notifyIcon.Text = $Tooltip
16
+ $script:notifyIcon.Visible = $true
17
+
18
+ $script:menu = New-Object System.Windows.Forms.ContextMenuStrip
19
+ $script:notifyIcon.ContextMenuStrip = $script:menu
20
+ $script:items = @()
21
+
22
+ function Write-Event($obj) {
23
+ $json = $obj | ConvertTo-Json -Compress
24
+ [Console]::Out.WriteLine($json)
25
+ [Console]::Out.Flush()
26
+ }
27
+
28
+ function Add-MenuItem($index, $title, $enabled) {
29
+ $item = New-Object System.Windows.Forms.ToolStripMenuItem
30
+ $item.Text = $title
31
+ $item.Enabled = $enabled
32
+ $idx = $index
33
+ $item.Add_Click({ Write-Event @{ type = "click"; index = $idx } }.GetNewClosure())
34
+ $script:menu.Items.Add($item) | Out-Null
35
+ $script:items += $item
36
+ }
37
+
38
+ function Update-MenuItem($index, $title, $enabled) {
39
+ if ($index -lt $script:items.Count) {
40
+ $script:items[$index].Text = $title
41
+ $script:items[$index].Enabled = $enabled
42
+ }
43
+ }
44
+
45
+ function Set-Tooltip($text) {
46
+ # NotifyIcon.Text max 63 chars
47
+ if ($text.Length -gt 63) { $text = $text.Substring(0, 63) }
48
+ $script:notifyIcon.Text = $text
49
+ }
50
+
51
+ # Background reader thread polls stdin via timer on UI thread
52
+ $script:timer = New-Object System.Windows.Forms.Timer
53
+ $script:timer.Interval = 100
54
+ $script:timer.Add_Tick({
55
+ try {
56
+ while ([Console]::In.Peek() -ne -1) {
57
+ $line = [Console]::In.ReadLine()
58
+ if ([string]::IsNullOrWhiteSpace($line)) { continue }
59
+ $cmd = $line | ConvertFrom-Json
60
+ switch ($cmd.action) {
61
+ "add-item" { Add-MenuItem $cmd.index $cmd.title $cmd.enabled }
62
+ "update-item" { Update-MenuItem $cmd.index $cmd.title $cmd.enabled }
63
+ "set-tooltip" { Set-Tooltip $cmd.text }
64
+ "ready" { Write-Event @{ type = "ready" } }
65
+ "kill" {
66
+ $script:notifyIcon.Visible = $false
67
+ $script:notifyIcon.Dispose()
68
+ [System.Windows.Forms.Application]::Exit()
69
+ }
70
+ }
71
+ }
72
+ } catch {
73
+ Write-Event @{ type = "error"; message = $_.Exception.Message }
74
+ }
75
+ })
76
+ $script:timer.Start()
77
+
78
+ Write-Event @{ type = "started" }
79
+ [System.Windows.Forms.Application]::Run()
@@ -0,0 +1,89 @@
1
+ const { spawn } = require("child_process");
2
+ const path = require("path");
3
+ const readline = require("readline");
4
+
5
+ // PowerShell-based tray for Windows (AV-safe, zero binary deps)
6
+
7
+ let psProcess = null;
8
+ let clickHandler = null;
9
+
10
+ /**
11
+ * Send JSON command to PowerShell tray process via stdin
12
+ */
13
+ function sendCommand(cmd) {
14
+ if (psProcess && psProcess.stdin.writable) {
15
+ psProcess.stdin.write(`${JSON.stringify(cmd)}\n`, "utf8");
16
+ }
17
+ }
18
+
19
+ /**
20
+ * Initialize Windows tray using PowerShell NotifyIcon
21
+ * @param {Object} options - { iconPath, tooltip, items, onClick }
22
+ * items: [{ title, enabled }]
23
+ * @returns {Object|null} controller with sendAction/kill
24
+ */
25
+ function initWinTray(options) {
26
+ const { iconPath, tooltip, items, onClick } = options;
27
+ clickHandler = onClick;
28
+
29
+ const scriptPath = path.join(__dirname, "tray.ps1");
30
+
31
+ try {
32
+ psProcess = spawn(
33
+ "powershell.exe",
34
+ [
35
+ "-NoProfile",
36
+ "-ExecutionPolicy", "Bypass",
37
+ "-WindowStyle", "Hidden",
38
+ "-InputFormat", "Text",
39
+ "-OutputFormat", "Text",
40
+ "-File", scriptPath,
41
+ "-IconPath", iconPath,
42
+ "-Tooltip", tooltip
43
+ ],
44
+ { windowsHide: true, stdio: ["pipe", "pipe", "pipe"] }
45
+ );
46
+ } catch (err) {
47
+ return null;
48
+ }
49
+
50
+ const rl = readline.createInterface({ input: psProcess.stdout });
51
+ rl.on("line", (line) => {
52
+ try {
53
+ const evt = JSON.parse(line);
54
+ if (evt.type === "click" && clickHandler) {
55
+ clickHandler(evt.index);
56
+ }
57
+ } catch (e) {}
58
+ });
59
+
60
+ psProcess.on("error", () => {});
61
+ psProcess.stderr.on("data", () => {});
62
+
63
+ // Send initial menu items
64
+ items.forEach((item, index) => {
65
+ sendCommand({ action: "add-item", index, title: item.title, enabled: item.enabled });
66
+ });
67
+
68
+ return {
69
+ updateItem(index, title, enabled) {
70
+ sendCommand({ action: "update-item", index, title, enabled });
71
+ },
72
+ setTooltip(text) {
73
+ sendCommand({ action: "set-tooltip", text });
74
+ },
75
+ kill() {
76
+ try {
77
+ sendCommand({ action: "kill" });
78
+ } catch (e) {}
79
+ setTimeout(() => {
80
+ if (psProcess && !psProcess.killed) {
81
+ try { psProcess.kill(); } catch (e) {}
82
+ }
83
+ psProcess = null;
84
+ }, 300);
85
+ }
86
+ };
87
+ }
88
+
89
+ module.exports = { initWinTray };