67router 1.0.5 → 1.0.7

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 (418) hide show
  1. package/README.md +139 -190
  2. package/app/.next-cli-build/BUILD_ID +1 -1
  3. package/app/.next-cli-build/app-path-routes-manifest.json +2 -2
  4. package/app/.next-cli-build/build-manifest.json +3 -3
  5. package/app/.next-cli-build/react-loadable-manifest.json +20 -29
  6. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
  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.nft.json +1 -1
  9. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  10. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  11. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  12. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
  13. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  14. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +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.js.nft.json +1 -1
  19. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  20. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +1 -1
  21. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  22. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js.nft.json +1 -1
  23. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  24. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js.nft.json +1 -1
  25. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  26. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
  27. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  28. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  29. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  30. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
  31. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  32. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
  33. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  34. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
  35. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  36. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
  37. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  38. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
  39. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  40. package/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page.js.nft.json +1 -1
  41. package/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -1
  42. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
  43. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  44. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js.nft.json +1 -1
  45. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  46. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page.js.nft.json +1 -1
  47. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  48. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
  49. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  50. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js +1 -1
  51. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
  52. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  53. package/app/.next-cli-build/server/app/_global-error/page.js.nft.json +1 -1
  54. package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  55. package/app/.next-cli-build/server/app/_global-error.html +1 -1
  56. package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  57. package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  58. package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  59. package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  60. package/app/.next-cli-build/server/app/_not-found/page.js.nft.json +1 -1
  61. package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  62. package/app/.next-cli-build/server/app/_not-found.html +1 -1
  63. package/app/.next-cli-build/server/app/_not-found.rsc +4 -4
  64. package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +4 -4
  65. package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +4 -4
  66. package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  67. package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
  68. package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
  69. package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
  70. package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
  71. package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
  72. package/app/.next-cli-build/server/app/api/auth/reset-password/route.js.nft.json +1 -1
  73. package/app/.next-cli-build/server/app/api/auth/saml/acs/route.js.nft.json +1 -1
  74. package/app/.next-cli-build/server/app/api/auth/saml/metadata/route.js.nft.json +1 -1
  75. package/app/.next-cli-build/server/app/api/auth/saml/start/route.js.nft.json +1 -1
  76. package/app/.next-cli-build/server/app/api/auth/saml/test/route.js.nft.json +1 -1
  77. package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
  78. package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
  79. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  80. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
  81. package/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -1
  82. package/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js.nft.json +1 -1
  83. package/app/.next-cli-build/server/app/api/cli-tools/codewhale-settings/route.js.nft.json +1 -1
  84. package/app/.next-cli-build/server/app/api/cli-tools/codex-profiles/route.js.nft.json +1 -1
  85. package/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -1
  86. package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
  87. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js.nft.json +1 -1
  88. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js.nft.json +1 -1
  89. package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
  90. package/app/.next-cli-build/server/app/api/cli-tools/crush-settings/route.js.nft.json +1 -1
  91. package/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js.nft.json +1 -1
  92. package/app/.next-cli-build/server/app/api/cli-tools/devin-settings/route.js.nft.json +1 -1
  93. package/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -1
  94. package/app/.next-cli-build/server/app/api/cli-tools/forge-settings/route.js.nft.json +1 -1
  95. package/app/.next-cli-build/server/app/api/cli-tools/grok-build-settings/route.js.nft.json +1 -1
  96. package/app/.next-cli-build/server/app/api/cli-tools/hermes-profiles/route.js.nft.json +1 -1
  97. package/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js.nft.json +1 -1
  98. package/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js.nft.json +1 -1
  99. package/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js.nft.json +1 -1
  100. package/app/.next-cli-build/server/app/api/cli-tools/omp-settings/route.js.nft.json +1 -1
  101. package/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -1
  102. package/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -1
  103. package/app/.next-cli-build/server/app/api/cli-tools/pi-settings/route.js.nft.json +1 -1
  104. package/app/.next-cli-build/server/app/api/cli-tools/smelt-settings/route.js.nft.json +1 -1
  105. package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
  106. package/app/.next-cli-build/server/app/api/combos/presets/route.js.nft.json +1 -1
  107. package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
  108. package/app/.next-cli-build/server/app/api/headroom/extras/route.js.nft.json +1 -1
  109. package/app/.next-cli-build/server/app/api/headroom/proxy/[...path]/route.js.nft.json +1 -1
  110. package/app/.next-cli-build/server/app/api/headroom/restart/route.js.nft.json +1 -1
  111. package/app/.next-cli-build/server/app/api/headroom/start/route.js.nft.json +1 -1
  112. package/app/.next-cli-build/server/app/api/headroom/status/route.js.nft.json +1 -1
  113. package/app/.next-cli-build/server/app/api/headroom/stop/route.js.nft.json +1 -1
  114. package/app/.next-cli-build/server/app/api/health/route.js.nft.json +1 -1
  115. package/app/.next-cli-build/server/app/api/init/route.js.nft.json +1 -1
  116. package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
  117. package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
  118. package/app/.next-cli-build/server/app/api/locale/route.js.nft.json +1 -1
  119. package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
  120. package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
  121. package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
  122. package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
  123. package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
  124. package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
  125. package/app/.next-cli-build/server/app/api/media-providers/tts/voices/route.js.nft.json +1 -1
  126. package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
  127. package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
  128. package/app/.next-cli-build/server/app/api/models/catalog-sync/route.js.nft.json +1 -1
  129. package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
  130. package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
  131. package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
  132. package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
  133. package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js +1 -1
  134. package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  135. package/app/.next-cli-build/server/app/api/oauth/codex/bulk-import/route.js +1 -1
  136. package/app/.next-cli-build/server/app/api/oauth/codex/bulk-import/route.js.nft.json +1 -1
  137. package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js +1 -1
  138. package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
  139. package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
  140. package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
  141. package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
  142. package/app/.next-cli-build/server/app/api/oauth/grok-cli/bulk-import/route.js.nft.json +1 -1
  143. package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
  144. package/app/.next-cli-build/server/app/api/oauth/kiro/api-key/route.js.nft.json +1 -1
  145. package/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -1
  146. package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
  147. package/app/.next-cli-build/server/app/api/oauth/kiro/import-cli-proxy/route.js.nft.json +1 -1
  148. package/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js.nft.json +1 -1
  149. package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
  150. package/app/.next-cli-build/server/app/api/oauth/xiaomi-mimo/api-key/route.js.nft.json +1 -1
  151. package/app/.next-cli-build/server/app/api/oauth/xiaomi-mimo/auto-import/route.js.nft.json +1 -1
  152. package/app/.next-cli-build/server/app/api/oauth/xiaomi-mimo/login/start/route.js.nft.json +1 -1
  153. package/app/.next-cli-build/server/app/api/oauth/xiaomi-mimo/login/status/route.js.nft.json +1 -1
  154. package/app/.next-cli-build/server/app/api/oauth/zed/auto-import/route.js.nft.json +1 -1
  155. package/app/.next-cli-build/server/app/api/oauth/zed/import/route.js.nft.json +1 -1
  156. package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
  157. package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
  158. package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
  159. package/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js.nft.json +1 -1
  160. package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js +1 -1
  161. package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  162. package/app/.next-cli-build/server/app/api/providers/[id]/overrides/route.js.nft.json +1 -1
  163. package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
  164. package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  165. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
  166. package/app/.next-cli-build/server/app/api/providers/client/route.js +1 -1
  167. package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
  168. package/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js.nft.json +1 -1
  169. package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
  170. package/app/.next-cli-build/server/app/api/providers/suggested-models/route.js.nft.json +1 -1
  171. package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  172. package/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
  173. package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
  174. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
  175. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
  176. package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
  177. package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
  178. package/app/.next-cli-build/server/app/api/proxy-pools/netlify-deploy/route.js.nft.json +1 -1
  179. package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
  180. package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
  181. package/app/.next-cli-build/server/app/api/pxpipe/health/route.js.nft.json +1 -1
  182. package/app/.next-cli-build/server/app/api/pxpipe/install/route.js.nft.json +1 -1
  183. package/app/.next-cli-build/server/app/api/pxpipe/logs/route.js.nft.json +1 -1
  184. package/app/.next-cli-build/server/app/api/pxpipe/restart/route.js.nft.json +1 -1
  185. package/app/.next-cli-build/server/app/api/pxpipe/start/route.js.nft.json +1 -1
  186. package/app/.next-cli-build/server/app/api/pxpipe/stats/route.js.nft.json +1 -1
  187. package/app/.next-cli-build/server/app/api/pxpipe/status/route.js.nft.json +1 -1
  188. package/app/.next-cli-build/server/app/api/pxpipe/stop/route.js.nft.json +1 -1
  189. package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
  190. package/app/.next-cli-build/server/app/api/settings/proxy-test/route.js.nft.json +1 -1
  191. package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
  192. package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
  193. package/app/.next-cli-build/server/app/api/shutdown/route.js.nft.json +1 -1
  194. package/app/.next-cli-build/server/app/api/tags/route.js.nft.json +1 -1
  195. package/app/.next-cli-build/server/app/api/translator/console-logs/route.js.nft.json +1 -1
  196. package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js.nft.json +1 -1
  197. package/app/.next-cli-build/server/app/api/translator/load/route.js.nft.json +1 -1
  198. package/app/.next-cli-build/server/app/api/translator/save/route.js.nft.json +1 -1
  199. package/app/.next-cli-build/server/app/api/translator/send/route.js +1 -1
  200. package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
  201. package/app/.next-cli-build/server/app/api/translator/translate/route.js +1 -1
  202. package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
  203. package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
  204. package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
  205. package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
  206. package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
  207. package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
  208. package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
  209. package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
  210. package/app/.next-cli-build/server/app/api/usage/[connectionId]/claude-reset/route.js +1 -1
  211. package/app/.next-cli-build/server/app/api/usage/[connectionId]/claude-reset/route.js.nft.json +1 -1
  212. package/app/.next-cli-build/server/app/api/usage/[connectionId]/codex-reset-credits/route.js +1 -1
  213. package/app/.next-cli-build/server/app/api/usage/[connectionId]/codex-reset-credits/route.js.nft.json +1 -1
  214. package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js +1 -1
  215. package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  216. package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
  217. package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
  218. package/app/.next-cli-build/server/app/api/usage/logs/route.js.nft.json +1 -1
  219. package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
  220. package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
  221. package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  222. package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
  223. package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
  224. package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  225. package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  226. package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
  227. package/app/.next-cli-build/server/app/api/v1/audio/voices/route.js.nft.json +1 -1
  228. package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  229. package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  230. package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  231. package/app/.next-cli-build/server/app/api/v1/messages/count_tokens/route.js.nft.json +1 -1
  232. package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
  233. package/app/.next-cli-build/server/app/api/v1/models/[...model]/route.js.nft.json +1 -1
  234. package/app/.next-cli-build/server/app/api/v1/models/info/route.js.nft.json +1 -1
  235. package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
  236. package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  237. package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
  238. package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
  239. package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
  240. package/app/.next-cli-build/server/app/api/v1/systemone/route.js.nft.json +1 -1
  241. package/app/.next-cli-build/server/app/api/v1/videos/[id]/route.js.nft.json +1 -1
  242. package/app/.next-cli-build/server/app/api/v1/videos/edits/route.js.nft.json +1 -1
  243. package/app/.next-cli-build/server/app/api/v1/videos/extensions/route.js.nft.json +1 -1
  244. package/app/.next-cli-build/server/app/api/v1/videos/generations/route.js.nft.json +1 -1
  245. package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
  246. package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  247. package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
  248. package/app/.next-cli-build/server/app/api/version/route.js +1 -1
  249. package/app/.next-cli-build/server/app/api/version/route.js.nft.json +1 -1
  250. package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
  251. package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
  252. package/app/.next-cli-build/server/app/callback/page.js.nft.json +1 -1
  253. package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  254. package/app/.next-cli-build/server/app/callback.html +1 -1
  255. package/app/.next-cli-build/server/app/callback.rsc +4 -4
  256. package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +4 -4
  257. package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +2 -2
  258. package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +4 -4
  259. package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  260. package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +4 -4
  261. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +4 -4
  262. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +4 -4
  263. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
  264. package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  265. package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +4 -4
  266. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +4 -4
  267. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +4 -4
  268. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
  269. package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  270. package/app/.next-cli-build/server/app/dashboard/combos.rsc +4 -4
  271. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +4 -4
  272. package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +4 -4
  273. package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
  274. package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  275. package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +4 -4
  276. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +4 -4
  277. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +4 -4
  278. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
  279. package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  280. package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +4 -4
  281. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +4 -4
  282. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +4 -4
  283. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +2 -2
  284. package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  285. package/app/.next-cli-build/server/app/dashboard/mitm.rsc +4 -4
  286. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +4 -4
  287. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +4 -4
  288. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
  289. package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  290. package/app/.next-cli-build/server/app/dashboard/profile.rsc +4 -4
  291. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +4 -4
  292. package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +4 -4
  293. package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
  294. package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  295. package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +4 -4
  296. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +4 -4
  297. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.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 +4 -4
  301. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +4 -4
  302. package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +4 -4
  303. package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
  304. package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  305. package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +4 -4
  306. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +4 -4
  307. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +4 -4
  308. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
  309. package/app/.next-cli-build/server/app/dashboard/pxpipe.html +1 -1
  310. package/app/.next-cli-build/server/app/dashboard/pxpipe.rsc +4 -4
  311. package/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +4 -4
  312. package/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_full.segment.rsc +4 -4
  313. package/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +2 -2
  314. package/app/.next-cli-build/server/app/dashboard/quota.html +1 -1
  315. package/app/.next-cli-build/server/app/dashboard/quota.rsc +4 -4
  316. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +4 -4
  317. package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +4 -4
  318. package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
  319. package/app/.next-cli-build/server/app/dashboard/settings/pricing/page.js.nft.json +1 -1
  320. package/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  321. package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  322. package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +4 -4
  323. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +4 -4
  324. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
  325. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +4 -4
  326. package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
  327. package/app/.next-cli-build/server/app/dashboard/skills.rsc +4 -4
  328. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +4 -4
  329. package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +4 -4
  330. package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +2 -2
  331. package/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  332. package/app/.next-cli-build/server/app/dashboard/token-saver.rsc +4 -4
  333. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +4 -4
  334. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +4 -4
  335. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +2 -2
  336. package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  337. package/app/.next-cli-build/server/app/dashboard/translator.rsc +4 -4
  338. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +4 -4
  339. package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +4 -4
  340. package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
  341. package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  342. package/app/.next-cli-build/server/app/dashboard/usage.rsc +6 -6
  343. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +6 -6
  344. package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +6 -6
  345. package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
  346. package/app/.next-cli-build/server/app/dashboard.html +1 -1
  347. package/app/.next-cli-build/server/app/dashboard.rsc +4 -4
  348. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +4 -4
  349. package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +4 -4
  350. package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +2 -2
  351. package/app/.next-cli-build/server/app/favicon.ico/route.js.nft.json +1 -1
  352. package/app/.next-cli-build/server/app/index.html +1 -1
  353. package/app/.next-cli-build/server/app/index.rsc +4 -4
  354. package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +4 -4
  355. package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +4 -4
  356. package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +2 -2
  357. package/app/.next-cli-build/server/app/landing/page.js.nft.json +1 -1
  358. package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  359. package/app/.next-cli-build/server/app/landing.html +1 -1
  360. package/app/.next-cli-build/server/app/landing.rsc +4 -4
  361. package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +4 -4
  362. package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +2 -2
  363. package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +4 -4
  364. package/app/.next-cli-build/server/app/login/page.js.nft.json +1 -1
  365. package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  366. package/app/.next-cli-build/server/app/login.html +1 -1
  367. package/app/.next-cli-build/server/app/login.rsc +4 -4
  368. package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +4 -4
  369. package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +2 -2
  370. package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
  371. package/app/.next-cli-build/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  372. package/app/.next-cli-build/server/app/page.js.nft.json +1 -1
  373. package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  374. package/app/.next-cli-build/server/app-paths-manifest.json +2 -2
  375. package/app/.next-cli-build/server/chunks/3449.js +1 -1
  376. package/app/.next-cli-build/server/chunks/412.js +1 -1
  377. package/app/.next-cli-build/server/chunks/4190.js +1 -1
  378. package/app/.next-cli-build/server/chunks/4254.js +1 -0
  379. package/app/.next-cli-build/server/chunks/6540.js +1 -1
  380. package/app/.next-cli-build/server/chunks/7037.js +1 -1
  381. package/app/.next-cli-build/server/chunks/7066.js +1 -1
  382. package/app/.next-cli-build/server/chunks/827.js +1 -1
  383. package/app/.next-cli-build/server/chunks/869.js +1 -1
  384. package/app/.next-cli-build/server/chunks/9604.js +1 -1
  385. package/app/.next-cli-build/server/instrumentation.js.nft.json +1 -1
  386. package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  387. package/app/.next-cli-build/server/middleware-react-loadable-manifest.js +1 -1
  388. package/app/.next-cli-build/server/middleware.js.nft.json +1 -1
  389. package/app/.next-cli-build/server/pages/404.html +1 -1
  390. package/app/.next-cli-build/server/pages/500.html +1 -1
  391. package/app/.next-cli-build/static/chunks/124.c1b5af11afe50408.js +1 -0
  392. package/app/.next-cli-build/static/chunks/{1321-a966036b7e3ae8c3.js → 1321-6630b5aa23e3ec0e.js} +1 -1
  393. package/app/.next-cli-build/static/chunks/2435.73c540d31dae9ecf.js +1 -0
  394. package/app/.next-cli-build/static/chunks/3521.f0ac0c88103b9f6c.js +1 -0
  395. package/app/.next-cli-build/static/chunks/5497-1681f72f0e82b863.js +7 -0
  396. package/app/.next-cli-build/static/chunks/5524.fca1db6352c39218.js +1 -0
  397. package/app/.next-cli-build/static/chunks/6808-b6550a28721e71e1.js +1 -0
  398. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/usage/{page-1f79ed13b16582ef.js → page-be90b4d4a94a121d.js} +1 -1
  399. package/app/.next-cli-build/static/chunks/webpack-396894770603fee1.js +1 -0
  400. package/app/.next-cli-build/static/css/2388dd0fafaf8266.css +1 -0
  401. package/app/cli/.build-home/AppData/Roaming/67router/db/data.sqlite-shm +0 -0
  402. package/app/cli/.build-home/AppData/Roaming/67router/db/data.sqlite-wal +0 -0
  403. package/app/package.json +1 -1
  404. package/cli.js +54 -54
  405. package/package.json +1 -1
  406. package/src/cli/tray/tray.ps1 +64 -10
  407. package/src/cli/tray/trayWin.js +38 -15
  408. package/app/.next-cli-build/server/chunks/6708.js +0 -1
  409. package/app/.next-cli-build/server/chunks/7121.js +0 -1
  410. package/app/.next-cli-build/static/chunks/124.c092990b4bdb9713.js +0 -1
  411. package/app/.next-cli-build/static/chunks/2435.8a5a02e626c780d0.js +0 -1
  412. package/app/.next-cli-build/static/chunks/3521.a9e2daf685420cc7.js +0 -1
  413. package/app/.next-cli-build/static/chunks/5497-3cf29976f188352b.js +0 -7
  414. package/app/.next-cli-build/static/chunks/6808-9540d7ac65c3e6a0.js +0 -1
  415. package/app/.next-cli-build/static/chunks/webpack-97b250ee703d0d92.js +0 -1
  416. package/app/.next-cli-build/static/css/d9ba36d87937fec6.css +0 -1
  417. /package/app/.next-cli-build/static/{RC_KHxUynSqU7uk0euJap → ZSFfwWCBng6VPk2-0itNU}/_buildManifest.js +0 -0
  418. /package/app/.next-cli-build/static/{RC_KHxUynSqU7uk0euJap → ZSFfwWCBng6VPk2-0itNU}/_ssgManifest.js +0 -0
package/cli.js CHANGED
@@ -660,6 +660,60 @@ function startServer(updatePromise) {
660
660
 
661
661
  let server = spawnServer();
662
662
 
663
+ function attachServerEvents() {
664
+ server.on("error", (err) => {
665
+ console.error("Failed to start server:", err.message);
666
+ if (!isShuttingDown) tryRestart();
667
+ else { cleanup(); process.exit(1); }
668
+ });
669
+
670
+ server.on("close", (code) => {
671
+ if (isShuttingDown) {
672
+ process.exit(code || 0);
673
+ return;
674
+ }
675
+ tryRestart(code);
676
+ });
677
+ }
678
+
679
+ function tryRestart(code) {
680
+ const aliveMs = Date.now() - serverStartTime;
681
+ // Reset counter if last run was stable
682
+ if (aliveMs >= RESTART_RESET_MS) restartCount = 0;
683
+
684
+ if (restartCount >= MAX_RESTARTS) {
685
+ console.error(`\n⚠️ Server crashed ${MAX_RESTARTS} times. Disabling MIT and restarting...`);
686
+ try {
687
+ const dbPath = path.join(getAppDataDir(), "db.json");
688
+ if (fs.existsSync(dbPath)) {
689
+ const db = JSON.parse(fs.readFileSync(dbPath, "utf-8"));
690
+ if (db.settings) db.settings.mitmEnabled = false;
691
+ fs.writeFileSync(dbPath, JSON.stringify(db, null, 2));
692
+ }
693
+ } catch { /* best effort */ }
694
+ restartCount = 0;
695
+ server = spawnServer();
696
+ attachServerEvents();
697
+ return;
698
+ }
699
+
700
+ restartCount++;
701
+ const delay = Math.min(1000 * restartCount, 10000);
702
+ console.error(`\n⚠️ Server exited (code=${code ?? "unknown"}). Restarting in ${delay / 1000}s... (${restartCount}/${MAX_RESTARTS})`);
703
+ if (crashLog.length) {
704
+ console.error("\n--- Server crash log ---");
705
+ crashLog.forEach(l => console.error(l));
706
+ console.error("--- End crash log ---\n");
707
+ }
708
+
709
+ setTimeout(() => {
710
+ server = spawnServer();
711
+ attachServerEvents();
712
+ }, delay);
713
+ }
714
+
715
+ attachServerEvents();
716
+
663
717
  // Cleanup function - force kill server process
664
718
  let isCleaningUp = false;
665
719
  function cleanup() {
@@ -838,58 +892,4 @@ function startServer(updatePromise) {
838
892
  process.exit(1);
839
893
  }
840
894
  });
841
-
842
- function attachServerEvents() {
843
- server.on("error", (err) => {
844
- console.error("Failed to start server:", err.message);
845
- if (!isShuttingDown) tryRestart();
846
- else { cleanup(); process.exit(1); }
847
- });
848
-
849
- server.on("close", (code) => {
850
- if (isShuttingDown || code === 0) {
851
- process.exit(code || 0);
852
- return;
853
- }
854
- tryRestart(code);
855
- });
856
- }
857
-
858
- function tryRestart(code) {
859
- const aliveMs = Date.now() - serverStartTime;
860
- // Reset counter if last run was stable
861
- if (aliveMs >= RESTART_RESET_MS) restartCount = 0;
862
-
863
- if (restartCount >= MAX_RESTARTS) {
864
- console.error(`\n⚠️ Server crashed ${MAX_RESTARTS} times. Disabling MIT and restarting...`);
865
- try {
866
- const dbPath = path.join(getAppDataDir(), "db.json");
867
- if (fs.existsSync(dbPath)) {
868
- const db = JSON.parse(fs.readFileSync(dbPath, "utf-8"));
869
- if (db.settings) db.settings.mitmEnabled = false;
870
- fs.writeFileSync(dbPath, JSON.stringify(db, null, 2));
871
- }
872
- } catch { /* best effort */ }
873
- restartCount = 0;
874
- server = spawnServer();
875
- attachServerEvents();
876
- return;
877
- }
878
-
879
- restartCount++;
880
- const delay = Math.min(1000 * restartCount, 10000);
881
- console.error(`\n⚠️ Server exited (code=${code ?? "unknown"}). Restarting in ${delay / 1000}s... (${restartCount}/${MAX_RESTARTS})`);
882
- if (crashLog.length) {
883
- console.error("\n--- Server crash log ---");
884
- crashLog.forEach(l => console.error(l));
885
- console.error("--- End crash log ---\n");
886
- }
887
-
888
- setTimeout(() => {
889
- server = spawnServer();
890
- attachServerEvents();
891
- }, delay);
892
- }
893
-
894
- attachServerEvents();
895
895
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "67router",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
4
4
  "description": "67Router CLI - Start and manage 67Router server",
5
5
  "bin": {
6
6
  "67router": "./cli.js",
@@ -6,6 +6,9 @@ $ErrorActionPreference = "Stop"
6
6
 
7
7
  Add-Type @"
8
8
  using System;
9
+ using System.IO;
10
+ using System.Collections.Concurrent;
11
+ using System.Threading;
9
12
  using System.Runtime.InteropServices;
10
13
 
11
14
  public static class WinDpiAwareness {
@@ -24,6 +27,45 @@ public static class WinDpiAwareness {
24
27
  [DllImport("user32.dll")]
25
28
  public static extern bool SetProcessDPIAware();
26
29
  }
30
+
31
+ public static class StdinReader {
32
+ private static readonly ConcurrentQueue<string> _queue = new ConcurrentQueue<string>();
33
+ private static Thread _thread;
34
+ private static volatile bool _running = false;
35
+
36
+ public static void Start() {
37
+ if (_running) return;
38
+ _running = true;
39
+ _thread = new Thread(Run) {
40
+ IsBackground = true,
41
+ Name = "StdinReaderThread"
42
+ };
43
+ _thread.Start();
44
+ }
45
+
46
+ public static void Stop() {
47
+ _running = false;
48
+ }
49
+
50
+ private static void Run() {
51
+ try {
52
+ string line;
53
+ while (_running && (line = Console.ReadLine()) != null) {
54
+ if (!string.IsNullOrWhiteSpace(line)) {
55
+ _queue.Enqueue(line);
56
+ }
57
+ }
58
+ } catch { }
59
+ }
60
+
61
+ public static string TryReadLine() {
62
+ string line;
63
+ if (_queue.TryDequeue(out line)) {
64
+ return line;
65
+ }
66
+ return null;
67
+ }
68
+ }
27
69
  "@
28
70
 
29
71
  function Enable-HighDpiAwareness {
@@ -61,8 +103,17 @@ $OutputEncoding = [System.Text.Encoding]::UTF8
61
103
  [System.Windows.Forms.Application]::EnableVisualStyles()
62
104
  [System.Windows.Forms.Application]::SetCompatibleTextRenderingDefault($false)
63
105
 
106
+ # Safe tooltip truncation (Win32 NotifyIcon.Text max 63 characters)
107
+ if ($Tooltip -and $Tooltip.Length -gt 63) {
108
+ $Tooltip = $Tooltip.Substring(0, 63)
109
+ }
110
+
64
111
  $script:notifyIcon = New-Object System.Windows.Forms.NotifyIcon
65
- $script:notifyIcon.Icon = New-Object System.Drawing.Icon($IconPath)
112
+ try {
113
+ $script:notifyIcon.Icon = New-Object System.Drawing.Icon($IconPath)
114
+ } catch {
115
+ $script:notifyIcon.Icon = [System.Drawing.SystemIcons]::Application
116
+ }
66
117
  $script:notifyIcon.Text = $Tooltip
67
118
  $script:notifyIcon.Visible = $true
68
119
 
@@ -71,9 +122,11 @@ $script:notifyIcon.ContextMenuStrip = $script:menu
71
122
  $script:items = @()
72
123
 
73
124
  function Write-Event($obj) {
74
- $json = $obj | ConvertTo-Json -Compress
75
- [Console]::Out.WriteLine($json)
76
- [Console]::Out.Flush()
125
+ try {
126
+ $json = $obj | ConvertTo-Json -Compress
127
+ [Console]::Out.WriteLine($json)
128
+ [Console]::Out.Flush()
129
+ } catch {}
77
130
  }
78
131
 
79
132
  function Add-MenuItem($index, $title, $enabled) {
@@ -94,19 +147,19 @@ function Update-MenuItem($index, $title, $enabled) {
94
147
  }
95
148
 
96
149
  function Set-Tooltip($text) {
97
- # NotifyIcon.Text max 63 chars
98
- if ($text.Length -gt 63) { $text = $text.Substring(0, 63) }
150
+ if ($text -and $text.Length -gt 63) { $text = $text.Substring(0, 63) }
99
151
  $script:notifyIcon.Text = $text
100
152
  }
101
153
 
102
- # Background reader thread polls stdin via timer on UI thread
154
+ # Start non-blocking background stdin reader thread
155
+ [StdinReader]::Start()
156
+
157
+ # UI thread timer polls thread-safe queue without blocking message loop
103
158
  $script:timer = New-Object System.Windows.Forms.Timer
104
159
  $script:timer.Interval = 100
105
160
  $script:timer.Add_Tick({
106
161
  try {
107
- while ([Console]::In.Peek() -ne -1) {
108
- $line = [Console]::In.ReadLine()
109
- if ([string]::IsNullOrWhiteSpace($line)) { continue }
162
+ while ($null -ne ($line = [StdinReader]::TryReadLine())) {
110
163
  $cmd = $line | ConvertFrom-Json
111
164
  switch ($cmd.action) {
112
165
  "add-item" { Add-MenuItem $cmd.index $cmd.title $cmd.enabled }
@@ -114,6 +167,7 @@ $script:timer.Add_Tick({
114
167
  "set-tooltip" { Set-Tooltip $cmd.text }
115
168
  "ready" { Write-Event @{ type = "ready" } }
116
169
  "kill" {
170
+ [StdinReader]::Stop()
117
171
  $script:notifyIcon.Visible = $false
118
172
  $script:notifyIcon.Dispose()
119
173
  [System.Windows.Forms.Application]::Exit()
@@ -2,27 +2,21 @@ const { spawn } = require("child_process");
2
2
  const path = require("path");
3
3
  const readline = require("readline");
4
4
 
5
- // PowerShell-based tray for Windows (AV-safe, zero binary deps)
6
-
7
5
  let psProcess = null;
8
6
  let clickHandler = null;
7
+ let activeOptions = null;
8
+ let isKilled = false;
9
9
 
10
- /**
11
- * Send JSON command to PowerShell tray process via stdin
12
- */
13
10
  function sendCommand(cmd) {
14
- if (psProcess && psProcess.stdin.writable) {
15
- psProcess.stdin.write(`${JSON.stringify(cmd)}\n`, "utf8");
11
+ if (psProcess && psProcess.stdin && psProcess.stdin.writable) {
12
+ try {
13
+ psProcess.stdin.write(`${JSON.stringify(cmd)}\n`, "utf8");
14
+ } catch (e) {}
16
15
  }
17
16
  }
18
17
 
19
- /**
20
- * Initialize Windows tray using PowerShell NotifyIcon
21
- * @param {Object} options - { iconPath, tooltip, items, onClick }
22
- * items: [{ title, enabled }]
23
- * @returns {Object|null} controller with sendAction/kill
24
- */
25
- function initWinTray(options) {
18
+ function spawnTray(options) {
19
+ if (isKilled) return null;
26
20
  const { iconPath, tooltip, items, onClick } = options;
27
21
  clickHandler = onClick;
28
22
 
@@ -60,19 +54,48 @@ function initWinTray(options) {
60
54
  psProcess.on("error", () => {});
61
55
  psProcess.stderr.on("data", () => {});
62
56
 
63
- // Send initial menu items
57
+ psProcess.on("close", () => {
58
+ psProcess = null;
59
+ if (!isKilled && activeOptions) {
60
+ setTimeout(() => {
61
+ if (!isKilled && activeOptions) {
62
+ spawnTray(activeOptions);
63
+ }
64
+ }, 1500);
65
+ }
66
+ });
67
+
64
68
  items.forEach((item, index) => {
65
69
  sendCommand({ action: "add-item", index, title: item.title, enabled: item.enabled });
66
70
  });
67
71
 
72
+ return psProcess;
73
+ }
74
+
75
+ function initWinTray(options) {
76
+ isKilled = false;
77
+ activeOptions = {
78
+ ...options,
79
+ items: options.items.map((it) => ({ ...it }))
80
+ };
81
+
82
+ const proc = spawnTray(activeOptions);
83
+ if (!proc) return null;
84
+
68
85
  return {
69
86
  updateItem(index, title, enabled) {
87
+ if (activeOptions && activeOptions.items && activeOptions.items[index]) {
88
+ activeOptions.items[index] = { title, enabled };
89
+ }
70
90
  sendCommand({ action: "update-item", index, title, enabled });
71
91
  },
72
92
  setTooltip(text) {
93
+ if (activeOptions) activeOptions.tooltip = text;
73
94
  sendCommand({ action: "set-tooltip", text });
74
95
  },
75
96
  kill() {
97
+ isKilled = true;
98
+ activeOptions = null;
76
99
  try {
77
100
  sendCommand({ action: "kill" });
78
101
  } catch (e) {}
@@ -1 +0,0 @@
1
- "use strict";exports.id=6708,exports.ids=[6708],exports.modules={46708:(a,b,c)=>{c.r(b),c.d(b,{default:()=>s});var d=c(48249),e=c(67484),f=c(49885),g=c.n(f),h=c(48679),i=c(33503),j=c(5277),k=c(22393),l=c(54206),m=c(48121),n=c(3807),o=c(93237),p=c(17660);let q=["#6366f1","#14b8a6","#f59e0b","#ef4444","#8b5cf6"],r=a=>a>=1e6?`${(a/1e6).toFixed(1)}M`:a>=1e3?`${(a/1e3).toFixed(1)}K`:String(a||0);function s({byModel:a}){let[b,c]=(0,e.useState)("tokens"),f=(0,e.useMemo)(()=>a?Object.values(a).map(a=>({name:((a,b=22)=>a&&a.length>b?a.slice(0,b)+"…":a||"")(a.rawModel||"Unknown"),tokens:(a.promptTokens||0)+(a.completionTokens||0),requests:a.requests||0})).filter(a=>a[b]>0).sort((a,c)=>c[b]-a[b]).slice(0,5):[],[a,b]),g="tokens"===b?r:String,t="tokens"===b?"Tokens":"Requests";return(0,d.jsxs)(p.default,{className:"flex min-w-0 flex-col gap-3 p-3 sm:p-4",children:[(0,d.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,d.jsx)("span",{className:"text-sm font-semibold text-text-muted uppercase tracking-wide",children:"Top Models"}),(0,d.jsxs)("div",{className:"grid grid-cols-2 items-center gap-1 rounded-lg border border-border bg-bg-subtle p-1",children:[(0,d.jsx)("button",{onClick:()=>c("tokens"),className:`px-2.5 py-0.5 rounded-md text-xs font-medium transition-colors ${"tokens"===b?"bg-primary text-white shadow-sm":"text-text-muted hover:text-text hover:bg-bg-hover"}`,children:"Tokens"}),(0,d.jsx)("button",{onClick:()=>c("requests"),className:`px-2.5 py-0.5 rounded-md text-xs font-medium transition-colors ${"requests"===b?"bg-primary text-white shadow-sm":"text-text-muted hover:text-text hover:bg-bg-hover"}`,children:"Requests"})]})]}),f.length?(0,d.jsx)(h.u,{width:"100%",height:180,children:(0,d.jsxs)(i.E,{data:f,layout:"vertical",margin:{top:4,right:40,left:4,bottom:4},children:[(0,d.jsx)(j.d,{strokeDasharray:"3 3",strokeOpacity:.1,horizontal:!1}),(0,d.jsx)(k.W,{type:"number",tick:{fontSize:10,fill:"currentColor",fillOpacity:.5},tickLine:!1,axisLine:!1,tickFormatter:g}),(0,d.jsx)(l.h,{type:"category",dataKey:"name",tick:{fontSize:10,fill:"currentColor",fillOpacity:.7},tickLine:!1,axisLine:!1,width:90}),(0,d.jsx)(m.m,{contentStyle:{backgroundColor:"var(--color-bg)",border:"1px solid var(--color-border)",borderRadius:"8px",fontSize:"12px"},formatter:a=>[g(a),t]}),(0,d.jsx)(n.yP,{dataKey:b,radius:[0,4,4,0],children:f.map((a,b)=>(0,d.jsx)(o.f,{fill:q[b%q.length],fillOpacity:.85},b))})]})}):(0,d.jsx)("div",{className:"h-44 flex items-center justify-center text-text-muted text-sm",children:"No model usage yet"})]})}s.propTypes={byModel:g().object}}};
@@ -1 +0,0 @@
1
- "use strict";exports.id=7121,exports.ids=[7121],exports.modules={3807:(a,b,c)=>{c.d(b,{yP:()=>aK,LP:()=>aJ});var d=c(67484),e=c(99314),f=c(40948),g=c(93237),h=c(47459),i=c(1791),j=c(21480),k=c(16216),l=c(64635),m=c(73976),n=c(61368),o=["option"],p=m.M;function q(a){var b=a.option,c=function(a,b){if(null==a)return{};var c,d,e=function(a,b){if(null==a)return{};var c={};for(var d in a)if(({}).hasOwnProperty.call(a,d)){if(-1!==b.indexOf(d))continue;c[d]=a[d]}return c}(a,b);if(Object.getOwnPropertySymbols){var f=Object.getOwnPropertySymbols(a);for(d=0;d<f.length;d++)c=f[d],-1===b.indexOf(c)&&({}).propertyIsEnumerable.call(a,c)&&(e[c]=a[c])}return e}(a,o);return d.createElement(n.y,{option:b,DefaultShape:p,shapeProps:c,activeClassName:"recharts-active-bar",inActiveClassName:"recharts-inactive-bar"})}var r=function(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return(c,d)=>{if((0,i.Et)(a))return a;var e=(0,i.Et)(c)||(0,i.uy)(c);return e?a(c,d):(e||function(a,b){if(!a)throw Error("Invariant failed")}(!1,"minPointSize callback function received a value with type of ".concat(typeof c,". Currently only numbers or null/undefined are supported.")),b)}},s=c(32671),t=c(3672),u=(a,b,c)=>{var d=(0,s.j)();return(e,f)=>g=>{null==a||a(e,f,g),d((0,t.RD)({activeIndex:String(f),activeDataKey:b,activeCoordinate:e.tooltipPosition,activeGraphicalItemId:c}))}},v=a=>{var b=(0,s.j)();return(c,d)=>e=>{null==a||a(c,d,e),b((0,t.oP)())}},w=(a,b,c)=>{var d=(0,s.j)();return(e,f)=>g=>{null==a||a(e,f,g),d((0,t.ML)({activeIndex:String(f),activeDataKey:b,activeCoordinate:e.tooltipPosition,activeGraphicalItemId:c}))}},x=c(443),y=["children"],z=(0,d.createContext)({data:[],xAxisId:"xAxis-0",yAxisId:"yAxis-0",dataPointFormatter:()=>({x:0,y:0,value:0}),errorBarOffset:0});function A(a){var b=a.children,c=function(a,b){if(null==a)return{};var c,d,e=function(a,b){if(null==a)return{};var c={};for(var d in a)if(({}).hasOwnProperty.call(a,d)){if(-1!==b.indexOf(d))continue;c[d]=a[d]}return c}(a,b);if(Object.getOwnPropertySymbols){var f=Object.getOwnPropertySymbols(a);for(d=0;d<f.length;d++)c=f[d],-1===b.indexOf(c)&&({}).propertyIsEnumerable.call(a,c)&&(e[c]=a[c])}return e}(a,y);return d.createElement(z.Provider,{value:c},b)}var B=c(10059),C=c(55644),D=c(32362),E=c(27382),F=c(25644),G=c(23510),H=c(80852),I=c(16776);function J(a,b){(null==b||b>a.length)&&(b=a.length);for(var c=0,d=Array(b);c<b;c++)d[c]=a[c];return d}var K=(a,b,c)=>{var d=null!=c?c:a;if(!(0,i.uy)(d))return(0,i.F4)(d,b,0)},L=c(9434);function M(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function N(a){for(var b=1;b<arguments.length;b++){var c=null!=arguments[b]?arguments[b]:{};b%2?M(Object(c),!0).forEach(function(b){var d,e,f;d=a,e=b,f=c[b],(e=function(a){var b=function(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}(a,"string");return"symbol"==typeof b?b:b+""}(e))in d?Object.defineProperty(d,e,{value:f,enumerable:!0,configurable:!0,writable:!0}):d[e]=f}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(c)):M(Object(c)).forEach(function(b){Object.defineProperty(a,b,Object.getOwnPropertyDescriptor(c,b))})}return a}var O=c(28222),P=c(27660),Q=(0,D.Mz)([E.ld,(a,b)=>b],(a,b)=>a.filter(a=>"bar"===a.type).find(a=>a.id===b)),R=(0,D.Mz)([Q],a=>null==a?void 0:a.maxBarSize),S=(0,D.Mz)([C.fz,E.ld,P.W,P.B,(a,b,c)=>c],(a,b,c,d,e)=>b.filter(b=>"horizontal"===a?b.xAxisId===c:b.yAxisId===d).filter(a=>a.isPanorama===e).filter(a=>!1===a.hide).filter(a=>"bar"===a.type)),T=(0,D.Mz)([S,H.x3,(a,b)=>{var c=(0,C.fz)(a),d=(0,P.W)(a,b),e=(0,P.B)(a,b);if(null!=d&&null!=e)return"horizontal"===c?(0,E.BQ)(a,"xAxis",d):(0,E.BQ)(a,"yAxis",e)}],(a,b,c)=>{var d=a.filter(I.g),e=a.filter(a=>null==a.stackId);return[...Object.entries(d.reduce((a,b)=>{var c=a[b.stackId];return null==c&&(c=[]),c.push(b),a[b.stackId]=c,a},{})).map(a=>{var d,e=function(a){if(Array.isArray(a))return a}(a)||function(a){var b=null==a?null:"u">typeof Symbol&&a[Symbol.iterator]||a["@@iterator"];if(null!=b){var c,d,e,f,g=[],h=!0,i=!1;try{e=(b=b.call(a)).next,!1;for(;!(h=(c=e.call(b)).done)&&(g.push(c.value),2!==g.length);h=!0);}catch(a){i=!0,d=a}finally{try{if(!h&&null!=b.return&&(f=b.return(),Object(f)!==f))return}finally{if(i)throw d}}return g}}(a)||function(a){if(a){if("string"==typeof a)return J(a,2);var b=({}).toString.call(a).slice(8,-1);return"Object"===b&&a.constructor&&(b=a.constructor.name),"Map"===b||"Set"===b?Array.from(a):"Arguments"===b||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(b)?J(a,2):void 0}}(a)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),f=e[0],g=e[1];return{stackId:f,dataKeys:g.map(a=>a.dataKey),barSize:K(b,c,null==(d=g[0])?void 0:d.barSize)}}),...e.map(a=>({stackId:void 0,dataKeys:[a.dataKey].filter(a=>null!=a),barSize:K(b,c,a.barSize)}))]}),U=(a,b,c)=>{var d,e,f=(0,C.fz)(a),g=(0,P.W)(a,b),h=(0,P.B)(a,b);if(null!=g&&null!=h)return"horizontal"===f?(d=(0,E.Gx)(a,"xAxis",g,c),e=(0,E.CR)(a,"xAxis",g,c)):(d=(0,E.Gx)(a,"yAxis",h,c),e=(0,E.CR)(a,"yAxis",h,c)),(0,k.Hj)(d,e)},V=(0,D.Mz)([T,H.JN,H._5,H.gY,(a,b,c)=>{var d,e,f,g,h=Q(a,b);if(null==h)return 0;var j=(0,P.W)(a,b),l=(0,P.B)(a,b);if(null==j||null==l)return 0;var m=(0,C.fz)(a),n=(0,H.JN)(a),o=h.maxBarSize,p=(0,i.uy)(o)?n:o;return"horizontal"===m?(f=(0,E.Gx)(a,"xAxis",j,c),g=(0,E.CR)(a,"xAxis",j,c)):(f=(0,E.Gx)(a,"yAxis",l,c),g=(0,E.CR)(a,"yAxis",l,c)),null!=(d=null!=(e=(0,k.Hj)(f,g,!0))?e:p)?d:0},U,R],(a,b,c,d,e,f,g)=>{var h=function(a,b,c,d,e){var f,g,h=d.length;if(!(h<1)){var j=(0,i.F4)(a,c,0,!0),k=[];if((0,L.H)(null==(f=d[0])?void 0:f.barSize)){var l=!1,m=c/h,n=d.reduce((a,b)=>a+(b.barSize||0),0);(n+=(h-1)*j)>=c&&(n-=(h-1)*j,j=0),n>=c&&m>0&&(l=!0,m*=.9,n=h*m);var o={offset:Math.round((c-n)/2)-j,size:0};g=d.reduce((a,b)=>{var c,d={stackId:b.stackId,dataKeys:b.dataKeys,position:{offset:o.offset+o.size+j,size:l?m:null!=(c=b.barSize)?c:0}},e=[...a,d];return o=d.position,e},k)}else{var p=(0,i.F4)(b,c,0,!0);c-2*p-(h-1)*j<=0&&(j=0);var q=(c-2*p-(h-1)*j)/h;q>1&&(q=Math.round(q));var r=(0,L.H)(e)?Math.min(q,e):q;g=d.reduce((a,b,c)=>[...a,{stackId:b.stackId,dataKeys:b.dataKeys,position:{offset:p+h*(q-r)/2+(r+j)*c,size:r}}],k)}return g}}(c,d,e!==f?e:f,a,(0,i.uy)(g)?b:g);return e!==f&&null!=h&&(h=h.map(a=>N(N({},a),{},{position:N(N({},a.position),{},{offset:a.position.offset-e/2})}))),h}),W=(0,D.Mz)([V,Q],(a,b)=>{if(null!=a&&null!=b){var c=a.find(a=>a.stackId===b.stackId&&null!=b.dataKey&&a.dataKeys.includes(b.dataKey));if(null!=c)return c.position}}),X=(0,D.Mz)([(a,b,c)=>{var d=(0,C.fz)(a),e=(0,P.W)(a,b),f=(0,P.B)(a,b);if(null!=e&&null!=f)return"horizontal"===d?(0,E.TC)(a,"yAxis",f,c):(0,E.TC)(a,"xAxis",e,c)},Q],(a,b)=>{var c=(0,O.x)(b);if(!a||null==c||null==b)return;var d=b.stackId;if(null!=d){var e=a[d];if(e){var f=e.stackedData;if(f)return f.find(a=>a.key===c)}}}),Y=(0,D.Mz)([G.HZ,G.c2,(a,b,c)=>{var d=(0,P.W)(a,b);if(null!=d)return(0,E.Gx)(a,"xAxis",d,c)},(a,b,c)=>{var d=(0,P.B)(a,b);if(null!=d)return(0,E.Gx)(a,"yAxis",d,c)},(a,b,c)=>{var d=(0,P.W)(a,b);if(null!=d)return(0,E.CR)(a,"xAxis",d,c)},(a,b,c)=>{var d=(0,P.B)(a,b);if(null!=d)return(0,E.CR)(a,"yAxis",d,c)},W,C.fz,F.rN,U,X,Q,(a,b,c,d)=>d],(a,b,c,d,e,f,g,h,i,j,k,l,m)=>{var n,o=i.chartData,p=i.dataStartIndex,q=i.dataEndIndex;if(null!=l&&null!=g&&null!=b&&("horizontal"===h||"vertical"===h)&&null!=c&&null!=d&&null!=e&&null!=f&&null!=j){var r=l.data;if(null!=(n=null!=r&&r.length>0?r:null==o?void 0:o.slice(p,q+1)))return aJ({layout:h,barSettings:l,pos:g,parentViewBox:b,bandSize:j,xAxis:c,yAxis:d,xAxisTicks:e,yAxisTicks:f,stackedData:k,displayedData:n,offset:a,cells:m,dataStartIndex:p})}}),Z=c(70383),$=c(83881),_=c(82118),aa=c(69599),ab=c(26674),ac=c(93021),ad=c(70719),ae=c(99659),af=c(64644),ag=c(17947),ah=c(6859),ai=c(66762),aj=["index"];function ak(){return(ak=Object.assign?Object.assign.bind():function(a){for(var b=1;b<arguments.length;b++){var c=arguments[b];for(var d in c)({}).hasOwnProperty.call(c,d)&&(a[d]=c[d])}return a}).apply(null,arguments)}var al=(0,d.createContext)(void 0),am=a=>{var b=a.index,c=function(a,b){if(null==a)return{};var c,d,e=function(a,b){if(null==a)return{};var c={};for(var d in a)if(({}).hasOwnProperty.call(a,d)){if(-1!==b.indexOf(d))continue;c[d]=a[d]}return c}(a,b);if(Object.getOwnPropertySymbols){var f=Object.getOwnPropertySymbols(a);for(d=0;d<f.length;d++)c=f[d],-1===b.indexOf(c)&&({}).propertyIsEnumerable.call(a,c)&&(e[c]=a[c])}return e}(a,aj),e=(a=>{var b=(0,d.useContext)(al);if(null!=b){var c=b.stackId;return"url(#".concat("recharts-bar-stack-clip-path-".concat(c,"-").concat(a),")")}})(b);return d.createElement(f.W,ak({className:"recharts-bar-stack-layer",clipPath:e},c))},an=["onMouseEnter","onMouseLeave","onClick"],ao=["value","background","tooltipPosition"],ap=["id"],aq=["onMouseEnter","onClick","onMouseLeave"];function ar(a,b){return function(a){if(Array.isArray(a))return a}(a)||function(a,b){var c=null==a?null:"u">typeof Symbol&&a[Symbol.iterator]||a["@@iterator"];if(null!=c){var d,e,f,g,h=[],i=!0,j=!1;try{if(f=(c=c.call(a)).next,0===b){if(Object(c)!==c)return;i=!1}else for(;!(i=(d=f.call(c)).done)&&(h.push(d.value),h.length!==b);i=!0);}catch(a){j=!0,e=a}finally{try{if(!i&&null!=c.return&&(g=c.return(),Object(g)!==g))return}finally{if(j)throw e}}return h}}(a,b)||function(a,b){if(a){if("string"==typeof a)return as(a,b);var c=({}).toString.call(a).slice(8,-1);return"Object"===c&&a.constructor&&(c=a.constructor.name),"Map"===c||"Set"===c?Array.from(a):"Arguments"===c||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(c)?as(a,b):void 0}}(a,b)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function as(a,b){(null==b||b>a.length)&&(b=a.length);for(var c=0,d=Array(b);c<b;c++)d[c]=a[c];return d}function at(){return(at=Object.assign?Object.assign.bind():function(a){for(var b=1;b<arguments.length;b++){var c=arguments[b];for(var d in c)({}).hasOwnProperty.call(c,d)&&(a[d]=c[d])}return a}).apply(null,arguments)}function au(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function av(a){for(var b=1;b<arguments.length;b++){var c=null!=arguments[b]?arguments[b]:{};b%2?au(Object(c),!0).forEach(function(b){var d,e,f;d=a,e=b,f=c[b],(e=function(a){var b=function(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}(a,"string");return"symbol"==typeof b?b:b+""}(e))in d?Object.defineProperty(d,e,{value:f,enumerable:!0,configurable:!0,writable:!0}):d[e]=f}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(c)):au(Object(c)).forEach(function(b){Object.defineProperty(a,b,Object.getOwnPropertyDescriptor(c,b))})}return a}function aw(a,b){if(null==a)return{};var c,d,e=function(a,b){if(null==a)return{};var c={};for(var d in a)if(({}).hasOwnProperty.call(a,d)){if(-1!==b.indexOf(d))continue;c[d]=a[d]}return c}(a,b);if(Object.getOwnPropertySymbols){var f=Object.getOwnPropertySymbols(a);for(d=0;d<f.length;d++)c=f[d],-1===b.indexOf(c)&&({}).propertyIsEnumerable.call(a,c)&&(e[c]=a[c])}return e}var ax=d.memo(a=>{var b=a.dataKey,c=a.stroke,e=a.strokeWidth,f=a.fill,g=a.name,h=a.hide,j=a.unit,l=a.formatter,m=a.tooltipType,n=a.id,o={dataDefinedOnItem:void 0,getPosition:i.lQ,settings:{stroke:c,strokeWidth:e,fill:f,dataKey:b,nameKey:void 0,name:(0,k.uM)(g,b),hide:h,type:m,color:f,unit:j,formatter:l,graphicalItemId:n}};return d.createElement(x.r,{tooltipEntrySettings:o})});function ay(a){var b,c=(0,s.G)($.A2),e=a.data,f=a.dataKey,g=a.background,h=a.allOtherBarProps,i=h.onMouseEnter,j=h.onMouseLeave,k=h.onClick,m=aw(h,an),n=u(i,f,h.id),o=v(j),p=w(k,f,h.id);if(!g||null==e)return null;var r=(0,ad.ic)(g);return d.createElement(ag.g,{zIndex:(b=ah.I.barBackground,g&&"object"==typeof g&&"zIndex"in g&&"number"==typeof g.zIndex&&(0,L.H)(g.zIndex)?g.zIndex:b)},e.map((a,b)=>{a.value;var e=a.background,h=(a.tooltipPosition,aw(a,ao));if(!e)return null;var i=n(a,a.originalDataIndex),j=o(a,a.originalDataIndex),k=p(a,a.originalDataIndex),s=av(av(av(av(av({option:g,isActive:String(a.originalDataIndex)===c},h),{},{fill:"#eee"},e),r),(0,l.XC)(m,a,b)),{},{onMouseEnter:i,onMouseLeave:j,onClick:k,dataKey:f,index:b,className:"recharts-bar-background-rectangle"});return d.createElement(q,at({key:"background-bar-".concat(b)},s))}))}function az(a){var b=a.showLabels,c=a.children,e=a.rects,f=null==e?void 0:e.map(a=>{var b={x:a.x,y:a.y,width:a.width,lowerWidth:a.width,upperWidth:a.width,height:a.height};return av(av({},b),{},{value:a.value,payload:a.payload,parentViewBox:a.parentViewBox,viewBox:b,fill:a.fill})});return d.createElement(h.h8,{value:b?f:void 0},c)}function aA(a){var b,c=a.shape,e=a.activeBar,f=a.baseProps,g=a.entry,h=a.index,i=a.dataKey,j=(0,s.G)($.A2),k=(0,s.G)($.Xb),l=e&&String(g.originalDataIndex)===j&&(null==k||i===k);null!=j&&String(g.originalDataIndex);var m=ar((0,d.useState)(!1),2),n=m[0],o=m[1],p=ar((0,d.useState)(!1),2),r=p[0];p[1];var t=(0,d.useCallback)(()=>{l||o(!1)},[l]),u=l&&r,v=l||n;b=l?!0===e?c:e:c;var w=d.createElement(q,at({},f,{name:String(f.name)},g,{isActive:u,option:b,index:h,dataKey:i,animationElapsedTime:a.animationElapsedTime,isAnimating:a.isAnimating,isEntrance:a.isEntrance,onTransitionEnd:t}));return v?d.createElement(ag.g,{zIndex:ah.I.activeBar},d.createElement(am,{index:g.originalDataIndex},w)):w}function aB(a){var b=a.shape,c=a.baseProps,e=a.entry,f=a.index,g=a.dataKey;return d.createElement(q,at({},c,{name:String(c.name)},e,{isActive:!1,option:b,index:f,dataKey:g,animationElapsedTime:a.animationElapsedTime,isAnimating:a.isAnimating,isEntrance:a.isEntrance}))}function aC(a){var b,c=a.data,e=a.props,f=a.animationElapsedTime,g=a.isAnimating,h=a.isEntrance,i=null!=(b=(0,ad.uZ)(e))?b:{},j=i.id,k=aw(i,ap),m=e.shape,n=e.dataKey,o=e.activeBar,p=e.onMouseEnter,q=e.onClick,r=e.onMouseLeave,s=aw(e,aq),t=u(p,n,j),x=v(r),y=w(q,n,j);return c?d.createElement(d.Fragment,null,c.map((a,b)=>d.createElement(am,at({index:a.originalDataIndex,key:"rectangle-".concat(null==a?void 0:a.x,"-").concat(null==a?void 0:a.y,"-").concat(null==a?void 0:a.value,"-").concat(b),className:"recharts-bar-rectangle"},(0,l.XC)(s,a,b),{onMouseEnter:t(a,a.originalDataIndex),onMouseLeave:x(a,a.originalDataIndex),onClick:y(a,a.originalDataIndex)}),o?d.createElement(aA,{shape:m,activeBar:o,baseProps:k,entry:a,index:b,dataKey:n,animationElapsedTime:f,isAnimating:g,isEntrance:h}):d.createElement(aB,{shape:m,baseProps:k,entry:a,index:b,dataKey:n,animationElapsedTime:f,isAnimating:g,isEntrance:h})))):null}function aD(a){var b=a.props,c=a.previousRectanglesRef,e=b.data,g=b.isAnimationActive,i=b.animationBegin,j=b.animationDuration,k=b.animationEasing,l=b.animationInterpolateFn,m=b.layout,n=(0,ae.I)(b.onAnimationStart,b.onAnimationEnd),o=n.isAnimating,p=n.handleAnimationStart,q=n.handleAnimationEnd;return d.createElement(az,{showLabels:!o,rects:e},d.createElement(ae.U,{animationInput:e,animationIdPrefix:"recharts-bar-",items:e,previousItemsRef:c,isAnimationActive:g,animationBegin:i,animationDuration:j,animationEasing:k,onAnimationStart:p,onAnimationEnd:q,animationInterpolateFn:l,animationMatchBy:b.animationMatchBy,layout:m},(a,c,e)=>d.createElement(f.W,null,d.createElement(aC,{props:b,data:a,animationElapsedTime:c,isAnimating:o||c<1,isEntrance:e}))),d.createElement(h.qY,{label:b.label}),b.children)}function aE(a){var b=(0,d.useRef)(null);return d.createElement(aD,{previousRectanglesRef:b,props:a})}var aF=(a,b)=>{var c=Array.isArray(a.value)?a.value[1]:a.value;return{x:a.x,y:a.y,value:c,errorVal:(0,k.kr)(a,b)}};class aG extends d.PureComponent{render(){var a=this.props,b=a.hide,c=a.data,g=a.dataKey,h=a.className,i=a.xAxisId,j=a.yAxisId,k=a.needClip,l=a.background,m=a.id;if(b||null==c)return null;var n=(0,e.$)("recharts-bar",h);return d.createElement(f.W,{className:n,id:m},k&&d.createElement("defs",null,d.createElement(B.Q,{clipPathId:m,xAxisId:i,yAxisId:j})),d.createElement(f.W,{className:"recharts-bar-rectangles",clipPath:k?"url(#clipPath-".concat(m,")"):void 0},d.createElement(ay,{data:c,dataKey:g,background:l,allOtherBarProps:this.props}),d.createElement(aE,this.props)))}}var aH={activeBar:!1,animationBegin:0,animationDuration:400,animationEasing:"ease",animationInterpolateFn:(a,b,c)=>null==a?[]:1===b?a.flatMap(a=>"removed"===a.status?[]:[a.next]):a.flatMap(a=>{if("removed"===a.status)return"horizontal"===c?[av(av({},a.prev),{},{height:(0,i.GW)(a.prev.height,0,b),y:(0,i.GW)(a.prev.y,a.prev.y+a.prev.height,b)})]:[av(av({},a.prev),{},{width:(0,i.GW)(a.prev.width,0,b)})];if("matched"===a.status)return[av(av({},a.next),{},{x:(0,i.GW)(a.prev.x,a.next.x,b),y:(0,i.GW)(a.prev.y,a.next.y,b),width:(0,i.GW)(a.prev.width,a.next.width,b),height:(0,i.GW)(a.prev.height,a.next.height,b)})];var d=a.next;return"horizontal"===c?[av(av({},d),{},{height:(0,i.GW)(0,d.height,b),y:(0,i.GW)(d.stackedBarStart,d.y,b)})]:[av(av({},d),{},{width:(0,i.GW)(0,d.width,b),x:(0,i.GW)(d.stackedBarStart,d.x,b)})]}),animationMatchBy:af.Um,background:!1,hide:!1,isAnimationActive:"auto",label:!1,legendType:"rect",minPointSize:0,shape:p,xAxisId:0,yAxisId:0,zIndex:ah.I.bar};function aI(a){var b,c=a.xAxisId,e=a.yAxisId,f=a.hide,h=a.legendType,i=a.minPointSize,k=a.activeBar,l=a.animationBegin,m=a.animationDuration,n=a.animationEasing,o=a.isAnimationActive,p=(0,B.l)(c,e).needClip,q=(0,C.WX)(),r=(0,Z.r)(),t=(0,j.aS)(a.children,g.f),u=(0,s.G)(b=>Y(b,a.id,r,t));if("vertical"!==q&&"horizontal"!==q)return null;var v=null==u?void 0:u[0];return b=null==v||null==v.height||null==v.width?0:"vertical"===q?v.height/2:v.width/2,d.createElement(A,{xAxisId:c,yAxisId:e,data:u,dataPointFormatter:aF,errorBarOffset:b},d.createElement(aG,at({},a,{layout:q,needClip:p,data:u,xAxisId:c,yAxisId:e,hide:f,legendType:h,minPointSize:i,activeBar:k,animationBegin:l,animationDuration:m,animationEasing:n,isAnimationActive:o})))}function aJ(a){var b=a.layout,c=a.barSettings,d=c.dataKey,e=c.minPointSize,f=c.hasCustomShape,g=a.pos,h=a.bandSize,j=a.xAxis,l=a.yAxis,m=a.xAxisTicks,n=a.yAxisTicks,o=a.stackedData,p=a.displayedData,q=a.offset,s=a.cells,t=a.parentViewBox,u=a.dataStartIndex,v="horizontal"===b?l:j,w=o?v.scale.domain():null,x=(0,k.DW)({numericAxis:v}),y=v.scale.map(x);return p.map((a,c)=>{if(o){var p=o[c+u];if(null==p)return null;z=(0,k._f)(p,w)}else Array.isArray(z=(0,k.kr)(a,d))||(z=[x,z]);var v=r(e,0)(z[1],c);if("horizontal"===b){var z,A,B,C,D,E,F,G=l.scale.map(z[0]),H=l.scale.map(z[1]);if(null==G||null==H)return null;A=(0,k.y2)({axis:j,ticks:m,bandSize:h,offset:g.offset,entry:a,index:c}),B=null!=(F=null!=H?H:G)?F:void 0,C=g.size;var I=G-H;if(D=(0,i.M8)(I)?0:I,E={x:A,y:q.top,width:C,height:q.height},Math.abs(v)>0&&Math.abs(D)<Math.abs(v)){var J=(0,i.sA)(D||v)*(Math.abs(v)-Math.abs(D));B-=J,D+=J}}else{var K=j.scale.map(z[0]),L=j.scale.map(z[1]);if(null==K||null==L)return null;if(A=K,B=(0,k.y2)({axis:l,ticks:n,bandSize:h,offset:g.offset,entry:a,index:c}),C=L-K,D=g.size,E={x:q.left,y:B,width:q.width,height:D},Math.abs(v)>0&&Math.abs(C)<Math.abs(v)){var M=(0,i.sA)(C||v)*(Math.abs(v)-Math.abs(C));C+=M}}return null!=A&&null!=B&&null!=C&&null!=D&&(f||0!==C&&0!==D)?av(av({},a),{},{stackedBarStart:y,x:A,y:B,width:C,height:D,value:o?z:z[1],payload:a,background:E,tooltipPosition:{x:A+C/2,y:B+D/2},parentViewBox:t,originalDataIndex:c},s&&s[c]&&s[c].props):null}).filter(Boolean)}var aK=d.memo(function(a){var b,c,e=(0,aa.e)(a,aH),f=(b=e.stackId,null!=(c=(0,d.useContext)(al))?c.stackId:null!=b?(0,k.$8)(b):void 0),g=(0,Z.r)();return d.createElement(ab.x,{id:e.id,type:"bar"},a=>{var b,c,h,i;return d.createElement(d.Fragment,null,d.createElement(_.A,{legendPayload:(b=e.dataKey,c=e.name,h=e.fill,i=e.legendType,[{inactive:e.hide,dataKey:b,type:i,color:h,value:(0,k.uM)(c,b),payload:e}])}),d.createElement(ax,{dataKey:e.dataKey,stroke:e.stroke,strokeWidth:e.strokeWidth,fill:e.fill,name:e.name,hide:e.hide,unit:e.unit,formatter:e.formatter,tooltipType:e.tooltipType,id:a}),d.createElement(ac.p,{type:"bar",id:a,data:void 0,xAxisId:e.xAxisId,yAxisId:e.yAxisId,zAxisId:0,dataKey:e.dataKey,stackId:f,hide:e.hide,barSize:e.barSize,minPointSize:e.minPointSize,maxBarSize:e.maxBarSize,isPanorama:g,hasCustomShape:null!=e.shape&&e.shape!==p}),d.createElement(ag.g,{zIndex:e.zIndex},d.createElement(aI,at({},e,{id:a}))))})},ai.P);aK.displayName="Bar"},33503:(a,b,c)=>{c.d(b,{E:()=>h});var d=c(67484),e=c(53935),f=c(29967),g=["axis","item"],h=(0,d.forwardRef)((a,b)=>d.createElement(f.P,{chartName:"BarChart",defaultTooltipEventType:"axis",validateTooltipEventTypes:g,tooltipPayloadSearcher:e.uN,categoricalChartProps:a,ref:b}))},93237:(a,b,c)=>{c.d(b,{f:()=>d});var d=a=>null;d.displayName="Cell"}};
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[124],{10124:(e,t,s)=>{s.r(t),s.d(t,{default:()=>b});var o=s(95155),r=s(12115),a=s(14051),l=s.n(a),i=s(21742),d=s(90639),n=s(77496),c=s(32539),f=s(59656),p=s(97944),x=s(97779),u=s(84588);let m=[{value:"tokens",label:"Tokens"},{value:"requests",label:"Requests"},{value:"cost",label:"Cost"}],h={tokens:{dataKey:"tokens",color:"#6366f1",gradId:"gradTokens",formatter:e=>e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e||0),label:"Tokens"},requests:{dataKey:"requests",color:"#14b8a6",gradId:"gradRequests",formatter:e=>String(e||0),label:"Requests"},cost:{dataKey:"cost",color:"#f59e0b",gradId:"gradCost",formatter:e=>`$${(e||0).toFixed(4)}`,label:"Cost"}};function b({period:e="7d"}){let[t,s]=(0,r.useState)([]),[a,l]=(0,r.useState)(!0),[y,g]=(0,r.useState)("tokens"),k=(0,r.useCallback)(async()=>{l(!0);try{let t=await fetch(`/api/usage/chart?period=${e}`);if(t.ok){let e=await t.json();s(e)}}catch(e){console.error("Failed to fetch chart data:",e)}finally{l(!1)}},[e]);(0,r.useEffect)(()=>{k()},[k]);let j=h[y],v=t.some(e=>(e[j.dataKey]||0)>0);return(0,o.jsxs)(u.default,{className:"flex min-w-0 flex-col gap-3 p-3 sm:p-4",children:[(0,o.jsx)("div",{className:"grid w-full items-center gap-1 rounded-lg border border-border bg-bg-subtle p-1 sm:w-auto sm:self-start",style:{gridTemplateColumns:`repeat(${m.length}, minmax(0, 1fr))`},children:m.map(e=>(0,o.jsx)("button",{onClick:()=>g(e.value),className:`px-3 py-1 rounded-md text-sm font-medium transition-colors ${y===e.value?"bg-primary text-white shadow-sm":"text-text-muted hover:text-text hover:bg-bg-hover"}`,children:e.label},e.value))}),a?(0,o.jsx)("div",{className:"h-48 flex items-center justify-center text-text-muted text-sm",children:"Loading..."}):v?(0,o.jsx)(i.u,{width:"100%",height:220,children:(0,o.jsxs)(d.Q,{data:t,margin:{top:4,right:8,left:0,bottom:0},children:[(0,o.jsxs)("defs",{children:[(0,o.jsxs)("linearGradient",{id:"gradTokens",x1:"0",y1:"0",x2:"0",y2:"1",children:[(0,o.jsx)("stop",{offset:"5%",stopColor:"#6366f1",stopOpacity:.25}),(0,o.jsx)("stop",{offset:"95%",stopColor:"#6366f1",stopOpacity:0})]}),(0,o.jsxs)("linearGradient",{id:"gradRequests",x1:"0",y1:"0",x2:"0",y2:"1",children:[(0,o.jsx)("stop",{offset:"5%",stopColor:"#14b8a6",stopOpacity:.25}),(0,o.jsx)("stop",{offset:"95%",stopColor:"#14b8a6",stopOpacity:0})]}),(0,o.jsxs)("linearGradient",{id:"gradCost",x1:"0",y1:"0",x2:"0",y2:"1",children:[(0,o.jsx)("stop",{offset:"5%",stopColor:"#f59e0b",stopOpacity:.25}),(0,o.jsx)("stop",{offset:"95%",stopColor:"#f59e0b",stopOpacity:0})]})]}),(0,o.jsx)(n.d,{strokeDasharray:"3 3",strokeOpacity:.1}),(0,o.jsx)(c.W,{dataKey:"label",tick:{fontSize:10,fill:"currentColor",fillOpacity:.5},tickLine:!1,axisLine:!1,interval:"preserveStartEnd"}),(0,o.jsx)(f.h,{tick:{fontSize:10,fill:"currentColor",fillOpacity:.5},tickLine:!1,axisLine:!1,tickFormatter:j.formatter,width:50}),(0,o.jsx)(p.m,{contentStyle:{backgroundColor:"var(--color-bg)",border:"1px solid var(--color-border)",borderRadius:"8px",fontSize:"12px"},formatter:e=>[j.formatter(e),j.label]}),(0,o.jsx)(x.Gk,{type:"monotone",dataKey:j.dataKey,stroke:j.color,strokeWidth:2,fill:`url(#${j.gradId})`,dot:!1,activeDot:{r:4}})]})}):(0,o.jsx)("div",{className:"h-48 flex items-center justify-center text-text-muted text-sm",children:"No data for this period"})]})}b.propTypes={period:l().string}}}]);
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2435],{82435:(e,t,s)=>{s.r(t),s.d(t,{default:()=>g});var r=s(95155),i=s(12115),o=s(14051),n=s.n(o),a=s(21742),l=s(48035),d=s(77496),c=s(32539),x=s(59656),m=s(97944),u=s(45639),p=s(67389),h=s(84588);let b=["#6366f1","#14b8a6","#f59e0b","#ef4444","#8b5cf6","#06b6d4","#10b981","#f97316"],f=e=>e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e||0);function g({byProvider:e}){let[t,s]=(0,i.useState)("tokens"),o=(0,i.useMemo)(()=>e?Object.entries(e).map(([e,t])=>({name:e,tokens:(t.promptTokens||0)+(t.completionTokens||0),requests:t.requests||0})).filter(e=>e[t]>0).sort((e,s)=>s[t]-e[t]):[],[e,t]),n="tokens"===t?f:String,k="tokens"===t?"Tokens":"Requests";return(0,r.jsxs)(h.default,{className:"flex min-w-0 flex-col gap-3 p-3 sm:p-4",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,r.jsx)("span",{className:"text-sm font-semibold text-text-muted uppercase tracking-wide",children:"By Provider"}),(0,r.jsxs)("div",{className:"grid grid-cols-2 items-center gap-1 rounded-lg border border-border bg-bg-subtle p-1",children:[(0,r.jsx)("button",{onClick:()=>s("tokens"),className:`px-2.5 py-0.5 rounded-md text-xs font-medium transition-colors ${"tokens"===t?"bg-primary text-white shadow-sm":"text-text-muted hover:text-text hover:bg-bg-hover"}`,children:"Tokens"}),(0,r.jsx)("button",{onClick:()=>s("requests"),className:`px-2.5 py-0.5 rounded-md text-xs font-medium transition-colors ${"requests"===t?"bg-primary text-white shadow-sm":"text-text-muted hover:text-text hover:bg-bg-hover"}`,children:"Requests"})]})]}),o.length?(0,r.jsx)(a.u,{width:"100%",height:180,children:(0,r.jsxs)(l.E,{data:o,margin:{top:4,right:8,left:0,bottom:4},children:[(0,r.jsx)(d.d,{strokeDasharray:"3 3",strokeOpacity:.1,vertical:!1}),(0,r.jsx)(c.W,{dataKey:"name",tick:{fontSize:10,fill:"currentColor",fillOpacity:.6},tickLine:!1,axisLine:!1,interval:0,tickFormatter:e=>e.length>10?e.slice(0,10)+"…":e}),(0,r.jsx)(x.h,{tick:{fontSize:10,fill:"currentColor",fillOpacity:.5},tickLine:!1,axisLine:!1,tickFormatter:n,width:44}),(0,r.jsx)(m.m,{contentStyle:{backgroundColor:"var(--color-bg)",border:"1px solid var(--color-border)",borderRadius:"8px",fontSize:"12px"},formatter:e=>[n(e),k]}),(0,r.jsx)(u.yP,{dataKey:t,radius:[4,4,0,0],children:o.map((e,t)=>(0,r.jsx)(p.f,{fill:b[t%b.length],fillOpacity:.85},t))})]})}):(0,r.jsx)("div",{className:"h-44 flex items-center justify-center text-text-muted text-sm",children:"No provider usage yet"})]})}g.propTypes={byProvider:n().object}}}]);
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3521],{63521:(e,t,r)=>{r.r(t),r.d(t,{default:()=>g});var o=r(95155),s=r(12115),a=r(14051),i=r.n(a),n=r(81750),l=r(6793);r(53255);var d=r(88105),c=r(8247);function p({data:e}){let{label:t,color:r,imageUrl:a,textIcon:i,active:d}=e,[u,h]=(0,s.useState)(!1);return(0,o.jsxs)("div",{className:"flex items-center gap-2.5 px-4 py-2.5 rounded-lg border-2 transition-all duration-300 bg-bg",style:{borderColor:d?r:"var(--color-border)",boxShadow:d?`0 0 16px ${r}40`:"none",minWidth:"150px"},children:[(0,o.jsx)(n.h7,{type:"target",position:l.yX.Top,id:"top",className:"!bg-transparent !border-0 !w-0 !h-0"}),(0,o.jsx)(n.h7,{type:"target",position:l.yX.Bottom,id:"bottom",className:"!bg-transparent !border-0 !w-0 !h-0"}),(0,o.jsx)(n.h7,{type:"target",position:l.yX.Left,id:"left",className:"!bg-transparent !border-0 !w-0 !h-0"}),(0,o.jsx)(n.h7,{type:"target",position:l.yX.Right,id:"right",className:"!bg-transparent !border-0 !w-0 !h-0"}),(0,o.jsx)("div",{className:"w-8 h-8 rounded-md flex items-center justify-center shrink-0",style:{backgroundColor:`${r}15`},children:a&&!u?(0,o.jsx)("img",{src:a,alt:t,className:"w-6 h-6 rounded-sm object-contain",loading:"lazy",decoding:"async",onError:()=>{let e=a?.match(/^\/providers\/([^/]+)\.png$/i);e&&(0,c.Kw)(e[1]),h(!0)}}):(0,o.jsx)("span",{className:"text-sm font-bold",style:{color:r},children:i})}),(0,o.jsx)("span",{className:"text-base font-medium truncate",style:{color:d?r:"var(--color-text)"},children:t}),d&&(0,o.jsxs)("span",{className:"relative flex h-2 w-2 shrink-0",children:[(0,o.jsx)("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full opacity-75",style:{backgroundColor:r}}),(0,o.jsx)("span",{className:"relative inline-flex rounded-full h-2 w-2",style:{backgroundColor:r}})]})]})}function u({data:e}){let t=(e.activeCount||0)>0;return(0,o.jsxs)("div",{className:`relative z-[1] flex items-center justify-center px-5 py-3 rounded-xl border-2 min-w-[130px] ${t?"topology-router-core border-yellow-300 bg-gradient-to-br from-primary/30 via-yellow-400/20 to-cyan-400/25":"border-primary bg-primary/5 shadow-md"}`,children:[(0,o.jsx)(n.h7,{type:"source",position:l.yX.Top,id:"top",className:"!bg-transparent !border-0 !w-0 !h-0"}),(0,o.jsx)(n.h7,{type:"source",position:l.yX.Bottom,id:"bottom",className:"!bg-transparent !border-0 !w-0 !h-0"}),(0,o.jsx)(n.h7,{type:"source",position:l.yX.Left,id:"left",className:"!bg-transparent !border-0 !w-0 !h-0"}),(0,o.jsx)(n.h7,{type:"source",position:l.yX.Right,id:"right",className:"!bg-transparent !border-0 !w-0 !h-0"}),(0,o.jsx)("img",{src:"/favicon.svg",alt:"9Router",className:`w-6 h-6 mr-2 ${t?"topology-router-icon":""}`,loading:"lazy",decoding:"async"}),(0,o.jsx)("span",{className:`text-sm font-bold ${t?"topology-router-label text-yellow-300":"text-primary"}`,children:"9Router"}),e.activeCount>0&&(0,o.jsx)("span",{className:"ml-2 px-1.5 py-0.5 rounded-full bg-yellow-400 text-black text-xs font-bold topology-router-badge",children:e.activeCount})]})}function h({id:e,sourceX:t,sourceY:r,targetX:s,targetY:a,sourcePosition:i,targetPosition:d,style:c={},data:p}){let[u]=(0,l.Fp)({sourceX:t,sourceY:r,sourcePosition:i,targetX:s,targetY:a,targetPosition:d}),m=!!p?.active,f=c.stroke||"var(--color-border)",g=`topo-electric-${e}`;return m?(0,o.jsxs)("g",{className:"topology-edge-electric",children:[(0,o.jsx)("defs",{children:(0,o.jsxs)("filter",{id:g,x:"-40%",y:"-40%",width:"180%",height:"180%",children:[(0,o.jsx)("feTurbulence",{type:"fractalNoise",baseFrequency:"0.9",numOctaves:"2",seed:"2",result:"noise",children:(0,o.jsx)("animate",{attributeName:"baseFrequency",values:"0.8;1.4;0.8",dur:"0.25s",repeatCount:"indefinite"})}),(0,o.jsx)("feDisplacementMap",{in:"SourceGraphic",in2:"noise",scale:"3.5",xChannelSelector:"R",yChannelSelector:"G"})]})}),(0,o.jsx)("path",{d:u,fill:"none",stroke:"#22d3ee",strokeWidth:10,strokeOpacity:.35,strokeLinecap:"round",filter:`url(#${g})`,className:"topology-edge-halo"}),(0,o.jsx)("path",{d:u,fill:"none",stroke:"#4ade80",strokeWidth:5,strokeOpacity:.85,strokeLinecap:"round",filter:`url(#${g})`,className:"topology-edge-plasma"}),(0,o.jsx)(n.tE,{id:e,path:u,style:{stroke:"#f8fafc",strokeWidth:2.2,opacity:1},className:"topology-edge-kame"}),Array.from({length:6},(t,r)=>(0,o.jsx)("circle",{r:r%2==0?4:2.5,fill:r%3==0?"#fde047":r%3==1?"#67e8f9":"#fff",opacity:.95,style:{filter:"drop-shadow(0 0 4px #22d3ee)"},children:(0,o.jsx)("animateMotion",{dur:`${.4+.08*r}s`,repeatCount:"indefinite",path:u,begin:`${.09*r}s`})},`${e}-p-${r}`)),Array.from({length:5},(t,r)=>(0,o.jsxs)("circle",{r:1.8,fill:"#e0f2fe",opacity:0,children:[(0,o.jsx)("animate",{attributeName:"opacity",values:"0;1;0;0;1;0",dur:`${.35+r%3*.1}s`,begin:`${.07*r}s`,repeatCount:"indefinite"}),(0,o.jsx)("animateMotion",{dur:`${.28+.05*r}s`,repeatCount:"indefinite",path:u,begin:`${.11*r}s`})]},`${e}-s-${r}`))]}):(0,o.jsx)(n.tE,{id:e,path:u,style:{...c,stroke:f}})}p.propTypes={data:i().object.isRequired},u.propTypes={data:i().object.isRequired},h.propTypes={id:i().string,sourceX:i().number,sourceY:i().number,targetX:i().number,targetY:i().number,sourcePosition:i().string,targetPosition:i().string,style:i().object,data:i().object};let m={provider:p,router:u},f={topology:h};function g({providers:e=[],activeRequests:t=[],lastProvider:r="",errorProvider:a=""}){let i=(0,s.useMemo)(()=>t.map(e=>e.provider?.toLowerCase()).filter(Boolean).sort().join(","),[t]),l=r?.toLowerCase()||"",p=a?.toLowerCase()||"",u=(0,s.useMemo)(()=>new Set(i?i.split(","):[]),[i]),h=(0,s.useMemo)(()=>new Set(l?[l]:[]),[l]),b=(0,s.useMemo)(()=>new Set(p?[p]:[]),[p]),y=(0,s.useRef)({}),[x,v]=(0,s.useState)(0);(0,s.useEffect)(()=>{let e=y.current,t=Date.now();for(let r of u)e[r]||(e[r]=t);for(let t of Object.keys(e))u.has(t)||delete e[t]},[u]),(0,s.useEffect)(()=>{if(0===u.size)return;let e=setInterval(()=>v(e=>e+1),1e3);return()=>clearInterval(e)},[u]);let j=(0,s.useMemo)(()=>{let e=Date.now(),t=new Set;for(let r of u){let o=y.current[r];(!o||e-o<6e4)&&t.add(r)}return t},[u,x]),{nodes:w,edges:N}=(0,s.useMemo)(()=>(function(e,t,r,o){let s=e.length,a=Math.max(320,204*s/(2*Math.PI)),i=Math.max(200,.55*a);if(0===s)return{nodes:[{id:"router",type:"router",position:{x:0,y:0},data:{activeCount:0},draggable:!1}],edges:[]};let n=[],l=[];return n.push({id:"router",type:"router",position:{x:-60,y:-22},data:{activeCount:t.size},draggable:!1}),e.forEach((e,p)=>{var u,h;let m,f,g=(u=e.provider,d.Q2[u]||{color:"#6b7280",name:u}),b=t.has(e.provider?.toLowerCase()),y=!b&&r.has(e.provider?.toLowerCase()),x=!b&&o.has(e.provider?.toLowerCase()),v=`provider-${e.provider}`,j={label:(g.name!==e.provider?g.name:null)||e.nodeName||e.name||e.provider,color:g.color||"#6b7280",imageUrl:(h=e.provider,(0,c.HY)(h)),textIcon:g.textIcon||(e.provider||"?").slice(0,2).toUpperCase(),active:b},w=-Math.PI/2+2*Math.PI*p/s,N=a*Math.cos(w),k=i*Math.sin(w);Math.abs(w+Math.PI/2)<Math.PI/4||Math.abs(w-3*Math.PI/2)<Math.PI/4?(m="top",f="bottom"):Math.abs(w-Math.PI/2)<Math.PI/4?(m="bottom",f="top"):N>0?(m="right",f="left"):(m="left",f="right"),n.push({id:v,type:"provider",position:{x:N-90,y:k-15},data:j,draggable:!1}),l.push({id:`e-${v}`,type:"topology",source:"router",sourceHandle:m,target:v,targetHandle:f,animated:!1,data:{active:b},style:x?{stroke:"#ef4444",strokeWidth:2.5,opacity:.9}:b?{stroke:"#22d3ee",strokeWidth:3.5,opacity:1}:y?{stroke:"#f59e0b",strokeWidth:2,opacity:.7}:{stroke:"var(--color-border)",strokeWidth:1,opacity:.3}})}),{nodes:n,edges:l}})(e,j,h,b),[e,j,h,b]),k=(0,s.useMemo)(()=>e.map(e=>e.provider).sort().join(","),[e]),C=(0,s.useRef)(null),M=(0,s.useRef)(null),$={padding:.2,duration:200},I=(0,s.useCallback)(e=>{C.current=e,setTimeout(()=>e.fitView($),50)},[]);return(0,s.useEffect)(()=>{let e=M.current;if(!e)return;let t=new ResizeObserver(()=>{C.current&&C.current.fitView($)});return t.observe(e),()=>t.disconnect()},[]),(0,s.useEffect)(()=>{if(C.current){let e=setTimeout(()=>C.current.fitView($),50);return()=>clearTimeout(e)}},[w.length]),(0,o.jsx)("div",{ref:M,className:"h-[320px] w-full min-w-0 rounded-lg border border-border bg-bg-subtle/30 sm:h-[480px]",children:0===e.length?(0,o.jsx)("div",{className:"h-full flex items-center justify-center text-text-muted text-sm",children:"No providers connected"}):(0,o.jsx)(n.Gc,{nodes:w,edges:N,nodeTypes:m,edgeTypes:f,fitView:!0,fitViewOptions:$,minZoom:.1,maxZoom:2,onInit:I,proOptions:{hideAttribution:!0},panOnDrag:!0,zoomOnScroll:!0,zoomOnPinch:!0,zoomOnDoubleClick:!0,preventScrolling:!1,nodesDraggable:!1,nodesConnectable:!1,elementsSelectable:!1,children:(0,o.jsx)(n.H2,{showInteractive:!1,className:"react-flow-controls-custom"})},k)})}g.propTypes={providers:i().arrayOf(i().shape({id:i().string,provider:i().string,name:i().string})),activeRequests:i().arrayOf(i().shape({provider:i().string,model:i().string,account:i().string})),lastProvider:i().string,errorProvider:i().string}}}]);