@jheavenknows/bluerouter 1.0.26 → 1.0.29

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 (498) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -3
  3. package/app/.next-cli-build/BUILD_ID +1 -1
  4. package/app/.next-cli-build/app-path-routes-manifest.json +3 -3
  5. package/app/.next-cli-build/build-manifest.json +2 -2
  6. package/app/.next-cli-build/prerender-manifest.json +3 -3
  7. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  8. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js +3 -3
  9. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
  10. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  11. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js +1 -1
  12. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  13. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  14. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  15. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  16. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  17. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  18. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  19. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  20. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  21. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  22. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  23. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  24. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  25. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  26. package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page_client-reference-manifest.js +1 -1
  27. package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page_client-reference-manifest.js +1 -1
  28. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  29. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  30. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  31. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  32. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  33. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js +1 -1
  34. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  35. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  36. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  37. package/app/.next-cli-build/server/app/(dashboard)/dashboard/virtual-combos/page_client-reference-manifest.js +1 -1
  38. package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  39. package/app/.next-cli-build/server/app/_global-error.html +1 -1
  40. package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  41. package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  42. package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  43. package/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  44. package/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
  45. package/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
  46. package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  47. package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  48. package/app/.next-cli-build/server/app/_not-found.html +1 -1
  49. package/app/.next-cli-build/server/app/_not-found.rsc +5 -5
  50. package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +5 -5
  51. package/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
  52. package/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +4 -4
  53. package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  54. package/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  55. package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  56. package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js.nft.json +1 -1
  57. package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js.nft.json +1 -1
  58. package/app/.next-cli-build/server/app/api/auth/login/route.js +1 -1
  59. package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
  60. package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
  61. package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
  62. package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
  63. package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
  64. package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
  65. package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js +5 -5
  66. package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
  67. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js +2 -2
  68. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  69. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/autostart/route.js.nft.json +1 -1
  70. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js.nft.json +1 -1
  71. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/root-ca/route.js +2 -2
  72. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/root-ca/route.js.nft.json +1 -1
  73. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js +1 -1
  74. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
  75. package/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js +2 -2
  76. package/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js +1 -1
  77. package/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js +1 -1
  78. package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js +2 -2
  79. package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
  80. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js +2 -2
  81. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js +2 -2
  82. package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js +1 -1
  83. package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
  84. package/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js +3 -3
  85. package/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js +2 -2
  86. package/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js +3 -3
  87. package/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js +2 -2
  88. package/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js +2 -2
  89. package/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js +2 -2
  90. package/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js +2 -2
  91. package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
  92. package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
  93. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js.nft.json +1 -1
  94. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js.nft.json +1 -1
  95. package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
  96. package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
  97. package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
  98. package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
  99. package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
  100. package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
  101. package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
  102. package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
  103. package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
  104. package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
  105. package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
  106. package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
  107. package/app/.next-cli-build/server/app/api/models/route.js +1 -1
  108. package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
  109. package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
  110. package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
  111. package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  112. package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
  113. package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
  114. package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
  115. package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
  116. package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
  117. package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
  118. package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
  119. package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
  120. package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
  121. package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
  122. package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  123. package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
  124. package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  125. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
  126. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
  127. package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
  128. package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  129. package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
  130. package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  131. package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
  132. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
  133. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js +1 -1
  134. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
  135. package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
  136. package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
  137. package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
  138. package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
  139. package/app/.next-cli-build/server/app/api/settings/proxy-test/route.js +1 -1
  140. package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
  141. package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
  142. package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  143. package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  144. package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
  145. package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
  146. package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
  147. package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
  148. package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
  149. package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
  150. package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
  151. package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
  152. package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js +2 -2
  153. package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
  154. package/app/.next-cli-build/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
  155. package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js +1 -1
  156. package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
  157. package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  158. package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
  159. package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
  160. package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
  161. package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
  162. package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  163. package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
  164. package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
  165. package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  166. package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  167. package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
  168. package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  169. package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  170. package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  171. package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
  172. package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
  173. package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
  174. package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  175. package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
  176. package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
  177. package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
  178. package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
  179. package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  180. package/app/.next-cli-build/server/app/api/version/restart/route.js +1 -1
  181. package/app/.next-cli-build/server/app/api/version/route.js +1 -1
  182. package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  183. package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
  184. package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  185. package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
  186. package/app/.next-cli-build/server/app/api/virtual-combos/[id]/route.js.nft.json +1 -1
  187. package/app/.next-cli-build/server/app/api/virtual-combos/route.js.nft.json +1 -1
  188. package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  189. package/app/.next-cli-build/server/app/callback.html +1 -1
  190. package/app/.next-cli-build/server/app/callback.rsc +5 -5
  191. package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +5 -5
  192. package/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
  193. package/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +4 -4
  194. package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +2 -2
  195. package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  196. package/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
  197. package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  198. package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +7 -7
  199. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  200. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  201. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  202. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  203. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +7 -7
  204. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  205. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +4 -4
  206. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
  207. package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  208. package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +7 -7
  209. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  210. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  211. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  212. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  213. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +7 -7
  214. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  215. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +4 -4
  216. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
  217. package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  218. package/app/.next-cli-build/server/app/dashboard/combos.rsc +7 -7
  219. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  220. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  221. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  222. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  223. package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +7 -7
  224. package/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  225. package/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +4 -4
  226. package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
  227. package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  228. package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +8 -8
  229. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +3 -3
  230. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  231. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  232. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  233. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +8 -8
  234. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  235. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +4 -4
  236. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
  237. package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  238. package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +7 -7
  239. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  240. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  241. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  242. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  243. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  244. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +7 -7
  245. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  246. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +4 -4
  247. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +2 -2
  248. package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  249. package/app/.next-cli-build/server/app/dashboard/mitm.rsc +7 -7
  250. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  251. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  252. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  253. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  254. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +7 -7
  255. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  256. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +4 -4
  257. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
  258. package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  259. package/app/.next-cli-build/server/app/dashboard/profile.rsc +6 -6
  260. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +1 -1
  261. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  262. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  263. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  264. package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +6 -6
  265. package/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  266. package/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +4 -4
  267. package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
  268. package/app/.next-cli-build/server/app/dashboard/prompt-logs.html +1 -1
  269. package/app/.next-cli-build/server/app/dashboard/prompt-logs.rsc +6 -6
  270. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs/__PAGE__.segment.rsc +1 -1
  271. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs.segment.rsc +1 -1
  272. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  273. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  274. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_full.segment.rsc +6 -6
  275. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_head.segment.rsc +1 -1
  276. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_index.segment.rsc +4 -4
  277. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_tree.segment.rsc +2 -2
  278. package/app/.next-cli-build/server/app/dashboard/provider-health.html +1 -1
  279. package/app/.next-cli-build/server/app/dashboard/provider-health.rsc +6 -6
  280. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health/__PAGE__.segment.rsc +1 -1
  281. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health.segment.rsc +1 -1
  282. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  283. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  284. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_full.segment.rsc +6 -6
  285. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_head.segment.rsc +1 -1
  286. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_index.segment.rsc +4 -4
  287. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_tree.segment.rsc +2 -2
  288. package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  289. package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +7 -7
  290. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  291. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  292. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  293. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  294. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  295. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +7 -7
  296. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  297. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +4 -4
  298. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
  299. package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  300. package/app/.next-cli-build/server/app/dashboard/providers.rsc +7 -7
  301. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  302. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  303. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  304. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  305. package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +7 -7
  306. package/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  307. package/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +4 -4
  308. package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
  309. package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  310. package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +7 -7
  311. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  312. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  313. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  314. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  315. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +7 -7
  316. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  317. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +4 -4
  318. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
  319. package/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
  320. package/app/.next-cli-build/server/app/dashboard/quota.rsc +8 -8
  321. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  322. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  323. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  324. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  325. package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +8 -8
  326. package/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  327. package/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +4 -4
  328. package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
  329. package/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  330. package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  331. package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +5 -5
  332. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +5 -5
  333. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  334. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +4 -4
  335. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
  336. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  337. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  338. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  339. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  340. package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
  341. package/app/.next-cli-build/server/app/dashboard/skills.rsc +7 -7
  342. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +2 -2
  343. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills.segment.rsc +1 -1
  344. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  345. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  346. package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +7 -7
  347. package/app/.next-cli-build/server/app/dashboard/skills.segments/_head.segment.rsc +1 -1
  348. package/app/.next-cli-build/server/app/dashboard/skills.segments/_index.segment.rsc +4 -4
  349. package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +2 -2
  350. package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  351. package/app/.next-cli-build/server/app/dashboard/translator.rsc +7 -7
  352. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  353. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  354. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  355. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  356. package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +7 -7
  357. package/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  358. package/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +4 -4
  359. package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
  360. package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  361. package/app/.next-cli-build/server/app/dashboard/usage.rsc +7 -7
  362. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  363. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  364. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  365. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  366. package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +7 -7
  367. package/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  368. package/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +4 -4
  369. package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
  370. package/app/.next-cli-build/server/app/dashboard/virtual-combos.html +2 -2
  371. package/app/.next-cli-build/server/app/dashboard/virtual-combos.rsc +6 -6
  372. package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/!KGRhc2hib2FyZCk/dashboard/virtual-combos/__PAGE__.segment.rsc +1 -1
  373. package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/!KGRhc2hib2FyZCk/dashboard/virtual-combos.segment.rsc +1 -1
  374. package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  375. package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  376. package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/_full.segment.rsc +6 -6
  377. package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/_head.segment.rsc +1 -1
  378. package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/_index.segment.rsc +4 -4
  379. package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/_tree.segment.rsc +2 -2
  380. package/app/.next-cli-build/server/app/dashboard.html +1 -1
  381. package/app/.next-cli-build/server/app/dashboard.rsc +7 -7
  382. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  383. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  384. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  385. package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +7 -7
  386. package/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
  387. package/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +4 -4
  388. package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +2 -2
  389. package/app/.next-cli-build/server/app/favicon.ico/route.js +1 -1
  390. package/app/.next-cli-build/server/app/favicon.ico.body +0 -0
  391. package/app/.next-cli-build/server/app/index.html +1 -1
  392. package/app/.next-cli-build/server/app/index.rsc +5 -5
  393. package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  394. package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +5 -5
  395. package/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
  396. package/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +4 -4
  397. package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +2 -2
  398. package/app/.next-cli-build/server/app/landing/page.js +1 -1
  399. package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  400. package/app/.next-cli-build/server/app/landing.html +1 -1
  401. package/app/.next-cli-build/server/app/landing.rsc +6 -6
  402. package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +6 -6
  403. package/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
  404. package/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +4 -4
  405. package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +2 -2
  406. package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +2 -2
  407. package/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
  408. package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  409. package/app/.next-cli-build/server/app/login.html +1 -1
  410. package/app/.next-cli-build/server/app/login.rsc +5 -5
  411. package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +5 -5
  412. package/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
  413. package/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +4 -4
  414. package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +2 -2
  415. package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
  416. package/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
  417. package/app/.next-cli-build/server/app/manifest.webmanifest/route.js +1 -1
  418. package/app/.next-cli-build/server/app/manifest.webmanifest.body +1 -1
  419. package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  420. package/app/.next-cli-build/server/app-paths-manifest.json +3 -3
  421. package/app/.next-cli-build/server/chunks/3110.js +2 -2
  422. package/app/.next-cli-build/server/chunks/4746.js +1 -1
  423. package/app/.next-cli-build/server/chunks/476.js +2 -2
  424. package/app/.next-cli-build/server/chunks/6182.js +3 -3
  425. package/app/.next-cli-build/server/chunks/6567.js +8 -8
  426. package/app/.next-cli-build/server/chunks/7153.js +1 -1
  427. package/app/.next-cli-build/server/chunks/9447.js +1 -1
  428. package/app/.next-cli-build/server/chunks/9526.js +1 -1
  429. package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  430. package/app/.next-cli-build/server/middleware.js +3 -3
  431. package/app/.next-cli-build/server/pages/404.html +1 -1
  432. package/app/.next-cli-build/server/pages/500.html +1 -1
  433. package/app/.next-cli-build/server/server-reference-manifest.js +1 -1
  434. package/app/.next-cli-build/server/server-reference-manifest.json +1 -1
  435. package/app/.next-cli-build/static/chunks/{1321-932e605b6d47063d.js → 1321-33266ff5666dd394.js} +1 -1
  436. package/app/.next-cli-build/static/chunks/4404-63455b79e318b1c7.js +53 -0
  437. package/app/.next-cli-build/static/chunks/5497-90dfe11dd01a459e.js +7 -0
  438. package/app/.next-cli-build/static/chunks/{5907-b4c71b034a42cd8c.js → 5907-46d07be8a58ce080.js} +2 -2
  439. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/cli-tools/page-d8b42a4e1ae60f65.js +1 -0
  440. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/skills/page-84e359aafb683d81.js +1 -0
  441. package/app/.next-cli-build/static/chunks/app/landing/page-70884f02f4f66d0e.js +1 -0
  442. package/app/.next-cli-build/static/css/ec82d5a88f0fa69d.css +1 -0
  443. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/upgrade-1.0.27-to-1.0.28-1.0.28-20260526-112925/data.sqlite +0 -0
  444. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/upgrade-1.0.28-to-1.0.29-1.0.29-20260526-115911/data.sqlite +0 -0
  445. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-shm +0 -0
  446. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-wal +0 -0
  447. package/app/package.json +1 -1
  448. package/app/public/favicon.svg +49 -13
  449. package/app/public/i18n/literals/ar.json +3 -3
  450. package/app/public/i18n/literals/bn.json +3 -3
  451. package/app/public/i18n/literals/cs.json +3 -3
  452. package/app/public/i18n/literals/da.json +3 -3
  453. package/app/public/i18n/literals/de.json +3 -3
  454. package/app/public/i18n/literals/el.json +3 -3
  455. package/app/public/i18n/literals/es.json +3 -3
  456. package/app/public/i18n/literals/fi.json +3 -3
  457. package/app/public/i18n/literals/fr.json +3 -3
  458. package/app/public/i18n/literals/he.json +3 -3
  459. package/app/public/i18n/literals/hi.json +3 -3
  460. package/app/public/i18n/literals/hu.json +3 -3
  461. package/app/public/i18n/literals/id.json +3 -3
  462. package/app/public/i18n/literals/it.json +3 -3
  463. package/app/public/i18n/literals/ja.json +3 -3
  464. package/app/public/i18n/literals/ko.json +3 -3
  465. package/app/public/i18n/literals/nl.json +3 -3
  466. package/app/public/i18n/literals/no.json +3 -3
  467. package/app/public/i18n/literals/pl.json +3 -3
  468. package/app/public/i18n/literals/pt-BR.json +3 -3
  469. package/app/public/i18n/literals/pt-PT.json +3 -3
  470. package/app/public/i18n/literals/ro.json +3 -3
  471. package/app/public/i18n/literals/ru.json +3 -3
  472. package/app/public/i18n/literals/sv.json +3 -3
  473. package/app/public/i18n/literals/th.json +3 -3
  474. package/app/public/i18n/literals/tl.json +3 -3
  475. package/app/public/i18n/literals/tr.json +3 -3
  476. package/app/public/i18n/literals/uk.json +3 -3
  477. package/app/public/i18n/literals/ur.json +3 -3
  478. package/app/public/i18n/literals/vi.json +3 -3
  479. package/app/public/i18n/literals/zh-CN.json +12 -12
  480. package/app/public/i18n/literals/zh-TW.json +3 -3
  481. package/app/src/mitm/server.js +2 -2
  482. package/cli.js +4 -4
  483. package/package.json +2 -2
  484. package/src/cli/api/client.js +1 -1
  485. package/src/cli/menus/cliTools.js +14 -14
  486. package/src/cli/terminalUI.js +2 -2
  487. package/src/cli/tray/autostart.js +2 -2
  488. package/src/cli/tray/tray.js +3 -3
  489. package/src/cli/tray/tray.ps1 +1 -1
  490. package/app/.next-cli-build/static/chunks/4404-3bd3186f4ee612a1.js +0 -53
  491. package/app/.next-cli-build/static/chunks/5497-886bdd124c9e47a3.js +0 -7
  492. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/cli-tools/page-93016427d63637f4.js +0 -1
  493. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/skills/page-d00a05320aab3650.js +0 -1
  494. package/app/.next-cli-build/static/chunks/app/landing/page-743f3f6975e53a9a.js +0 -1
  495. package/app/.next-cli-build/static/css/7b0382cf3964c9a0.css +0 -1
  496. /package/app/.next-cli-build/static/{QxXip6ZNmTsndS1LuvETC → s7R5afHZdGdLCrnzcfPPg}/_buildManifest.js +0 -0
  497. /package/app/.next-cli-build/static/{QxXip6ZNmTsndS1LuvETC → s7R5afHZdGdLCrnzcfPPg}/_ssgManifest.js +0 -0
  498. /package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-1.0.23-to-1.0.24-1.0.24-20260526-103341 → upgrade-1.0.26-to-1.0.27-1.0.27-20260526-112743}/data.sqlite +0 -0
@@ -8,7 +8,7 @@
8
8
  "2. Provider Request (Translated)": "2. 提供商请求(已​​翻译)",
9
9
  "2. Redirects": "2. 重定向",
10
10
  "24h": "24小时",
11
- "3. Maps Antigravity models to any provider via 9Router": "3. 通过 9Router 将Antigravity模型映射到任何提供商",
11
+ "3. Maps Antigravity models to any provider via Bluerouter": "3. 通过 Bluerouter 将Antigravity模型映射到任何提供商",
12
12
  "3. Provider Response (Raw)": "3. 提供商响应(原始)",
13
13
  "4. Client Response (Final)": "4. 客户端响应(最终)",
14
14
  "About": "关于",
@@ -194,7 +194,7 @@
194
194
  "Enter your API key": "输入您的 API 密钥",
195
195
  "Est. Cost": "预估成本",
196
196
  "Estimated, not actual billing": "预估费用,非实际账单",
197
- "Expose your local 9Router to the internet. No port forwarding, no static IP needed. Share endpoint URL with your team or use it in Cursor, Cline, and other AI tools from anywhere.": "将您本地的 9Router 暴露到互联网。无需端口转发,无需静态 IP。与您的团队共享端点 URL 或从任何地方在 Cursor、Cline 和其他 AI 工具中使用它。",
197
+ "Expose your local Bluerouter to the internet. No port forwarding, no static IP needed. Share endpoint URL with your team or use it in Cursor, Cline, and other AI tools from anywhere.": "将您本地的 Bluerouter 暴露到互联网。无需端口转发,无需静态 IP。与您的团队共享端点 URL 或从任何地方在 Cursor、Cline 和其他 AI 工具中使用它。",
198
198
  "Factory Droid - Manual Configuration": "Factory Droid - 手动配置",
199
199
  "Factory Droid CLI not installed": "Factory Droid CLI 未安装",
200
200
  "Failed to load usage statistics.": "无法加载使用情况统计信息。",
@@ -226,7 +226,7 @@
226
226
  "Input:": "输入:",
227
227
  "Installation Guide": "安装指南",
228
228
  "Interactive diagram visible on desktop": "桌面上可见的交互式图表",
229
- "Intercepts Antigravity traffic via DNS redirect, letting you reroute models through 9Router.": "通过 DNS 重定向拦截Antigravity流量,让您可以通过 9Router 重新路由模型。",
229
+ "Intercepts Antigravity traffic via DNS redirect, letting you reroute models through Bluerouter.": "通过 DNS 重定向拦截Antigravity流量,让您可以通过 Bluerouter 重新路由模型。",
230
230
  "KB per field": "每个字段的 KB",
231
231
  "Key Name": "密钥名称",
232
232
  "Kimi": "Kimi",
@@ -463,7 +463,7 @@
463
463
  "Total Models": "模型总数",
464
464
  "Total Requests": "请求总数",
465
465
  "Total:": "总计:",
466
- "traffic through 9Router via MITM.": "通过 MITM 通过 9Router 的流量。",
466
+ "traffic through Bluerouter via MITM.": "通过 MITM 通过 Bluerouter 的流量。",
467
467
  "Translator Debug": "翻译器调试",
468
468
  "Try Again": "再试一次",
469
469
  "Tunnel connected!": "隧道连通!",
@@ -478,7 +478,7 @@
478
478
  "Usage by API Key": "按 API 密钥统计",
479
479
  "Usage by Endpoint": "按端点统计",
480
480
  "Usage by Model": "按模型统计",
481
- "Use Antigravity IDE & GitHub Copilot → with ANY provider/model from 9Router": "使用 Antigravity IDE 和 GitHub Copilot → 与 9Router 的任何提供商/模型",
481
+ "Use Antigravity IDE & GitHub Copilot → with ANY provider/model from Bluerouter": "使用 Antigravity IDE 和 GitHub Copilot → 与 Bluerouter 的任何提供商/模型",
482
482
  "Use in Cursor/Cline": "在Cursor/Cline中使用",
483
483
  "Use the buttons above to add OpenAI or Anthropic compatible endpoints": "使用上面的按钮添加 OpenAI 或 Anthropic 兼容端点",
484
484
  "Use your API from any network": "从任何网络使用您的 API",
@@ -490,8 +490,8 @@
490
490
  "Warning": "警告",
491
491
  "When": "时间",
492
492
  "When ON, dashboard requires password. When OFF, access without login.": "当打开时,仪表板需要密码。当关闭时,无需登录即可访问。",
493
- "Windows: Run 9Router terminal as Administrator": "Windows:以管理员身份运行 9Router 终端",
494
- "Windows: Run terminal (9Router) as Administrator to enable MITM": "Windows:以管理员身份运行终端 (9Router) 以启用 MITM",
493
+ "Windows: Run Bluerouter terminal as Administrator": "Windows:以管理员身份运行 Bluerouter 终端",
494
+ "Windows: Run terminal (Bluerouter) as Administrator to enable MITM": "Windows:以管理员身份运行终端 (Bluerouter) 以启用 MITM",
495
495
  "Writes to": "写入到",
496
496
  "You can override default pricing for specific models. Reset to defaults anytime to restore standard rates.": "您可以覆盖特定模型的默认定价。随时重置为默认值以恢复标准费率。",
497
497
  "Your": "你的",
@@ -517,11 +517,11 @@
517
517
  "Route AI requests through subscription, cheap, and free tiers with auto-fallback. One endpoint for Claude, GPT, Gemini, and more.": "通过订阅、低价和免费层级路由 AI 请求并自动回退。一个端点接入 Claude、GPT、Gemini 等。",
518
518
  "Get Started": "开始使用",
519
519
  "View on GitHub": "在 GitHub 上查看",
520
- "How 9Router Works": "9Router 工作原理",
520
+ "How Bluerouter Works": "Bluerouter 工作原理",
521
521
  "Data flows seamlessly through our intelligent routing system": "数据通过我们的智能路由系统无缝流转",
522
522
  "1. CLI & SDKs": "1. CLI 和 SDK",
523
523
  "Your requests start from your favorite tools — Cursor, Claude, Copilot, or any OpenAI-compatible SDK.": "请求从您常用的工具发起——Cursor、Claude、Copilot 或任何 OpenAI 兼容的 SDK。",
524
- "2. 9Router Hub": "2. 9Router 枢纽",
524
+ "2. Bluerouter Hub": "2. Bluerouter 枢纽",
525
525
  "Our engine analyzes the prompt and routes through your subscription, cheap, and free provider tiers with automatic fallback.": "我们的引擎分析提示词并通过您的订阅、低价和免费提供商层级路由,自动回退。",
526
526
  "3. AI Providers": "3. AI 提供商",
527
527
  "The request is fulfilled by OpenAI, Anthropic, Gemini, or others instantly.": "请求由 OpenAI、Anthropic、Gemini 或其他提供商即时响应。",
@@ -544,7 +544,7 @@
544
544
  "Dashboard": "仪表盘",
545
545
  "Beautiful web dashboard for managing providers and monitoring usage.": "精美的 Web 仪表盘,用于管理提供商和监控使用情况。",
546
546
  "Get Started in 30 Seconds": "30 秒快速上手",
547
- "Install 9Router": "安装 9Router",
547
+ "Install Bluerouter": "安装 Bluerouter",
548
548
  "Open Dashboard": "打开仪表盘",
549
549
  "Route Requests": "路由请求",
550
550
  "npm install -g bluerouter": "npm install -g bluerouter",
@@ -558,7 +558,7 @@
558
558
  "Model combos with fallback": "模型组合及回退",
559
559
  "Monitor your API usage, token consumption, and request logs": "监控您的 API 使用量、Token 消耗和请求日志",
560
560
  "Track and manage your API quota limits": "跟踪和管理您的 API 配额限制",
561
- "Intercept CLI tool traffic and route through 9Router": "拦截 CLI 工具流量并通过 9Router 路由",
561
+ "Intercept CLI tool traffic and route through Bluerouter": "拦截 CLI 工具流量并通过 Bluerouter 路由",
562
562
  "Configure CLI tools": "配置 CLI 工具",
563
563
  "Manage your proxy pool configurations": "管理您的代理池配置",
564
564
  "API endpoint configuration": "API 端点配置",
@@ -689,7 +689,7 @@
689
689
  "Select models to add": "选择要添加的模型",
690
690
  "Add Model for OpenCode": "为 OpenCode 添加模型",
691
691
  "Default Model": "默认模型",
692
- "9Router Base URL": "9Router 基础 URL",
692
+ "Bluerouter Base URL": "Bluerouter 基础 URL",
693
693
  "Trust Cert": "信任证书",
694
694
  "Trusted": "已信任",
695
695
  "not detected locally": "未在本地检测到",
@@ -108,7 +108,7 @@
108
108
  "Manage your AI provider connections": "管理您的 AI 提供者連接",
109
109
  "Model combos with fallback": "具有備用的模型組合",
110
110
  "Monitor your API usage, token consumption, and request logs": "監控您的 API 使用、令牌消耗和請求日誌",
111
- "Intercept CLI tool traffic and route through 9Router": "攔截 CLI 工具流量並通過 9Router 路由",
111
+ "Intercept CLI tool traffic and route through Bluerouter": "攔截 CLI 工具流量並通過 Bluerouter 路由",
112
112
  "Configure CLI tools": "配置 CLI 工具",
113
113
  "API endpoint configuration": "API 端點配置",
114
114
  "Manage your preferences": "管理您的首選項",
@@ -172,9 +172,9 @@
172
172
  "Cert": "證書",
173
173
  "Server": "服務器",
174
174
  "Purpose:": "目的:",
175
- "Use Antigravity IDE & GitHub Copilot → with ANY provider/model from 9Router": "使用 Antigravity IDE 和 GitHub Copilot → 與 9Router 中的任何提供者/模型一起",
175
+ "Use Antigravity IDE & GitHub Copilot → with ANY provider/model from Bluerouter": "使用 Antigravity IDE 和 GitHub Copilot → 與 Bluerouter 中的任何提供者/模型一起",
176
176
  "How it works:": "工作原理:",
177
- "Antigravity/Copilot IDE request → DNS redirect to localhost:443 → AI Traffic Proxy intercepts → 9Router → response to Antigravity/Copilot": "Antigravity/Copilot IDE 請求 → DNS 重定向到 localhost:443 → MITM 代理攔截 → 9Router → 响應到 Antigravity/Copilot",
177
+ "Antigravity/Copilot IDE request → DNS redirect to localhost:443 → AI Traffic Proxy intercepts → Bluerouter → response to Antigravity/Copilot": "Antigravity/Copilot IDE 請求 → DNS 重定向到 localhost:443 → MITM 代理攔截 → Bluerouter → 响應到 Antigravity/Copilot",
178
178
  "No API keys — create one in Keys page": "沒有 API 金鑰 — 在金鑰頁面中創建一個",
179
179
  "sk_bluerouter (default)": "sk_bluerouter(默認)",
180
180
  "Server started": "服務器已啟動",
@@ -23,7 +23,7 @@ Private-Lines: `+u+`\r
23
23
  `,s+=c;var S=xa("putty-private-key-file-mac-key",t),T=xe.util.createBuffer();Cr(T,r),Cr(T,n),Cr(T,a),T.putInt32(i.length()),T.putBuffer(i),T.putInt32(l.length()),T.putBuffer(l);var B=xe.hmac.create();return B.start("sha1",S),B.update(T.bytes()),s+=`\r
24
24
  Private-MAC: `+B.digest().toHex()+`\r
25
25
  `,s};Sa.publicKeyToOpenSSH=function(e,t){var a="ssh-rsa";t=t||"";var r=xe.util.createBuffer();return Cr(r,a),St(r,e.e),St(r,e.n),a+" "+xe.util.encode64(r.bytes())+" "+t};Sa.privateKeyToOpenSSH=function(e,t){return t?xe.pki.encryptRsaPrivateKey(e,t,{legacy:!0,algorithm:"aes128"}):xe.pki.privateKeyToPem(e)};Sa.getPublicKeyFingerprint=function(e,t){t=t||{};var a=t.md||xe.md.md5.create(),r="ssh-rsa",n=xe.util.createBuffer();Cr(n,r),St(n,e.e),St(n,e.n),a.start(),a.update(n.getBytes());var s=a.digest();if(t.encoding==="hex"){var i=s.toHex();return t.delimiter?i.match(/.{2}/g).join(t.delimiter):i}else{if(t.encoding==="binary")return s.getBytes();if(t.encoding)throw new Error('Unknown encoding "'+t.encoding+'".')}return s};function St(e,t){var a=t.toString(16);a[0]>="8"&&(a="00"+a);var r=xe.util.hexToBytes(a);e.putInt32(r.length),e.putBytes(r)}function Cr(e,t){e.putInt32(t.length),e.putString(t)}function xa(){for(var e=xe.md.sha1.create(),t=arguments.length,a=0;a<t;++a)e.update(arguments[a]);return e.digest()}});var So=K(($h,xo)=>{xo.exports=$();Lt();Ks();ft();Qr();br();no();or();uo();ho();yo();sn();aa();Yt();Za();ln();mo();fn();tn();za();ca();nt();ja();Eo();vn();ae()});var Bo=K((jh,Io)=>{var Mt=require("path"),j=require("fs"),ge=So(),{execFileSync:On}=require("child_process"),{MITM_DIR:qt}=nr(),Re=Mt.join(qt,"rootCA.key"),Te=Mt.join(qt,"rootCA.crt"),Tt=Mt.join(qt,"rootCA.csr"),Dn=Mt.join(qt,"rootCA.csr.cnf"),Xe=Mt.join(qt,"rootCA.pending.key"),Un=Mt.join(qt,"backup");function Kr(){j.existsSync(qt)||j.mkdirSync(qt,{recursive:!0})}function Fr(e,t){let a=String(e||"").trim();if(!a)throw new Error(`${t} is empty`);return`${a}
26
- `}function Vn(e){return ge.md.sha256.create().update(ge.pki.publicKeyToPem(e),"utf8").digest().toHex()}function bf(e){if(!e?.n||!e?.e)throw new Error("Only RSA private keys are supported for MITM Root CA");return ge.pki.setRsaPublicKey(e.n,e.e)}function Fn(e){let t=e.getExtension("basicConstraints"),a=e.getExtension("keyUsage");return!!t?.cA&&(!a||a.keyCertSign===!0)}function To(e,t){let a=Vn(e.publicKey),r=Vn(bf(t));if(a!==r)throw new Error("Certificate public key does not match private key")}function Ta(){Kr();let e=j.existsSync(Re),t=j.existsSync(Te);if(!e&&!t)return null;j.mkdirSync(Un,{recursive:!0});let a=new Date().toISOString().replace(/[:.]/g,"-"),r={key:Mt.join(Un,`rootCA.${a}.key`),cert:Mt.join(Un,`rootCA.${a}.crt`)};return e&&j.copyFileSync(Re,r.key),t&&j.copyFileSync(Te,r.cert),r}function Kn(e,t="Certificate"){try{return ge.pki.certificateFromPem(Fr(e,t))}catch(a){throw new Error(`${t} is not a valid PEM certificate: ${a.message}`)}}function Ao(e,t="Private key"){try{return ge.pki.privateKeyFromPem(Fr(e,t))}catch(a){throw new Error(`${t} is not a valid PEM private key: ${a.message}`)}}function Mn(e){try{let t=ge.pki.certificateFromPem(j.readFileSync(e,"utf8")),a=new Date(Date.now()+720*60*60*1e3);return t.validity.notAfter<a}catch{return!0}}function qn(){let e=j.existsSync(Te),t=j.existsSync(Re),a=j.existsSync(Tt),r=j.existsSync(Xe),n={certExists:e,keyExists:t,csrExists:a,pendingKeyExists:r,certPath:Te,keyPath:Re,csrPath:Tt,pendingKeyPath:Xe};if(!e)return n;try{let s=Kn(j.readFileSync(Te,"utf8")),i=s.subject.attributes.map(u=>`${u.shortName||u.name}=${u.value}`).join(", "),o=s.issuer.attributes.map(u=>`${u.shortName||u.name}=${u.value}`).join(", ");n.subject=i,n.issuer=o,n.serialNumber=s.serialNumber,n.notBefore=s.validity.notBefore.toISOString(),n.notAfter=s.validity.notAfter.toISOString(),n.expiredOrExpiringSoon=Mn(Te),n.isCa=Fn(s),n.isSelfSigned=i===o,n.fingerprint=Vn(s.publicKey)}catch(s){n.error=s.message}return n}async function _f(){let e=j.existsSync(Re)&&j.existsSync(Te);if(e&&!Mn(Te))return console.log("\u2705 Root CA already exists"),{key:Re,cert:Te};if(e){console.log("\u{1F510} Root CA expired or expiring soon \u2014 regenerating...");try{j.unlinkSync(Re)}catch{}try{j.unlinkSync(Te)}catch{}}Kr(),console.log("\u{1F510} Generating Root CA certificate...");let t=ge.pki.rsa.generateKeyPair(2048),a=ge.pki.createCertificate();a.publicKey=t.publicKey,a.serialNumber="01",a.validity.notBefore=new Date,a.validity.notAfter=new Date,a.validity.notAfter.setFullYear(a.validity.notBefore.getFullYear()+10);let r=[{name:"commonName",value:"Blue Router Gateway Root CA"},{name:"organizationName",value:"Blue Router Gateway"},{name:"countryName",value:"VN"}];a.setSubject(r),a.setIssuer(r),a.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,cRLSign:!0,critical:!0},{name:"subjectKeyIdentifier"}]),a.sign(t.privateKey,ge.md.sha256.create());let n=ge.pki.privateKeyToPem(t.privateKey),s=ge.pki.certificateToPem(a);return j.writeFileSync(Re,n,{mode:384}),j.writeFileSync(Te,s),console.log("\u2705 Root CA generated successfully"),{key:Re,cert:Te}}function Nf({certPem:e,keyPem:t}){Kr();let a=Fr(e,"Certificate"),r=Fr(t,"Private key"),n=Kn(a),s=Ao(r);if(To(n,s),!Fn(n))throw new Error("Certificate must be a CA certificate with basicConstraints CA:true and keyCertSign usage");if(n.validity.notAfter<new Date)throw new Error("Certificate is already expired");let i=Ta();j.writeFileSync(Re,r,{mode:384}),j.writeFileSync(Te,a);try{j.unlinkSync(Tt)}catch{}try{j.unlinkSync(Xe)}catch{}return{key:Re,cert:Te,backup:i,info:qn()}}function Pn(e,t){return String(e||t||"").replace(/[\r\n]+/g," ").replace(/[\\]/g,"\\\\").trim()||String(t||"")}function wf(){try{return On("openssl",["version"],{stdio:"ignore"}),!0}catch{return!1}}function Rf({commonName:e,organizationName:t,countryName:a}={}){let r=Pn(e,"Fujinet 9Router MITM CA"),n=Pn(t,"Fujinet"),i=`[ req ]
26
+ `}function Vn(e){return ge.md.sha256.create().update(ge.pki.publicKeyToPem(e),"utf8").digest().toHex()}function bf(e){if(!e?.n||!e?.e)throw new Error("Only RSA private keys are supported for MITM Root CA");return ge.pki.setRsaPublicKey(e.n,e.e)}function Fn(e){let t=e.getExtension("basicConstraints"),a=e.getExtension("keyUsage");return!!t?.cA&&(!a||a.keyCertSign===!0)}function To(e,t){let a=Vn(e.publicKey),r=Vn(bf(t));if(a!==r)throw new Error("Certificate public key does not match private key")}function Ta(){Kr();let e=j.existsSync(Re),t=j.existsSync(Te);if(!e&&!t)return null;j.mkdirSync(Un,{recursive:!0});let a=new Date().toISOString().replace(/[:.]/g,"-"),r={key:Mt.join(Un,`rootCA.${a}.key`),cert:Mt.join(Un,`rootCA.${a}.crt`)};return e&&j.copyFileSync(Re,r.key),t&&j.copyFileSync(Te,r.cert),r}function Kn(e,t="Certificate"){try{return ge.pki.certificateFromPem(Fr(e,t))}catch(a){throw new Error(`${t} is not a valid PEM certificate: ${a.message}`)}}function Ao(e,t="Private key"){try{return ge.pki.privateKeyFromPem(Fr(e,t))}catch(a){throw new Error(`${t} is not a valid PEM private key: ${a.message}`)}}function Mn(e){try{let t=ge.pki.certificateFromPem(j.readFileSync(e,"utf8")),a=new Date(Date.now()+720*60*60*1e3);return t.validity.notAfter<a}catch{return!0}}function qn(){let e=j.existsSync(Te),t=j.existsSync(Re),a=j.existsSync(Tt),r=j.existsSync(Xe),n={certExists:e,keyExists:t,csrExists:a,pendingKeyExists:r,certPath:Te,keyPath:Re,csrPath:Tt,pendingKeyPath:Xe};if(!e)return n;try{let s=Kn(j.readFileSync(Te,"utf8")),i=s.subject.attributes.map(u=>`${u.shortName||u.name}=${u.value}`).join(", "),o=s.issuer.attributes.map(u=>`${u.shortName||u.name}=${u.value}`).join(", ");n.subject=i,n.issuer=o,n.serialNumber=s.serialNumber,n.notBefore=s.validity.notBefore.toISOString(),n.notAfter=s.validity.notAfter.toISOString(),n.expiredOrExpiringSoon=Mn(Te),n.isCa=Fn(s),n.isSelfSigned=i===o,n.fingerprint=Vn(s.publicKey)}catch(s){n.error=s.message}return n}async function _f(){let e=j.existsSync(Re)&&j.existsSync(Te);if(e&&!Mn(Te))return console.log("\u2705 Root CA already exists"),{key:Re,cert:Te};if(e){console.log("\u{1F510} Root CA expired or expiring soon \u2014 regenerating...");try{j.unlinkSync(Re)}catch{}try{j.unlinkSync(Te)}catch{}}Kr(),console.log("\u{1F510} Generating Root CA certificate...");let t=ge.pki.rsa.generateKeyPair(2048),a=ge.pki.createCertificate();a.publicKey=t.publicKey,a.serialNumber="01",a.validity.notBefore=new Date,a.validity.notAfter=new Date,a.validity.notAfter.setFullYear(a.validity.notBefore.getFullYear()+10);let r=[{name:"commonName",value:"Blue Router Gateway Root CA"},{name:"organizationName",value:"Blue Router Gateway"},{name:"countryName",value:"VN"}];a.setSubject(r),a.setIssuer(r),a.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,cRLSign:!0,critical:!0},{name:"subjectKeyIdentifier"}]),a.sign(t.privateKey,ge.md.sha256.create());let n=ge.pki.privateKeyToPem(t.privateKey),s=ge.pki.certificateToPem(a);return j.writeFileSync(Re,n,{mode:384}),j.writeFileSync(Te,s),console.log("\u2705 Root CA generated successfully"),{key:Re,cert:Te}}function Nf({certPem:e,keyPem:t}){Kr();let a=Fr(e,"Certificate"),r=Fr(t,"Private key"),n=Kn(a),s=Ao(r);if(To(n,s),!Fn(n))throw new Error("Certificate must be a CA certificate with basicConstraints CA:true and keyCertSign usage");if(n.validity.notAfter<new Date)throw new Error("Certificate is already expired");let i=Ta();j.writeFileSync(Re,r,{mode:384}),j.writeFileSync(Te,a);try{j.unlinkSync(Tt)}catch{}try{j.unlinkSync(Xe)}catch{}return{key:Re,cert:Te,backup:i,info:qn()}}function Pn(e,t){return String(e||t||"").replace(/[\r\n]+/g," ").replace(/[\\]/g,"\\\\").trim()||String(t||"")}function wf(){try{return On("openssl",["version"],{stdio:"ignore"}),!0}catch{return!1}}function Rf({commonName:e,organizationName:t,countryName:a}={}){let r=Pn(e,"Fujinet Bluerouter MITM CA"),n=Pn(t,"Fujinet"),i=`[ req ]
27
27
  default_bits = 4096
28
28
  prompt = no
29
29
  distinguished_name = dn
@@ -39,7 +39,7 @@ CN = ${r}
39
39
  basicConstraints = critical, CA:true, pathlen:0
40
40
  keyUsage = critical, keyCertSign, cRLSign
41
41
  subjectKeyIdentifier = hash
42
- `,o=Ta();j.writeFileSync(Dn,i,"utf8");try{On("openssl",["genrsa","-out",Xe,"4096"],{stdio:["ignore","pipe","pipe"]}),On("openssl",["req","-new","-key",Xe,"-out",Tt,"-config",Dn],{stdio:["ignore","pipe","pipe"]});try{j.chmodSync(Xe,384)}catch{}return{csr:Tt,pendingKey:Xe,config:Dn,backup:o}}catch(u){try{j.unlinkSync(Xe)}catch{}try{j.unlinkSync(Tt)}catch{}let l=u?.stderr?String(u.stderr).trim():"";throw new Error(`OpenSSL CSR generation failed${l?`: ${l}`:""}`)}}function Lf({commonName:e,organizationName:t,countryName:a}={}){if(Kr(),wf())return Rf({commonName:e,organizationName:t,countryName:a});let r=[{name:"commonName",value:String(e||"Fujinet 9Router MITM CA").trim()||"Fujinet 9Router MITM CA"},{name:"organizationName",value:String(t||"Fujinet").trim()||"Fujinet"},{name:"organizationalUnitName",value:"AI Gateway"}],n=String(a||"VN").trim().slice(0,2).toUpperCase();n&&r.push({name:"countryName",value:n});let s=ge.pki.rsa.generateKeyPair(4096),i=ge.pki.createCertificationRequest();if(i.publicKey=s.publicKey,i.setSubject(r),i.sign(s.privateKey,ge.md.sha256.create()),!i.verify())throw new Error("Generated CSR failed verification");let o=Ta(),u=ge.pki.certificationRequestToPem(i),l=ge.pki.privateKeyToPem(s.privateKey);return j.writeFileSync(Xe,l,{mode:384}),j.writeFileSync(Tt,u),{csr:Tt,pendingKey:Xe,backup:o}}function kf({certPem:e}){if(Kr(),!j.existsSync(Xe))throw new Error("No pending CSR private key found. Generate a CSR first.");let t=Fr(e,"Signed certificate"),a=Kn(t,"Signed certificate"),r=Ao(j.readFileSync(Xe,"utf8"),"Pending private key");if(To(a,r),!Fn(a))throw new Error("Signed certificate must be a CA certificate with CA:true and keyCertSign usage");if(a.validity.notAfter<new Date)throw new Error("Signed certificate is already expired");let n=Ta();j.copyFileSync(Xe,Re);try{j.chmodSync(Re,384)}catch{}j.writeFileSync(Te,t);try{j.unlinkSync(Tt)}catch{}try{j.unlinkSync(Xe)}catch{}return{key:Re,cert:Te,backup:n,info:qn()}}function Df(){if(!j.existsSync(Re)||!j.existsSync(Te))throw new Error("Root CA not found. Generate it first.");let e=j.readFileSync(Re,"utf8"),t=j.readFileSync(Te,"utf8");return{key:ge.pki.privateKeyFromPem(e),cert:ge.pki.certificateFromPem(t)}}function Uf(e,t){let a=ge.pki.rsa.generateKeyPair(2048),r=ge.pki.createCertificate();return r.publicKey=a.publicKey,r.serialNumber=Math.floor(Math.random()*1e6).toString(),r.validity.notBefore=new Date,r.validity.notAfter=new Date,r.validity.notAfter.setFullYear(r.validity.notBefore.getFullYear()+1),r.setSubject([{name:"commonName",value:e}]),r.setIssuer(t.cert.subject.attributes),r.setExtensions([{name:"basicConstraints",cA:!1},{name:"keyUsage",digitalSignature:!0,keyEncipherment:!0},{name:"extKeyUsage",serverAuth:!0,clientAuth:!0},{name:"subjectAltName",altNames:[{type:2,value:e},{type:2,value:`*.${e}`}]}]),r.sign(t.key,ge.md.sha256.create()),{key:ge.pki.privateKeyToPem(a.privateKey),cert:ge.pki.certificateToPem(r)}}Io.exports={generateRootCA:_f,importRootCAPair:Nf,generateRootCACsr:Lf,importSignedRootCACert:kf,loadRootCA:Df,generateLeafCert:Uf,isCertExpired:Mn,readRootCAInfo:qn,ROOT_CA_CERT_PATH:Te,ROOT_CA_KEY_PATH:Re,ROOT_CA_CSR_PATH:Tt,ROOT_CA_PENDING_KEY_PATH:Xe}});var _o=K((Jh,bo)=>{var Yh=require("path"),Wh=require("fs"),{MITM_DIR:Xh}=nr(),{generateRootCA:Pf,loadRootCA:Of,generateLeafCert:Vf}=Bo();async function Ff(){return await Pf()}function Kf(e){try{let t=Of(),a=Vf(e,t);return{key:a.key,cert:a.cert}}catch(t){return console.error(`Failed to generate cert for ${e}:`,t.message),null}}bo.exports={generateCert:Ff,getCertForDomain:Kf}});var Lo=K((Zh,Ro)=>{var No=require("fs"),Mf=require("path"),{DATA_DIR:qf}=nr(),wo=Mf.join(qf,"mitm","aliases.json");function Hf(){try{return No.existsSync(wo)?JSON.parse(No.readFileSync(wo,"utf-8")):null}catch{return null}}function Gf(e){return Hf()?.[e]||null}Ro.exports={getMitmAlias:Gf}});var Aa=K((rp,Uo)=>{var{log:ep,err:tp}=$t(),ko="http://localhost:20128",zf=String(process.env.MITM_ROUTER_BASE||ko).trim().replace(/\/+$/,"")||ko,Do=process.env.ROUTER_API_KEY,Qf=new Set(["host","content-length","connection","transfer-encoding","content-type","authorization"]);async function $f(e,t="/v1/chat/completions",a={}){let r={};for(let[s,i]of Object.entries(a))Qf.has(s.toLowerCase())||(r[s]=i);return await fetch(`${zf}${t}`,{method:"POST",headers:{...r,"Content-Type":"application/json",...Do&&{Authorization:`Bearer ${Do}`}},body:JSON.stringify(e)})}async function jf(e,t,a){let r=e.headers.get("content-type")||"application/json",n=e.status||200,s={"Content-Type":r,"Cache-Control":"no-cache",Connection:"keep-alive"};if(r.includes("text/event-stream")&&(s["X-Accel-Buffering"]="no"),t.writeHead(n,s),a&&a.writeHeader(e.status,Object.fromEntries(e.headers)),!e.body){let u=await e.text().catch(()=>"");a&&(a.writeChunk(u),a.end()),t.end(u);return}let i=e.body.getReader(),o=new TextDecoder;for(;;){let{done:u,value:l}=await i.read();if(u){a&&a.end(),t.end();break}a&&a.writeChunk(l),t.write(o.decode(l,{stream:!0}))}}Uo.exports={fetchRouter:$f,pipeSSE:jf}});var Oo=K((ap,Po)=>{var{err:Yf,createResponseDumper:Wf}=$t(),{IS_DEV:Xf}=Sr(),{fetchRouter:Jf,pipeSSE:Zf}=Aa();async function ed(e,t,a,r){let n=Xf?Wf(e,"intercept-antigravity"):null,s=e.url.includes(":streamGenerateContent");try{let i=JSON.parse(a.toString());i.model&&(i.model=r);let o=await Jf(i,"/v1/chat/completions",e.headers);await Zf(o,t,n)}catch(i){Yf(`[antigravity] ${i.message}`),n&&(n.writeChunk(`
42
+ `,o=Ta();j.writeFileSync(Dn,i,"utf8");try{On("openssl",["genrsa","-out",Xe,"4096"],{stdio:["ignore","pipe","pipe"]}),On("openssl",["req","-new","-key",Xe,"-out",Tt,"-config",Dn],{stdio:["ignore","pipe","pipe"]});try{j.chmodSync(Xe,384)}catch{}return{csr:Tt,pendingKey:Xe,config:Dn,backup:o}}catch(u){try{j.unlinkSync(Xe)}catch{}try{j.unlinkSync(Tt)}catch{}let l=u?.stderr?String(u.stderr).trim():"";throw new Error(`OpenSSL CSR generation failed${l?`: ${l}`:""}`)}}function Lf({commonName:e,organizationName:t,countryName:a}={}){if(Kr(),wf())return Rf({commonName:e,organizationName:t,countryName:a});let r=[{name:"commonName",value:String(e||"Fujinet Bluerouter MITM CA").trim()||"Fujinet Bluerouter MITM CA"},{name:"organizationName",value:String(t||"Fujinet").trim()||"Fujinet"},{name:"organizationalUnitName",value:"AI Gateway"}],n=String(a||"VN").trim().slice(0,2).toUpperCase();n&&r.push({name:"countryName",value:n});let s=ge.pki.rsa.generateKeyPair(4096),i=ge.pki.createCertificationRequest();if(i.publicKey=s.publicKey,i.setSubject(r),i.sign(s.privateKey,ge.md.sha256.create()),!i.verify())throw new Error("Generated CSR failed verification");let o=Ta(),u=ge.pki.certificationRequestToPem(i),l=ge.pki.privateKeyToPem(s.privateKey);return j.writeFileSync(Xe,l,{mode:384}),j.writeFileSync(Tt,u),{csr:Tt,pendingKey:Xe,backup:o}}function kf({certPem:e}){if(Kr(),!j.existsSync(Xe))throw new Error("No pending CSR private key found. Generate a CSR first.");let t=Fr(e,"Signed certificate"),a=Kn(t,"Signed certificate"),r=Ao(j.readFileSync(Xe,"utf8"),"Pending private key");if(To(a,r),!Fn(a))throw new Error("Signed certificate must be a CA certificate with CA:true and keyCertSign usage");if(a.validity.notAfter<new Date)throw new Error("Signed certificate is already expired");let n=Ta();j.copyFileSync(Xe,Re);try{j.chmodSync(Re,384)}catch{}j.writeFileSync(Te,t);try{j.unlinkSync(Tt)}catch{}try{j.unlinkSync(Xe)}catch{}return{key:Re,cert:Te,backup:n,info:qn()}}function Df(){if(!j.existsSync(Re)||!j.existsSync(Te))throw new Error("Root CA not found. Generate it first.");let e=j.readFileSync(Re,"utf8"),t=j.readFileSync(Te,"utf8");return{key:ge.pki.privateKeyFromPem(e),cert:ge.pki.certificateFromPem(t)}}function Uf(e,t){let a=ge.pki.rsa.generateKeyPair(2048),r=ge.pki.createCertificate();return r.publicKey=a.publicKey,r.serialNumber=Math.floor(Math.random()*1e6).toString(),r.validity.notBefore=new Date,r.validity.notAfter=new Date,r.validity.notAfter.setFullYear(r.validity.notBefore.getFullYear()+1),r.setSubject([{name:"commonName",value:e}]),r.setIssuer(t.cert.subject.attributes),r.setExtensions([{name:"basicConstraints",cA:!1},{name:"keyUsage",digitalSignature:!0,keyEncipherment:!0},{name:"extKeyUsage",serverAuth:!0,clientAuth:!0},{name:"subjectAltName",altNames:[{type:2,value:e},{type:2,value:`*.${e}`}]}]),r.sign(t.key,ge.md.sha256.create()),{key:ge.pki.privateKeyToPem(a.privateKey),cert:ge.pki.certificateToPem(r)}}Io.exports={generateRootCA:_f,importRootCAPair:Nf,generateRootCACsr:Lf,importSignedRootCACert:kf,loadRootCA:Df,generateLeafCert:Uf,isCertExpired:Mn,readRootCAInfo:qn,ROOT_CA_CERT_PATH:Te,ROOT_CA_KEY_PATH:Re,ROOT_CA_CSR_PATH:Tt,ROOT_CA_PENDING_KEY_PATH:Xe}});var _o=K((Jh,bo)=>{var Yh=require("path"),Wh=require("fs"),{MITM_DIR:Xh}=nr(),{generateRootCA:Pf,loadRootCA:Of,generateLeafCert:Vf}=Bo();async function Ff(){return await Pf()}function Kf(e){try{let t=Of(),a=Vf(e,t);return{key:a.key,cert:a.cert}}catch(t){return console.error(`Failed to generate cert for ${e}:`,t.message),null}}bo.exports={generateCert:Ff,getCertForDomain:Kf}});var Lo=K((Zh,Ro)=>{var No=require("fs"),Mf=require("path"),{DATA_DIR:qf}=nr(),wo=Mf.join(qf,"mitm","aliases.json");function Hf(){try{return No.existsSync(wo)?JSON.parse(No.readFileSync(wo,"utf-8")):null}catch{return null}}function Gf(e){return Hf()?.[e]||null}Ro.exports={getMitmAlias:Gf}});var Aa=K((rp,Uo)=>{var{log:ep,err:tp}=$t(),ko="http://localhost:20128",zf=String(process.env.MITM_ROUTER_BASE||ko).trim().replace(/\/+$/,"")||ko,Do=process.env.ROUTER_API_KEY,Qf=new Set(["host","content-length","connection","transfer-encoding","content-type","authorization"]);async function $f(e,t="/v1/chat/completions",a={}){let r={};for(let[s,i]of Object.entries(a))Qf.has(s.toLowerCase())||(r[s]=i);return await fetch(`${zf}${t}`,{method:"POST",headers:{...r,"Content-Type":"application/json",...Do&&{Authorization:`Bearer ${Do}`}},body:JSON.stringify(e)})}async function jf(e,t,a){let r=e.headers.get("content-type")||"application/json",n=e.status||200,s={"Content-Type":r,"Cache-Control":"no-cache",Connection:"keep-alive"};if(r.includes("text/event-stream")&&(s["X-Accel-Buffering"]="no"),t.writeHead(n,s),a&&a.writeHeader(e.status,Object.fromEntries(e.headers)),!e.body){let u=await e.text().catch(()=>"");a&&(a.writeChunk(u),a.end()),t.end(u);return}let i=e.body.getReader(),o=new TextDecoder;for(;;){let{done:u,value:l}=await i.read();if(u){a&&a.end(),t.end();break}a&&a.writeChunk(l),t.write(o.decode(l,{stream:!0}))}}Uo.exports={fetchRouter:$f,pipeSSE:jf}});var Oo=K((ap,Po)=>{var{err:Yf,createResponseDumper:Wf}=$t(),{IS_DEV:Xf}=Sr(),{fetchRouter:Jf,pipeSSE:Zf}=Aa();async function ed(e,t,a,r){let n=Xf?Wf(e,"intercept-antigravity"):null,s=e.url.includes(":streamGenerateContent");try{let i=JSON.parse(a.toString());i.model&&(i.model=r);let o=await Jf(i,"/v1/chat/completions",e.headers);await Zf(o,t,n)}catch(i){Yf(`[antigravity] ${i.message}`),n&&(n.writeChunk(`
43
43
  [ERROR] ${i.message}
44
44
  `),n.end()),s?(t.headersSent||t.writeHead(200,{"Content-Type":"text/event-stream"}),t.end(`data: ${JSON.stringify({error:{message:i.message}})}\r
45
45
  \r
package/cli.js CHANGED
@@ -196,7 +196,7 @@ for i in $(seq 1 "\${MAX_WAIT_SECONDS}"); do
196
196
  done
197
197
 
198
198
  if [[ "\${ready}" != "1" ]]; then
199
- log "9Router API is not ready; skip MITM autostart"
199
+ log "Bluerouter API is not ready; skip MITM autostart"
200
200
  exit 0
201
201
  fi
202
202
 
@@ -492,7 +492,7 @@ function writeSystemdService({
492
492
  .join("\n");
493
493
 
494
494
  const unit = `[Unit]
495
- Description=9Router
495
+ Description=Bluerouter
496
496
  After=network.target
497
497
 
498
498
  [Service]
@@ -1319,7 +1319,7 @@ function startServer(latestVersion) {
1319
1319
  process.on("SIGHUP", () => {});
1320
1320
 
1321
1321
  console.log(`\n⏳ Switching to tray mode... (icon already visible in menu bar)`);
1322
- console.log(`🔔 9Router is running in tray (PID: ${process.pid})`);
1322
+ console.log(`🔔 Bluerouter is running in tray (PID: ${process.pid})`);
1323
1323
  console.log(` Server: http://${displayHost}:${port}`);
1324
1324
  console.log(`\n💡 You can close this terminal. Right-click tray icon to quit.\n`);
1325
1325
 
@@ -1338,7 +1338,7 @@ function startServer(latestVersion) {
1338
1338
  });
1339
1339
  bgProcess.unref();
1340
1340
 
1341
- console.log(`🔔 9Router is now running in background (PID: ${bgProcess.pid})`);
1341
+ console.log(`🔔 Bluerouter is now running in background (PID: ${bgProcess.pid})`);
1342
1342
  console.log(` Server: http://${displayHost}:${port}`);
1343
1343
  console.log(`\n💡 You can close this terminal. Right-click tray icon to quit.\n`);
1344
1344
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@jheavenknows/bluerouter",
3
- "version": "1.0.26",
4
- "description": "9Router CLI - Start and manage 9Router server",
3
+ "version": "1.0.29",
4
+ "description": "Bluerouter CLI - Start and manage Bluerouter server",
5
5
  "bin": {
6
6
  "bluerouter": "./cli.js"
7
7
  },
@@ -364,7 +364,7 @@ async function deleteCombo(id) {
364
364
  /**
365
365
  * Get CLI tool settings
366
366
  * @param {string} tool - Tool name: claude | codex | droid | openclaw
367
- * @returns {Promise<Object>} { success, data: { installed, has9Router, ... } }
367
+ * @returns {Promise<Object>} { success, data: { installed, hasBluerouter, ... } }
368
368
  */
369
369
  async function getCliToolSettings(tool) {
370
370
  return makeRequest("GET", `/api/cli-tools/${tool}-settings`);
@@ -179,10 +179,10 @@ async function buildCodexHeader() {
179
179
  const result = await api.getCliToolSettings("codex");
180
180
  if (!result.success) return ` ${COLORS.red}Failed to load settings${COLORS.reset}`;
181
181
 
182
- const { installed, has9Router, config } = result.data;
182
+ const { installed, hasBluerouter, config } = result.data;
183
183
  if (!installed) return `Status: ${COLORS.red}✗ Codex CLI not installed${COLORS.reset}`;
184
184
 
185
- if (!has9Router) {
185
+ if (!hasBluerouter) {
186
186
  return [
187
187
  `Status: ${COLORS.red}✗ Not configured${COLORS.reset}`,
188
188
  `${COLORS.dim}Run "Quick Setup" to configure${COLORS.reset}`
@@ -267,18 +267,18 @@ async function buildDroidHeader() {
267
267
  const result = await api.getCliToolSettings("droid");
268
268
  if (!result.success) return ` ${COLORS.red}Failed to load settings${COLORS.reset}`;
269
269
 
270
- const { installed, has9Router, settings } = result.data;
270
+ const { installed, hasBluerouter, settings } = result.data;
271
271
  if (!installed) return `Status: ${COLORS.red}✗ Factory Droid not installed${COLORS.reset}`;
272
272
 
273
- if (!has9Router) {
273
+ if (!hasBluerouter) {
274
274
  return [
275
275
  `Status: ${COLORS.red}✗ Not configured${COLORS.reset}`,
276
276
  `${COLORS.dim}Run "Quick Setup" to configure${COLORS.reset}`
277
277
  ].join("\n");
278
278
  }
279
279
 
280
- // Extract 9Router custom model config
281
- const custom = settings?.customModels?.find(m => m.id === "custom:9Router-0");
280
+ // Extract Bluerouter custom model config
281
+ const custom = settings?.customModels?.find(m => m.id === "custom:Bluerouter-0");
282
282
  const lines = [`Status: ${COLORS.green}✓ Configured${COLORS.reset}`];
283
283
  if (custom?.baseUrl) lines.push(`Endpoint: ${COLORS.cyan}${custom.baseUrl}${COLORS.reset}`);
284
284
  if (custom?.model) lines.push(`Model: ${COLORS.dim}${custom.model}${COLORS.reset}`);
@@ -350,17 +350,17 @@ async function buildOpenClawHeader() {
350
350
  const result = await api.getCliToolSettings("openclaw");
351
351
  if (!result.success) return ` ${COLORS.red}Failed to load settings${COLORS.reset}`;
352
352
 
353
- const { installed, has9Router, settings } = result.data;
353
+ const { installed, hasBluerouter, settings } = result.data;
354
354
  if (!installed) return `Status: ${COLORS.red}✗ Open Claw not installed${COLORS.reset}`;
355
355
 
356
- if (!has9Router) {
356
+ if (!hasBluerouter) {
357
357
  return [
358
358
  `Status: ${COLORS.red}✗ Not configured${COLORS.reset}`,
359
359
  `${COLORS.dim}Run "Quick Setup" to configure${COLORS.reset}`
360
360
  ].join("\n");
361
361
  }
362
362
 
363
- // Extract 9Router provider config
363
+ // Extract Bluerouter provider config
364
364
  const provider = settings?.models?.providers?.["bluerouter"];
365
365
  const primary = settings?.agents?.defaults?.model?.primary || "";
366
366
  const model = primary.startsWith("bluerouter/") ? primary.replace("bluerouter/", "") : (provider?.models?.[0]?.id || "");
@@ -431,10 +431,10 @@ async function buildOpenCodeHeader() {
431
431
  const result = await api.getCliToolSettings("opencode");
432
432
  if (!result.success) return ` ${COLORS.red}Failed to load settings${COLORS.reset}`;
433
433
 
434
- const { installed, has9Router, opencode } = result.data;
434
+ const { installed, hasBluerouter, opencode } = result.data;
435
435
  if (!installed) return `Status: ${COLORS.red}✗ OpenCode CLI not installed${COLORS.reset}`;
436
436
 
437
- if (!has9Router) {
437
+ if (!hasBluerouter) {
438
438
  return [
439
439
  `Status: ${COLORS.red}✗ Not configured${COLORS.reset}`,
440
440
  `${COLORS.dim}Run "Quick Setup" to configure${COLORS.reset}`
@@ -519,10 +519,10 @@ async function buildHermesHeader() {
519
519
  const result = await api.getCliToolSettings("hermes");
520
520
  if (!result.success) return ` ${COLORS.red}Failed to load settings${COLORS.reset}`;
521
521
 
522
- const { installed, has9Router, settings } = result.data;
522
+ const { installed, hasBluerouter, settings } = result.data;
523
523
  if (!installed) return `Status: ${COLORS.red}✗ Hermes Agent not installed${COLORS.reset}`;
524
524
 
525
- if (!has9Router) {
525
+ if (!hasBluerouter) {
526
526
  return [
527
527
  `Status: ${COLORS.red}✗ Not configured${COLORS.reset}`,
528
528
  `${COLORS.dim}Run "Quick Setup" to configure${COLORS.reset}`
@@ -585,7 +585,7 @@ async function showCliToolsMenu(port, breadcrumb = []) {
585
585
  await showMenuWithBack({
586
586
  title: "🔧 CLI Tools",
587
587
  breadcrumb,
588
- headerContent: `Configure CLI tools to use 9Router\nEndpoint: ${endpoint}`,
588
+ headerContent: `Configure CLI tools to use Bluerouter\nEndpoint: ${endpoint}`,
589
589
  items: [
590
590
  {
591
591
  label: "Claude Code",
@@ -67,14 +67,14 @@ async function startTerminalUI(port) {
67
67
  // Configure API client
68
68
  api.configure({ port });
69
69
 
70
- const basePath = ["9Router"];
70
+ const basePath = ["Bluerouter"];
71
71
 
72
72
  // Prime header cache before first render
73
73
  await refreshHeaderBg(port);
74
74
 
75
75
  // Main menu
76
76
  await showMenuWithBack({
77
- title: "📡 9Router Terminal UI",
77
+ title: "📡 Bluerouter Terminal UI",
78
78
  breadcrumb: basePath,
79
79
  headerContent: () => getHeader(port),
80
80
  items: [
@@ -280,8 +280,8 @@ function enableLinux(cliPath) {
280
280
 
281
281
  const desktopContent = `[Desktop Entry]
282
282
  Type=Application
283
- Name=9Router
284
- Comment=9Router API Proxy
283
+ Name=Bluerouter
284
+ Comment=Bluerouter API Proxy
285
285
  Exec=${nodePath} ${routerScript} --tray --skip-update
286
286
  Hidden=false
287
287
  NoDisplay=false
@@ -58,7 +58,7 @@ function initTray(options) {
58
58
  */
59
59
  function buildMenuItems(port, autostartEnabled) {
60
60
  return [
61
- { title: `9Router (Port ${port})`, tooltip: "Server is running", enabled: false },
61
+ { title: `Bluerouter (Port ${port})`, tooltip: "Server is running", enabled: false },
62
62
  { title: "Open Dashboard", tooltip: "Open in browser", enabled: true },
63
63
  {
64
64
  title: autostartEnabled ? "✓ Auto-start Enabled" : "Enable Auto-start",
@@ -121,7 +121,7 @@ function initWindowsTray(options) {
121
121
 
122
122
  trayInstance = initWinTray({
123
123
  iconPath,
124
- tooltip: `9Router - Port ${port}`,
124
+ tooltip: `Bluerouter - Port ${port}`,
125
125
  items,
126
126
  onClick: (index) => {
127
127
  handleClick(index, options, (newEnabled) => {
@@ -204,7 +204,7 @@ function initUnixTray(options) {
204
204
  // because template mode only uses the alpha channel.
205
205
  isTemplateIcon: false,
206
206
  title: "",
207
- tooltip: `9Router - Port ${port}`,
207
+ tooltip: `Bluerouter - Port ${port}`,
208
208
  items
209
209
  };
210
210
 
@@ -1,4 +1,4 @@
1
- # 9Router tray icon for Windows using NotifyIcon
1
+ # Bluerouter tray icon for Windows using NotifyIcon
2
2
  # IPC: stdin JSON commands, stdout JSON events
3
3
  param([string]$IconPath, [string]$Tooltip)
4
4