@amir83nasr/10router 0.1.0 → 0.1.3

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 (590) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +4 -4
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/next-server.js.nft.json +1 -1
  5. package/.next/prerender-manifest.json +4 -4
  6. package/.next/required-server-files.json +5 -5
  7. package/.next/server/app/(dashboard)/dashboard/basic-chat/page.js +1 -1
  8. package/.next/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
  9. package/.next/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  10. package/.next/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js +2 -2
  11. package/.next/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
  12. package/.next/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  13. package/.next/server/app/(dashboard)/dashboard/cli-tools/page.js +1 -1
  14. package/.next/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  15. package/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  16. package/.next/server/app/(dashboard)/dashboard/combos/page.js +1 -1
  17. package/.next/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
  18. package/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  19. package/.next/server/app/(dashboard)/dashboard/console-log/page.js +1 -1
  20. package/.next/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
  21. package/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/(dashboard)/dashboard/endpoint/page.js +1 -1
  23. package/.next/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  24. package/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  25. package/.next/server/app/(dashboard)/dashboard/media-providers/systemone/[id]/page.js +2 -2
  26. package/.next/server/app/(dashboard)/dashboard/media-providers/systemone/[id]/page.js.nft.json +1 -1
  27. package/.next/server/app/(dashboard)/dashboard/media-providers/systemone/[id]/page_client-reference-manifest.js +1 -1
  28. package/.next/server/app/(dashboard)/dashboard/media-providers/systemone/page.js +1 -1
  29. package/.next/server/app/(dashboard)/dashboard/media-providers/systemone/page.js.nft.json +1 -1
  30. package/.next/server/app/(dashboard)/dashboard/media-providers/systemone/page_client-reference-manifest.js +1 -1
  31. package/.next/server/app/(dashboard)/dashboard/page.js +1 -1
  32. package/.next/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  33. package/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  34. package/.next/server/app/(dashboard)/dashboard/profile/page.js +1 -1
  35. package/.next/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
  36. package/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  37. package/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js +2 -2
  38. package/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
  39. package/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  40. package/.next/server/app/(dashboard)/dashboard/providers/new/page.js +1 -1
  41. package/.next/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
  42. package/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  43. package/.next/server/app/(dashboard)/dashboard/providers/page.js +1 -1
  44. package/.next/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
  45. package/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  46. package/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js +2 -2
  47. package/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
  48. package/.next/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  49. package/.next/server/app/(dashboard)/dashboard/pxpipe/page.js +1 -1
  50. package/.next/server/app/(dashboard)/dashboard/pxpipe/page.js.nft.json +1 -1
  51. package/.next/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -1
  52. package/.next/server/app/(dashboard)/dashboard/quota/page.js +1 -1
  53. package/.next/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
  54. package/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  55. package/.next/server/app/(dashboard)/dashboard/token-saver/page.js +1 -1
  56. package/.next/server/app/(dashboard)/dashboard/token-saver/page.js.nft.json +1 -1
  57. package/.next/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  58. package/.next/server/app/(dashboard)/dashboard/usage/page.js +1 -1
  59. package/.next/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
  60. package/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  61. package/.next/server/app/_global-error/page.js +2 -2
  62. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  63. package/.next/server/app/_global-error.html +1 -1
  64. package/.next/server/app/_global-error.rsc +1 -1
  65. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  66. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  67. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  68. package/.next/server/app/_not-found/page.js +1 -1
  69. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  70. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  71. package/.next/server/app/_not-found.html +1 -1
  72. package/.next/server/app/_not-found.rsc +7 -7
  73. package/.next/server/app/_not-found.segments/_full.segment.rsc +7 -7
  74. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +7 -7
  75. package/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -3
  76. package/.next/server/app/api/auth/login/route.js +1 -1
  77. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/auth/logout/route.js +1 -1
  79. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/auth/oidc/callback/route.js +1 -1
  81. package/.next/server/app/api/auth/oidc/callback/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/auth/oidc/start/route.js +1 -1
  83. package/.next/server/app/api/auth/oidc/start/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/auth/oidc/test/route.js +1 -1
  85. package/.next/server/app/api/auth/oidc/test/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/auth/reset-password/route.js +1 -1
  87. package/.next/server/app/api/auth/reset-password/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/auth/saml/acs/route.js +1 -1
  89. package/.next/server/app/api/auth/saml/acs/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/auth/saml/metadata/route.js +2 -2
  91. package/.next/server/app/api/auth/saml/metadata/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/auth/saml/start/route.js +2 -2
  93. package/.next/server/app/api/auth/saml/start/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/auth/saml/test/route.js +2 -2
  95. package/.next/server/app/api/auth/saml/test/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/auth/status/route.js +1 -1
  97. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/changelog/route.js +1 -1
  99. package/.next/server/app/api/changelog/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/cli-tools/all-statuses/route.js +1 -1
  101. package/.next/server/app/api/cli-tools/all-statuses/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/cli-tools/claude-settings/route.js +1 -1
  103. package/.next/server/app/api/cli-tools/claude-settings/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/cli-tools/codex-settings/route.js +2 -2
  105. package/.next/server/app/api/cli-tools/codex-settings/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/cli-tools/cowork-mcp-registry/route.js +1 -1
  107. package/.next/server/app/api/cli-tools/cowork-mcp-registry/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/cli-tools/cowork-mcp-tools/route.js +2 -2
  109. package/.next/server/app/api/cli-tools/cowork-mcp-tools/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/cli-tools/cowork-settings/route.js +1 -1
  111. package/.next/server/app/api/cli-tools/cowork-settings/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/cli-tools/dsh-settings/route.js +1 -1
  113. package/.next/server/app/api/cli-tools/dsh-settings/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/cli-tools/opencode-settings/route.js +1 -1
  115. package/.next/server/app/api/cli-tools/opencode-settings/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/combos/[id]/route.js +1 -1
  117. package/.next/server/app/api/combos/[id]/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/combos/route.js +1 -1
  119. package/.next/server/app/api/combos/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/headroom/extras/route.js +1 -1
  121. package/.next/server/app/api/headroom/extras/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/headroom/proxy/[...path]/route.js +1 -1
  123. package/.next/server/app/api/headroom/proxy/[...path]/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/headroom/restart/route.js +1 -1
  125. package/.next/server/app/api/headroom/restart/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/headroom/start/route.js +1 -1
  127. package/.next/server/app/api/headroom/start/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/headroom/status/route.js +1 -1
  129. package/.next/server/app/api/headroom/status/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/headroom/stop/route.js +1 -1
  131. package/.next/server/app/api/headroom/stop/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/health/route.js +1 -1
  133. package/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/init/route.js +1 -1
  135. package/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/keys/[id]/route.js +1 -1
  137. package/.next/server/app/api/keys/[id]/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/keys/route.js +1 -1
  139. package/.next/server/app/api/keys/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/locale/route.js +1 -1
  141. package/.next/server/app/api/locale/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/mcp/[plugin]/message/route.js +2 -2
  143. package/.next/server/app/api/mcp/[plugin]/message/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/mcp/[plugin]/sse/route.js +2 -2
  145. package/.next/server/app/api/mcp/[plugin]/sse/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/media-providers/tts/deepgram/voices/route.js +1 -1
  147. package/.next/server/app/api/media-providers/tts/deepgram/voices/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/media-providers/tts/elevenlabs/voices/route.js +1 -1
  149. package/.next/server/app/api/media-providers/tts/elevenlabs/voices/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/media-providers/tts/inworld/voices/route.js +1 -1
  151. package/.next/server/app/api/media-providers/tts/inworld/voices/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/media-providers/tts/minimax/voices/route.js +1 -1
  153. package/.next/server/app/api/media-providers/tts/minimax/voices/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/media-providers/tts/voices/route.js +1 -1
  155. package/.next/server/app/api/media-providers/tts/voices/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/models/alias/route.js +1 -1
  157. package/.next/server/app/api/models/alias/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/models/availability/route.js +1 -1
  159. package/.next/server/app/api/models/availability/route_client-reference-manifest.js +1 -1
  160. package/.next/server/app/api/models/catalog-sync/route.js +1 -1
  161. package/.next/server/app/api/models/catalog-sync/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/models/custom/route.js +1 -1
  163. package/.next/server/app/api/models/custom/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/models/disabled/route.js +1 -1
  165. package/.next/server/app/api/models/disabled/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/models/route.js +1 -1
  167. package/.next/server/app/api/models/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/models/test/route.js +1 -1
  169. package/.next/server/app/api/models/test/route_client-reference-manifest.js +1 -1
  170. package/.next/server/app/api/oauth/[provider]/[action]/route.js +1 -1
  171. package/.next/server/app/api/oauth/[provider]/[action]/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/api/oauth/codex/bulk-import/route.js +1 -1
  173. package/.next/server/app/api/oauth/codex/bulk-import/route_client-reference-manifest.js +1 -1
  174. package/.next/server/app/api/oauth/codex/import-token/route.js +1 -1
  175. package/.next/server/app/api/oauth/codex/import-token/route_client-reference-manifest.js +1 -1
  176. package/.next/server/app/api/oauth/cursor/auto-import/route.js +2 -2
  177. package/.next/server/app/api/oauth/cursor/auto-import/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/oauth/cursor/import/route.js +1 -1
  179. package/.next/server/app/api/oauth/cursor/import/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/api/oauth/gitlab/pat/route.js +1 -1
  181. package/.next/server/app/api/oauth/gitlab/pat/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/oauth/grok-cli/bulk-import/route.js +1 -1
  183. package/.next/server/app/api/oauth/grok-cli/bulk-import/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/oauth/iflow/cookie/route.js +1 -1
  185. package/.next/server/app/api/oauth/iflow/cookie/route_client-reference-manifest.js +1 -1
  186. package/.next/server/app/api/oauth/xiaomi-mimo/api-key/route.js +1 -1
  187. package/.next/server/app/api/oauth/xiaomi-mimo/api-key/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/oauth/xiaomi-mimo/auto-import/route.js +2 -2
  189. package/.next/server/app/api/oauth/xiaomi-mimo/auto-import/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/api/pricing/route.js +1 -1
  191. package/.next/server/app/api/pricing/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/api/provider-nodes/[id]/route.js +1 -1
  193. package/.next/server/app/api/provider-nodes/[id]/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/provider-nodes/route.js +1 -1
  195. package/.next/server/app/api/provider-nodes/route_client-reference-manifest.js +1 -1
  196. package/.next/server/app/api/provider-nodes/validate/route.js +1 -1
  197. package/.next/server/app/api/provider-nodes/validate/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/providers/[id]/models/route.js +1 -1
  199. package/.next/server/app/api/providers/[id]/models/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/providers/[id]/route.js +1 -1
  201. package/.next/server/app/api/providers/[id]/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/api/providers/[id]/test/route.js +1 -1
  203. package/.next/server/app/api/providers/[id]/test/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/api/providers/[id]/test-models/route.js +1 -1
  205. package/.next/server/app/api/providers/[id]/test-models/route_client-reference-manifest.js +1 -1
  206. package/.next/server/app/api/providers/client/route.js +1 -1
  207. package/.next/server/app/api/providers/client/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/providers/kilo/free-models/route.js +1 -1
  209. package/.next/server/app/api/providers/kilo/free-models/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/api/providers/route.js +1 -1
  211. package/.next/server/app/api/providers/route_client-reference-manifest.js +1 -1
  212. package/.next/server/app/api/providers/suggested-models/route.js +1 -1
  213. package/.next/server/app/api/providers/suggested-models/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/api/providers/test-batch/route.js +1 -1
  215. package/.next/server/app/api/providers/test-batch/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/api/providers/validate/route.js +1 -1
  217. package/.next/server/app/api/providers/validate/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/proxy-pools/[id]/route.js +1 -1
  219. package/.next/server/app/api/proxy-pools/[id]/route_client-reference-manifest.js +1 -1
  220. package/.next/server/app/api/proxy-pools/[id]/test/route.js +1 -1
  221. package/.next/server/app/api/proxy-pools/[id]/test/route_client-reference-manifest.js +1 -1
  222. package/.next/server/app/api/proxy-pools/cloudflare-deploy/route.js +1 -1
  223. package/.next/server/app/api/proxy-pools/cloudflare-deploy/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/proxy-pools/deno-deploy/route.js +2 -2
  225. package/.next/server/app/api/proxy-pools/deno-deploy/route_client-reference-manifest.js +1 -1
  226. package/.next/server/app/api/proxy-pools/route.js +1 -1
  227. package/.next/server/app/api/proxy-pools/route_client-reference-manifest.js +1 -1
  228. package/.next/server/app/api/proxy-pools/vercel-deploy/route.js +2 -2
  229. package/.next/server/app/api/proxy-pools/vercel-deploy/route_client-reference-manifest.js +1 -1
  230. package/.next/server/app/api/pxpipe/health/route.js +2 -2
  231. package/.next/server/app/api/pxpipe/health/route_client-reference-manifest.js +1 -1
  232. package/.next/server/app/api/pxpipe/install/route.js +1 -1
  233. package/.next/server/app/api/pxpipe/install/route_client-reference-manifest.js +1 -1
  234. package/.next/server/app/api/pxpipe/logs/route.js +1 -1
  235. package/.next/server/app/api/pxpipe/logs/route_client-reference-manifest.js +1 -1
  236. package/.next/server/app/api/pxpipe/restart/route.js +2 -2
  237. package/.next/server/app/api/pxpipe/restart/route_client-reference-manifest.js +1 -1
  238. package/.next/server/app/api/pxpipe/start/route.js +1 -1
  239. package/.next/server/app/api/pxpipe/start/route_client-reference-manifest.js +1 -1
  240. package/.next/server/app/api/pxpipe/stats/route.js +2 -2
  241. package/.next/server/app/api/pxpipe/stats/route_client-reference-manifest.js +1 -1
  242. package/.next/server/app/api/pxpipe/status/route.js +1 -1
  243. package/.next/server/app/api/pxpipe/status/route_client-reference-manifest.js +1 -1
  244. package/.next/server/app/api/pxpipe/stop/route.js +2 -2
  245. package/.next/server/app/api/pxpipe/stop/route_client-reference-manifest.js +1 -1
  246. package/.next/server/app/api/settings/database/route.js +1 -1
  247. package/.next/server/app/api/settings/database/route_client-reference-manifest.js +1 -1
  248. package/.next/server/app/api/settings/proxy-test/route.js +1 -1
  249. package/.next/server/app/api/settings/proxy-test/route_client-reference-manifest.js +1 -1
  250. package/.next/server/app/api/settings/require-login/route.js +1 -1
  251. package/.next/server/app/api/settings/require-login/route_client-reference-manifest.js +1 -1
  252. package/.next/server/app/api/settings/route.js +1 -1
  253. package/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  254. package/.next/server/app/api/shutdown/route.js +1 -1
  255. package/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  256. package/.next/server/app/api/tags/route.js +1 -1
  257. package/.next/server/app/api/tags/route_client-reference-manifest.js +1 -1
  258. package/.next/server/app/api/translator/console-logs/route.js +1 -1
  259. package/.next/server/app/api/translator/console-logs/route_client-reference-manifest.js +1 -1
  260. package/.next/server/app/api/translator/console-logs/stream/route.js +1 -1
  261. package/.next/server/app/api/translator/console-logs/stream/route_client-reference-manifest.js +1 -1
  262. package/.next/server/app/api/translator/load/route.js +1 -1
  263. package/.next/server/app/api/translator/load/route_client-reference-manifest.js +1 -1
  264. package/.next/server/app/api/translator/save/route.js +1 -1
  265. package/.next/server/app/api/translator/save/route_client-reference-manifest.js +1 -1
  266. package/.next/server/app/api/translator/send/route.js +1 -1
  267. package/.next/server/app/api/translator/send/route_client-reference-manifest.js +1 -1
  268. package/.next/server/app/api/translator/translate/route.js +1 -1
  269. package/.next/server/app/api/translator/translate/route_client-reference-manifest.js +1 -1
  270. package/.next/server/app/api/tunnel/disable/route.js +1 -1
  271. package/.next/server/app/api/tunnel/disable/route_client-reference-manifest.js +1 -1
  272. package/.next/server/app/api/tunnel/enable/route.js +1 -1
  273. package/.next/server/app/api/tunnel/enable/route_client-reference-manifest.js +1 -1
  274. package/.next/server/app/api/tunnel/status/route.js +1 -1
  275. package/.next/server/app/api/tunnel/status/route_client-reference-manifest.js +1 -1
  276. package/.next/server/app/api/tunnel/tailscale-check/route.js +1 -1
  277. package/.next/server/app/api/tunnel/tailscale-check/route_client-reference-manifest.js +1 -1
  278. package/.next/server/app/api/tunnel/tailscale-disable/route.js +1 -1
  279. package/.next/server/app/api/tunnel/tailscale-disable/route_client-reference-manifest.js +1 -1
  280. package/.next/server/app/api/tunnel/tailscale-enable/route.js +1 -1
  281. package/.next/server/app/api/tunnel/tailscale-enable/route_client-reference-manifest.js +1 -1
  282. package/.next/server/app/api/tunnel/tailscale-install/route.js +2 -2
  283. package/.next/server/app/api/tunnel/tailscale-install/route_client-reference-manifest.js +1 -1
  284. package/.next/server/app/api/usage/[connectionId]/codex-reset-credits/route.js +1 -1
  285. package/.next/server/app/api/usage/[connectionId]/codex-reset-credits/route_client-reference-manifest.js +1 -1
  286. package/.next/server/app/api/usage/[connectionId]/route.js +1 -1
  287. package/.next/server/app/api/usage/[connectionId]/route_client-reference-manifest.js +1 -1
  288. package/.next/server/app/api/usage/chart/route.js +1 -1
  289. package/.next/server/app/api/usage/chart/route_client-reference-manifest.js +1 -1
  290. package/.next/server/app/api/usage/history/route.js +1 -1
  291. package/.next/server/app/api/usage/history/route_client-reference-manifest.js +1 -1
  292. package/.next/server/app/api/usage/logs/route.js +1 -1
  293. package/.next/server/app/api/usage/logs/route_client-reference-manifest.js +1 -1
  294. package/.next/server/app/api/usage/providers/route.js +1 -1
  295. package/.next/server/app/api/usage/providers/route_client-reference-manifest.js +1 -1
  296. package/.next/server/app/api/usage/request-details/route.js +1 -1
  297. package/.next/server/app/api/usage/request-details/route_client-reference-manifest.js +1 -1
  298. package/.next/server/app/api/usage/request-logs/route.js +1 -1
  299. package/.next/server/app/api/usage/request-logs/route_client-reference-manifest.js +1 -1
  300. package/.next/server/app/api/usage/stats/route.js +1 -1
  301. package/.next/server/app/api/usage/stats/route_client-reference-manifest.js +1 -1
  302. package/.next/server/app/api/usage/stream/route.js +2 -2
  303. package/.next/server/app/api/usage/stream/route_client-reference-manifest.js +1 -1
  304. package/.next/server/app/api/v1/api/chat/route.js +1 -1
  305. package/.next/server/app/api/v1/api/chat/route_client-reference-manifest.js +1 -1
  306. package/.next/server/app/api/v1/audio/speech/route.js +1 -1
  307. package/.next/server/app/api/v1/audio/speech/route_client-reference-manifest.js +1 -1
  308. package/.next/server/app/api/v1/audio/transcriptions/route.js +1 -1
  309. package/.next/server/app/api/v1/audio/transcriptions/route_client-reference-manifest.js +1 -1
  310. package/.next/server/app/api/v1/audio/voices/route.js +1 -1
  311. package/.next/server/app/api/v1/audio/voices/route_client-reference-manifest.js +1 -1
  312. package/.next/server/app/api/v1/chat/completions/route.js +1 -1
  313. package/.next/server/app/api/v1/chat/completions/route_client-reference-manifest.js +1 -1
  314. package/.next/server/app/api/v1/embeddings/route.js +1 -1
  315. package/.next/server/app/api/v1/embeddings/route_client-reference-manifest.js +1 -1
  316. package/.next/server/app/api/v1/images/generations/route.js +2 -2
  317. package/.next/server/app/api/v1/images/generations/route_client-reference-manifest.js +1 -1
  318. package/.next/server/app/api/v1/messages/count_tokens/route.js +1 -1
  319. package/.next/server/app/api/v1/messages/count_tokens/route_client-reference-manifest.js +1 -1
  320. package/.next/server/app/api/v1/messages/route.js +1 -1
  321. package/.next/server/app/api/v1/messages/route_client-reference-manifest.js +1 -1
  322. package/.next/server/app/api/v1/models/[...model]/route.js +1 -1
  323. package/.next/server/app/api/v1/models/[...model]/route_client-reference-manifest.js +1 -1
  324. package/.next/server/app/api/v1/models/info/route.js +1 -1
  325. package/.next/server/app/api/v1/models/info/route_client-reference-manifest.js +1 -1
  326. package/.next/server/app/api/v1/models/route.js +1 -1
  327. package/.next/server/app/api/v1/models/route_client-reference-manifest.js +1 -1
  328. package/.next/server/app/api/v1/responses/compact/route.js +1 -1
  329. package/.next/server/app/api/v1/responses/compact/route_client-reference-manifest.js +1 -1
  330. package/.next/server/app/api/v1/responses/route.js +1 -1
  331. package/.next/server/app/api/v1/responses/route_client-reference-manifest.js +1 -1
  332. package/.next/server/app/api/v1/route.js +1 -1
  333. package/.next/server/app/api/v1/route_client-reference-manifest.js +1 -1
  334. package/.next/server/app/api/v1/search/route.js +1 -1
  335. package/.next/server/app/api/v1/search/route_client-reference-manifest.js +1 -1
  336. package/.next/server/app/api/v1/systemone/route.js +1 -1
  337. package/.next/server/app/api/v1/systemone/route_client-reference-manifest.js +1 -1
  338. package/.next/server/app/api/v1/videos/[id]/route.js +1 -1
  339. package/.next/server/app/api/v1/videos/[id]/route_client-reference-manifest.js +1 -1
  340. package/.next/server/app/api/v1/videos/edits/route.js +1 -1
  341. package/.next/server/app/api/v1/videos/edits/route_client-reference-manifest.js +1 -1
  342. package/.next/server/app/api/v1/videos/extensions/route.js +1 -1
  343. package/.next/server/app/api/v1/videos/extensions/route_client-reference-manifest.js +1 -1
  344. package/.next/server/app/api/v1/videos/generations/route.js +1 -1
  345. package/.next/server/app/api/v1/videos/generations/route_client-reference-manifest.js +1 -1
  346. package/.next/server/app/api/v1/web/fetch/route.js +1 -1
  347. package/.next/server/app/api/v1/web/fetch/route_client-reference-manifest.js +1 -1
  348. package/.next/server/app/api/v1beta/models/[...path]/route.js +1 -1
  349. package/.next/server/app/api/v1beta/models/[...path]/route_client-reference-manifest.js +1 -1
  350. package/.next/server/app/api/v1beta/models/route.js +1 -1
  351. package/.next/server/app/api/v1beta/models/route_client-reference-manifest.js +1 -1
  352. package/.next/server/app/api/version/route.js +1 -1
  353. package/.next/server/app/api/version/route_client-reference-manifest.js +1 -1
  354. package/.next/server/app/api/version/shutdown/route.js +1 -1
  355. package/.next/server/app/api/version/shutdown/route_client-reference-manifest.js +1 -1
  356. package/.next/server/app/api/version/update/route.js +1 -1
  357. package/.next/server/app/api/version/update/route_client-reference-manifest.js +1 -1
  358. package/.next/server/app/callback/page.js +1 -1
  359. package/.next/server/app/callback/page.js.nft.json +1 -1
  360. package/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  361. package/.next/server/app/callback.html +1 -1
  362. package/.next/server/app/callback.rsc +8 -8
  363. package/.next/server/app/callback.segments/_full.segment.rsc +8 -8
  364. package/.next/server/app/callback.segments/_tree.segment.rsc +3 -3
  365. package/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +8 -8
  366. package/.next/server/app/dashboard/basic-chat.html +1 -1
  367. package/.next/server/app/dashboard/basic-chat.rsc +9 -9
  368. package/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +9 -9
  369. package/.next/server/app/dashboard/basic-chat.segments/_full.segment.rsc +9 -9
  370. package/.next/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +3 -3
  371. package/.next/server/app/dashboard/cli-tools.html +1 -1
  372. package/.next/server/app/dashboard/cli-tools.rsc +10 -10
  373. package/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +9 -9
  374. package/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +10 -10
  375. package/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +3 -3
  376. package/.next/server/app/dashboard/combos.html +1 -1
  377. package/.next/server/app/dashboard/combos.rsc +9 -9
  378. package/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +9 -9
  379. package/.next/server/app/dashboard/combos.segments/_full.segment.rsc +9 -9
  380. package/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +3 -3
  381. package/.next/server/app/dashboard/endpoint.html +1 -1
  382. package/.next/server/app/dashboard/endpoint.rsc +10 -10
  383. package/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +9 -9
  384. package/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +10 -10
  385. package/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +3 -3
  386. package/.next/server/app/dashboard/media-providers/systemone.html +1 -1
  387. package/.next/server/app/dashboard/media-providers/systemone.rsc +9 -9
  388. package/.next/server/app/dashboard/media-providers/systemone.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/systemone/__PAGE__.segment.rsc +9 -9
  389. package/.next/server/app/dashboard/media-providers/systemone.segments/_full.segment.rsc +9 -9
  390. package/.next/server/app/dashboard/media-providers/systemone.segments/_tree.segment.rsc +3 -3
  391. package/.next/server/app/dashboard/profile.html +1 -1
  392. package/.next/server/app/dashboard/profile.rsc +9 -9
  393. package/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +9 -9
  394. package/.next/server/app/dashboard/profile.segments/_full.segment.rsc +9 -9
  395. package/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +3 -3
  396. package/.next/server/app/dashboard/providers/new.html +1 -1
  397. package/.next/server/app/dashboard/providers/new.rsc +9 -9
  398. package/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +9 -9
  399. package/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +9 -9
  400. package/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +3 -3
  401. package/.next/server/app/dashboard/providers.html +1 -1
  402. package/.next/server/app/dashboard/providers.rsc +9 -9
  403. package/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +9 -9
  404. package/.next/server/app/dashboard/providers.segments/_full.segment.rsc +9 -9
  405. package/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +3 -3
  406. package/.next/server/app/dashboard/proxy-pools.html +1 -1
  407. package/.next/server/app/dashboard/proxy-pools.rsc +9 -9
  408. package/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +9 -9
  409. package/.next/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +9 -9
  410. package/.next/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +3 -3
  411. package/.next/server/app/dashboard/pxpipe.html +1 -1
  412. package/.next/server/app/dashboard/pxpipe.rsc +9 -9
  413. package/.next/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +9 -9
  414. package/.next/server/app/dashboard/pxpipe.segments/_full.segment.rsc +9 -9
  415. package/.next/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +3 -3
  416. package/.next/server/app/dashboard/quota.html +2 -2
  417. package/.next/server/app/dashboard/quota.rsc +10 -10
  418. package/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +10 -10
  419. package/.next/server/app/dashboard/quota.segments/_full.segment.rsc +10 -10
  420. package/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +3 -3
  421. package/.next/server/app/dashboard/settings/pricing/page.js +1 -1
  422. package/.next/server/app/dashboard/settings/pricing/page.js.nft.json +1 -1
  423. package/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  424. package/.next/server/app/dashboard/settings/pricing.html +1 -1
  425. package/.next/server/app/dashboard/settings/pricing.rsc +8 -8
  426. package/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +8 -8
  427. package/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +3 -3
  428. package/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +8 -8
  429. package/.next/server/app/dashboard/token-saver.html +1 -1
  430. package/.next/server/app/dashboard/token-saver.rsc +9 -9
  431. package/.next/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +9 -9
  432. package/.next/server/app/dashboard/token-saver.segments/_full.segment.rsc +9 -9
  433. package/.next/server/app/dashboard/token-saver.segments/_tree.segment.rsc +3 -3
  434. package/.next/server/app/dashboard/usage.html +2 -2
  435. package/.next/server/app/dashboard/usage.rsc +9 -9
  436. package/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +9 -9
  437. package/.next/server/app/dashboard/usage.segments/_full.segment.rsc +9 -9
  438. package/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +3 -3
  439. package/.next/server/app/dashboard.html +1 -1
  440. package/.next/server/app/dashboard.rsc +10 -10
  441. package/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +9 -9
  442. package/.next/server/app/dashboard.segments/_full.segment.rsc +10 -10
  443. package/.next/server/app/dashboard.segments/_tree.segment.rsc +3 -3
  444. package/.next/server/app/index.html +1 -1
  445. package/.next/server/app/index.rsc +7 -7
  446. package/.next/server/app/index.segments/__PAGE__.segment.rsc +7 -7
  447. package/.next/server/app/index.segments/_full.segment.rsc +7 -7
  448. package/.next/server/app/index.segments/_tree.segment.rsc +3 -3
  449. package/.next/server/app/landing/page.js +1 -1
  450. package/.next/server/app/landing/page.js.nft.json +1 -1
  451. package/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  452. package/.next/server/app/landing.html +1 -1
  453. package/.next/server/app/landing.rsc +8 -8
  454. package/.next/server/app/landing.segments/_full.segment.rsc +8 -8
  455. package/.next/server/app/landing.segments/_tree.segment.rsc +3 -3
  456. package/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +8 -8
  457. package/.next/server/app/login/page.js +1 -1
  458. package/.next/server/app/login/page.js.nft.json +1 -1
  459. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  460. package/.next/server/app/login.html +1 -1
  461. package/.next/server/app/login.rsc +8 -8
  462. package/.next/server/app/login.segments/_full.segment.rsc +8 -8
  463. package/.next/server/app/login.segments/_tree.segment.rsc +3 -3
  464. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +8 -8
  465. package/.next/server/app/manifest.webmanifest/route.js +1 -1
  466. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  467. package/.next/server/app/page.js +1 -1
  468. package/.next/server/app/page.js.nft.json +1 -1
  469. package/.next/server/app/page_client-reference-manifest.js +1 -1
  470. package/.next/server/app-paths-manifest.json +4 -4
  471. package/.next/server/chunks/1011.js +1 -1
  472. package/.next/server/chunks/1194.js +1 -1
  473. package/.next/server/chunks/1289.js +1 -0
  474. package/.next/server/chunks/1633.js +1 -1
  475. package/.next/server/chunks/1985.js +1 -1
  476. package/.next/server/chunks/2282.js +2 -2
  477. package/.next/server/chunks/2339.js +1 -1
  478. package/.next/server/chunks/2801.js +1 -0
  479. package/.next/server/chunks/3425.js +1 -1
  480. package/.next/server/chunks/4129.js +1 -1
  481. package/.next/server/chunks/5351.js +67 -0
  482. package/.next/server/chunks/537.js +1 -1
  483. package/.next/server/chunks/6056.js +1 -1
  484. package/.next/server/chunks/{3336.js → 7348.js} +1 -1
  485. package/.next/server/chunks/7459.js +9 -9
  486. package/.next/server/chunks/7816.js +1 -1
  487. package/.next/server/chunks/7963.js +5 -5
  488. package/.next/server/chunks/8569.js +1 -1
  489. package/.next/server/chunks/9429.js +1 -1
  490. package/.next/server/middleware-build-manifest.js +1 -1
  491. package/.next/server/middleware.js +3 -3
  492. package/.next/server/next-font-manifest.js +1 -1
  493. package/.next/server/next-font-manifest.json +1 -1
  494. package/.next/server/pages/404.html +1 -1
  495. package/.next/server/pages/500.html +1 -1
  496. package/.next/server/server-reference-manifest.js +1 -1
  497. package/.next/server/server-reference-manifest.json +1 -1
  498. package/.next/static/chunks/1278-1326946dbcc0adb5.js +1 -0
  499. package/.next/static/chunks/{159-17737a7c99ff1a65.js → 159-c129d43e789e7018.js} +1 -1
  500. package/.next/static/chunks/1699-13ee6864a8a31a96.js +67 -0
  501. package/.next/static/chunks/208-521a3242b62d6c07.js +1 -0
  502. package/.next/static/chunks/{9590-0d0b3dd0530b2b7b.js → 2836-38406d658ad8caa9.js} +1 -1
  503. package/.next/static/chunks/{7287-b8e377303d1c5ae8.js → 7287-8eca6570ca087e2e.js} +2 -2
  504. package/.next/static/chunks/app/(dashboard)/dashboard/basic-chat/page-ce1364b2b9589785.js +1 -0
  505. package/.next/static/chunks/app/(dashboard)/dashboard/cli-tools/[toolId]/{page-2ff675120416e925.js → page-93cc9fc8f8ab938b.js} +2 -2
  506. package/.next/static/chunks/app/(dashboard)/dashboard/cli-tools/page-1c54f83c69f02add.js +1 -0
  507. package/.next/static/chunks/app/(dashboard)/dashboard/combos/{page-55bc39e30923938a.js → page-853f4e08f4982dbe.js} +1 -1
  508. package/.next/static/chunks/app/(dashboard)/dashboard/console-log/page-0737ab5a4827fa77.js +1 -0
  509. package/.next/static/chunks/app/(dashboard)/dashboard/endpoint/page-13abc5b934c960d3.js +1 -0
  510. package/.next/static/chunks/app/(dashboard)/dashboard/media-providers/systemone/[id]/page-fb90d8451f40b8b3.js +10 -0
  511. package/.next/static/chunks/app/(dashboard)/dashboard/media-providers/systemone/page-49b3b4867d06cbe0.js +1 -0
  512. package/.next/static/chunks/app/(dashboard)/dashboard/page-85118ef708c624e6.js +1 -0
  513. package/.next/static/chunks/app/(dashboard)/dashboard/profile/{page-53158d30b5643b05.js → page-65b2c7989dbe2663.js} +1 -1
  514. package/.next/static/chunks/app/(dashboard)/dashboard/providers/[id]/{page-fd2615fea8932fd5.js → page-36659d3f8756c897.js} +2 -2
  515. package/.next/static/chunks/app/(dashboard)/dashboard/providers/new/page-1f54dc9be2c50aba.js +1 -0
  516. package/.next/static/chunks/app/(dashboard)/dashboard/providers/{page-7cc2c66e63fce4ab.js → page-b9dafab69096fa76.js} +1 -1
  517. package/.next/static/chunks/app/(dashboard)/dashboard/proxy-pools/{page-5e1fb41bd7b555a6.js → page-247f59d088891437.js} +2 -2
  518. package/.next/static/chunks/app/(dashboard)/dashboard/pxpipe/{page-1ec35dafa18e5d24.js → page-696cb5c2703ca1ec.js} +1 -1
  519. package/.next/static/chunks/app/(dashboard)/dashboard/quota/{page-11d5ca23d18d596e.js → page-5d2e8d9a126c2769.js} +1 -1
  520. package/.next/static/chunks/app/(dashboard)/dashboard/token-saver/page-bcc37fc2b4089f2f.js +1 -0
  521. package/.next/static/chunks/app/(dashboard)/dashboard/usage/page-cf503287fe99e910.js +1 -0
  522. package/.next/static/chunks/app/(dashboard)/{layout-e1e5bead272b5c82.js → layout-667f17706a5e1896.js} +1 -1
  523. package/.next/static/chunks/app/_not-found/{page-d66f1e17185e98d1.js → page-fe54ae510d932bb2.js} +1 -1
  524. package/.next/static/chunks/app/callback/{page-f4019bfc06b9a21c.js → page-f714c2306a1e9004.js} +1 -1
  525. package/.next/static/chunks/app/dashboard/settings/pricing/page-86197107690a0580.js +1 -0
  526. package/.next/static/chunks/app/landing/page-7a83d1be493ddc8c.js +1 -0
  527. package/.next/static/chunks/app/layout-06e49e3bcc852dbd.js +1 -0
  528. package/.next/static/chunks/app/login/page-7a4c84e8310a0487.js +1 -0
  529. package/.next/static/chunks/main-app-2ecba5da1d59188c.js +1 -0
  530. package/.next/static/chunks/next/dist/client/components/builtin/global-error-f9ac464a7c99aea5.js +1 -0
  531. package/.next/static/css/{e9178fa7e53ec623.css → 5843ba28152e85f8.css} +1 -1
  532. package/.next/static/css/7698ede81d1862e2.css +1 -0
  533. package/bin/10router.mjs +73 -70
  534. package/bin/update-check.mjs +93 -0
  535. package/custom-server.js +6 -36
  536. package/next.config.mjs +1 -1
  537. package/open-sse/executors/opencode-go.js +2 -0
  538. package/open-sse/executors/opencode-zen.js +12 -4
  539. package/open-sse/executors/opencode.js +31 -8
  540. package/open-sse/handlers/systemoneCore.js +4 -2
  541. package/open-sse/providers/registry/opencode-zen.js +2 -2
  542. package/open-sse/providers/registry/opencode.js +3 -3
  543. package/open-sse/translator/request/openai-to-claude.js +4 -1
  544. package/package.json +5 -22
  545. package/src/app/(dashboard)/dashboard/console-log/ConsoleLogClient.tsx +20 -6
  546. package/src/app/api/providers/[id]/test/testUtils.js +1 -1
  547. package/src/app/api/proxy-pools/[id]/test/route.js +1 -2
  548. package/src/lib/consoleLogBuffer.js +2 -1
  549. package/src/shared/components/AddCustomEmbeddingModal.tsx +0 -14
  550. package/src/shared/components/ChangelogModal.tsx +0 -6
  551. package/src/shared/components/CursorAuthModal.tsx +0 -7
  552. package/src/shared/components/EditConnectionModal.tsx +0 -22
  553. package/src/shared/components/GitLabAuthModal.tsx +0 -8
  554. package/src/shared/components/Header.tsx +0 -6
  555. package/src/shared/components/HeaderMenu.tsx +0 -5
  556. package/src/shared/components/IFlowCookieModal.tsx +0 -7
  557. package/src/shared/components/ModelSelectModal.tsx +0 -19
  558. package/src/shared/components/NoAuthProxyCard.tsx +0 -5
  559. package/src/shared/components/OAuthModal.tsx +0 -11
  560. package/src/shared/components/ProviderIcon.tsx +0 -11
  561. package/src/shared/components/XiaomiMimoAuthModal.tsx +0 -7
  562. package/src/shared/utils/cn.ts +3 -4
  563. package/src/sse/utils/logger.ts +62 -13
  564. package/.next/server/chunks/1157.js +0 -1
  565. package/.next/server/chunks/257.js +0 -67
  566. package/.next/server/chunks/3533.js +0 -1
  567. package/.next/static/chunks/1278-d7d5375869132de1.js +0 -1
  568. package/.next/static/chunks/208-fcb6c54f9db5664f.js +0 -1
  569. package/.next/static/chunks/3153-fde052e626cc6d40.js +0 -67
  570. package/.next/static/chunks/6817-449f7a2452845c74.js +0 -1
  571. package/.next/static/chunks/app/(dashboard)/dashboard/basic-chat/page-c074ab1b76a6c8ba.js +0 -1
  572. package/.next/static/chunks/app/(dashboard)/dashboard/cli-tools/page-654e770c4dca90e8.js +0 -1
  573. package/.next/static/chunks/app/(dashboard)/dashboard/console-log/page-aac9a9397d3f7f17.js +0 -1
  574. package/.next/static/chunks/app/(dashboard)/dashboard/endpoint/page-d60651b77028b014.js +0 -1
  575. package/.next/static/chunks/app/(dashboard)/dashboard/media-providers/systemone/[id]/page-3d78f5834ef97b82.js +0 -10
  576. package/.next/static/chunks/app/(dashboard)/dashboard/media-providers/systemone/page-e41bf53886195393.js +0 -1
  577. package/.next/static/chunks/app/(dashboard)/dashboard/page-670583d9f9c104af.js +0 -1
  578. package/.next/static/chunks/app/(dashboard)/dashboard/providers/new/page-7c9e30c4985582a6.js +0 -1
  579. package/.next/static/chunks/app/(dashboard)/dashboard/token-saver/page-388b616d8c2aa3fc.js +0 -1
  580. package/.next/static/chunks/app/(dashboard)/dashboard/usage/page-466f7a8f7319ad85.js +0 -1
  581. package/.next/static/chunks/app/dashboard/settings/pricing/page-b9ee16bd322c018e.js +0 -1
  582. package/.next/static/chunks/app/landing/page-a088604744d51552.js +0 -1
  583. package/.next/static/chunks/app/layout-56cb8d3773a70c00.js +0 -1
  584. package/.next/static/chunks/app/login/page-dd11fb741ed7fda4.js +0 -1
  585. package/.next/static/chunks/main-app-17abdf14ff64ab69.js +0 -1
  586. package/.next/static/chunks/next/dist/client/components/builtin/global-error-21486667022bd4cf.js +0 -1
  587. package/.next/static/css/8fbebca0759ae504.css +0 -1
  588. package/scripts/dev-local.mjs +0 -67
  589. /package/.next/static/{AiSMDHTT8m1mHG-uAmkFq → 3VUtJ57WoimjS256-MQ04}/_buildManifest.js +0 -0
  590. /package/.next/static/{AiSMDHTT8m1mHG-uAmkFq → 3VUtJ57WoimjS256-MQ04}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4465],{10145:(e,t,r)=>{Promise.resolve().then(r.bind(r,23928))},11461:e=>{var t;"u">typeof __nccwpck_require__&&(__nccwpck_require__.ab="//"),(t={}).endianness=function(){return"LE"},t.hostname=function(){return"u">typeof location?location.hostname:""},t.loadavg=function(){return[]},t.uptime=function(){return 0},t.freemem=function(){return Number.MAX_VALUE},t.totalmem=function(){return Number.MAX_VALUE},t.cpus=function(){return[]},t.type=function(){return"Browser"},t.release=function(){return"u">typeof navigator?navigator.appVersion:""},t.networkInterfaces=t.getNetworkInterfaces=function(){return{}},t.arch=function(){return"javascript"},t.platform=function(){return"browser"},t.tmpdir=t.tmpDir=function(){return"/tmp"},t.EOL="\n",t.homedir=function(){return"/"},e.exports=t},14748:(e,t,r)=>{"use strict";function a(){for(var e,t,r=0,a="",i=arguments.length;r<i;r++)(e=arguments[r])&&(t=function e(t){var r,a,i="";if("string"==typeof t||"number"==typeof t)i+=t;else if("object"==typeof t)if(Array.isArray(t)){var n=t.length;for(r=0;r<n;r++)t[r]&&(a=e(t[r]))&&(i&&(i+=" "),i+=a)}else for(a in t)t[a]&&(i&&(i+=" "),i+=a);return i}(e))&&(a&&(a+=" "),a+=t);return a}r.d(t,{$:()=>a})},18055:(e,t,r)=>{"use strict";r.d(t,{$:()=>l});var a=r(29798);r(15814);var i=r(54366),n=r(5471),s=r(80954);let o=(0,i.F)("group/button inline-flex shrink-0 items-center justify-center rounded-md border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/80",outline:"border-border bg-background shadow-xs hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 gap-1.5 px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),8px)] px-2 text-xs in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-8 gap-1 rounded-[min(var(--radius-md),10px)] px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5",lg:"h-10 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-9","icon-xs":"size-6 rounded-[min(var(--radius-md),8px)] in-data-[slot=button-group]:rounded-md [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md","icon-lg":"size-10"}},defaultVariants:{variant:"default",size:"default"}});function l({className:e,variant:t="default",size:r="default",asChild:i=!1,...d}){let c=i?s.bL:"button";return(0,a.jsx)(c,{"data-slot":"button","data-variant":t,"data-size":r,className:(0,n.cn)(o({variant:t,size:r,className:e})),...d})}},23928:(e,t,r)=>{"use strict";r.d(t,{default:()=>b});var a=r(29798),i=r(58913),n=r(15814),s=r(53784),o=r(18055),l=r(80159),d=r(13794);let c="basic-chat.sessions",u="basic-chat.activeSessionId",m="basic-chat.activeProviderId",p="basic-chat.draft";function h(){return globalThis.crypto?.randomUUID?globalThis.crypto.randomUUID():`chat_${Date.now()}_${Math.random().toString(16).slice(2)}`}function f(e){if("string"==typeof e)return e;if(null==e)return"";if(Array.isArray(e))return e.map(f).filter(Boolean).join(" ");if("object"==typeof e){if("string"==typeof e.message)return e.message;if("string"==typeof e.error)return e.error;try{return JSON.stringify(e)}catch{}}return String(e)}function x(e=""){let t=f(e).replace(/\s+/g," ").trim();return t?t.length>52?`${t.slice(0,52).trimEnd()}…`:t:"New chat"}async function g(e){return await new Promise((t,r)=>{let a=new FileReader;a.onload=()=>t(String(a.result||"")),a.onerror=()=>r(a.error||Error("Failed to read file")),a.readAsDataURL(e)})}function v(e){return e?.name||function(e=""){return String(e).replace(/[-_]/g," ").replace(/\b\w/g,e=>e.toUpperCase()).trim()||"Unknown"}(e?.provider||e?.id||"provider")}function b(){let[e,t]=(0,n.useState)([]),[r,b]=(0,n.useState)(!0),[w,y]=(0,n.useState)(""),[N,j]=(0,n.useState)(()=>{try{let e=function(e,t){try{return JSON.parse(e)}catch{return t}}(globalThis.localStorage.getItem(c),[]);return Array.isArray(e)?e.map(e=>({...e,messages:Array.isArray(e.messages)?e.messages:[]})):[]}catch{return[]}}),[_,k]=(0,n.useState)(()=>globalThis.localStorage.getItem(u)||""),[S,C]=(0,n.useState)(()=>globalThis.localStorage.getItem(m)||""),[A,I]=(0,n.useState)(""),[O,M]=(0,n.useState)(()=>globalThis.localStorage.getItem(p)||""),[D,E]=(0,n.useState)([]),[L,U]=(0,n.useState)(!1),[$,T]=(0,n.useState)(""),[z,R]=(0,n.useState)(""),[P,B]=(0,n.useState)(!1),[q,F]=(0,n.useState)(!1),[V,W]=(0,n.useState)(!1),X=(0,n.useRef)(null),H=(0,n.useRef)(null),J=(0,n.useRef)(!1),K=(0,n.useRef)(null),G=(0,n.useRef)(null);(0,n.useEffect)(()=>{B(!0)},[]),(0,n.useEffect)(()=>{let e=!1;return async function(){b(!0),y("");try{let r=await fetch("/api/providers",{cache:"no-store"}),a=await r.json().catch(()=>({})),i=Array.isArray(a.connections)?a.connections.filter(e=>e?.isActive!==!1):[];if(0===i.length){e||(t([]),y("No providers connected yet."));return}let n=new Map;for(let e of i){let t=e.provider||e.id,r=v(e),a=(0,d.mq)(t)?"openai-compatible":(0,d.gb)(t)?"anthropic-compatible":t;n.has(t)||n.set(t,{providerId:t,providerName:r,providerType:a,connections:[],models:[]});let i=n.get(t);i.providerName=i.providerName||r,i.providerType=i.providerType||a,i.connections.push(e);let s=(0,l.KC)(t).map(t=>t?.id?{id:`${e.provider}/${t.id}`,requestModel:`${e.provider}/${t.id}`,name:t.name||t.id,providerId:e.provider,providerName:v(e),source:"static"}:null).filter(Boolean);i.models.push(...s)}for(let e of(await Promise.all(i.map(async e=>{try{let t=await fetch(`/api/providers/${e.id}/models`,{cache:"no-store"}),r=await t.json().catch(()=>({}));if(!t.ok)return{connection:e,models:[]};let a=(Array.isArray(r?.models)?r.models:Array.isArray(r?.data)?r.data:Array.isArray(r?.results)?r.results:Array.isArray(r)?r:[]).map(t=>(function(e,t){let r="string"==typeof e?e:e?.id||e?.name||e?.model||"";if(!r)return null;let a="string"==typeof e?e:e?.name||e?.displayName||r,i=r;return((0,d.mq)(t.provider)||(0,d.gb)(t.provider))&&!r.includes("/")&&(i=`${t.provider}/${r}`),{id:i,requestModel:i,name:a,providerId:t.provider,providerName:v(t),source:"live"}})(t,e)).filter(Boolean);return{connection:e,models:a}}catch{return{connection:e,models:[]}}})))){let t=e.connection.provider||e.connection.id,r=n.get(t);r&&r.models.push(...e.models)}let s=Array.from(n.values()).map(e=>({...e,models:(function(e){let t=new Map;for(let r of e)r?.id&&(t.has(r.id)||t.set(r.id,r));return Array.from(t.values())})(e.models).sort((e,t)=>e.name.localeCompare(t.name))})).filter(e=>e.models.length>0).sort((e,t)=>e.providerName.localeCompare(t.providerName));e||(t(s),0===s.length&&y("Providers connected but no models available."))}catch(r){e||(y(f(r?.message)||"Failed to load providers/models."),t([]))}finally{e||b(!1)}}(),()=>{e=!0}},[]),(0,n.useEffect)(()=>{let e=e=>{K.current&&!K.current.contains(e.target)&&F(!1),G.current&&!G.current.contains(e.target)&&W(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[]);let Z=(0,n.useMemo)(()=>{let t=new Map;for(let r of e)for(let e of r.models)t.set(e.id,{...e,providerId:r.providerId,providerName:r.providerName});return t},[e]),Q=(0,n.useMemo)(()=>e.find(e=>e.providerId===S)||e[0]||null,[e,S]),Y=(0,n.useMemo)(()=>{if(A&&Z.has(A))return Z.get(A);if(_){let e=N.find(e=>e.id===_);if(e?.modelId&&Z.has(e.modelId))return Z.get(e.modelId)}return Q?.models?.[0]||null},[A,Z,Q,N,_]),ee=(0,n.useMemo)(()=>N.find(e=>e.id===_)||null,[N,_]),et=ee?.messages||[],er=(0,n.useMemo)(()=>[...N].sort((e,t)=>new Date(t.updatedAt).getTime()-new Date(e.updatedAt).getTime()),[N]),ea=!L&&!!Y&&(O.trim().length>0||D.length>0);(0,n.useEffect)(()=>{if(P)try{globalThis.localStorage.setItem(c,JSON.stringify(N)),globalThis.localStorage.setItem(u,_),globalThis.localStorage.setItem(m,S),globalThis.localStorage.setItem(p,O)}catch{}},[P,N,_,S,O]),(0,n.useEffect)(()=>{if(!P||r||J.current||0===e.length)return;let t=e.find(e=>e.providerId===S)||e[0],a=A&&Z.has(A)?Z.get(A):t.models[0];if(N.length>0){let e=N.find(e=>e.id===_)||N[0],r=e?.modelId&&Z.has(e.modelId)?Z.get(e.modelId):a;J.current=!0,k(e.id),C(r?.providerId||t.providerId),I(r?.id||a.id);return}let i={id:h(),title:"New chat",providerId:t.providerId,providerName:t.providerName,modelId:a.id,modelName:a.name,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),messages:[]};J.current=!0,j([i]),k(i.id),C(t.providerId),I(a.id)},[P,r,e,Z,N,_,S,A]);let ei=(e,t)=>{j(r=>r.map(r=>r.id===e?t({...r,messages:Array.isArray(r.messages)?r.messages.map(e=>({...e})):[]}):r))},en=e=>e?{id:h(),title:"New chat",providerId:e.providerId,providerName:e.providerName,modelId:e.id,modelName:e.name,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),messages:[]}:null,es=async e=>{let t=Array.from(e.target.files||[]);if(0===t.length)return;let r=t.filter(e=>e.type.startsWith("image/"));if(0===r.length){e.target.value="";return}let a=await Promise.all(r.map(async e=>({id:h(),name:e.name,type:e.type,size:e.size,dataUrl:await g(e)})));E(e=>[...e,...a]),e.target.value=""},eo=async()=>{let e=Y||Q?.models?.[0]||null;if(!e)return;let t=O.trim();if(!t&&0===D.length)return;let r=_,a=N.find(e=>e.id===r);if(!a){if(!(a=en(e)))return;r=a.id,j(e=>[a,...e]),k(r)}let i={id:h(),role:"user",content:t,attachments:D.map(e=>({id:e.id,name:e.name,type:e.type,dataUrl:e.dataUrl})),createdAt:new Date().toISOString()},n=h(),s={id:n,role:"assistant",content:"",createdAt:new Date().toISOString(),status:"streaming"},o=[...a.messages||[],i,s];j(a=>a.map(a=>a.id===r?{...a,providerId:e.providerId,providerName:e.providerName,modelId:e.id,modelName:e.name,messages:o,updatedAt:new Date().toISOString(),title:"New chat"===a.title?x(t):a.title}:a)),M(""),E([]),U(!0),T(n),R(""),H.current?.abort(),H.current=new AbortController;let l=o.filter(e=>"assistant"!==e.role||e.id!==n).map(e=>({role:e.role,content:"user"===e.role?function(e){let t=f(e.content).trim(),r=Array.isArray(e.attachments)?e.attachments:[];if(0===r.length)return t;let a=[];for(let e of(t&&a.push({type:"text",text:t}),r))e?.dataUrl&&a.push({type:"image_url",image_url:{url:e.dataUrl}});return a.length>0?a:t}(e):e.content}));try{var d;let a,i=await fetch("/api/dashboard/chat/completions",{method:"POST",headers:{"Content-Type":"application/json",Accept:"text/event-stream"},body:JSON.stringify({model:e.requestModel||e.id,messages:l,stream:!0}),signal:H.current.signal});if(!i.ok){let e=await i.json().catch(()=>({}));throw Error(f(e.error||e.message||`Request failed (${i.status})`))}let s=i.body?.getReader();if(!s){let e=await i.json().catch(()=>({})),t=f(e?.choices?.[0]?.message?.content||e?.output_text||e?.error||e?.message||"");ei(r,e=>({...e,messages:e.messages.map(e=>e.id===n?{...e,content:t,status:"done"}:e),updatedAt:new Date().toISOString()}));return}let o=new TextDecoder,c="",u="";for(;;){let{value:e,done:t}=await s.read();if(t)break;let a=(c+=o.decode(e,{stream:!0})).split(/\r?\n/);for(let e of(c=a.pop()||"",a)){let t=e.trim();if(!t.startsWith("data:"))continue;let a=t.slice(5).trim();if(a&&"[DONE]"!==a)try{let e=JSON.parse(a),t=function(e){if(!e||"object"!=typeof e)return"";let t=e.choices?.[0];return[(t?.delta||{}).content,t?.message?.content,e.output_text,e.text].map(f).filter(Boolean)[0]||""}(e);if(!t)continue;u+=t,R(u),ei(r,e=>({...e,messages:e.messages.map(e=>e.id===n?{...e,content:u,status:"streaming"}:e),updatedAt:new Date().toISOString()}))}catch{}}}ei(r,e=>({...e,messages:e.messages.map(e=>e.id===n?{...e,content:u||e.content,status:"done"}:e),updatedAt:new Date().toISOString()})),d=r,a=x(t),ei(d,e=>({...e,title:"New chat"===e.title?a:e.title,updatedAt:new Date().toISOString()}))}catch(e){if("AbortError"!==e.name){let t=f(e?.message||e);ei(r,e=>({...e,messages:e.messages.map(e=>e.id===n?{...e,content:e.content||`Error: ${t}`,status:"error"}:e),updatedAt:new Date().toISOString()})),y(t||"Failed to send message.")}}finally{U(!1),T(""),R(""),H.current=null}},el=Y?`${Y.name}`:"Select model",ed=Y?Y.requestModel:"Choose from connected providers";return(0,a.jsx)("div",{className:"relative flex-1 flex flex-col h-full min-h-0 min-w-0 bg-[#212121] text-white overflow-hidden",children:(0,a.jsxs)("div",{className:"relative mx-auto flex flex-1 h-full min-h-0 w-full max-w-4xl flex-col",children:[(0,a.jsxs)("div",{className:"flex shrink-0 items-center justify-between gap-3 px-4 py-3 lg:px-6",children:[(0,a.jsxs)("div",{ref:K,className:"relative",children:[(0,a.jsx)("button",{type:"button",onClick:()=>F(e=>!e),className:"flex items-center gap-3 rounded-2xl border border-white/10 bg-white/5 px-4 py-3 text-left transition hover:bg-white/8",children:(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"text-sm font-semibold text-white",children:el}),(0,a.jsx)(i.default,{name:"expand_more",className:"text-[18px] text-white/70"})]}),(0,a.jsx)("p",{className:"truncate text-xs text-white/55",children:ed})]})}),q?(0,a.jsxs)("div",{className:"absolute left-0 top-[calc(100%+10px)] z-30 w-[min(520px,calc(100vw-2rem))] overflow-hidden rounded-[20px] border border-white/10 bg-[#262626] shadow-2xl shadow-black/50",children:[(0,a.jsxs)("div",{className:"border-b border-white/10 px-4 py-3",children:[(0,a.jsx)("p",{className:"text-xs uppercase tracking-[0.22em] text-white/45",children:"Models"}),(0,a.jsx)("p",{className:"text-sm text-white/75",children:"Only from connected providers"})]}),(0,a.jsx)("div",{className:"max-h-[60vh] overflow-y-auto p-2",children:e.map(e=>(0,a.jsxs)("div",{className:"mb-2 rounded-[16px] border border-white/10 bg-black/20 p-2",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between px-2 py-2",children:[(0,a.jsx)("p",{className:"text-sm font-semibold text-white",children:e.providerName}),(0,a.jsx)(s.E,{children:e.models.length})]}),(0,a.jsx)("div",{className:"grid gap-2 sm:grid-cols-2",children:e.models.map(e=>{let t=e.id===A;return(0,a.jsx)("button",{type:"button",onClick:()=>(e=>{let t=Z.get(e);if(!t)return;let r=N.find(e=>e.id===_);if(r&&r.messages.length>0){let e=en(t);if(!e)return;j(t=>[e,...t]),k(e.id)}else if(r)j(e=>e.map(e=>e.id===r.id?{...e,providerId:t.providerId,providerName:t.providerName,modelId:t.id,modelName:t.name}:e)),k(r.id);else{let e=en(t);if(!e)return;j(t=>[e,...t]),k(e.id)}C(t.providerId),I(t.id),F(!1)})(e.id),className:`rounded-[14px] border px-3 py-3 text-left transition ${t?"border-blue-400/40 bg-blue-500/15":"border-white/10 bg-white/5 hover:bg-white/8"}`,children:(0,a.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsx)("p",{className:"truncate text-sm font-medium text-white",children:e.name}),(0,a.jsx)("p",{className:"truncate text-[11px] text-white/45",children:e.requestModel})]}),t?(0,a.jsx)(i.default,{name:"check_circle",className:"text-[18px] text-blue-300"}):null]})},e.id)})})]},e.providerId))})]}):null]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("button",{type:"button",onClick:()=>W(e=>!e),className:"rounded-2xl border border-white/10 bg-white/5 px-4 py-3 text-sm text-white/80 transition hover:bg-white/8",children:"History"}),(0,a.jsxs)(o.$,{variant:"ghost",size:"sm",onClick:()=>{if(!_)return;let e=N.filter(e=>e.id!==_),t=e[0]||null;j(e),t?(k(t.id),C(t.providerId),I(t.modelId)):(k(""),C(""),I(""))},disabled:!_||0===N.length,children:[(0,a.jsx)(i.default,{name:"delete"}),"Clear"]})]})]}),V?(0,a.jsxs)("div",{ref:G,className:"absolute right-4 top-[72px] z-20 w-[min(360px,calc(100vw-2rem))] rounded-[20px] border border-white/10 bg-[#262626] p-2 shadow-2xl shadow-black/50 lg:right-6",children:[(0,a.jsx)("div",{className:"px-3 py-2",children:(0,a.jsx)("p",{className:"text-xs uppercase tracking-[0.22em] text-white/45",children:"Recent chats"})}),(0,a.jsx)("div",{className:"max-h-[48vh] space-y-2 overflow-y-auto p-1",children:0===er.length?(0,a.jsx)("div",{className:"rounded-[16px] border border-dashed border-white/10 bg-white/5 p-4 text-sm text-white/55",children:"No conversations yet."}):er.map(e=>{let t=e.id===_,r=[...e.messages||[]].reverse().find(e=>"user"===e.role)||e.messages?.[0];return(0,a.jsx)("button",{type:"button",onClick:()=>{var t;let r;return t=e.id,void((r=N.find(e=>e.id===t))&&(k(t),C(r.providerId||S),I(r.modelId||A),W(!1)))},className:`w-full rounded-[16px] border px-3 py-3 text-left transition ${t?"border-blue-400/40 bg-blue-500/15":"border-white/10 bg-white/5 hover:bg-white/8"}`,children:(0,a.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,a.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,a.jsx)("p",{className:"truncate text-sm font-medium text-white",children:e.title}),(0,a.jsx)("p",{className:"mt-1 truncate text-xs text-white/50",children:f(r?.content)||"Empty chat"})]}),(0,a.jsx)("span",{className:"text-[10px] text-white/40 shrink-0",children:function(e){if(!e)return"Now";let t=new Date(e).getTime();if(Number.isNaN(t))return"Now";let r=Math.max(1,Math.round((Date.now()-t)/6e4));if(r<60)return`${r}m`;let a=Math.round(r/60);return a<24?`${a}h`:`${Math.round(a/24)}d`}(e.updatedAt)})]})},e.id)})})]}):null,w?(0,a.jsx)("div",{className:"mt-4 rounded-[18px] border border-rose-500/20 bg-rose-500/10 px-4 py-3 text-rose-100",children:(0,a.jsxs)("div",{className:"flex items-start gap-3",children:[(0,a.jsx)(i.default,{name:"error",className:"text-[20px]"}),(0,a.jsx)("p",{className:"text-sm leading-6",children:w})]})}):null,(0,a.jsxs)("div",{className:"flex flex-1 flex-col min-h-0",children:[(0,a.jsxs)("div",{className:"flex-1 overflow-y-auto py-4",children:[0===et.length?(0,a.jsx)("div",{className:"flex min-h-[50vh] items-center justify-center px-4 text-center",children:(0,a.jsxs)("div",{className:"max-w-xl space-y-4",children:[(0,a.jsx)("div",{className:"mx-auto flex size-16 items-center justify-center rounded-[20px] border border-white/10 bg-white/5 text-white/80",children:(0,a.jsx)(i.default,{name:"chat",className:"text-[30px]"})}),(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsx)("h2",{className:"text-2xl font-semibold text-white",children:"Start a conversation"}),(0,a.jsx)("p",{className:"text-sm leading-6 text-white/60",children:"Simple chat interface to interact with any AI model from connected providers. Select a model and start chatting!"})]})]})}):null,(0,a.jsx)("div",{className:"mx-auto flex w-full max-w-3xl flex-col gap-4 px-4",children:et.map(e=>{let t="user"===e.role,r="assistant"===e.role,i=r&&e.id===$&&"streaming"===e.status,n=f(e.content)||(r?z:"");return(0,a.jsx)("div",{className:`flex w-full ${t?"justify-end":"justify-start"} mb-6`,children:(0,a.jsxs)("div",{className:`max-w-[min(88%,42rem)] ${t?"rounded-3xl bg-[#2f2f2f] px-5 py-3.5 text-white":"text-white/90"}`,children:[(0,a.jsx)("div",{className:"mb-1 flex items-center justify-between gap-3",children:(0,a.jsx)("span",{className:"text-xs font-semibold",children:t?"You":Y?.name||"Assistant"})}),e.attachments?.length?(0,a.jsx)("div",{className:"mb-3 grid grid-cols-2 gap-2 sm:grid-cols-3 mt-2",children:e.attachments.map(e=>(0,a.jsx)("a",{href:e.dataUrl,target:"_blank",rel:"noreferrer",className:"overflow-hidden rounded-[18px] border border-white/10 bg-black/20",children:(0,a.jsx)("img",{src:e.dataUrl,alt:e.name,className:"h-28 w-full object-cover",loading:"lazy",decoding:"async"})},e.id))}):null,(0,a.jsxs)("div",{className:"whitespace-pre-wrap break-words text-[15px] leading-7",children:[n,r&&i&&!z?(0,a.jsx)("span",{className:"inline-block animate-pulse",children:"▋"}):null]})]})},e.id)})})]}),(0,a.jsxs)("div",{className:"shrink-0 pt-2",children:[D.length>0?(0,a.jsx)("div",{className:"mx-auto mb-3 flex w-full max-w-3xl flex-wrap gap-2 px-4",children:D.map(e=>(0,a.jsxs)("div",{className:"flex items-center gap-2 rounded-full border border-white/10 bg-white/5 px-3 py-2",children:[(0,a.jsx)("span",{className:"text-xs text-white/80 max-w-[12rem] truncate",children:e.name}),(0,a.jsx)("button",{type:"button",onClick:()=>{var t;return t=e.id,void E(e=>e.filter(e=>e.id!==t))},className:"text-white/55 hover:text-white","aria-label":"Remove attachment",children:(0,a.jsx)(i.default,{name:"close",className:"text-[18px]"})})]},e.id))}):null,(0,a.jsx)("div",{className:"mx-auto w-full max-w-3xl px-4 pb-2",children:(0,a.jsxs)("div",{className:"rounded-[26px] bg-[#2f2f2f] px-3 pt-3 pb-2 shadow-[0_0_15px_rgba(0,0,0,0.10)] ring-1 ring-white/5",children:[(0,a.jsx)("textarea",{value:O,onChange:e=>M(e.target.value),onKeyDown:e=>{"Enter"===e.key&&!e.shiftKey&&(e.preventDefault(),ea&&eo())},placeholder:"Message AI",rows:1,className:"w-full resize-none bg-transparent px-2 text-[15px] leading-6 text-white outline-none placeholder:text-white/40 max-h-[25vh] overflow-y-auto"}),(0,a.jsxs)("div",{className:"mt-2 flex items-center justify-between gap-3",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("button",{type:"button",onClick:()=>X.current?.click(),disabled:!Y||r,className:"p-2 text-white/50 hover:text-white transition rounded-full hover:bg-white/5",children:(0,a.jsx)(i.default,{name:"attach_file",className:"text-[20px]"})}),(0,a.jsx)("input",{ref:X,type:"file",accept:"image/*",multiple:!0,className:"hidden",onChange:es}),(0,a.jsx)("span",{className:"text-xs font-medium text-white/30 truncate max-w-[120px]",children:Y?Y.name:"No model"})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[L?(0,a.jsx)("button",{type:"button",onClick:()=>{H.current?.abort()},className:"p-2 text-white bg-white/10 hover:bg-white/20 transition rounded-full h-8 w-8 flex items-center justify-center",children:(0,a.jsx)(i.default,{name:"stop",className:"text-[16px]"})}):null,(0,a.jsx)("button",{onClick:eo,disabled:!ea,className:`h-8 w-8 rounded-full flex items-center justify-center transition ${ea?"bg-white text-black hover:opacity-90":"bg-white/10 text-white/30 cursor-not-allowed"}`,children:(0,a.jsx)(i.default,{name:"arrow_upward",className:"text-[16px]"})})]})]})]})})]}),(0,a.jsx)("p",{className:"mx-auto mt-2 max-w-3xl px-4 pb-4 text-center text-[11px] text-white/30",children:"Model list is filtered from connected providers."})]})]})})}},53784:(e,t,r)=>{"use strict";r.d(t,{E:()=>l});var a=r(29798);r(15814);var i=r(54366),n=r(5471),s=r(80954);let o=(0,i.F)("group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",secondary:"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",destructive:"bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20",outline:"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground",ghost:"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",link:"text-primary underline-offset-4 hover:underline"}},defaultVariants:{variant:"default"}});function l({className:e,variant:t="default",asChild:r=!1,...i}){let d=r?s.bL:"span";return(0,a.jsx)(d,{"data-slot":"badge","data-variant":t,className:(0,n.cn)(o({variant:t}),e),...i})}},54366:(e,t,r)=>{"use strict";r.d(t,{F:()=>s});var a=r(14748);let i=e=>"boolean"==typeof e?`${e}`:0===e?"0":e,n=a.$,s=(e,t)=>r=>{var a;if((null==t?void 0:t.variants)==null)return n(e,null==r?void 0:r.class,null==r?void 0:r.className);let{variants:s,defaultVariants:o}=t,l=Object.keys(s).map(e=>{let t=null==r?void 0:r[e],a=null==o?void 0:o[e];if(null===t)return null;let n=i(t)||i(a);return s[e][n]}),d=r&&Object.entries(r).reduce((e,t)=>{let[r,a]=t;return void 0===a||(e[r]=a),e},{});return n(e,l,null==t||null==(a=t.compoundVariants)?void 0:a.reduce((e,t)=>{let{class:r,className:a,...i}=t;return Object.entries(i).every(e=>{let[t,r]=e;return Array.isArray(r)?r.includes({...o,...d}[t]):({...o,...d})[t]===r})?[...e,r,a]:e},[]),null==r?void 0:r.class,null==r?void 0:r.className)}},58913:(e,t,r)=>{"use strict";r.d(t,{default:()=>l});var a=r(29798);r(15814);var i=r(36256);let n={add:"Plus",account_circle:"CircleUser",account_tree:"GitFork",api:"Plug",apps:"LayoutGrid",arrow_back:"ArrowLeft",arrow_downward:"ArrowDown",arrow_forward:"ArrowRight",arrow_upward:"ArrowUp",attach_file:"Paperclip",bar_chart:"BarChart3",block:"Ban",bolt:"Zap",business:"Briefcase",cancel:"X",cast:"Cast",chat:"MessageSquare",check:"Check",check_circle:"CheckCircle2",checklist:"ClipboardCheck",chevron_down:"ChevronDown",chevron_left:"ChevronLeft",chevron_right:"ChevronRight",chevron_up:"ChevronUp",close:"X",cloud:"Cloud",cloud_off:"CloudOff",cloud_sync:"CloudSync",cloud_upload:"CloudUpload",code:"Code2",computer:"Monitor",content_copy:"Copy",cookie:"Cookie",dashboard:"LayoutDashboard",data_array:"Table",data_object:"Braces",data_usage:"BarChart3",dark_mode:"Moon",delete:"Trash2",devices:"MonitorSmartphone",dns:"Network",download:"Download",edit:"Pencil",error:"CircleAlert",expand_more:"ChevronDown",extension:"Blocks",file_upload:"UploadCloud",filter_alt_off:"SlidersHorizontal",folder_open:"FolderOpen",gavel:"Scale",graphic_eq:"AudioWaveform",grid_view:"Grid2X2",group:"Users",help:"CircleHelp",history:"History",hourglass_top:"Timer",hub:"Router",image:"Image",image_search:"ScanSearch",info:"Info",input:"FileInput",key:"Key",keyboard_arrow_down:"ArrowDown",keyboard_arrow_up:"ArrowUp",lan:"Layers",language:"Languages",layers:"Layers",legend_toggle:"ListTree",light_mode:"Sun",link:"Link",link_off:"Link2Off",lock:"Lock",lock_open:"LockOpen",logout:"LogOut",menu:"Menu",menu_book:"BookOpen",mic:"Mic",monitoring:"Activity",monitor:"Monitor",movie:"Clapperboard",music_note:"Music",neurology:"Brain",open_in_new:"ExternalLink",output:"FileOutput",pause_circle:"CirclePause",person:"User",play_arrow:"Play",play_circle:"CirclePlay",playlist_add:"ListPlus",power:"Power",power_off:"PowerOff",power_settings_new:"Power",progress_activity:"Loader2",psychology:"BrainCircuit",public:"Earth",qr_code_scanner:"ScanQrCode",record_voice_over:"Mic",refresh:"RefreshCw",restart_alt:"RotateCcw",restore:"RotateCcw",rocket_launch:"Rocket",route:"Route",save:"Save",savings:"PiggyBank",scatter_plot:"ScatterChart",schedule:"Clock",science:"FlaskConical",search:"Search",search_off:"SearchX",security:"ShieldCheck",send:"Send",settings:"Settings",shield:"Shield",shield_lock:"ShieldCheck",shield_with_heart:"HeartPulse",smart_toy:"Bot",star:"Star",stop:"Square",stop_circle:"CircleStop",sync:"RefreshCw",sync_alt:"RefreshCw",terminal:"Terminal",toggle_off:"ToggleLeft",toggle_on:"ToggleRight",translate:"Languages",travel_explore:"Music4",upload:"Upload",upload_file:"UploadCloud",verified:"BadgeCheck",verified_user:"ShieldCheck",visibility:"Eye",visibility_off:"EyeOff",vpn_key:"KeyRound",vpn_lock:"Lock",warning:"TriangleAlert",wifi:"Wifi",wifi_off:"WifiOff",wifi_tethering:"Wifi"};function s(e){if("number"==typeof e&&Number.isFinite(e))return e;if("string"==typeof e){let t=e.trim().match(/^(\d+(?:\.\d+)?)px$/);if(t)return Number(t[1])}return null}function o({name:e="",className:t,style:r,...l}){let d=i[e]??i[n[e]||String(e).split(/[^a-zA-Z0-9]+/).filter(Boolean).map(e=>e[0].toUpperCase()+e.slice(1)).join("")]??i.Circle,c=function(e=""){let t=String(e).match(/\[(\d+(?:\.\d+)?)px\]/);return t?Number(t[1]):({"text-xs":12,"text-sm":14,"text-base":16,"text-lg":18,"text-xl":20,"text-2xl":24,"text-3xl":30,"text-4xl":36})[String(e).match(/\btext-(xs|sm|base|lg|xl|2xl|3xl|4xl)\b/)?.[0]]||null}(t)??(r&&"object"==typeof r?s(r.width)??s(r.height)??s(r.fontSize):null),u=c?{width:c,height:c}:void 0,m=String(t??"").replace(/\bmaterial-symbols-outlined\b/g,"").replace(/\bfill-1\b/g,"").replace(/\s+/g," ").trim();return(0,a.jsx)(d,{className:m,style:u?{...u,...r}:r,"aria-hidden":"true",...l})}function l({name:e,className:t,style:r}){return(0,a.jsx)(o,{name:e,className:t,style:r})}}},e=>{e.O(0,[6766,5166,1471,159,427,9966,7358],()=>e(e.s=10145)),_N_E=e.O()}]);
@@ -1,4 +1,4 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3554],{2032:(e,s,t)=>{Promise.resolve().then(t.bind(t,32063))},15764:(e,s,t)=>{"use strict";t.d(s,{CK:()=>i.default,G9:()=>m.default,Iz:()=>f.default,KX:()=>j.PanelSkeleton,LF:()=>a.default,LH:()=>x.default,Mu:()=>j.StatCardSkeleton,Nf:()=>d.default,Qv:()=>r.CardSkeleton,YW:()=>y.YW,gw:()=>g.default,jK:()=>c.default,nh:()=>b.default,pV:()=>y.pV,rq:()=>n.default,uR:()=>o.default,uo:()=>l.ConfirmModal,vE:()=>u.default,vj:()=>p.default,wI:()=>h.default,wn:()=>y.wn,zY:()=>y.zY}),t(58913);var l=t(3537),r=t(58350);t(30872),t(33526),t(42535),t(1279);var a=t(92802),n=t(25908),o=t(58729),i=t(24873),d=t(5258),c=t(4165);t(949),t(56776),t(53599),t(88336),t(69561);var m=t(37753),x=t(23444),u=t(93624),p=t(86920),h=t(65461);t(14580);var g=t(14670),f=t(70296);t(57779),t(22205);var j=t(43276),b=t(75862),y=t(92412)},32063:(e,s,t)=>{"use strict";t.d(s,{default:()=>en});var l=t(29798),r=t(58913),a=t(15814),n=t(50141),o=t.n(n),i=t(15764),d=t(18055),c=t(738),m=t(90046),x=t(80159),u=t(75669),p=t(45111),h=t(1352),g=t(69221),f=t(7896),j=t(16653),b=t(51660),y=t(77345);function v({storageKey:e,changeEvent:s,itemField:t,normalize:l=e=>e,defaultName:r=e=>e}){let a=()=>{try{let s=JSON.parse(window.localStorage.getItem(e)||"[]");if(!Array.isArray(s))return[];return s.filter(e=>e?.name&&e?.[t])}catch{return[]}},n=t=>{window.localStorage.setItem(e,JSON.stringify(t)),window.dispatchEvent(new CustomEvent(s))};return{read:a,subscribe:e=>(window.addEventListener(s,e),()=>window.removeEventListener(s,e)),upsert:(e,s)=>{let o=l(e);if(!o)return null;let i=a(),d=i.find(e=>l(e[t])===o);if(d&&!s)return d.name;let c=(s||r(o)).trim();return c?(n([...i.filter(e=>e.name!==c&&l(e[t])!==o),{name:c,[t]:o}].sort((e,s)=>e.name.localeCompare(s.name))),c):null},remove:e=>n(a().filter(s=>s.name!==e))}}let N=e=>(e||"").replace(/\/+$/,""),w=v({storageKey:"10router.cliToolEndpointPresets",changeEvent:"10router:endpoint-presets-changed",itemField:"baseUrl",normalize:N,defaultName:e=>{try{return new URL(e).host}catch{return e}}}),k=v({storageKey:"10router.cliToolApiKeyPresets",changeEvent:"10router:api-key-presets-changed",itemField:"key"}),C=w.read,_=w.subscribe,S=w.upsert,E=w.remove,A=k.read,$=k.subscribe,M=k.upsert,O=k.remove;function U(e,{tunnelPublicUrl:s,tailscaleUrl:t,cloudUrl:l}={}){let r=N(e);return!r||[`http://127.0.0.1:${b._$}`,s,t,l].filter(Boolean).flatMap(e=>[N(e),`${N(e)}/v1`]).includes(r)?null:S(r)}let P="__custom__",R="__save__",z=e=>{let s=(e||"").replace(/\/+$/,"");return s?/\/v1$/.test(s)?s:`${s}/v1`:""};function I({value:e,onChange:s,requiresExternalUrl:t=!1,tunnelEnabled:n=!1,tunnelPublicUrl:o="",tailscaleEnabled:i=!1,tailscaleUrl:d="",cloudEnabled:c=!1,cloudUrl:m="",withV1:x=!0,currentUrl:u=""}){let[g,f]=(0,a.useState)([]),[j,v]=(0,a.useState)(!1),[w,k]=(0,a.useState)(""),[A,$]=(0,a.useState)(""),M=(0,a.useRef)(!1),O=(0,a.useRef)("");(0,a.useEffect)(()=>{let e=()=>{let e=C();f(e),k(s=>{if(s!==P)return s;let t=N(O.current);if(!t)return s;let l=e.find(e=>{let s=N(e.baseUrl);return s===t||s===z(t)});return l?`saved:${l.name}`:s})};return e(),v(!0),_(e)},[]);let U=(0,a.useMemo)(()=>(({requiresExternalUrl:e,tunnelEnabled:s,tunnelPublicUrl:t,tailscaleEnabled:l,tailscaleUrl:r,cloudEnabled:a,cloudUrl:n,savedPresets:o,withV1:i})=>{let d=[],c=e=>i?z(e):(e||"").replace(/\/+$/,"");if(!e){let e=c(`http://127.0.0.1:${b._$}`);d.push({value:"local",label:e,url:e})}if(s&&t){let e=c(t);d.push({value:"tunnel",label:e,url:e})}if(l&&r){let e=c(r);d.push({value:"tailscale",label:e,url:e})}if(a&&n){let e=c(n);d.push({value:"cloud",label:e,url:e})}return o.forEach(e=>{d.push({value:`saved:${e.name}`,label:e.baseUrl,url:e.baseUrl,saved:!0})}),d.push({value:P,label:"Custom URL...",url:""}),d})({requiresExternalUrl:t,tunnelEnabled:n,tunnelPublicUrl:o,tailscaleEnabled:i,tailscaleUrl:d,cloudEnabled:c,cloudUrl:m,savedPresets:g,withV1:x}),[t,n,o,i,d,c,m,g,x]);(0,a.useEffect)(()=>{if(M.current||!j||0===U.length)return;M.current=!0;let e=N(u),t=(e?U.find(s=>s.saved&&N(s.url)===e):null)||U.find(e=>e.value!==P);t?(k(t.value),s(t.url)):k(P)},[j,U,s,u]);let T=w.startsWith("saved:"),L=w===P,K=L&&(A||"").trim().length>0;return(0,l.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[(0,l.jsxs)(p.l6,{value:w,onValueChange:t=>{if(t===R){let s=(e||"").trim();if(!s)return;let t=s;try{t=new URL(s).host}catch{}let l=window.prompt("Save endpoint as:",t),r=l?.trim()?S(s,l.trim()):null;r&&k(`saved:${r}`);return}if(k(t),t===P){$(""),s("");return}let l=U.find(e=>e.value===t);l&&s(l.url)},children:[(0,l.jsx)(p.bq,{className:"flex-1 min-w-0 text-xs",children:(0,l.jsx)(p.yv,{placeholder:"Select endpoint"})}),(0,l.jsxs)(p.gC,{children:[U.map(e=>(0,l.jsx)(p.eb,{value:e.value,title:e.label,children:e.label},e.value)),K&&(0,l.jsx)(p.eb,{value:R,children:"+ Save current as..."})]})]}),T&&(0,l.jsxs)(h.m_,{children:[(0,l.jsx)(h.k$,{asChild:!0,children:(0,l.jsx)("button",{type:"button",onClick:()=>{if(!w.startsWith("saved:"))return;E(w.slice(6)),$("");let e=U.find(e=>e.value!==P&&e.value!==w);e?(k(e.value),s(e.url)):(k(P),s(""))},className:"p-1 text-muted-foreground hover:text-red-500 rounded transition-colors shrink-0",children:(0,l.jsx)(r.default,{name:"delete",className:"text-[14px]"})})}),(0,l.jsx)(h.ZI,{children:"Delete saved endpoint"})]})]}),L&&(0,l.jsx)(y.p,{type:"text",value:A,onChange:e=>{let t=e.target.value;O.current=t,$(t),s(t)},placeholder:x?"https://example.com/v1":"https://example.com",className:"h-9 text-xs"})]})}let T="__custom__",L="__save_key__";function K({value:e,onChange:s,apiKeys:t=[],cloudEnabled:n=!1,className:o=""}){let[i,d]=(0,a.useState)([]),[c,m]=(0,a.useState)(!1),[x,u]=(0,a.useState)("");(0,a.useEffect)(()=>{let e=()=>d(A());return e(),$(e)},[]);let g=(0,a.useMemo)(()=>[...t.map(e=>({value:e.key,label:e.key})),...i.map(e=>({value:`saved:${e.name}`,label:e.key,url:e.key,saved:!0})),{value:T,label:"Custom...",url:""}],[t,i]),f=e?g.find(s=>s.value===e||s.url===e):null,j=f?f.value:c||e?T:g[0]?.value??T,b=c?x:e||"",v="string"==typeof j&&j.startsWith("saved:"),N=j===T,w=N&&(e||"").trim().length>0&&!t.some(s=>s.key===e);return 0!==t.length||0!==i.length||c||e?(0,l.jsxs)("div",{className:`flex flex-col gap-1.5 ${o}`,children:[(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[(0,l.jsxs)(p.l6,{value:j,onValueChange:t=>{if(t===L)return void M((e||"").trim());if(t===T){m(!0),u(""),s("");return}m(!1),u("");let l=g.find(e=>e.value===t);l&&s(l.url??l.value)},children:[(0,l.jsx)(p.bq,{className:"flex-1 min-w-0 text-xs",children:(0,l.jsx)(p.yv,{placeholder:"Select key"})}),(0,l.jsxs)(p.gC,{children:[g.map(e=>(0,l.jsx)(p.eb,{value:e.value,title:e.label,children:e.label},e.value)),w&&(0,l.jsx)(p.eb,{value:L,children:"+ Save current as..."})]})]}),v&&(0,l.jsxs)(h.m_,{children:[(0,l.jsx)(h.k$,{asChild:!0,children:(0,l.jsx)("button",{type:"button",onClick:()=>{if(!v)return;O(j.slice(6)),m(!1),u("");let e=g.find(e=>e.value!==T&&e.value!==j);s(e?e.url??e.value:"")},className:"p-1 text-muted-foreground hover:text-red-500 rounded transition-colors shrink-0",children:(0,l.jsx)(r.default,{name:"delete",className:"text-[14px]"})})}),(0,l.jsx)(h.ZI,{children:"Delete saved key"})]})]}),N&&(0,l.jsx)(y.p,{type:"text",value:b,onChange:e=>{let t=e.target.value;m(!0),u(t),s(t)},placeholder:"sk-...",className:"h-9 text-xs"})]}):(0,l.jsx)("span",{className:`min-w-0 rounded bg-card/40 px-2 py-2 text-xs text-muted-foreground sm:py-1.5 ${o}`,children:n?"No API keys - Create one in Keys page":"sk_10router (default)"})}let D=e=>(e||"").replace(/\/+$/,"");function W(e,s={}){if(!e)return!1;let t=D(e),{tunnelPublicUrl:l,tailscaleUrl:r,cloudUrl:a}=s;return!!(/localhost|127\.0\.0\.1|0\.0\.0\.0/.test(t)||l&&t.startsWith(D(l))||r&&t.startsWith(D(r))||a&&t.startsWith(D(a)))}let H=/\[1m\]$/i,F=t(65746).env.NEXT_PUBLIC_CLOUD_URL,q=[{label:"Default",value:""},{label:"200K",value:"198000"},{label:"300K",value:"298000"},{label:"500K",value:"498000"},{label:"700K",value:"698000"}];function B({tool:e,isExpanded:s,onToggle:t,activeProviders:n,modelMappings:o,onModelMappingChange:c,baseUrl:m,hasActiveProviders:x,apiKeys:b,cloudEnabled:y,initialStatus:v,tunnelEnabled:N,tunnelPublicUrl:w,tailscaleEnabled:k,tailscaleUrl:C}){let _,S,E,[A,$]=(0,a.useState)(v||null),[M,O]=(0,a.useState)(!1),[P,R]=(0,a.useState)(!1),[z,T]=(0,a.useState)(!1),[L,D]=(0,a.useState)(null),[Z,Y]=(0,a.useState)(!1),[J,V]=(0,a.useState)(!1),[G,X]=(0,a.useState)(null),[Q,ee]=(0,a.useState)(""),[es,et]=(0,a.useState)({}),[el,er]=(0,a.useState)(!1),[ea,en]=(0,a.useState)(""),[eo,ei]=(0,a.useState)(!1),[ed,ec]=(0,a.useState)(!1),[em,ex]=(0,a.useState)(""),[eu,ep]=(0,a.useState)(!1),eh=(0,a.useRef)(!1),eg=A?.settings?.env?.ANTHROPIC_BASE_URL||"",ef=(()=>{if(!A?.installed)return null;let e=A.settings?.env?.ANTHROPIC_BASE_URL;return e?W(e,{tunnelPublicUrl:w,tailscaleUrl:C,cloudUrl:y?F:null})?"configured":"other":"not_configured"})();(0,a.useEffect)(()=>{b?.length>0&&!Q&&ee(b[0].key)},[b,Q]),(0,a.useEffect)(()=>{v&&($(v),ec(!!v.exaMcpEnabled))},[v]),(0,a.useEffect)(()=>{ex(A?.settings?.env?.CLAUDE_CODE_AUTO_COMPACT_WINDOW||"")},[A?.settings?.env?.CLAUDE_CODE_AUTO_COMPACT_WINDOW]),(0,a.useEffect)(()=>{let s=A?.settings?.env;s&&ep(e.defaultModels.some(e=>s[e.envKey]?.endsWith("[1m]")))},[A?.settings?.env,e.defaultModels]),(0,a.useEffect)(()=>{s&&(A||ey(),eb())},[s]),(0,a.useEffect)(()=>{fetch("/api/settings").then(e=>e.json()).then(e=>{ei(!!e.ccFilterNaming)}).catch(()=>{})},[]);let ej=async e=>{let s=!0===e;ei(s),await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({ccFilterNaming:s})}).catch(()=>{})},eb=async()=>{try{let e=await fetch("/api/models/alias"),s=await e.json();e.ok&&et(s.aliases||{})}catch(e){console.log("Error fetching model aliases:",e)}};(0,a.useEffect)(()=>{if(A?.installed&&!eh.current){eh.current=!0;let s=A.settings?.env||{};e.defaultModels.forEach(e=>{if(e.envKey){let t=s[e.envKey]||e.defaultValue||"";t&&c(e.alias,t)}});let t=s.ANTHROPIC_AUTH_TOKEN;t&&ee(t)}},[A,b,e.defaultModels,c]);let ey=async()=>{O(!0);try{let e=await fetch("/api/cli-tools/claude-settings"),s=await e.json();$(s),ec(!!s.exaMcpEnabled)}catch(e){$({installed:!1,error:e.message})}finally{O(!1)}},ev=()=>{let e=ea||m;return e.endsWith("/v1")?e:`${e}/v1`},eN=async()=>{R(!0),D(null);try{let s={ANTHROPIC_BASE_URL:ev()},t=Q?.trim()||(b?.length>0?b[0].key:null)||(y?null:"sk_10router");t&&(s.ANTHROPIC_AUTH_TOKEN=t),e.defaultModels.forEach(e=>{let t=o[e.alias];t&&e.envKey&&(s[e.envKey]=t)}),em&&(s.CLAUDE_CODE_AUTO_COMPACT_WINDOW=em);let l=await fetch("/api/cli-tools/claude-settings",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({env:s,exaMcpEnabled:ed,autoCompactWindow:em})}),r=await l.json();l.ok?(U(ev(),{tunnelPublicUrl:w,tailscaleUrl:C}),D({type:"success",text:"Settings applied successfully!"}),$(e=>({...e,hasBackup:!0,settings:{...e?.settings,env:s},exaMcpEnabled:ed}))):D({type:"error",text:r.error||"Failed to apply settings"})}catch(e){D({type:"error",text:e.message})}finally{R(!1)}},ew=async()=>{T(!0),D(null);try{let s=await fetch("/api/cli-tools/claude-settings",{method:"DELETE"}),t=await s.json();s.ok?(D({type:"success",text:"Settings reset successfully!"}),e.defaultModels.forEach(e=>c(e.alias,e.defaultValue||"")),ee(""),ec(!1),ex(""),ep(!1)):D({type:"error",text:t.error||"Failed to reset settings"})}catch(e){D({type:"error",text:e.message})}finally{T(!1)}};return(0,l.jsx)(u.Zp,{size:"sm",className:"overflow-hidden",children:(0,l.jsxs)(u.Wu,{children:[(0,l.jsx)("div",{className:"flex items-start justify-between gap-3 hover:cursor-pointer sm:items-center",onClick:t,children:(0,l.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,l.jsx)("div",{className:"size-8 flex items-center justify-center shrink-0",children:(0,l.jsx)(j.default,{src:"/providers/claude.png",alt:e.name,width:32,height:32,className:"size-8 object-contain rounded-lg",sizes:"32px",onError:e=>{e.target.style.display="none"},loading:"lazy",decoding:"async"})}),(0,l.jsxs)("div",{className:"min-w-0",children:[(0,l.jsxs)("div",{className:"flex min-w-0 flex-wrap items-center gap-2",children:[(0,l.jsx)("h3",{className:"font-medium text-sm",children:e.name}),"configured"===ef&&(0,l.jsx)("span",{className:"px-1.5 py-0.5 text-[10px] font-medium bg-green-500/10 text-green-600 dark:text-green-400 rounded-full",children:"Connected"}),"not_configured"===ef&&(0,l.jsx)("span",{className:"px-1.5 py-0.5 text-[10px] font-medium bg-yellow-500/10 text-yellow-600 dark:text-yellow-400 rounded-full",children:"Not configured"}),"other"===ef&&(0,l.jsx)("span",{className:"px-1.5 py-0.5 text-[10px] font-medium bg-blue-500/10 text-blue-600 dark:text-blue-400 rounded-full",children:"Other"})]}),(0,l.jsx)("p",{className:"text-xs text-muted-foreground truncate",children:e.description})]})]})}),s&&(0,l.jsxs)("div",{className:"mt-4 pt-4 border-t border-border flex flex-col gap-4",children:[M&&(0,l.jsxs)("div",{className:"flex items-center gap-2 text-muted-foreground",children:[(0,l.jsx)(r.default,{name:"progress_activity",className:"animate-spin"}),(0,l.jsx)("span",{children:"Checking Claude CLI..."})]}),!M&&A&&!A.installed&&(0,l.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,l.jsxs)("div",{className:"flex flex-col gap-3 p-4 bg-yellow-500/10 border border-yellow-500/30 rounded-lg",children:[(0,l.jsxs)("div",{className:"flex items-start gap-3",children:[(0,l.jsx)(r.default,{name:"warning",className:"text-yellow-500"}),(0,l.jsxs)("div",{className:"flex-1",children:[(0,l.jsx)("p",{className:"font-medium text-yellow-600 dark:text-yellow-400",children:A.container?"10Router runs in a container":"Claude CLI not detected locally"}),(0,l.jsx)("p",{className:"text-sm text-muted-foreground",children:A.container?"The CLI lives on your host, not inside the container. Copy the manual config below into your host's ~/.claude/settings.json.":"Manual configuration is still available if 10router is deployed on a remote server."})]})]}),(0,l.jsxs)("div",{className:"flex items-center gap-2 pl-9",children:[(0,l.jsxs)(d.$,{variant:"secondary",size:"sm",onClick:()=>er(!0),className:"!bg-yellow-500/20 !border-yellow-500/40 !text-yellow-700 dark:!text-yellow-300 hover:!bg-yellow-500/30",children:[(0,l.jsx)(r.default,{name:"content_copy",className:"text-[18px] mr-1"}),"Manual Config"]}),(0,l.jsxs)(d.$,{variant:"outline",size:"sm",onClick:()=>Y(!Z),children:[(0,l.jsx)(r.default,{name:Z?"expand_less":"help",className:"text-[18px] mr-1"}),Z?"Hide":"How to Install"]})]})]}),Z&&(0,l.jsxs)("div",{className:"p-4 bg-card border border-border rounded-lg",children:[(0,l.jsx)("h4",{className:"font-medium mb-3",children:"Installation Guide"}),(0,l.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("p",{className:"text-muted-foreground mb-1",children:"macOS / Linux / Windows:"}),(0,l.jsx)("code",{className:"block px-3 py-2 bg-black/5 dark:bg-white/5 rounded font-mono text-xs",children:"npm install -g @anthropic-ai/claude-code"})]}),(0,l.jsxs)("p",{className:"text-muted-foreground",children:["After installation, run"," ",(0,l.jsx)("code",{className:"px-1 bg-black/5 dark:bg-white/5 rounded",children:"claude"})," to verify."]})]})]})]}),!M&&A?.installed&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"Select Endpoint"}),(0,l.jsx)(I,{value:ea||((_=ea||m).endsWith("/v1")?_:`${_}/v1`),onChange:en,requiresExternalUrl:e.requiresExternalUrl,tunnelEnabled:N,tunnelPublicUrl:w,tailscaleEnabled:k,tailscaleUrl:C,currentUrl:eg})]}),A?.settings?.env?.ANTHROPIC_BASE_URL&&(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr_auto] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"Current"}),(0,l.jsx)("span",{className:"min-w-0 truncate rounded bg-card/40 px-2 py-2 text-xs text-muted-foreground sm:py-1.5",children:A.settings.env.ANTHROPIC_BASE_URL})]}),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr_auto] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"API Key"}),(0,l.jsx)(K,{value:Q,onChange:ee,apiKeys:b,cloudEnabled:y})]}),e.defaultModels.map(e=>(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr_auto] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:e.name}),(0,l.jsxs)("div",{className:"relative w-full min-w-0",children:[(0,l.jsx)("input",{type:"text",value:o[e.alias]||"",onChange:s=>c(e.alias,s.target.value),placeholder:"provider/model-id",className:"w-full min-w-0 pl-2 pr-7 py-2 bg-card rounded border border-border text-xs focus:outline-none focus:ring-1 focus:ring-primary/50 sm:py-1.5"}),o[e.alias]&&(0,l.jsxs)(h.m_,{children:[(0,l.jsx)(h.k$,{asChild:!0,children:(0,l.jsx)("button",{onClick:()=>c(e.alias,""),className:"absolute right-1 top-1/2 -translate-y-1/2 p-0.5 text-muted-foreground hover:text-red-500 rounded transition-colors",children:(0,l.jsx)(r.default,{name:"close",className:"text-[14px]"})})}),(0,l.jsx)(h.ZI,{children:"Clear"})]})]}),(0,l.jsx)("button",{onClick:()=>{X(e.alias),V(!0)},className:"w-full sm:w-auto rounded border px-2 py-2 text-xs transition-colors sm:py-1.5 whitespace-nowrap sm:shrink-0 bg-card border-border text-foreground hover:border-primary cursor-pointer",children:"Select Model"})]},e.alias)),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr_auto] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"Auto-compact"}),(0,l.jsxs)(p.l6,{value:em||"__default__",onValueChange:e=>ex("__default__"===e?"":e),children:[(0,l.jsx)(p.bq,{className:"w-full text-xs",children:(0,l.jsx)(p.yv,{})}),(0,l.jsx)(p.gC,{children:q.map(e=>(0,l.jsx)(p.eb,{value:e.value||"__default__",children:e.label},e.label))})]})]}),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr_auto] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"1M context"}),(0,l.jsxs)("label",{className:"flex items-center gap-1.5 cursor-pointer select-none",children:[(0,l.jsx)(f.S,{checked:eu,onCheckedChange:s=>{var t;ep(t=!0===s),e.defaultModels.forEach(e=>{let s=o[e.alias];s&&c(e.alias,((e,s)=>{let{model:t}=function(e){if("string"!=typeof e)return{model:e,contextMarker:null};let s=e.trim(),t=s.match(H);return t?{model:s.slice(0,-t[0].length),contextMarker:t[0].slice(1,-1).toLowerCase()}:{model:e,contextMarker:null}}(e);return s?`${t}[1m]`:t})(s,t))})}}),(0,l.jsx)("span",{className:"text-xs text-muted-foreground",children:"Append [1m] to the model name"}),(0,l.jsxs)(h.m_,{children:[(0,l.jsx)(h.k$,{asChild:!0,children:(0,l.jsx)("span",{className:"relative inline-flex",children:(0,l.jsx)(r.default,{name:"info",className:"text-muted-foreground text-[14px] cursor-help"})})}),(0,l.jsx)(h.ZI,{side:"top",children:"Claude Code otherwise assumes a 200K window, which clamps the auto-compact window above. Applied to every mapped model — only enable it for models that really accept 1M."})]})]})]}),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr_auto] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"Filter naming"}),(0,l.jsxs)("label",{className:"flex items-center gap-1.5 cursor-pointer select-none",children:[(0,l.jsx)(f.S,{checked:eo,onCheckedChange:ej}),(0,l.jsx)("span",{className:"text-xs text-muted-foreground",children:"Filter naming requests"}),(0,l.jsxs)(h.m_,{children:[(0,l.jsx)(h.k$,{asChild:!0,children:(0,l.jsx)("span",{className:"relative inline-flex",children:(0,l.jsx)(r.default,{name:"info",className:"text-muted-foreground text-[14px] cursor-help"})})}),(0,l.jsx)(h.ZI,{side:"top",children:"Intercepts Claude Code's topic-naming requests and returns a fake response locally, saving API tokens."})]})]})]}),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr_auto] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"Web Search"}),(0,l.jsxs)("label",{className:"flex items-center gap-1.5 cursor-pointer select-none",children:[(0,l.jsx)(f.S,{checked:ed,onCheckedChange:e=>ec(!0===e)}),(0,l.jsx)("span",{className:"text-xs text-muted-foreground",children:"Exa MCP"}),(0,l.jsxs)(h.m_,{children:[(0,l.jsx)(h.k$,{asChild:!0,children:(0,l.jsx)("span",{className:"relative inline-flex",children:(0,l.jsx)(r.default,{name:"info",className:"text-muted-foreground text-[14px] cursor-help"})})}),(0,l.jsx)(h.ZI,{side:"top",children:"Injects Exa MCP into ~/.claude.json so non-Claude models gain web search. Restart Claude Code after Apply."})]})]})]})]}),L&&(0,l.jsxs)("div",{className:`flex items-center gap-2 px-2 py-1.5 rounded text-xs ${"success"===L.type?"bg-green-500/10 text-green-600":"bg-red-500/10 text-red-600"}`,children:[(0,l.jsx)(r.default,{name:"success"===L.type?"check_circle":"error",className:"text-[14px]"}),(0,l.jsx)("span",{children:L.text})]}),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-2 sm:flex sm:items-center",children:[(0,l.jsxs)(d.$,{size:"sm",onClick:eN,disabled:P,children:[P&&(0,l.jsx)(g.A,{className:"size-4 animate-spin"}),(0,l.jsx)(r.default,{name:"save",className:"text-[14px] mr-1"}),"Apply"]}),(0,l.jsxs)(d.$,{variant:"outline",size:"sm",onClick:ew,disabled:!A?.has10Router||z,children:[z&&(0,l.jsx)(g.A,{className:"size-4 animate-spin"}),(0,l.jsx)(r.default,{name:"restore",className:"text-[14px] mr-1"}),"Reset"]}),(0,l.jsxs)(d.$,{variant:"ghost",size:"sm",onClick:()=>er(!0),children:[(0,l.jsx)(r.default,{name:"content_copy",className:"text-[14px] mr-1"}),"Manual Config"]})]})]})]}),J&&(0,l.jsx)(i.rq,{isOpen:J,onClose:()=>V(!1),onSelect:e=>{G&&c(G,e.value)},selectedModel:G?o[G]:null,activeProviders:n,modelAliases:es,title:`Select model for ${G}`}),(0,l.jsx)(i.uR,{isOpen:el,onClose:()=>er(!1),title:"Claude CLI - Manual Configuration",configs:(S=Q&&Q.trim()?Q:y?"<API_KEY_FROM_DASHBOARD>":"sk_10router",E={ANTHROPIC_BASE_URL:ev(),ANTHROPIC_AUTH_TOKEN:S},e.defaultModels.forEach(e=>{let s=o[e.alias];s&&e.envKey&&(E[e.envKey]=s)}),em&&(E.CLAUDE_CODE_AUTO_COMPACT_WINDOW=em),[{filename:"~/.claude/settings.json",content:JSON.stringify({hasCompletedOnboarding:!0,env:E},null,2)}])})]})})}function Z({tool:e,isExpanded:s,onToggle:t,baseUrl:n,apiKeys:o,activeProviders:c,cloudEnabled:m,initialStatus:x,tunnelEnabled:p,tunnelPublicUrl:f,tailscaleEnabled:b,tailscaleUrl:y}){let v,N,w,[k,C]=(0,a.useState)(x||null),[_,S]=(0,a.useState)(!1),[E,A]=(0,a.useState)(!1),[$,M]=(0,a.useState)(!1),[O,P]=(0,a.useState)(null),[R,z]=(0,a.useState)(!1),[T,L]=(0,a.useState)(""),[D,H]=(0,a.useState)([]),[F,q]=(0,a.useState)(""),[B,Y]=(0,a.useState)(!1),[J,V]=(0,a.useState)(!1),[G,X]=(0,a.useState)({}),[Q,ee]=(0,a.useState)(!1),[es,et]=(0,a.useState)("");(0,a.useEffect)(()=>{o?.length>0&&!T&&L(o[0].key)},[o,T]),(0,a.useEffect)(()=>{x&&C(x)},[x]),(0,a.useEffect)(()=>{s&&(k||eo(),el())},[s]);let el=async()=>{try{let e=await fetch("/api/models/alias"),s=await e.json();e.ok&&X(s.aliases||{})}catch(e){console.log("Error fetching model aliases:",e)}};(0,a.useEffect)(()=>{if(k?.profiles&&H(k.profiles.map(e=>e.model).filter(Boolean)),k?.config){let e=k.config.match(/^default_subagent_model\s*=\s*"([^"]+)"/m);e&&q(e[1])}},[k]);let er=(v=k?.config?.match(/base_url\s*=\s*"([^"]+)"/))?v[1]:"",ea=k?.installed?k.config?W(er,{tunnelPublicUrl:f,tailscaleUrl:y})?"configured":"other":"not_configured":null,en=()=>{let e=es||`${n}/v1`;return e.endsWith("/v1")?e:`${e}/v1`},eo=async()=>{S(!0);try{let e=await fetch("/api/cli-tools/codex-settings"),s=await e.json();C(s)}catch(e){C({installed:!1,error:e.message})}finally{S(!1)}},ei=async()=>{A(!0),P(null);try{let e=T&&T.trim()||m?T:"sk_10router",s=await fetch("/api/cli-tools/codex-settings",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({baseUrl:en(),apiKey:e,models:D,subagentModel:F})}),t=await s.json();s.ok?(U(en(),{tunnelPublicUrl:f,tailscaleUrl:y}),P({type:"success",text:"Applied — models appear in codex /model. Account default kept; use codex --profile 10router-<model> for 10Router routing."}),eo()):P({type:"error",text:t.error||"Failed to apply settings"})}catch(e){P({type:"error",text:e.message})}finally{A(!1)}},ed=async()=>{M(!0),P(null);try{let e=await fetch("/api/cli-tools/codex-settings",{method:"DELETE"}),s=await e.json();e.ok?(P({type:"success",text:"Settings reset successfully!"}),H([]),q(""),eo()):P({type:"error",text:s.error||"Failed to reset settings"})}catch(e){P({type:"error",text:e.message})}finally{M(!1)}};return(0,l.jsx)(u.Zp,{size:"sm",className:"overflow-hidden",children:(0,l.jsxs)(u.Wu,{children:[(0,l.jsx)("div",{className:"flex items-start justify-between gap-3 hover:cursor-pointer sm:items-center",onClick:t,children:(0,l.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,l.jsx)("div",{className:"size-8 flex items-center justify-center shrink-0",children:(0,l.jsx)(j.default,{src:"/providers/codex.png",alt:e.name,width:32,height:32,className:"size-8 object-contain rounded-lg",sizes:"32px",onError:e=>{e.target.style.display="none"},loading:"lazy",decoding:"async"})}),(0,l.jsxs)("div",{className:"min-w-0",children:[(0,l.jsxs)("div",{className:"flex min-w-0 flex-wrap items-center gap-2",children:[(0,l.jsx)("h3",{className:"font-medium text-sm",children:e.name}),"configured"===ea&&(0,l.jsx)("span",{className:"px-1.5 py-0.5 text-[10px] font-medium bg-green-500/10 text-green-600 dark:text-green-400 rounded-full",children:"Connected"}),"not_configured"===ea&&(0,l.jsx)("span",{className:"px-1.5 py-0.5 text-[10px] font-medium bg-yellow-500/10 text-yellow-600 dark:text-yellow-400 rounded-full",children:"Not configured"}),"other"===ea&&(0,l.jsx)("span",{className:"px-1.5 py-0.5 text-[10px] font-medium bg-blue-500/10 text-blue-600 dark:text-blue-400 rounded-full",children:"Other"})]}),(0,l.jsx)("p",{className:"text-xs text-muted-foreground truncate",children:e.description})]})]})}),s&&(0,l.jsxs)("div",{className:"mt-4 pt-4 border-t border-border flex flex-col gap-4",children:[_&&(0,l.jsxs)("div",{className:"flex items-center gap-2 text-muted-foreground",children:[(0,l.jsx)(r.default,{name:"progress_activity",className:"animate-spin"}),(0,l.jsx)("span",{children:"Checking Codex CLI..."})]}),!_&&k&&!k.installed&&(0,l.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,l.jsxs)("div",{className:"flex flex-col gap-3 p-4 bg-yellow-500/10 border border-yellow-500/30 rounded-lg",children:[(0,l.jsxs)("div",{className:"flex items-start gap-3",children:[(0,l.jsx)(r.default,{name:"warning",className:"text-yellow-500"}),(0,l.jsxs)("div",{className:"flex-1",children:[(0,l.jsx)("p",{className:"font-medium text-yellow-600 dark:text-yellow-400",children:k.container?"10Router runs in a container":"Codex CLI not detected locally"}),(0,l.jsx)("p",{className:"text-sm text-muted-foreground",children:k.container?"The CLI lives on your host, not inside the container. Copy the manual config below into your host's ~/.codex/config.toml.":"Manual configuration is still available if 10router is deployed on a remote server."})]})]}),(0,l.jsxs)("div",{className:"flex items-center gap-2 pl-9",children:[(0,l.jsxs)(d.$,{variant:"secondary",size:"sm",onClick:()=>ee(!0),className:"!bg-yellow-500/20 !border-yellow-500/40 !text-yellow-700 dark:!text-yellow-300 hover:!bg-yellow-500/30",children:[(0,l.jsx)(r.default,{name:"content_copy",className:"text-[18px] mr-1"}),"Manual Config"]}),(0,l.jsxs)(d.$,{variant:"outline",size:"sm",onClick:()=>z(!R),children:[(0,l.jsx)(r.default,{name:R?"expand_less":"help",className:"text-[18px] mr-1"}),R?"Hide":"How to Install"]})]})]}),R&&(0,l.jsxs)("div",{className:"p-4 bg-card border border-border rounded-lg",children:[(0,l.jsx)("h4",{className:"font-medium mb-3",children:"Installation Guide"}),(0,l.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("p",{className:"text-muted-foreground mb-1",children:"macOS / Linux / Windows:"}),(0,l.jsx)("code",{className:"block px-3 py-2 bg-black/5 dark:bg-white/5 rounded font-mono text-xs",children:"npm install -g @openai/codex"})]}),(0,l.jsxs)("p",{className:"text-muted-foreground",children:["After installation, run"," ",(0,l.jsx)("code",{className:"px-1 bg-black/5 dark:bg-white/5 rounded",children:"codex"})," to verify."]}),(0,l.jsx)("div",{className:"pt-2 border-t border-border",children:(0,l.jsxs)("p",{className:"text-muted-foreground text-xs",children:["Codex reads custom providers from"," ",(0,l.jsx)("code",{className:"px-1 bg-black/5 dark:bg-white/5 rounded",children:"~/.codex/config.toml"}),'. Click "Apply" to auto-configure.']})})]})]})]}),!_&&k?.installed&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)("div",{className:"flex flex-col gap-2",children:[k?.rootHijacked&&(0,l.jsxs)("div",{className:"flex items-start gap-2 px-2 py-1.5 rounded text-xs bg-yellow-500/10 text-yellow-600 dark:text-yellow-400",children:[(0,l.jsx)(r.default,{name:"warning",className:"text-[14px] shrink-0 mt-0.5"}),(0,l.jsx)("span",{children:"Old settings overrode your default Codex model. Apply to restore your ChatGPT account default — added models become profiles."})]}),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"Select Endpoint"}),(0,l.jsx)(I,{value:es||es||`${n}/v1`,onChange:et,requiresExternalUrl:e.requiresExternalUrl,tunnelEnabled:p,tunnelPublicUrl:f,tailscaleEnabled:b,tailscaleUrl:y,currentUrl:er})]}),k?.config&&(er?(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr_auto] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"Current"}),(0,l.jsx)("span",{className:"min-w-0 truncate rounded bg-card/40 px-2 py-2 text-xs text-muted-foreground sm:py-1.5",children:er})]}):null),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr_auto] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"API Key"}),(0,l.jsx)(K,{value:T,onChange:L,apiKeys:o,cloudEnabled:m})]}),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr] sm:items-start sm:gap-2",children:[(0,l.jsx)("span",{className:"pt-1 text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"Models"}),(0,l.jsxs)("div",{className:"flex min-w-0 flex-1 flex-col gap-2",children:[(0,l.jsx)("div",{className:"flex min-h-7 flex-wrap gap-1.5 rounded border border-border bg-card px-2 py-1.5",children:0===D.length?(0,l.jsx)("span",{className:"text-xs text-muted-foreground",children:"No models added"}):D.map(e=>(0,l.jsxs)("span",{className:"inline-flex items-center gap-1 rounded border border-transparent bg-black/5 px-2 py-0.5 text-xs text-muted-foreground hover:border-border dark:bg-white/5",children:[e,(0,l.jsxs)(h.m_,{children:[(0,l.jsx)(h.k$,{asChild:!0,children:(0,l.jsx)("button",{onClick:()=>H(D.filter(s=>s!==e)),className:"ml-0.5 hover:text-red-500",children:(0,l.jsx)(r.default,{name:"close",className:"text-[12px]"})})}),(0,l.jsx)(h.ZI,{children:"Remove"})]})]},e))}),(0,l.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,l.jsx)("button",{onClick:()=>Y(!0),className:"cursor-pointer rounded border border-border bg-card px-2 py-1 text-xs text-foreground transition-colors hover:border-primary",children:"Add Model"}),(0,l.jsxs)("span",{className:"text-xs text-muted-foreground",children:["Launch:"," ",(0,l.jsx)("code",{className:"rounded bg-black/5 px-1 dark:bg-white/5",children:"codex --profile 10router-<model>"})]})]})]})]}),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr_auto] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"Subagent Model"}),(0,l.jsxs)("div",{className:"relative w-full min-w-0",children:[(0,l.jsx)("input",{type:"text",value:F,onChange:e=>q(e.target.value),placeholder:D[0]||"provider/model-id (defaults to main model)",className:"w-full min-w-0 pl-2 pr-7 py-2 bg-card rounded border border-border text-xs focus:outline-none focus:ring-1 focus:ring-primary/50 sm:py-1.5"}),F&&(0,l.jsxs)(h.m_,{children:[(0,l.jsx)(h.k$,{asChild:!0,children:(0,l.jsx)("button",{onClick:()=>q(""),className:"absolute right-1 top-1/2 -translate-y-1/2 p-0.5 text-muted-foreground hover:text-red-500 rounded transition-colors",children:(0,l.jsx)(r.default,{name:"close",className:"text-[14px]"})})}),(0,l.jsx)(h.ZI,{children:"Clear (will use main model)"})]})]}),(0,l.jsx)("button",{onClick:()=>V(!0),className:"w-full sm:w-auto rounded border px-2 py-2 text-xs transition-colors sm:py-1.5 whitespace-nowrap sm:shrink-0 bg-card border-border text-foreground hover:border-primary cursor-pointer",children:"Select Model"})]})]}),O&&(0,l.jsxs)("div",{className:`flex items-center gap-2 px-2 py-1.5 rounded text-xs ${"success"===O.type?"bg-green-500/10 text-green-600":"bg-red-500/10 text-red-600"}`,children:[(0,l.jsx)(r.default,{name:"success"===O.type?"check_circle":"error",className:"text-[14px]"}),(0,l.jsx)("span",{children:O.text})]}),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-2 sm:flex sm:items-center",children:[(0,l.jsxs)(d.$,{size:"sm",onClick:ei,disabled:!T&&m&&o.length>0||0===D.length||E,children:[E&&(0,l.jsx)(g.A,{className:"size-4 animate-spin"}),(0,l.jsx)(r.default,{name:"save",className:"text-[14px] mr-1"}),"Apply"]}),(0,l.jsxs)(d.$,{variant:"outline",size:"sm",onClick:ed,disabled:$,children:[$&&(0,l.jsx)(g.A,{className:"size-4 animate-spin"}),(0,l.jsx)(r.default,{name:"restore",className:"text-[14px] mr-1"}),"Reset"]}),(0,l.jsxs)(d.$,{variant:"ghost",size:"sm",onClick:()=>ee(!0),children:[(0,l.jsx)(r.default,{name:"content_copy",className:"text-[14px] mr-1"}),"Manual Config"]})]})]})]}),B&&(0,l.jsx)(i.rq,{isOpen:B,onClose:()=>Y(!1),onSelect:e=>{D.includes(e.value)||H([...D,e.value])},onDeselect:e=>{H(D.filter(s=>s!==e.value))},selectedModel:null,addedModelValues:D,closeOnSelect:!1,title:"Add Models for Codex",activeProviders:c,modelAliases:G}),J&&(0,l.jsx)(i.rq,{isOpen:J,onClose:()=>V(!1),onSelect:e=>{q(e.value),V(!1)},selectedModel:F,activeProviders:c,modelAliases:G,title:"Select Subagent Model for Codex"}),(0,l.jsx)(i.uR,{isOpen:Q,onClose:()=>ee(!1),title:"Codex CLI - Manual Configuration",configs:(N=T&&T.trim()?T:m?"<API_KEY_FROM_DASHBOARD>":"sk_10router",w=[{filename:"~/.codex/config.toml",content:`# 10Router Configuration for Codex CLI
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3554],{7006:(e,s,t)=>{Promise.resolve().then(t.bind(t,32063))},15764:(e,s,t)=>{"use strict";t.d(s,{CK:()=>i.default,G9:()=>m.default,Iz:()=>f.default,KX:()=>j.PanelSkeleton,LF:()=>a.default,LH:()=>x.default,Mu:()=>j.StatCardSkeleton,Nf:()=>d.default,Qv:()=>r.CardSkeleton,YW:()=>y.YW,gw:()=>g.default,jK:()=>c.default,nh:()=>b.default,pV:()=>y.pV,rq:()=>n.default,uR:()=>o.default,uo:()=>l.ConfirmModal,vE:()=>u.default,vj:()=>p.default,wI:()=>h.default,wn:()=>y.wn,zY:()=>y.zY}),t(58913);var l=t(3537),r=t(58350);t(30872),t(33526),t(42535),t(1279);var a=t(92802),n=t(25908),o=t(58729),i=t(24873),d=t(5258),c=t(4165);t(949),t(56776),t(53599),t(88336),t(69561);var m=t(37753),x=t(23444),u=t(93624),p=t(86920),h=t(65461);t(14580);var g=t(14670),f=t(70296);t(57779),t(22205);var j=t(43276),b=t(75862),y=t(92412)},32063:(e,s,t)=>{"use strict";t.d(s,{default:()=>en});var l=t(29798),r=t(58913),a=t(15814),n=t(50141),o=t.n(n),i=t(15764),d=t(18055),c=t(738),m=t(90046),x=t(80159),u=t(75669),p=t(45111),h=t(1352),g=t(69221),f=t(7896),j=t(16653),b=t(51660),y=t(77345);function v({storageKey:e,changeEvent:s,itemField:t,normalize:l=e=>e,defaultName:r=e=>e}){let a=()=>{try{let s=JSON.parse(window.localStorage.getItem(e)||"[]");if(!Array.isArray(s))return[];return s.filter(e=>e?.name&&e?.[t])}catch{return[]}},n=t=>{window.localStorage.setItem(e,JSON.stringify(t)),window.dispatchEvent(new CustomEvent(s))};return{read:a,subscribe:e=>(window.addEventListener(s,e),()=>window.removeEventListener(s,e)),upsert:(e,s)=>{let o=l(e);if(!o)return null;let i=a(),d=i.find(e=>l(e[t])===o);if(d&&!s)return d.name;let c=(s||r(o)).trim();return c?(n([...i.filter(e=>e.name!==c&&l(e[t])!==o),{name:c,[t]:o}].sort((e,s)=>e.name.localeCompare(s.name))),c):null},remove:e=>n(a().filter(s=>s.name!==e))}}let N=e=>(e||"").replace(/\/+$/,""),w=v({storageKey:"10router.cliToolEndpointPresets",changeEvent:"10router:endpoint-presets-changed",itemField:"baseUrl",normalize:N,defaultName:e=>{try{return new URL(e).host}catch{return e}}}),k=v({storageKey:"10router.cliToolApiKeyPresets",changeEvent:"10router:api-key-presets-changed",itemField:"key"}),C=w.read,_=w.subscribe,S=w.upsert,E=w.remove,A=k.read,$=k.subscribe,M=k.upsert,O=k.remove;function U(e,{tunnelPublicUrl:s,tailscaleUrl:t,cloudUrl:l}={}){let r=N(e);return!r||[`http://127.0.0.1:${b._$}`,s,t,l].filter(Boolean).flatMap(e=>[N(e),`${N(e)}/v1`]).includes(r)?null:S(r)}let P="__custom__",R="__save__",z=e=>{let s=(e||"").replace(/\/+$/,"");return s?/\/v1$/.test(s)?s:`${s}/v1`:""};function I({value:e,onChange:s,requiresExternalUrl:t=!1,tunnelEnabled:n=!1,tunnelPublicUrl:o="",tailscaleEnabled:i=!1,tailscaleUrl:d="",cloudEnabled:c=!1,cloudUrl:m="",withV1:x=!0,currentUrl:u=""}){let[g,f]=(0,a.useState)([]),[j,v]=(0,a.useState)(!1),[w,k]=(0,a.useState)(""),[A,$]=(0,a.useState)(""),M=(0,a.useRef)(!1),O=(0,a.useRef)("");(0,a.useEffect)(()=>{let e=()=>{let e=C();f(e),k(s=>{if(s!==P)return s;let t=N(O.current);if(!t)return s;let l=e.find(e=>{let s=N(e.baseUrl);return s===t||s===z(t)});return l?`saved:${l.name}`:s})};return e(),v(!0),_(e)},[]);let U=(0,a.useMemo)(()=>(({requiresExternalUrl:e,tunnelEnabled:s,tunnelPublicUrl:t,tailscaleEnabled:l,tailscaleUrl:r,cloudEnabled:a,cloudUrl:n,savedPresets:o,withV1:i})=>{let d=[],c=e=>i?z(e):(e||"").replace(/\/+$/,"");if(!e){let e=c(`http://127.0.0.1:${b._$}`);d.push({value:"local",label:e,url:e})}if(s&&t){let e=c(t);d.push({value:"tunnel",label:e,url:e})}if(l&&r){let e=c(r);d.push({value:"tailscale",label:e,url:e})}if(a&&n){let e=c(n);d.push({value:"cloud",label:e,url:e})}return o.forEach(e=>{d.push({value:`saved:${e.name}`,label:e.baseUrl,url:e.baseUrl,saved:!0})}),d.push({value:P,label:"Custom URL...",url:""}),d})({requiresExternalUrl:t,tunnelEnabled:n,tunnelPublicUrl:o,tailscaleEnabled:i,tailscaleUrl:d,cloudEnabled:c,cloudUrl:m,savedPresets:g,withV1:x}),[t,n,o,i,d,c,m,g,x]);(0,a.useEffect)(()=>{if(M.current||!j||0===U.length)return;M.current=!0;let e=N(u),t=(e?U.find(s=>s.saved&&N(s.url)===e):null)||U.find(e=>e.value!==P);t?(k(t.value),s(t.url)):k(P)},[j,U,s,u]);let T=w.startsWith("saved:"),L=w===P,K=L&&(A||"").trim().length>0;return(0,l.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[(0,l.jsxs)(p.l6,{value:w,onValueChange:t=>{if(t===R){let s=(e||"").trim();if(!s)return;let t=s;try{t=new URL(s).host}catch{}let l=window.prompt("Save endpoint as:",t),r=l?.trim()?S(s,l.trim()):null;r&&k(`saved:${r}`);return}if(k(t),t===P){$(""),s("");return}let l=U.find(e=>e.value===t);l&&s(l.url)},children:[(0,l.jsx)(p.bq,{className:"flex-1 min-w-0 text-xs",children:(0,l.jsx)(p.yv,{placeholder:"Select endpoint"})}),(0,l.jsxs)(p.gC,{children:[U.map(e=>(0,l.jsx)(p.eb,{value:e.value,title:e.label,children:e.label},e.value)),K&&(0,l.jsx)(p.eb,{value:R,children:"+ Save current as..."})]})]}),T&&(0,l.jsxs)(h.m_,{children:[(0,l.jsx)(h.k$,{asChild:!0,children:(0,l.jsx)("button",{type:"button",onClick:()=>{if(!w.startsWith("saved:"))return;E(w.slice(6)),$("");let e=U.find(e=>e.value!==P&&e.value!==w);e?(k(e.value),s(e.url)):(k(P),s(""))},className:"p-1 text-muted-foreground hover:text-red-500 rounded transition-colors shrink-0",children:(0,l.jsx)(r.default,{name:"delete",className:"text-[14px]"})})}),(0,l.jsx)(h.ZI,{children:"Delete saved endpoint"})]})]}),L&&(0,l.jsx)(y.p,{type:"text",value:A,onChange:e=>{let t=e.target.value;O.current=t,$(t),s(t)},placeholder:x?"https://example.com/v1":"https://example.com",className:"h-9 text-xs"})]})}let T="__custom__",L="__save_key__";function K({value:e,onChange:s,apiKeys:t=[],cloudEnabled:n=!1,className:o=""}){let[i,d]=(0,a.useState)([]),[c,m]=(0,a.useState)(!1),[x,u]=(0,a.useState)("");(0,a.useEffect)(()=>{let e=()=>d(A());return e(),$(e)},[]);let g=(0,a.useMemo)(()=>[...t.map(e=>({value:e.key,label:e.key})),...i.map(e=>({value:`saved:${e.name}`,label:e.key,url:e.key,saved:!0})),{value:T,label:"Custom...",url:""}],[t,i]),f=e?g.find(s=>s.value===e||s.url===e):null,j=f?f.value:c||e?T:g[0]?.value??T,b=c?x:e||"",v="string"==typeof j&&j.startsWith("saved:"),N=j===T,w=N&&(e||"").trim().length>0&&!t.some(s=>s.key===e);return 0!==t.length||0!==i.length||c||e?(0,l.jsxs)("div",{className:`flex flex-col gap-1.5 ${o}`,children:[(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[(0,l.jsxs)(p.l6,{value:j,onValueChange:t=>{if(t===L)return void M((e||"").trim());if(t===T){m(!0),u(""),s("");return}m(!1),u("");let l=g.find(e=>e.value===t);l&&s(l.url??l.value)},children:[(0,l.jsx)(p.bq,{className:"flex-1 min-w-0 text-xs",children:(0,l.jsx)(p.yv,{placeholder:"Select key"})}),(0,l.jsxs)(p.gC,{children:[g.map(e=>(0,l.jsx)(p.eb,{value:e.value,title:e.label,children:e.label},e.value)),w&&(0,l.jsx)(p.eb,{value:L,children:"+ Save current as..."})]})]}),v&&(0,l.jsxs)(h.m_,{children:[(0,l.jsx)(h.k$,{asChild:!0,children:(0,l.jsx)("button",{type:"button",onClick:()=>{if(!v)return;O(j.slice(6)),m(!1),u("");let e=g.find(e=>e.value!==T&&e.value!==j);s(e?e.url??e.value:"")},className:"p-1 text-muted-foreground hover:text-red-500 rounded transition-colors shrink-0",children:(0,l.jsx)(r.default,{name:"delete",className:"text-[14px]"})})}),(0,l.jsx)(h.ZI,{children:"Delete saved key"})]})]}),N&&(0,l.jsx)(y.p,{type:"text",value:b,onChange:e=>{let t=e.target.value;m(!0),u(t),s(t)},placeholder:"sk-...",className:"h-9 text-xs"})]}):(0,l.jsx)("span",{className:`min-w-0 rounded bg-card/40 px-2 py-2 text-xs text-muted-foreground sm:py-1.5 ${o}`,children:n?"No API keys - Create one in Keys page":"sk_10router (default)"})}let D=e=>(e||"").replace(/\/+$/,"");function W(e,s={}){if(!e)return!1;let t=D(e),{tunnelPublicUrl:l,tailscaleUrl:r,cloudUrl:a}=s;return!!(/localhost|127\.0\.0\.1|0\.0\.0\.0/.test(t)||l&&t.startsWith(D(l))||r&&t.startsWith(D(r))||a&&t.startsWith(D(a)))}let H=/\[1m\]$/i,F=t(65746).env.NEXT_PUBLIC_CLOUD_URL,q=[{label:"Default",value:""},{label:"200K",value:"198000"},{label:"300K",value:"298000"},{label:"500K",value:"498000"},{label:"700K",value:"698000"}];function B({tool:e,isExpanded:s,onToggle:t,activeProviders:n,modelMappings:o,onModelMappingChange:c,baseUrl:m,hasActiveProviders:x,apiKeys:b,cloudEnabled:y,initialStatus:v,tunnelEnabled:N,tunnelPublicUrl:w,tailscaleEnabled:k,tailscaleUrl:C}){let _,S,E,[A,$]=(0,a.useState)(v||null),[M,O]=(0,a.useState)(!1),[P,R]=(0,a.useState)(!1),[z,T]=(0,a.useState)(!1),[L,D]=(0,a.useState)(null),[Z,Y]=(0,a.useState)(!1),[J,V]=(0,a.useState)(!1),[G,X]=(0,a.useState)(null),[Q,ee]=(0,a.useState)(""),[es,et]=(0,a.useState)({}),[el,er]=(0,a.useState)(!1),[ea,en]=(0,a.useState)(""),[eo,ei]=(0,a.useState)(!1),[ed,ec]=(0,a.useState)(!1),[em,ex]=(0,a.useState)(""),[eu,ep]=(0,a.useState)(!1),eh=(0,a.useRef)(!1),eg=A?.settings?.env?.ANTHROPIC_BASE_URL||"",ef=(()=>{if(!A?.installed)return null;let e=A.settings?.env?.ANTHROPIC_BASE_URL;return e?W(e,{tunnelPublicUrl:w,tailscaleUrl:C,cloudUrl:y?F:null})?"configured":"other":"not_configured"})();(0,a.useEffect)(()=>{b?.length>0&&!Q&&ee(b[0].key)},[b,Q]),(0,a.useEffect)(()=>{v&&($(v),ec(!!v.exaMcpEnabled))},[v]),(0,a.useEffect)(()=>{ex(A?.settings?.env?.CLAUDE_CODE_AUTO_COMPACT_WINDOW||"")},[A?.settings?.env?.CLAUDE_CODE_AUTO_COMPACT_WINDOW]),(0,a.useEffect)(()=>{let s=A?.settings?.env;s&&ep(e.defaultModels.some(e=>s[e.envKey]?.endsWith("[1m]")))},[A?.settings?.env,e.defaultModels]),(0,a.useEffect)(()=>{s&&(A||ey(),eb())},[s]),(0,a.useEffect)(()=>{fetch("/api/settings").then(e=>e.json()).then(e=>{ei(!!e.ccFilterNaming)}).catch(()=>{})},[]);let ej=async e=>{let s=!0===e;ei(s),await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({ccFilterNaming:s})}).catch(()=>{})},eb=async()=>{try{let e=await fetch("/api/models/alias"),s=await e.json();e.ok&&et(s.aliases||{})}catch(e){console.log("Error fetching model aliases:",e)}};(0,a.useEffect)(()=>{if(A?.installed&&!eh.current){eh.current=!0;let s=A.settings?.env||{};e.defaultModels.forEach(e=>{if(e.envKey){let t=s[e.envKey]||e.defaultValue||"";t&&c(e.alias,t)}});let t=s.ANTHROPIC_AUTH_TOKEN;t&&ee(t)}},[A,b,e.defaultModels,c]);let ey=async()=>{O(!0);try{let e=await fetch("/api/cli-tools/claude-settings"),s=await e.json();$(s),ec(!!s.exaMcpEnabled)}catch(e){$({installed:!1,error:e.message})}finally{O(!1)}},ev=()=>{let e=ea||m;return e.endsWith("/v1")?e:`${e}/v1`},eN=async()=>{R(!0),D(null);try{let s={ANTHROPIC_BASE_URL:ev()},t=Q?.trim()||(b?.length>0?b[0].key:null)||(y?null:"sk_10router");t&&(s.ANTHROPIC_AUTH_TOKEN=t),e.defaultModels.forEach(e=>{let t=o[e.alias];t&&e.envKey&&(s[e.envKey]=t)}),em&&(s.CLAUDE_CODE_AUTO_COMPACT_WINDOW=em);let l=await fetch("/api/cli-tools/claude-settings",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({env:s,exaMcpEnabled:ed,autoCompactWindow:em})}),r=await l.json();l.ok?(U(ev(),{tunnelPublicUrl:w,tailscaleUrl:C}),D({type:"success",text:"Settings applied successfully!"}),$(e=>({...e,hasBackup:!0,settings:{...e?.settings,env:s},exaMcpEnabled:ed}))):D({type:"error",text:r.error||"Failed to apply settings"})}catch(e){D({type:"error",text:e.message})}finally{R(!1)}},ew=async()=>{T(!0),D(null);try{let s=await fetch("/api/cli-tools/claude-settings",{method:"DELETE"}),t=await s.json();s.ok?(D({type:"success",text:"Settings reset successfully!"}),e.defaultModels.forEach(e=>c(e.alias,e.defaultValue||"")),ee(""),ec(!1),ex(""),ep(!1)):D({type:"error",text:t.error||"Failed to reset settings"})}catch(e){D({type:"error",text:e.message})}finally{T(!1)}};return(0,l.jsx)(u.Zp,{size:"sm",className:"overflow-hidden",children:(0,l.jsxs)(u.Wu,{children:[(0,l.jsx)("div",{className:"flex items-start justify-between gap-3 hover:cursor-pointer sm:items-center",onClick:t,children:(0,l.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,l.jsx)("div",{className:"size-8 flex items-center justify-center shrink-0",children:(0,l.jsx)(j.default,{src:"/providers/claude.png",alt:e.name,width:32,height:32,className:"size-8 object-contain rounded-lg",sizes:"32px",onError:e=>{e.target.style.display="none"},loading:"lazy",decoding:"async"})}),(0,l.jsxs)("div",{className:"min-w-0",children:[(0,l.jsxs)("div",{className:"flex min-w-0 flex-wrap items-center gap-2",children:[(0,l.jsx)("h3",{className:"font-medium text-sm",children:e.name}),"configured"===ef&&(0,l.jsx)("span",{className:"px-1.5 py-0.5 text-[10px] font-medium bg-green-500/10 text-green-600 dark:text-green-400 rounded-full",children:"Connected"}),"not_configured"===ef&&(0,l.jsx)("span",{className:"px-1.5 py-0.5 text-[10px] font-medium bg-yellow-500/10 text-yellow-600 dark:text-yellow-400 rounded-full",children:"Not configured"}),"other"===ef&&(0,l.jsx)("span",{className:"px-1.5 py-0.5 text-[10px] font-medium bg-blue-500/10 text-blue-600 dark:text-blue-400 rounded-full",children:"Other"})]}),(0,l.jsx)("p",{className:"text-xs text-muted-foreground truncate",children:e.description})]})]})}),s&&(0,l.jsxs)("div",{className:"mt-4 pt-4 border-t border-border flex flex-col gap-4",children:[M&&(0,l.jsxs)("div",{className:"flex items-center gap-2 text-muted-foreground",children:[(0,l.jsx)(r.default,{name:"progress_activity",className:"animate-spin"}),(0,l.jsx)("span",{children:"Checking Claude CLI..."})]}),!M&&A&&!A.installed&&(0,l.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,l.jsxs)("div",{className:"flex flex-col gap-3 p-4 bg-yellow-500/10 border border-yellow-500/30 rounded-lg",children:[(0,l.jsxs)("div",{className:"flex items-start gap-3",children:[(0,l.jsx)(r.default,{name:"warning",className:"text-yellow-500"}),(0,l.jsxs)("div",{className:"flex-1",children:[(0,l.jsx)("p",{className:"font-medium text-yellow-600 dark:text-yellow-400",children:A.container?"10Router runs in a container":"Claude CLI not detected locally"}),(0,l.jsx)("p",{className:"text-sm text-muted-foreground",children:A.container?"The CLI lives on your host, not inside the container. Copy the manual config below into your host's ~/.claude/settings.json.":"Manual configuration is still available if 10router is deployed on a remote server."})]})]}),(0,l.jsxs)("div",{className:"flex items-center gap-2 pl-9",children:[(0,l.jsxs)(d.$,{variant:"secondary",size:"sm",onClick:()=>er(!0),className:"!bg-yellow-500/20 !border-yellow-500/40 !text-yellow-700 dark:!text-yellow-300 hover:!bg-yellow-500/30",children:[(0,l.jsx)(r.default,{name:"content_copy",className:"text-[18px] mr-1"}),"Manual Config"]}),(0,l.jsxs)(d.$,{variant:"outline",size:"sm",onClick:()=>Y(!Z),children:[(0,l.jsx)(r.default,{name:Z?"expand_less":"help",className:"text-[18px] mr-1"}),Z?"Hide":"How to Install"]})]})]}),Z&&(0,l.jsxs)("div",{className:"p-4 bg-card border border-border rounded-lg",children:[(0,l.jsx)("h4",{className:"font-medium mb-3",children:"Installation Guide"}),(0,l.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("p",{className:"text-muted-foreground mb-1",children:"macOS / Linux / Windows:"}),(0,l.jsx)("code",{className:"block px-3 py-2 bg-black/5 dark:bg-white/5 rounded font-mono text-xs",children:"npm install -g @anthropic-ai/claude-code"})]}),(0,l.jsxs)("p",{className:"text-muted-foreground",children:["After installation, run"," ",(0,l.jsx)("code",{className:"px-1 bg-black/5 dark:bg-white/5 rounded",children:"claude"})," to verify."]})]})]})]}),!M&&A?.installed&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"Select Endpoint"}),(0,l.jsx)(I,{value:ea||((_=ea||m).endsWith("/v1")?_:`${_}/v1`),onChange:en,requiresExternalUrl:e.requiresExternalUrl,tunnelEnabled:N,tunnelPublicUrl:w,tailscaleEnabled:k,tailscaleUrl:C,currentUrl:eg})]}),A?.settings?.env?.ANTHROPIC_BASE_URL&&(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr_auto] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"Current"}),(0,l.jsx)("span",{className:"min-w-0 truncate rounded bg-card/40 px-2 py-2 text-xs text-muted-foreground sm:py-1.5",children:A.settings.env.ANTHROPIC_BASE_URL})]}),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr_auto] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"API Key"}),(0,l.jsx)(K,{value:Q,onChange:ee,apiKeys:b,cloudEnabled:y})]}),e.defaultModels.map(e=>(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr_auto] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:e.name}),(0,l.jsxs)("div",{className:"relative w-full min-w-0",children:[(0,l.jsx)("input",{type:"text",value:o[e.alias]||"",onChange:s=>c(e.alias,s.target.value),placeholder:"provider/model-id",className:"w-full min-w-0 pl-2 pr-7 py-2 bg-card rounded border border-border text-xs focus:outline-none focus:ring-1 focus:ring-primary/50 sm:py-1.5"}),o[e.alias]&&(0,l.jsxs)(h.m_,{children:[(0,l.jsx)(h.k$,{asChild:!0,children:(0,l.jsx)("button",{onClick:()=>c(e.alias,""),className:"absolute right-1 top-1/2 -translate-y-1/2 p-0.5 text-muted-foreground hover:text-red-500 rounded transition-colors",children:(0,l.jsx)(r.default,{name:"close",className:"text-[14px]"})})}),(0,l.jsx)(h.ZI,{children:"Clear"})]})]}),(0,l.jsx)("button",{onClick:()=>{X(e.alias),V(!0)},className:"w-full sm:w-auto rounded border px-2 py-2 text-xs transition-colors sm:py-1.5 whitespace-nowrap sm:shrink-0 bg-card border-border text-foreground hover:border-primary cursor-pointer",children:"Select Model"})]},e.alias)),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr_auto] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"Auto-compact"}),(0,l.jsxs)(p.l6,{value:em||"__default__",onValueChange:e=>ex("__default__"===e?"":e),children:[(0,l.jsx)(p.bq,{className:"w-full text-xs",children:(0,l.jsx)(p.yv,{})}),(0,l.jsx)(p.gC,{children:q.map(e=>(0,l.jsx)(p.eb,{value:e.value||"__default__",children:e.label},e.label))})]})]}),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr_auto] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"1M context"}),(0,l.jsxs)("label",{className:"flex items-center gap-1.5 cursor-pointer select-none",children:[(0,l.jsx)(f.S,{checked:eu,onCheckedChange:s=>{var t;ep(t=!0===s),e.defaultModels.forEach(e=>{let s=o[e.alias];s&&c(e.alias,((e,s)=>{let{model:t}=function(e){if("string"!=typeof e)return{model:e,contextMarker:null};let s=e.trim(),t=s.match(H);return t?{model:s.slice(0,-t[0].length),contextMarker:t[0].slice(1,-1).toLowerCase()}:{model:e,contextMarker:null}}(e);return s?`${t}[1m]`:t})(s,t))})}}),(0,l.jsx)("span",{className:"text-xs text-muted-foreground",children:"Append [1m] to the model name"}),(0,l.jsxs)(h.m_,{children:[(0,l.jsx)(h.k$,{asChild:!0,children:(0,l.jsx)("span",{className:"relative inline-flex",children:(0,l.jsx)(r.default,{name:"info",className:"text-muted-foreground text-[14px] cursor-help"})})}),(0,l.jsx)(h.ZI,{side:"top",children:"Claude Code otherwise assumes a 200K window, which clamps the auto-compact window above. Applied to every mapped model — only enable it for models that really accept 1M."})]})]})]}),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr_auto] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"Filter naming"}),(0,l.jsxs)("label",{className:"flex items-center gap-1.5 cursor-pointer select-none",children:[(0,l.jsx)(f.S,{checked:eo,onCheckedChange:ej}),(0,l.jsx)("span",{className:"text-xs text-muted-foreground",children:"Filter naming requests"}),(0,l.jsxs)(h.m_,{children:[(0,l.jsx)(h.k$,{asChild:!0,children:(0,l.jsx)("span",{className:"relative inline-flex",children:(0,l.jsx)(r.default,{name:"info",className:"text-muted-foreground text-[14px] cursor-help"})})}),(0,l.jsx)(h.ZI,{side:"top",children:"Intercepts Claude Code's topic-naming requests and returns a fake response locally, saving API tokens."})]})]})]}),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr_auto] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"Web Search"}),(0,l.jsxs)("label",{className:"flex items-center gap-1.5 cursor-pointer select-none",children:[(0,l.jsx)(f.S,{checked:ed,onCheckedChange:e=>ec(!0===e)}),(0,l.jsx)("span",{className:"text-xs text-muted-foreground",children:"Exa MCP"}),(0,l.jsxs)(h.m_,{children:[(0,l.jsx)(h.k$,{asChild:!0,children:(0,l.jsx)("span",{className:"relative inline-flex",children:(0,l.jsx)(r.default,{name:"info",className:"text-muted-foreground text-[14px] cursor-help"})})}),(0,l.jsx)(h.ZI,{side:"top",children:"Injects Exa MCP into ~/.claude.json so non-Claude models gain web search. Restart Claude Code after Apply."})]})]})]})]}),L&&(0,l.jsxs)("div",{className:`flex items-center gap-2 px-2 py-1.5 rounded text-xs ${"success"===L.type?"bg-green-500/10 text-green-600":"bg-red-500/10 text-red-600"}`,children:[(0,l.jsx)(r.default,{name:"success"===L.type?"check_circle":"error",className:"text-[14px]"}),(0,l.jsx)("span",{children:L.text})]}),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-2 sm:flex sm:items-center",children:[(0,l.jsxs)(d.$,{size:"sm",onClick:eN,disabled:P,children:[P&&(0,l.jsx)(g.A,{className:"size-4 animate-spin"}),(0,l.jsx)(r.default,{name:"save",className:"text-[14px] mr-1"}),"Apply"]}),(0,l.jsxs)(d.$,{variant:"outline",size:"sm",onClick:ew,disabled:!A?.has10Router||z,children:[z&&(0,l.jsx)(g.A,{className:"size-4 animate-spin"}),(0,l.jsx)(r.default,{name:"restore",className:"text-[14px] mr-1"}),"Reset"]}),(0,l.jsxs)(d.$,{variant:"ghost",size:"sm",onClick:()=>er(!0),children:[(0,l.jsx)(r.default,{name:"content_copy",className:"text-[14px] mr-1"}),"Manual Config"]})]})]})]}),J&&(0,l.jsx)(i.rq,{isOpen:J,onClose:()=>V(!1),onSelect:e=>{G&&c(G,e.value)},selectedModel:G?o[G]:null,activeProviders:n,modelAliases:es,title:`Select model for ${G}`}),(0,l.jsx)(i.uR,{isOpen:el,onClose:()=>er(!1),title:"Claude CLI - Manual Configuration",configs:(S=Q&&Q.trim()?Q:y?"<API_KEY_FROM_DASHBOARD>":"sk_10router",E={ANTHROPIC_BASE_URL:ev(),ANTHROPIC_AUTH_TOKEN:S},e.defaultModels.forEach(e=>{let s=o[e.alias];s&&e.envKey&&(E[e.envKey]=s)}),em&&(E.CLAUDE_CODE_AUTO_COMPACT_WINDOW=em),[{filename:"~/.claude/settings.json",content:JSON.stringify({hasCompletedOnboarding:!0,env:E},null,2)}])})]})})}function Z({tool:e,isExpanded:s,onToggle:t,baseUrl:n,apiKeys:o,activeProviders:c,cloudEnabled:m,initialStatus:x,tunnelEnabled:p,tunnelPublicUrl:f,tailscaleEnabled:b,tailscaleUrl:y}){let v,N,w,[k,C]=(0,a.useState)(x||null),[_,S]=(0,a.useState)(!1),[E,A]=(0,a.useState)(!1),[$,M]=(0,a.useState)(!1),[O,P]=(0,a.useState)(null),[R,z]=(0,a.useState)(!1),[T,L]=(0,a.useState)(""),[D,H]=(0,a.useState)([]),[F,q]=(0,a.useState)(""),[B,Y]=(0,a.useState)(!1),[J,V]=(0,a.useState)(!1),[G,X]=(0,a.useState)({}),[Q,ee]=(0,a.useState)(!1),[es,et]=(0,a.useState)("");(0,a.useEffect)(()=>{o?.length>0&&!T&&L(o[0].key)},[o,T]),(0,a.useEffect)(()=>{x&&C(x)},[x]),(0,a.useEffect)(()=>{s&&(k||eo(),el())},[s]);let el=async()=>{try{let e=await fetch("/api/models/alias"),s=await e.json();e.ok&&X(s.aliases||{})}catch(e){console.log("Error fetching model aliases:",e)}};(0,a.useEffect)(()=>{if(k?.profiles&&H(k.profiles.map(e=>e.model).filter(Boolean)),k?.config){let e=k.config.match(/^default_subagent_model\s*=\s*"([^"]+)"/m);e&&q(e[1])}},[k]);let er=(v=k?.config?.match(/base_url\s*=\s*"([^"]+)"/))?v[1]:"",ea=k?.installed?k.config?W(er,{tunnelPublicUrl:f,tailscaleUrl:y})?"configured":"other":"not_configured":null,en=()=>{let e=es||`${n}/v1`;return e.endsWith("/v1")?e:`${e}/v1`},eo=async()=>{S(!0);try{let e=await fetch("/api/cli-tools/codex-settings"),s=await e.json();C(s)}catch(e){C({installed:!1,error:e.message})}finally{S(!1)}},ei=async()=>{A(!0),P(null);try{let e=T&&T.trim()||m?T:"sk_10router",s=await fetch("/api/cli-tools/codex-settings",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({baseUrl:en(),apiKey:e,models:D,subagentModel:F})}),t=await s.json();s.ok?(U(en(),{tunnelPublicUrl:f,tailscaleUrl:y}),P({type:"success",text:"Applied — models appear in codex /model. Account default kept; use codex --profile 10router-<model> for 10Router routing."}),eo()):P({type:"error",text:t.error||"Failed to apply settings"})}catch(e){P({type:"error",text:e.message})}finally{A(!1)}},ed=async()=>{M(!0),P(null);try{let e=await fetch("/api/cli-tools/codex-settings",{method:"DELETE"}),s=await e.json();e.ok?(P({type:"success",text:"Settings reset successfully!"}),H([]),q(""),eo()):P({type:"error",text:s.error||"Failed to reset settings"})}catch(e){P({type:"error",text:e.message})}finally{M(!1)}};return(0,l.jsx)(u.Zp,{size:"sm",className:"overflow-hidden",children:(0,l.jsxs)(u.Wu,{children:[(0,l.jsx)("div",{className:"flex items-start justify-between gap-3 hover:cursor-pointer sm:items-center",onClick:t,children:(0,l.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,l.jsx)("div",{className:"size-8 flex items-center justify-center shrink-0",children:(0,l.jsx)(j.default,{src:"/providers/codex.png",alt:e.name,width:32,height:32,className:"size-8 object-contain rounded-lg",sizes:"32px",onError:e=>{e.target.style.display="none"},loading:"lazy",decoding:"async"})}),(0,l.jsxs)("div",{className:"min-w-0",children:[(0,l.jsxs)("div",{className:"flex min-w-0 flex-wrap items-center gap-2",children:[(0,l.jsx)("h3",{className:"font-medium text-sm",children:e.name}),"configured"===ea&&(0,l.jsx)("span",{className:"px-1.5 py-0.5 text-[10px] font-medium bg-green-500/10 text-green-600 dark:text-green-400 rounded-full",children:"Connected"}),"not_configured"===ea&&(0,l.jsx)("span",{className:"px-1.5 py-0.5 text-[10px] font-medium bg-yellow-500/10 text-yellow-600 dark:text-yellow-400 rounded-full",children:"Not configured"}),"other"===ea&&(0,l.jsx)("span",{className:"px-1.5 py-0.5 text-[10px] font-medium bg-blue-500/10 text-blue-600 dark:text-blue-400 rounded-full",children:"Other"})]}),(0,l.jsx)("p",{className:"text-xs text-muted-foreground truncate",children:e.description})]})]})}),s&&(0,l.jsxs)("div",{className:"mt-4 pt-4 border-t border-border flex flex-col gap-4",children:[_&&(0,l.jsxs)("div",{className:"flex items-center gap-2 text-muted-foreground",children:[(0,l.jsx)(r.default,{name:"progress_activity",className:"animate-spin"}),(0,l.jsx)("span",{children:"Checking Codex CLI..."})]}),!_&&k&&!k.installed&&(0,l.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,l.jsxs)("div",{className:"flex flex-col gap-3 p-4 bg-yellow-500/10 border border-yellow-500/30 rounded-lg",children:[(0,l.jsxs)("div",{className:"flex items-start gap-3",children:[(0,l.jsx)(r.default,{name:"warning",className:"text-yellow-500"}),(0,l.jsxs)("div",{className:"flex-1",children:[(0,l.jsx)("p",{className:"font-medium text-yellow-600 dark:text-yellow-400",children:k.container?"10Router runs in a container":"Codex CLI not detected locally"}),(0,l.jsx)("p",{className:"text-sm text-muted-foreground",children:k.container?"The CLI lives on your host, not inside the container. Copy the manual config below into your host's ~/.codex/config.toml.":"Manual configuration is still available if 10router is deployed on a remote server."})]})]}),(0,l.jsxs)("div",{className:"flex items-center gap-2 pl-9",children:[(0,l.jsxs)(d.$,{variant:"secondary",size:"sm",onClick:()=>ee(!0),className:"!bg-yellow-500/20 !border-yellow-500/40 !text-yellow-700 dark:!text-yellow-300 hover:!bg-yellow-500/30",children:[(0,l.jsx)(r.default,{name:"content_copy",className:"text-[18px] mr-1"}),"Manual Config"]}),(0,l.jsxs)(d.$,{variant:"outline",size:"sm",onClick:()=>z(!R),children:[(0,l.jsx)(r.default,{name:R?"expand_less":"help",className:"text-[18px] mr-1"}),R?"Hide":"How to Install"]})]})]}),R&&(0,l.jsxs)("div",{className:"p-4 bg-card border border-border rounded-lg",children:[(0,l.jsx)("h4",{className:"font-medium mb-3",children:"Installation Guide"}),(0,l.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("p",{className:"text-muted-foreground mb-1",children:"macOS / Linux / Windows:"}),(0,l.jsx)("code",{className:"block px-3 py-2 bg-black/5 dark:bg-white/5 rounded font-mono text-xs",children:"npm install -g @openai/codex"})]}),(0,l.jsxs)("p",{className:"text-muted-foreground",children:["After installation, run"," ",(0,l.jsx)("code",{className:"px-1 bg-black/5 dark:bg-white/5 rounded",children:"codex"})," to verify."]}),(0,l.jsx)("div",{className:"pt-2 border-t border-border",children:(0,l.jsxs)("p",{className:"text-muted-foreground text-xs",children:["Codex reads custom providers from"," ",(0,l.jsx)("code",{className:"px-1 bg-black/5 dark:bg-white/5 rounded",children:"~/.codex/config.toml"}),'. Click "Apply" to auto-configure.']})})]})]})]}),!_&&k?.installed&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)("div",{className:"flex flex-col gap-2",children:[k?.rootHijacked&&(0,l.jsxs)("div",{className:"flex items-start gap-2 px-2 py-1.5 rounded text-xs bg-yellow-500/10 text-yellow-600 dark:text-yellow-400",children:[(0,l.jsx)(r.default,{name:"warning",className:"text-[14px] shrink-0 mt-0.5"}),(0,l.jsx)("span",{children:"Old settings overrode your default Codex model. Apply to restore your ChatGPT account default — added models become profiles."})]}),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"Select Endpoint"}),(0,l.jsx)(I,{value:es||es||`${n}/v1`,onChange:et,requiresExternalUrl:e.requiresExternalUrl,tunnelEnabled:p,tunnelPublicUrl:f,tailscaleEnabled:b,tailscaleUrl:y,currentUrl:er})]}),k?.config&&(er?(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr_auto] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"Current"}),(0,l.jsx)("span",{className:"min-w-0 truncate rounded bg-card/40 px-2 py-2 text-xs text-muted-foreground sm:py-1.5",children:er})]}):null),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr_auto] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"API Key"}),(0,l.jsx)(K,{value:T,onChange:L,apiKeys:o,cloudEnabled:m})]}),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr] sm:items-start sm:gap-2",children:[(0,l.jsx)("span",{className:"pt-1 text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"Models"}),(0,l.jsxs)("div",{className:"flex min-w-0 flex-1 flex-col gap-2",children:[(0,l.jsx)("div",{className:"flex min-h-7 flex-wrap gap-1.5 rounded border border-border bg-card px-2 py-1.5",children:0===D.length?(0,l.jsx)("span",{className:"text-xs text-muted-foreground",children:"No models added"}):D.map(e=>(0,l.jsxs)("span",{className:"inline-flex items-center gap-1 rounded border border-transparent bg-black/5 px-2 py-0.5 text-xs text-muted-foreground hover:border-border dark:bg-white/5",children:[e,(0,l.jsxs)(h.m_,{children:[(0,l.jsx)(h.k$,{asChild:!0,children:(0,l.jsx)("button",{onClick:()=>H(D.filter(s=>s!==e)),className:"ml-0.5 hover:text-red-500",children:(0,l.jsx)(r.default,{name:"close",className:"text-[12px]"})})}),(0,l.jsx)(h.ZI,{children:"Remove"})]})]},e))}),(0,l.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,l.jsx)("button",{onClick:()=>Y(!0),className:"cursor-pointer rounded border border-border bg-card px-2 py-1 text-xs text-foreground transition-colors hover:border-primary",children:"Add Model"}),(0,l.jsxs)("span",{className:"text-xs text-muted-foreground",children:["Launch:"," ",(0,l.jsx)("code",{className:"rounded bg-black/5 px-1 dark:bg-white/5",children:"codex --profile 10router-<model>"})]})]})]})]}),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[8rem_1fr_auto] sm:items-center sm:gap-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-foreground sm:text-right sm:text-sm",children:"Subagent Model"}),(0,l.jsxs)("div",{className:"relative w-full min-w-0",children:[(0,l.jsx)("input",{type:"text",value:F,onChange:e=>q(e.target.value),placeholder:D[0]||"provider/model-id (defaults to main model)",className:"w-full min-w-0 pl-2 pr-7 py-2 bg-card rounded border border-border text-xs focus:outline-none focus:ring-1 focus:ring-primary/50 sm:py-1.5"}),F&&(0,l.jsxs)(h.m_,{children:[(0,l.jsx)(h.k$,{asChild:!0,children:(0,l.jsx)("button",{onClick:()=>q(""),className:"absolute right-1 top-1/2 -translate-y-1/2 p-0.5 text-muted-foreground hover:text-red-500 rounded transition-colors",children:(0,l.jsx)(r.default,{name:"close",className:"text-[14px]"})})}),(0,l.jsx)(h.ZI,{children:"Clear (will use main model)"})]})]}),(0,l.jsx)("button",{onClick:()=>V(!0),className:"w-full sm:w-auto rounded border px-2 py-2 text-xs transition-colors sm:py-1.5 whitespace-nowrap sm:shrink-0 bg-card border-border text-foreground hover:border-primary cursor-pointer",children:"Select Model"})]})]}),O&&(0,l.jsxs)("div",{className:`flex items-center gap-2 px-2 py-1.5 rounded text-xs ${"success"===O.type?"bg-green-500/10 text-green-600":"bg-red-500/10 text-red-600"}`,children:[(0,l.jsx)(r.default,{name:"success"===O.type?"check_circle":"error",className:"text-[14px]"}),(0,l.jsx)("span",{children:O.text})]}),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-2 sm:flex sm:items-center",children:[(0,l.jsxs)(d.$,{size:"sm",onClick:ei,disabled:!T&&m&&o.length>0||0===D.length||E,children:[E&&(0,l.jsx)(g.A,{className:"size-4 animate-spin"}),(0,l.jsx)(r.default,{name:"save",className:"text-[14px] mr-1"}),"Apply"]}),(0,l.jsxs)(d.$,{variant:"outline",size:"sm",onClick:ed,disabled:$,children:[$&&(0,l.jsx)(g.A,{className:"size-4 animate-spin"}),(0,l.jsx)(r.default,{name:"restore",className:"text-[14px] mr-1"}),"Reset"]}),(0,l.jsxs)(d.$,{variant:"ghost",size:"sm",onClick:()=>ee(!0),children:[(0,l.jsx)(r.default,{name:"content_copy",className:"text-[14px] mr-1"}),"Manual Config"]})]})]})]}),B&&(0,l.jsx)(i.rq,{isOpen:B,onClose:()=>Y(!1),onSelect:e=>{D.includes(e.value)||H([...D,e.value])},onDeselect:e=>{H(D.filter(s=>s!==e.value))},selectedModel:null,addedModelValues:D,closeOnSelect:!1,title:"Add Models for Codex",activeProviders:c,modelAliases:G}),J&&(0,l.jsx)(i.rq,{isOpen:J,onClose:()=>V(!1),onSelect:e=>{q(e.value),V(!1)},selectedModel:F,activeProviders:c,modelAliases:G,title:"Select Subagent Model for Codex"}),(0,l.jsx)(i.uR,{isOpen:Q,onClose:()=>ee(!1),title:"Codex CLI - Manual Configuration",configs:(N=T&&T.trim()?T:m?"<API_KEY_FROM_DASHBOARD>":"sk_10router",w=[{filename:"~/.codex/config.toml",content:`# 10Router Configuration for Codex CLI
2
2
  # Default model/provider stay on your ChatGPT account — only the provider
3
3
  # definition below is added. Selected models are merged into
4
4
  # model_catalog_json (~/.codex/10router-model-catalog.json) so they show in
@@ -37,4 +37,4 @@ ${w}
37
37
  config:
38
38
  provider: 10router
39
39
  model: ${F||D[0]||"provider/model-id"}
40
- `},{filename:"~/.dsh/.credentials.yaml (add ref)",content:`refs: { TEN_ROUTER_API_KEY: ${N} }`}])})]})})}t(56590);let ea=t(65746).env.NEXT_PUBLIC_CLOUD_URL;function en({toolId:e,machineId:s}){let t=m.d[e],[n,u]=(0,a.useState)([]),[p,h]=(0,a.useState)(!0),[g,f]=(0,a.useState)({}),[j,b]=(0,a.useState)(!1),[y,v]=(0,a.useState)(!1),[N,w]=(0,a.useState)(""),[k,C]=(0,a.useState)(!1),[_,S]=(0,a.useState)(""),[E,A]=(0,a.useState)([]);(0,a.useEffect)(()=>{let e=!0;return(async()=>{try{let[s,t,l,r]=await Promise.all([fetch("/api/providers"),fetch("/api/settings"),fetch("/api/tunnel/status"),fetch("/api/keys")]);if(!e)return;if(s.ok){let e=await s.json();u(e.connections||[])}if(t.ok){let e=await t.json();b(e.cloudEnabled||!1)}if(l.ok){let e=await l.json();v(!!(e.tunnel?.enabled||e.tunnel?.settingsEnabled)),w(e.tunnel?.publicUrl||""),C(!!(e.tailscale?.enabled||e.tailscale?.settingsEnabled)),S(e.tailscale?.tunnelUrl||"")}if(r.ok){let e=await r.json();A(e.keys||[])}}catch(e){console.log("Error loading tool data:",e)}finally{e&&h(!1)}})(),()=>{e=!1}},[]);let $=()=>n.filter(e=>!1!==e.isActive),M=(0,a.useCallback)((e,s,t)=>{f(l=>l[e]?.[s]===t?l:{...l,[e]:{...l[e],[s]:t}})},[]);return t?(0,l.jsxs)(i.YW,{children:[(0,l.jsxs)("div",{children:[(0,l.jsx)(d.$,{variant:"outline",size:"sm",asChild:!0,className:"mb-4 self-start",children:(0,l.jsxs)(o(),{href:"/dashboard/cli-tools",children:[(0,l.jsx)(r.default,{name:"arrow_back",className:"text-lg"}),"CLI Tools"]})}),(0,l.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:gap-4",children:[(0,l.jsx)("div",{className:"size-12 rounded-lg flex items-center justify-center shrink-0",style:{backgroundColor:`${t.color}15`},children:(0,l.jsx)(c.A,{src:t.image,alt:t.name,size:48,className:"object-contain rounded-lg max-w-[48px] max-h-[48px]",fallbackText:t.name.slice(0,2).toUpperCase(),fallbackColor:t.color})}),(0,l.jsxs)("div",{className:"flex-1",children:[(0,l.jsx)("h1",{className:"text-2xl font-semibold tracking-tight sm:text-3xl",children:t.name}),(0,l.jsx)("p",{className:"text-sm text-muted-foreground mt-1",children:t.description})]})]})]}),p?(0,l.jsx)(i.KX,{}):(()=>{let s,r,a,n=(s=$(),r=[],a=new Set,s.forEach(e=>{let s=x.Xg[e.provider]||e.provider,t=(0,x.KC)(e.provider);if(t.forEach(t=>{let l=`${s}/${t.id}`;a.has(l)||(a.add(l),r.push({value:l,label:`${s}/${t.id}`,provider:e.provider,alias:s,connectionName:e.name,modelId:t.id}))}),0===t.length){let t=e.providerSpecificData?.prefix||s,l=[];e.defaultModel&&l.push({id:e.defaultModel,name:e.defaultModel}),(e.providerSpecificData?.customModels||[]).forEach(e=>{e?.id&&!l.some(s=>s.id===e.id)&&l.push({id:e.id,name:e.name||e.id})}),0===l.length&&"active"===e.testStatus&&l.push({id:"model-id",name:`${t}/model-id`}),l.forEach(s=>{let l=`${t}/${s.id}`;a.has(l)||(a.add(l),r.push({value:l,label:`${t}/${s.id}`,provider:e.provider,alias:t,connectionName:e.name,modelId:s.id}))})}}),r).length>0,o={tool:t,isExpanded:!0,onToggle:()=>{},baseUrl:y&&N?N:j&&ea?ea:window.location.origin,apiKeys:E,tunnelEnabled:y,tunnelPublicUrl:N,tailscaleEnabled:k,tailscaleUrl:_};switch(e){case"claude":return(0,l.jsx)(B,{...o,activeProviders:$(),modelMappings:g[e]||{},onModelMappingChange:(s,t)=>M(e,s,t),hasActiveProviders:n,cloudEnabled:j});case"codex":return(0,l.jsx)(Z,{...o,activeProviders:$(),cloudEnabled:j});case"opencode":return(0,l.jsx)(G,{...o,activeProviders:$(),cloudEnabled:j});case"cowork":return(0,l.jsx)(es,{...o,activeProviders:$(),hasActiveProviders:n,cloudEnabled:j,cloudUrl:ea,tunnelEnabled:y,tunnelPublicUrl:N,tailscaleEnabled:k,tailscaleUrl:_});case"dsh":return(0,l.jsx)(er,{...o,activeProviders:$(),cloudEnabled:j});default:return(0,l.jsx)(V,{toolId:e,...o,activeProviders:$(),cloudEnabled:j,tunnelEnabled:y})}})()]}):(0,l.jsxs)(i.YW,{children:[(0,l.jsx)(d.$,{variant:"outline",size:"sm",asChild:!0,className:"self-start",children:(0,l.jsxs)(o(),{href:"/dashboard/cli-tools",children:[(0,l.jsx)(r.default,{name:"arrow_back",className:"text-lg"}),"CLI Tools"]})}),(0,l.jsx)("p",{className:"text-sm text-muted-foreground",children:"Tool not found or disabled."})]})}},56590:(e,s,t)=>{"use strict";t.d(s,{A:()=>i});var l=t(29798),r=t(53784),a=t(22205),n=t(738);let o={ok:"bg-green-500",warn:"bg-amber-500",info:"bg-blue-500",muted:"bg-muted-foreground/50"};function i({toolId:e,tool:s,status:t}){let d=s?.configType==="guide"?{label:"Guide",tone:"info"}:t?t.container&&null==t.installed?{label:"Manual setup",tone:"info"}:t.installed?t.has10Router?{label:"Connected",tone:"ok"}:{label:"Not configured",tone:"warn"}:{label:"Not installed",tone:"muted"}:{label:"Unknown",tone:"muted"};return(0,l.jsx)(a.default,{href:`/dashboard/cli-tools/${e}`,title:s.name,iconBg:s.color?`${s.color}15`:void 0,icon:(0,l.jsx)(n.A,{src:s.image,alt:s.name,size:30,className:"max-h-[30px] max-w-[30px] rounded-lg object-contain",fallbackText:s.name.slice(0,2).toUpperCase(),fallbackColor:s.color}),children:(0,l.jsxs)(r.E,{variant:"default",children:[(0,l.jsx)("span",{className:`size-1.5 rounded-full ${o[d.tone]}`}),d.label]})})}},92412:(e,s,t)=>{"use strict";t.d(s,{YW:()=>l.Page,pV:()=>l.CardGrid,wn:()=>l.Section,zY:()=>l.PageHeader}),t(16675),t(72778);var l=t(29575)}},e=>{e.O(0,[6766,5166,7552,9980,1471,5778,4484,3577,5862,5113,3153,7276,1722,159,4489,1278,1830,208,427,9966,7358],()=>e(e.s=2032)),_N_E=e.O()}]);
40
+ `},{filename:"~/.dsh/.credentials.yaml (add ref)",content:`refs: { TEN_ROUTER_API_KEY: ${N} }`}])})]})})}t(56590);let ea=t(65746).env.NEXT_PUBLIC_CLOUD_URL;function en({toolId:e,machineId:s}){let t=m.d[e],[n,u]=(0,a.useState)([]),[p,h]=(0,a.useState)(!0),[g,f]=(0,a.useState)({}),[j,b]=(0,a.useState)(!1),[y,v]=(0,a.useState)(!1),[N,w]=(0,a.useState)(""),[k,C]=(0,a.useState)(!1),[_,S]=(0,a.useState)(""),[E,A]=(0,a.useState)([]);(0,a.useEffect)(()=>{let e=!0;return(async()=>{try{let[s,t,l,r]=await Promise.all([fetch("/api/providers"),fetch("/api/settings"),fetch("/api/tunnel/status"),fetch("/api/keys")]);if(!e)return;if(s.ok){let e=await s.json();u(e.connections||[])}if(t.ok){let e=await t.json();b(e.cloudEnabled||!1)}if(l.ok){let e=await l.json();v(!!(e.tunnel?.enabled||e.tunnel?.settingsEnabled)),w(e.tunnel?.publicUrl||""),C(!!(e.tailscale?.enabled||e.tailscale?.settingsEnabled)),S(e.tailscale?.tunnelUrl||"")}if(r.ok){let e=await r.json();A(e.keys||[])}}catch(e){console.log("Error loading tool data:",e)}finally{e&&h(!1)}})(),()=>{e=!1}},[]);let $=()=>n.filter(e=>!1!==e.isActive),M=(0,a.useCallback)((e,s,t)=>{f(l=>l[e]?.[s]===t?l:{...l,[e]:{...l[e],[s]:t}})},[]);return t?(0,l.jsxs)(i.YW,{children:[(0,l.jsxs)("div",{children:[(0,l.jsx)(d.$,{variant:"outline",size:"sm",asChild:!0,className:"mb-4 self-start",children:(0,l.jsxs)(o(),{href:"/dashboard/cli-tools",children:[(0,l.jsx)(r.default,{name:"arrow_back",className:"text-lg"}),"CLI Tools"]})}),(0,l.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:gap-4",children:[(0,l.jsx)("div",{className:"size-12 rounded-lg flex items-center justify-center shrink-0",style:{backgroundColor:`${t.color}15`},children:(0,l.jsx)(c.A,{src:t.image,alt:t.name,size:48,className:"object-contain rounded-lg max-w-[48px] max-h-[48px]",fallbackText:t.name.slice(0,2).toUpperCase(),fallbackColor:t.color})}),(0,l.jsxs)("div",{className:"flex-1",children:[(0,l.jsx)("h1",{className:"text-2xl font-semibold tracking-tight sm:text-3xl",children:t.name}),(0,l.jsx)("p",{className:"text-sm text-muted-foreground mt-1",children:t.description})]})]})]}),p?(0,l.jsx)(i.KX,{}):(()=>{let s,r,a,n=(s=$(),r=[],a=new Set,s.forEach(e=>{let s=x.Xg[e.provider]||e.provider,t=(0,x.KC)(e.provider);if(t.forEach(t=>{let l=`${s}/${t.id}`;a.has(l)||(a.add(l),r.push({value:l,label:`${s}/${t.id}`,provider:e.provider,alias:s,connectionName:e.name,modelId:t.id}))}),0===t.length){let t=e.providerSpecificData?.prefix||s,l=[];e.defaultModel&&l.push({id:e.defaultModel,name:e.defaultModel}),(e.providerSpecificData?.customModels||[]).forEach(e=>{e?.id&&!l.some(s=>s.id===e.id)&&l.push({id:e.id,name:e.name||e.id})}),0===l.length&&"active"===e.testStatus&&l.push({id:"model-id",name:`${t}/model-id`}),l.forEach(s=>{let l=`${t}/${s.id}`;a.has(l)||(a.add(l),r.push({value:l,label:`${t}/${s.id}`,provider:e.provider,alias:t,connectionName:e.name,modelId:s.id}))})}}),r).length>0,o={tool:t,isExpanded:!0,onToggle:()=>{},baseUrl:y&&N?N:j&&ea?ea:window.location.origin,apiKeys:E,tunnelEnabled:y,tunnelPublicUrl:N,tailscaleEnabled:k,tailscaleUrl:_};switch(e){case"claude":return(0,l.jsx)(B,{...o,activeProviders:$(),modelMappings:g[e]||{},onModelMappingChange:(s,t)=>M(e,s,t),hasActiveProviders:n,cloudEnabled:j});case"codex":return(0,l.jsx)(Z,{...o,activeProviders:$(),cloudEnabled:j});case"opencode":return(0,l.jsx)(G,{...o,activeProviders:$(),cloudEnabled:j});case"cowork":return(0,l.jsx)(es,{...o,activeProviders:$(),hasActiveProviders:n,cloudEnabled:j,cloudUrl:ea,tunnelEnabled:y,tunnelPublicUrl:N,tailscaleEnabled:k,tailscaleUrl:_});case"dsh":return(0,l.jsx)(er,{...o,activeProviders:$(),cloudEnabled:j});default:return(0,l.jsx)(V,{toolId:e,...o,activeProviders:$(),cloudEnabled:j,tunnelEnabled:y})}})()]}):(0,l.jsxs)(i.YW,{children:[(0,l.jsx)(d.$,{variant:"outline",size:"sm",asChild:!0,className:"self-start",children:(0,l.jsxs)(o(),{href:"/dashboard/cli-tools",children:[(0,l.jsx)(r.default,{name:"arrow_back",className:"text-lg"}),"CLI Tools"]})}),(0,l.jsx)("p",{className:"text-sm text-muted-foreground",children:"Tool not found or disabled."})]})}},56590:(e,s,t)=>{"use strict";t.d(s,{A:()=>i});var l=t(29798),r=t(53784),a=t(22205),n=t(738);let o={ok:"bg-green-500",warn:"bg-amber-500",info:"bg-blue-500",muted:"bg-muted-foreground/50"};function i({toolId:e,tool:s,status:t}){let d=s?.configType==="guide"?{label:"Guide",tone:"info"}:t?t.container&&null==t.installed?{label:"Manual setup",tone:"info"}:t.installed?t.has10Router?{label:"Connected",tone:"ok"}:{label:"Not configured",tone:"warn"}:{label:"Not installed",tone:"muted"}:{label:"Unknown",tone:"muted"};return(0,l.jsx)(a.default,{href:`/dashboard/cli-tools/${e}`,title:s.name,iconBg:s.color?`${s.color}15`:void 0,icon:(0,l.jsx)(n.A,{src:s.image,alt:s.name,size:30,className:"max-h-[30px] max-w-[30px] rounded-lg object-contain",fallbackText:s.name.slice(0,2).toUpperCase(),fallbackColor:s.color}),children:(0,l.jsxs)(r.E,{variant:"default",children:[(0,l.jsx)("span",{className:`size-1.5 rounded-full ${o[d.tone]}`}),d.label]})})}},92412:(e,s,t)=>{"use strict";t.d(s,{YW:()=>l.Page,pV:()=>l.CardGrid,wn:()=>l.Section,zY:()=>l.PageHeader}),t(16675),t(72778);var l=t(29575)}},e=>{e.O(0,[6766,5166,7552,9980,1471,5778,4484,3577,5862,5113,1699,7276,1722,159,4489,1278,1830,208,427,9966,7358],()=>e(e.s=7006)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2326],{2809:(e,t,a)=>{Promise.resolve().then(a.bind(a,24324))},15764:(e,t,a)=>{"use strict";a.d(t,{CK:()=>d.default,G9:()=>c.default,Iz:()=>j.default,KX:()=>x.PanelSkeleton,LF:()=>n.default,LH:()=>f.default,Mu:()=>x.StatCardSkeleton,Nf:()=>i.default,Qv:()=>o.CardSkeleton,YW:()=>k.YW,gw:()=>h.default,jK:()=>u.default,nh:()=>g.default,pV:()=>k.pV,rq:()=>s.default,uR:()=>r.default,uo:()=>l.ConfirmModal,vE:()=>b.default,vj:()=>p.default,wI:()=>v.default,wn:()=>k.wn,zY:()=>k.zY}),a(58913);var l=a(3537),o=a(58350);a(30872),a(33526),a(42535),a(1279);var n=a(92802),s=a(25908),r=a(58729),d=a(24873),i=a(5258),u=a(4165);a(949),a(56776),a(53599),a(88336),a(69561);var c=a(37753),f=a(23444),b=a(93624),p=a(86920),v=a(65461);a(14580);var h=a(14670),j=a(70296);a(57779),a(22205);var x=a(43276),g=a(75862),k=a(92412)},24324:(e,t,a)=>{"use strict";a.d(t,{default:()=>d});var l=a(29798),o=a(15814),n=a(15764),s=a(90046),r=a(56590);function d({machineId:e}){let[t,a]=(0,o.useState)(!0),[i,u]=(0,o.useState)({});if((0,o.useEffect)(()=>{let e=!0;return(async()=>{try{let t=await fetch("/api/cli-tools/all-statuses");t.ok&&e&&u(await t.json())}catch(e){console.log("Error fetching tool statuses:",e)}finally{e&&a(!1)}})(),()=>{e=!1}},[]),t)return(0,l.jsxs)(n.YW,{children:[(0,l.jsx)(n.zY,{title:"CLI Tools",description:"Connect coding assistants to 10Router — point each tool at your local endpoint.",backHref:"/dashboard/providers",backLabel:"Providers"}),(0,l.jsxs)(n.pV,{children:[(0,l.jsx)(n.Qv,{}),(0,l.jsx)(n.Qv,{}),(0,l.jsx)(n.Qv,{}),(0,l.jsx)(n.Qv,{}),(0,l.jsx)(n.Qv,{}),(0,l.jsx)(n.Qv,{})]})]});let c=Object.entries(s.d);return(0,l.jsxs)(n.YW,{children:[(0,l.jsx)(n.zY,{title:"CLI Tools",description:"Connect coding assistants to 10Router — point each tool at your local endpoint.",backHref:"/dashboard/providers",backLabel:"Providers"}),(0,l.jsx)(n.pV,{children:c.map(([e,t])=>(0,l.jsx)(r.A,{toolId:e,tool:t,status:i[e]},e))})]})}},56590:(e,t,a)=>{"use strict";a.d(t,{A:()=>d});var l=a(29798),o=a(53784),n=a(22205),s=a(738);let r={ok:"bg-green-500",warn:"bg-amber-500",info:"bg-blue-500",muted:"bg-muted-foreground/50"};function d({toolId:e,tool:t,status:a}){let i=t?.configType==="guide"?{label:"Guide",tone:"info"}:a?a.container&&null==a.installed?{label:"Manual setup",tone:"info"}:a.installed?a.has10Router?{label:"Connected",tone:"ok"}:{label:"Not configured",tone:"warn"}:{label:"Not installed",tone:"muted"}:{label:"Unknown",tone:"muted"};return(0,l.jsx)(n.default,{href:`/dashboard/cli-tools/${e}`,title:t.name,iconBg:t.color?`${t.color}15`:void 0,icon:(0,l.jsx)(s.A,{src:t.image,alt:t.name,size:30,className:"max-h-[30px] max-w-[30px] rounded-lg object-contain",fallbackText:t.name.slice(0,2).toUpperCase(),fallbackColor:t.color}),children:(0,l.jsxs)(o.E,{variant:"default",children:[(0,l.jsx)("span",{className:`size-1.5 rounded-full ${r[i.tone]}`}),i.label]})})}},92412:(e,t,a)=>{"use strict";a.d(t,{YW:()=>l.Page,pV:()=>l.CardGrid,wn:()=>l.Section,zY:()=>l.PageHeader}),a(16675),a(72778);var l=a(29575)}},e=>{e.O(0,[6766,5166,7552,9980,1471,5778,4484,3577,5862,5113,1699,7276,1722,159,4489,1278,1830,208,427,9966,7358],()=>e(e.s=2809)),_N_E=e.O()}]);
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3649],{15764:(e,s,t)=>{"use strict";t.d(s,{CK:()=>i.default,G9:()=>m.default,Iz:()=>p.default,KX:()=>g.PanelSkeleton,LF:()=>a.default,LH:()=>x.default,Mu:()=>g.StatCardSkeleton,Nf:()=>d.default,Qv:()=>l.CardSkeleton,YW:()=>v.YW,gw:()=>f.default,jK:()=>c.default,nh:()=>b.default,pV:()=>v.pV,rq:()=>o.default,uR:()=>n.default,uo:()=>r.ConfirmModal,vE:()=>u.default,vj:()=>h.default,wI:()=>j.default,wn:()=>v.wn,zY:()=>v.zY}),t(58913);var r=t(3537),l=t(58350);t(30872),t(33526),t(42535),t(1279);var a=t(92802),o=t(25908),n=t(58729),i=t(24873),d=t(5258),c=t(4165);t(949),t(56776),t(53599),t(88336),t(69561);var m=t(37753),x=t(23444),u=t(93624),h=t(86920),j=t(65461);t(14580);var f=t(14670),p=t(70296);t(57779),t(22205);var g=t(43276),b=t(75862),v=t(92412)},29982:(e,s,t)=>{"use strict";t.r(s),t.d(s,{default:()=>A});var r=t(29798),l=t(15814),a=t(31872),o=t(59732),n=t(7155),i=t(70684),d=t(75669),c=t(18055),m=t(77345),x=t(1352),u=t(49787),h=t(45111),j=t(36395),f=t(10205),p=t(15054),g=t(6403),b=t(63587),v=t(76260),y=t(3308),k=t(75877),N=t(50860),w=t(1280),C=t(26339),S=t(15764),$=t(63523),z=t(90619);let E=/^[a-zA-Z0-9_.\-]+$/;function A(){let[e,s]=(0,l.useState)([]),[t,a]=(0,l.useState)(!0),[o,n]=(0,l.useState)(!1),[i,m]=(0,l.useState)(null),[x,h]=(0,l.useState)([]),[p,g]=(0,l.useState)({}),{getCaps:b}=(0,z.y)(),[v,y]=(0,l.useState)(null),{copied:k,copy:N}=(0,$.C)(),w=async()=>{try{let[e,t,r]=await Promise.all([fetch("/api/combos"),fetch("/api/providers"),fetch("/api/settings")]),l=await e.json(),a=await t.json(),o=r.ok?await r.json():{};e.ok&&s((l.combos||[]).filter(e=>!e.kind||"llm"===e.kind)),t.ok&&h(a.connections||[]),g(o.comboStrategies||{})}catch(e){console.log("Error fetching data:",e)}finally{a(!1)}};(0,l.useEffect)(()=>{w()},[]);let C=async e=>{try{let s=await fetch("/api/combos",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(s.ok)await w(),n(!1);else{let e=await s.json();alert(e.error||"Failed to create combo")}}catch(e){console.log("Error creating combo:",e)}},E=async(e,s)=>{try{let t=await fetch(`/api/combos/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});if(t.ok)await w(),m(null);else{let e=await t.json();alert(e.error||"Failed to update combo")}}catch(e){console.log("Error updating combo:",e)}},A=async(e,s)=>{try{let t={...p},r={...t[e]||{},...s};r.fallbackStrategy&&"fallback"!==r.fallbackStrategy?t[e]=r:delete t[e],await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({comboStrategies:t})}),g(t)}catch(e){console.log("Error updating combo strategy:",e)}};return t?(0,r.jsxs)(S.YW,{children:[(0,r.jsx)(S.KX,{}),(0,r.jsx)(S.KX,{})]}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(S.YW,{children:[(0,r.jsx)(S.zY,{title:"Combos",description:"Group models under one name, then pick a strategy per combo:",actions:(0,r.jsxs)(c.$,{onClick:()=>n(!0),className:"w-full whitespace-nowrap sm:w-auto",children:[(0,r.jsx)(j.A,{}),"Create Combo"]})}),(0,r.jsx)(S.wn,{children:(0,r.jsx)("div",{className:"min-w-0",children:(0,r.jsxs)("ul",{className:"text-sm text-muted-foreground flex flex-col gap-1",children:[(0,r.jsxs)("li",{children:[(0,r.jsx)("span",{className:"font-medium text-foreground",children:"Fallback"})," — tries models in order (next on failure)"]}),(0,r.jsxs)("li",{children:[(0,r.jsx)("span",{className:"font-medium text-foreground",children:"Round Robin"})," — rotates models across requests to spread load"]}),(0,r.jsxs)("li",{children:[(0,r.jsx)("span",{className:"font-medium text-foreground",children:"Fusion"})," — queries all models in parallel, then a judge synthesizes one answer. Best quality, but costs the most: every request bills all panel models + the judge (N+1 calls)"]})]})})}),(0,r.jsx)(S.wn,{children:0===e.length?(0,r.jsx)(d.Zp,{children:(0,r.jsxs)("div",{className:"py-12 text-center",children:[(0,r.jsx)("div",{className:"inline-flex items-center justify-center w-16 h-16 rounded-full bg-primary/10 text-primary mb-4",children:(0,r.jsx)(f.A,{className:"size-8"})}),(0,r.jsx)("p",{className:"text-foreground font-medium mb-1",children:"No combos yet"}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground mb-4",children:"Create model combos with fallback support"}),(0,r.jsxs)(c.$,{onClick:()=>n(!0),className:"w-full sm:w-auto",children:[(0,r.jsx)(j.A,{}),"Create Combo"]})]})}):(0,r.jsx)("div",{className:"flex flex-col gap-4",children:e.map(t=>(0,r.jsx)(_,{combo:t,getCaps:b,activeProviders:x,copied:k,onCopy:N,onEdit:()=>m(t),onDelete:()=>{var r;return r=t.id,void y({title:"Delete Combo",message:"Delete this combo?",onConfirm:async()=>{y(null);try{(await fetch(`/api/combos/${r}`,{method:"DELETE"})).ok&&s(e.filter(e=>e.id!==r))}catch(e){console.log("Error deleting combo:",e)}}})},strategy:p[t.name]||{},onSetStrategy:e=>A(t.name,e)},t.id))})})]}),o&&(0,r.jsx)(F,{isOpen:o,onClose:()=>n(!1),onSave:C,activeProviders:x},"create"),i&&(0,r.jsx)(F,{isOpen:!!i,combo:i,onClose:()=>m(null),onSave:e=>E(i.id,e),activeProviders:x},i.id),v&&(0,r.jsx)(u.lG,{open:!0,onOpenChange:e=>{e||y(null)},children:(0,r.jsxs)(u.Cf,{className:"max-w-sm",children:[(0,r.jsx)(u.c7,{children:(0,r.jsx)(u.L3,{children:v.title})}),(0,r.jsx)("p",{className:"p-4 text-sm text-muted-foreground",children:v.message}),(0,r.jsxs)(u.Es,{children:[(0,r.jsx)(c.$,{variant:"ghost",onClick:()=>y(null),children:"Cancel"}),(0,r.jsx)(c.$,{variant:"destructive",onClick:v.onConfirm,children:v.confirmText||"Confirm"})]})]})})]})}let M=[{value:"fallback",label:"Fallback — try in order"},{value:"round-robin",label:"Round Robin — rotate"},{value:"fusion",label:"Fusion — panel + judge"}];function _({combo:e,getCaps:s,activeProviders:t=[],copied:a,onCopy:o,onEdit:n,onDelete:i,strategy:m={},onSetStrategy:u}){let[j,N]=(0,l.useState)(!1),w=m.fallbackStrategy||"fallback",C=m.judgeModel||"";return(0,r.jsxs)(d.Zp,{size:"sm",className:"group",children:[(0,r.jsx)(d.Wu,{className:"min-w-0",children:(0,r.jsxs)("div",{className:"flex min-w-0 flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",children:[(0,r.jsxs)("div",{className:"flex min-w-0 flex-1 items-start gap-3 sm:items-center",children:[(0,r.jsx)("div",{className:"size-8 rounded-lg bg-primary/10 flex items-center justify-center shrink-0",children:(0,r.jsx)(f.A,{className:"size-4 text-primary"})}),(0,r.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,r.jsx)("code",{className:"block truncate font-mono text-sm font-medium",children:e.name}),(0,r.jsxs)("div",{className:"mt-1 flex min-w-0 flex-wrap items-center gap-1",children:[0===e.models.length?(0,r.jsx)("span",{className:"text-xs text-muted-foreground italic",children:"No models"}):e.models.slice(0,3).map((e,t)=>(0,r.jsxs)("code",{className:"inline-flex items-center gap-1 rounded bg-black/5 px-1.5 py-0.5 font-mono text-xs text-muted-foreground dark:bg-white/5",children:[(0,r.jsx)("span",{children:e}),(0,r.jsx)(S.nh,{caps:s?.(e)})]},t)),e.models.length>3&&(0,r.jsxs)("span",{className:"text-[10px] text-muted-foreground",children:["+",e.models.length-3," more"]})]}),"fusion"===w&&(0,r.jsxs)("div",{className:"mt-2 flex min-w-0 flex-wrap items-center gap-1.5",children:[(0,r.jsx)("span",{className:"text-[11px] font-medium text-muted-foreground",children:"Judge"}),(0,r.jsxs)(x.m_,{children:[(0,r.jsx)(x.k$,{asChild:!0,children:(0,r.jsxs)("button",{onClick:()=>N(!0),className:"inline-flex max-w-full items-center gap-1 rounded border border-dashed border-primary/40 px-1.5 py-0.5 font-mono text-[11px] text-primary hover:border-primary hover:bg-primary/5 transition-colors",children:[(0,r.jsx)(p.A,{className:"size-3.5"}),(0,r.jsx)("span",{className:"truncate",children:C||`Auto — ${e.models[0]||"first model"}`})]})}),(0,r.jsx)(x.ZI,{children:"Pick the model that fuses panel answers"})]}),C&&(0,r.jsxs)(x.m_,{children:[(0,r.jsx)(x.k$,{asChild:!0,children:(0,r.jsx)("button",{onClick:()=>u({judgeModel:""}),className:"p-0.5 rounded text-muted-foreground hover:text-red-500 hover:bg-red-500/10 transition-colors",children:(0,r.jsx)(g.A,{className:"size-3.5"})})}),(0,r.jsx)(x.ZI,{children:"Reset judge to Auto"})]})]})]})]}),(0,r.jsxs)("div",{className:"flex w-full flex-col gap-2 sm:w-auto sm:flex-row sm:items-center sm:gap-3 sm:shrink-0",children:[(0,r.jsx)("div",{className:"w-full sm:w-[200px]",children:(0,r.jsxs)(h.l6,{value:w,onValueChange:e=>u({fallbackStrategy:e}),children:[(0,r.jsx)(h.bq,{className:"py-1.5 text-xs",children:(0,r.jsx)(h.yv,{})}),(0,r.jsx)(h.gC,{children:M.map(e=>(0,r.jsx)(h.eb,{value:e.value,children:e.label},e.value))})]})}),(0,r.jsxs)("div",{className:"grid grid-cols-3 gap-1 sm:flex",children:[(0,r.jsxs)(x.m_,{children:[(0,r.jsx)(x.k$,{asChild:!0,children:(0,r.jsx)(c.$,{variant:"ghost",size:"icon-sm",onClick:s=>{s.stopPropagation(),o(e.name,`combo-${e.id}`)},"aria-label":"Copy combo name",children:a===`combo-${e.id}`?(0,r.jsx)(b.A,{}):(0,r.jsx)(v.A,{})})}),(0,r.jsx)(x.ZI,{children:"Copy combo name"})]}),(0,r.jsxs)(x.m_,{children:[(0,r.jsx)(x.k$,{asChild:!0,children:(0,r.jsx)(c.$,{variant:"ghost",size:"icon-sm",onClick:n,"aria-label":"Edit",children:(0,r.jsx)(y.A,{})})}),(0,r.jsx)(x.ZI,{children:"Edit"})]}),(0,r.jsxs)(x.m_,{children:[(0,r.jsx)(x.k$,{asChild:!0,children:(0,r.jsx)(c.$,{variant:"ghost",size:"icon-sm",onClick:i,"aria-label":"Delete",className:"text-red-500 hover:bg-red-500/10 hover:text-red-500",children:(0,r.jsx)(k.A,{})})}),(0,r.jsx)(x.ZI,{children:"Delete"})]})]})]})]})}),j&&(0,r.jsx)(S.rq,{isOpen:j,onClose:()=>N(!1),onSelect:e=>{u({judgeModel:e?.value||""}),N(!1)},activeProviders:t,title:"Select Judge Model",addedModelValues:C?[C]:[],closeOnSelect:!0})]})}function P({id:e,index:s,model:t,isFirst:a,isLast:i,onEdit:d,onMoveUp:c,onMoveDown:m,onRemove:u}){let{attributes:h,listeners:j,setNodeRef:f,transform:p,isDragging:b}=(0,o.gl)({id:e}),v={transform:n.Ks.Transform.toString(p),opacity:b?.4:1,zIndex:b?999:void 0},[y,k]=(0,l.useState)(!1),[S,$]=(0,l.useState)(t),z=()=>{let e=S.trim();e&&e!==t?d(e):$(t),k(!1)};return(0,r.jsxs)("div",{ref:f,style:v,className:`group flex min-w-0 items-center gap-1.5 rounded-md px-2 py-1 bg-black/[0.02] hover:bg-black/[0.04] dark:bg-white/[0.02] dark:hover:bg-white/[0.04] transition-colors ${b?"shadow-md ring-1 ring-primary/30":""}`,children:[(0,r.jsxs)(x.m_,{children:[(0,r.jsx)(x.k$,{asChild:!0,children:(0,r.jsx)("button",{...h,...j,type:"button",className:"cursor-grab touch-none p-0.5 rounded text-muted-foreground hover:text-primary active:cursor-grabbing shrink-0",children:(0,r.jsx)(N.A,{className:"size-4"})})}),(0,r.jsx)(x.ZI,{children:"Drag to reorder"})]}),(0,r.jsx)("span",{className:"text-[10px] font-medium text-muted-foreground w-3 text-center shrink-0",children:s+1}),y?(0,r.jsx)("input",{autoFocus:!0,value:S,onChange:e=>$(e.target.value),onBlur:z,onKeyDown:e=>{"Enter"===e.key&&z(),"Escape"===e.key&&($(t),k(!1))},className:"min-w-0 flex-1 rounded border border-primary/40 bg-white px-1.5 py-0.5 font-mono text-xs text-foreground outline-none dark:bg-black/20"}):(0,r.jsxs)(x.m_,{children:[(0,r.jsx)(x.k$,{asChild:!0,children:(0,r.jsx)("div",{className:"min-w-0 flex-1 cursor-text truncate rounded px-1.5 py-0.5 font-mono text-xs text-foreground hover:bg-black/5 dark:hover:bg-white/5",onClick:()=>k(!0),children:t})}),(0,r.jsx)(x.ZI,{children:"Click to edit"})]}),(0,r.jsxs)("div",{className:"flex shrink-0 items-center gap-0.5",children:[(0,r.jsxs)(x.m_,{children:[(0,r.jsx)(x.k$,{asChild:!0,children:(0,r.jsx)("button",{onClick:c,disabled:a,className:`p-0.5 rounded ${a?"text-muted-foreground/20 cursor-not-allowed":"text-muted-foreground hover:text-primary hover:bg-black/5 dark:hover:bg-white/5"}`,children:(0,r.jsx)(w.A,{className:"size-3"})})}),(0,r.jsx)(x.ZI,{children:"Move up"})]}),(0,r.jsxs)(x.m_,{children:[(0,r.jsx)(x.k$,{asChild:!0,children:(0,r.jsx)("button",{onClick:m,disabled:i,className:`p-0.5 rounded ${i?"text-muted-foreground/20 cursor-not-allowed":"text-muted-foreground hover:text-primary hover:bg-black/5 dark:hover:bg-white/5"}`,children:(0,r.jsx)(C.A,{className:"size-3"})})}),(0,r.jsx)(x.ZI,{children:"Move down"})]})]}),(0,r.jsxs)(x.m_,{children:[(0,r.jsx)(x.k$,{asChild:!0,children:(0,r.jsx)("button",{onClick:u,className:"p-0.5 hover:bg-red-500/10 rounded text-muted-foreground hover:text-red-500 transition-all",children:(0,r.jsx)(g.A,{className:"size-3"})})}),(0,r.jsx)(x.ZI,{children:"Remove"})]})]})}function F({isOpen:e,combo:s,onClose:t,onSave:n,activeProviders:d,kindFilter:x=null}){let[h,p]=(0,l.useState)(s?.name||""),[g,b]=(0,l.useState)(s?.models||[]),[v,y]=(0,l.useState)(!1),[k,N]=(0,l.useState)(!1),[w,C]=(0,l.useState)(""),[$,z]=(0,l.useState)({}),A=(0,a.FR)((0,a.MS)(a.AN,{activationConstraint:{distance:5}}),(0,a.MS)(a.uN,{coordinateGetter:o.JR})),M=g.map((e,s)=>({uid:`item-${s}`,model:e})),_=async()=>{try{let e=await fetch("/api/models/alias");if(!e.ok)return;let s=await e.json();z(s.aliases||{})}catch(e){console.error("Error fetching modal data:",e)}};(0,l.useEffect)(()=>{e&&_()},[e]);let O=e=>e.trim()?E.test(e)?(C(""),!0):(C("Only letters, numbers, -, _ and . allowed"),!1):(C("Name is required"),!1),I=async()=>{O(h)&&(N(!0),await n({name:h.trim(),models:g}),N(!1))},Z=!!s;return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(u.lG,{open:e,onOpenChange:e=>{e||t()},children:(0,r.jsxs)(u.Cf,{className:"max-w-md",children:[(0,r.jsx)(u.c7,{children:(0,r.jsx)(u.L3,{children:Z?"Edit Combo":"Create Combo"})}),(0,r.jsxs)("div",{className:"flex flex-col gap-3 p-4",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("label",{className:"text-sm font-medium text-foreground mb-1.5 block",children:"Combo Name"}),(0,r.jsx)(m.p,{value:h,onChange:e=>{let s=e.target.value;p(s),s?O(s):C("")},placeholder:"my-combo","aria-invalid":!!w,className:w?"ring-1 ring-red-500 border-red-500/40":""}),w&&(0,r.jsx)("p",{className:"mt-1 text-xs text-red-500",children:w}),(0,r.jsx)("p",{className:"text-[10px] text-muted-foreground mt-0.5",children:"Only letters, numbers, -, _ and . allowed"})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("label",{className:"text-sm font-medium mb-1.5 block",children:"Models"}),0===g.length?(0,r.jsxs)("div",{className:"text-center py-4 border border-dashed border-black/10 dark:border-white/10 rounded-lg bg-black/[0.01] dark:bg-white/[0.01]",children:[(0,r.jsx)(f.A,{className:"mb-1 mx-auto size-6 text-muted-foreground"}),(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"No models added yet"})]}):(0,r.jsx)(a.Mp,{sensors:A,collisionDetection:a.fp,onDragEnd:e=>{let{active:s,over:t}=e;if(t&&s.id!==t.id){let e=M.findIndex(e=>e.uid===s.id),r=M.findIndex(e=>e.uid===t.id);-1!==e&&-1!==r&&b(s=>(0,o.be)(s,e,r))}},modifiers:[i.FN,i.gj],children:(0,r.jsx)(o.gB,{items:M.map(e=>e.uid),strategy:o._G,children:(0,r.jsx)("div",{className:"flex max-h-[55vh] min-w-0 flex-col gap-1 overflow-y-auto sm:max-h-[350px]",children:M.map(({uid:e,model:s},t)=>(0,r.jsx)(P,{id:e,index:t,model:s,isFirst:0===t,isLast:t===M.length-1,onEdit:e=>{let s=[...g];s[t]=e,b(s)},onMoveUp:()=>(e=>{if(0===e)return;let s=[...g];[s[e-1],s[e]]=[s[e],s[e-1]],b(s)})(t),onMoveDown:()=>(e=>{if(e===g.length-1)return;let s=[...g];[s[e],s[e+1]]=[s[e+1],s[e]],b(s)})(t),onRemove:()=>{b(g.filter((e,s)=>s!==t))}},e))})})}),(0,r.jsxs)("button",{onClick:()=>y(!0),className:"w-full mt-2 py-2 border border-dashed border-black/10 dark:border-white/10 rounded-lg text-xs text-primary font-medium hover:text-primary hover:border-primary/50 transition-colors flex items-center justify-center gap-1",children:[(0,r.jsx)(j.A,{className:"size-4"}),"Add Model"]})]})]}),(0,r.jsx)(u.Es,{children:(0,r.jsx)("div",{className:"flex w-full flex-col gap-2 pt-1 sm:flex-row",children:(0,r.jsx)(c.$,{onClick:I,size:"sm",className:"flex-1",disabled:!h.trim()||!!w||k,children:k?"Saving...":Z?"Save":"Create"})})})]})}),v&&(0,r.jsx)(S.rq,{isOpen:v,onClose:()=>y(!1),onSelect:e=>{g.includes(e.value)||b([...g,e.value])},onDeselect:e=>{b(g.filter(s=>s!==e.value))},activeProviders:d,modelAliases:$,title:"Add Model to Combo",kindFilter:x,addedModelValues:g,closeOnSelect:!1})]})}},31659:(e,s,t)=>{Promise.resolve().then(t.bind(t,29982))},92412:(e,s,t)=>{"use strict";t.d(s,{YW:()=>r.Page,pV:()=>r.CardGrid,wn:()=>r.Section,zY:()=>r.PageHeader}),t(16675),t(72778);var r=t(29575)},99656:(e,s,t)=>{"use strict";t.d(s,{PM:()=>r.PM,Sj:()=>r.Sj,Vy:()=>r.Vy,fF:()=>r.fF,sl:()=>r.sl,vL:()=>r.vL,y$:()=>r.y$,zM:()=>r.zM});var r=t(31872)}},e=>{e.O(0,[6766,5166,7552,9980,1471,5778,4484,3577,5862,5113,3153,7276,1722,1078,159,4489,1278,1830,208,427,9966,7358],()=>e(e.s=31659)),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3649],{15764:(e,s,t)=>{"use strict";t.d(s,{CK:()=>i.default,G9:()=>m.default,Iz:()=>p.default,KX:()=>g.PanelSkeleton,LF:()=>a.default,LH:()=>x.default,Mu:()=>g.StatCardSkeleton,Nf:()=>d.default,Qv:()=>l.CardSkeleton,YW:()=>v.YW,gw:()=>f.default,jK:()=>c.default,nh:()=>b.default,pV:()=>v.pV,rq:()=>o.default,uR:()=>n.default,uo:()=>r.ConfirmModal,vE:()=>u.default,vj:()=>h.default,wI:()=>j.default,wn:()=>v.wn,zY:()=>v.zY}),t(58913);var r=t(3537),l=t(58350);t(30872),t(33526),t(42535),t(1279);var a=t(92802),o=t(25908),n=t(58729),i=t(24873),d=t(5258),c=t(4165);t(949),t(56776),t(53599),t(88336),t(69561);var m=t(37753),x=t(23444),u=t(93624),h=t(86920),j=t(65461);t(14580);var f=t(14670),p=t(70296);t(57779),t(22205);var g=t(43276),b=t(75862),v=t(92412)},29982:(e,s,t)=>{"use strict";t.r(s),t.d(s,{default:()=>A});var r=t(29798),l=t(15814),a=t(31872),o=t(59732),n=t(7155),i=t(70684),d=t(75669),c=t(18055),m=t(77345),x=t(1352),u=t(49787),h=t(45111),j=t(36395),f=t(10205),p=t(15054),g=t(6403),b=t(63587),v=t(76260),y=t(3308),k=t(75877),N=t(50860),w=t(1280),C=t(26339),S=t(15764),$=t(63523),z=t(90619);let E=/^[a-zA-Z0-9_.\-]+$/;function A(){let[e,s]=(0,l.useState)([]),[t,a]=(0,l.useState)(!0),[o,n]=(0,l.useState)(!1),[i,m]=(0,l.useState)(null),[x,h]=(0,l.useState)([]),[p,g]=(0,l.useState)({}),{getCaps:b}=(0,z.y)(),[v,y]=(0,l.useState)(null),{copied:k,copy:N}=(0,$.C)(),w=async()=>{try{let[e,t,r]=await Promise.all([fetch("/api/combos"),fetch("/api/providers"),fetch("/api/settings")]),l=await e.json(),a=await t.json(),o=r.ok?await r.json():{};e.ok&&s((l.combos||[]).filter(e=>!e.kind||"llm"===e.kind)),t.ok&&h(a.connections||[]),g(o.comboStrategies||{})}catch(e){console.log("Error fetching data:",e)}finally{a(!1)}};(0,l.useEffect)(()=>{w()},[]);let C=async e=>{try{let s=await fetch("/api/combos",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(s.ok)await w(),n(!1);else{let e=await s.json();alert(e.error||"Failed to create combo")}}catch(e){console.log("Error creating combo:",e)}},E=async(e,s)=>{try{let t=await fetch(`/api/combos/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});if(t.ok)await w(),m(null);else{let e=await t.json();alert(e.error||"Failed to update combo")}}catch(e){console.log("Error updating combo:",e)}},A=async(e,s)=>{try{let t={...p},r={...t[e]||{},...s};r.fallbackStrategy&&"fallback"!==r.fallbackStrategy?t[e]=r:delete t[e],await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({comboStrategies:t})}),g(t)}catch(e){console.log("Error updating combo strategy:",e)}};return t?(0,r.jsxs)(S.YW,{children:[(0,r.jsx)(S.KX,{}),(0,r.jsx)(S.KX,{})]}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(S.YW,{children:[(0,r.jsx)(S.zY,{title:"Combos",description:"Group models under one name, then pick a strategy per combo:",actions:(0,r.jsxs)(c.$,{onClick:()=>n(!0),className:"w-full whitespace-nowrap sm:w-auto",children:[(0,r.jsx)(j.A,{}),"Create Combo"]})}),(0,r.jsx)(S.wn,{children:(0,r.jsx)("div",{className:"min-w-0",children:(0,r.jsxs)("ul",{className:"text-sm text-muted-foreground flex flex-col gap-1",children:[(0,r.jsxs)("li",{children:[(0,r.jsx)("span",{className:"font-medium text-foreground",children:"Fallback"})," — tries models in order (next on failure)"]}),(0,r.jsxs)("li",{children:[(0,r.jsx)("span",{className:"font-medium text-foreground",children:"Round Robin"})," — rotates models across requests to spread load"]}),(0,r.jsxs)("li",{children:[(0,r.jsx)("span",{className:"font-medium text-foreground",children:"Fusion"})," — queries all models in parallel, then a judge synthesizes one answer. Best quality, but costs the most: every request bills all panel models + the judge (N+1 calls)"]})]})})}),(0,r.jsx)(S.wn,{children:0===e.length?(0,r.jsx)(d.Zp,{children:(0,r.jsxs)("div",{className:"py-12 text-center",children:[(0,r.jsx)("div",{className:"inline-flex items-center justify-center w-16 h-16 rounded-full bg-primary/10 text-primary mb-4",children:(0,r.jsx)(f.A,{className:"size-8"})}),(0,r.jsx)("p",{className:"text-foreground font-medium mb-1",children:"No combos yet"}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground mb-4",children:"Create model combos with fallback support"}),(0,r.jsxs)(c.$,{onClick:()=>n(!0),className:"w-full sm:w-auto",children:[(0,r.jsx)(j.A,{}),"Create Combo"]})]})}):(0,r.jsx)("div",{className:"flex flex-col gap-4",children:e.map(t=>(0,r.jsx)(_,{combo:t,getCaps:b,activeProviders:x,copied:k,onCopy:N,onEdit:()=>m(t),onDelete:()=>{var r;return r=t.id,void y({title:"Delete Combo",message:"Delete this combo?",onConfirm:async()=>{y(null);try{(await fetch(`/api/combos/${r}`,{method:"DELETE"})).ok&&s(e.filter(e=>e.id!==r))}catch(e){console.log("Error deleting combo:",e)}}})},strategy:p[t.name]||{},onSetStrategy:e=>A(t.name,e)},t.id))})})]}),o&&(0,r.jsx)(F,{isOpen:o,onClose:()=>n(!1),onSave:C,activeProviders:x},"create"),i&&(0,r.jsx)(F,{isOpen:!!i,combo:i,onClose:()=>m(null),onSave:e=>E(i.id,e),activeProviders:x},i.id),v&&(0,r.jsx)(u.lG,{open:!0,onOpenChange:e=>{e||y(null)},children:(0,r.jsxs)(u.Cf,{className:"max-w-sm",children:[(0,r.jsx)(u.c7,{children:(0,r.jsx)(u.L3,{children:v.title})}),(0,r.jsx)("p",{className:"p-4 text-sm text-muted-foreground",children:v.message}),(0,r.jsxs)(u.Es,{children:[(0,r.jsx)(c.$,{variant:"ghost",onClick:()=>y(null),children:"Cancel"}),(0,r.jsx)(c.$,{variant:"destructive",onClick:v.onConfirm,children:v.confirmText||"Confirm"})]})]})})]})}let M=[{value:"fallback",label:"Fallback — try in order"},{value:"round-robin",label:"Round Robin — rotate"},{value:"fusion",label:"Fusion — panel + judge"}];function _({combo:e,getCaps:s,activeProviders:t=[],copied:a,onCopy:o,onEdit:n,onDelete:i,strategy:m={},onSetStrategy:u}){let[j,N]=(0,l.useState)(!1),w=m.fallbackStrategy||"fallback",C=m.judgeModel||"";return(0,r.jsxs)(d.Zp,{size:"sm",className:"group",children:[(0,r.jsx)(d.Wu,{className:"min-w-0",children:(0,r.jsxs)("div",{className:"flex min-w-0 flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",children:[(0,r.jsxs)("div",{className:"flex min-w-0 flex-1 items-start gap-3 sm:items-center",children:[(0,r.jsx)("div",{className:"size-8 rounded-lg bg-primary/10 flex items-center justify-center shrink-0",children:(0,r.jsx)(f.A,{className:"size-4 text-primary"})}),(0,r.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,r.jsx)("code",{className:"block truncate font-mono text-sm font-medium",children:e.name}),(0,r.jsxs)("div",{className:"mt-1 flex min-w-0 flex-wrap items-center gap-1",children:[0===e.models.length?(0,r.jsx)("span",{className:"text-xs text-muted-foreground italic",children:"No models"}):e.models.slice(0,3).map((e,t)=>(0,r.jsxs)("code",{className:"inline-flex items-center gap-1 rounded bg-black/5 px-1.5 py-0.5 font-mono text-xs text-muted-foreground dark:bg-white/5",children:[(0,r.jsx)("span",{children:e}),(0,r.jsx)(S.nh,{caps:s?.(e)})]},t)),e.models.length>3&&(0,r.jsxs)("span",{className:"text-[10px] text-muted-foreground",children:["+",e.models.length-3," more"]})]}),"fusion"===w&&(0,r.jsxs)("div",{className:"mt-2 flex min-w-0 flex-wrap items-center gap-1.5",children:[(0,r.jsx)("span",{className:"text-[11px] font-medium text-muted-foreground",children:"Judge"}),(0,r.jsxs)(x.m_,{children:[(0,r.jsx)(x.k$,{asChild:!0,children:(0,r.jsxs)("button",{onClick:()=>N(!0),className:"inline-flex max-w-full items-center gap-1 rounded border border-dashed border-primary/40 px-1.5 py-0.5 font-mono text-[11px] text-primary hover:border-primary hover:bg-primary/5 transition-colors",children:[(0,r.jsx)(p.A,{className:"size-3.5"}),(0,r.jsx)("span",{className:"truncate",children:C||`Auto — ${e.models[0]||"first model"}`})]})}),(0,r.jsx)(x.ZI,{children:"Pick the model that fuses panel answers"})]}),C&&(0,r.jsxs)(x.m_,{children:[(0,r.jsx)(x.k$,{asChild:!0,children:(0,r.jsx)("button",{onClick:()=>u({judgeModel:""}),className:"p-0.5 rounded text-muted-foreground hover:text-red-500 hover:bg-red-500/10 transition-colors",children:(0,r.jsx)(g.A,{className:"size-3.5"})})}),(0,r.jsx)(x.ZI,{children:"Reset judge to Auto"})]})]})]})]}),(0,r.jsxs)("div",{className:"flex w-full flex-col gap-2 sm:w-auto sm:flex-row sm:items-center sm:gap-3 sm:shrink-0",children:[(0,r.jsx)("div",{className:"w-full sm:w-[200px]",children:(0,r.jsxs)(h.l6,{value:w,onValueChange:e=>u({fallbackStrategy:e}),children:[(0,r.jsx)(h.bq,{className:"py-1.5 text-xs",children:(0,r.jsx)(h.yv,{})}),(0,r.jsx)(h.gC,{children:M.map(e=>(0,r.jsx)(h.eb,{value:e.value,children:e.label},e.value))})]})}),(0,r.jsxs)("div",{className:"grid grid-cols-3 gap-1 sm:flex",children:[(0,r.jsxs)(x.m_,{children:[(0,r.jsx)(x.k$,{asChild:!0,children:(0,r.jsx)(c.$,{variant:"ghost",size:"icon-sm",onClick:s=>{s.stopPropagation(),o(e.name,`combo-${e.id}`)},"aria-label":"Copy combo name",children:a===`combo-${e.id}`?(0,r.jsx)(b.A,{}):(0,r.jsx)(v.A,{})})}),(0,r.jsx)(x.ZI,{children:"Copy combo name"})]}),(0,r.jsxs)(x.m_,{children:[(0,r.jsx)(x.k$,{asChild:!0,children:(0,r.jsx)(c.$,{variant:"ghost",size:"icon-sm",onClick:n,"aria-label":"Edit",children:(0,r.jsx)(y.A,{})})}),(0,r.jsx)(x.ZI,{children:"Edit"})]}),(0,r.jsxs)(x.m_,{children:[(0,r.jsx)(x.k$,{asChild:!0,children:(0,r.jsx)(c.$,{variant:"ghost",size:"icon-sm",onClick:i,"aria-label":"Delete",className:"text-red-500 hover:bg-red-500/10 hover:text-red-500",children:(0,r.jsx)(k.A,{})})}),(0,r.jsx)(x.ZI,{children:"Delete"})]})]})]})]})}),j&&(0,r.jsx)(S.rq,{isOpen:j,onClose:()=>N(!1),onSelect:e=>{u({judgeModel:e?.value||""}),N(!1)},activeProviders:t,title:"Select Judge Model",addedModelValues:C?[C]:[],closeOnSelect:!0})]})}function P({id:e,index:s,model:t,isFirst:a,isLast:i,onEdit:d,onMoveUp:c,onMoveDown:m,onRemove:u}){let{attributes:h,listeners:j,setNodeRef:f,transform:p,isDragging:b}=(0,o.gl)({id:e}),v={transform:n.Ks.Transform.toString(p),opacity:b?.4:1,zIndex:b?999:void 0},[y,k]=(0,l.useState)(!1),[S,$]=(0,l.useState)(t),z=()=>{let e=S.trim();e&&e!==t?d(e):$(t),k(!1)};return(0,r.jsxs)("div",{ref:f,style:v,className:`group flex min-w-0 items-center gap-1.5 rounded-md px-2 py-1 bg-black/[0.02] hover:bg-black/[0.04] dark:bg-white/[0.02] dark:hover:bg-white/[0.04] transition-colors ${b?"shadow-md ring-1 ring-primary/30":""}`,children:[(0,r.jsxs)(x.m_,{children:[(0,r.jsx)(x.k$,{asChild:!0,children:(0,r.jsx)("button",{...h,...j,type:"button",className:"cursor-grab touch-none p-0.5 rounded text-muted-foreground hover:text-primary active:cursor-grabbing shrink-0",children:(0,r.jsx)(N.A,{className:"size-4"})})}),(0,r.jsx)(x.ZI,{children:"Drag to reorder"})]}),(0,r.jsx)("span",{className:"text-[10px] font-medium text-muted-foreground w-3 text-center shrink-0",children:s+1}),y?(0,r.jsx)("input",{autoFocus:!0,value:S,onChange:e=>$(e.target.value),onBlur:z,onKeyDown:e=>{"Enter"===e.key&&z(),"Escape"===e.key&&($(t),k(!1))},className:"min-w-0 flex-1 rounded border border-primary/40 bg-white px-1.5 py-0.5 font-mono text-xs text-foreground outline-none dark:bg-black/20"}):(0,r.jsxs)(x.m_,{children:[(0,r.jsx)(x.k$,{asChild:!0,children:(0,r.jsx)("div",{className:"min-w-0 flex-1 cursor-text truncate rounded px-1.5 py-0.5 font-mono text-xs text-foreground hover:bg-black/5 dark:hover:bg-white/5",onClick:()=>k(!0),children:t})}),(0,r.jsx)(x.ZI,{children:"Click to edit"})]}),(0,r.jsxs)("div",{className:"flex shrink-0 items-center gap-0.5",children:[(0,r.jsxs)(x.m_,{children:[(0,r.jsx)(x.k$,{asChild:!0,children:(0,r.jsx)("button",{onClick:c,disabled:a,className:`p-0.5 rounded ${a?"text-muted-foreground/20 cursor-not-allowed":"text-muted-foreground hover:text-primary hover:bg-black/5 dark:hover:bg-white/5"}`,children:(0,r.jsx)(w.A,{className:"size-3"})})}),(0,r.jsx)(x.ZI,{children:"Move up"})]}),(0,r.jsxs)(x.m_,{children:[(0,r.jsx)(x.k$,{asChild:!0,children:(0,r.jsx)("button",{onClick:m,disabled:i,className:`p-0.5 rounded ${i?"text-muted-foreground/20 cursor-not-allowed":"text-muted-foreground hover:text-primary hover:bg-black/5 dark:hover:bg-white/5"}`,children:(0,r.jsx)(C.A,{className:"size-3"})})}),(0,r.jsx)(x.ZI,{children:"Move down"})]})]}),(0,r.jsxs)(x.m_,{children:[(0,r.jsx)(x.k$,{asChild:!0,children:(0,r.jsx)("button",{onClick:u,className:"p-0.5 hover:bg-red-500/10 rounded text-muted-foreground hover:text-red-500 transition-all",children:(0,r.jsx)(g.A,{className:"size-3"})})}),(0,r.jsx)(x.ZI,{children:"Remove"})]})]})}function F({isOpen:e,combo:s,onClose:t,onSave:n,activeProviders:d,kindFilter:x=null}){let[h,p]=(0,l.useState)(s?.name||""),[g,b]=(0,l.useState)(s?.models||[]),[v,y]=(0,l.useState)(!1),[k,N]=(0,l.useState)(!1),[w,C]=(0,l.useState)(""),[$,z]=(0,l.useState)({}),A=(0,a.FR)((0,a.MS)(a.AN,{activationConstraint:{distance:5}}),(0,a.MS)(a.uN,{coordinateGetter:o.JR})),M=g.map((e,s)=>({uid:`item-${s}`,model:e})),_=async()=>{try{let e=await fetch("/api/models/alias");if(!e.ok)return;let s=await e.json();z(s.aliases||{})}catch(e){console.error("Error fetching modal data:",e)}};(0,l.useEffect)(()=>{e&&_()},[e]);let O=e=>e.trim()?E.test(e)?(C(""),!0):(C("Only letters, numbers, -, _ and . allowed"),!1):(C("Name is required"),!1),I=async()=>{O(h)&&(N(!0),await n({name:h.trim(),models:g}),N(!1))},Z=!!s;return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(u.lG,{open:e,onOpenChange:e=>{e||t()},children:(0,r.jsxs)(u.Cf,{className:"max-w-md",children:[(0,r.jsx)(u.c7,{children:(0,r.jsx)(u.L3,{children:Z?"Edit Combo":"Create Combo"})}),(0,r.jsxs)("div",{className:"flex flex-col gap-3 p-4",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("label",{className:"text-sm font-medium text-foreground mb-1.5 block",children:"Combo Name"}),(0,r.jsx)(m.p,{value:h,onChange:e=>{let s=e.target.value;p(s),s?O(s):C("")},placeholder:"my-combo","aria-invalid":!!w,className:w?"ring-1 ring-red-500 border-red-500/40":""}),w&&(0,r.jsx)("p",{className:"mt-1 text-xs text-red-500",children:w}),(0,r.jsx)("p",{className:"text-[10px] text-muted-foreground mt-0.5",children:"Only letters, numbers, -, _ and . allowed"})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("label",{className:"text-sm font-medium mb-1.5 block",children:"Models"}),0===g.length?(0,r.jsxs)("div",{className:"text-center py-4 border border-dashed border-black/10 dark:border-white/10 rounded-lg bg-black/[0.01] dark:bg-white/[0.01]",children:[(0,r.jsx)(f.A,{className:"mb-1 mx-auto size-6 text-muted-foreground"}),(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"No models added yet"})]}):(0,r.jsx)(a.Mp,{sensors:A,collisionDetection:a.fp,onDragEnd:e=>{let{active:s,over:t}=e;if(t&&s.id!==t.id){let e=M.findIndex(e=>e.uid===s.id),r=M.findIndex(e=>e.uid===t.id);-1!==e&&-1!==r&&b(s=>(0,o.be)(s,e,r))}},modifiers:[i.FN,i.gj],children:(0,r.jsx)(o.gB,{items:M.map(e=>e.uid),strategy:o._G,children:(0,r.jsx)("div",{className:"flex max-h-[55vh] min-w-0 flex-col gap-1 overflow-y-auto sm:max-h-[350px]",children:M.map(({uid:e,model:s},t)=>(0,r.jsx)(P,{id:e,index:t,model:s,isFirst:0===t,isLast:t===M.length-1,onEdit:e=>{let s=[...g];s[t]=e,b(s)},onMoveUp:()=>(e=>{if(0===e)return;let s=[...g];[s[e-1],s[e]]=[s[e],s[e-1]],b(s)})(t),onMoveDown:()=>(e=>{if(e===g.length-1)return;let s=[...g];[s[e],s[e+1]]=[s[e+1],s[e]],b(s)})(t),onRemove:()=>{b(g.filter((e,s)=>s!==t))}},e))})})}),(0,r.jsxs)("button",{onClick:()=>y(!0),className:"w-full mt-2 py-2 border border-dashed border-black/10 dark:border-white/10 rounded-lg text-xs text-primary font-medium hover:text-primary hover:border-primary/50 transition-colors flex items-center justify-center gap-1",children:[(0,r.jsx)(j.A,{className:"size-4"}),"Add Model"]})]})]}),(0,r.jsx)(u.Es,{children:(0,r.jsx)("div",{className:"flex w-full flex-col gap-2 pt-1 sm:flex-row",children:(0,r.jsx)(c.$,{onClick:I,size:"sm",className:"flex-1",disabled:!h.trim()||!!w||k,children:k?"Saving...":Z?"Save":"Create"})})})]})}),v&&(0,r.jsx)(S.rq,{isOpen:v,onClose:()=>y(!1),onSelect:e=>{g.includes(e.value)||b([...g,e.value])},onDeselect:e=>{b(g.filter(s=>s!==e.value))},activeProviders:d,modelAliases:$,title:"Add Model to Combo",kindFilter:x,addedModelValues:g,closeOnSelect:!1})]})}},67053:(e,s,t)=>{Promise.resolve().then(t.bind(t,29982))},92412:(e,s,t)=>{"use strict";t.d(s,{YW:()=>r.Page,pV:()=>r.CardGrid,wn:()=>r.Section,zY:()=>r.PageHeader}),t(16675),t(72778);var r=t(29575)},99656:(e,s,t)=>{"use strict";t.d(s,{PM:()=>r.PM,Sj:()=>r.Sj,Vy:()=>r.Vy,fF:()=>r.fF,sl:()=>r.sl,vL:()=>r.vL,y$:()=>r.y$,zM:()=>r.zM});var r=t(31872)}},e=>{e.O(0,[6766,5166,7552,9980,1471,5778,4484,3577,5862,5113,1699,7276,1722,1078,159,4489,1278,1830,208,427,9966,7358],()=>e(e.s=67053)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[712],{1352:(e,t,r)=>{"use strict";r.d(t,{Bc:()=>i,ZI:()=>l,k$:()=>d,m_:()=>o});var a=r(29798);r(15814);var s=r(5471),n=r(44484);function i({delayDuration:e=0,...t}){return(0,a.jsx)(n.Kq,{"data-slot":"tooltip-provider",delayDuration:e,...t})}function o({...e}){return(0,a.jsx)(n.bL,{"data-slot":"tooltip",...e})}function d({...e}){return(0,a.jsx)(n.l9,{"data-slot":"tooltip-trigger",...e})}function l({className:e,sideOffset:t=0,children:r,...i}){return(0,a.jsx)(n.ZL,{children:(0,a.jsxs)(n.UC,{"data-slot":"tooltip-content",sideOffset:t,className:(0,s.cn)("z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",e),...i,children:[r,(0,a.jsx)(n.i3,{className:"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground"})]})})}},4836:(e,t,r)=>{"use strict";r.d(t,{A:()=>o});var a=r(15814);let s=(...e)=>e.filter((e,t,r)=>!!e&&""!==e.trim()&&r.indexOf(e)===t).join(" ").trim(),n={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};var i=r(28145);let o=(0,a.forwardRef)(({color:e,size:t,width:r,height:o,strokeWidth:d,absoluteStrokeWidth:l,nonScalingStroke:c,className:u="",children:g,iconNode:p=[],icon:h={node:p,aliases:[],size:24},...m},f)=>{let{size:x=24,strokeWidth:v=2,absoluteStrokeWidth:b=!1,nonScalingStroke:k=!1,color:y="currentColor",className:w=""}=(0,i.T)()??{},j=!!g||(e=>{for(let t in e)if(t.startsWith("aria-")||"role"===t||"title"===t)return!0;return!1})(m),[N,z,A=[]]=function(e,t={}){return function(e,t={}){let r=t.attributeNames??{},a=e=>r[e]??e,i=e.size??e.width??n.width,o=e.size??e.height??n.height,d=e.aliases?.filter(e=>"string"==typeof e&&""!==e.trim()).map(e=>`lucide-${e}`)??[],l=[...e.name?[`lucide-${e.name}`]:[],...d],c=t.className?.split(" ").filter(Boolean)??[],u=!1===t.includeDefaultClasses?s(...c):s("lucide",...l,...c),g=t.absoluteStrokeWidth?Number(t.strokeWidth??n["stroke-width"])*Number(e.size??e.width??n.width)/Number(t.size??t.width??n.width):t.strokeWidth??n["stroke-width"];return["svg",{...Object.entries(n).reduce((e,[t,r])=>(e[a(t)]=r,e),{}),..."color"in t&&t.color&&{[a("stroke")]:t.color},..."size"in t&&null!=t.size&&{[a("width")]:t.size,[a("height")]:t.size},..."width"in t&&null!=t.width&&{[a("width")]:t.width},..."height"in t&&null!=t.height&&{[a("height")]:t.height},[a("stroke-width")]:g,...u&&{[a("class")]:u},[a("viewBox")]:`0 0 ${i} ${o}`,...!1===t.hasA11yProp?{[a("aria-hidden")]:"true"}:{},..."attributes"in t&&t.attributes},e.node.map(e=>{let[r,s,n]=e,i=t.nonScalingStroke?{[a("vector-effect")]:"non-scaling-stroke",...s}:s;return n?[r,i,n]:[r,i]})]}(e,{...t,attributeNames:{...t.attributeNames,class:"className","stroke-width":"strokeWidth","stroke-linecap":"strokeLinecap","stroke-linejoin":"strokeLinejoin","vector-effect":"vectorEffect"}})}(h,{color:e??y,width:r??t??x,height:o??t??x,strokeWidth:d??v,absoluteStrokeWidth:l??b,nonScalingStroke:c??k,className:s(w,u),hasA11yProp:j,attributes:m});return(0,a.createElement)(N,{ref:f,...z},[...A.map(([e,t])=>(0,a.createElement)(e,t)),...Array.isArray(g)?g:[g]])})},13189:(e,t,r)=>{"use strict";r.d(t,{default:()=>D});var a=r(29798),s=r(15814),n=r(75669),i=r(18055),o=r(53784),d=r(77345),l=r(1352),c=r(45111),u=r(74719),g=r(66685),p=r(24477),h=r(26339),m=r(75877),f=r(51660);let x={USAGE:"usage",STREAM:"stream","STREAM USAGE":"usage",COMBO:"combo",FUSION:"combo",TOKEN:"token",RTK:"rtk",HEADROOM:"rtk",REQUEST:"request",PROXY:"proxy",AUTH:"auth",AG_QUOTA:"auth",DB:"db",TUNNEL:"tunnel",PROJECTID:"other"},v={debug:"debug",info:"info",log:"info",warn:"warn",error:"error"},b={debug:0,info:1,warn:2,error:3};function k(e,t){return b[t]>b[e]?t:e}function y(e,t){let r=v[e]??"info",a="other";if(/\[DBG:[^\]]+\]/.test(t)||t.includes("\uD83D\uDC1B"))return{level:"debug",category:"debug"};let s=t.match(/^\[\d{1,2}:\d{2}(:\d{2})?\]\s+(DEBUG|INFO|WARN|ERROR)\b/);if(s){let e=s[2].toLowerCase();b[e]>b[r]&&(r=e)}let n=t.match(/^\[\d{1,2}:\d{2}(:\d{2})?\]\s+\[[0-9a-f]{4}\]\s+([A-Z]+)\b/);if(n){let e=n[2];"REQ"===e?a="request":"DONE"===e?a="done":"SAVERS"===e?a="rtk":"REFRESH"===e?a="token":"BLOCKED"===e||"ABORT"===e?a="stream":"ERROR"===e&&(r=k(r,"error"),"other"===a&&(a="request"))}if("other"===a&&/^\[\d{1,2}:\d{2}(:\d{2})?\]\s+\[(http|stream|usage)\]/i.test(t)){let e=t.match(/^\[\d{1,2}:\d{2}(:\d{2})?\]\s+\[(http|stream|usage)\]/i)[2].toLowerCase();a="http"===e?"request":e}let i=t.match(/\[([A-Z][A-Z _-]*)\]/g);if(i)for(let e of i){let t=e.slice(1,-1).trim();if(x[t]){a=x[t];break}if("DBG"===t||t.startsWith("DBG:"))return{level:"debug",category:"debug"}}return t.includes("✗")||t.includes("❌")?(r=k(r,"error"),"other"===a&&(a="request")):t.includes("\uD83D\uDCCA")?t.includes("DONE")?a="done":"other"===a&&(a="usage"):t.includes("⚠️")?r=k(r,"warn"):t.includes("\uD83C\uDF0A")?"other"===a&&(a="stream"):t.includes("\uD83D\uDD11")||t.includes("TOKEN REFRESHED")?"other"===a&&(a="token"):t.includes("ℹ️")||t.includes("\uD83D\uDD0D")?t.includes("\uD83D\uDD0D")&&(r=k(r,"debug")):t.includes("\uD83D\uDCE5")&&"other"===a&&(a="request"),"other"===a&&/\b(POST|GET|PUT|DELETE|PATCH)\b/.test(t)&&(a="request"),/\bERROR \d{3}\b/.test(t)||/\bFAILED\b/.test(t)||/\bBLOCKED\b/.test(t)?r=k(r,"error"):/\b(falling back|fallback|unavailable|skipped|retry)\b/i.test(t)&&(r=k(r,"warn")),"other"===a&&(t.includes("[RTK]")||t.includes("HEADROOM")||t.includes("PXPIPE")?a="rtk":t.includes("[ProjectId]")?a="other":t.includes("[ProxyFetch]")?a="proxy":t.includes("[Tunnel]")?a="tunnel":t.includes("[DB]")?a="db":t.includes("[RequestDetail]")?a="request":t.includes("[STREAM]")?a="stream":t.includes("[TOKEN]")?a="token":t.includes("[COMBO]")||t.includes("[FUSION]")?a="combo":t.includes("[CHAT]")&&(a="request")),{level:r,category:a}}function w(e,t="log"){if("string"==typeof e){let{level:r,category:a}=y(t,e);return{ts:Date.now(),level:r,category:a,text:e}}if(e&&"object"==typeof e&&"string"==typeof e.text){if("number"==typeof e.ts&&e.level&&e.category)return e;let{level:r,category:a}=y(t,e.text);return{ts:"number"==typeof e.ts?e.ts:Date.now(),level:e.level??r,category:e.category??a,text:e.text}}let r=String(e??""),{level:a,category:s}=y(t,r);return{ts:Date.now(),level:a,category:s,text:r}}let j={debug:"secondary",info:"default",warn:"secondary",error:"destructive"},N={debug:"bg-muted text-muted-foreground",info:"bg-sky-500/15 text-sky-700 dark:text-sky-300",warn:"bg-amber-500/15 text-amber-700 dark:text-amber-300",error:""},z={debug:"DEBUG",info:"INFO",warn:"WARN",error:"ERROR"},A=["debug","info","warn","error"],E={all:"All categories",request:"Request",done:"Done",usage:"Usage",combo:"Combo",token:"Token",rtk:"RTK",stream:"Stream",debug:"Debug",auth:"Auth",proxy:"Proxy",db:"DB",tunnel:"Tunnel",other:"Other"},C=["request","done","usage","combo","token","rtk","stream","debug","auth","proxy","db","tunnel","other"],R=/^\[\d{1,2}:\d{2}(:\d{2})?(\s?[AP]M)?\]\s*/,O=/\b(IN|OUT) \d[\d,]*( \(CACHE [^)]*\))?|\b\d[\d,]*ms\b|\b[A-Za-z_][\w.-]*=[^\s·|,]+/g;function S({text:e,isError:t}){let[r,n]=(0,s.useMemo)(()=>{let t;return -1===(t=e.indexOf("\n"))?[e,null]:[e.slice(0,t),e.slice(t+1)]},[e]),i=(0,s.useMemo)(()=>(function(e){let t=[],r=0;for(let a of e.matchAll(O)){let s=a[0],n=a.index??0;if(n>r&&t.push({kind:"plain",text:e.slice(r,n)}),/^(IN|OUT) /.test(s))t.push({kind:"tokens",text:s});else if(/ms$/.test(s))t.push({kind:"duration",text:s});else{let e=s.indexOf("=");t.push({kind:"kv",key:s.slice(0,e+1),value:s.slice(e+1)})}r=n+s.length}return r<e.length&&t.push({kind:"plain",text:e.slice(r)}),0===t.length&&t.push({kind:"plain",text:e}),t})(r.replace(R,"")),[r]);return(0,a.jsxs)("span",{className:"break-words",children:[i.map((e,t)=>"duration"===e.kind?(0,a.jsx)("span",{className:"font-semibold text-amber-700",children:e.text},t):"tokens"===e.kind?(0,a.jsx)("span",{className:"font-semibold text-emerald-700",children:e.text},t):"kv"===e.kind?(0,a.jsxs)("span",{children:[(0,a.jsx)("span",{className:"text-muted-foreground",children:e.key}),(0,a.jsx)("span",{className:"font-medium text-sky-700",children:e.value})]},t):(0,a.jsx)("span",{children:e.text},t)),n&&(0,a.jsxs)("details",{className:"mt-1",children:[(0,a.jsx)("summary",{className:`cursor-pointer text-[11px] font-medium ${t?"text-red-600":"text-muted-foreground"} hover:underline`,children:"Stack trace"}),(0,a.jsx)("pre",{className:"mt-1 max-h-40 overflow-auto rounded bg-muted p-2 text-[11px] whitespace-pre-wrap text-muted-foreground",children:n})]})]})}function T({entry:e}){let t="error"===e.level,r="warn"===e.level,s="done"===e.category;return(0,a.jsxs)("div",{className:`flex items-start gap-2 px-3 py-1.5 leading-relaxed ${t?"border-l-2 border-red-500 bg-red-500/5":r?"border-l-2 border-amber-500 bg-amber-500/5":s?"border-l-2 border-green-500 bg-green-500/5":"border-l-2 border-transparent hover:bg-muted/50"}`,children:[(0,a.jsx)("span",{className:"shrink-0 pt-0.5 text-[11px] text-muted-foreground tabular-nums",children:new Date(e.ts).toLocaleTimeString("en-US",{hour12:!1})}),(0,a.jsx)(o.E,{variant:j[e.level],className:`shrink-0 ${N[e.level]}`,children:z[e.level]}),(0,a.jsx)("span",{className:"shrink-0 rounded bg-muted px-1.5 py-0.5 text-[10px] font-semibold text-muted-foreground uppercase",children:E[e.category]}),(0,a.jsx)("span",{className:"min-w-0 flex-1 text-foreground",children:(0,a.jsx)(S,{text:e.text,isError:t})})]})}function _(e){return e.map(e=>w(e))}function D(){let[e,t]=(0,s.useState)([]),[r,x]=(0,s.useState)(!1),[v,b]=(0,s.useState)(!1),[k,y]=(0,s.useState)(!0),[N,R]=(0,s.useState)(""),[O,S]=(0,s.useState)(new Set(A)),[D,L]=(0,s.useState)("all"),M=(0,s.useRef)(null),U=(0,s.useRef)(v);(0,s.useEffect)(()=>{U.current=v},[v]);let B=async()=>{try{await fetch("/api/translator/console-logs",{method:"DELETE"})}catch(e){console.error("Failed to clear console logs:",e)}};(0,s.useEffect)(()=>{let e=new EventSource("/api/translator/console-logs/stream");return e.onopen=()=>x(!0),e.onmessage=e=>{if(U.current)return;let r=JSON.parse(e.data);if("init"===r.type)t(_(r.logs).slice(-f.UY.maxLines));else if("line"===r.type){let e=w(r.line);t(t=>{let r=[...t,e];return r.length>f.UY.maxLines?r.slice(-f.UY.maxLines):r})}else if("lines"===r.type){let e=_(r.lines);t(t=>{let r=[...t,...e];return r.length>f.UY.maxLines?r.slice(-f.UY.maxLines):r})}else"clear"===r.type&&t([])},e.onerror=()=>x(!1),()=>e.close()},[]),(0,s.useEffect)(()=>{k&&M.current&&(M.current.scrollTop=M.current.scrollHeight)},[e,k]);let $=(0,s.useMemo)(()=>{let t=N.trim().toLowerCase();return e.filter(e=>!!O.has(e.level)&&("all"===D||e.category===D)&&(!t||!!e.text.toLowerCase().includes(t)))},[e,O,D,N]),q=(0,s.useMemo)(()=>e.filter(e=>"error"===e.level).length,[e]),P=(0,s.useMemo)(()=>e.filter(e=>"warn"===e.level).length,[e]);return(0,a.jsxs)(n.Zp,{children:[(0,a.jsxs)(n.aR,{children:[(0,a.jsx)(n.ZB,{className:"sr-only",children:"Console logs"}),(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,a.jsxs)(l.m_,{children:[(0,a.jsx)(l.k$,{asChild:!0,children:(0,a.jsx)("span",{className:r?"size-2 rounded-full bg-green-500":"size-2 rounded-full bg-red-500"})}),(0,a.jsx)(l.ZI,{children:r?"Connected":"Disconnected"})]}),(0,a.jsxs)("span",{className:"text-xs text-muted-foreground",children:[$.length,"/",e.length," lines",q>0&&(0,a.jsxs)("span",{className:"font-semibold text-red-600",children:[" \xb7 ",q," errors"]}),P>0&&(0,a.jsxs)("span",{className:"font-semibold text-yellow-600",children:[" \xb7 ",P," warnings"]})]}),(0,a.jsxs)("div",{className:"ml-auto flex flex-wrap items-center gap-2",children:[(0,a.jsxs)("div",{className:"relative",children:[(0,a.jsx)(u.A,{className:"pointer-events-none absolute top-1/2 left-2.5 size-3.5 -translate-y-1/2 text-muted-foreground"}),(0,a.jsx)(d.p,{value:N,onChange:e=>R(e.target.value),placeholder:"Search logs…",className:"h-7 w-44 pl-8 text-xs"})]}),(0,a.jsx)("div",{className:"flex items-center gap-1",children:A.map(e=>(0,a.jsxs)(l.m_,{children:[(0,a.jsx)(l.k$,{asChild:!0,children:(0,a.jsx)("button",{type:"button",onClick:()=>{S(t=>{let r=new Set(t);return r.has(e)?r.delete(e):r.add(e),r})},className:`cursor-pointer transition-opacity ${O.has(e)?"opacity-100":"opacity-30 grayscale"}`,children:(0,a.jsx)(o.E,{variant:j[e],children:z[e]})})}),(0,a.jsx)(l.ZI,{children:`Toggle ${z[e]}`})]},e))}),(0,a.jsxs)(c.l6,{value:D,onValueChange:e=>L(e),children:[(0,a.jsx)(c.bq,{className:"h-7 w-32 text-xs",children:(0,a.jsx)(c.yv,{})}),(0,a.jsxs)(c.gC,{children:[(0,a.jsx)(c.eb,{value:"all",children:E.all}),C.map(e=>(0,a.jsx)(c.eb,{value:e,children:E[e]},e))]})]}),(0,a.jsxs)(i.$,{size:"sm",variant:"outline",onClick:()=>b(e=>!e),children:[v?(0,a.jsx)(g.A,{}):(0,a.jsx)(p.A,{}),v?"Resume":"Pause"]}),(0,a.jsxs)(l.m_,{children:[(0,a.jsx)(l.k$,{asChild:!0,children:(0,a.jsxs)(i.$,{size:"sm",variant:k?"secondary":"outline",onClick:()=>y(e=>!e),children:[(0,a.jsx)(h.A,{}),"Follow"]})}),(0,a.jsx)(l.ZI,{children:"Auto-scroll to newest"})]}),(0,a.jsxs)(i.$,{size:"sm",variant:"outline",onClick:B,children:[(0,a.jsx)(m.A,{}),"Clear"]})]})]})]}),(0,a.jsx)(n.Wu,{className:"pt-0",children:(0,a.jsx)("div",{ref:M,className:"h-[calc(100vh-220px)] overflow-y-auto rounded-b-lg border border-border bg-card p-2 font-mono text-xs",children:0===e.length?(0,a.jsx)("span",{className:"text-muted-foreground",children:"No console logs yet."}):0===$.length?(0,a.jsx)("span",{className:"text-muted-foreground",children:"No logs match the current filters."}):(0,a.jsx)("div",{className:"divide-y divide-border/50",children:$.map((e,t)=>(0,a.jsx)(T,{entry:e},t))})})})]})}},15298:(e,t,r)=>{Promise.resolve().then(r.bind(r,13189))},18055:(e,t,r)=>{"use strict";r.d(t,{$:()=>d});var a=r(29798);r(15814);var s=r(54366),n=r(5471),i=r(80954);let o=(0,s.F)("group/button inline-flex shrink-0 items-center justify-center rounded-md border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/80",outline:"border-border bg-background shadow-xs hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 gap-1.5 px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),8px)] px-2 text-xs in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-8 gap-1 rounded-[min(var(--radius-md),10px)] px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5",lg:"h-10 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-9","icon-xs":"size-6 rounded-[min(var(--radius-md),8px)] in-data-[slot=button-group]:rounded-md [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md","icon-lg":"size-10"}},defaultVariants:{variant:"default",size:"default"}});function d({className:e,variant:t="default",size:r="default",asChild:s=!1,...l}){let c=s?i.bL:"button";return(0,a.jsx)(c,{"data-slot":"button","data-variant":t,"data-size":r,className:(0,n.cn)(o({variant:t,size:r,className:e})),...l})}},24477:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});var a=r(50009);let s={name:"pause",size:24,node:[["rect",{x:"14",y:"3",width:"5",height:"18",rx:"1",key:"kaeet6"}],["rect",{x:"5",y:"3",width:"5",height:"18",rx:"1",key:"1wsw3u"}]]};s.node;let n=(0,a.A)(s)},26339:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});var a=r(50009);let s={name:"arrow-down",size:24,node:[["path",{d:"M12 5v14",key:"s699le"}],["path",{d:"m19 12-7 7-7-7",key:"1idqje"}]]};s.node;let n=(0,a.A)(s)},28145:(e,t,r)=>{"use strict";r.d(t,{T:()=>i,a:()=>n});var a=r(15814);let s=(0,a.createContext)({});function n({children:e,size:t,color:r,strokeWidth:i,absoluteStrokeWidth:o,nonScalingStroke:d,className:l}){let c=(0,a.useMemo)(()=>({size:t,color:r,strokeWidth:i,absoluteStrokeWidth:o,nonScalingStroke:d,className:l}),[t,r,i,o,d,l]);return(0,a.createElement)(s.Provider,{value:c},e)}let i=()=>(0,a.useContext)(s)},28830:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});var a=r(50009);let s={name:"chevron-up",size:24,node:[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]};s.node;let n=(0,a.A)(s)},45111:(e,t,r)=>{"use strict";r.d(t,{bq:()=>u,eb:()=>p,gC:()=>g,l6:()=>l,yv:()=>c});var a=r(29798);r(15814);var s=r(5471),n=r(95862),i=r(58765),o=r(63587),d=r(28830);function l({...e}){return(0,a.jsx)(n.bL,{"data-slot":"select",...e})}function c({...e}){return(0,a.jsx)(n.WT,{"data-slot":"select-value",...e})}function u({className:e,size:t="default",children:r,...o}){return(0,a.jsxs)(n.l9,{"data-slot":"select-trigger","data-size":t,className:(0,s.cn)("flex w-fit items-center justify-between gap-1.5 rounded-md border border-input bg-background py-2 pr-2 pl-2.5 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),...o,children:[r,(0,a.jsx)(n.In,{asChild:!0,children:(0,a.jsx)(i.A,{className:"pointer-events-none size-4 text-muted-foreground"})})]})}function g({className:e,children:t,position:r="popper",align:i="center",...o}){return(0,a.jsx)(n.ZL,{children:(0,a.jsxs)(n.UC,{"data-slot":"select-content","data-align-trigger":"item-aligned"===r,className:(0,s.cn)("relative z-50 max-h-(--radix-select-content-available-height) min-w-36 origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95","popper"===r&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",e),position:r,align:i,...o,children:[(0,a.jsx)(h,{}),(0,a.jsx)(n.LM,{"data-position":r,className:(0,s.cn)("data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)","popper"===r&&""),children:t}),(0,a.jsx)(m,{})]})})}function p({className:e,children:t,...r}){return(0,a.jsxs)(n.q7,{"data-slot":"select-item",className:(0,s.cn)("relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",e),...r,children:[(0,a.jsx)("span",{className:"pointer-events-none absolute right-2 flex size-4 items-center justify-center",children:(0,a.jsx)(n.VF,{children:(0,a.jsx)(o.A,{className:"pointer-events-none"})})}),(0,a.jsx)(n.p4,{children:t})]})}function h({className:e,...t}){return(0,a.jsx)(n.PP,{"data-slot":"select-scroll-up-button",className:(0,s.cn)("z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4",e),...t,children:(0,a.jsx)(d.A,{})})}function m({className:e,...t}){return(0,a.jsx)(n.wn,{"data-slot":"select-scroll-down-button",className:(0,s.cn)("z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4",e),...t,children:(0,a.jsx)(i.A,{})})}},50009:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});var a=r(15814),s=r(4836);function n(e,t=[],r=[]){let i,o="string"==typeof e?function(e,t,r=[]){if(null==t)throw Error("[lucide]: iconNode is required when icon name is used");return{name:e?.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),size:24,node:t,...r.length>0?{aliases:r}:{}}}(e,t,r):e,d=(0,a.forwardRef)(({className:e,...t},r)=>(0,a.createElement)(s.A,{ref:r,icon:o,className:e,...t}));return o.name&&(d.displayName=(i=(e=>{let t="",r=!1;for(let a of e){if("-"===a||"_"===a||a<=" "){r=t.length>0;continue}0===t.length?t+=a.toLowerCase():t+=r?a.toUpperCase():a,r=!1}return t})(o.name)).charAt(0).toUpperCase()+i.slice(1)),d}},51660:(e,t,r)=>{"use strict";r.d(t,{Q2:()=>a.Q2,fg:()=>a.fg,vQ:()=>s,_$:()=>i,MA:()=>a.MA,UY:()=>d,Nu:()=>n,zN:()=>a.zN,B2:()=>o});var a=r(13794);r(80159);let s={name:"10Router Proxy",description:"AI Infrastructure Management",version:"0.1.3"},n={changelogUrl:"/api/changelog"},i=20128,o={storageKey:"theme",defaultTheme:"light"},d={maxLines:500,pollIntervalMs:1e3}},53784:(e,t,r)=>{"use strict";r.d(t,{E:()=>d});var a=r(29798);r(15814);var s=r(54366),n=r(5471),i=r(80954);let o=(0,s.F)("group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",secondary:"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",destructive:"bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20",outline:"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground",ghost:"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",link:"text-primary underline-offset-4 hover:underline"}},defaultVariants:{variant:"default"}});function d({className:e,variant:t="default",asChild:r=!1,...s}){let l=r?i.bL:"span";return(0,a.jsx)(l,{"data-slot":"badge","data-variant":t,className:(0,n.cn)(o({variant:t}),e),...s})}},58765:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});var a=r(50009);let s={name:"chevron-down",size:24,node:[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]};s.node;let n=(0,a.A)(s)},63587:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});var a=r(50009);let s={name:"check",size:24,node:[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]};s.node;let n=(0,a.A)(s)},66685:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});var a=r(50009);let s={name:"play",size:24,node:[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z",key:"10ikf1"}]]};s.node;let n=(0,a.A)(s)},74719:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});var a=r(50009);let s={name:"search",size:24,node:[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]]};s.node;let n=(0,a.A)(s)},75669:(e,t,r)=>{"use strict";r.d(t,{BT:()=>d,Wu:()=>c,X9:()=>l,ZB:()=>o,Zp:()=>n,aR:()=>i});var a=r(29798);r(15814);var s=r(5471);function n({className:e,size:t="default",...r}){return(0,a.jsx)("div",{"data-slot":"card","data-size":t,className:(0,s.cn)("group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-xl bg-card py-(--card-spacing) text-sm text-card-foreground shadow-xs ring-1 ring-foreground/10 [--card-spacing:--spacing(6)] has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(4)] *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",e),...r})}function i({className:e,...t}){return(0,a.jsx)("div",{"data-slot":"card-header",className:(0,s.cn)("group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-(--card-spacing) has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-(--card-spacing)",e),...t})}function o({className:e,...t}){return(0,a.jsx)("div",{"data-slot":"card-title",className:(0,s.cn)("font-heading text-base leading-normal font-medium group-data-[size=sm]/card:text-sm",e),...t})}function d({className:e,...t}){return(0,a.jsx)("div",{"data-slot":"card-description",className:(0,s.cn)("text-sm text-muted-foreground",e),...t})}function l({className:e,...t}){return(0,a.jsx)("div",{"data-slot":"card-action",className:(0,s.cn)("col-start-2 row-span-2 row-start-1 self-start justify-self-end",e),...t})}function c({className:e,...t}){return(0,a.jsx)("div",{"data-slot":"card-content",className:(0,s.cn)("flex flex-col gap-3 px-(--card-spacing)",e),...t})}},75877:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});var a=r(50009);let s={name:"trash",size:24,node:[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]],aliases:["trash-2"]};s.node;let n=(0,a.A)(s)},77345:(e,t,r)=>{"use strict";r.d(t,{p:()=>n});var a=r(29798);r(15814);var s=r(5471);function n({className:e,type:t,...r}){return(0,a.jsx)("input",{type:t,"data-slot":"input",className:(0,s.cn)("h-9 w-full min-w-0 rounded-md border border-input bg-background px-2.5 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",e),...r})}}},e=>{e.O(0,[5166,7552,9980,5778,4484,3577,5862,159,427,9966,7358],()=>e(e.s=15298)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6099],{},_=>{_.O(0,[6766,5166,7552,9980,1471,5778,4484,3577,5862,5113,1699,7276,1722,159,4489,1278,1830,208,2836,427,9966,7358],()=>_(_.s=92836)),_N_E=_.O()}]);
@@ -0,0 +1,10 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2421],{24715:(e,t,s)=>{Promise.resolve().then(s.bind(s,53148))},53148:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>E});var a=s(29798),o=s(50141),n=s.n(o),r=s(70782),l=s(15814),i=s(75669),d=s(18055),c=s(53784),m=s(58913),p=s(738),x=s(14670),u=s(57779),h=s(45111),f=s(49787),y=s(15764),g=s(21796),b=s(14231);function j({isOpen:e,provider:t,providerName:s,proxyPools:o,onSave:n,onClose:r}){let i="__none__",[m,p]=(0,l.useState)({name:"",apiKey:"",priority:1,proxyPoolId:i}),[x,u]=(0,l.useState)(!1),[y,g]=(0,l.useState)(null),[b,v]=(0,l.useState)(!1),w=async()=>{u(!0);try{let e=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:t,apiKey:m.apiKey})}),s=await e.json();g(s.valid?"success":"failed")}catch{g("failed")}finally{u(!1)}},N=async()=>{if(t&&m.apiKey){v(!0);try{let e=!1;try{u(!0),g(null);let s=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:t,apiKey:m.apiKey})});e=!!(await s.json()).valid,g(e?"success":"failed")}catch{g("failed")}finally{u(!1)}await n({name:m.name,apiKey:m.apiKey,priority:m.priority,proxyPoolId:m.proxyPoolId===i?null:m.proxyPoolId,testStatus:e?"active":"unknown"})}finally{v(!1)}}};return t?(0,a.jsx)(f.lG,{open:e,onOpenChange:e=>!e&&r(),children:(0,a.jsxs)(f.Cf,{className:"max-w-md",children:[(0,a.jsx)(f.c7,{children:(0,a.jsx)(f.L3,{children:`Add ${s||t} API Key`})}),(0,a.jsxs)("div",{className:"flex max-h-[calc(85vh-120px)] flex-col gap-4 overflow-y-auto p-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"text-xs text-muted-foreground mb-1 block",children:"Name"}),(0,a.jsx)("input",{className:"w-full min-w-0 px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",value:m.name,onChange:e=>p({...m,name:e.target.value}),placeholder:"Production Key"})]}),(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,a.jsx)("label",{className:"text-xs text-muted-foreground mb-1 block",children:"API Key"}),(0,a.jsx)("input",{type:"password",className:"w-full min-w-0 px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",value:m.apiKey,onChange:e=>p({...m,apiKey:e.target.value})})]}),(0,a.jsx)("div",{className:"pt-6",children:(0,a.jsx)(d.$,{onClick:w,disabled:!m.apiKey||x||b,variant:"secondary",children:x?"Checking...":"Check"})})]}),y&&(0,a.jsx)(c.E,{variant:"success"===y?"default":"destructive",children:"success"===y?"Valid":"Invalid"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"text-xs text-muted-foreground mb-1 block",children:"Priority"}),(0,a.jsx)("input",{type:"number",className:"w-full min-w-0 px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",value:m.priority,onChange:e=>p({...m,priority:Number.parseInt(e.target.value)||1})})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,a.jsx)("label",{className:"text-sm font-medium text-foreground",children:"Proxy Pool"}),(0,a.jsxs)(h.l6,{value:m.proxyPoolId,onValueChange:e=>p({...m,proxyPoolId:e}),children:[(0,a.jsx)(h.bq,{className:"w-full",children:(0,a.jsx)(h.yv,{placeholder:"None"})}),(0,a.jsxs)(h.gC,{children:[(0,a.jsx)(h.eb,{value:i,children:"None"}),(o||[]).map(e=>(0,a.jsx)(h.eb,{value:String(e.id),children:e.name},e.id))]})]})]}),(0,a.jsx)(d.$,{onClick:N,className:"w-full",disabled:!m.name||!m.apiKey||b,children:b?"Saving...":"Save"})]})]})}):null}function v({providerId:e,isOAuth:t}){let[s,o]=(0,l.useState)([]),[n,r]=(0,l.useState)([]),[c,p]=(0,l.useState)(!0),[x,u]=(0,l.useState)(!1),[h,f]=(0,l.useState)(!1),[w,N]=(0,l.useState)(null),[k,C]=(0,l.useState)(null),[S,$]=(0,l.useState)("1"),[P,T]=(0,l.useState)(null),O=(0,l.useCallback)(async()=>{try{let[t,s,a]=await Promise.all([fetch("/api/providers",{cache:"no-store"}),fetch("/api/proxy-pools?isActive=true",{cache:"no-store"}),fetch("/api/settings",{cache:"no-store"})]),n=await t.json(),l=await s.json(),i=a.ok?await a.json():{};t.ok&&o((n.connections||[]).filter(t=>t.provider===e)),s.ok&&r(l.proxyPools||[]);let d=(i.providerStrategies||{})[e]||{};C(d.fallbackStrategy||null),$(null!=d.stickyRoundRobinLimit?String(d.stickyRoundRobinLimit):"1")}catch(e){console.log("ConnectionsCard fetch error:",e)}finally{p(!1)}},[e]);(0,l.useEffect)(()=>{O()},[O]);let E=async(t,s)=>{try{let a=await fetch("/api/settings",{cache:"no-store"}),o=(a.ok?await a.json():{}).providerStrategies||{},n={};t&&(n.fallbackStrategy=t),"round-robin"===t&&""!==s&&(n.stickyRoundRobinLimit=Number(s)||3);let r={...o};0===Object.keys(n).length?delete r[e]:r[e]=n,await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({providerStrategies:r})})}catch(e){console.log("saveStrategy error:",e)}},_=async(e,t)=>{let a=[...s];[a[e],a[t]]=[a[t],a[e]],o(a);try{await Promise.all([fetch(`/api/providers/${a[e].id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({priority:e})}),fetch(`/api/providers/${a[t].id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({priority:t})})])}catch{await O()}},A=async e=>{T({title:"Delete Connection",message:"Delete this connection?",onConfirm:async()=>{T(null);try{(await fetch(`/api/providers/${e}`,{method:"DELETE"})).ok&&o(t=>t.filter(t=>t.id!==e))}catch(e){console.log("delete error:",e)}}})},K=async(e,t)=>{try{(await fetch(`/api/providers/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({isActive:t})})).ok&&o(s=>s.map(s=>s.id===e?{...s,isActive:t}:s))}catch(e){console.log("toggle error:",e)}},I=async(e,t)=>{try{(await fetch(`/api/providers/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({proxyPoolId:t||null})})).ok&&o(s=>s.map(s=>s.id===e?{...s,providerSpecificData:{...s.providerSpecificData,proxyPoolId:t||null}}:s))}catch(e){console.log("proxy error:",e)}},M=async t=>{try{(await fetch("/api/providers",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:e,...t})})).ok&&(await O(),u(!1))}catch(e){console.log("save apikey error:",e)}},R=async e=>{try{(await fetch(`/api/providers/${w.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})).ok&&(await O(),f(!1))}catch(e){console.log("update connection error:",e)}};return c?(0,a.jsx)(y.KX,{}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.Zp,{children:(0,a.jsxs)(i.Wu,{children:[(0,a.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-4",children:[(0,a.jsx)("h2",{className:"text-lg font-semibold",children:"Connections"}),(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,a.jsx)("span",{className:"text-xs text-muted-foreground font-medium",children:"Round Robin"}),(0,a.jsx)(b.d,{checked:"round-robin"===k,onCheckedChange:e=>{let t=e?"round-robin":null;C(t),e&&!S&&$("1"),E(t,e?S||"1":S)}}),"round-robin"===k&&(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-1.5",children:[(0,a.jsx)("span",{className:"text-xs text-muted-foreground",children:"Sticky:"}),(0,a.jsx)("input",{type:"number",min:1,value:S,onChange:e=>{$(e.target.value),E("round-robin",e.target.value)},className:"w-16 px-2 py-1 text-xs border border-border rounded-md bg-background focus:outline-none focus:border-primary"})]})]})]}),0===s.length?(0,a.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",children:[(0,a.jsx)("p",{className:"text-sm text-muted-foreground",children:"No connections yet"}),(0,a.jsxs)(d.$,{size:"sm",onClick:()=>u(!0),children:[(0,a.jsx)(m.default,{name:"add"}),"Add Connection"]})]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{className:"flex flex-col divide-y divide-black/[0.03] dark:divide-white/[0.03] max-h-[500px] overflow-y-auto pr-1",children:s.map((e,o)=>(0,a.jsx)(g.A,{connection:e,proxyPools:n,isOAuth:t,isFirst:0===o,isLast:o===s.length-1,onMoveUp:()=>_(o,o-1),onMoveDown:()=>_(o,o+1),onToggleActive:t=>K(e.id,t),onUpdateProxy:t=>I(e.id,t),onEdit:()=>{N(e),f(!0)},onDelete:()=>A(e.id)},e.id))}),(0,a.jsx)("div",{className:"mt-4 flex justify-stretch sm:justify-start",children:(0,a.jsxs)(d.$,{size:"sm",onClick:()=>u(!0),children:[(0,a.jsx)(m.default,{name:"add"}),"Add"]})})]})]})}),(0,a.jsx)(j,{isOpen:x,provider:e,proxyPools:n,onSave:M,onClose:()=>u(!1)}),(0,a.jsx)(y.wI,{isOpen:h,connection:w,proxyPools:n,onSave:R,onClose:()=>f(!1)}),(0,a.jsx)(y.uo,{isOpen:!!P,onClose:()=>T(null),onConfirm:P?.onConfirm,title:P?.title||"Confirm",message:P?.message,variant:"danger"})]})}var w=s(1352),N=s(80159),k=s(13794),C=s(63523);function S({model:e,fullModel:t,copied:s,onCopy:o,testStatus:n,isCustom:r,isFree:l,onDeleteAlias:i,onTest:d,isTesting:c}){let p="ok"===n?"#22c55e":"error"===n?"#ef4444":void 0;return(0,a.jsx)("div",{className:`group px-3 py-2 rounded-lg border ${"ok"===n?"border-green-500/40":"error"===n?"border-red-500/40":"border-border"} hover:bg-sidebar/50`,children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(m.default,{name:"ok"===n?"check_circle":"error"===n?"cancel":"smart_toy",className:"text-base",style:p?{color:p}:void 0}),(0,a.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,a.jsx)("code",{className:"text-xs text-muted-foreground font-mono bg-sidebar px-1.5 py-0.5 rounded",children:t}),e.name&&(0,a.jsx)("span",{className:"text-[9px] text-muted-foreground/70 italic pl-1",children:e.name})]}),d&&(0,a.jsxs)("div",{className:"relative group/btn",children:[(0,a.jsx)("button",{onClick:d,disabled:c,className:`p-0.5 hover:bg-sidebar rounded text-muted-foreground hover:text-primary transition-opacity ${c?"opacity-100":"opacity-0 group-hover:opacity-100"}`,children:(0,a.jsx)(m.default,{name:c?"progress_activity":"science",className:"text-sm",style:c?{animation:"spin 1s linear infinite"}:void 0})}),(0,a.jsx)("span",{className:"pointer-events-none absolute mt-1 top-5 left-1/2 -translate-x-1/2 text-[10px] text-muted-foreground whitespace-nowrap opacity-0 group-hover/btn:opacity-100 transition-opacity",children:c?"Testing...":"Test"})]}),(0,a.jsxs)("div",{className:"relative group/btn",children:[(0,a.jsx)("button",{onClick:()=>o(t,`model-${e.id}`),className:"p-0.5 hover:bg-sidebar rounded text-muted-foreground hover:text-primary",children:(0,a.jsx)(m.default,{name:s===`model-${e.id}`?"check":"content_copy",className:"text-sm"})}),(0,a.jsx)("span",{className:"pointer-events-none absolute mt-1 top-5 left-1/2 -translate-x-1/2 text-[10px] text-muted-foreground whitespace-nowrap opacity-0 group-hover/btn:opacity-100 transition-opacity",children:s===`model-${e.id}`?"Copied!":"Copy"})]}),l&&(0,a.jsx)("span",{className:"text-[10px] font-bold text-green-500 bg-green-500/10 px-1.5 py-0.5 rounded",children:"FREE"}),r&&(0,a.jsxs)(w.m_,{children:[(0,a.jsx)(w.k$,{asChild:!0,children:(0,a.jsx)("button",{onClick:i,className:"p-0.5 hover:bg-red-500/10 rounded text-muted-foreground hover:text-red-500 opacity-0 group-hover:opacity-100 transition-opacity ml-auto",children:(0,a.jsx)(m.default,{name:"close",className:"text-sm"})})}),(0,a.jsx)(w.ZI,{children:"Remove custom model"})]})]})})}function $({isOpen:e,onSave:t,onClose:s}){let[o,n]=(0,l.useState)(""),r=()=>{o.trim()&&(t(o.trim()),n(""))};return(0,a.jsx)(f.lG,{open:e,onOpenChange:e=>!e&&s(),children:(0,a.jsxs)(f.Cf,{className:"max-w-md",children:[(0,a.jsx)(f.c7,{children:(0,a.jsx)(f.L3,{children:"Add Custom Model"})}),(0,a.jsxs)("div",{className:"flex max-h-[calc(85vh-120px)] flex-col gap-4 overflow-y-auto p-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"text-xs text-muted-foreground mb-1 block",children:"Model ID"}),(0,a.jsx)("input",{className:"w-full min-w-0 px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",value:o,onChange:e=>n(e.target.value),onKeyDown:e=>"Enter"===e.key&&r(),placeholder:"e.g. tts-1-hd",autoFocus:!0})]}),(0,a.jsx)(d.$,{onClick:r,className:"w-full",disabled:!o.trim(),children:"Add"})]})]})})}function P({providerId:e,kindFilter:t,providerAliasOverride:s}){let{copied:o,copy:n}=(0,C.C)(),[r,d]=(0,l.useState)({}),[c,p]=(0,l.useState)([]),[x,u]=(0,l.useState)({}),[h,f]=(0,l.useState)(null),[y,g]=(0,l.useState)(""),[b,j]=(0,l.useState)(!1),v=s||(0,k.wG)(e),w=t||"llm",T=(0,l.useCallback)(async()=>{try{let[e,t]=await Promise.all([fetch("/api/models/alias"),fetch("/api/models/custom",{cache:"no-store"})]),s=await e.json(),a=await t.json();e.ok&&d(s.aliases||{}),t.ok&&p(a.models||[])}catch(e){console.log("ModelsCard fetch error:",e)}},[]);(0,l.useEffect)(()=>{T()},[T]);let O=async(e,t)=>{let s=`${v}/${e}`;try{(await fetch("/api/models/alias",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:s,alias:t})})).ok&&await T()}catch(e){console.log("set alias error:",e)}},E=async e=>{try{(await fetch(`/api/models/alias?alias=${encodeURIComponent(e)}`,{method:"DELETE"})).ok&&await T()}catch(e){console.log("delete alias error:",e)}},_=async e=>{try{(await fetch("/api/models/custom",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({providerAlias:v,id:e,type:w})})).ok&&(await T(),window.dispatchEvent(new CustomEvent("customModelChanged")))}catch(e){console.log("add custom model error:",e)}},A=async e=>{try{let t=new URLSearchParams({providerAlias:v,id:e,type:w});(await fetch(`/api/models/custom?${t}`,{method:"DELETE"})).ok&&(await T(),window.dispatchEvent(new CustomEvent("customModelChanged")))}catch(e){console.log("delete custom model error:",e)}},K=async e=>{if(!h){f(e);try{let s=await fetch("/api/models/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:`${v}/${e}`,kind:t})}),a=await s.json();u(t=>({...t,[e]:a.ok?"ok":"error"})),g(a.ok?"":a.error||"Model not reachable")}catch{u(t=>({...t,[e]:"error"})),g("Network error")}finally{f(null)}}},I=(0,N.KC)(e),M=t?I.filter(e=>e.kinds?e.kinds.includes(t):(0,N.CP)(e,"llm")===t):I,R=c.filter(e=>e.providerAlias===v&&(0,N.CP)(e,"llm")===w&&!M.some(t=>t.id===e.id));return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.Zp,{children:(0,a.jsxs)(i.Wu,{children:[(0,a.jsx)("div",{className:"flex items-center justify-between mb-4",children:(0,a.jsxs)("h2",{className:"text-lg font-semibold",children:["Models",t?` — ${t.toUpperCase()}`:""]})}),y&&(0,a.jsx)("p",{className:"text-xs text-red-500 mb-3 break-words",children:y}),(0,a.jsxs)("div",{className:"flex flex-wrap gap-3",children:[M.map(e=>{let t=`${v}/${e.id}`,s=Object.entries(r).find(([,e])=>e===t)?.[0];return(0,a.jsx)(S,{model:e,fullModel:`${v}/${e.id}`,alias:s,copied:o,onCopy:n,onSetAlias:t=>O(e.id,t),onDeleteAlias:()=>E(s),testStatus:x[e.id],onTest:()=>K(e.id),isTesting:h===e.id,isFree:e.isFree},e.id)}),R.map(e=>(0,a.jsx)(S,{model:{id:e.id,name:e.name},fullModel:`${v}/${e.id}`,copied:o,onCopy:n,onSetAlias:()=>{},onDeleteAlias:()=>A(e.id),testStatus:x[e.id],onTest:()=>K(e.id),isTesting:h===e.id,isCustom:!0},`${e.id}-${e.type}`)),(0,a.jsxs)("button",{onClick:()=>j(!0),className:"flex items-center gap-1.5 px-3 py-2 rounded-lg border border-dashed border-black/15 dark:border-white/15 text-xs text-muted-foreground hover:text-primary hover:border-primary/40 transition-colors",children:[(0,a.jsx)(m.default,{name:"add",className:"text-sm"}),"Add Model"]})]})]})}),(0,a.jsx)($,{isOpen:b,onSave:async e=>{await _(e),j(!1)},onClose:()=>j(!1)})]})}function T({label:e,children:t}){return(0,a.jsxs)("div",{className:"flex min-w-0 flex-col gap-1.5 sm:flex-row sm:items-center sm:gap-3",children:[(0,a.jsx)("span",{className:"w-full text-xs font-medium text-muted-foreground sm:w-20 sm:shrink-0",children:e}),(0,a.jsx)("div",{className:"w-full min-w-0 flex-1",children:t})]})}let O="Does this request require urgent attention?";function E(){let{id:e}=(0,r.useParams)(),t=k.rj.find(e=>"systemone"===e.id);if(!t)return(0,r.notFound)();let s=k.Q2[e]||(0,k.zt)(e);if(!s)return(0,r.notFound)();let o=s.id,h=s.serviceKinds??["llm"];if(!h.includes("systemone"))return(0,r.notFound)();let f=(0,k.wG)(o),y=(0,N.KC)(o).filter(e=>"systemone"===(0,N.CP)(e)),[g,b]=(0,l.useState)(y[0]?.id??""),[j,w]=(0,l.useState)("My payments have failed for three days and I am losing sales. Please help now."),[S,$]=(0,l.useState)(O),[E,_]=(0,l.useState)(""),[A,K]=(0,l.useState)(!1),[I,M]=(0,l.useState)(""),[R,D]=(0,l.useState)(null),[U,J]=(0,l.useState)(null),[F,L]=(0,l.useState)(""),{copied:z,copy:q}=(0,C.C)(),{copied:G,copy:H}=(0,C.C)();(0,l.useEffect)(()=>{L(window.location.origin),fetch("/api/keys").then(e=>e.json()).then(e=>{_((e.keys||[]).find(e=>!1!==e.isActive)?.key||"")}).catch(()=>{})},[]);let Z=g?`${f}/${g}`:f,W={model:Z,state:j,questions:{is_urgent:{type:"noul",instructions:S.trim()||O}}},B=F||window.location.origin,Q=t.endpoint.path,V=`curl -X ${t.endpoint.method} ${B}${Q} \\
2
+ -H "Content-Type: application/json" \\
3
+ -H "Authorization: Bearer ${E||"YOUR_KEY"}" \\
4
+ -d '${JSON.stringify(W)}'`,X=async()=>{if(!j.trim()||!Z)return;K(!0),M(""),D(null),J(null);let e=Date.now();try{let s={"Content-Type":"application/json"};E&&(s.Authorization=`Bearer ${E}`);let a=await fetch(`/api${Q}`,{method:t.endpoint.method,headers:s,body:JSON.stringify(W)}),o=await a.json().catch(()=>({}));if(J(Date.now()-e),!a.ok)return void M(o?.error?.message||o?.error||`HTTP ${a.status}`);D(o)}catch(e){M(e.message||"Network error")}finally{K(!1)}},Y=R?JSON.stringify(R,null,2):"";return(0,a.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)(d.$,{variant:"outline",size:"sm",asChild:!0,className:"mb-4 self-start",children:(0,a.jsxs)(n(),{href:"/dashboard/media-providers/systemone",children:[(0,a.jsx)(m.default,{name:"arrow_back",className:"text-lg"}),"System One"]})}),(0,a.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:gap-4",children:[(0,a.jsx)("div",{className:"size-12 rounded-lg flex items-center justify-center shrink-0",style:{backgroundColor:`${s.color}15`},children:(0,a.jsx)(p.A,{src:`/providers/${o}.png`,alt:s.name,size:48,className:"object-contain rounded-lg max-w-[48px] max-h-[48px]",fallbackText:s.textIcon||o.slice(0,2).toUpperCase(),fallbackColor:s.color})}),(0,a.jsxs)("div",{className:"flex-1",children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-2 sm:gap-3",children:[(0,a.jsx)("h1",{className:"text-3xl font-semibold tracking-tight",children:s.name}),s.notice?.apiKeyUrl&&(0,a.jsxs)("a",{href:s.notice.apiKeyUrl,target:"_blank",rel:"noopener noreferrer",className:"text-xs text-primary hover:underline inline-flex items-center gap-1",children:[(0,a.jsx)(m.default,{name:"open_in_new",className:"text-sm"}),"Get API Key"]})]}),(0,a.jsx)("div",{className:"flex items-center gap-1.5 mt-1 flex-wrap",children:h.map(e=>(0,a.jsx)(c.E,{variant:"systemone"===e?"default":"secondary",children:e.toUpperCase()},e))})]})]})]}),s.noAuth?(0,a.jsx)(x.default,{providerId:o}):(0,a.jsx)(v,{providerId:o,isOAuth:!1}),(0,a.jsx)(P,{providerId:o,kindFilter:"systemone"}),s.systemoneConfig&&(0,a.jsx)(u.default,{config:s.systemoneConfig,provider:s,title:"System One Config"}),(0,a.jsx)(i.Zp,{children:(0,a.jsxs)(i.Wu,{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold mb-4",children:"Example"}),(0,a.jsxs)("div",{className:"flex flex-col gap-2.5",children:[y.length>0?(0,a.jsx)(T,{label:"Model",children:(0,a.jsx)("select",{value:g,onChange:e=>b(e.target.value),className:"w-full px-3 py-1.5 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",children:y.map(e=>(0,a.jsx)("option",{value:e.id,children:e.name||e.id},e.id))})}):(0,a.jsx)(T,{label:"Model",children:(0,a.jsx)("input",{value:g,onChange:e=>b(e.target.value),placeholder:"Enter model id (provider-specific)",className:"w-full px-3 py-1.5 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary font-mono"})}),(0,a.jsx)(T,{label:"Endpoint",children:(0,a.jsxs)("span",{className:"w-full min-w-0 flex-1 px-3 py-1.5 text-sm font-mono bg-sidebar rounded-lg truncate block",children:[B,Q]})}),(0,a.jsx)(T,{label:"API Key",children:(0,a.jsx)("span",{className:"px-3 py-1.5 text-sm font-mono bg-sidebar rounded-lg truncate block",children:E?`${E.slice(0,8)}${"•".repeat(Math.min(20,Math.max(0,E.length-8)))}`:(0,a.jsx)("span",{className:"text-muted-foreground italic",children:"No key configured"})})}),(0,a.jsx)(T,{label:"State",children:(0,a.jsxs)("div",{className:"relative",children:[(0,a.jsx)("input",{value:j,onChange:e=>w(e.target.value),placeholder:"Situation, support ticket, or text to evaluate",className:"w-full px-3 py-1.5 pr-7 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"}),j&&(0,a.jsx)("button",{type:"button",onClick:()=>w(""),className:"absolute right-2 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-primary transition-colors",children:(0,a.jsx)(m.default,{name:"close",className:"text-[14px]"})})]})}),(0,a.jsx)(T,{label:"Question",children:(0,a.jsxs)("div",{className:"relative",children:[(0,a.jsx)("input",{value:S,onChange:e=>$(e.target.value),placeholder:"Enter evaluation question or criteria",className:"w-full px-3 py-1.5 pr-7 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"}),S&&(0,a.jsx)("button",{type:"button",onClick:()=>$(""),className:"absolute right-2 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-primary transition-colors",children:(0,a.jsx)(m.default,{name:"close",className:"text-[14px]"})})]})}),(0,a.jsxs)("div",{className:"mt-1",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between mb-1.5",children:[(0,a.jsx)("span",{className:"text-xs font-semibold text-muted-foreground uppercase tracking-wider",children:"Request"}),(0,a.jsxs)("div",{className:"flex w-full flex-col gap-2 sm:w-auto sm:flex-row sm:items-center",children:[(0,a.jsxs)("button",{onClick:()=>q(V),className:"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-primary transition-colors",children:[(0,a.jsx)(m.default,{name:z?"check":"content_copy",className:"text-[14px]"}),z?"Copied":"Copy"]}),(0,a.jsxs)("button",{onClick:X,disabled:A||!j.trim()||!Z,className:"flex w-full sm:w-auto items-center justify-center gap-1.5 px-3 py-1 rounded-lg bg-primary text-white text-xs font-medium hover:bg-primary/90 transition-colors disabled:opacity-50 disabled:cursor-not-allowed",children:[(0,a.jsx)(m.default,{name:"play_arrow",className:"text-[14px]",style:A?{animation:"spin 1s linear infinite"}:void 0}),A?"Running...":"Run"]})]})]}),(0,a.jsx)("pre",{className:"bg-sidebar rounded-lg px-3 py-2.5 text-xs font-mono overflow-x-auto whitespace-pre-wrap break-all",children:V})]}),I&&(0,a.jsx)("p",{className:"text-xs text-red-500 break-words",children:I}),(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between mb-1.5",children:[(0,a.jsxs)("span",{className:"text-xs font-semibold text-muted-foreground uppercase tracking-wider",children:["Response"," ",null!==U&&(0,a.jsxs)("span",{className:"font-normal normal-case",children:["⚡ ",U,"ms"]})]}),R&&(0,a.jsxs)("button",{onClick:()=>H(Y),className:"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-primary transition-colors",children:[(0,a.jsx)(m.default,{name:G?"check":"content_copy",className:"text-[14px]"}),G?"Copied":"Copy"]})]}),(0,a.jsx)("pre",{className:"bg-sidebar rounded-lg px-3 py-2.5 text-xs font-mono overflow-x-auto whitespace-pre-wrap break-all opacity-70",children:R?Y:`{
5
+ "model": "jev-1.13",
6
+ "answers": {
7
+ "is_urgent": { "type": "noul", "noul": 0.99 }
8
+ },
9
+ "usage": { "input_tokens": 312, "output_tokens": 48 }
10
+ }`})]})]})]})})]})}}},e=>{e.O(0,[6766,5166,7552,9980,1471,5778,4484,3577,5862,5113,1699,7276,1722,159,4489,1278,1830,208,9369,427,9966,7358],()=>e(e.s=24715)),_N_E=e.O()}]);