9router 0.4.31 → 0.4.36

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 (697) hide show
  1. package/README.md +16 -3
  2. package/app/.next/BUILD_ID +1 -1
  3. package/app/.next/app-path-routes-manifest.json +9 -8
  4. package/app/.next/build-manifest.json +2 -2
  5. package/app/.next/required-server-files.json +0 -1
  6. package/app/.next/routes-manifest.json +6 -0
  7. package/app/.next/server/app/(dashboard)/dashboard/basic-chat/page.js +2 -2
  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_client-reference-manifest.js +1 -1
  11. package/app/.next/server/app/(dashboard)/dashboard/combos/page.js +2 -2
  12. package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  13. package/app/.next/server/app/(dashboard)/dashboard/console-log/page.js +2 -2
  14. package/app/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  15. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page.js +2 -2
  16. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  17. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js +4 -4
  18. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  19. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js +2 -2
  20. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  21. package/app/.next/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +2 -2
  22. package/app/.next/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  23. package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/page.js +2 -2
  24. package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  25. package/app/.next/server/app/(dashboard)/dashboard/mitm/page.js +2 -2
  26. package/app/.next/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  27. package/app/.next/server/app/(dashboard)/dashboard/page.js +2 -2
  28. package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  29. package/app/.next/server/app/(dashboard)/dashboard/profile/page.js +2 -2
  30. package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  31. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js +3 -3
  32. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  33. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page.js +2 -2
  34. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  35. package/app/.next/server/app/(dashboard)/dashboard/providers/page.js +2 -2
  36. package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  37. package/app/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js +4 -4
  38. package/app/.next/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  39. package/app/.next/server/app/(dashboard)/dashboard/quota/page.js +2 -2
  40. package/app/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  41. package/app/.next/server/app/(dashboard)/dashboard/skills/page.js +2 -2
  42. package/app/.next/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  43. package/app/.next/server/app/(dashboard)/dashboard/translator/page.js +2 -2
  44. package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  45. package/app/.next/server/app/(dashboard)/dashboard/usage/page.js +2 -2
  46. package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  47. package/app/.next/server/app/_global-error/page.js +2 -2
  48. package/app/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  49. package/app/.next/server/app/_global-error.html +1 -1
  50. package/app/.next/server/app/_global-error.rsc +1 -1
  51. package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  52. package/app/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  53. package/app/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  54. package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  55. package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  56. package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  57. package/app/.next/server/app/_not-found/page.js +2 -2
  58. package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  59. package/app/.next/server/app/_not-found.html +1 -1
  60. package/app/.next/server/app/_not-found.rsc +4 -4
  61. package/app/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  62. package/app/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  63. package/app/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  64. package/app/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  65. package/app/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  66. package/app/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  67. package/app/.next/server/app/api/auth/login/route.js +1 -1
  68. package/app/.next/server/app/api/auth/logout/route.js +1 -1
  69. package/app/.next/server/app/api/auth/oidc/callback/route.js +1 -1
  70. package/app/.next/server/app/api/auth/oidc/start/route.js +1 -1
  71. package/app/.next/server/app/api/auth/oidc/test/route.js +1 -1
  72. package/app/.next/server/app/api/auth/status/route.js +1 -1
  73. package/app/.next/server/app/api/cli-tools/all-statuses/route.js +2 -2
  74. package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js +2 -2
  75. package/app/.next/server/app/api/cli-tools/antigravity-mitm/route.js +1 -1
  76. package/app/.next/server/app/api/cli-tools/claude-settings/route.js +1 -1
  77. package/app/.next/server/app/api/cli-tools/cline-settings/route.js +2 -2
  78. package/app/.next/server/app/api/cli-tools/codex-settings/route.js +1 -1
  79. package/app/.next/server/app/api/cli-tools/copilot-settings/route.js +2 -2
  80. package/app/.next/server/app/api/cli-tools/cowork-mcp-registry/route.js +1 -1
  81. package/app/.next/server/app/api/cli-tools/cowork-mcp-tools/route.js +1 -1
  82. package/app/.next/server/app/api/cli-tools/cowork-settings/route.js +2 -2
  83. package/app/.next/server/app/api/cli-tools/droid-settings/route.js +1 -1
  84. package/app/.next/server/app/api/cli-tools/hermes-settings/route.js +2 -2
  85. package/app/.next/server/app/api/cli-tools/kilo-settings/route.js +2 -2
  86. package/app/.next/server/app/api/cli-tools/openclaw-settings/route.js +2 -2
  87. package/app/.next/server/app/api/cli-tools/opencode-settings/route.js +2 -2
  88. package/app/.next/server/app/api/cloud/auth/route.js +1 -1
  89. package/app/.next/server/app/api/cloud/credentials/update/route.js +1 -1
  90. package/app/.next/server/app/api/cloud/model/resolve/route.js +1 -1
  91. package/app/.next/server/app/api/cloud/models/alias/route.js +1 -1
  92. package/app/.next/server/app/api/combos/[id]/route.js +1 -1
  93. package/app/.next/server/app/api/combos/route.js +1 -1
  94. package/app/.next/server/app/api/health/route.js +1 -1
  95. package/app/.next/server/app/api/init/route.js +1 -1
  96. package/app/.next/server/app/api/keys/[id]/route.js +1 -1
  97. package/app/.next/server/app/api/keys/route.js +1 -1
  98. package/app/.next/server/app/api/locale/route.js +1 -1
  99. package/app/.next/server/app/api/mcp/[plugin]/message/route.js +1 -1
  100. package/app/.next/server/app/api/mcp/[plugin]/sse/route.js +2 -2
  101. package/app/.next/server/app/api/media-providers/tts/deepgram/voices/route.js +1 -1
  102. package/app/.next/server/app/api/media-providers/tts/elevenlabs/voices/route.js +1 -1
  103. package/app/.next/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
  104. package/app/.next/server/app/api/media-providers/tts/inworld/voices/route.js +1 -1
  105. package/app/.next/server/app/api/media-providers/tts/minimax/voices/route.js +1 -0
  106. package/app/.next/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -0
  107. package/app/.next/server/app/api/media-providers/tts/minimax/voices/route_client-reference-manifest.js +1 -0
  108. package/app/.next/server/app/api/media-providers/tts/voices/route.js +1 -1
  109. package/app/.next/server/app/api/media-providers/tts/voices/route.js.nft.json +1 -1
  110. package/app/.next/server/app/api/models/alias/route.js +1 -1
  111. package/app/.next/server/app/api/models/availability/route.js +1 -1
  112. package/app/.next/server/app/api/models/custom/route.js +1 -1
  113. package/app/.next/server/app/api/models/disabled/route.js +1 -1
  114. package/app/.next/server/app/api/models/route.js +1 -1
  115. package/app/.next/server/app/api/models/test/route.js +1 -1
  116. package/app/.next/server/app/api/oauth/[provider]/[action]/route.js +1 -1
  117. package/app/.next/server/app/api/oauth/cursor/auto-import/route.js +2 -2
  118. package/app/.next/server/app/api/oauth/cursor/import/route.js +1 -1
  119. package/app/.next/server/app/api/oauth/gitlab/pat/route.js +1 -1
  120. package/app/.next/server/app/api/oauth/iflow/cookie/route.js +1 -1
  121. package/app/.next/server/app/api/oauth/kiro/auto-import/route.js +1 -1
  122. package/app/.next/server/app/api/oauth/kiro/import/route.js +1 -1
  123. package/app/.next/server/app/api/oauth/kiro/social-authorize/route.js +1 -1
  124. package/app/.next/server/app/api/oauth/kiro/social-exchange/route.js +1 -1
  125. package/app/.next/server/app/api/pricing/route.js +1 -1
  126. package/app/.next/server/app/api/provider-nodes/[id]/route.js +1 -1
  127. package/app/.next/server/app/api/provider-nodes/route.js +1 -1
  128. package/app/.next/server/app/api/provider-nodes/validate/route.js +1 -1
  129. package/app/.next/server/app/api/providers/[id]/models/route.js +1 -1
  130. package/app/.next/server/app/api/providers/[id]/route.js +1 -1
  131. package/app/.next/server/app/api/providers/[id]/test/route.js +1 -1
  132. package/app/.next/server/app/api/providers/[id]/test-models/route.js +1 -1
  133. package/app/.next/server/app/api/providers/client/route.js +1 -1
  134. package/app/.next/server/app/api/providers/kilo/free-models/route.js +1 -1
  135. package/app/.next/server/app/api/providers/route.js +1 -1
  136. package/app/.next/server/app/api/providers/suggested-models/route.js +1 -1
  137. package/app/.next/server/app/api/providers/test-batch/route.js +1 -1
  138. package/app/.next/server/app/api/providers/validate/route.js +1 -1
  139. package/app/.next/server/app/api/proxy-pools/[id]/route.js +1 -1
  140. package/app/.next/server/app/api/proxy-pools/[id]/test/route.js +1 -1
  141. package/app/.next/server/app/api/proxy-pools/route.js +1 -1
  142. package/app/.next/server/app/api/proxy-pools/vercel-deploy/route.js +2 -2
  143. package/app/.next/server/app/api/settings/database/route.js +1 -1
  144. package/app/.next/server/app/api/settings/proxy-test/route.js +1 -1
  145. package/app/.next/server/app/api/settings/require-login/route.js +1 -1
  146. package/app/.next/server/app/api/settings/route.js +1 -1
  147. package/app/.next/server/app/api/shutdown/route.js +1 -1
  148. package/app/.next/server/app/api/tags/route.js +1 -1
  149. package/app/.next/server/app/api/translator/console-logs/route.js +1 -1
  150. package/app/.next/server/app/api/translator/console-logs/stream/route.js +2 -2
  151. package/app/.next/server/app/api/translator/load/route.js +1 -1
  152. package/app/.next/server/app/api/translator/save/route.js +1 -1
  153. package/app/.next/server/app/api/translator/send/route.js +1 -1
  154. package/app/.next/server/app/api/translator/translate/route.js +1 -1
  155. package/app/.next/server/app/api/tunnel/disable/route.js +1 -1
  156. package/app/.next/server/app/api/tunnel/enable/route.js +1 -1
  157. package/app/.next/server/app/api/tunnel/status/route.js +1 -1
  158. package/app/.next/server/app/api/tunnel/tailscale-check/route.js +1 -1
  159. package/app/.next/server/app/api/tunnel/tailscale-disable/route.js +1 -1
  160. package/app/.next/server/app/api/tunnel/tailscale-enable/route.js +1 -1
  161. package/app/.next/server/app/api/tunnel/tailscale-install/route.js +3 -3
  162. package/app/.next/server/app/api/tunnel/tailscale-login/route.js +1 -1
  163. package/app/.next/server/app/api/tunnel/tailscale-start-daemon/route.js +1 -1
  164. package/app/.next/server/app/api/usage/[connectionId]/route.js +1 -1
  165. package/app/.next/server/app/api/usage/chart/route.js +1 -1
  166. package/app/.next/server/app/api/usage/history/route.js +1 -1
  167. package/app/.next/server/app/api/usage/providers/route.js +1 -1
  168. package/app/.next/server/app/api/usage/request-details/route.js +1 -1
  169. package/app/.next/server/app/api/usage/request-logs/route.js +1 -1
  170. package/app/.next/server/app/api/usage/stats/route.js +1 -1
  171. package/app/.next/server/app/api/usage/stream/route.js +2 -2
  172. package/app/.next/server/app/api/v1/api/chat/route.js +1 -1
  173. package/app/.next/server/app/api/v1/audio/speech/route.js +1 -1
  174. package/app/.next/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  175. package/app/.next/server/app/api/v1/audio/transcriptions/route.js +1 -1
  176. package/app/.next/server/app/api/v1/audio/voices/route.js +1 -1
  177. package/app/.next/server/app/api/v1/chat/completions/route.js +1 -1
  178. package/app/.next/server/app/api/v1/embeddings/route.js +1 -1
  179. package/app/.next/server/app/api/v1/images/generations/route.js +2 -2
  180. package/app/.next/server/app/api/v1/messages/count_tokens/route.js +1 -1
  181. package/app/.next/server/app/api/v1/messages/route.js +1 -1
  182. package/app/.next/server/app/api/v1/models/[kind]/route.js +1 -1
  183. package/app/.next/server/app/api/v1/models/info/route.js +1 -1
  184. package/app/.next/server/app/api/v1/models/route.js +1 -1
  185. package/app/.next/server/app/api/v1/responses/compact/route.js +1 -1
  186. package/app/.next/server/app/api/v1/responses/route.js +1 -1
  187. package/app/.next/server/app/api/v1/route.js +1 -1
  188. package/app/.next/server/app/api/v1/search/route.js +1 -1
  189. package/app/.next/server/app/api/v1/web/fetch/route.js +1 -1
  190. package/app/.next/server/app/api/v1beta/models/[...path]/route.js +1 -1
  191. package/app/.next/server/app/api/v1beta/models/route.js +1 -1
  192. package/app/.next/server/app/api/version/route.js +1 -1
  193. package/app/.next/server/app/api/version/shutdown/route.js +1 -1
  194. package/app/.next/server/app/api/version/update/route.js +1 -1
  195. package/app/.next/server/app/callback/page.js +2 -2
  196. package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  197. package/app/.next/server/app/callback.html +1 -1
  198. package/app/.next/server/app/callback.rsc +4 -4
  199. package/app/.next/server/app/callback.segments/_full.segment.rsc +4 -4
  200. package/app/.next/server/app/callback.segments/_head.segment.rsc +1 -1
  201. package/app/.next/server/app/callback.segments/_index.segment.rsc +4 -4
  202. package/app/.next/server/app/callback.segments/_tree.segment.rsc +2 -2
  203. package/app/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  204. package/app/.next/server/app/callback.segments/callback.segment.rsc +1 -1
  205. package/app/.next/server/app/dashboard/basic-chat.html +1 -1
  206. package/app/.next/server/app/dashboard/basic-chat.rsc +6 -6
  207. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  208. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  209. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  210. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  211. package/app/.next/server/app/dashboard/basic-chat.segments/_full.segment.rsc +6 -6
  212. package/app/.next/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  213. package/app/.next/server/app/dashboard/basic-chat.segments/_index.segment.rsc +4 -4
  214. package/app/.next/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
  215. package/app/.next/server/app/dashboard/cli-tools.html +1 -1
  216. package/app/.next/server/app/dashboard/cli-tools.rsc +6 -6
  217. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  218. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  219. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  220. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  221. package/app/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +6 -6
  222. package/app/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  223. package/app/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +4 -4
  224. package/app/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
  225. package/app/.next/server/app/dashboard/combos.html +1 -1
  226. package/app/.next/server/app/dashboard/combos.rsc +6 -6
  227. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  228. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  229. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  230. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  231. package/app/.next/server/app/dashboard/combos.segments/_full.segment.rsc +6 -6
  232. package/app/.next/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  233. package/app/.next/server/app/dashboard/combos.segments/_index.segment.rsc +4 -4
  234. package/app/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
  235. package/app/.next/server/app/dashboard/endpoint.html +1 -1
  236. package/app/.next/server/app/dashboard/endpoint.rsc +6 -6
  237. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  238. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  239. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  240. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  241. package/app/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +6 -6
  242. package/app/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  243. package/app/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +4 -4
  244. package/app/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
  245. package/app/.next/server/app/dashboard/media-providers/web.html +1 -1
  246. package/app/.next/server/app/dashboard/media-providers/web.rsc +6 -6
  247. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  248. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  249. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  250. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  251. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  252. package/app/.next/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +6 -6
  253. package/app/.next/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  254. package/app/.next/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +4 -4
  255. package/app/.next/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +2 -2
  256. package/app/.next/server/app/dashboard/mitm.html +1 -1
  257. package/app/.next/server/app/dashboard/mitm.rsc +6 -6
  258. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  259. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  260. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  261. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  262. package/app/.next/server/app/dashboard/mitm.segments/_full.segment.rsc +6 -6
  263. package/app/.next/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  264. package/app/.next/server/app/dashboard/mitm.segments/_index.segment.rsc +4 -4
  265. package/app/.next/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
  266. package/app/.next/server/app/dashboard/profile.html +1 -1
  267. package/app/.next/server/app/dashboard/profile.rsc +6 -6
  268. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  269. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  270. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  271. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  272. package/app/.next/server/app/dashboard/profile.segments/_full.segment.rsc +6 -6
  273. package/app/.next/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  274. package/app/.next/server/app/dashboard/profile.segments/_index.segment.rsc +4 -4
  275. package/app/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
  276. package/app/.next/server/app/dashboard/providers/new.html +1 -1
  277. package/app/.next/server/app/dashboard/providers/new.rsc +6 -6
  278. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  279. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  280. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  281. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  282. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  283. package/app/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +6 -6
  284. package/app/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  285. package/app/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +4 -4
  286. package/app/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
  287. package/app/.next/server/app/dashboard/providers.html +1 -1
  288. package/app/.next/server/app/dashboard/providers.rsc +6 -6
  289. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  290. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  291. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  292. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  293. package/app/.next/server/app/dashboard/providers.segments/_full.segment.rsc +6 -6
  294. package/app/.next/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  295. package/app/.next/server/app/dashboard/providers.segments/_index.segment.rsc +4 -4
  296. package/app/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
  297. package/app/.next/server/app/dashboard/proxy-pools.html +1 -1
  298. package/app/.next/server/app/dashboard/proxy-pools.rsc +6 -6
  299. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  300. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  301. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  302. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  303. package/app/.next/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +6 -6
  304. package/app/.next/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  305. package/app/.next/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +4 -4
  306. package/app/.next/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
  307. package/app/.next/server/app/dashboard/quota.html +2 -2
  308. package/app/.next/server/app/dashboard/quota.rsc +7 -7
  309. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  310. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  311. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  312. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  313. package/app/.next/server/app/dashboard/quota.segments/_full.segment.rsc +7 -7
  314. package/app/.next/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  315. package/app/.next/server/app/dashboard/quota.segments/_index.segment.rsc +4 -4
  316. package/app/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
  317. package/app/.next/server/app/dashboard/settings/pricing/page.js +2 -2
  318. package/app/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  319. package/app/.next/server/app/dashboard/settings/pricing.html +1 -1
  320. package/app/.next/server/app/dashboard/settings/pricing.rsc +4 -4
  321. package/app/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +4 -4
  322. package/app/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  323. package/app/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +4 -4
  324. package/app/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
  325. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  326. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  327. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  328. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  329. package/app/.next/server/app/dashboard/skills.html +1 -1
  330. package/app/.next/server/app/dashboard/skills.rsc +6 -6
  331. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +2 -2
  332. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills.segment.rsc +1 -1
  333. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  334. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  335. package/app/.next/server/app/dashboard/skills.segments/_full.segment.rsc +6 -6
  336. package/app/.next/server/app/dashboard/skills.segments/_head.segment.rsc +1 -1
  337. package/app/.next/server/app/dashboard/skills.segments/_index.segment.rsc +4 -4
  338. package/app/.next/server/app/dashboard/skills.segments/_tree.segment.rsc +2 -2
  339. package/app/.next/server/app/dashboard/translator.html +1 -1
  340. package/app/.next/server/app/dashboard/translator.rsc +6 -6
  341. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  342. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  343. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  344. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  345. package/app/.next/server/app/dashboard/translator.segments/_full.segment.rsc +6 -6
  346. package/app/.next/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  347. package/app/.next/server/app/dashboard/translator.segments/_index.segment.rsc +4 -4
  348. package/app/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
  349. package/app/.next/server/app/dashboard/usage.html +1 -1
  350. package/app/.next/server/app/dashboard/usage.rsc +6 -6
  351. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  352. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  353. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  354. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  355. package/app/.next/server/app/dashboard/usage.segments/_full.segment.rsc +6 -6
  356. package/app/.next/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  357. package/app/.next/server/app/dashboard/usage.segments/_index.segment.rsc +4 -4
  358. package/app/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
  359. package/app/.next/server/app/dashboard.html +1 -1
  360. package/app/.next/server/app/dashboard.rsc +6 -6
  361. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  362. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  363. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  364. package/app/.next/server/app/dashboard.segments/_full.segment.rsc +6 -6
  365. package/app/.next/server/app/dashboard.segments/_head.segment.rsc +1 -1
  366. package/app/.next/server/app/dashboard.segments/_index.segment.rsc +4 -4
  367. package/app/.next/server/app/dashboard.segments/_tree.segment.rsc +2 -2
  368. package/app/.next/server/app/favicon.ico/route.js +1 -1
  369. package/app/.next/server/app/index.html +1 -1
  370. package/app/.next/server/app/index.rsc +4 -4
  371. package/app/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  372. package/app/.next/server/app/index.segments/_full.segment.rsc +4 -4
  373. package/app/.next/server/app/index.segments/_head.segment.rsc +1 -1
  374. package/app/.next/server/app/index.segments/_index.segment.rsc +4 -4
  375. package/app/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  376. package/app/.next/server/app/landing/page.js +2 -2
  377. package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  378. package/app/.next/server/app/landing.html +1 -1
  379. package/app/.next/server/app/landing.rsc +4 -4
  380. package/app/.next/server/app/landing.segments/_full.segment.rsc +4 -4
  381. package/app/.next/server/app/landing.segments/_head.segment.rsc +1 -1
  382. package/app/.next/server/app/landing.segments/_index.segment.rsc +4 -4
  383. package/app/.next/server/app/landing.segments/_tree.segment.rsc +2 -2
  384. package/app/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  385. package/app/.next/server/app/landing.segments/landing.segment.rsc +1 -1
  386. package/app/.next/server/app/login/page.js +2 -2
  387. package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
  388. package/app/.next/server/app/login.html +1 -1
  389. package/app/.next/server/app/login.rsc +5 -5
  390. package/app/.next/server/app/login.segments/_full.segment.rsc +5 -5
  391. package/app/.next/server/app/login.segments/_head.segment.rsc +1 -1
  392. package/app/.next/server/app/login.segments/_index.segment.rsc +4 -4
  393. package/app/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  394. package/app/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  395. package/app/.next/server/app/login.segments/login.segment.rsc +1 -1
  396. package/app/.next/server/app/manifest.webmanifest/route.js +2 -2
  397. package/app/.next/server/app/page.js +2 -2
  398. package/app/.next/server/app/page_client-reference-manifest.js +1 -1
  399. package/app/.next/server/app-paths-manifest.json +9 -8
  400. package/app/.next/server/chunks/1574.js +2 -2
  401. package/app/.next/server/chunks/1795.js +1 -1
  402. package/app/.next/server/chunks/21.js +1 -1
  403. package/app/.next/server/chunks/4343.js +1 -0
  404. package/app/.next/server/chunks/450.js +1 -1
  405. package/app/.next/server/chunks/6263.js +1 -1
  406. package/app/.next/server/chunks/6283.js +1 -1
  407. package/app/.next/server/chunks/6634.js +1 -1
  408. package/app/.next/server/middleware-build-manifest.js +1 -1
  409. package/app/.next/server/pages/404.html +1 -1
  410. package/app/.next/server/pages/500.html +1 -1
  411. package/app/.next/static/chunks/{4156-c8bd7124d8219ccc.js → 4156-fb6ac946bb0d8b36.js} +2 -2
  412. package/app/.next/static/chunks/505-c93657798e533e71.js +1 -0
  413. package/app/.next/static/chunks/8035-fcb662f21e288a06.js +3 -0
  414. package/app/.next/static/chunks/app/(dashboard)/dashboard/combos/page-b460baa9a0a252cc.js +1 -0
  415. package/app/.next/static/chunks/app/(dashboard)/dashboard/media-providers/[kind]/[id]/{page-015ed627bb40b0d1.js → page-c8ed0db5955a05a5.js} +11 -11
  416. package/app/.next/static/chunks/app/(dashboard)/dashboard/providers/[id]/{page-597b5dde6cf827f1.js → page-7f9c8937e17f949b.js} +2 -2
  417. package/app/.next/static/chunks/app/(dashboard)/dashboard/proxy-pools/page-884603e61682c07d.js +4 -0
  418. package/app/.next/static/chunks/app/_global-error/page-cfba9d5b02060fc3.js +1 -0
  419. package/app/.next/static/chunks/app/api/auth/login/route-cfba9d5b02060fc3.js +1 -0
  420. package/app/.next/static/chunks/app/api/auth/logout/route-cfba9d5b02060fc3.js +1 -0
  421. package/app/.next/static/chunks/app/api/auth/oidc/callback/route-cfba9d5b02060fc3.js +1 -0
  422. package/app/.next/static/chunks/app/api/auth/oidc/start/route-cfba9d5b02060fc3.js +1 -0
  423. package/app/.next/static/chunks/app/api/auth/oidc/test/route-cfba9d5b02060fc3.js +1 -0
  424. package/app/.next/static/chunks/app/api/auth/status/route-cfba9d5b02060fc3.js +1 -0
  425. package/app/.next/static/chunks/app/api/cli-tools/all-statuses/route-cfba9d5b02060fc3.js +1 -0
  426. package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-cfba9d5b02060fc3.js +1 -0
  427. package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/route-cfba9d5b02060fc3.js +1 -0
  428. package/app/.next/static/chunks/app/api/cli-tools/claude-settings/route-cfba9d5b02060fc3.js +1 -0
  429. package/app/.next/static/chunks/app/api/cli-tools/cline-settings/route-cfba9d5b02060fc3.js +1 -0
  430. package/app/.next/static/chunks/app/api/cli-tools/codex-settings/route-cfba9d5b02060fc3.js +1 -0
  431. package/app/.next/static/chunks/app/api/cli-tools/copilot-settings/route-cfba9d5b02060fc3.js +1 -0
  432. package/app/.next/static/chunks/app/api/cli-tools/cowork-mcp-registry/route-cfba9d5b02060fc3.js +1 -0
  433. package/app/.next/static/chunks/app/api/cli-tools/cowork-mcp-tools/route-cfba9d5b02060fc3.js +1 -0
  434. package/app/.next/static/chunks/app/api/cli-tools/cowork-settings/route-cfba9d5b02060fc3.js +1 -0
  435. package/app/.next/static/chunks/app/api/cli-tools/droid-settings/route-cfba9d5b02060fc3.js +1 -0
  436. package/app/.next/static/chunks/app/api/cli-tools/hermes-settings/route-cfba9d5b02060fc3.js +1 -0
  437. package/app/.next/static/chunks/app/api/cli-tools/kilo-settings/route-cfba9d5b02060fc3.js +1 -0
  438. package/app/.next/static/chunks/app/api/cli-tools/openclaw-settings/route-cfba9d5b02060fc3.js +1 -0
  439. package/app/.next/static/chunks/app/api/cli-tools/opencode-settings/route-cfba9d5b02060fc3.js +1 -0
  440. package/app/.next/static/chunks/app/api/cloud/auth/route-cfba9d5b02060fc3.js +1 -0
  441. package/app/.next/static/chunks/app/api/cloud/credentials/update/route-cfba9d5b02060fc3.js +1 -0
  442. package/app/.next/static/chunks/app/api/cloud/model/resolve/route-cfba9d5b02060fc3.js +1 -0
  443. package/app/.next/static/chunks/app/api/cloud/models/alias/route-cfba9d5b02060fc3.js +1 -0
  444. package/app/.next/static/chunks/app/api/combos/[id]/route-cfba9d5b02060fc3.js +1 -0
  445. package/app/.next/static/chunks/app/api/combos/route-cfba9d5b02060fc3.js +1 -0
  446. package/app/.next/static/chunks/app/api/health/route-cfba9d5b02060fc3.js +1 -0
  447. package/app/.next/static/chunks/app/api/init/route-cfba9d5b02060fc3.js +1 -0
  448. package/app/.next/static/chunks/app/api/keys/[id]/route-cfba9d5b02060fc3.js +1 -0
  449. package/app/.next/static/chunks/app/api/keys/route-cfba9d5b02060fc3.js +1 -0
  450. package/app/.next/static/chunks/app/api/locale/route-cfba9d5b02060fc3.js +1 -0
  451. package/app/.next/static/chunks/app/api/mcp/[plugin]/message/route-cfba9d5b02060fc3.js +1 -0
  452. package/app/.next/static/chunks/app/api/mcp/[plugin]/sse/route-cfba9d5b02060fc3.js +1 -0
  453. package/app/.next/static/chunks/app/api/media-providers/tts/deepgram/voices/route-cfba9d5b02060fc3.js +1 -0
  454. package/app/.next/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-cfba9d5b02060fc3.js +1 -0
  455. package/app/.next/static/chunks/app/api/media-providers/tts/inworld/voices/route-cfba9d5b02060fc3.js +1 -0
  456. package/app/.next/static/chunks/app/api/media-providers/tts/minimax/voices/route-cfba9d5b02060fc3.js +1 -0
  457. package/app/.next/static/chunks/app/api/media-providers/tts/voices/route-cfba9d5b02060fc3.js +1 -0
  458. package/app/.next/static/chunks/app/api/models/alias/route-cfba9d5b02060fc3.js +1 -0
  459. package/app/.next/static/chunks/app/api/models/availability/route-cfba9d5b02060fc3.js +1 -0
  460. package/app/.next/static/chunks/app/api/models/custom/route-cfba9d5b02060fc3.js +1 -0
  461. package/app/.next/static/chunks/app/api/models/disabled/route-cfba9d5b02060fc3.js +1 -0
  462. package/app/.next/static/chunks/app/api/models/route-cfba9d5b02060fc3.js +1 -0
  463. package/app/.next/static/chunks/app/api/models/test/route-cfba9d5b02060fc3.js +1 -0
  464. package/app/.next/static/chunks/app/api/oauth/[provider]/[action]/route-cfba9d5b02060fc3.js +1 -0
  465. package/app/.next/static/chunks/app/api/oauth/cursor/auto-import/route-cfba9d5b02060fc3.js +1 -0
  466. package/app/.next/static/chunks/app/api/oauth/cursor/import/route-cfba9d5b02060fc3.js +1 -0
  467. package/app/.next/static/chunks/app/api/oauth/gitlab/pat/route-cfba9d5b02060fc3.js +1 -0
  468. package/app/.next/static/chunks/app/api/oauth/iflow/cookie/route-cfba9d5b02060fc3.js +1 -0
  469. package/app/.next/static/chunks/app/api/oauth/kiro/auto-import/route-cfba9d5b02060fc3.js +1 -0
  470. package/app/.next/static/chunks/app/api/oauth/kiro/import/route-cfba9d5b02060fc3.js +1 -0
  471. package/app/.next/static/chunks/app/api/oauth/kiro/social-authorize/route-cfba9d5b02060fc3.js +1 -0
  472. package/app/.next/static/chunks/app/api/oauth/kiro/social-exchange/route-cfba9d5b02060fc3.js +1 -0
  473. package/app/.next/static/chunks/app/api/pricing/route-cfba9d5b02060fc3.js +1 -0
  474. package/app/.next/static/chunks/app/api/provider-nodes/[id]/route-cfba9d5b02060fc3.js +1 -0
  475. package/app/.next/static/chunks/app/api/provider-nodes/route-cfba9d5b02060fc3.js +1 -0
  476. package/app/.next/static/chunks/app/api/provider-nodes/validate/route-cfba9d5b02060fc3.js +1 -0
  477. package/app/.next/static/chunks/app/api/providers/[id]/models/route-cfba9d5b02060fc3.js +1 -0
  478. package/app/.next/static/chunks/app/api/providers/[id]/route-cfba9d5b02060fc3.js +1 -0
  479. package/app/.next/static/chunks/app/api/providers/[id]/test/route-cfba9d5b02060fc3.js +1 -0
  480. package/app/.next/static/chunks/app/api/providers/[id]/test-models/route-cfba9d5b02060fc3.js +1 -0
  481. package/app/.next/static/chunks/app/api/providers/client/route-cfba9d5b02060fc3.js +1 -0
  482. package/app/.next/static/chunks/app/api/providers/kilo/free-models/route-cfba9d5b02060fc3.js +1 -0
  483. package/app/.next/static/chunks/app/api/providers/route-cfba9d5b02060fc3.js +1 -0
  484. package/app/.next/static/chunks/app/api/providers/suggested-models/route-cfba9d5b02060fc3.js +1 -0
  485. package/app/.next/static/chunks/app/api/providers/test-batch/route-cfba9d5b02060fc3.js +1 -0
  486. package/app/.next/static/chunks/app/api/providers/validate/route-cfba9d5b02060fc3.js +1 -0
  487. package/app/.next/static/chunks/app/api/proxy-pools/[id]/route-cfba9d5b02060fc3.js +1 -0
  488. package/app/.next/static/chunks/app/api/proxy-pools/[id]/test/route-cfba9d5b02060fc3.js +1 -0
  489. package/app/.next/static/chunks/app/api/proxy-pools/route-cfba9d5b02060fc3.js +1 -0
  490. package/app/.next/static/chunks/app/api/proxy-pools/vercel-deploy/route-cfba9d5b02060fc3.js +1 -0
  491. package/app/.next/static/chunks/app/api/settings/database/route-cfba9d5b02060fc3.js +1 -0
  492. package/app/.next/static/chunks/app/api/settings/proxy-test/route-cfba9d5b02060fc3.js +1 -0
  493. package/app/.next/static/chunks/app/api/settings/require-login/route-cfba9d5b02060fc3.js +1 -0
  494. package/app/.next/static/chunks/app/api/settings/route-cfba9d5b02060fc3.js +1 -0
  495. package/app/.next/static/chunks/app/api/shutdown/route-cfba9d5b02060fc3.js +1 -0
  496. package/app/.next/static/chunks/app/api/tags/route-cfba9d5b02060fc3.js +1 -0
  497. package/app/.next/static/chunks/app/api/translator/console-logs/route-cfba9d5b02060fc3.js +1 -0
  498. package/app/.next/static/chunks/app/api/translator/console-logs/stream/route-cfba9d5b02060fc3.js +1 -0
  499. package/app/.next/static/chunks/app/api/translator/load/route-cfba9d5b02060fc3.js +1 -0
  500. package/app/.next/static/chunks/app/api/translator/save/route-cfba9d5b02060fc3.js +1 -0
  501. package/app/.next/static/chunks/app/api/translator/send/route-cfba9d5b02060fc3.js +1 -0
  502. package/app/.next/static/chunks/app/api/translator/translate/route-cfba9d5b02060fc3.js +1 -0
  503. package/app/.next/static/chunks/app/api/tunnel/disable/route-cfba9d5b02060fc3.js +1 -0
  504. package/app/.next/static/chunks/app/api/tunnel/enable/route-cfba9d5b02060fc3.js +1 -0
  505. package/app/.next/static/chunks/app/api/tunnel/status/route-cfba9d5b02060fc3.js +1 -0
  506. package/app/.next/static/chunks/app/api/tunnel/tailscale-check/route-cfba9d5b02060fc3.js +1 -0
  507. package/app/.next/static/chunks/app/api/tunnel/tailscale-disable/route-cfba9d5b02060fc3.js +1 -0
  508. package/app/.next/static/chunks/app/api/tunnel/tailscale-enable/route-cfba9d5b02060fc3.js +1 -0
  509. package/app/.next/static/chunks/app/api/tunnel/tailscale-install/route-cfba9d5b02060fc3.js +1 -0
  510. package/app/.next/static/chunks/app/api/tunnel/tailscale-login/route-cfba9d5b02060fc3.js +1 -0
  511. package/app/.next/static/chunks/app/api/tunnel/tailscale-start-daemon/route-cfba9d5b02060fc3.js +1 -0
  512. package/app/.next/static/chunks/app/api/usage/[connectionId]/route-cfba9d5b02060fc3.js +1 -0
  513. package/app/.next/static/chunks/app/api/usage/chart/route-cfba9d5b02060fc3.js +1 -0
  514. package/app/.next/static/chunks/app/api/usage/history/route-cfba9d5b02060fc3.js +1 -0
  515. package/app/.next/static/chunks/app/api/usage/providers/route-cfba9d5b02060fc3.js +1 -0
  516. package/app/.next/static/chunks/app/api/usage/request-details/route-cfba9d5b02060fc3.js +1 -0
  517. package/app/.next/static/chunks/app/api/usage/request-logs/route-cfba9d5b02060fc3.js +1 -0
  518. package/app/.next/static/chunks/app/api/usage/stats/route-cfba9d5b02060fc3.js +1 -0
  519. package/app/.next/static/chunks/app/api/usage/stream/route-cfba9d5b02060fc3.js +1 -0
  520. package/app/.next/static/chunks/app/api/v1/api/chat/route-cfba9d5b02060fc3.js +1 -0
  521. package/app/.next/static/chunks/app/api/v1/audio/speech/route-cfba9d5b02060fc3.js +1 -0
  522. package/app/.next/static/chunks/app/api/v1/audio/transcriptions/route-cfba9d5b02060fc3.js +1 -0
  523. package/app/.next/static/chunks/app/api/v1/audio/voices/route-cfba9d5b02060fc3.js +1 -0
  524. package/app/.next/static/chunks/app/api/v1/chat/completions/route-cfba9d5b02060fc3.js +1 -0
  525. package/app/.next/static/chunks/app/api/v1/embeddings/route-cfba9d5b02060fc3.js +1 -0
  526. package/app/.next/static/chunks/app/api/v1/images/generations/route-cfba9d5b02060fc3.js +1 -0
  527. package/app/.next/static/chunks/app/api/v1/messages/count_tokens/route-cfba9d5b02060fc3.js +1 -0
  528. package/app/.next/static/chunks/app/api/v1/messages/route-cfba9d5b02060fc3.js +1 -0
  529. package/app/.next/static/chunks/app/api/v1/models/[kind]/route-cfba9d5b02060fc3.js +1 -0
  530. package/app/.next/static/chunks/app/api/v1/models/info/route-cfba9d5b02060fc3.js +1 -0
  531. package/app/.next/static/chunks/app/api/v1/models/route-cfba9d5b02060fc3.js +1 -0
  532. package/app/.next/static/chunks/app/api/v1/responses/compact/route-cfba9d5b02060fc3.js +1 -0
  533. package/app/.next/static/chunks/app/api/v1/responses/route-cfba9d5b02060fc3.js +1 -0
  534. package/app/.next/static/chunks/app/api/v1/route-cfba9d5b02060fc3.js +1 -0
  535. package/app/.next/static/chunks/app/api/v1/search/route-cfba9d5b02060fc3.js +1 -0
  536. package/app/.next/static/chunks/app/api/v1/web/fetch/route-cfba9d5b02060fc3.js +1 -0
  537. package/app/.next/static/chunks/app/api/v1beta/models/[...path]/route-cfba9d5b02060fc3.js +1 -0
  538. package/app/.next/static/chunks/app/api/v1beta/models/route-cfba9d5b02060fc3.js +1 -0
  539. package/app/.next/static/chunks/app/api/version/route-cfba9d5b02060fc3.js +1 -0
  540. package/app/.next/static/chunks/app/api/version/shutdown/route-cfba9d5b02060fc3.js +1 -0
  541. package/app/.next/static/chunks/app/api/version/update/route-cfba9d5b02060fc3.js +1 -0
  542. package/app/.next/static/chunks/app/manifest.webmanifest/route-cfba9d5b02060fc3.js +1 -0
  543. package/app/.next/static/chunks/app/page-cfba9d5b02060fc3.js +1 -0
  544. package/app/.next/static/chunks/next/dist/client/components/builtin/app-error-cfba9d5b02060fc3.js +1 -0
  545. package/app/.next/static/chunks/next/dist/client/components/builtin/forbidden-cfba9d5b02060fc3.js +1 -0
  546. package/app/.next/static/chunks/next/dist/client/components/builtin/not-found-cfba9d5b02060fc3.js +1 -0
  547. package/app/.next/static/chunks/next/dist/client/components/builtin/unauthorized-cfba9d5b02060fc3.js +1 -0
  548. package/app/.next/static/css/ae73e0a7859fa2fc.css +1 -0
  549. package/app/.next/static/fgVTK7qqyCI904UfQrCeV/_buildManifest.js +1 -0
  550. package/app/package.json +1 -1
  551. package/app/server.js +1 -1
  552. package/app/src/mitm/server.js +29 -30
  553. package/cli.js +4 -0
  554. package/hooks/postinstall.js +7 -0
  555. package/hooks/trayRuntime.js +111 -0
  556. package/package.json +13 -5
  557. package/src/cli/tray/tray.js +187 -104
  558. package/src/cli/tray/tray.ps1 +79 -0
  559. package/src/cli/tray/trayWin.js +89 -0
  560. package/src/cli/utils/input.js +100 -182
  561. package/app/.next/server/chunks/7301.js +0 -1
  562. package/app/.next/static/chunks/505-39ae32473371c4a3.js +0 -1
  563. package/app/.next/static/chunks/8035-49b6b5ee48c18a8f.js +0 -3
  564. package/app/.next/static/chunks/app/(dashboard)/dashboard/combos/page-4e109bbbffbc2e16.js +0 -1
  565. package/app/.next/static/chunks/app/(dashboard)/dashboard/proxy-pools/page-a38a16ee9a757333.js +0 -4
  566. package/app/.next/static/chunks/app/_global-error/page-42ea861e9cbd3f66.js +0 -1
  567. package/app/.next/static/chunks/app/api/auth/login/route-42ea861e9cbd3f66.js +0 -1
  568. package/app/.next/static/chunks/app/api/auth/logout/route-42ea861e9cbd3f66.js +0 -1
  569. package/app/.next/static/chunks/app/api/auth/oidc/callback/route-42ea861e9cbd3f66.js +0 -1
  570. package/app/.next/static/chunks/app/api/auth/oidc/start/route-42ea861e9cbd3f66.js +0 -1
  571. package/app/.next/static/chunks/app/api/auth/oidc/test/route-42ea861e9cbd3f66.js +0 -1
  572. package/app/.next/static/chunks/app/api/auth/status/route-42ea861e9cbd3f66.js +0 -1
  573. package/app/.next/static/chunks/app/api/cli-tools/all-statuses/route-42ea861e9cbd3f66.js +0 -1
  574. package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-42ea861e9cbd3f66.js +0 -1
  575. package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/route-42ea861e9cbd3f66.js +0 -1
  576. package/app/.next/static/chunks/app/api/cli-tools/claude-settings/route-42ea861e9cbd3f66.js +0 -1
  577. package/app/.next/static/chunks/app/api/cli-tools/cline-settings/route-42ea861e9cbd3f66.js +0 -1
  578. package/app/.next/static/chunks/app/api/cli-tools/codex-settings/route-42ea861e9cbd3f66.js +0 -1
  579. package/app/.next/static/chunks/app/api/cli-tools/copilot-settings/route-42ea861e9cbd3f66.js +0 -1
  580. package/app/.next/static/chunks/app/api/cli-tools/cowork-mcp-registry/route-42ea861e9cbd3f66.js +0 -1
  581. package/app/.next/static/chunks/app/api/cli-tools/cowork-mcp-tools/route-42ea861e9cbd3f66.js +0 -1
  582. package/app/.next/static/chunks/app/api/cli-tools/cowork-settings/route-42ea861e9cbd3f66.js +0 -1
  583. package/app/.next/static/chunks/app/api/cli-tools/droid-settings/route-42ea861e9cbd3f66.js +0 -1
  584. package/app/.next/static/chunks/app/api/cli-tools/hermes-settings/route-42ea861e9cbd3f66.js +0 -1
  585. package/app/.next/static/chunks/app/api/cli-tools/kilo-settings/route-42ea861e9cbd3f66.js +0 -1
  586. package/app/.next/static/chunks/app/api/cli-tools/openclaw-settings/route-42ea861e9cbd3f66.js +0 -1
  587. package/app/.next/static/chunks/app/api/cli-tools/opencode-settings/route-42ea861e9cbd3f66.js +0 -1
  588. package/app/.next/static/chunks/app/api/cloud/auth/route-42ea861e9cbd3f66.js +0 -1
  589. package/app/.next/static/chunks/app/api/cloud/credentials/update/route-42ea861e9cbd3f66.js +0 -1
  590. package/app/.next/static/chunks/app/api/cloud/model/resolve/route-42ea861e9cbd3f66.js +0 -1
  591. package/app/.next/static/chunks/app/api/cloud/models/alias/route-42ea861e9cbd3f66.js +0 -1
  592. package/app/.next/static/chunks/app/api/combos/[id]/route-42ea861e9cbd3f66.js +0 -1
  593. package/app/.next/static/chunks/app/api/combos/route-42ea861e9cbd3f66.js +0 -1
  594. package/app/.next/static/chunks/app/api/health/route-42ea861e9cbd3f66.js +0 -1
  595. package/app/.next/static/chunks/app/api/init/route-42ea861e9cbd3f66.js +0 -1
  596. package/app/.next/static/chunks/app/api/keys/[id]/route-42ea861e9cbd3f66.js +0 -1
  597. package/app/.next/static/chunks/app/api/keys/route-42ea861e9cbd3f66.js +0 -1
  598. package/app/.next/static/chunks/app/api/locale/route-42ea861e9cbd3f66.js +0 -1
  599. package/app/.next/static/chunks/app/api/mcp/[plugin]/message/route-42ea861e9cbd3f66.js +0 -1
  600. package/app/.next/static/chunks/app/api/mcp/[plugin]/sse/route-42ea861e9cbd3f66.js +0 -1
  601. package/app/.next/static/chunks/app/api/media-providers/tts/deepgram/voices/route-42ea861e9cbd3f66.js +0 -1
  602. package/app/.next/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-42ea861e9cbd3f66.js +0 -1
  603. package/app/.next/static/chunks/app/api/media-providers/tts/inworld/voices/route-42ea861e9cbd3f66.js +0 -1
  604. package/app/.next/static/chunks/app/api/media-providers/tts/voices/route-42ea861e9cbd3f66.js +0 -1
  605. package/app/.next/static/chunks/app/api/models/alias/route-42ea861e9cbd3f66.js +0 -1
  606. package/app/.next/static/chunks/app/api/models/availability/route-42ea861e9cbd3f66.js +0 -1
  607. package/app/.next/static/chunks/app/api/models/custom/route-42ea861e9cbd3f66.js +0 -1
  608. package/app/.next/static/chunks/app/api/models/disabled/route-42ea861e9cbd3f66.js +0 -1
  609. package/app/.next/static/chunks/app/api/models/route-42ea861e9cbd3f66.js +0 -1
  610. package/app/.next/static/chunks/app/api/models/test/route-42ea861e9cbd3f66.js +0 -1
  611. package/app/.next/static/chunks/app/api/oauth/[provider]/[action]/route-42ea861e9cbd3f66.js +0 -1
  612. package/app/.next/static/chunks/app/api/oauth/cursor/auto-import/route-42ea861e9cbd3f66.js +0 -1
  613. package/app/.next/static/chunks/app/api/oauth/cursor/import/route-42ea861e9cbd3f66.js +0 -1
  614. package/app/.next/static/chunks/app/api/oauth/gitlab/pat/route-42ea861e9cbd3f66.js +0 -1
  615. package/app/.next/static/chunks/app/api/oauth/iflow/cookie/route-42ea861e9cbd3f66.js +0 -1
  616. package/app/.next/static/chunks/app/api/oauth/kiro/auto-import/route-42ea861e9cbd3f66.js +0 -1
  617. package/app/.next/static/chunks/app/api/oauth/kiro/import/route-42ea861e9cbd3f66.js +0 -1
  618. package/app/.next/static/chunks/app/api/oauth/kiro/social-authorize/route-42ea861e9cbd3f66.js +0 -1
  619. package/app/.next/static/chunks/app/api/oauth/kiro/social-exchange/route-42ea861e9cbd3f66.js +0 -1
  620. package/app/.next/static/chunks/app/api/pricing/route-42ea861e9cbd3f66.js +0 -1
  621. package/app/.next/static/chunks/app/api/provider-nodes/[id]/route-42ea861e9cbd3f66.js +0 -1
  622. package/app/.next/static/chunks/app/api/provider-nodes/route-42ea861e9cbd3f66.js +0 -1
  623. package/app/.next/static/chunks/app/api/provider-nodes/validate/route-42ea861e9cbd3f66.js +0 -1
  624. package/app/.next/static/chunks/app/api/providers/[id]/models/route-42ea861e9cbd3f66.js +0 -1
  625. package/app/.next/static/chunks/app/api/providers/[id]/route-42ea861e9cbd3f66.js +0 -1
  626. package/app/.next/static/chunks/app/api/providers/[id]/test/route-42ea861e9cbd3f66.js +0 -1
  627. package/app/.next/static/chunks/app/api/providers/[id]/test-models/route-42ea861e9cbd3f66.js +0 -1
  628. package/app/.next/static/chunks/app/api/providers/client/route-42ea861e9cbd3f66.js +0 -1
  629. package/app/.next/static/chunks/app/api/providers/kilo/free-models/route-42ea861e9cbd3f66.js +0 -1
  630. package/app/.next/static/chunks/app/api/providers/route-42ea861e9cbd3f66.js +0 -1
  631. package/app/.next/static/chunks/app/api/providers/suggested-models/route-42ea861e9cbd3f66.js +0 -1
  632. package/app/.next/static/chunks/app/api/providers/test-batch/route-42ea861e9cbd3f66.js +0 -1
  633. package/app/.next/static/chunks/app/api/providers/validate/route-42ea861e9cbd3f66.js +0 -1
  634. package/app/.next/static/chunks/app/api/proxy-pools/[id]/route-42ea861e9cbd3f66.js +0 -1
  635. package/app/.next/static/chunks/app/api/proxy-pools/[id]/test/route-42ea861e9cbd3f66.js +0 -1
  636. package/app/.next/static/chunks/app/api/proxy-pools/route-42ea861e9cbd3f66.js +0 -1
  637. package/app/.next/static/chunks/app/api/proxy-pools/vercel-deploy/route-42ea861e9cbd3f66.js +0 -1
  638. package/app/.next/static/chunks/app/api/settings/database/route-42ea861e9cbd3f66.js +0 -1
  639. package/app/.next/static/chunks/app/api/settings/proxy-test/route-42ea861e9cbd3f66.js +0 -1
  640. package/app/.next/static/chunks/app/api/settings/require-login/route-42ea861e9cbd3f66.js +0 -1
  641. package/app/.next/static/chunks/app/api/settings/route-42ea861e9cbd3f66.js +0 -1
  642. package/app/.next/static/chunks/app/api/shutdown/route-42ea861e9cbd3f66.js +0 -1
  643. package/app/.next/static/chunks/app/api/tags/route-42ea861e9cbd3f66.js +0 -1
  644. package/app/.next/static/chunks/app/api/translator/console-logs/route-42ea861e9cbd3f66.js +0 -1
  645. package/app/.next/static/chunks/app/api/translator/console-logs/stream/route-42ea861e9cbd3f66.js +0 -1
  646. package/app/.next/static/chunks/app/api/translator/load/route-42ea861e9cbd3f66.js +0 -1
  647. package/app/.next/static/chunks/app/api/translator/save/route-42ea861e9cbd3f66.js +0 -1
  648. package/app/.next/static/chunks/app/api/translator/send/route-42ea861e9cbd3f66.js +0 -1
  649. package/app/.next/static/chunks/app/api/translator/translate/route-42ea861e9cbd3f66.js +0 -1
  650. package/app/.next/static/chunks/app/api/tunnel/disable/route-42ea861e9cbd3f66.js +0 -1
  651. package/app/.next/static/chunks/app/api/tunnel/enable/route-42ea861e9cbd3f66.js +0 -1
  652. package/app/.next/static/chunks/app/api/tunnel/status/route-42ea861e9cbd3f66.js +0 -1
  653. package/app/.next/static/chunks/app/api/tunnel/tailscale-check/route-42ea861e9cbd3f66.js +0 -1
  654. package/app/.next/static/chunks/app/api/tunnel/tailscale-disable/route-42ea861e9cbd3f66.js +0 -1
  655. package/app/.next/static/chunks/app/api/tunnel/tailscale-enable/route-42ea861e9cbd3f66.js +0 -1
  656. package/app/.next/static/chunks/app/api/tunnel/tailscale-install/route-42ea861e9cbd3f66.js +0 -1
  657. package/app/.next/static/chunks/app/api/tunnel/tailscale-login/route-42ea861e9cbd3f66.js +0 -1
  658. package/app/.next/static/chunks/app/api/tunnel/tailscale-start-daemon/route-42ea861e9cbd3f66.js +0 -1
  659. package/app/.next/static/chunks/app/api/usage/[connectionId]/route-42ea861e9cbd3f66.js +0 -1
  660. package/app/.next/static/chunks/app/api/usage/chart/route-42ea861e9cbd3f66.js +0 -1
  661. package/app/.next/static/chunks/app/api/usage/history/route-42ea861e9cbd3f66.js +0 -1
  662. package/app/.next/static/chunks/app/api/usage/providers/route-42ea861e9cbd3f66.js +0 -1
  663. package/app/.next/static/chunks/app/api/usage/request-details/route-42ea861e9cbd3f66.js +0 -1
  664. package/app/.next/static/chunks/app/api/usage/request-logs/route-42ea861e9cbd3f66.js +0 -1
  665. package/app/.next/static/chunks/app/api/usage/stats/route-42ea861e9cbd3f66.js +0 -1
  666. package/app/.next/static/chunks/app/api/usage/stream/route-42ea861e9cbd3f66.js +0 -1
  667. package/app/.next/static/chunks/app/api/v1/api/chat/route-42ea861e9cbd3f66.js +0 -1
  668. package/app/.next/static/chunks/app/api/v1/audio/speech/route-42ea861e9cbd3f66.js +0 -1
  669. package/app/.next/static/chunks/app/api/v1/audio/transcriptions/route-42ea861e9cbd3f66.js +0 -1
  670. package/app/.next/static/chunks/app/api/v1/audio/voices/route-42ea861e9cbd3f66.js +0 -1
  671. package/app/.next/static/chunks/app/api/v1/chat/completions/route-42ea861e9cbd3f66.js +0 -1
  672. package/app/.next/static/chunks/app/api/v1/embeddings/route-42ea861e9cbd3f66.js +0 -1
  673. package/app/.next/static/chunks/app/api/v1/images/generations/route-42ea861e9cbd3f66.js +0 -1
  674. package/app/.next/static/chunks/app/api/v1/messages/count_tokens/route-42ea861e9cbd3f66.js +0 -1
  675. package/app/.next/static/chunks/app/api/v1/messages/route-42ea861e9cbd3f66.js +0 -1
  676. package/app/.next/static/chunks/app/api/v1/models/[kind]/route-42ea861e9cbd3f66.js +0 -1
  677. package/app/.next/static/chunks/app/api/v1/models/info/route-42ea861e9cbd3f66.js +0 -1
  678. package/app/.next/static/chunks/app/api/v1/models/route-42ea861e9cbd3f66.js +0 -1
  679. package/app/.next/static/chunks/app/api/v1/responses/compact/route-42ea861e9cbd3f66.js +0 -1
  680. package/app/.next/static/chunks/app/api/v1/responses/route-42ea861e9cbd3f66.js +0 -1
  681. package/app/.next/static/chunks/app/api/v1/route-42ea861e9cbd3f66.js +0 -1
  682. package/app/.next/static/chunks/app/api/v1/search/route-42ea861e9cbd3f66.js +0 -1
  683. package/app/.next/static/chunks/app/api/v1/web/fetch/route-42ea861e9cbd3f66.js +0 -1
  684. package/app/.next/static/chunks/app/api/v1beta/models/[...path]/route-42ea861e9cbd3f66.js +0 -1
  685. package/app/.next/static/chunks/app/api/v1beta/models/route-42ea861e9cbd3f66.js +0 -1
  686. package/app/.next/static/chunks/app/api/version/route-42ea861e9cbd3f66.js +0 -1
  687. package/app/.next/static/chunks/app/api/version/shutdown/route-42ea861e9cbd3f66.js +0 -1
  688. package/app/.next/static/chunks/app/api/version/update/route-42ea861e9cbd3f66.js +0 -1
  689. package/app/.next/static/chunks/app/manifest.webmanifest/route-42ea861e9cbd3f66.js +0 -1
  690. package/app/.next/static/chunks/app/page-42ea861e9cbd3f66.js +0 -1
  691. package/app/.next/static/chunks/next/dist/client/components/builtin/app-error-42ea861e9cbd3f66.js +0 -1
  692. package/app/.next/static/chunks/next/dist/client/components/builtin/forbidden-42ea861e9cbd3f66.js +0 -1
  693. package/app/.next/static/chunks/next/dist/client/components/builtin/not-found-42ea861e9cbd3f66.js +0 -1
  694. package/app/.next/static/chunks/next/dist/client/components/builtin/unauthorized-42ea861e9cbd3f66.js +0 -1
  695. package/app/.next/static/css/a6ccc343d8389dcd.css +0 -1
  696. package/app/.next/static/xjtYx1FfVtGAPQbE4LiMu/_buildManifest.js +0 -1
  697. /package/app/.next/static/{xjtYx1FfVtGAPQbE4LiMu → fgVTK7qqyCI904UfQrCeV}/_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,111 @@
1
+ // Lazy install systray2 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
+ //
6
+ // We use the maintained `systray2` fork. The original `systray@1.0.5` package
7
+ // bundles a 2017 x86_64 Go binary whose Mach-O headers are rejected by modern
8
+ // dyld (macOS 14+), so the tray silently fails to register on Apple Silicon.
9
+ const { spawnSync } = require("child_process");
10
+ const fs = require("fs");
11
+ const path = require("path");
12
+ const { getRuntimeDir, getRuntimeNodeModules } = require("./sqliteRuntime");
13
+
14
+ const SYSTRAY_PKG = "systray2";
15
+ const SYSTRAY_VERSION = "2.1.4";
16
+ const LEGACY_SYSTRAY_PKG = "systray";
17
+
18
+ function hasSystray() {
19
+ return fs.existsSync(path.join(getRuntimeNodeModules(), SYSTRAY_PKG, "package.json"));
20
+ }
21
+
22
+ // Remove the legacy `systray` package from all known locations.
23
+ // On Windows it was an AV false-positive risk; on macOS/Linux its bundled
24
+ // binary is broken on modern OS versions.
25
+ function cleanupLegacySystray({ silent = false } = {}) {
26
+ // 1) Runtime dir: ~/.9router/runtime/node_modules/systray (or %APPDATA% on Win)
27
+ // 2) npm global nested: <npm_prefix>/node_modules/9router/node_modules/systray
28
+ // __dirname here = <pkg root>/hooks → up 1 = pkg root
29
+ const targets = [
30
+ path.join(getRuntimeNodeModules(), LEGACY_SYSTRAY_PKG),
31
+ path.join(__dirname, "..", "node_modules", LEGACY_SYSTRAY_PKG)
32
+ ];
33
+ for (const dir of targets) {
34
+ if (fs.existsSync(dir)) {
35
+ try {
36
+ fs.rmSync(dir, { recursive: true, force: true });
37
+ if (!silent) console.log(`[9router][runtime] removed legacy systray: ${dir}`);
38
+ } catch (e) {
39
+ if (!silent) console.warn(`[9router][runtime] failed to remove ${dir}: ${e.message}`);
40
+ }
41
+ }
42
+ }
43
+ }
44
+
45
+ // systray2's npm tarball sometimes ships the bundled Go binary without the
46
+ // executable bit set on macOS, causing spawn() to fail with EACCES. Set +x
47
+ // best-effort so the tray actually starts.
48
+ function chmodSystrayBin({ silent = false } = {}) {
49
+ if (process.platform === "win32") return;
50
+ const binName = process.platform === "darwin" ? "tray_darwin_release" : "tray_linux_release";
51
+ const binPath = path.join(getRuntimeNodeModules(), SYSTRAY_PKG, "traybin", binName);
52
+ if (!fs.existsSync(binPath)) return;
53
+ try {
54
+ fs.chmodSync(binPath, 0o755);
55
+ } catch (e) {
56
+ if (!silent) console.warn(`[9router][runtime] chmod tray bin failed: ${e.message}`);
57
+ }
58
+ }
59
+
60
+ function ensureRuntimeDir() {
61
+ const dir = getRuntimeDir();
62
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
63
+ const pkgPath = path.join(dir, "package.json");
64
+ if (!fs.existsSync(pkgPath)) {
65
+ fs.writeFileSync(pkgPath, JSON.stringify({
66
+ name: "9router-runtime",
67
+ version: "1.0.0",
68
+ private: true
69
+ }, null, 2));
70
+ }
71
+ return dir;
72
+ }
73
+
74
+ function npmInstall(pkgs, { silent = false } = {}) {
75
+ const cwd = ensureRuntimeDir();
76
+ const args = ["install", ...pkgs, "--no-audit", "--no-fund", "--no-save", "--prefer-online"];
77
+ const npmCmd = process.platform === "win32" ? "npm.cmd" : "npm";
78
+ if (!silent) console.log(`[9router][runtime] ${npmCmd} ${args.join(" ")} (cwd: ${cwd})`);
79
+ const res = spawnSync(npmCmd, args, {
80
+ cwd,
81
+ stdio: silent ? "ignore" : "inherit",
82
+ timeout: 120000,
83
+ shell: process.platform === "win32"
84
+ });
85
+ return res.status === 0;
86
+ }
87
+
88
+ // Public: ensure systray2 is installed on macOS/Linux only.
89
+ // Windows skips entirely (uses PowerShell tray).
90
+ function ensureTrayRuntime({ silent = false } = {}) {
91
+ // Always evict the legacy `systray` package — its binary is broken on
92
+ // modern macOS and an AV false-positive on Windows.
93
+ cleanupLegacySystray({ silent });
94
+
95
+ if (process.platform === "win32") {
96
+ return { systray: false, skipped: true };
97
+ }
98
+ if (hasSystray()) {
99
+ chmodSystrayBin({ silent });
100
+ if (!silent) console.log("[9router][runtime] systray2 OK");
101
+ return { systray: true };
102
+ }
103
+ const ok = npmInstall([`${SYSTRAY_PKG}@${SYSTRAY_VERSION}`], { silent });
104
+ if (ok) chmodSystrayBin({ silent });
105
+ if (!ok && !silent) {
106
+ console.warn("[9router][runtime] systray2 install failed (tray will be disabled)");
107
+ }
108
+ return { systray: ok && hasSystray() };
109
+ }
110
+
111
+ module.exports = { ensureTrayRuntime };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "9router",
3
- "version": "0.4.31",
3
+ "version": "0.4.36",
4
4
  "description": "9Router CLI - Start and manage 9Router server",
5
5
  "bin": {
6
6
  "9router": "./cli.js"
@@ -14,17 +14,22 @@
14
14
  "LICENSE"
15
15
  ],
16
16
  "scripts": {
17
+ "dev": "nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js",
18
+ "build": "node scripts/build-cli.js",
19
+ "pack:cli": "npm run build && npm pack --pack-destination ../..",
20
+ "publish:cli": "npm run build && npm publish && node ../scripts/dockerPublish.js",
17
21
  "postinstall": "node hooks/postinstall.js",
18
- "prepublishOnly": "cd .. && npm run build:cli"
22
+ "prepublishOnly": "npm run build"
19
23
  },
20
24
  "dependencies": {
25
+ "enquirer": "^2.4.1",
21
26
  "node-forge": "^1.3.3",
22
27
  "node-machine-id": "^1.1.12",
23
28
  "react": "19.2.1",
24
- "react-dom": "19.2.1",
25
- "systray": "^1.0.5"
29
+ "react-dom": "19.2.1"
26
30
  },
27
31
  "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.",
32
+ "comment_systray": "systray2 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 unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.",
28
33
  "engines": {
29
34
  "node": ">=18.0.0"
30
35
  },
@@ -35,5 +40,8 @@
35
40
  "ai",
36
41
  "api"
37
42
  ],
38
- "license": "MIT"
43
+ "license": "MIT",
44
+ "devDependencies": {
45
+ "nodemon": "^3.1.14"
46
+ }
39
47
  }
@@ -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,204 @@ 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
+ }
52
71
 
72
+ // Menu item indexes
73
+ const MENU_INDEX = { STATUS: 0, DASHBOARD: 1, AUTOSTART: 2, QUIT: 3 };
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
+ * Prefers `systray2` (active fork of `systray`, ships newer
145
+ * getlantern/systray-portable binaries that work on macOS 14+ and Apple
146
+ * Silicon under Rosetta). Falls back to legacy `systray@1.0.5` if systray2
147
+ * is not available, though that binary's Mach-O headers are rejected by
148
+ * modern dyld and the icon will not appear.
149
+ */
150
+ function resolveSystray() {
151
+ let runtimeDir = null;
152
+ try {
153
+ const { getRuntimeNodeModules } = require("../../../hooks/sqliteRuntime");
154
+ runtimeDir = getRuntimeNodeModules();
155
+ } catch (e) {}
156
+
157
+ // 1) systray2 in runtime dir (where ensureTrayRuntime installs it)
158
+ if (runtimeDir) {
159
+ try { return { mod: require(path.join(runtimeDir, "systray2")).default, isV2: true }; } catch (e) {}
160
+ }
161
+ // 2) systray2 resolvable from the package's own node_modules / NODE_PATH
162
+ try { return { mod: require("systray2").default, isV2: true }; } catch (e) {}
163
+ // 3) Legacy systray fallback (unlikely to render on modern macOS)
164
+ try { return { mod: require("systray").default, isV2: false }; } catch (e) {}
165
+ if (runtimeDir) {
166
+ try { return { mod: require(path.join(runtimeDir, "systray")).default, isV2: false }; } catch (e) {}
167
+ }
168
+ return null;
169
+ }
170
+
171
+ function chmodTrayBin(pkgName) {
172
+ // systray2's npm tarball occasionally lands without +x on the bundled Go
173
+ // binary (observed on macOS). spawn() then fails with EACCES. Best-effort
174
+ // chmod on every init avoids a hard-to-diagnose silent tray failure.
175
+ try {
176
+ const { getRuntimeNodeModules } = require("../../../hooks/sqliteRuntime");
177
+ const binName = process.platform === "darwin" ? "tray_darwin_release" : "tray_linux_release";
178
+ const candidates = [
179
+ path.join(getRuntimeNodeModules(), pkgName, "traybin", binName),
180
+ path.join(__dirname, "..", "..", "..", "node_modules", pkgName, "traybin", binName)
181
+ ];
182
+ for (const p of candidates) {
183
+ if (fs.existsSync(p)) fs.chmodSync(p, 0o755);
184
+ }
185
+ } catch (e) {}
186
+ }
187
+
188
+ function initUnixTray(options) {
189
+ const { port } = options;
190
+ try {
191
+ const resolved = resolveSystray();
192
+ if (!resolved) return null;
193
+ const { mod: SysTray, isV2 } = resolved;
194
+
195
+ chmodTrayBin(isV2 ? "systray2" : "systray");
196
+
197
+ const autostartEnabled = getAutostartEnabled();
198
+ const items = buildMenuItems(port, autostartEnabled);
62
199
 
63
- const isWin = process.platform === "win32";
64
200
  const menu = {
65
201
  icon: getIconBase64(),
66
- // macOS requires empty title; Windows uses title as the tray icon tooltip
67
- title: isWin ? `9Router - Port ${port}` : "",
202
+ // The bundled icon.png is a full-color RGBA logo. Don't mark it as a
203
+ // template icon: macOS would then render it as a solid white square
204
+ // because template mode only uses the alpha channel.
205
+ isTemplateIcon: false,
206
+ title: "",
68
207
  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
- ]
208
+ items
91
209
  };
92
210
 
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;
211
+ trayInstance = new SysTray({ menu, debug: false, copyDir: false });
212
+ isWinTray = false;
101
213
 
102
214
  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
- }
215
+ handleClick(action.seq_id, options, (newEnabled) => {
216
+ trayInstance.sendAction({
217
+ type: "update-item",
218
+ item: {
219
+ title: newEnabled ? "āœ“ Auto-start Enabled" : "Enable Auto-start",
220
+ tooltip: "Run on OS startup",
221
+ enabled: true
222
+ },
223
+ seq_id: MENU_INDEX.AUTOSTART
224
+ });
225
+ });
149
226
  });
150
227
 
151
- trayInstance.onReady(() => {
152
- // Tray ready - silent
153
- });
154
-
155
- trayInstance.onError((err) => {
156
- // Ignore errors during shutdown
157
- });
228
+ if (isV2) {
229
+ // systray2 exposes a ready() promise instead of onReady/onError. Surface
230
+ // failures (binary crash, EACCES, etc.) so users can see why the icon
231
+ // didn't appear instead of getting a misleading "running in tray" log.
232
+ trayInstance.ready().catch((err) => {
233
+ process.stderr.write(`[9router] tray failed to start: ${err && err.message ? err.message : err}\n`);
234
+ });
235
+ } else {
236
+ trayInstance.onReady(() => {});
237
+ trayInstance.onError(() => {});
238
+ }
158
239
 
159
240
  return trayInstance;
160
241
  } catch (err) {
161
- // Silent fail - tray is optional, app continues without it
242
+ process.stderr.write(`[9router] tray init error: ${err.message}\n`);
162
243
  return null;
163
244
  }
164
245
  }
@@ -168,15 +249,17 @@ function initTray(options) {
168
249
  */
169
250
  function killTray() {
170
251
  const instance = trayInstance;
171
- trayInstance = null; // Set to null first to prevent error handlers
172
-
252
+ const wasWin = isWinTray;
253
+ trayInstance = null;
254
+
173
255
  if (instance) {
174
256
  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
- }
257
+ if (wasWin) instance.kill();
258
+ // systray2.kill(true) defaults to calling process.exit(0) which aborts
259
+ // the rest of cleanup (server SIGKILL, MITM/tunnel cleanup). Pass false
260
+ // so callers stay in control of process exit.
261
+ else instance.kill(false);
262
+ } catch (e) {}
180
263
  }
181
264
  }
182
265
 
@@ -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()