cartethyia 2.7.4 → 2.7.6

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 (595) hide show
  1. package/.env.example +5 -0
  2. package/README.md +18 -6
  3. package/dist/dashboard/assets/BannedPage-B1N603cM.js +1 -0
  4. package/dist/dashboard/assets/BannedPage-B1N603cM.js.gz +0 -0
  5. package/dist/dashboard/assets/CliToolDetailPage-9q4_4NoK.js +3 -0
  6. package/dist/dashboard/assets/CliToolDetailPage-9q4_4NoK.js.gz +0 -0
  7. package/dist/dashboard/assets/CliToolsPage-DwshGtK-.js +1 -0
  8. package/dist/dashboard/assets/CliToolsPage-DwshGtK-.js.gz +0 -0
  9. package/dist/dashboard/assets/CombosPage-D762MIkp.js +1 -0
  10. package/dist/dashboard/assets/CombosPage-D762MIkp.js.gz +0 -0
  11. package/dist/dashboard/assets/ConsoleLogPage-KRYjHZsX.js +1 -0
  12. package/dist/dashboard/assets/ConsoleLogPage-KRYjHZsX.js.gz +0 -0
  13. package/dist/dashboard/assets/CustomizationPage-DXsxk5uM.js +1 -0
  14. package/dist/dashboard/assets/CustomizationPage-DXsxk5uM.js.gz +0 -0
  15. package/dist/dashboard/assets/HealthEventsModal-BEjAjD4F.js +1 -0
  16. package/dist/dashboard/assets/HealthEventsModal-BEjAjD4F.js.gz +0 -0
  17. package/dist/dashboard/assets/InjectSystemPromptPanel-d5v3K_Yc.js +899 -0
  18. package/dist/dashboard/assets/InjectSystemPromptPanel-d5v3K_Yc.js.gz +0 -0
  19. package/dist/dashboard/assets/LoginPage-Ccv4tjNS.js +1 -0
  20. package/dist/dashboard/assets/LoginPage-Ccv4tjNS.js.gz +0 -0
  21. package/dist/dashboard/assets/{ModelPicker-BMS2t8BA.js → ModelPicker-C6WlpU5E.js} +1 -1
  22. package/dist/dashboard/assets/ModelPicker-C6WlpU5E.js.gz +0 -0
  23. package/dist/dashboard/assets/OverviewPage-DN9fYNWA.js +1 -0
  24. package/dist/dashboard/assets/OverviewPage-DN9fYNWA.js.gz +0 -0
  25. package/dist/dashboard/assets/ProviderDetailPage-BY0ieUgz.js +5 -0
  26. package/dist/dashboard/assets/ProviderDetailPage-BY0ieUgz.js.gz +0 -0
  27. package/dist/dashboard/assets/ProviderIcon-jjqXJDA3.js +1 -0
  28. package/dist/dashboard/assets/ProviderIcon-jjqXJDA3.js.gz +0 -0
  29. package/dist/dashboard/assets/ProvidersPage-DNsbfea2.js +1 -0
  30. package/dist/dashboard/assets/ProvidersPage-DNsbfea2.js.gz +0 -0
  31. package/dist/dashboard/assets/{ProxyPage-lsrx7NYg.js → ProxyPage-DxjvUzSD.js} +1 -1
  32. package/dist/dashboard/assets/ProxyPage-DxjvUzSD.js.gz +0 -0
  33. package/dist/dashboard/assets/QuotaPage-OaHScjpX.js +1 -0
  34. package/dist/dashboard/assets/QuotaPage-OaHScjpX.js.gz +0 -0
  35. package/dist/dashboard/assets/SettingsPage-BW4AKj2H.js +1 -0
  36. package/dist/dashboard/assets/SettingsPage-BW4AKj2H.js.gz +0 -0
  37. package/dist/dashboard/assets/SetupPage-44BZrxFC.js +1 -0
  38. package/dist/dashboard/assets/SetupPage-44BZrxFC.js.gz +0 -0
  39. package/dist/dashboard/assets/{StudioPage-Cq5tW7hW.js → StudioPage-DRPavCdU.js} +4 -4
  40. package/dist/dashboard/assets/StudioPage-DRPavCdU.js.gz +0 -0
  41. package/dist/dashboard/assets/ToolIcon-CfeLA-Z_.js +1 -0
  42. package/dist/dashboard/assets/ToolIcon-CfeLA-Z_.js.gz +0 -0
  43. package/dist/dashboard/assets/UsagePage-B7M7LvMM.js +56 -0
  44. package/dist/dashboard/assets/UsagePage-B7M7LvMM.js.gz +0 -0
  45. package/dist/dashboard/assets/api-keys-KvX83mRe.js +1 -0
  46. package/dist/dashboard/assets/api-keys-KvX83mRe.js.gz +0 -0
  47. package/dist/dashboard/assets/app-DRnQLhsc.js +9 -0
  48. package/dist/dashboard/assets/app-DRnQLhsc.js.gz +0 -0
  49. package/dist/dashboard/assets/app-mweRcsKp.css +2 -0
  50. package/dist/dashboard/assets/app-mweRcsKp.css.gz +0 -0
  51. package/dist/dashboard/assets/assert-CidQVoNo.js +1 -0
  52. package/dist/dashboard/assets/assert-CidQVoNo.js.gz +0 -0
  53. package/dist/dashboard/assets/{badge-D9CS6dZk.js → badge-BaX2GTrn.js} +1 -1
  54. package/dist/dashboard/assets/badge-BaX2GTrn.js.gz +0 -0
  55. package/dist/dashboard/assets/{banner-DympBNq4.js → banner-DFH4Bkte.js} +1 -1
  56. package/dist/dashboard/assets/banner-DFH4Bkte.js.gz +0 -0
  57. package/dist/dashboard/assets/brand/login_register.jpg +0 -0
  58. package/dist/dashboard/assets/brand/login_register_initial.jpg +0 -0
  59. package/dist/dashboard/assets/brand/og_bansos.jpg +0 -0
  60. package/dist/dashboard/assets/brand/og_image.jpg +0 -0
  61. package/dist/dashboard/assets/{card-ibRWU_uT.js → card-CxDw0lK6.js} +1 -1
  62. package/dist/dashboard/assets/card-CxDw0lK6.js.gz +0 -0
  63. package/dist/dashboard/assets/chevron-left-Bf6CaTSJ.js +1 -0
  64. package/dist/dashboard/assets/chevron-left-Bf6CaTSJ.js.gz +0 -0
  65. package/dist/dashboard/assets/circle-question-mark-Cz4un8sH.js +1 -0
  66. package/dist/dashboard/assets/circle-question-mark-Cz4un8sH.js.gz +0 -0
  67. package/dist/dashboard/assets/cli-tools-Bwv5-zGZ.js +1 -0
  68. package/dist/dashboard/assets/cli-tools-Bwv5-zGZ.js.gz +0 -0
  69. package/dist/dashboard/assets/{clipboard-button-DJm-9pz7.js → clipboard-button-DfS1ntiq.js} +1 -1
  70. package/dist/dashboard/assets/clipboard-button-DfS1ntiq.js.gz +0 -0
  71. package/dist/dashboard/assets/dialog-BK-NRr5u.js +1 -0
  72. package/dist/dashboard/assets/dialog-BK-NRr5u.js.gz +0 -0
  73. package/dist/dashboard/assets/{drawer-CqGYeOrd.js → drawer-QqPul6sC.js} +1 -1
  74. package/dist/dashboard/assets/drawer-QqPul6sC.js.gz +0 -0
  75. package/dist/dashboard/assets/entry-BMlYJVFj.js +1 -0
  76. package/dist/dashboard/assets/entry-BMlYJVFj.js.gz +0 -0
  77. package/dist/dashboard/assets/entry-D6WvojeD.js +4 -0
  78. package/dist/dashboard/assets/entry-D6WvojeD.js.gz +0 -0
  79. package/dist/dashboard/assets/entry-Dmx7gBiN.js +1 -0
  80. package/dist/dashboard/assets/entry-Dmx7gBiN.js.gz +0 -0
  81. package/dist/dashboard/assets/{formatters-D-MTJxMr.js → formatters-u7JPB5BX.js} +1 -1
  82. package/dist/dashboard/assets/formatters-u7JPB5BX.js.gz +0 -0
  83. package/dist/dashboard/assets/house-h9AZlJuT.js +1 -0
  84. package/dist/dashboard/assets/house-h9AZlJuT.js.gz +0 -0
  85. package/dist/dashboard/assets/{index-DBNPOfhV.js → index-Ko4dLRnV.js} +2 -2
  86. package/dist/dashboard/assets/index-Ko4dLRnV.js.gz +0 -0
  87. package/dist/dashboard/assets/{inline-BT0zntEr.js → inline-CHJQwxLa.js} +1 -1
  88. package/dist/dashboard/assets/inline-CHJQwxLa.js.gz +0 -0
  89. package/dist/dashboard/assets/{input-Da2ZViWg.js → input-BlmlizVV.js} +1 -1
  90. package/dist/dashboard/assets/input-BlmlizVV.js.gz +0 -0
  91. package/dist/dashboard/assets/{layout-BXNeLw6M.js → layout-Bz93I-yE.js} +1 -1
  92. package/dist/dashboard/assets/layout-Bz93I-yE.js.gz +0 -0
  93. package/dist/dashboard/assets/{list-row-BycOrrIV.js → list-row-Ml16KCfu.js} +1 -1
  94. package/dist/dashboard/assets/list-row-Ml16KCfu.js.gz +0 -0
  95. package/dist/dashboard/assets/live-7_QpnYGu.js +1 -0
  96. package/dist/dashboard/assets/live-7_QpnYGu.js.gz +0 -0
  97. package/dist/dashboard/assets/{mutation-Rr0TIvcj.js → mutation-GU7XdEjz.js} +1 -1
  98. package/dist/dashboard/assets/mutation-GU7XdEjz.js.gz +0 -0
  99. package/dist/dashboard/assets/network-CuMDaTzT.js +1 -0
  100. package/dist/dashboard/assets/network-CuMDaTzT.js.gz +0 -0
  101. package/dist/dashboard/assets/numbers-CoqpaDMx.js +2 -0
  102. package/dist/dashboard/assets/numbers-CoqpaDMx.js.gz +0 -0
  103. package/dist/dashboard/assets/pagination-B5aOoweZ.js +1 -0
  104. package/dist/dashboard/assets/pagination-B5aOoweZ.js.gz +0 -0
  105. package/dist/dashboard/assets/providers/zai.webp +0 -0
  106. package/dist/dashboard/assets/providers/zcode.webp +0 -0
  107. package/dist/dashboard/assets/{query-keys-BloKtaXJ.js → query-keys-YSoQOUh6.js} +1 -1
  108. package/dist/dashboard/assets/{query-keys-BloKtaXJ.js.gz → query-keys-YSoQOUh6.js.gz} +0 -0
  109. package/dist/dashboard/assets/quota-DJ1QlAOq.js +1 -0
  110. package/dist/dashboard/assets/quota-DJ1QlAOq.js.gz +0 -0
  111. package/dist/dashboard/assets/routing-fnCsxgNO.js +1 -0
  112. package/dist/dashboard/assets/routing-fnCsxgNO.js.gz +0 -0
  113. package/dist/dashboard/assets/{select-BIYIBkMU.js → select-BHqpd-bg.js} +2 -2
  114. package/dist/dashboard/assets/select-BHqpd-bg.js.gz +0 -0
  115. package/dist/dashboard/assets/settings-BxslsErn.js +1 -0
  116. package/dist/dashboard/assets/settings-BxslsErn.js.gz +0 -0
  117. package/dist/dashboard/assets/shield-BMQNxORh.js +1 -0
  118. package/dist/dashboard/assets/shield-BMQNxORh.js.gz +0 -0
  119. package/dist/dashboard/assets/{stack-DfgnFDWY.js → stack-j7cXjgYX.js} +1 -1
  120. package/dist/dashboard/assets/stack-j7cXjgYX.js.gz +0 -0
  121. package/dist/dashboard/assets/{state-CkfdYWel.js → state-DHmEnLa2.js} +1 -1
  122. package/dist/dashboard/assets/state-DHmEnLa2.js.gz +0 -0
  123. package/dist/dashboard/assets/{switch-SYm237HG.js → switch-DmZcyTIC.js} +1 -1
  124. package/dist/dashboard/assets/switch-DmZcyTIC.js.gz +0 -0
  125. package/dist/dashboard/assets/{useMutation-BQqCRNIi.js → useMutation-CbCP4w1o.js} +1 -1
  126. package/dist/dashboard/assets/useMutation-CbCP4w1o.js.gz +0 -0
  127. package/dist/dashboard/console-backgrounds.jpg +0 -0
  128. package/dist/dashboard/console-backgrounds_initial.jpg +0 -0
  129. package/dist/dashboard/index.html +2 -2
  130. package/dist/dashboard/index.html.gz +0 -0
  131. package/dist/dashboard/precompressed-assets.json +60 -59
  132. package/migrations/full-postgres/0036_system_prompt_presets_refs.sql +10 -0
  133. package/migrations/full-postgres/0037_share_concurrency_scope.sql +3 -0
  134. package/migrations/full-postgres/0038_add_accounts_quota_snapshot.sql +7 -0
  135. package/migrations/full-postgres/0039_add_telemetry_provider_model_indexes.sql +13 -0
  136. package/migrations/full-postgres/0040_add_models_dialect.sql +3 -0
  137. package/migrations/full-postgres/0041_add_daily_checkin_ledger_account_fk.sql +7 -0
  138. package/migrations/full-postgres/0042_add_telemetry_degenerate_stop.sql +14 -0
  139. package/migrations/lite-sqlite3/0036_system_prompt_presets_refs.sql +14 -0
  140. package/migrations/lite-sqlite3/0037_share_concurrency_scope.sql +3 -0
  141. package/migrations/lite-sqlite3/0038_add_accounts_quota_snapshot.sql +4 -0
  142. package/migrations/lite-sqlite3/0039_add_telemetry_provider_model_indexes.sql +6 -0
  143. package/migrations/lite-sqlite3/0040_add_models_dialect.sql +3 -0
  144. package/migrations/lite-sqlite3/0041_add_daily_checkin_ledger_account_fk.sql +26 -0
  145. package/migrations/lite-sqlite3/0042_add_telemetry_degenerate_stop.sql +12 -0
  146. package/package.json +4 -6
  147. package/scripts/cli/update.ts +15 -41
  148. package/src/boot/app.ts +58 -2
  149. package/src/boot/dependencies.ts +794 -732
  150. package/src/boot/lifecycle.ts +11 -12
  151. package/src/config/cooldowns.ts +34 -55
  152. package/src/config/network.ts +1 -1
  153. package/src/config/package-paths.ts +1 -1
  154. package/src/config/providers.ts +19 -14
  155. package/src/config/resources.ts +0 -5
  156. package/src/config/runtime.ts +2 -5
  157. package/src/config/spec.ts +33 -6
  158. package/src/config/usage.ts +27 -0
  159. package/src/console/api-keys/ban-constants.ts +38 -0
  160. package/src/console/api-keys/contracts.ts +71 -62
  161. package/src/console/api-keys/routes.ts +56 -24
  162. package/src/console/auth/access.ts +4 -4
  163. package/src/console/auth/account-reset.ts +1 -1
  164. package/src/console/auth/audit-recorder.ts +1 -1
  165. package/src/console/auth/lockout.ts +7 -3
  166. package/src/console/auth/row-coercion.ts +57 -12
  167. package/src/console/auth/session-resolver.ts +1 -1
  168. package/src/console/auth/session-service.ts +8 -2
  169. package/src/console/auth/session.ts +37 -31
  170. package/src/console/auth/setup-service.ts +4 -3
  171. package/src/console/auth/user-store.ts +1 -1
  172. package/src/console/backup/9router-map.ts +0 -3
  173. package/src/console/backup/contracts.ts +9 -9
  174. package/src/console/backup/export-endpoint.ts +5 -6
  175. package/src/console/backup/nine-router.ts +1 -7
  176. package/src/console/backup/routes.ts +29 -33
  177. package/src/console/backup/service.ts +468 -468
  178. package/src/console/backup/store.ts +47 -29
  179. package/src/console/backup/validate.ts +11 -1
  180. package/src/console/cli-tools/contracts.ts +43 -299
  181. package/src/console/cli-tools/fs-ops.ts +29 -0
  182. package/src/console/cli-tools/injectors/claude.ts +3 -3
  183. package/src/console/cli-tools/injectors/codex.ts +181 -181
  184. package/src/console/cli-tools/injectors/driver.ts +150 -247
  185. package/src/console/cli-tools/injectors/kilo.ts +146 -21
  186. package/src/console/cli-tools/injectors/opencode.ts +176 -153
  187. package/src/console/cli-tools/routes.ts +7 -1
  188. package/src/console/cli-tools/service.ts +8 -7
  189. package/src/console/cli-tools/store.ts +2 -2
  190. package/src/console/console-router.ts +32 -0
  191. package/src/console/dashboard-assets.ts +9 -9
  192. package/src/console/domain-registration.ts +16 -2
  193. package/src/console/inferhub/client.ts +0 -7
  194. package/src/console/inferhub/key-store.ts +1 -1
  195. package/src/console/inferhub/normalize.ts +2 -2
  196. package/src/console/inferhub/routes.ts +1 -1
  197. package/src/console/inferhub/types.ts +1 -1
  198. package/src/console/observability/contracts.ts +7 -1
  199. package/src/console/observability/live.ts +31 -18
  200. package/src/console/observability/logs.ts +1 -1
  201. package/src/console/observability/sse.ts +62 -8
  202. package/src/console/observability/store.ts +23 -4
  203. package/src/console/providers/catalog/catalog-projections.ts +1 -1
  204. package/src/console/providers/catalog/contracts.ts +39 -0
  205. package/src/console/providers/catalog/model-operations.ts +1 -1
  206. package/src/console/providers/catalog/provider-operations.ts +95 -17
  207. package/src/console/providers/catalog/public-model-store.ts +0 -0
  208. package/src/console/providers/catalog/routes.ts +27 -3
  209. package/src/console/providers/catalog/store.ts +147 -8
  210. package/src/console/providers/detail/routes.ts +1 -1
  211. package/src/console/providers/oauth/callback-listener.ts +100 -18
  212. package/src/console/providers/oauth/routes.ts +92 -13
  213. package/src/console/quota/account-quota-global.ts +41 -3
  214. package/src/console/quota/account-quota-shared.ts +10 -3
  215. package/src/console/quota/account-quota-tenant.ts +259 -66
  216. package/src/console/quota/daily-growth-job.ts +308 -0
  217. package/src/console/quota/native-identity.ts +2 -2
  218. package/src/console/quota/quota-view.ts +1 -1
  219. package/src/console/remote-support/routes.ts +1 -1
  220. package/src/console/remote-support/service.ts +2 -2
  221. package/src/console/routing/model/contracts.ts +1 -1
  222. package/src/console/routing/pools/contracts.ts +2 -2
  223. package/src/console/routing/pools/import-parse.ts +3 -3
  224. package/src/console/routing/pools/relay-deploy.ts +3 -3
  225. package/src/console/settings/contracts.ts +29 -2
  226. package/src/console/settings/store.ts +20 -0
  227. package/src/console/share/share-router.ts +100 -32
  228. package/src/console/share/share-stats.ts +11 -13
  229. package/src/console/share/share-usage.ts +1 -1
  230. package/src/console/shared/errors.ts +2 -2
  231. package/src/console/shared/object.ts +18 -0
  232. package/src/console/shared/read-through-cache.ts +4 -4
  233. package/src/console/shared/transaction.ts +14 -0
  234. package/src/console/system-prompt/contracts.ts +89 -12
  235. package/src/console/system-prompt/routes.ts +98 -45
  236. package/src/console/updates/apply-update.ts +244 -0
  237. package/src/console/updates/routes.ts +252 -97
  238. package/src/main.ts +11 -5
  239. package/src/network/http2-bidi.ts +1 -1
  240. package/src/network/ip-utils.ts +298 -0
  241. package/src/network/outbound-fetch.ts +1 -1
  242. package/src/network/pool/agent.ts +7 -6
  243. package/src/network/pool/byte-accounting.ts +1 -1
  244. package/src/network/pool/resolver.ts +16 -12
  245. package/src/network/pool/selector.ts +150 -136
  246. package/src/network/pool-health-machine.ts +1 -1
  247. package/src/network/rate-limit-verdict.ts +1 -1
  248. package/src/network/retry.ts +1 -1
  249. package/src/network/ssrf.ts +20 -71
  250. package/src/observability/event-log.ts +9 -2
  251. package/src/observability/event-query.ts +61 -291
  252. package/src/observability/log-sanitize.ts +1 -1
  253. package/src/observability/metrics.ts +4 -4
  254. package/src/observability/payload-capture.ts +6 -5
  255. package/src/observability/payload-store.ts +1 -1
  256. package/src/observability/runtime-metrics.ts +1 -1
  257. package/src/observability/telemetry-buffer.ts +19 -3
  258. package/src/observability/telemetry-reconciliation.ts +3 -3
  259. package/src/observability/token-speed.ts +1 -1
  260. package/src/persistence/connection-url.ts +1 -1
  261. package/src/persistence/db-handle.ts +1 -1
  262. package/src/persistence/db-pg.ts +2 -2
  263. package/src/persistence/db-sqlite.ts +3 -3
  264. package/src/persistence/dialect.ts +5 -1
  265. package/src/persistence/readiness.ts +1 -1
  266. package/src/persistence/redis.ts +1 -1
  267. package/src/persistence/schema.ts +121 -40
  268. package/src/persistence/shared-cache.ts +2 -2
  269. package/src/persistence/sort-order.ts +1 -1
  270. package/src/persistence/stores/api-key-store.ts +29 -2
  271. package/src/persistence/stores/share-store.ts +20 -8
  272. package/src/persistence/system-prompt-store.ts +63 -18
  273. package/src/persistence/tenant-preferences.ts +1 -1
  274. package/src/persistence/ttl-cache.ts +3 -3
  275. package/src/persistence/usage-flush.ts +7 -2
  276. package/src/protocol/canonical-model.ts +1 -1
  277. package/src/protocol/codecs.ts +6 -10
  278. package/src/protocol/dsml.ts +8 -125
  279. package/src/protocol/image-clamp.ts +2 -2
  280. package/src/protocol/reasoning-text.ts +1 -1
  281. package/src/protocol/reasoning.ts +7 -52
  282. package/src/protocol/registry.ts +50 -15
  283. package/src/protocol/request/chat.ts +46 -19
  284. package/src/protocol/request/codex.ts +1 -1
  285. package/src/protocol/request/messages.ts +46 -14
  286. package/src/protocol/request/responses.ts +19 -10
  287. package/src/protocol/response/chat.ts +25 -10
  288. package/src/protocol/response/codex.ts +1 -1
  289. package/src/protocol/response/messages.ts +1 -1
  290. package/src/protocol/response/omp-tool-call-markup.ts +1 -1
  291. package/src/protocol/response/responses.ts +1 -1
  292. package/src/protocol/sse-decoder.ts +50 -1
  293. package/src/protocol/stop-reason.ts +2 -2
  294. package/src/protocol/think-split.ts +347 -0
  295. package/src/protocol/translation/attachment-integrity.ts +3 -3
  296. package/src/protocol/translation/cache-controls.ts +8 -20
  297. package/src/protocol/translation/capabilities.ts +6 -6
  298. package/src/protocol/translation/dialect/deepseek.ts +10 -0
  299. package/src/protocol/translation/dialect/inband.ts +39 -0
  300. package/src/protocol/translation/dialect/model-thinking.ts +89 -0
  301. package/src/protocol/translation/dialect/qwen.ts +114 -0
  302. package/src/protocol/translation/dialect/resolver.ts +83 -0
  303. package/src/protocol/translation/dialect/rules.ts +93 -0
  304. package/src/protocol/translation/dialect/thinking-ladder.ts +245 -0
  305. package/src/protocol/translation/dialect/types.ts +58 -0
  306. package/src/protocol/translation/quirks.ts +18 -4
  307. package/src/protocol/translation/thinking.ts +12 -252
  308. package/src/protocol/translation/tool-id.ts +3 -3
  309. package/src/protocol/translation/tool-repair.ts +1 -1
  310. package/src/protocol/upstream/post-json.ts +6 -1
  311. package/src/providers/adapters/compatible-adapter.ts +71 -4
  312. package/src/providers/authentication/jwt-validator.ts +0 -5
  313. package/src/providers/authentication/oauth-client.ts +254 -253
  314. package/src/providers/authentication/oauth-flow-store.ts +42 -7
  315. package/src/providers/bundled-discovery-providers.ts +6 -30
  316. package/src/providers/configured-openai-providers.ts +82 -97
  317. package/src/providers/default-registry.ts +35 -37
  318. package/src/providers/discovery/catalog/catalog-format.ts +13 -2
  319. package/src/providers/discovery/discovery-types.ts +0 -1
  320. package/src/providers/discovery/openai-model-discovery.ts +2 -2
  321. package/src/providers/discovery/probe-phases.ts +48 -13
  322. package/src/providers/discovery/probing-service.ts +6 -8
  323. package/src/providers/integrations/agentrouter/agentrouter.ts +12 -2
  324. package/src/providers/integrations/antigravity/antigravity-oauth.ts +0 -1
  325. package/src/providers/integrations/antigravity/antigravity-protocol.ts +88 -28
  326. package/src/providers/integrations/antigravity/antigravity-quota.ts +18 -6
  327. package/src/providers/integrations/antigravity/antigravity.ts +22 -13
  328. package/src/providers/integrations/buddy/buddy-catalog-shared.ts +1 -1
  329. package/src/providers/integrations/buddy/buddy-chat-shared.ts +20 -4
  330. package/src/providers/integrations/buddy/buddy-cli-headers.ts +19 -52
  331. package/src/providers/integrations/buddy/buddy-identity.ts +86 -0
  332. package/src/providers/integrations/buddy/buddy-oauth-shared.ts +1 -1
  333. package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +1 -2
  334. package/src/providers/integrations/buddy/codebuddy/provider.ts +4 -15
  335. package/src/providers/integrations/buddy/codebuddy/shared.ts +30 -9
  336. package/src/providers/integrations/buddy/workbuddy/provider.ts +5 -9
  337. package/src/providers/integrations/buddy/workbuddy/shared.ts +21 -3
  338. package/src/providers/integrations/claude/claude-cch.ts +148 -148
  339. package/src/providers/integrations/claude/fallback-credit.ts +3 -7
  340. package/src/providers/integrations/cline/cline.ts +1 -1
  341. package/src/providers/integrations/codex/codex-device-code.ts +101 -101
  342. package/src/providers/integrations/codex/codex-oauth.ts +0 -1
  343. package/src/providers/integrations/commandcode/commandcode.ts +75 -115
  344. package/src/providers/integrations/commandcode/quota.ts +131 -51
  345. package/src/providers/integrations/cursor/cursor-http2.ts +0 -3
  346. package/src/providers/integrations/cursor/cursor-quota.ts +2 -6
  347. package/src/providers/integrations/cursor/cursor-request.ts +0 -87
  348. package/src/providers/integrations/cursor/cursor-shared.ts +0 -4
  349. package/src/providers/integrations/cursor/cursor.ts +35 -3
  350. package/src/providers/integrations/cursor/protocol/framing.ts +0 -56
  351. package/src/providers/integrations/cursor/protocol/messages.ts +0 -96
  352. package/src/providers/integrations/factory/factory.ts +9 -9
  353. package/src/providers/integrations/github/github-discovery.ts +70 -12
  354. package/src/providers/integrations/github/github-oauth.ts +184 -14
  355. package/src/providers/integrations/github/github.ts +134 -26
  356. package/src/providers/integrations/grok/grok-oauth.ts +261 -261
  357. package/src/providers/integrations/grok/grok-quota-frame.ts +1 -1
  358. package/src/providers/integrations/grok/grok-quota.ts +16 -7
  359. package/src/providers/integrations/grok/grok-ratelimit-store.ts +0 -5
  360. package/src/providers/integrations/grok/grok-ratelimit.ts +3 -0
  361. package/src/providers/integrations/grok/grok.ts +86 -36
  362. package/src/providers/integrations/kilo/kilo-oauth.ts +1 -1
  363. package/src/providers/integrations/kiro/kiro-cache.ts +31 -0
  364. package/src/providers/integrations/kiro/kiro-catalog.ts +31 -5
  365. package/src/providers/integrations/kiro/kiro-discovery.ts +47 -43
  366. package/src/providers/integrations/kiro/kiro-machine-id.ts +6 -3
  367. package/src/providers/integrations/kiro/kiro-oauth.ts +523 -255
  368. package/src/providers/integrations/kiro/kiro-quota.ts +35 -47
  369. package/src/providers/integrations/kiro/kiro-request.ts +8 -11
  370. package/src/providers/integrations/kiro/kiro-stream.ts +13 -0
  371. package/src/providers/integrations/kiro/kiro.ts +80 -68
  372. package/src/providers/integrations/muse/muse-oauth.ts +0 -1
  373. package/src/providers/integrations/muse/muse-quota.ts +0 -4
  374. package/src/providers/integrations/opencode/fingerprint.ts +7 -5
  375. package/src/providers/integrations/opencode/provider.ts +17 -24
  376. package/src/providers/integrations/qoder/qoder-catalog.ts +94 -11
  377. package/src/providers/integrations/qoder/qoder-oauth.ts +165 -25
  378. package/src/providers/integrations/qoder/qoder-quota.ts +48 -6
  379. package/src/providers/integrations/qoder/qoder-realm.ts +10 -31
  380. package/src/providers/integrations/qoder/qoder-sse.ts +159 -0
  381. package/src/providers/integrations/qoder/qoder-umid.ts +21 -25
  382. package/src/providers/integrations/qoder/qoder-virtual.ts +12 -0
  383. package/src/providers/integrations/qoder/qoder.ts +422 -71
  384. package/src/providers/integrations/shared/connect.ts +0 -54
  385. package/src/providers/integrations/shared/hash.ts +15 -0
  386. package/src/providers/integrations/shared/session-cache.ts +136 -0
  387. package/src/providers/integrations/trae/trae-cache.ts +7 -87
  388. package/src/providers/integrations/trae/trae-catalog.ts +1 -6
  389. package/src/providers/integrations/trae/trae-protocol.ts +17 -8
  390. package/src/providers/integrations/trae/trae-realm.ts +0 -7
  391. package/src/providers/integrations/trae/trae.ts +51 -8
  392. package/src/providers/integrations/xai/xai-oauth.ts +5 -5
  393. package/src/providers/integrations/zcode-start-plan/gifts.ts +265 -0
  394. package/src/providers/integrations/zcode-start-plan/oauth.ts +154 -0
  395. package/src/providers/integrations/zcode-start-plan/provider.ts +131 -0
  396. package/src/providers/integrations/zcode-start-plan/quota.ts +152 -0
  397. package/src/providers/integrations/zcode-start-plan/zcode_prompt.json +10 -0
  398. package/src/providers/operations/account-error-classification.ts +198 -133
  399. package/src/providers/operations/account-health-service.ts +31 -39
  400. package/src/providers/operations/account-reset-service.ts +58 -1
  401. package/src/providers/operations/byok-wire-profile.ts +19 -15
  402. package/src/providers/operations/cli-platform.ts +31 -5
  403. package/src/providers/operations/client-version-resolver.ts +4 -6
  404. package/src/providers/operations/client-versions.ts +10 -7
  405. package/src/providers/operations/provider-catalog-seeder.ts +2 -0
  406. package/src/providers/operations/provider-catalog-service.ts +18 -2
  407. package/src/providers/operations/provider-credential-service.ts +19 -2
  408. package/src/providers/provider-contracts.ts +18 -7
  409. package/src/providers/provider-metadata.ts +17 -2
  410. package/src/providers/provider-model-definition.ts +22 -1
  411. package/src/providers/provider-probe.ts +4 -2
  412. package/src/providers/provider-usage.ts +50 -19
  413. package/src/providers/quota/cache.ts +29 -0
  414. package/src/providers/quota/quota-contracts.ts +4 -0
  415. package/src/providers/quota/refresh.ts +27 -4
  416. package/src/providers/quota/snapshot.ts +94 -0
  417. package/src/providers/search/search-provider.ts +1 -3
  418. package/src/providers/search/search-providers.ts +2 -1
  419. package/src/security/abuse.ts +4 -4
  420. package/src/security/admission/service.ts +13 -6
  421. package/src/security/admission/ttl.ts +61 -61
  422. package/src/security/api-key-auth.ts +17 -3
  423. package/src/security/client-router-fingerprint.ts +4 -4
  424. package/src/security/credential-codec.ts +3 -3
  425. package/src/security/csrf.ts +2 -2
  426. package/src/security/ip-boundary.ts +16 -189
  427. package/src/security/model-access-rule.ts +1 -1
  428. package/src/security/outbound-headers.ts +18 -0
  429. package/src/shared/invoke-guard.ts +47 -0
  430. package/src/transport/contracts.ts +13 -4
  431. package/src/transport/dispatch/attempt-finalize.ts +70 -22
  432. package/src/transport/dispatch/attempt-loop.ts +22 -0
  433. package/src/transport/dispatch/capture-policy.ts +34 -37
  434. package/src/transport/dispatch/empty-stream.ts +23 -20
  435. package/src/transport/dispatch/generation.ts +25 -45
  436. package/src/transport/dispatch/native-shared.ts +127 -0
  437. package/src/transport/dispatch/proxy-request.ts +3 -1
  438. package/src/transport/dispatch/responses-compact.ts +25 -46
  439. package/src/transport/dispatch/streaming/encoder.ts +18 -72
  440. package/src/transport/dispatch/streaming/finalize.ts +2 -2
  441. package/src/transport/dispatch/streaming/stream.ts +7 -3
  442. package/src/transport/dispatch/streaming/thinking-loop.ts +1 -1
  443. package/src/transport/dispatch/systemone.ts +20 -48
  444. package/src/transport/dispatch/token-count.ts +41 -38
  445. package/src/transport/dispatch/websearch.ts +19 -45
  446. package/src/transport/drain-endpoint.ts +1 -1
  447. package/src/transport/failure-policy.ts +21 -1
  448. package/src/transport/guards/auth-guard.ts +0 -6
  449. package/src/transport/guards/body-policy.ts +3 -3
  450. package/src/transport/guards/error-lifecycle.ts +4 -0
  451. package/src/transport/guards/headroom-guard.ts +1 -1
  452. package/src/transport/guards/pipeline.ts +1 -1
  453. package/src/transport/guards/request-context.ts +12 -17
  454. package/src/transport/request/preparer.ts +286 -7
  455. package/src/transport/request/rtk/compress-request.ts +3 -3
  456. package/src/transport/request/rtk/rtk-constants.ts +2 -2
  457. package/src/transport/request/rtk/rtk-filters.ts +8 -8
  458. package/src/transport/request/state.ts +7 -13
  459. package/src/transport/request/system-prompt-injection.ts +74 -11
  460. package/src/transport/request/tenant-preferences.ts +22 -0
  461. package/src/transport/routing/candidate-index.ts +2 -2
  462. package/src/transport/routing/round-robin.ts +1 -1
  463. package/src/transport/routing/route-catalog.ts +17 -18
  464. package/src/transport/routing/route-model.ts +126 -33
  465. package/src/transport/routing/router.ts +159 -37
  466. package/src/transport/shutdown-notice.ts +2 -2
  467. package/src/transport/surface/adapters.ts +3 -3
  468. package/src/transport/surface/chat/encode.ts +7 -7
  469. package/src/transport/surface/chat/parse.ts +7 -7
  470. package/src/transport/surface/completion.ts +2 -2
  471. package/src/transport/surface/content-parts.ts +1 -1
  472. package/src/transport/surface/dialects.ts +2 -2
  473. package/src/transport/surface/messages/parse.ts +3 -3
  474. package/src/transport/surface/reasoning-summary.ts +9 -14
  475. package/src/transport/surface/responses/adapter.ts +1 -1
  476. package/src/transport/surface/responses/errors.ts +0 -9
  477. package/src/transport/vision-handoff-cache.ts +58 -0
  478. package/src/transport/vision-handoff.ts +431 -0
  479. package/src/workers/account-identity-sweep.ts +2 -2
  480. package/src/workers/buddy-growth-tasks.ts +392 -346
  481. package/src/workers/daily-checkin.ts +102 -49
  482. package/src/workers/maintenance-lease.ts +2 -35
  483. package/src/workers/oauth-refresh-sweep.ts +8 -1
  484. package/src/workers/quota-refresh-sweep.ts +120 -82
  485. package/src/workers/scheduler.ts +67 -4
  486. package/src/workers/sweep-runner.ts +24 -5
  487. package/src/workers/zcode-gift-claim.ts +108 -0
  488. package/dist/dashboard/assets/AccountCooldown-Bjo92Qat.js +0 -1
  489. package/dist/dashboard/assets/AccountCooldown-Bjo92Qat.js.gz +0 -0
  490. package/dist/dashboard/assets/BannedPage-ChG5svFb.js +0 -1
  491. package/dist/dashboard/assets/BannedPage-ChG5svFb.js.gz +0 -0
  492. package/dist/dashboard/assets/CliToolDetailPage-BIcWQun7.js +0 -1
  493. package/dist/dashboard/assets/CliToolDetailPage-BIcWQun7.js.gz +0 -0
  494. package/dist/dashboard/assets/CliToolsPage-Bf2VelDe.js +0 -1
  495. package/dist/dashboard/assets/CliToolsPage-Bf2VelDe.js.gz +0 -0
  496. package/dist/dashboard/assets/CombosPage-DCgm5g6g.js +0 -1
  497. package/dist/dashboard/assets/CombosPage-DCgm5g6g.js.gz +0 -0
  498. package/dist/dashboard/assets/ConsoleLogPage-a8mD0QF1.js +0 -1
  499. package/dist/dashboard/assets/ConsoleLogPage-a8mD0QF1.js.gz +0 -0
  500. package/dist/dashboard/assets/CustomizationPage-ggeMSjte.js +0 -1
  501. package/dist/dashboard/assets/CustomizationPage-ggeMSjte.js.gz +0 -0
  502. package/dist/dashboard/assets/HealthEventsModal-DzSWzE_j.js +0 -1
  503. package/dist/dashboard/assets/HealthEventsModal-DzSWzE_j.js.gz +0 -0
  504. package/dist/dashboard/assets/LoginPage-U6AKaJcF.js +0 -1
  505. package/dist/dashboard/assets/LoginPage-U6AKaJcF.js.gz +0 -0
  506. package/dist/dashboard/assets/ModelPicker-BMS2t8BA.js.gz +0 -0
  507. package/dist/dashboard/assets/OverviewPage-D2D4IiHl.js +0 -1
  508. package/dist/dashboard/assets/OverviewPage-D2D4IiHl.js.gz +0 -0
  509. package/dist/dashboard/assets/ProviderDetailPage-CrNf7j_X.js +0 -5
  510. package/dist/dashboard/assets/ProviderDetailPage-CrNf7j_X.js.gz +0 -0
  511. package/dist/dashboard/assets/ProviderIcon-FB6yS4v1.js +0 -1
  512. package/dist/dashboard/assets/ProviderIcon-FB6yS4v1.js.gz +0 -0
  513. package/dist/dashboard/assets/ProvidersPage-BSDbquc1.js +0 -1
  514. package/dist/dashboard/assets/ProvidersPage-BSDbquc1.js.gz +0 -0
  515. package/dist/dashboard/assets/ProxyPage-lsrx7NYg.js.gz +0 -0
  516. package/dist/dashboard/assets/QuotaPage-L0skzML8.js +0 -1
  517. package/dist/dashboard/assets/QuotaPage-L0skzML8.js.gz +0 -0
  518. package/dist/dashboard/assets/SettingsPage-CmAbjRHW.js +0 -1
  519. package/dist/dashboard/assets/SettingsPage-CmAbjRHW.js.gz +0 -0
  520. package/dist/dashboard/assets/SetupPage-f0DE1h0-.js +0 -1
  521. package/dist/dashboard/assets/SetupPage-f0DE1h0-.js.gz +0 -0
  522. package/dist/dashboard/assets/SortableList-ClzpwyET.js +0 -1
  523. package/dist/dashboard/assets/SortableList-ClzpwyET.js.gz +0 -0
  524. package/dist/dashboard/assets/StudioPage-Cq5tW7hW.js.gz +0 -0
  525. package/dist/dashboard/assets/ToolIcon-K1ckcDKg.js +0 -1
  526. package/dist/dashboard/assets/ToolIcon-K1ckcDKg.js.gz +0 -0
  527. package/dist/dashboard/assets/UsagePage-Dfc9rWQn.js +0 -56
  528. package/dist/dashboard/assets/UsagePage-Dfc9rWQn.js.gz +0 -0
  529. package/dist/dashboard/assets/api-keys-C38iXoO4.js +0 -1
  530. package/dist/dashboard/assets/api-keys-C38iXoO4.js.gz +0 -0
  531. package/dist/dashboard/assets/app-BayTTy01.js +0 -9
  532. package/dist/dashboard/assets/app-BayTTy01.js.gz +0 -0
  533. package/dist/dashboard/assets/app-a159k0ub.css +0 -2
  534. package/dist/dashboard/assets/app-a159k0ub.css.gz +0 -0
  535. package/dist/dashboard/assets/assert-DbRA8EG2.js +0 -15
  536. package/dist/dashboard/assets/assert-DbRA8EG2.js.gz +0 -0
  537. package/dist/dashboard/assets/badge-D9CS6dZk.js.gz +0 -0
  538. package/dist/dashboard/assets/banner-DympBNq4.js.gz +0 -0
  539. package/dist/dashboard/assets/card-ibRWU_uT.js.gz +0 -0
  540. package/dist/dashboard/assets/cli-tools-63qBGaRw.js +0 -1
  541. package/dist/dashboard/assets/cli-tools-63qBGaRw.js.gz +0 -0
  542. package/dist/dashboard/assets/clipboard-button-DJm-9pz7.js.gz +0 -0
  543. package/dist/dashboard/assets/dialog-8fiE6tec.js +0 -1
  544. package/dist/dashboard/assets/dialog-8fiE6tec.js.gz +0 -0
  545. package/dist/dashboard/assets/drawer-CqGYeOrd.js.gz +0 -0
  546. package/dist/dashboard/assets/entry-BSAsYsmV.js +0 -1
  547. package/dist/dashboard/assets/entry-BSAsYsmV.js.gz +0 -0
  548. package/dist/dashboard/assets/entry-CiIQULZD.js +0 -4
  549. package/dist/dashboard/assets/entry-CiIQULZD.js.gz +0 -0
  550. package/dist/dashboard/assets/entry-Daz0lJ-W.js +0 -1
  551. package/dist/dashboard/assets/entry-Daz0lJ-W.js.gz +0 -0
  552. package/dist/dashboard/assets/formatters-D-MTJxMr.js.gz +0 -0
  553. package/dist/dashboard/assets/github-badge-CPK47xQx.js +0 -1
  554. package/dist/dashboard/assets/github-badge-CPK47xQx.js.gz +0 -0
  555. package/dist/dashboard/assets/index-DBNPOfhV.js.gz +0 -0
  556. package/dist/dashboard/assets/inline-BT0zntEr.js.gz +0 -0
  557. package/dist/dashboard/assets/input-Da2ZViWg.js.gz +0 -0
  558. package/dist/dashboard/assets/layout-BXNeLw6M.js.gz +0 -0
  559. package/dist/dashboard/assets/list-row-BycOrrIV.js.gz +0 -0
  560. package/dist/dashboard/assets/live-DCQNZpF7.js +0 -1
  561. package/dist/dashboard/assets/live-DCQNZpF7.js.gz +0 -0
  562. package/dist/dashboard/assets/mutation-Rr0TIvcj.js.gz +0 -0
  563. package/dist/dashboard/assets/network-9Yj2ZyLo.js +0 -1
  564. package/dist/dashboard/assets/network-9Yj2ZyLo.js.gz +0 -0
  565. package/dist/dashboard/assets/numbers-CEagj6ZZ.js +0 -2
  566. package/dist/dashboard/assets/numbers-CEagj6ZZ.js.gz +0 -0
  567. package/dist/dashboard/assets/providers/zai-coding-plan.svg +0 -6
  568. package/dist/dashboard/assets/providers/zai-coding-plan.svg.gz +0 -0
  569. package/dist/dashboard/assets/quota-Caw7wqci.js +0 -1
  570. package/dist/dashboard/assets/quota-Caw7wqci.js.gz +0 -0
  571. package/dist/dashboard/assets/routing-CO9zCUus.js +0 -1
  572. package/dist/dashboard/assets/routing-CO9zCUus.js.gz +0 -0
  573. package/dist/dashboard/assets/select-BIYIBkMU.js.gz +0 -0
  574. package/dist/dashboard/assets/settings-jS3-PNSA.js +0 -1
  575. package/dist/dashboard/assets/settings-jS3-PNSA.js.gz +0 -0
  576. package/dist/dashboard/assets/stack-DfgnFDWY.js.gz +0 -0
  577. package/dist/dashboard/assets/state-CkfdYWel.js.gz +0 -0
  578. package/dist/dashboard/assets/stream-retry-5QnVuSSo.js +0 -1
  579. package/dist/dashboard/assets/stream-retry-5QnVuSSo.js.gz +0 -0
  580. package/dist/dashboard/assets/switch-SYm237HG.js.gz +0 -0
  581. package/dist/dashboard/assets/useMutation-BQqCRNIi.js.gz +0 -0
  582. package/src/console/cli-tools/injectors/cline.ts +0 -110
  583. package/src/console/cli-tools/injectors/copilot.ts +0 -108
  584. package/src/console/cli-tools/injectors/cowork.ts +0 -64
  585. package/src/console/cli-tools/injectors/deepseek-tui.ts +0 -85
  586. package/src/console/cli-tools/injectors/droid.ts +0 -96
  587. package/src/console/cli-tools/injectors/grok-build.ts +0 -70
  588. package/src/console/cli-tools/injectors/hermes.ts +0 -101
  589. package/src/console/cli-tools/injectors/jcode.ts +0 -115
  590. package/src/console/cli-tools/injectors/openclaw.ts +0 -161
  591. package/src/network/response-headers.ts +0 -39
  592. package/src/protocol/response/dsml.ts +0 -38
  593. package/src/providers/integrations/xiaomi-mimo/think-stream.ts +0 -229
  594. /package/dist/dashboard/assets/brand/{og_bansos.webp → og_bansos_initial.webp} +0 -0
  595. /package/dist/dashboard/assets/brand/{og_image.webp → og_image_initial.webp} +0 -0
@@ -1 +0,0 @@
1
- import{n as e,o as t,r as n,t as r}from"./jsx-runtime-CXUMngI_.js";import{n as i}from"./terminal-0_IjPWTk.js";import{n as a,t as o}from"./arrow-up-59ms1iiT.js";import{n as s,t as c}from"./minimize-2-BTmMTK4o.js";import{n as l,t as u}from"./fingerprint-pattern-BWuHtbW4.js";import{D as d,E as f,S as p,k as m,l as h,s as g,w as _,y as v}from"./numbers-CEagj6ZZ.js";import{t as y}from"./chevron-right-BXIy5l3h.js";import{t as ee}from"./SortableList-ClzpwyET.js";import{t as b}from"./database-Dz9N3zGd.js";import{t as x}from"./eye-off-Bk5g2luF.js";import{t as S}from"./eye-C_hawfH4.js";import{t as C}from"./gauge-BbIMy7MB.js";import{n as w,r as T,t as te}from"./state-CkfdYWel.js";import{t as E}from"./key-round-UkavsGxp.js";import{t as D}from"./layers-2-glBbjl.js";import{n as ne,r as re,t as O}from"./clipboard-button-DJm-9pz7.js";import{t as k}from"./dialog-8fiE6tec.js";import{t as A}from"./pencil-768ysRAr.js";import{t as ie}from"./plus-DIdX_g-x.js";import{t as j}from"./power-off-Yjw9GMJh.js";import{t as ae}from"./refresh-cw-BqJFk4sU.js";import{t as M}from"./route-CNSNj9Zm.js";import{t as N}from"./search-JOKus9rb.js";import{t as P}from"./settings-2-Ds9DQp0t.js";import{t as F}from"./shield-check-DVS0Foqh.js";import{n as I,r as oe,t as se}from"./settings-jS3-PNSA.js";import{t as ce}from"./trash-Cppn5c3R.js";import{E as L,S as le,v as R,w as ue,x as de}from"./assert-DbRA8EG2.js";import{i as fe,l as z,n as pe,o as B,t as V}from"./query-keys-BloKtaXJ.js";import{t as H}from"./useMutation-BQqCRNIi.js";import{B as me,ct as he,dt as ge,ft as _e,g as ve,ot as ye,v as be}from"./entry-CiIQULZD.js";import{n as U,r as W,t as xe}from"./card-ibRWU_uT.js";import{t as Se}from"./use-clipboard-B0Sy03fE.js";import{n as Ce}from"./download-dRFo5_Wu.js";import{c as G,d as we}from"./tokens-COzario9.js";import{t as K}from"./switch-SYm237HG.js";import{t as q}from"./badge-D9CS6dZk.js";import{n as J,r as Y,t as Te}from"./input-Da2ZViWg.js";import{t as Ee}from"./select-BIYIBkMU.js";import{t as X}from"./ProviderIcon-FB6yS4v1.js";import{t as De}from"./ModelPicker-BMS2t8BA.js";import{t as Z}from"./stack-DfgnFDWY.js";import{n as Oe,t as ke}from"./inline-BT0zntEr.js";import{a as Ae,c as je,d as Me,f as Ne,h as Pe,i as Fe,l as Ie,m as Le,o as Re,p as ze,r as Be,s as Ve,t as He,u as Ue}from"./api-keys-C38iXoO4.js";import{a as We,i as Ge,n as Ke,r as qe}from"./cli-tools-63qBGaRw.js";import{t as Je}from"./layout-BXNeLw6M.js";import{s as Ye}from"./quota-Caw7wqci.js";import{t as Xe}from"./banner-DympBNq4.js";var Ze=e(`chevrons-up-down`,[[`path`,{d:`m7 15 5 5 5-5`,key:`1hf1tw`}],[`path`,{d:`m7 9 5-5 5 5`,key:`sgt6xg`}]]),Qe=e(`earth`,[[`path`,{d:`M21.54 15H17a2 2 0 0 0-2 2v4.54`,key:`1djwo0`}],[`path`,{d:`M7 3.34V5a3 3 0 0 0 3 3a2 2 0 0 1 2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2c0-1.1.9-2 2-2h3.17`,key:`1tzkfa`}],[`path`,{d:`M11 21.95V18a2 2 0 0 0-2-2a2 2 0 0 1-2-2v-1a2 2 0 0 0-2-2H2.05`,key:`14pb5j`}],[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]]),$e=e(`file-text`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 9H8`,key:`b1mrlr`}],[`path`,{d:`M16 13H8`,key:`t4e002`}],[`path`,{d:`M16 17H8`,key:`z1uh3a`}]]),et=e(`file-up`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M12 12v6`,key:`3ahymv`}],[`path`,{d:`m15 15-3-3-3 3`,key:`15xj92`}]]),tt=e(`lock-keyhole`,[[`circle`,{cx:`12`,cy:`16`,r:`1`,key:`1au0dj`}],[`rect`,{x:`3`,y:`10`,width:`18`,height:`12`,rx:`2`,key:`6s8ecr`}],[`path`,{d:`M7 10V7a5 5 0 0 1 10 0v3`,key:`1pqi11`}]]),nt=e(`radio-tower`,[[`path`,{d:`M4.9 16.1C1 12.2 1 5.8 4.9 1.9`,key:`s0qx1y`}],[`path`,{d:`M7.8 4.7a6.14 6.14 0 0 0-.8 7.5`,key:`1idnkw`}],[`circle`,{cx:`12`,cy:`9`,r:`2`,key:`1092wv`}],[`path`,{d:`M16.2 4.8c2 2 2.26 5.11.8 7.47`,key:`ojru2q`}],[`path`,{d:`M19.1 1.9a9.96 9.96 0 0 1 0 14.1`,key:`rhi7fg`}],[`path`,{d:`M9.5 18h5`,key:`mfy3pd`}],[`path`,{d:`m8 22 4-11 4 11`,key:`25yftu`}]]),rt=e(`repeat-2`,[[`path`,{d:`m2 9 3-3 3 3`,key:`1ltn5i`}],[`path`,{d:`M13 18H7a2 2 0 0 1-2-2V6`,key:`1r6tfw`}],[`path`,{d:`m22 15-3 3-3-3`,key:`4rnwn2`}],[`path`,{d:`M11 6h6a2 2 0 0 1 2 2v10`,key:`2f72bc`}]]),it=e(`rotate-cw`,[[`path`,{d:`M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8`,key:`1p45f6`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}]]),at=e(`scissors`,[[`circle`,{cx:`6`,cy:`6`,r:`3`,key:`1lh9wr`}],[`path`,{d:`M8.12 8.12 12 12`,key:`1alkpv`}],[`path`,{d:`M20 4 8.12 15.88`,key:`xgtan2`}],[`circle`,{cx:`6`,cy:`18`,r:`3`,key:`fqmcym`}],[`path`,{d:`M14.8 14.8 20 20`,key:`ptml3r`}]]),ot=e(`share-2`,[[`circle`,{cx:`18`,cy:`5`,r:`3`,key:`gq8acd`}],[`circle`,{cx:`6`,cy:`12`,r:`3`,key:`w7nqdw`}],[`circle`,{cx:`18`,cy:`19`,r:`3`,key:`1xt0gg`}],[`line`,{x1:`8.59`,x2:`15.42`,y1:`13.51`,y2:`17.49`,key:`47mynk`}],[`line`,{x1:`15.41`,x2:`8.59`,y1:`6.51`,y2:`10.49`,key:`1n3mei`}]]),st=e(`shield-off`,[[`path`,{d:`m2 2 20 20`,key:`1ooewy`}],[`path`,{d:`M5 5a1 1 0 0 0-1 1v7c0 5 3.5 7.5 7.67 8.94a1 1 0 0 0 .67.01c2.35-.82 4.48-1.97 5.9-3.71`,key:`1jlk70`}],[`path`,{d:`M9.309 3.652A12.252 12.252 0 0 0 11.24 2.28a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1v7a9.784 9.784 0 0 1-.08 1.264`,key:`18rp1v`}]]),ct=e(`shield-x`,[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}],[`path`,{d:`m14.5 9.5-5 5`,key:`17q4r4`}],[`path`,{d:`m9.5 9.5 5 5`,key:`18nt4w`}]]),lt=e(`undo-2`,[[`path`,{d:`M9 14 4 9l5-5`,key:`102s5s`}],[`path`,{d:`M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11`,key:`f3b9sd`}]]),ut=e(`user-round`,[[`circle`,{cx:`12`,cy:`8`,r:`5`,key:`1hypcn`}],[`path`,{d:`M20 21a8 8 0 0 0-16 0`,key:`rfgkzh`}]]),dt=e(`users-round`,[[`path`,{d:`M18 21a8 8 0 0 0-16 0`,key:`3ypg7q`}],[`circle`,{cx:`10`,cy:`8`,r:`5`,key:`o932ke`}],[`path`,{d:`M22 20c0-3.37-2-6.5-4-8a5 5 0 0 0-.45-8.3`,key:`10s06x`}]]),ft=[`routing:invoke`,`routing:cli_mapping`,`search:invoke`,`dashboard:read`,`dashboard:write`,`providers:read`,`providers:write`,`models:read`,`models:write`],pt=[`image/png`,`image/jpeg`,`image/webp`,`image/gif`],Q=t(n(),1),$=r(),mt={"routing:invoke":`Call /v1/* gateway routes within this tenant.`,"routing:cli_mapping":`Resolve persisted CLI source→target model mappings.`,"search:invoke":`Call POST /v1/search with exa.`,"dashboard:read":`Read this tenant's configuration and usage.`,"dashboard:write":`Modify this tenant's configuration.`,"providers:read":`Read provider rows, including accounts.`,"providers:write":`Add, modify, or delete provider rows and their credentials.`,"models:read":`Read catalog model rows.`,"models:write":`Add, modify, or delete catalog model rows.`},ht={"routing:invoke":M,"routing:cli_mapping":M,"search:invoke":N,"dashboard:read":S,"dashboard:write":A,"providers:read":ye,"providers:write":tt,"models:read":l,"models:write":b},gt={k:1e3,m:1e6,b:1e9,t:0xe8d4a51000},_t=[{label:`1M`,amount:1e6,description:`1 million`},{label:`100M`,amount:1e8,description:`100 million`},{label:`1B`,amount:1e9,description:`1 billion`},{label:`1T`,amount:0xe8d4a51000,description:`1 trillion`}];function vt(e){let t=e.trim().toLowerCase();if(!t)return;let n=t.match(/^([\d.]+)\s*([kmbt])?$/);if(!n)return;let r=Number(n[1]);if(!Number.isFinite(r)||r<=0)return;let i=n[2]?gt[n[2]]??1:1;return Math.round(r*i)}function yt(e){if(e==null)return``;let t=_t.find(t=>t.amount===e);return t?t.label:e>=1e9?`${(e/1e9).toFixed(1).replace(/\.0$/,``)}B`:e>=1e6?`${(e/1e6).toFixed(1).replace(/\.0$/,``)}M`:e>=1e3?`${(e/1e3).toFixed(1).replace(/\.0$/,``)}K`:String(e)}function bt(e){let t=Number(e.trim());return Number.isFinite(t)&&t>0?Math.round(t):void 0}function xt(e){let t=bt(e);return e.trim()===``?null:t}function St({label:e,value:t,onChange:n,disabled:r}){let i=vt(t),a=_t.find(e=>e.amount===i)?.label;return(0,$.jsxs)(`div`,{children:[(0,$.jsx)(J,{label:e,value:t,onChange:e=>n(e.target.value),placeholder:`e.g. 1M, 500K`,disabled:r}),(0,$.jsx)(`div`,{className:`flex flex-wrap gap-2 mt-2`,role:`group`,"aria-label":`${e} presets`,children:_t.map(e=>(0,$.jsx)(`button`,{type:`button`,"aria-pressed":a===e.label,"aria-label":`${e.label}, ${e.description} tokens`,onClick:()=>n(e.label),disabled:r,className:`py-0.5 px-3 rounded-chip text-micro font-semibold`,style:{cursor:r?`not-allowed`:`pointer`,border:`1px solid ${a===e.label?`var(--accent)`:`var(--inner-border)`}`,background:a===e.label?`var(--accent-soft)`:`transparent`,color:a===e.label?`var(--accent)`:`var(--text-tertiary)`},children:e.label},e.label))})]})}function Ct({tool:e,keyId:t,busy:n,scopeGranted:r,onScopeChange:i}){let a=Ge(e.id,t),o=qe(),s=Ke(),c=a.data?.enabled??!1,l=r&&c,u=a.data?.mappings.length??0,d=o.isPending||s.isPending;return(0,$.jsxs)(`div`,{className:`flex items-center justify-between gap-4 py-1.5 px-4 rounded-inset`,style:{minHeight:`38px`,border:`1px solid var(--inner-border)`,background:l?`var(--accent-soft)`:`var(--surface-1)`},children:[(0,$.jsxs)(`div`,{className:`flex min-w-0 items-start gap-3`,children:[(0,$.jsx)(M,{size:16,className:`mt-1 shrink-0 text-accent`,"aria-hidden":`true`}),(0,$.jsxs)(`div`,{className:`min-w-0`,children:[(0,$.jsx)(`div`,{className:`text-caption font-semibold text-text-primary`,children:e.name}),(0,$.jsx)(`p`,{className:`mt-1 text-badge text-text-tertiary`,children:l?`Remote routing on — ${u} route${u===1?``:`s`} active, routing:cli_mapping granted.`:`Remote routing off — this key's requests go straight to the provider.`})]})]}),(0,$.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,$.jsx)(K,{checked:l,disabled:n||d||a.isLoading,"aria-label":`Enable remote routing for ${e.name}`,onChange:n=>{n!==r&&i(n),o.mutate({toolId:e.id,keyId:t,input:{enabled:n,mappings:a.data?.mappings??[]}},{onSuccess:()=>g.success(`Saved remote routing for ${e.name}.`),onError:e=>g.error(z(e,`Could not save remote routing.`))})}}),(0,$.jsx)(h,{variant:`secondary`,size:`sm`,disabled:n||d||!c&&u===0,onClick:()=>s.mutate({toolId:e.id,keyId:t},{onSuccess:()=>g.success(`Cleared remote routes for ${e.name}.`),onError:e=>g.error(z(e,`Could not reset remote routes.`))}),children:s.isPending?`Resetting…`:`Reset`})]})]})}function wt({keyId:e,busy:t,scopeGranted:n,onScopeChange:r,persistScope:i}){let a=(We().data??[]).filter(e=>e.mappingSupported);return(0,$.jsxs)(`section`,{"aria-labelledby":`remote-routing-heading`,className:`flex flex-col gap-3`,children:[(0,$.jsxs)(`div`,{children:[(0,$.jsxs)(`h4`,{id:`remote-routing-heading`,className:`inline-flex items-center gap-2 text-caption font-bold text-text-primary`,children:[(0,$.jsx)(M,{size:15,className:`text-accent`,"aria-hidden":`true`}),`Remote routing`]}),(0,$.jsx)(`p`,{className:`mt-1 text-badge text-text-tertiary`,children:`Route this key's CLI model calls through persisted mappings and grant routing:cli_mapping. Applies immediately — no save needed.`})]}),e.length===0?(0,$.jsx)(`p`,{className:`text-badge text-text-tertiary m-0`,children:`Save the key first to configure per-tool remote routing mappings.`}):a.length===0?(0,$.jsx)(`p`,{className:`text-badge text-text-tertiary m-0`,children:`No CLI tools with mapping support are currently registered.`}):(0,$.jsx)(`div`,{className:`flex flex-col gap-3`,children:a.map(a=>(0,$.jsx)(Ct,{tool:a,keyId:e,busy:t,scopeGranted:n,onScopeChange:e=>{r(e),i(e)}},a.id))})]})}function Tt(e,t,n){let r=e===`personal`?t.trim():``;return{keyMode:e,keyPrefix:n.trim()||void 0,...r?{key:r}:{}}}function Et(e,t){return e===`personal`?t??null:null}function Dt(e){let t=e?.scopes;return e?.isDefault?t&&t.length>0?[...t]:[...ft]:t&&t.length>0?[...t]:[`routing:invoke`,`search:invoke`]}function Ot({mode:e,record:t,busy:n,onDone:r,onClose:i,actionsRef:a}){let[o,c]=(0,Q.useState)(t?.label??``),[d,f]=(0,Q.useState)(t?.keyPrefix??``),[p,m]=(0,Q.useState)(``),[_,v]=(0,Q.useState)(t?.requestsPerMinute?.toString()??``),[y,ee]=(0,Q.useState)(yt(t?.dailyTokenLimit??null)),[b,x]=(0,Q.useState)(yt(t?.monthlyTokenLimit??null)),[S,w]=(0,Q.useState)(yt(t?.lifetimeTokenBudget??null)),[T,te]=(0,Q.useState)(t?.lifetimeTokenBudget==null?`recurring`:`one-time`),[D,re]=(0,Q.useState)(t?.maxConcurrentRequests?.toString()??``),[O,k]=(0,Q.useState)(t?.maxChildren?.toString()??``),[A,ie]=(0,Q.useState)(()=>Dt(t)),[j,ae]=(0,Q.useState)(t?.modelAccessMode??`whitelist`),[N,P]=(0,Q.useState)(()=>{let e=t?.modelList;return e?[...e]:[]}),[I,se]=(0,Q.useState)(!1),[ce,L]=(0,Q.useState)(()=>{let e=t?.clientRouterDenylist;return e?[...new Set(e.map(le).filter(e=>e!==void 0))]:[]}),[R,ue]=(0,Q.useState)(()=>t?.notesTitle??``),[fe,pe]=(0,Q.useState)(()=>t?.notesSubtitle??``),[B,V]=(0,Q.useState)(()=>t?.notesBody??``),[H,me]=(0,Q.useState)(t?.sharePopupEnabled??!0),[ge,ve]=(0,Q.useState)(null),[ye,be]=(0,Q.useState)(!1),[U,W]=(0,Q.useState)(null),xe=t?.sharePopupImageMime!==void 0,Se=ge??(xe&&!ye&&t!==null?`/console/api/api-keys/${t.id}/share-popup-image`:null);(0,Q.useEffect)(()=>{xe||ge!==null||ye||fetch(`/donation/qris-risun-marke.png`).then(e=>e.ok?e.blob():Promise.reject(e.status)).then(e=>{let{promise:t,resolve:n,reject:r}=Promise.withResolvers(),i=new FileReader;return i.onload=()=>n(i.result),i.onerror=r,i.readAsDataURL(e),t}).then(e=>ve(e)).catch(()=>{})},[]);let[Ce,G]=(0,Q.useState)(t?.sharePopupTitle??`Support via QRIS`),[we,q]=(0,Q.useState)(t?.sharePopupBody??`Scan the QR code above with any QRIS-compatible banking or e-wallet app to support this gateway's upkeep. Every contribution helps keep the service running — thank you! 🙏`),[Y,Ee]=(0,Q.useState)(t?.keyMode??`personal`),X=T===`one-time`,Z=e===`edit`,Oe=Pe(),ke=e=>ie(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e]),Ae=()=>{r({label:o.trim(),...Tt(Y,p,d),scopes:A,modelAccessMode:j,modelList:N,clientRouterDenylist:ce,requestsPerMinute:xt(_),maxConcurrentRequests:xt(D),maxChildren:Y===`share`?xt(O):null,dailyTokenLimit:X?null:vt(y)??null,monthlyTokenLimit:X?null:vt(b)??null,lifetimeTokenBudget:X?vt(S)??null:null,notesTitle:R.trim(),notesSubtitle:fe.trim(),notesBody:B.trim(),sharePopupEnabled:H,...ge===null?ye?{sharePopupImage:null}:{}:{sharePopupImage:ge},sharePopupTitle:Ce.trim(),sharePopupBody:we.trim()})};return(0,Q.useEffect)(()=>{a?.((0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(h,{variant:`secondary`,size:`sm`,onClick:i,disabled:n,children:`Cancel`}),(0,$.jsx)(h,{variant:`primary`,size:`sm`,disabled:n||e===`create`&&!o.trim(),onClick:Ae,children:n?`Saving…`:e===`create`?`Create API key`:`Save changes`})]}))}),(0,$.jsxs)(`div`,{className:`flex flex-col gap-3 min-w-0 pb-2`,children:[(0,$.jsxs)(`section`,{className:`flex flex-col gap-3 min-w-0 p-4 border border-inner-border rounded-card bg-surface-2 col-span-full`,children:[(0,$.jsxs)(`h3`,{className:`inline-flex items-center gap-2 text-caption font-bold text-text-primary`,children:[(0,$.jsx)(E,{size:16,className:`text-accent`,"aria-hidden":`true`}),`Credential mode`]}),(0,$.jsx)(`div`,{role:`group`,"aria-label":`Credential mode`,className:`flex gap-4`,children:[`personal`,`share`].map(e=>(0,$.jsx)(`button`,{type:`button`,"aria-pressed":Y===e,disabled:n||Z,onClick:()=>Ee(e),title:Z?`Credential mode cannot change after creation`:void 0,className:`rounded-inset py-1.5 px-5`,style:{border:`1px solid var(--inner-border)`,color:Y===e?`var(--accent)`:`var(--text-secondary)`,background:Y===e?`var(--accent-soft)`:`var(--surface-2)`,cursor:Z?`not-allowed`:`pointer`,opacity:Z&&Y!==e?.5:1},children:(0,$.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[e===`personal`?(0,$.jsx)(ut,{size:14,"aria-hidden":`true`}):(0,$.jsx)(dt,{size:14,"aria-hidden":`true`}),e===`personal`?`Personal`:`Share template`]})},e))}),(0,$.jsx)(`p`,{className:`mt-1 text-badge text-text-tertiary`,children:Y===`share`?`A share template does not authenticate requests. Recipients generate their own child key from its public enrollment page.`:`A personal key authenticates requests directly; its secret is shown once when created or rotated.`})]}),(0,$.jsxs)(`div`,{className:`grid grid-cols-2 gap-3 min-w-0 max-medium:grid-cols-1`,children:[e===`create`&&(0,$.jsxs)(`section`,{className:`flex flex-col gap-3 min-w-0 p-4 border border-inner-border rounded-card bg-surface-2`,children:[(0,$.jsxs)(`div`,{children:[(0,$.jsxs)(`h3`,{className:`inline-flex items-center gap-2 text-caption font-bold text-text-primary`,children:[(0,$.jsx)(u,{size:16,className:`text-accent`,"aria-hidden":`true`}),`Identity`]}),(0,$.jsx)(`p`,{className:`mt-1 text-badge text-text-tertiary`,children:`Give this credential a recognizable name.`})]}),(0,$.jsxs)(`div`,{className:`grid grid-cols-2 gap-4 items-start min-w-0 max-medium:grid-cols-1`,children:[(0,$.jsx)(J,{label:`Name`,value:o,onChange:e=>c(e.target.value),placeholder:`ci-key…`,disabled:n,autoFocus:!0}),(0,$.jsx)(J,{label:`Key prefix`,value:d,onChange:e=>f(e.target.value),placeholder:`pn-carte- (default)…`,disabled:n||p.trim().length>0})]}),Y===`personal`&&(0,$.jsx)(J,{label:`Custom API key value (optional)`,value:p,onChange:e=>m(e.target.value),placeholder:`Leave blank to generate…`,disabled:n})]}),e===`edit`&&(0,$.jsxs)(`section`,{className:`flex flex-col gap-3 min-w-0 p-4 border border-inner-border rounded-card bg-surface-2`,children:[(0,$.jsxs)(`div`,{children:[(0,$.jsxs)(`h3`,{className:`text-caption font-bold text-text-primary`,children:[(0,$.jsx)(u,{size:16,className:`mr-2 inline text-accent`,"aria-hidden":`true`}),`Identity`]}),(0,$.jsx)(`p`,{className:`mt-1 text-badge text-text-tertiary`,children:t?.isDefault?`The default key's name is fixed. Limits, access, and everything else can still change.`:`Update the label for this credential.`})]}),(0,$.jsx)(`div`,{className:`grid grid-cols-2 gap-4 items-start min-w-0 max-medium:grid-cols-1`,children:(0,$.jsx)(J,{label:`Name`,value:o,onChange:e=>c(e.target.value),placeholder:`ci-key…`,disabled:n||t?.isDefault===!0,title:t?.isDefault?`The default gateway key keeps its name`:void 0,autoFocus:!0})})]}),(0,$.jsxs)(`section`,{className:`flex flex-col gap-3 min-w-0 p-4 border border-inner-border rounded-card bg-surface-2`,children:[(0,$.jsxs)(`div`,{children:[(0,$.jsxs)(`h3`,{className:`text-caption font-bold text-text-primary`,children:[(0,$.jsx)(ne,{size:16,className:`mr-2 inline text-accent`,"aria-hidden":`true`}),`Share notes`]}),(0,$.jsx)(`p`,{className:`mt-1 text-badge text-text-tertiary`,children:`Optional copy shown on the public share page.`})]}),(0,$.jsxs)(`div`,{className:`grid grid-cols-2 gap-4 items-start min-w-0 max-medium:grid-cols-1`,children:[(0,$.jsx)(J,{label:`Title`,value:R,onChange:e=>ue(e.target.value),placeholder:`e.g. Bansos Token`,disabled:n}),(0,$.jsx)(J,{label:`Subtitle`,value:fe,onChange:e=>pe(e.target.value),placeholder:`e.g. Come and save your tokens`,disabled:n}),(0,$.jsx)(`div`,{className:`col-span-full`,children:(0,$.jsx)(J,{label:`Body`,value:B,onChange:e=>V(e.target.value),placeholder:`Free-form notes for the recipient`,disabled:n})})]})]}),(0,$.jsxs)(`section`,{className:`flex flex-col gap-3 min-w-0 p-4 border border-inner-border rounded-card bg-surface-2 col-span-full`,children:[(0,$.jsxs)(`div`,{children:[(0,$.jsxs)(`h3`,{className:`text-caption font-bold text-text-primary`,children:[(0,$.jsx)(C,{size:16,className:`mr-2 inline text-accent`,"aria-hidden":`true`}),`Limits`]}),(0,$.jsx)(`p`,{className:`mt-1 text-badge text-text-tertiary`,children:`Keep this credential predictable under load.`})]}),(0,$.jsxs)(`div`,{className:`grid grid-cols-2 gap-4 items-start min-w-0 max-medium:grid-cols-1`,children:[(0,$.jsx)(J,{label:`Requests per minute`,type:`number`,min:`0`,value:_,onChange:e=>v(e.target.value),placeholder:`Unlimited…`,disabled:n}),(0,$.jsx)(J,{label:`Max concurrent requests`,type:`number`,min:`0`,value:D,onChange:e=>re(e.target.value),placeholder:`Unlimited…`,disabled:n}),Y===`share`?(0,$.jsx)(J,{label:`Recipient slots (max children)`,type:`number`,min:`0`,value:O,onChange:e=>k(e.target.value),placeholder:`Unlimited…`,disabled:n}):null]}),(0,$.jsx)(`p`,{className:`text-micro leading-normal text-text-tertiary`,children:D===``?`No concurrency limit, so the tenant allowance does nothing.`:`Limit ${D} concurrent. Refusals name this number; the allowance above it is tenant-wide and set in Settings.`}),(0,$.jsxs)(`div`,{className:`flex items-center justify-between gap-4 rounded-panel border border-inner-border px-4 py-3 bg-surface-2`,children:[(0,$.jsxs)(`div`,{children:[(0,$.jsxs)(`div`,{className:`text-caption font-bold text-text-primary`,children:[(0,$.jsx)(C,{size:14,className:`mr-2 inline text-accent`,"aria-hidden":`true`}),`Token budget`]}),(0,$.jsx)(`p`,{className:`mt-1 text-text-tertiary text-micro`,children:X?`One-time cap; it does not reset.`:`Daily and monthly limits reset automatically.`})]}),(0,$.jsxs)(`div`,{className:`flex gap-2 rounded-inset border border-inner-border bg-surface-1 p-1`,children:[(0,$.jsx)(`button`,{type:`button`,onClick:()=>te(`recurring`),disabled:n,className:`py-1.5 px-4 rounded-chip font-semibold border-0 cursor-pointer`,style:{fontSize:`10px`,background:X?`transparent`:`var(--accent-soft)`,color:X?`var(--text-tertiary)`:`var(--accent)`},children:(0,$.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[(0,$.jsx)(rt,{size:13,"aria-hidden":`true`}),`Recurring`]})}),(0,$.jsx)(`button`,{type:`button`,onClick:()=>te(`one-time`),disabled:n,className:`py-1.5 px-4 rounded-chip font-semibold border-0 cursor-pointer`,style:{fontSize:`10px`,background:X?`var(--accent-soft)`:`transparent`,color:X?`var(--accent)`:`var(--text-tertiary)`},children:(0,$.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[(0,$.jsx)(tt,{size:13,"aria-hidden":`true`}),`One-time`]})})]})]}),X?(0,$.jsx)(St,{label:`One-time token limit`,value:S,onChange:w,disabled:n}):(0,$.jsxs)(`div`,{className:`grid grid-cols-2 gap-4 items-start min-w-0 max-medium:grid-cols-1`,children:[(0,$.jsx)(St,{label:`Daily token limit`,value:y,onChange:ee,disabled:n}),(0,$.jsx)(St,{label:`Monthly token limit`,value:b,onChange:x,disabled:n})]})]})]}),(0,$.jsxs)(`section`,{className:`flex flex-col gap-3 min-w-0 p-4 border border-inner-border rounded-card bg-surface-2 col-span-full`,"aria-labelledby":`share-popup-heading`,children:[(0,$.jsxs)(`div`,{className:`flex items-start justify-between gap-6`,children:[(0,$.jsxs)(`div`,{children:[(0,$.jsxs)(`h3`,{id:`share-popup-heading`,className:`text-caption font-bold text-text-primary`,children:[(0,$.jsx)(ot,{size:16,className:`mr-2 inline text-accent`,"aria-hidden":`true`}),`Share page popup`]}),(0,$.jsx)(`p`,{className:`mt-1 text-badge text-text-tertiary`,children:`Optional card visitors open from the Base URL card on your share page.`})]}),(0,$.jsx)(K,{checked:H,onChange:e=>me(e),disabled:n,label:`Enable popup`})]}),H?(0,$.jsxs)(`div`,{className:`flex gap-7 items-start mt-2 min-w-0 max-medium:flex-col max-medium:items-stretch`,children:[(0,$.jsxs)(`div`,{className:`flex flex-col gap-4 min-w-0 w-100 shrink-0 max-medium:w-auto`,children:[Se?(0,$.jsx)(`img`,{className:`block w-full h-66 object-cover border border-inner-border rounded-control bg-surface-1 max-medium:h-80`,src:Se,alt:`Popup image preview`}):(0,$.jsx)(`div`,{className:`flex items-center justify-center w-full h-66 object-cover border border-dashed border-inner-border rounded-control bg-surface-1 text-text-tertiary text-badge max-medium:h-80`,"aria-hidden":`true`,children:(0,$.jsx)(`span`,{children:`No image`})}),(0,$.jsx)(Te,{id:`share-popup-image`,accept:pt.join(`,`),"aria-label":`Popup image`,disabled:n,onChange:e=>{let t=e.target.files?.[0];if(e.target.value=``,!t)return;if(W(null),t.size>2097152){ve(null),W(`Image must be 2 MB or smaller.`);return}let n=new FileReader;n.onload=()=>{ve(String(n.result)),be(!1)},n.onerror=()=>W(`Could not read that file.`),n.readAsDataURL(t)}}),Se?(0,$.jsx)(h,{variant:`secondary`,size:`sm`,type:`button`,disabled:n,className:`h-14 px-5 text-badge self-start`,onClick:()=>{ve(null),be(!0),W(null)},children:`Remove image`}):null,U?(0,$.jsx)(`p`,{className:`form-error`,children:U}):null,(0,$.jsx)(`p`,{className:`m-0 text-text-tertiary text-badge leading-normal`,children:`PNG, JPEG, WebP, or GIF up to 2 MB.`})]}),(0,$.jsxs)(`div`,{className:`flex flex-col gap-4 min-w-0 flex-1 [&_.form-group]:gap-2`,children:[(0,$.jsx)(J,{label:`Popup title`,value:Ce,onChange:e=>G(e.target.value),maxLength:120,placeholder:`Support this gateway`,disabled:n}),(0,$.jsxs)(`div`,{className:`form-group`,children:[(0,$.jsx)(`label`,{className:`form-label`,htmlFor:`share-popup-copy`,children:`Message`}),(0,$.jsx)(`textarea`,{className:`form-textarea`,id:`share-popup-copy`,value:we,onChange:e=>q(e.target.value),maxLength:1200,rows:3,placeholder:`If this service helps you, consider supporting its upkeep…`,disabled:n})]})]})]}):null]}),(0,$.jsxs)(`details`,{className:`group min-w-0 col-span-full rounded-card border border-inner-border bg-surface-2`,children:[(0,$.jsxs)(`summary`,{className:`flex cursor-pointer list-none items-center justify-between gap-3 p-4 [&::-webkit-details-marker]:hidden`,children:[(0,$.jsxs)(`span`,{className:`flex min-w-0 items-start gap-3`,children:[(0,$.jsx)(`span`,{className:`grid size-8 shrink-0 place-items-center rounded-inset bg-accent-soft text-accent`,children:(0,$.jsx)(oe,{size:18,"aria-hidden":`true`})}),(0,$.jsxs)(`span`,{className:`min-w-0`,children:[(0,$.jsx)(`span`,{className:`block text-body font-bold text-text-primary`,children:`Access`}),(0,$.jsx)(`span`,{className:`mt-1 block text-badge text-text-tertiary`,children:t?.isDefault?`Default gateway key · all tenant permissions, including gateway routing and remote debugging.`:`Choose model, router, and dashboard permissions for this key.`})]})]}),(0,$.jsxs)(`span`,{className:`inline-flex shrink-0 items-center gap-2 rounded-control border border-inner-border bg-surface-1 px-3 py-2 text-micro font-semibold text-text-secondary`,children:[A.length,`/`,ft.length,` grants`,(0,$.jsx)(_e,{size:14,className:`transition-transform group-open:rotate-180`,"aria-hidden":`true`})]})]}),(0,$.jsxs)(`div`,{className:`flex flex-col gap-4 border-t border-inner-border p-4`,children:[t?.isDefault?(0,$.jsxs)(`div`,{className:`flex items-start gap-3 rounded-control border border-accent/30 bg-accent-soft p-4 text-badge text-text-secondary`,children:[(0,$.jsx)(F,{size:16,className:`mt-0.5 shrink-0 text-accent`,"aria-hidden":`true`}),(0,$.jsxs)(`p`,{className:`m-0`,children:[`This default API key is provisioned with every tenant permission, including `,(0,$.jsx)(`code`,{children:`routing:invoke`}),` and`,` `,(0,$.jsx)(`code`,{children:`routing:cli_mapping`}),`. Those grant gateway access and authorization to use remote CLI mappings; each client's mapping toggle below still controls whether those routes are active. You can remove individual grants here.`]})]}):null,(0,$.jsxs)(`div`,{className:`grid grid-cols-access gap-5 min-w-0 max-medium:grid-cols-1`,children:[(0,$.jsxs)(`section`,{"aria-labelledby":`model-access-heading`,className:`flex flex-col gap-3 min-w-0 rounded-card border border-inner-border bg-surface-1 p-4`,children:[(0,$.jsxs)(`h4`,{id:`model-access-heading`,className:`inline-flex items-center gap-2 text-caption font-bold text-text-primary`,children:[(0,$.jsx)(l,{size:15,className:`text-accent`,"aria-hidden":`true`}),`Model access`]}),(0,$.jsx)(`div`,{role:`group`,"aria-label":`Model access mode`,className:`flex gap-2`,children:[`whitelist`,`blacklist`].map(e=>(0,$.jsxs)(`button`,{type:`button`,"aria-pressed":j===e,disabled:n,onClick:()=>ae(e),title:e===`whitelist`?`Only the listed models may be used. An empty list allows every model.`:`The listed models are refused. Everything else is allowed.`,className:`flex-1 py-2 px-3 text-badge font-semibold`,style:{borderRadius:`7px`,border:`1px solid ${j===e?`var(--accent)`:`var(--inner-border)`}`,background:j===e?`var(--accent-soft)`:`var(--surface-2)`,color:j===e?`var(--accent)`:`var(--text-secondary)`,cursor:n?`not-allowed`:`pointer`,opacity:n?.6:1},children:[e===`whitelist`?`Whitelist`:`Blacklist`,e===`whitelist`?(0,$.jsx)(F,{size:13,className:`ml-1.5 inline`,"aria-hidden":`true`}):(0,$.jsx)(ct,{size:13,className:`ml-1.5 inline`,"aria-hidden":`true`})]},e))}),(0,$.jsx)(`p`,{className:`text-badge text-text-tertiary m-0`,children:j===`whitelist`?`Only these models may be called. Empty = all allowed.`:`These models are refused. Everything else is allowed.`}),(0,$.jsx)(`div`,{className:`flex gap-1.5 flex-wrap min-h-6`,children:N.length===0?(0,$.jsx)(`span`,{className:`text-badge text-text-tertiary`,children:j===`whitelist`?`All models allowed`:`No models blocked`}):N.map(e=>(0,$.jsxs)(`span`,{className:`font-mono tabular-nums inline-flex items-center gap-1.5 text-badge bg-accent-soft text-accent py-1 px-3 rounded-chip border border-accent`,children:[e,(0,$.jsx)(`button`,{type:`button`,"aria-label":`Remove ${e} from the model list`,onClick:()=>P(t=>t.filter(t=>t!==e)),disabled:n,className:`bg-transparent border-0 cursor-pointer p-0 flex`,children:`×`})]},e))}),(0,$.jsx)(h,{variant:`secondary`,size:`sm`,type:`button`,onClick:()=>se(!0),disabled:n,children:`Browse models`}),(0,$.jsx)(De,{open:I,onClose:()=>se(!1),selected:N,onToggle:e=>P(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e]),title:j===`whitelist`?`Select allowed models`:`Select blocked models`,multi:!0})]}),(0,$.jsxs)(`div`,{className:`flex flex-col gap-4 min-w-0`,children:[(0,$.jsxs)(`section`,{"aria-labelledby":`routing-blocking-heading`,className:`flex flex-col gap-0 min-w-0 rounded-card border border-inner-border bg-surface-1 overflow-hidden`,children:[(0,$.jsxs)(`div`,{className:`px-4 pt-4 pb-3 border-b border-inner-border`,children:[(0,$.jsxs)(`h4`,{id:`routing-blocking-heading`,className:`inline-flex items-center gap-2 text-caption font-bold text-text-primary`,children:[(0,$.jsx)(M,{size:15,className:`text-accent`,"aria-hidden":`true`}),`Routing & Client Blocking`]}),(0,$.jsx)(`p`,{className:`mt-1 mb-0 text-badge text-text-tertiary`,children:`Control which gateway routes this key can call and which client apps are blocked before routing.`})]}),(0,$.jsxs)(`div`,{className:`flex flex-col divide-y divide-inner-border`,children:[(0,$.jsxs)(`div`,{className:`flex flex-col gap-2 px-4 py-3`,children:[(0,$.jsx)(`p`,{className:`text-badge font-semibold text-text-secondary m-0`,children:`Gateway routing`}),ft.filter(e=>e===`routing:invoke`).map(e=>(0,$.jsxs)(`div`,{className:`flex items-center justify-between gap-4 py-1.5 px-4 rounded-inset`,style:{minHeight:`38px`,border:`1px solid var(--inner-border)`,background:A.includes(e)?`var(--accent-soft)`:`var(--surface-2)`},children:[(0,$.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,$.jsx)(M,{size:14,className:`mt-0.5 shrink-0 text-accent`,"aria-hidden":`true`}),(0,$.jsxs)(`div`,{className:`min-w-0`,children:[(0,$.jsx)(`div`,{className:`text-caption font-semibold text-text-primary`,children:e}),(0,$.jsx)(`p`,{className:`mt-0.5 mb-0 text-badge text-text-tertiary`,children:mt[e]})]})]}),(0,$.jsx)(K,{checked:A.includes(e),onChange:()=>ke(e),disabled:n,"aria-label":`Grant ${e}`})]},e))]}),(0,$.jsxs)(`div`,{className:`flex flex-col gap-2 px-4 py-3`,children:[(0,$.jsx)(`p`,{className:`text-badge font-semibold text-text-secondary m-0`,children:`Blocked client apps`}),(0,$.jsx)(`div`,{className:`flex flex-col gap-2`,children:de.map(e=>(0,$.jsxs)(`div`,{className:`flex items-center justify-between gap-4 py-1.5 px-4 rounded-inset`,style:{minHeight:`38px`,border:`1px solid var(--inner-border)`,background:ce.includes(e.id)?`var(--accent-soft)`:`var(--surface-2)`},children:[(0,$.jsxs)(`div`,{className:`flex min-w-0 items-center gap-3`,children:[(0,$.jsx)(s,{size:14,className:`shrink-0 text-orange`,"aria-hidden":`true`}),(0,$.jsxs)(`div`,{className:`min-w-0`,children:[(0,$.jsxs)(`div`,{className:`text-caption font-semibold text-text-primary`,children:[`Block `,e.label,` Client`]}),(0,$.jsx)(`p`,{className:`mt-0.5 mb-0 text-badge text-text-tertiary`,children:e.id===`9router`?`9router, Omniroute, and Baazar Probes`:`Fingerprint-based detection — best-effort; unrecognised clients are never matched`})]})]}),(0,$.jsx)(K,{checked:ce.includes(e.id),onChange:t=>L(n=>t?[...n,e.id]:n.filter(t=>t!==e.id)),disabled:n,"aria-label":`Block ${e.label} client`})]},e.id))})]})]}),(0,$.jsx)(`div`,{className:`px-4 py-3`,children:(0,$.jsx)(wt,{keyId:e===`edit`&&t?t.id:``,busy:n,scopeGranted:A.includes(`routing:cli_mapping`),onScopeChange:e=>{e!==A.includes(`routing:cli_mapping`)&&ke(`routing:cli_mapping`)},persistScope:n=>{if(e!==`edit`||!t)return;let r=n?[...new Set([...A,`routing:cli_mapping`])]:A.filter(e=>e!==`routing:cli_mapping`);Oe.mutate({keyId:t.id,request:{scopes:r}},{onError:e=>g.error(z(e,`Could not update the key's routing scope.`))})}})})]}),(0,$.jsxs)(`section`,{"aria-labelledby":`dashboard-scopes-heading`,className:`flex flex-col gap-0 min-w-0 rounded-card border border-inner-border bg-surface-1 overflow-hidden`,children:[(0,$.jsxs)(`div`,{className:`px-4 pt-4 pb-3 border-b border-inner-border`,children:[(0,$.jsxs)(`h4`,{id:`dashboard-scopes-heading`,className:`inline-flex items-center gap-2 text-caption font-bold text-text-primary`,children:[(0,$.jsx)(he,{size:15,className:`text-accent`,"aria-hidden":`true`}),`Dashboard / Resources`]}),(0,$.jsx)(`p`,{className:`mt-1 mb-0 text-badge text-text-tertiary`,children:`Grants read or write access to console data — providers, models, configuration, and usage stats. No routing is implied by these scopes.`})]}),(0,$.jsx)(`div`,{className:`flex flex-col gap-2 p-4`,children:ft.filter(e=>!e.startsWith(`routing:`)).map(e=>(0,$.jsxs)(`div`,{className:`flex items-center justify-between gap-4 py-1.5 px-4 rounded-inset`,style:{minHeight:`38px`,border:`1px solid var(--inner-border)`,background:A.includes(e)?`var(--accent-soft)`:`var(--surface-2)`},children:[(0,$.jsxs)(`div`,{className:`flex items-start gap-3 min-w-0`,children:[(()=>{let t=ht[e];return(0,$.jsx)(t,{size:14,className:`mt-0.5 shrink-0 text-accent`,"aria-hidden":`true`})})(),(0,$.jsxs)(`div`,{className:`min-w-0`,children:[(0,$.jsx)(`div`,{className:`text-caption font-semibold text-text-primary`,children:e}),(0,$.jsx)(`p`,{className:`mt-0.5 mb-0 text-badge text-text-tertiary`,children:mt[e]})]})]}),(0,$.jsx)(K,{checked:A.includes(e),onChange:()=>ke(e),disabled:n,"aria-label":`Grant ${e}`})]},e))})]})]})]})]})]})]})}function kt({secret:e,onClose:t}){return(0,$.jsx)(k,{open:e!==null,onClose:t,title:`New API key`,description:`Copy it now, or reveal it again later from the key's Share button.`,size:`md`,children:(0,$.jsxs)(`div`,{className:`flex flex-col gap-7`,children:[(0,$.jsx)(`p`,{className:`text-body text-text-secondary m-0 leading-normal`,children:`A personal key stays recoverable. Open the key's Share button and choose Reveal to see it again and copy it. Rotating the key replaces this secret, and any client still using it starts getting 401s.`}),(0,$.jsx)(`code`,{className:`block rounded-inset border border-inner-border bg-surface-1 py-5 px-6 text-caption text-text-primary break-all`,children:e}),(0,$.jsxs)(`div`,{className:`flex gap-4 flex-wrap`,children:[(0,$.jsx)(O,{value:e??``,size:`sm`,variant:`primary`,label:`Copy key`,copiedLabel:`Copied`}),(0,$.jsx)(h,{variant:`secondary`,size:`sm`,icon:(0,$.jsx)(f,{size:13}),onClick:()=>{e!==null&&(Ce(`cartethyia-api-key.txt`,`Cartethyia API key\n\n${e}\n\nKeep this secret. Reveal it again from the key's Share button.\n`,`text/plain;charset=utf-8`),g.success(`Key saved to your downloads.`))},children:`Save this key`})]})]})})}var At=e=>(e??0).toLocaleString(),jt=e=>e?new Date(e).toLocaleString():`—`;function Mt({keyId:e}){let t=Re(),[n,r]=(0,Q.useState)(null),[i,a]=(0,Q.useState)(!1);return(0,$.jsxs)(`div`,{className:`flex min-w-0 items-center gap-4 rounded-control border border-inner-border bg-surface-2 px-5 py-4 text-text-tertiary`,children:[(0,$.jsx)(`code`,{title:i&&n?n:void 0,className:`min-w-0 flex-auto overflow-hidden font-mono text-caption text-text-primary text-ellipsis whitespace-nowrap`,children:i&&n?n:`••••••••••••••••`}),(0,$.jsx)(h,{variant:`secondary`,size:`sm`,icon:i?(0,$.jsx)(x,{size:13}):(0,$.jsx)(S,{size:13}),loading:t.isPending,disabled:t.isPending,onClick:()=>{if(n!==null){a(e=>!e);return}t.mutate({keyId:e},{onSuccess:e=>{r(e.secret),a(!0)},onError:e=>g.error(z(e,`Could not reveal the key.`))})},children:i?`Hide`:`Reveal`}),i&&n?(0,$.jsx)(O,{value:n,size:`sm`,variant:`secondary`,label:`Copy`,copiedLabel:`Copied`}):null]})}function Nt({label:e,value:t}){return(0,$.jsxs)(`div`,{className:`min-w-0 flex-1 basis-60 rounded-control border border-inner-border bg-surface-2 px-5 py-3`,children:[(0,$.jsx)(`dt`,{className:`text-badge font-normal tracking-label text-text-tertiary uppercase`,children:e}),(0,$.jsx)(`dd`,{className:`mt-1 text-caption font-normal text-text-primary tabular-nums`,children:t==null?`Unlimited`:At(t)})]})}function Pt(e){return e?{title:`Regenerate this key?`,message:`This rotates the key credential. Any client still using the current secret starts getting 401s immediately, and the old secret cannot be recovered. The handoff link is re-pointed to reveal the new key.`,confirmLabel:`Regenerate key`}:{title:`Regenerate this link?`,message:`This replaces the link URL; the current URL stops resolving immediately. Recipients keep the keys they already generated and keep working — but no one can enroll through the old link again.`,confirmLabel:`Regenerate link`}}function Ft({consumed:e,budget:t}){let n=t==null||t<=0,r=n?100:Math.min(100,e/t*100),i=!n&&e>=t;return(0,$.jsxs)(`div`,{className:`grid flex-auto basis-full gap-2.5 rounded-control border border-inner-border bg-surface-2 px-5 py-3.5`,children:[(0,$.jsxs)(`div`,{className:`flex items-baseline justify-between gap-4 text-badge tracking-label text-text-tertiary uppercase`,children:[(0,$.jsx)(`span`,{children:`Lifetime budget`}),(0,$.jsx)(`span`,{className:`text-caption font-normal text-text-primary tabular-nums normal-case tracking-normal`,children:n?`${G(e)} · Unlimited`:`${G(e)} / ${G(t)}`})]}),(0,$.jsx)(`div`,{className:`h-3 overflow-hidden rounded bg-inner-border`,role:`progressbar`,"aria-label":`Lifetime token budget consumed`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Math.round(r),"aria-valuetext":n?`${G(e)} tokens consumed, no lifetime budget set`:`${G(e)} of ${G(t)} tokens consumed`,children:(0,$.jsx)(`div`,{className:i?`h-full rounded bg-status-danger`:`h-full rounded bg-status-success`,style:{width:`${r}%`}})})]})}var It=25,Lt=25,Rt=500;function zt({consumed:e,budget:t}){if(t==null)return(0,$.jsx)(`div`,{className:`grid flex-auto basis-full gap-2.5 rounded-control border border-inner-border bg-surface-2 px-5 py-3.5`,children:(0,$.jsxs)(`div`,{className:`flex items-baseline justify-between gap-4 text-badge tracking-label text-text-tertiary uppercase`,children:[(0,$.jsx)(`span`,{children:`Total quota used`}),(0,$.jsx)(`span`,{className:`text-caption font-normal text-text-primary tabular-nums normal-case tracking-normal`,children:G(e)})]})});let n=t>0?Math.min(100,e/t*100):0,r=t>0?Math.max(0,100-e/t*100):100,i=Math.max(0,t-e),a=Ye(e>=t?0:r),o=e>=t;return(0,$.jsxs)(`div`,{className:`grid flex-auto basis-full gap-2.5 rounded-control border border-inner-border bg-surface-2 px-5 py-3.5`,children:[(0,$.jsxs)(`div`,{className:`flex items-baseline justify-between gap-4 text-badge tracking-label text-text-tertiary uppercase`,children:[(0,$.jsx)(`span`,{children:`Total quota`}),(0,$.jsxs)(`span`,{className:`text-caption font-normal text-text-primary tabular-nums normal-case tracking-normal`,children:[G(e),` / `,G(t)]}),(0,$.jsx)(`span`,{className:`border rounded-chip px-4 py-0.5 text-caption font-bold whitespace-nowrap tabular-nums`,style:{color:a.text,borderColor:a.text},children:o?`Exhausted`:`${G(i)} left`})]}),(0,$.jsx)(`div`,{className:`h-3 overflow-hidden rounded bg-inner-border`,role:`progressbar`,"aria-label":`Total quota consumed`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Math.round(n),"aria-valuetext":`${G(e)} of ${G(t)} tokens consumed`,children:(0,$.jsx)(`div`,{className:o?`h-full rounded bg-status-danger`:`h-full rounded`,style:{width:`${n}%`,background:o?void 0:a.bar}})})]})}function Bt({parentId:e,childId:t}){let n=Ne(e,t);if(n.isPending)return(0,$.jsx)(T,{label:`Loading activity…`,compact:!0});if(n.isError)return(0,$.jsx)(w,{compact:!0,message:z(n.error,`Could not load activity.`),onRetry:()=>void n.refetch()});let r=n.data;return r?(0,$.jsxs)(`div`,{className:`grid min-w-0 gap-6 border-t border-inner-border bg-surface-1 px-6 py-5`,children:[(0,$.jsxs)(`section`,{children:[(0,$.jsx)(`h4`,{className:`mb-3 text-caption font-bold text-text-primary`,children:`Top models`}),r.models.length?(0,$.jsx)(`div`,{className:`data-table-container`,children:(0,$.jsxs)(`table`,{className:`data-table text-caption`,children:[(0,$.jsx)(`thead`,{children:(0,$.jsxs)(`tr`,{children:[(0,$.jsx)(`th`,{scope:`col`,children:`Model`}),(0,$.jsx)(`th`,{scope:`col`,children:`Today`}),(0,$.jsx)(`th`,{scope:`col`,children:`Errors`}),(0,$.jsx)(`th`,{scope:`col`,children:`Tokens`})]})}),(0,$.jsx)(`tbody`,{children:r.models.map((e,t)=>(0,$.jsxs)(`tr`,{children:[(0,$.jsx)(`td`,{children:e.modelId}),(0,$.jsx)(`td`,{children:At(e.todayRequests)}),(0,$.jsx)(`td`,{children:At(e.todayErrors)}),(0,$.jsx)(`td`,{children:G(e.todayTokens)})]},`${e.providerId??``}-${e.modelId}-${t}`))})]})}):(0,$.jsx)(`p`,{className:`py-3 text-caption text-text-tertiary`,children:`No model activity yet.`})]}),(0,$.jsxs)(`section`,{children:[(0,$.jsx)(`h4`,{className:`mb-3 text-caption font-bold text-text-primary`,children:`Recent requests`}),r.requests.length?(0,$.jsx)(`div`,{className:`data-table-container`,children:(0,$.jsxs)(`table`,{className:`data-table text-caption`,children:[(0,$.jsx)(`thead`,{children:(0,$.jsxs)(`tr`,{children:[(0,$.jsx)(`th`,{scope:`col`,children:`Model`}),(0,$.jsx)(`th`,{scope:`col`,children:`Status`}),(0,$.jsx)(`th`,{scope:`col`,children:`Tokens`}),(0,$.jsx)(`th`,{scope:`col`,children:`Time`})]})}),(0,$.jsx)(`tbody`,{children:r.requests.map(e=>(0,$.jsxs)(`tr`,{children:[(0,$.jsxs)(`td`,{children:[e.providerId??`Provider`,`/`,e.modelId??`Model`]}),(0,$.jsxs)(`td`,{children:[e.status,e.httpStatus?` · ${e.httpStatus}`:``]}),(0,$.jsx)(`td`,{children:G(e.totalTokens)}),(0,$.jsx)(`td`,{children:jt(e.startedAt)})]},e.requestId))})]})}):(0,$.jsx)(`p`,{className:`py-3 text-caption text-text-tertiary`,children:`No recent requests.`})]})]}):null}function Vt({parent:e,onSecretRevealed:t}){let[n,r]=(0,Q.useState)(null),[i,c]=(0,Q.useState)(`active`),[l,u]=(0,Q.useState)(It),[d,f]=(0,Q.useState)(`createdAt`),[p,m]=(0,Q.useState)(`desc`),[_,v]=(0,Q.useState)(null),ee=Ue(),b=Fe(),x=je(),S=Ie(),C=Me(e.id),E=e.keyMode!==`share`,D=ze(E?null:e.id,{limit:l,offset:0,sortBy:d,order:p,status:i}),ne=D.data,k=ne?.rows??[],A=ne?.active??0,ie=k,j=()=>{r(null),u(It)},M=e=>{d===e?m(e=>e===`asc`?`desc`:`asc`):(f(e),m(`asc`)),j()},N=e=>{let t=e.currentTarget;t.scrollHeight-t.scrollTop-t.clientHeight<40&&!D.isFetching&&k.length>=l&&l<Rt&&u(e=>Math.min(e+Lt,Rt))},P=({column:e,children:t})=>{let n=d===e;return(0,$.jsx)(`th`,{scope:`col`,children:(0,$.jsxs)(`button`,{type:`button`,onClick:()=>M(e),className:`inline-flex cursor-pointer items-center gap-1 border-0 bg-transparent p-0 font-inherit text-inherit hover:text-text-primary`,"aria-label":`Sort by ${String(e)}`,children:[t,n?p===`asc`?(0,$.jsx)(o,{size:12,"aria-hidden":`true`}):(0,$.jsx)(a,{size:12,"aria-hidden":`true`}):(0,$.jsx)(Ze,{size:12,"aria-hidden":`true`,className:`text-text-tertiary`})]})})};(0,Q.useEffect)(()=>{r(null)},[e.id]);let F=async t=>{try{let n=await S.mutateAsync({parentKeyId:e.id,scope:t});u(It),g.success(`Revoked ${n.deleted.toLocaleString()} recipient${n.deleted===1?``:`s`}.`)}catch(e){g.error(z(e,`Could not revoke recipients.`))}},I=ee.isPending||b.isPending,[oe,se]=(0,Q.useState)(!1),ce=async()=>{if(E){let n=await b.mutateAsync({keyId:e.id});t?.(n.secret);return}await ee.mutateAsync({keyId:e.id,regenerate:!0}),g.success(`Link regenerated; the previous URL no longer works.`)},L=()=>{ee.mutate({keyId:e.id},{onError:e=>g.error(z(e,`Could not create link.`))})},le=C.data?.url??null,R=Pt(E);return(0,$.jsxs)(`div`,{className:`grid min-w-0 gap-6`,children:[(0,$.jsx)(`section`,{"aria-label":`Link`,children:C.isPending?(0,$.jsx)(T,{label:`Loading link…`,compact:!0}):C.isError?(0,$.jsx)(w,{compact:!0,message:z(C.error,`Could not load the link.`),onRetry:()=>void C.refetch()}):le?(0,$.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-4 rounded-control border border-inner-border bg-surface-2 px-5 py-4 text-text-tertiary`,children:[(0,$.jsx)(re,{size:14,"aria-hidden":`true`,className:`shrink-0`}),(0,$.jsx)(`code`,{title:le,className:`min-w-0 flex-auto overflow-hidden font-mono text-caption text-text-primary text-ellipsis whitespace-nowrap`,children:le}),(0,$.jsx)(O,{value:le,size:`sm`,variant:`secondary`,label:`Copy`,copiedLabel:`Copied`}),(0,$.jsx)(h,{variant:`secondary`,size:`sm`,icon:(0,$.jsx)(it,{size:13}),loading:I,disabled:I,onClick:()=>se(!0),children:`Regenerate`})]}):(0,$.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-4 rounded-control border border-inner-border bg-surface-2 px-5 py-4 text-text-tertiary`,children:[(0,$.jsx)(re,{size:14,"aria-hidden":`true`,className:`shrink-0`}),(0,$.jsx)(`span`,{className:`flex-auto text-caption text-text-tertiary`,children:`No link yet.`}),(0,$.jsx)(h,{variant:`primary`,size:`sm`,loading:I,disabled:I,onClick:L,children:`Create link`})]})}),E?(0,$.jsxs)(`section`,{"aria-label":`API key`,className:`grid gap-3`,children:[(0,$.jsx)(`div`,{className:`flex items-center justify-between gap-4`,children:(0,$.jsx)(`strong`,{className:`text-caption`,children:`API key`})}),(0,$.jsx)(Mt,{keyId:e.id})]}):null,E?(0,$.jsxs)(`section`,{"aria-label":`Usage`,className:`grid gap-3`,children:[(0,$.jsx)(`div`,{className:`flex items-center justify-between gap-4`,children:(0,$.jsx)(`strong`,{className:`text-caption`,children:`Usage`})}),(0,$.jsxs)(`dl`,{className:`m-0 flex flex-wrap gap-3`,children:[(0,$.jsxs)(`div`,{className:`min-w-0 flex-1 basis-60 rounded-control border border-inner-border bg-surface-2 px-5 py-3`,children:[(0,$.jsx)(`dt`,{className:`text-badge font-normal tracking-label text-text-tertiary uppercase`,children:`Lifetime tokens`}),(0,$.jsx)(`dd`,{className:`mt-1 text-caption font-normal text-text-primary tabular-nums`,children:G(e.tokensConsumed)})]}),(0,$.jsx)(Nt,{label:`Requests / min`,value:e.requestsPerMinute}),(0,$.jsx)(Nt,{label:`Daily tokens`,value:e.dailyTokenLimit}),(0,$.jsx)(Nt,{label:`Monthly tokens`,value:e.monthlyTokenLimit}),(0,$.jsx)(Ft,{consumed:e.tokensConsumed,budget:e.lifetimeTokenBudget})]})]}):(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(`section`,{"aria-label":`Total quota`,className:`grid gap-3`,children:[(0,$.jsx)(`div`,{className:`flex items-center justify-between gap-4`,children:(0,$.jsx)(`strong`,{className:`text-caption`,children:`Total quota`})}),(0,$.jsx)(zt,{consumed:ne?.consumed??0,budget:e.lifetimeTokenBudget})]}),(0,$.jsxs)(`section`,{"aria-label":`Recipients`,className:`grid gap-3`,children:[(0,$.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,$.jsx)(`strong`,{className:`text-caption`,children:`Recipients`}),(0,$.jsxs)(`span`,{className:`mr-2 ml-auto text-caption text-text-tertiary tabular-nums`,children:[`Active users: `,A.toLocaleString()]}),(0,$.jsx)(`div`,{className:`inline-flex items-center gap-1 rounded-chip border border-inner-border p-0.5`,role:`group`,"aria-label":`Filter recipients by status`,children:[`active`,`revoked`].map(e=>(0,$.jsx)(`button`,{type:`button`,"aria-pressed":i===e,onClick:()=>{j(),c(e)},className:`rounded-chip border-0 px-3 py-1 text-badge font-semibold capitalize cursor-pointer ${i===e?`bg-surface-1 text-text-primary`:`bg-transparent text-text-secondary hover:text-text-primary`}`,children:e},e))}),_===null?null:(0,$.jsxs)(`span`,{className:`inline-flex items-center gap-2 rounded-chip border border-danger-border bg-surface-2 px-3 py-1`,children:[(0,$.jsx)(`span`,{className:`text-badge text-text-secondary`,children:_===`all`?`Revoke all active recipients?`:`Revoke all active recipients that never spent a token?`}),(0,$.jsx)(h,{variant:`danger`,size:`sm`,loading:S.isPending,onClick:()=>{let e=_===`all`?`active`:`unused`;v(null),F(e)},children:`Confirm`}),(0,$.jsx)(h,{variant:`ghost`,size:`sm`,onClick:()=>v(null),children:`Cancel`})]}),(0,$.jsx)(h,{variant:`ghost`,size:`sm`,disabled:A===0||S.isPending,title:A===0?`No active recipients`:`Revoke every active recipient (${A.toLocaleString()})`,onClick:()=>v(`unused`),icon:(0,$.jsx)(s,{size:13}),children:`Revoke no-usage`}),(0,$.jsx)(h,{variant:`ghost`,size:`sm`,disabled:A===0||S.isPending,title:A===0?`No active recipients`:`Revoke all active recipients (${A.toLocaleString()})`,onClick:()=>v(`all`),icon:(0,$.jsx)(s,{size:13}),children:`Revoke all`}),(0,$.jsx)(h,{variant:`ghost`,size:`sm`,onClick:()=>void D.refetch(),icon:(0,$.jsx)(ae,{size:13,className:D.isFetching?`animate-spin`:void 0}),children:`Refresh`})]}),D.isPending&&!D.data?(0,$.jsx)(T,{label:`Loading recipients…`,compact:!0}):D.isError?(0,$.jsx)(w,{compact:!0,message:z(D.error,`Could not load recipients.`),onRetry:()=>void D.refetch()}):ie.length===0?(0,$.jsx)(te,{compact:!0,title:i===`revoked`?`No revoked recipients`:`No active recipients`,message:i===`revoked`?`Revoked keys appear here once a recipient's key is revoked.`:`Keys generated through this link appear here with their masked client IP and token usage.`}):(0,$.jsxs)(`div`,{className:`data-table-container max-h-[46vh]`,onScroll:N,children:[(0,$.jsxs)(`table`,{className:`data-table text-caption`,children:[(0,$.jsx)(`thead`,{children:(0,$.jsxs)(`tr`,{children:[(0,$.jsx)(`th`,{scope:`col`,className:`w-12`,"aria-label":`Expand`}),(0,$.jsx)(P,{column:`label`,children:`Key`}),(0,$.jsx)(P,{column:`revokedAt`,children:`Status`}),(0,$.jsx)(`th`,{scope:`col`,children:`Today`}),(0,$.jsx)(`th`,{scope:`col`,children:`Lifetime`}),(0,$.jsx)(`th`,{scope:`col`,children:`Last activity`}),(0,$.jsx)(P,{column:`createdAt`,children:`Created`}),(0,$.jsx)(`th`,{scope:`col`,className:`text-right whitespace-nowrap`,children:`Actions`})]})}),(0,$.jsx)(`tbody`,{children:ie.map(t=>{let i=n===t.id;return(0,$.jsxs)(Q.Fragment,{children:[(0,$.jsxs)(`tr`,{children:[(0,$.jsx)(`td`,{children:(0,$.jsx)(`button`,{type:`button`,className:`grid h-11 w-11 place-items-center rounded-chip border-0 bg-transparent p-0 text-text-secondary hover:bg-hover hover:text-text-primary`,"aria-expanded":i,"aria-label":i?`Collapse recipient`:`Expand recipient`,onClick:()=>r(i?null:t.id),children:i?(0,$.jsx)(_e,{size:14}):(0,$.jsx)(y,{size:14})})}),(0,$.jsxs)(`td`,{children:[(0,$.jsxs)(`code`,{children:[t.label||t.keyPrefix||`key`,`…`]}),(0,$.jsx)(`div`,{className:`mt-1 text-badge text-text-tertiary wrap-anywhere`,children:t.issuedClientIp??`IP hidden`})]}),(0,$.jsx)(`td`,{children:t.revokedAt?`revoked`:`active`}),(0,$.jsx)(`td`,{children:G(t.today.totalTokens)}),(0,$.jsx)(`td`,{children:G(t.allTime.totalTokens)}),(0,$.jsx)(`td`,{children:jt(t.lastUsedAt)}),(0,$.jsx)(`td`,{children:jt(t.createdAt)}),(0,$.jsx)(`td`,{className:`text-right whitespace-nowrap`,children:(0,$.jsx)(h,{variant:`danger`,size:`sm`,disabled:x.isPending||!!t.revokedAt,onClick:()=>x.mutate({parentKeyId:e.id,childKeyId:t.id},{onError:e=>g.error(z(e,`Could not revoke key.`))}),children:`Revoke`})})]}),i?(0,$.jsx)(`tr`,{children:(0,$.jsx)(`td`,{colSpan:8,className:`p-0`,children:(0,$.jsx)(Bt,{parentId:e.id,childId:t.id})})}):null]},t.id)})})]}),D.isFetching&&k.length>0?(0,$.jsx)(`div`,{className:`border-t border-inner-border py-2 text-center text-badge text-text-tertiary`,children:`Loading more…`}):null,k.length>0&&k.length>=l&&l<Rt?(0,$.jsx)(`div`,{className:`py-2 text-center text-badge text-text-tertiary`,children:`Scroll for more`}):null]})]})]}),(0,$.jsx)(me,{open:oe,onClose:()=>se(!1),onConfirm:ce,title:R.title,message:R.message,confirmLabel:R.confirmLabel,danger:!0})]})}function Ht({parent:e,onClose:t,onSecretRevealed:n}){let r=e.keyMode!==`share`;return(0,$.jsx)(k,{open:!0,onClose:t,title:`Sharing — ${e.label||`API key`}`,description:r?`One stable handoff link for this key. Regenerating rotates the key itself.`:`One stable enrollment link. Regenerating replaces the URL; recipients keep the keys they already generated.`,size:`lg`,children:(0,$.jsx)(Vt,{parent:e,onSecretRevealed:n})})}function Ut(e){if(!e.bannedUntil)return`Permanent — lift manually`;let t=new Date(e.bannedUntil).getTime();if(!Number.isFinite(t))return`—`;let n=t-Date.now(),r=new Date(e.bannedUntil).toLocaleString();if(n<=0)return`${r} (lapsed)`;let i=Math.ceil(n/6e4);if(i<60)return`${r} (in ${i}m)`;let a=Math.floor(i/60);return a<24?`${r} (in ${a}h)`:`${r} (in ${Math.floor(a/24)}d)`}function Wt({keys:e,onClose:t}){let n=Le(),[r,i]=(0,Q.useState)(null),a=Date.now(),o=e.filter(e=>e.bannedAt?!e.bannedUntil||new Date(e.bannedUntil).getTime()>a:!1);return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(k,{open:!0,onClose:t,title:`Banned Users`,description:`API keys that have been banned. A timed ban lapses on its own; lifting one early is the escape hatch for a mistake.`,size:`lg`,children:(0,$.jsxs)(`div`,{className:`flex flex-col gap-7 min-w-0`,children:[(0,$.jsxs)(`div`,{className:`min-w-0`,children:[(0,$.jsxs)(`h4`,{className:`text-caption font-semibold text-text-secondary mb-4`,children:[`Active bans (`,o.length,`)`]}),o.length===0?(0,$.jsx)(te,{compact:!0,title:`No banned keys`,message:`No API key is currently banned.`,icon:(0,$.jsx)(st,{size:20})}):(0,$.jsx)(`div`,{className:`rounded-inset border border-inner-border`,children:(0,$.jsx)(Je,{maxHeight:480,scrollRegion:!0,headers:[`API key`,`Reason`,`Lapses`,``],children:o.map(e=>(0,$.jsxs)(`tr`,{children:[(0,$.jsx)(`td`,{className:`font-mono tabular-nums text-badge text-text-primary whitespace-nowrap`,children:e.label||e.id.slice(0,8)}),(0,$.jsx)(`td`,{className:`text-badge text-text-secondary`,children:e.banReason??`—`}),(0,$.jsx)(`td`,{className:`text-badge text-text-secondary whitespace-nowrap`,children:Ut(e)}),(0,$.jsx)(`td`,{className:`text-right whitespace-nowrap`,children:(0,$.jsx)(h,{variant:`secondary`,size:`sm`,icon:(0,$.jsx)(lt,{size:13}),disabled:n.isPending,onClick:()=>i(e),children:`Unban`})})]},e.id))})})]}),(0,$.jsx)(Oe,{justify:`flex-end`,gap:`0px`,children:(0,$.jsx)(h,{variant:`secondary`,size:`sm`,onClick:t,children:`Close`})})]})}),(0,$.jsx)(me,{open:r!==null,onClose:()=>i(null),onConfirm:async()=>{if(r)try{await n.mutateAsync({keyId:r.id}),g.success(`Unbanned ${r.label||r.id.slice(0,8)}.`),i(null)}catch(e){g.error(z(e,`Could not unban key.`))}},title:`Lift this ban?`,message:`Lift the ban on ${r?.label||`this key`}? The caller can reach the gateway again immediately.`,confirmLabel:`Unban`,danger:!0})]})}function Gt(){let e=He(),t=Be(),n=Pe(),r=Ve(),i=Le(),a=Fe(),o=Re(),s=Ae(),{copy:c}=Se(),l=se(),u=I(),f=l.data?.invokeDisabled===!0,[p,m]=(0,Q.useState)(!1),[_,y]=(0,Q.useState)(!1),[b,x]=(0,Q.useState)(null),[C,D]=(0,Q.useState)(null),[ne,re]=(0,Q.useState)(!1),[O,ae]=(0,Q.useState)(null),[M,N]=(0,Q.useState)(null),[P,F]=(0,Q.useState)(null),[oe,L]=(0,Q.useState)(null),[le,R]=(0,Q.useState)(null),[ue,de]=(0,Q.useState)(null),fe=e.data??[],pe=e=>{F(null),L(e)},B=async e=>{try{let{secret:t}=await o.mutateAsync({keyId:e.id});await c(t)?g.success(`API key copied`):g.error(`Clipboard unavailable on this origin`)}catch(e){g.error(z(e,`Could not reveal API key.`))}},V=Pt(!0),H=e=>{u.mutate({invokeDisabled:!e},{onSuccess:()=>g.success(e?`Invoke enabled — routing has resumed.`:`Invoke disabled — every API key is now refused (503).`),onError:e=>g.error(e instanceof Error?e.message:`Could not save the setting`)})};return(0,$.jsxs)(xe,{children:[(0,$.jsx)(W,{title:`API Credentials`,subtitle:`Manage tenant API keys, model access, budgets, and sharing.`,icon:(0,$.jsx)(E,{size:16}),action:(0,$.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,$.jsx)(h,{variant:f?`primary`:`secondary`,size:`sm`,loading:l.isLoading||u.isPending,onClick:()=>m(!0),icon:(0,$.jsx)(j,{size:13}),children:f?`Enable Invoke`:`Disable Invoke`}),(0,$.jsx)(h,{variant:`secondary`,size:`sm`,onClick:()=>re(!0),icon:(0,$.jsx)(st,{size:13}),children:`Banned Users`}),(0,$.jsx)(h,{variant:`primary`,size:`sm`,onClick:()=>{F(null),y(!0)},icon:(0,$.jsx)(ie,{size:13}),children:`Create Key`})]})}),(0,$.jsx)(U,{children:e.isPending&&!e.data?(0,$.jsx)(T,{label:`Loading API keys…`}):e.isError&&!e.data?(0,$.jsx)(w,{message:z(e.error,`Could not load credentials.`),onRetry:()=>void e.refetch()}):fe.length===0?(0,$.jsx)(te,{title:`No API keys issued`,message:`Generate a secret key to authenticate your SDK or CLI client against the gateway.`,icon:(0,$.jsx)(E,{size:20})}):(0,$.jsx)(`div`,{className:`scroll-region max-h-280 pr-1`,children:(0,$.jsx)(ee,{items:fe,label:`API credentials`,disabled:s.isPending,onReorder:e=>s.mutate(e,{onError:e=>g.error(z(e,`Could not save the new order.`))}),renderItem:e=>(0,$.jsxs)(`div`,{className:`api-key-card flex items-start justify-between gap-6 px-6 py-4 rounded-chip border border-inner-border bg-surface-2 max-medium:flex-col max-medium:items-stretch max-medium:gap-4 max-medium:p-5 [&>div:last-child]:flex-wrap`,children:[(0,$.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,$.jsxs)(`div`,{className:`flex items-center gap-4 flex-wrap`,children:[(0,$.jsx)(`strong`,{className:`text-body`,children:e.label||`Unnamed credential`}),(0,$.jsx)(q,{tone:e.revokedAt||e.bannedAt?`err`:e.enabled?`ok`:`warn`,children:e.revokedAt?`revoked`:e.bannedAt?`banned`:e.enabled?`enabled`:`disabled`}),e.bannedAt&&!e.revokedAt?(0,$.jsx)(q,{tone:`err`,title:e.banReason??`Banned`,children:(0,$.jsxs)(`button`,{type:`button`,className:`inline-flex items-center gap-1 cursor-pointer bg-transparent border-0 p-0 text-inherit`,onClick:()=>ae(e),children:[(0,$.jsx)(S,{size:11,"aria-hidden":`true`}),`See reason`]})}):null,(0,$.jsx)(q,{tone:e.keyMode===`share`?`accent`:`default`,children:e.keyMode===`share`?`share template`:`personal`}),e.isDefault?(0,$.jsx)(q,{tone:`warn`,title:`Required by the gateway. Rotate it; it cannot be deleted.`,children:`default · rotate only`}):null]}),(0,$.jsxs)(`div`,{className:`api-key-facts flex items-center flex-wrap gap-2 mt-3 min-w-0 max-medium:grid max-medium:grid-cols-3 max-medium:gap-2 max-medium:mt-0`,children:[(0,$.jsxs)(`span`,{className:`inline-flex items-center gap-2.5 px-3.5 py-1 border border-inner-border rounded-chip bg-surface-1 text-text-secondary text-badge leading-normal whitespace-nowrap max-medium:justify-between`,children:[(0,$.jsx)(`span`,{className:`text-text-tertiary text-micro font-semibold uppercase tracking-label`,children:`Created`}),new Date(e.createdAt).toLocaleDateString()]}),(0,$.jsxs)(`span`,{className:`inline-flex items-center gap-2.5 px-3.5 py-1 border border-inner-border rounded-chip bg-surface-1 text-text-secondary text-badge leading-normal whitespace-nowrap max-medium:justify-between`,children:[(0,$.jsx)(`span`,{className:`text-text-tertiary text-micro font-semibold uppercase tracking-label`,children:e.keyMode===`share`?`Total usage`:`Usage`}),G(e.tokensConsumed)]}),(0,$.jsxs)(`span`,{className:`inline-flex items-center gap-2.5 px-3.5 py-1 border border-inner-border rounded-chip bg-surface-1 text-text-secondary text-badge leading-normal whitespace-nowrap max-medium:justify-between`,children:[(0,$.jsx)(`span`,{className:`text-text-tertiary text-micro font-semibold uppercase tracking-label`,children:`RPM`}),we(e.requestsPerMinute)]})]}),(0,$.jsxs)(`div`,{className:`api-key-facts flex items-center flex-wrap gap-2 mt-3 min-w-0 max-medium:grid max-medium:grid-cols-3 max-medium:gap-2 max-medium:mt-0`,children:[(0,$.jsxs)(`span`,{className:`inline-flex items-center gap-2.5 px-3.5 py-1 border border-inner-border rounded-chip bg-surface-1 text-text-secondary text-badge leading-normal whitespace-nowrap max-medium:justify-between`,children:[(0,$.jsx)(`span`,{className:`text-text-tertiary text-micro font-semibold uppercase tracking-label`,children:`Daily`}),we(e.dailyTokenLimit)]}),(0,$.jsxs)(`span`,{className:`inline-flex items-center gap-2.5 px-3.5 py-1 border border-inner-border rounded-chip bg-surface-1 text-text-secondary text-badge leading-normal whitespace-nowrap max-medium:justify-between`,children:[(0,$.jsx)(`span`,{className:`text-text-tertiary text-micro font-semibold uppercase tracking-label`,children:`Monthly`}),we(e.monthlyTokenLimit)]}),(0,$.jsxs)(`span`,{className:`inline-flex items-center gap-2.5 px-3.5 py-1 border border-inner-border rounded-chip bg-surface-1 text-text-secondary text-badge leading-normal whitespace-nowrap max-medium:justify-between`,children:[(0,$.jsx)(`span`,{className:`text-text-tertiary text-micro font-semibold uppercase tracking-label`,children:`One-time`}),we(e.lifetimeTokenBudget)]}),(0,$.jsxs)(`span`,{className:`inline-flex items-center gap-2.5 px-3.5 py-1 border border-inner-border rounded-chip bg-surface-1 text-text-secondary text-badge leading-normal whitespace-nowrap max-medium:justify-between`,children:[(0,$.jsx)(`span`,{className:`text-text-tertiary text-micro font-semibold uppercase tracking-label`,children:`Concurrent`}),we(e.maxConcurrentRequests)]}),(0,$.jsxs)(`span`,{className:`inline-flex items-center gap-2.5 px-3.5 py-1 border border-inner-border rounded-chip bg-surface-1 text-text-secondary text-badge leading-normal whitespace-nowrap max-medium:justify-between`,children:[(0,$.jsx)(`span`,{className:`text-text-tertiary text-micro font-semibold uppercase tracking-label`,children:e.modelAccessMode===`blacklist`?`Blocked`:`Models`}),e.modelAccessMode===`blacklist`?e.modelList?.length??0:e.modelList?.length?e.modelList.length:`All`]})]})]}),(0,$.jsxs)(`div`,{className:`flex gap-3 shrink-0 flex-wrap`,children:[e.revokedAt?null:(0,$.jsx)(K,{checked:e.enabled,disabled:n.isPending,id:`api-key-enabled-${e.id}`,label:``,"aria-label":`${e.enabled?`Disable`:`Enable`} ${e.label||`API credential`}`,onChange:t=>n.mutate({keyId:e.id,request:{enabled:t}},{onSuccess:()=>g.success(`${e.label||`API credential`} ${t?`enabled`:`disabled`}`),onError:e=>g.error(z(e,`Could not update credential state.`))})}),(0,$.jsx)(h,{variant:`secondary`,size:`sm`,icon:(0,$.jsx)(A,{size:13}),onClick:()=>{F(null),x(e)},children:`Edit`}),!e.revokedAt&&e.keyMode!==`share`?(0,$.jsx)(h,{variant:`secondary`,size:`sm`,icon:(0,$.jsx)(d,{size:13}),onClick:()=>void B(e),disabled:o.isPending,children:`Copy`}):null,!e.revokedAt&&(0,$.jsx)(h,{variant:`secondary`,size:`sm`,icon:(0,$.jsx)(ot,{size:13}),onClick:()=>pe(e),children:e.keyMode===`share`?`Recipients`:`Share`}),!e.revokedAt&&e.keyMode!==`share`&&(0,$.jsx)(h,{variant:`secondary`,size:`sm`,icon:(0,$.jsx)(it,{size:13}),onClick:()=>{F(null),N(e)},disabled:a.isPending,children:`Rotate`}),!e.revokedAt&&!e.isDefault&&(0,$.jsx)(h,{variant:`danger`,size:`sm`,icon:(0,$.jsx)(ce,{size:13}),onClick:()=>D(e),disabled:r.isPending,children:`Revoke`}),e.bannedAt&&!e.revokedAt?(0,$.jsx)(h,{variant:`secondary`,size:`sm`,icon:(0,$.jsx)(v,{size:13}),onClick:()=>{i.mutate({keyId:e.id},{onSuccess:()=>g.success(`Unbanned ${e.label||e.id}.`),onError:e=>g.error(z(e,`Could not unban key.`))})},disabled:i.isPending,children:`Unban`}):null]})]})})})}),(0,$.jsx)(k,{open:_,onClose:()=>y(!1),title:`Create API Key`,description:`Create a tenant-scoped credential. Choose model access, permissions, limits, and optional blocked client routers.`,size:`lg`,footer:le,children:(0,$.jsx)(Ot,{mode:`create`,record:null,busy:t.isPending,onClose:()=>y(!1),actionsRef:R,onDone:e=>{t.mutate(e,{onSuccess:t=>{y(!1),F(Et(e.keyMode,t.secret)),g.success(`API key created`)},onError:e=>g.error(z(e,`Could not create API key.`))})}})}),(0,$.jsx)(k,{open:b!==null,onClose:()=>x(null),title:`Edit API Key`,description:`Update the key's model access, permissions, limits, share notes, and optional public popup.`,size:`lg`,footer:ue,children:(0,$.jsx)(Ot,{mode:`edit`,record:b,busy:n.isPending,onClose:()=>x(null),actionsRef:de,onDone:e=>{b&&n.mutate({keyId:b.id,request:e},{onSuccess:t=>{x(null),F(Et(e.keyMode,t.secret)),g.success(`API key updated`)},onError:e=>g.error(z(e,`Could not update API key.`))})}})}),oe?(0,$.jsx)(Ht,{parent:oe,onClose:()=>L(null),onSecretRevealed:e=>{L(null),F(e)}}):null,(0,$.jsx)(me,{open:M!==null,onClose:()=>N(null),onConfirm:async()=>{if(!M)return;let e=await a.mutateAsync({keyId:M.id});F(e.secret),g.success(`Rotated ${M.label||M.id}.`),N(null)},title:V.title,message:V.message,confirmLabel:V.confirmLabel,danger:!0}),(0,$.jsx)(me,{open:C!==null,onClose:()=>D(null),onConfirm:async()=>{C&&(await r.mutateAsync(C.id),g.success(`Revoked ${C.label||C.id}.`),D(null))},title:`Revoke API key?`,message:C?`Revoke ${C.label||C.id}? Clients using it will be rejected.${C.keyMode===`share`?` All child keys and enrollment links will also be revoked.`:``}`:`Revoke this API key?`,confirmLabel:`Revoke`,danger:!0}),(0,$.jsx)(me,{open:p,onClose:()=>m(!1),onConfirm:async()=>{H(f)},title:f?`Enable Invoke?`:`Disable Invoke?`,message:f?`Allow this tenant's API keys to invoke /v1/* routes again. Traffic resumes immediately.`:`Disable invocation for every API key in this tenant? All /v1/* requests will be refused with 503, and nothing upstream is dialed. No keys, accounts, or models are deleted — the dashboard stays reachable so you can re-enable.`,confirmLabel:f?`Enable Invoke`:`Disable Invoke`,danger:!f}),(0,$.jsx)(kt,{secret:P,onClose:()=>F(null)}),ne?(0,$.jsx)(Wt,{keys:fe,onClose:()=>re(!1)}):null,(0,$.jsx)(k,{open:O!==null,onClose:()=>ae(null),title:`Ban reason`,size:`sm`,footer:(0,$.jsx)(h,{variant:`secondary`,size:`sm`,onClick:()=>ae(null),children:`Close`}),children:(0,$.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,$.jsxs)(`p`,{className:`text-caption text-text-secondary`,children:[O?.label||`API key`,` was banned.`]}),(0,$.jsx)(`div`,{className:`rounded-control border border-warning-line bg-surface-2 px-4 py-5 text-caption text-text-primary`,children:O?.banReason??`No reason recorded.`})]})})]})}var Kt=[{value:`lite`,label:`Lite`},{value:`full`,label:`Full`},{value:`ultra`,label:`Ultra`}],qt={lite:`Lite`,full:`Full`,ultra:`Ultra`};function Jt({id:e,label:t,description:n,icon:r,enabled:i,strength:a,strengthSelectId:o,onToggle:s,onStrength:c}){return(0,$.jsx)(`div`,{className:`rounded-control border border-inner-border bg-surface-2 p-5`,children:(0,$.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[(0,$.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,$.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2.5`,children:[(0,$.jsx)(`label`,{htmlFor:e,children:(0,$.jsxs)(Oe,{gap:`6px`,className:`text-body font-semibold`,children:[r,t]})}),(0,$.jsx)(q,{tone:i?`ok`:`default`,dot:!0,children:i?`Active · ${qt[a]??a}`:`Off`})]}),(0,$.jsx)(`p`,{className:`mt-2 text-badge leading-normal text-text-tertiary`,children:n})]}),(0,$.jsxs)(Oe,{gap:`8px`,className:`shrink-0 items-center`,children:[(0,$.jsx)(Ee,{id:o,"aria-label":`${t} strength`,value:a,onValueChange:c,options:Kt}),(0,$.jsx)(K,{id:e,"aria-label":`Enable ${t}`,checked:i,onChange:s})]})]})})}function Yt(){let e=se(),t=I(),n=e.data;if(e.isPending)return(0,$.jsx)(T,{label:`Loading compression settings…`});if(e.isError||!n)return(0,$.jsx)(w,{message:z(e.error,`Failed to load compression settings`),onRetry:()=>void e.refetch()});let r=n.rtkPruneEnabled,a=n.ponyTailEnabled;return(0,$.jsxs)(xe,{children:[(0,$.jsx)(W,{title:`Compression`,subtitle:`Shrink requests before they reach the provider`,icon:(0,$.jsx)(c,{size:16})}),(0,$.jsx)(U,{children:(0,$.jsxs)(Z,{gap:`14px`,children:[r||a?(0,$.jsx)(Xe,{tone:`warning`,surface:`raised`,live:`status`,children:(0,$.jsxs)(`span`,{className:`flex items-start gap-3`,children:[(0,$.jsx)(v,{size:14,className:`mt-0.5 shrink-0`,"aria-hidden":`true`}),(0,$.jsx)(`span`,{children:`Your AI may produce degraded quality while compression is active: it sees a shortened history and a minimal-code directive, so fewer tokens but a chance of missing detail. Turn it off if answers get worse.`})]})}):null,(0,$.jsx)(Jt,{id:`compression-rtk`,label:`Prune tool output (RTK)`,description:`Compact bulky tool results (diffs, grep dumps, listings) in the message history so a long conversation stops re-sending megabytes of raw output. Higher strength compresses more aggressively.`,icon:(0,$.jsx)(at,{size:16,className:`shrink-0 text-text-secondary`}),enabled:r,strength:n.rtkPruneLevel,strengthSelectId:`compression-rtk-level`,onToggle:e=>t.mutate({rtkPruneEnabled:e},{onError:e=>g.error(z(e,`Could not update RTK prune.`))}),onStrength:e=>t.mutate({rtkPruneLevel:e===`lite`||e===`full`||e===`ultra`?e:`full`},{onError:e=>g.error(z(e,`Could not update RTK strength.`))})}),(0,$.jsx)(Jt,{id:`compression-ponytail`,label:`PonyTail (system directive)`,description:`Appends a minimal-code directive to the system content, biasing the model toward the smallest working change. Higher strength pushes harder toward deletion over addition.`,icon:(0,$.jsx)(i,{size:16,className:`shrink-0 text-text-secondary`}),enabled:a,strength:n.ponyTailLevel,strengthSelectId:`compression-ponytail-level`,onToggle:e=>t.mutate({ponyTailEnabled:e},{onError:e=>g.error(z(e,`Could not update PonyTail.`))}),onStrength:e=>t.mutate({ponyTailLevel:e===`lite`||e===`full`||e===`ultra`?e:`full`},{onError:e=>g.error(z(e,`Could not update PonyTail strength.`))})})]})})]})}function Xt(){return ue({queryKey:V.systemPrompt.config,queryFn:e=>B(`/system-prompt`,{signal:R(e)}),...fe,staleTime:pe.effectivelyImmutable})}function Zt(){let e=L();return H({mutationFn:e=>B(`/system-prompt`,{method:`PUT`,body:JSON.stringify(e)}),onSuccess:async()=>{await e.invalidateQueries({queryKey:V.systemPrompt.config})}})}var Qt=new Set([`cb`,`cbcn`,`workbuddy`]);function $t(e){return Qt.has(e)}var en={global:null,providers:{},models:{}};function tn(e,t){return`${e}::${t}`}var nn=[{value:`append`,label:`Append`},{value:`override`,label:`Override`}],rn=`.txt,.json,text/plain,application/json`;function an(e,t){return{enabled:!0,mode:t,text:e}}function on({id:e,label:t,value:n,options:r,placeholder:i=`Select…`,onValueChange:a}){let[o,s]=(0,Q.useState)(!1),[c,l]=(0,Q.useState)(``),u=(0,Q.useRef)(null),d=r.find(e=>e.value===n),f=c.trim().toLowerCase(),p=f===``?r:r.filter(e=>e.label.toLowerCase().includes(f));return(0,Q.useEffect)(()=>{if(!o)return;let e=e=>{u.current&&!u.current.contains(e.target)&&s(!1)},t=e=>{e.key===`Escape`&&s(!1)};return document.addEventListener(`pointerdown`,e),document.addEventListener(`keydown`,t),()=>{document.removeEventListener(`pointerdown`,e),document.removeEventListener(`keydown`,t)}},[o]),(0,$.jsxs)(`div`,{ref:u,className:`relative`,children:[t?(0,$.jsx)(`label`,{htmlFor:e,className:`form-label mb-3 flex items-center justify-between text-caption font-semibold text-text-primary`,children:(0,$.jsx)(`span`,{children:t})}):null,(0,$.jsxs)(`button`,{type:`button`,id:e,className:`radix-select-trigger inline-flex h-18 w-full items-center justify-between gap-4 rounded-control border border-inner-border bg-surface-2 px-6 text-body font-sans text-text-primary text-left cursor-pointer transition-[border-color,background-color] duration-150 ease-spring hover:border-border-strong focus-visible:outline-2 focus-visible:outline-focus-ring focus-visible:outline-offset-1`,"aria-haspopup":`listbox`,"aria-expanded":o,onClick:()=>s(e=>!e),children:[(0,$.jsx)(`span`,{className:`truncate`,children:d?.label??i}),(0,$.jsx)(_e,{size:14,className:`shrink-0 text-text-tertiary`,"aria-hidden":`true`})]}),o?(0,$.jsxs)(`div`,{className:`absolute z-toast mt-2 w-full overflow-hidden rounded-card border border-border-strong bg-popover-bg p-2.5 shadow-popout backdrop-blur-xl box-border`,children:[(0,$.jsx)(`input`,{autoFocus:!0,type:`search`,value:c,onChange:e=>l(e.target.value),placeholder:`Search providers…`,"aria-label":`Search providers`,className:`form-input mb-2 w-full rounded-control border border-inner-border bg-surface-2 px-5 py-3 text-body text-text-primary outline-none transition-[border-color,box-shadow] duration-(--dur-micro) ease-spring focus:border-accent focus:shadow-focus`}),(0,$.jsx)(`ul`,{role:`listbox`,className:`max-h-112 overflow-y-auto`,children:p.length===0?(0,$.jsx)(`li`,{className:`px-5 py-4 text-badge text-text-tertiary`,children:`No matching providers`}):p.map(e=>(0,$.jsxs)(`li`,{role:`option`,"aria-selected":e.value===n,className:`flex cursor-pointer items-center justify-between gap-4 rounded-control px-5 py-4 text-caption font-medium text-text-primary transition-colors duration-150 select-none hover:bg-surface-hover`,onClick:()=>{a(e.value),s(!1),l(``)},children:[(0,$.jsx)(`span`,{className:`truncate`,children:e.label}),e.value===n?(0,$.jsx)(m,{size:14,className:`shrink-0 text-accent`}):null]},e.value))})]}):null]})}function sn({id:e,value:t,onChange:n,rows:r=4}){let i=(0,Q.useRef)(null),[a,o]=(0,Q.useState)(null),s=async e=>{if(e)try{let r=await e.text();n({...t,text:r,enabled:!0}),o(null)}catch{o(`Could not read that file.`)}};return(0,$.jsxs)(`div`,{className:`mt-3`,children:[(0,$.jsxs)(`div`,{className:`mb-3 flex items-center gap-3`,children:[(0,$.jsx)(Ee,{"aria-label":`Injection mode`,value:t.mode,onValueChange:e=>n({...t,mode:e}),options:nn,size:`sm`}),(0,$.jsxs)(`span`,{className:`ml-auto text-badge tabular-nums text-text-tertiary`,children:[t.text.length.toLocaleString(),` chars · 5 MB cap`]})]}),(0,$.jsx)(Y,{id:e,rows:r,value:t.text,onChange:e=>n({...t,text:e.target.value}),placeholder:`Injected system prompt…`}),(0,$.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-3`,children:[(0,$.jsx)(h,{variant:`secondary`,size:`sm`,icon:(0,$.jsx)(et,{size:13}),onClick:()=>i.current?.click(),children:`Import .txt/.json`}),(0,$.jsx)(`input`,{ref:i,type:`file`,accept:rn,className:`hidden`,"aria-hidden":`true`,tabIndex:-1,onChange:e=>{s(e.target.files?.[0]),e.target.value=``}}),a?(0,$.jsx)(`p`,{className:`text-badge text-red`,role:`alert`,children:a}):null]})]})}function cn({value:e,onChange:t}){let n=e!==null;return(0,$.jsxs)(`div`,{className:`rounded-control border border-inner-border bg-surface-2 p-5`,children:[(0,$.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[(0,$.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,$.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2.5`,children:[(0,$.jsx)(`p`,{className:`text-body font-semibold`,children:`Global injection`}),(0,$.jsx)(q,{tone:n&&e?.enabled?`ok`:`default`,dot:!0,children:n&&e?.enabled?`Active`:`Off`})]}),(0,$.jsx)(`p`,{className:`mt-1 text-badge leading-normal text-text-tertiary`,children:`Applied to every request regardless of provider or model.`})]}),(0,$.jsx)(K,{id:`isp-global`,checked:n&&e?.enabled===!0,onChange:n=>t(n?an(e?.text??``,e?.mode??`append`):null),"aria-label":`Enable global injection`,className:`shrink-0`})]}),n&&e?(0,$.jsx)(sn,{id:`isp-global-prompt`,value:e,onChange:t}):null]})}function ln({provider:e,entry:t,globalPrompt:n,onChange:r}){let[i,a]=(0,Q.useState)(!1),o=e.label??e.displayName,s=t===void 0||t.followGlobal,c=$t(e.providerId),l=t?.setting,u=!s&&l!==void 0,d=u&&l.enabled===!0,f=s&&n!==null&&n.enabled;return(0,$.jsxs)(`div`,{className:`rounded-control border p-5 ${d?`border-inner-border bg-green-soft/40`:`border-inner-border bg-surface-2`}`,children:[(0,$.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[(0,$.jsx)(`div`,{className:`min-w-0 flex-1`,children:(0,$.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,$.jsx)(X,{icon:e.providerId,name:e.displayName,size:28}),(0,$.jsxs)(`div`,{className:`min-w-0`,children:[(0,$.jsx)(`p`,{className:`truncate text-body font-semibold text-text-primary`,children:o}),(0,$.jsx)(`p`,{className:`truncate text-badge text-text-tertiary`,children:e.providerId})]})]})}),(0,$.jsxs)(`div`,{className:`flex shrink-0 flex-wrap items-center justify-end gap-2`,children:[d?(0,$.jsx)(q,{tone:`ok`,dot:!0,children:`Active`}):u?(0,$.jsx)(q,{tone:`warn`,dot:!0,children:`Custom off`}):f?(0,$.jsx)(q,{tone:`info`,dot:!0,children:`Following global`}):null,(0,$.jsx)(h,{variant:`secondary`,size:`sm`,icon:(0,$.jsx)(P,{size:13}),onClick:()=>a(!0),children:`Setup`})]})]}),(0,$.jsxs)(`div`,{className:`mt-3 flex items-center justify-between gap-3`,children:[s?(0,$.jsx)(`p`,{className:`text-badge leading-normal text-text-tertiary`,children:n!==null&&n.enabled?`Following global${n.mode===`override`?` (override)`:``}.`:`Following global — no global prompt configured.`}):l?.enabled?(0,$.jsx)(`p`,{className:`line-clamp-2 flex-1 whitespace-pre-wrap break-words text-badge leading-normal text-text-secondary`,children:l.text}):(0,$.jsx)(`p`,{className:`text-badge leading-normal text-text-tertiary`,children:`Custom — no prompt set yet.`}),c?(0,$.jsx)(q,{tone:`info`,title:`This provider validates its fixed system prompt; your text is appended after it inside gateway markers.`,children:`Wrapped`}):null]}),(0,$.jsx)(k,{open:i,onClose:()=>a(!1),title:`Setup — ${o}`,size:`md`,footer:(0,$.jsx)(h,{variant:`secondary`,onClick:()=>a(!1),children:`Close`}),children:(0,$.jsxs)(Z,{gap:`14px`,children:[(0,$.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,$.jsxs)(`div`,{children:[(0,$.jsx)(`p`,{className:`text-body font-semibold`,children:`Custom prompt`}),(0,$.jsx)(`p`,{className:`text-badge leading-normal text-text-tertiary`,children:c?`Your text is appended after this provider's fixed identity prompt, wrapped in gateway markers. Override is not available.`:`Replaces or extends the caller's system content for this provider.`})]}),(0,$.jsx)(K,{id:`isp-provider-${e.providerId}-custom`,checked:!s,onChange:e=>r(e?{followGlobal:!1,setting:l??{enabled:!0,mode:`append`,text:``}}:void 0),"aria-label":`Use a custom prompt for this provider`})]}),!s&&l?(0,$.jsx)(sn,{id:`isp-provider-${e.providerId}-prompt`,value:l,onChange:e=>r({followGlobal:!1,setting:e}),rows:6}):null]})})]})}function un({providerId:e,modelId:t,route:n,value:r,onChange:i}){let a=r!==void 0&&r.enabled,o=tn(e,t);return(0,$.jsxs)(`div`,{className:`rounded-control border p-4 ${a?`border-inner-border bg-green-soft/40`:`border-inner-border bg-surface-2`}`,children:[(0,$.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,$.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,$.jsx)(`p`,{className:`truncate text-caption font-semibold text-text-primary`,children:t}),(0,$.jsx)(`p`,{className:`truncate text-badge text-text-tertiary`,children:n})]}),(0,$.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2`,children:[a?(0,$.jsx)(q,{tone:`ok`,dot:!0,children:`Active`}):null,(0,$.jsx)(K,{id:`isp-model-${o}`,checked:a,onChange:e=>i(e?r??an(``,`append`):void 0),"aria-label":`Enable injection for ${t}`})]})]}),r!==void 0&&r.enabled?(0,$.jsx)(sn,{id:`isp-model-${o}-prompt`,value:r,onChange:i,rows:3}):null]})}function dn({open:e,onClose:t,state:n,onSave:r}){let[i,a]=(0,Q.useState)(n),o=(0,Q.useRef)(!1);(0,Q.useEffect)(()=>{e&&!o.current&&a(n),o.current=e},[e,n]);let s=be(),c=s.data??[],[l,u]=(0,Q.useState)(``),d=l.trim().toLowerCase(),f=d===``?c:c.filter(e=>`${e.label??e.displayName} ${e.providerId}`.toLowerCase().includes(d)),[p,m]=(0,Q.useState)(``),g=ve(p||void 0),_=g.data??[];(0,Q.useEffect)(()=>{p===``&&c.length>0&&m(c[0].providerId)},[c,p]);let v=e=>a(t=>({...t,global:e})),y=(e,t)=>a(n=>{let r={...n.providers};return t===void 0?delete r[e]:r[e]=t,{...n,providers:r}}),ee=(e,t,n)=>a(r=>{let i={...r.models},a=tn(e,t);return n===void 0?delete i[a]:i[a]=n,{...r,models:i}}),b=c.map(e=>({value:e.providerId,label:e.label??e.displayName}));return(0,$.jsx)(k,{open:e,onClose:t,title:`Inject System Prompt`,size:`lg`,footer:(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(h,{variant:`secondary`,onClick:t,children:`Cancel`}),(0,$.jsx)(h,{variant:`primary`,onClick:()=>{r(i),t()},children:`Save changes`})]}),children:(0,$.jsxs)(Z,{gap:`20px`,children:[(0,$.jsxs)(`section`,{children:[(0,$.jsxs)(`h4`,{className:`flex items-center gap-2.5 text-caption font-semibold text-text-primary`,children:[(0,$.jsx)(Qe,{size:14,className:`text-text-secondary`,"aria-hidden":`true`}),`Global`]}),(0,$.jsx)(`p`,{className:`mb-3 mt-1 text-badge leading-normal text-text-tertiary`,children:`Applied to every request regardless of provider or model.`}),(0,$.jsx)(cn,{value:i.global,onChange:v})]}),(0,$.jsxs)(`section`,{className:`border-t border-inner-border pt-6`,children:[(0,$.jsxs)(`h4`,{className:`flex items-center gap-2.5 text-caption font-semibold text-text-primary`,children:[(0,$.jsx)(ge,{size:14,className:`text-text-secondary`,"aria-hidden":`true`}),`Per model`]}),(0,$.jsx)(`p`,{className:`mb-3 mt-1 text-badge leading-normal text-text-tertiary`,children:`Only that exact model of a provider gets this prompt; it wins over the provider and global injections.`}),(0,$.jsx)(on,{label:`Provider`,id:`isp-model-provider`,value:p,onValueChange:m,options:b,placeholder:`Select provider…`}),(0,$.jsx)(`div`,{className:`mt-3`,children:p===``?(0,$.jsx)(`p`,{className:`text-badge leading-normal text-text-tertiary`,children:`Select a provider to configure per-model injections.`}):g.isPending?(0,$.jsx)(T,{label:`Loading models…`}):g.isError?(0,$.jsx)(w,{message:`Failed to load models`,onRetry:()=>void g.refetch()}):_.length===0?(0,$.jsx)(`p`,{className:`text-badge leading-normal text-text-tertiary`,children:`No models configured for this provider.`}):(0,$.jsxs)($.Fragment,{children:[(()=>{let e=_.filter(e=>i.models[tn(p,e.modelId)]?.enabled).length;return(0,$.jsx)(`p`,{className:`mb-3 text-badge leading-normal text-text-tertiary`,children:e>0?`${e} of ${_.length} models active for this provider.`:`${_.length} models — none active yet.`})})(),(0,$.jsx)(`div`,{className:`grid grid-cols-3 gap-4 max-medium:grid-cols-2 max-small:grid-cols-1`,children:_.map(e=>(0,$.jsx)(un,{providerId:p,modelId:e.modelId,route:e.route,value:i.models[tn(p,e.modelId)],onChange:t=>ee(p,e.modelId,t)},tn(p,e.modelId)))})]})})]}),(0,$.jsxs)(`section`,{className:`border-t border-inner-border pt-6`,children:[(0,$.jsxs)(`h4`,{className:`flex items-center gap-2.5 text-caption font-semibold text-text-primary`,children:[(0,$.jsx)(D,{size:14,className:`text-text-secondary`,"aria-hidden":`true`}),`Per provider`]}),(0,$.jsx)(`p`,{className:`mb-3 mt-1 text-badge leading-normal text-text-tertiary`,children:`Follow the global prompt, or carry a custom one — models under a custom provider can still override per-model.`}),s.isPending?(0,$.jsx)(T,{label:`Loading providers…`}):s.isError?(0,$.jsx)(w,{message:`Failed to load providers`,onRetry:()=>void s.refetch()}):c.length===0?(0,$.jsx)(`p`,{className:`text-badge leading-normal text-text-tertiary`,children:`No providers configured yet.`}):(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`input`,{type:`search`,value:l,onChange:e=>u(e.target.value),placeholder:`Search providers…`,"aria-label":`Search providers`,className:`form-input w-full rounded-control border border-inner-border bg-surface-2 px-6 py-4 text-body text-text-primary outline-none transition-[border-color,box-shadow] duration-(--dur-micro) ease-spring focus:border-accent focus:shadow-focus`}),f.length===0?(0,$.jsxs)(`p`,{className:`mt-4 text-badge leading-normal text-text-tertiary`,children:[`No providers match “`,l.trim(),`”.`]}):(0,$.jsx)(`div`,{className:`mt-4 grid grid-cols-3 gap-4 max-medium:grid-cols-2 max-small:grid-cols-1`,children:f.map(e=>(0,$.jsx)(ln,{provider:e,entry:i.providers[e.providerId],globalPrompt:i.global,onChange:t=>y(e.providerId,t)},e.providerId))})]})]})]})})}function fn(){let[e,t]=(0,Q.useState)(!1),n=Xt(),r=Zt(),i=n.data??en,a=Object.values(i.providers).filter(e=>!e.followGlobal&&e.setting?.enabled).length,o=Object.values(i.models).filter(e=>e.enabled).length;return(0,$.jsxs)(xe,{children:[(0,$.jsx)(W,{title:`Inject System Prompt`,subtitle:`Append custom system instructions to requests`,icon:(0,$.jsx)($e,{size:16}),action:(0,$.jsx)(ke,{children:(0,$.jsx)(h,{variant:`secondary`,size:`sm`,icon:(0,$.jsx)(P,{size:13}),onClick:()=>t(!0),children:`Open Settings`})})}),(0,$.jsx)(U,{children:(0,$.jsxs)(Z,{gap:`14px`,children:[(0,$.jsx)(`div`,{className:`grid grid-cols-3 gap-4 max-medium:grid-cols-1`,children:(()=>{let e=i.global!==null&&i.global.enabled,t=({icon:e,label:t,value:n,active:r})=>(0,$.jsxs)(`div`,{className:`flex items-center gap-3 rounded-control border px-4 py-3.5 ${r?`border-inner-border bg-green-soft`:`border-inner-border bg-surface-2`}`,children:[(0,$.jsx)(`span`,{className:`shrink-0 ${r?`text-green`:`text-text-tertiary`}`,"aria-hidden":`true`,children:e}),(0,$.jsxs)(`div`,{className:`min-w-0`,children:[(0,$.jsx)(`p`,{className:`text-badge text-text-tertiary`,children:t}),(0,$.jsx)(`p`,{className:`truncate text-body font-semibold ${r?`text-green`:`text-text-tertiary`}`,children:n})]})]});return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(t,{icon:(0,$.jsx)(Qe,{size:16}),label:`Global`,value:e?i.global?.mode===`override`?`Override`:`On`:`Off`,active:e}),(0,$.jsx)(t,{icon:(0,$.jsx)(D,{size:16}),label:`Providers`,value:a>0?`${a} custom`:`Follow global`,active:a>0}),(0,$.jsx)(t,{icon:(0,$.jsx)(ge,{size:16}),label:`Models`,value:o>0?`${o} active`:`None`,active:o>0})]})})()}),n.isError?(0,$.jsx)(Xe,{tone:`danger`,surface:`raised`,live:`status`,children:z(n.error,`Failed to load system prompt settings`)}):null,(0,$.jsx)(`p`,{className:`text-caption leading-normal text-text-secondary`,children:`Add custom system prompts at three levels — global, per provider, or per model — handy for enforcing tone, rules, or context where you need it.`})]})}),(0,$.jsx)(dn,{open:e,onClose:()=>t(!1),state:i,onSave:e=>r.mutate(e,{onSuccess:()=>g.success(`System prompt settings saved`),onError:e=>g.error(z(e,`Could not save system prompt settings`))})})]})}function pn(){return ue({queryKey:V.remoteSupport.status,queryFn:()=>B(`/remote-support/status`)})}function mn(){let e=L();return H({mutationFn:e=>B(`/remote-support/start`,{method:`POST`,body:JSON.stringify({tool:e})}),onSuccess:async()=>{await e.invalidateQueries({queryKey:V.remoteSupport.status})}})}function hn(){let e=L();return H({mutationFn:e=>B(`/remote-support/stop`,{method:`POST`,body:JSON.stringify(e===void 0?{}:{tool:e})}),onSuccess:async()=>{await e.invalidateQueries({queryKey:V.remoteSupport.status})}})}var gn={cloudflared:`cloudflared`,tailscale:`Tailscale`},_n={cloudflared:`Publish a temporary public URL without opening a port.`,tailscale:`Give a helper a private address on your own tailnet.`};function vn({tool:e}){return e===`cloudflared`?(0,$.jsxs)(`svg`,{viewBox:`0 0 24 24`,className:`size-8 shrink-0`,"aria-hidden":`true`,fill:`currentColor`,children:[(0,$.jsx)(`path`,{d:`M16.5 18.4a4.6 4.6 0 0 1-3.2-1.3l-6-5.9a2.4 2.4 0 0 0-3.3 0 2.3 2.3 0 0 0 0 3.3l5.4 5.3a.9.9 0 0 1-1.3 1.3L2.7 15.8a4.1 4.1 0 0 1 0-5.8 4.2 4.2 0 0 1 5.8 0l6 5.9a2.4 2.4 0 0 0 3.3 0 2.3 2.3 0 0 0 0-3.3l-4.2-4.1a.9.9 0 0 1 1.3-1.3l4.2 4.1a4.1 4.1 0 0 1 0 5.8 4.2 4.2 0 0 1-2.6 1.3Z`}),(0,$.jsx)(`path`,{d:`M7.6 18.4a4.5 4.5 0 0 1-3-1.1 5.4 5.4 0 0 1-1.5-3.5 6 6 0 0 1 .4-2 .9.9 0 0 1 1.7.6 4.2 4.2 0 0 0-.3 1.4 3.6 3.6 0 0 0 1 2.3 2.7 2.7 0 0 0 1.8.7.9.9 0 0 1 0 1.8Z`})]}):(0,$.jsxs)(`svg`,{viewBox:`0 0 24 24`,className:`size-8 shrink-0`,"aria-hidden":`true`,fill:`currentColor`,children:[(0,$.jsx)(`path`,{d:`M12 3.2a4.4 4.4 0 0 0-4.4 4.4v2.2H4.6a2.2 2.2 0 0 0 0 4.4h3v2.2a4.4 4.4 0 0 0 8.8 0v-2.2h1.1a3.3 3.3 0 0 0 0-6.6h-1.1V7.6A4.4 4.4 0 0 0 12 3.2Zm0 2.2a2.2 2.2 0 0 1 2.2 2.2v6.6a2.2 2.2 0 0 1-4.4 0V7.6A2.2 2.2 0 0 1 12 5.4Z`}),(0,$.jsx)(`path`,{d:`M6.6 11h4.2v2.2H6.6zM13.2 11h4.2v2.2h-4.2z`})]})}function yn({tool:e}){let t=pn(),n=mn(),r=hn(),{copied:i,copy:a}=Se(2e3),o=t.data?.active===e,s=n.isPending||r.isPending,c=o?t.data?.url??null:null,[l,u]=(0,Q.useState)(null),[f,_]=(0,Q.useState)(o);(0,Q.useEffect)(()=>{!n.isPending&&!r.isPending&&_(o)},[o,n.isPending,r.isPending]);let v=async t=>{_(t);try{let i=t?await n.mutateAsync(e):await r.mutateAsync(e);if(i.blocker!==null&&i.message!==null){u(i.message),g.error(i.message),_(!t);return}u(null),g.success(t?`${gn[e]} started`:`${gn[e]} stopped`)}catch{g.error(`Could not ${t?`start`:`stop`} ${gn[e]}`),_(!t)}},y=async()=>{if(c!==null){if(await a(c)){g.success(`Remote URL copied`,c);return}g.error(`Clipboard unavailable on this origin`)}};return(0,$.jsxs)(`div`,{className:`rounded-control border border-inner-border bg-surface-2 p-5`,children:[(0,$.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,$.jsxs)(`div`,{className:`flex min-w-0 items-center gap-3`,children:[(0,$.jsx)(vn,{tool:e}),(0,$.jsx)(`h3`,{className:`text-caption font-semibold`,children:gn[e]})]}),(0,$.jsx)(K,{checked:f,disabled:s,onChange:e=>void v(e),"aria-label":`Toggle ${gn[e]} remote support`})]}),n.isPending?(0,$.jsxs)(`div`,{className:`mt-3 flex items-center justify-between gap-3`,children:[(0,$.jsxs)(`div`,{className:`flex items-center gap-2 text-badge text-text-secondary`,children:[(0,$.jsx)(p,{size:14,className:`animate-spin`,"aria-hidden":`true`}),(0,$.jsx)(`span`,{className:`animate-pulse`,children:`Waiting for address…`})]}),(0,$.jsx)(h,{variant:`secondary`,size:`sm`,onClick:()=>void v(!1),children:`Cancel`})]}):c===null?l===null?(0,$.jsx)(`p`,{className:`mt-2 text-badge leading-normal text-text-tertiary`,children:_n[e]}):(0,$.jsxs)(`div`,{className:`mt-2 rounded-control border border-warning/30 bg-warning/10 p-3 text-badge leading-normal text-text-secondary`,children:[(0,$.jsx)(`p`,{className:`font-medium text-warning`,children:`Setup needed`}),(0,$.jsx)(`p`,{className:`mt-1 whitespace-pre-wrap break-words`,children:l}),(()=>{let e=l.match(/https:\/\/login\.tailscale\.com\/f\/serve\?[^\s]+/);return e?(0,$.jsx)(`a`,{href:e[0],target:`_blank`,rel:`noreferrer`,className:`mt-2 inline-block font-medium text-accent underline`,children:`Enable Tailscale Serve →`}):null})()]}):(0,$.jsxs)(`div`,{className:`mt-3 flex items-center gap-3`,children:[(0,$.jsx)(`code`,{className:`min-w-0 flex-1 truncate font-mono text-badge text-text-primary`,title:c,children:c}),(0,$.jsxs)(h,{variant:`secondary`,size:`sm`,onClick:()=>void y(),children:[i?(0,$.jsx)(m,{size:14}):(0,$.jsx)(d,{size:14}),i?`Copied`:`Copy`]})]})]})}function bn(){let{copied:e,copy:t}=Se(2e3),n=`${window.location.origin}/v1`,r=async()=>{if(await t(n)){g.success(`Gateway endpoint copied`,n);return}g.error(`Clipboard unavailable on this origin`)};return(0,$.jsxs)(xe,{children:[(0,$.jsx)(W,{title:`Gateway Endpoint`,subtitle:`Universal OpenAI & Anthropic Wire API Endpoint Compatible`,icon:(0,$.jsx)(_,{size:16})}),(0,$.jsx)(U,{children:(0,$.jsxs)(Z,{gap:`10px`,children:[(0,$.jsxs)(`div`,{className:`nested-panel flex items-center gap-4 rounded-control border border-inner-border bg-code-surface px-7 py-5 font-mono text-body font-semibold tabular-nums`,children:[(0,$.jsx)(`code`,{className:`min-w-0 flex-1 truncate`,title:n,children:n}),(0,$.jsx)(h,{variant:`secondary`,size:`sm`,icon:e?(0,$.jsx)(m,{size:13}):(0,$.jsx)(d,{size:13}),"aria-label":`Copy endpoint`,title:`Copy endpoint`,onClick:()=>void r(),className:`shrink-0`,children:e?`Copied`:`Copy`})]}),(0,$.jsxs)(`p`,{className:`text-caption leading-normal text-text-secondary`,children:[`Point any SDK, CLI, or coding agent — OpenCode, Pi, OMP, Kilo, Cline, Droid, and more — at this same-origin base URL.`,(0,$.jsxs)(`span`,{className:`mt-1 block text-text-tertiary`,children:[`For Claude Code, leave off `,(0,$.jsx)(`code`,{className:`font-mono`,children:`/v1`}),` — its CLI appends it automatically.`]})]})]})})]})}function xn(){let e=pn();return(0,$.jsxs)(xe,{children:[(0,$.jsx)(W,{title:`Remote Support`,subtitle:`Reach this gateway from outside the local network`,icon:(0,$.jsx)(nt,{size:16})}),(0,$.jsx)(U,{children:(0,$.jsxs)(Z,{gap:`10px`,children:[(0,$.jsxs)(`div`,{className:`grid grid-cols-2 gap-4 max-medium:grid-cols-1`,children:[(0,$.jsx)(yn,{tool:`cloudflared`}),(0,$.jsx)(yn,{tool:`tailscale`})]}),e.data?.blocker!==null&&e.data?.message!==null?(0,$.jsx)(`p`,{className:`text-badge leading-normal text-red-primary`,children:e.data?.message}):null,(0,$.jsxs)(`p`,{className:`text-caption leading-normal text-text-secondary`,children:[`No matter which tunnel you pick, the gateway sees the tunnel's address as the client. Add the forwarding edge to`,` `,(0,$.jsx)(`code`,{className:`font-mono`,children:`TRUSTED_PROXY_CIDRS`}),` so remote callers aren't recorded as loopback.`]}),(0,$.jsx)(`p`,{className:`text-badge leading-normal text-text-tertiary`,children:`Cartethyia doesn't install cloudflared or Tailscale for you — set up either one yourself. Tunnels run detached from the gateway, so they keep working across restarts.`})]})})]})}function Sn(){return(0,$.jsxs)(Z,{gap:`16px`,children:[(0,$.jsx)(bn,{}),(0,$.jsx)(xn,{}),(0,$.jsx)(Yt,{}),(0,$.jsx)(fn,{}),(0,$.jsx)(Gt,{})]})}export{Sn as default};
@@ -1,5 +0,0 @@
1
- import{n as e,o as t,r as n,t as r}from"./jsx-runtime-CXUMngI_.js";import{i}from"./terminal-0_IjPWTk.js";import{t as a}from"./arrow-left-CpBxkoxI.js";import{n as o,t as s}from"./brain-Cwed_72z.js";import{n as c,t as l}from"./fingerprint-pattern-BWuHtbW4.js";import{D as u,E as d,S as f,T as p,a as m,h,k as g,l as _,s as v,u as y,w as b,y as x}from"./numbers-CEagj6ZZ.js";import{t as S}from"./circle-alert-CntYHV5v.js";import{t as C}from"./circle-check-BU3v_mFW.js";import{l as w,m as T}from"./formatters-D-MTJxMr.js";import{t as E}from"./eye-off-Bk5g2luF.js";import{t as D}from"./eye-C_hawfH4.js";import{t as O}from"./gauge-BbIMy7MB.js";import{t as k}from"./image-BPaouViG.js";import{n as A,r as j,t as M}from"./state-CkfdYWel.js";import{t as N}from"./key-round-UkavsGxp.js";import{t as ee}from"./layers-2-glBbjl.js";import{r as te}from"./use-modal-focus-By7oJoGd.js";import{n as P,t as F}from"./dialog-8fiE6tec.js";import{t as I}from"./pencil-768ysRAr.js";import{t as ne}from"./plus-DIdX_g-x.js";import{t as re}from"./power-off-Yjw9GMJh.js";import{t as ie}from"./refresh-cw-BqJFk4sU.js";import{t as ae}from"./rotate-ccw-CufcqITi.js";import{t as oe}from"./search-JOKus9rb.js";import{t as se}from"./trash-Cppn5c3R.js";import{t as L}from"./wrench-B6E1oEuY.js";import{E as ce,v as le,w as ue}from"./assert-DbRA8EG2.js";import{i as de,l as fe,o as pe,t as R}from"./query-keys-BloKtaXJ.js";import{A as me,B as he,C as ge,D as _e,O as ve,S as ye,T as be,_ as xe,a as Se,b as Ce,c as we,d as z,f as Te,ft as Ee,g as De,h as Oe,k as ke,l as Ae,m as je,nt as Me,o as Ne,p as Pe,r as Fe,rt as Ie,t as Le,tt as Re,u as B,ut as ze,w as Be,x as Ve}from"./entry-CiIQULZD.js";import{n as V,r as He,t as H}from"./card-ibRWU_uT.js";import{n as Ue}from"./download-dRFo5_Wu.js";import{f as U,i as We,l as Ge,n as Ke,r as qe,s as Je,u as Ye}from"./tokens-COzario9.js";import{t as W}from"./switch-SYm237HG.js";import{t as G}from"./badge-D9CS6dZk.js";import{n as K}from"./input-Da2ZViWg.js";import{t as q}from"./select-BIYIBkMU.js";import{t as Xe}from"./ProviderIcon-FB6yS4v1.js";import{t as J}from"./stack-DfgnFDWY.js";import{n as Y,t as Ze}from"./inline-BT0zntEr.js";import{c as Qe,i as $e}from"./quota-Caw7wqci.js";import{t as X}from"./banner-DympBNq4.js";import{t as et}from"./list-row-BycOrrIV.js";import{c as tt,l as nt,m as rt}from"./routing-CO9zCUus.js";import{d as it,l as at,u as ot,y as st}from"./network-9Yj2ZyLo.js";import{o as ct,s as lt,t as ut}from"./HealthEventsModal-DzSWzE_j.js";import{r as dt}from"./privacy-mode-GM8bej85.js";import{n as ft,t as pt}from"./AccountCooldown-Bjo92Qat.js";import{t as mt}from"./use-timeout-BwcBBRrT.js";var ht=e(`cable`,[[`path`,{d:`M17 19a1 1 0 0 1-1-1v-2a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2a1 1 0 0 1-1 1z`,key:`trhst0`}],[`path`,{d:`M17 21v-2`,key:`ds4u3f`}],[`path`,{d:`M19 14V6.5a1 1 0 0 0-7 0v11a1 1 0 0 1-7 0V10`,key:`1mo9zo`}],[`path`,{d:`M21 21v-2`,key:`eo0ou`}],[`path`,{d:`M3 5V3`,key:`1k5hjh`}],[`path`,{d:`M4 10a2 2 0 0 1-2-2V6a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2a2 2 0 0 1-2 2z`,key:`1dd30t`}],[`path`,{d:`M7 5V3`,key:`1t1388`}]]),gt=e(`info`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 16v-4`,key:`1dtifu`}],[`path`,{d:`M12 8h.01`,key:`e9boi3`}]]),_t=e(`lock-open`,[[`rect`,{width:`18`,height:`11`,x:`3`,y:`11`,rx:`2`,ry:`2`,key:`1w4ew1`}],[`path`,{d:`M7 11V7a5 5 0 0 1 9.9-1`,key:`1mm8w8`}]]),vt=e(`package-x`,[[`path`,{d:`M12 22V12`,key:`d0xqtd`}],[`path`,{d:`m16.5 14.5 5 5`,key:`ozpm51`}],[`path`,{d:`m16.5 19.5 5-5`,key:`syf6b9`}],[`path`,{d:`M21 10.5V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.729l7 4a2 2 0 0 0 2 .001l.13-.074`,key:`isw6gs`}],[`path`,{d:`M3.29 7 12 12l8.71-5`,key:`19ckod`}],[`path`,{d:`m7.5 4.27 8.997 5.148`,key:`9yrvtv`}]]),yt=e(`repeat`,[[`path`,{d:`m17 2 4 4-4 4`,key:`nntrym`}],[`path`,{d:`M3 11v-1a4 4 0 0 1 4-4h14`,key:`84bu3i`}],[`path`,{d:`m7 22-4-4 4-4`,key:`1wqhfi`}],[`path`,{d:`M21 13v1a4 4 0 0 1-4 4H3`,key:`1rx37r`}]]),bt=e(`save`,[[`path`,{d:`M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z`,key:`1c8476`}],[`path`,{d:`M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7`,key:`1ydtos`}],[`path`,{d:`M7 3v4a1 1 0 0 0 1 1h7`,key:`t51u73`}]]),xt=e(`shuffle`,[[`path`,{d:`m18 14 4 4-4 4`,key:`10pe0f`}],[`path`,{d:`m18 2 4 4-4 4`,key:`pucp1d`}],[`path`,{d:`M2 18h1.973a4 4 0 0 0 3.3-1.7l5.454-8.6a4 4 0 0 1 3.3-1.7H22`,key:`1ailkh`}],[`path`,{d:`M2 6h1.972a4 4 0 0 1 3.6 2.2`,key:`km57vx`}],[`path`,{d:`M22 18h-6.041a4 4 0 0 1-3.3-1.8l-.359-.45`,key:`os18l9`}]]),St=e(`video`,[[`path`,{d:`m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5`,key:`ftymec`}],[`rect`,{x:`2`,y:`6`,width:`14`,height:`12`,rx:`2`,key:`158x01`}]]),Ct=e(`waypoints`,[[`path`,{d:`m10.586 5.414-5.172 5.172`,key:`4mc350`}],[`path`,{d:`m18.586 13.414-5.172 5.172`,key:`8c96vv`}],[`path`,{d:`M6 12h12`,key:`8npq4p`}],[`circle`,{cx:`12`,cy:`20`,r:`2`,key:`144qzu`}],[`circle`,{cx:`12`,cy:`4`,r:`2`,key:`muu5ef`}],[`circle`,{cx:`20`,cy:`12`,r:`2`,key:`1xzzfp`}],[`circle`,{cx:`4`,cy:`12`,r:`2`,key:`1hvhnz`}]]),wt=[`auto`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`];function Tt(e,t){return t===null?e:`${e}(${t})`}var Z=t(n(),1),Q=r();function Et({to:e,label:t}){let n=Re();return(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>{window.history.length>1?n(-1):n(e)},className:`inline-flex items-center gap-3 text-accent text-caption bg-transparent border-0 p-0 cursor-pointer`,children:[(0,Q.jsx)(a,{size:14,"aria-hidden":`true`}),t]})}function Dt({title:e,description:t,icon:n,badges:r,actions:i,back:a}){return(0,Q.jsxs)(`div`,{className:`flex flex-col gap-5`,children:[a?(0,Q.jsx)(Et,{...a}):null,(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-6 flex-wrap`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-5 min-w-0`,children:[n?(0,Q.jsx)(`div`,{className:`card-header-icon`,children:n}):null,(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-4 flex-wrap`,children:[(0,Q.jsx)(`h1`,{className:`text-lead font-bold`,children:e}),r]}),t?(0,Q.jsx)(`p`,{className:`mt-1 text-badge text-text-tertiary`,children:t}):null]})]}),i?(0,Q.jsx)(`div`,{className:h(`flex items-center gap-4 flex-wrap min-w-0 max-w-full`),children:i}):null]})]})}function Ot(e){return e.requiresAccount&&e.oauthFlows===void 0&&!e.hasAdapterUserAgent}function kt(e,t=600){let n=(0,Z.useRef)(void 0);return(0,Z.useEffect)(()=>()=>clearTimeout(n.current),[]),r=>{clearTimeout(n.current),n.current=setTimeout(()=>e(r),t)}}var At={fallback:`Failover`,roundRobin:`Round robin`},jt=new Set([`inferhub`,`cline`]);function Mt(e,t){let n=nt(e),r=rt(),[i,a]=(0,Z.useState)(`fallback`),[o,s]=(0,Z.useState)(1),[c,l]=(0,Z.useState)(null),[u,d]=(0,Z.useState)(null),[f,p]=(0,Z.useState)(null),[m,h]=(0,Z.useState)(`percent`),[g,_]=(0,Z.useState)(!1),[v,y]=(0,Z.useState)(``);(0,Z.useEffect)(()=>{n.data&&(a(n.data.strategy),s(n.data.rotateCount),l(n.data.maxInflight),d(n.data.maxInflightPerProxy??null),p(n.data.usageFloor),h(n.data.usageFloorUnit),_(n.data.skipProxy),y(n.data.userAgent))},[n.data]);let b=i=>{r.mutate({providerId:e,request:{enabled:!0,strategy:i.strategy,rotateCount:i.rotateCount,maxInflight:i.maxInflight,maxInflightPerProxy:i.maxInflightPerProxy,usageFloor:i.usageFloor,usageFloorUnit:i.usageFloorUnit,skipProxy:i.skipProxy,...t?{userAgent:i.userAgent}:{}}},{onError:()=>{n.data&&(a(n.data.strategy),s(n.data.rotateCount),l(n.data.maxInflight),d(n.data.maxInflightPerProxy??null),p(n.data.usageFloor),h(n.data.usageFloorUnit),_(n.data.skipProxy),y(n.data.userAgent))}})},x=kt(e=>b({strategy:i,rotateCount:o,maxInflight:e,maxInflightPerProxy:u,usageFloor:f,usageFloorUnit:m,skipProxy:g,userAgent:v})),S=kt(e=>b({strategy:i,rotateCount:o,maxInflight:c,maxInflightPerProxy:e,usageFloor:f,usageFloorUnit:m,skipProxy:g,userAgent:v})),C=kt(e=>b({strategy:i,rotateCount:e,maxInflight:c,maxInflightPerProxy:u,usageFloor:f,usageFloorUnit:m,skipProxy:g,userAgent:v})),w=kt(e=>b({strategy:i,rotateCount:o,maxInflight:c,maxInflightPerProxy:u,usageFloor:f,usageFloorUnit:m,skipProxy:g,userAgent:e}));return{strategy:i,maxInflight:c,maxInflightPerProxy:u,usageFloor:f,usageFloorUnit:m,setUsageFloor:(e,t)=>{p(e),h(t),b({strategy:i,rotateCount:o,maxInflight:c,maxInflightPerProxy:u,usageFloor:e,usageFloorUnit:t,skipProxy:g,userAgent:v})},skipProxy:g,userAgent:v,isLoading:n.isPending,isError:n.isError,isSaving:r.isPending,saveFailed:r.isError,refetch:()=>n.refetch(),setMaxInflight:e=>{l(e),x(e)},setMaxInflightPerProxy:e=>{d(e),S(e)},setUserAgent:e=>{y(e),w(e)},setSkipProxy:e=>{_(e),b({strategy:i,rotateCount:o,maxInflight:c,maxInflightPerProxy:u,usageFloor:f,usageFloorUnit:m,skipProxy:e,userAgent:v})},roundRobinEnabled:i===`round_robin`,setRoundRobinEnabled:e=>{let t=e?`round_robin`:`fallback`;a(t),b({strategy:t,rotateCount:o,maxInflight:c,maxInflightPerProxy:u,usageFloor:f,usageFloorUnit:m,skipProxy:g,userAgent:v})},rotateCount:o,setRotateCount:e=>{s(e),C(e)}}}var Nt=[{value:`least_loaded`,label:`Least loaded`},{value:`round_robin`,label:`Round robin`},{value:`random`,label:`Random`}],Pt=50,Ft=100;function It(e,t,n){return[{value:``,label:`None`},{value:`Cartethyia/${e}`,label:`Cartethyia ${e}`},{value:`codex_cli_rs/${t}`,label:`Codex`},{value:`claude-cli/${n} (external, cli)`,label:`Claude Code`}]}function Lt({children:e,action:t}){return(0,Q.jsx)(et,{actions:t,children:e})}function Rt({providerId:e,clientVersion:t,routeIdentityVersions:n,userAgentEditable:r}){let i=Mt(e,r),a=it(),o=st(),[s,c]=(0,Z.useState)(!1),[u,d]=(0,Z.useState)(!1),f=jt.has(e),p=It(Le,n.codex,n.claude),m=p.some(e=>e.value===i.userAgent)?p:[...p,{value:i.userAgent,label:`Custom`}];if(i.isLoading)return(0,Q.jsx)(j,{label:`Loading routing...`});if(i.isError)return(0,Q.jsx)(A,{message:`Failed to load routing`,onRetry:i.refetch});let h=i.roundRobinEnabled?`${At.roundRobin} · ${i.rotateCount} account${i.rotateCount===1?``:`s`} per rotation`:At.fallback,g=a.data,y=Nt.find(e=>e.value===g?.strategy),b=g===void 0?`…`:i.skipProxy?`Direct — proxy pools bypassed`:y?g.strategy===`round_robin`?`${y.label} · ${g.rotateCount} per rotation`:y.label:`Unset`,x=i.isSaving?`Saving...`:i.saveFailed?`Save failed — reverted to last saved value`:`Per-account and per-pool routing`,S=i.maxInflight===null,C=S?51:Math.min(51,Math.max(1,i.maxInflight)),w=S?`∞`:String(i.maxInflight),T=i.maxInflightPerProxy===null,E=T?51:Math.min(51,Math.max(1,i.maxInflightPerProxy)),D=T?`∞`:String(i.maxInflightPerProxy),k=i.skipProxy,M=e=>{i.setRotateCount(Math.min(1e3,Math.max(1,i.rotateCount+e)))},N=e=>{if(e===i.userAgent)return;i.setUserAgent(e);let t=m.find(t=>t.value===e)?.label??e;v.success(`Client identity updated`,t)},te=e=>{e!==g?.strategy&&o.mutate({strategy:e})},I=e=>{g&&o.mutate({rotateCount:Math.min(1e3,Math.max(1,g.rotateCount+e))})},re=t?`${t.client} ${t.version}`:`Provider default`;return(0,Q.jsxs)(H,{children:[(0,Q.jsx)(He,{title:`Routing Strategy`,subtitle:x,icon:(0,Q.jsx)(ee,{size:16})}),(0,Q.jsx)(V,{children:(0,Q.jsxs)(`div`,{className:`grid gap-5 w-full min-w-0`,children:[(0,Q.jsxs)(`div`,{className:`grid gap-3`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-4 border-b border-inner-border pb-3`,children:[(0,Q.jsx)(`span`,{className:`text-micro font-bold uppercase tracking-label text-text-tertiary`,children:`Provider accounts`}),(0,Q.jsxs)(`span`,{className:`inline-flex items-center gap-2 text-badge text-text-secondary`,children:[(0,Q.jsx)(`span`,{className:`status-indicator-dot${i.roundRobinEnabled?` bg-accent`:` bg-text-tertiary`}`,"aria-hidden":`true`}),h]})]}),(0,Q.jsx)(Lt,{action:(0,Q.jsxs)(Q.Fragment,{children:[i.roundRobinEnabled?(0,Q.jsxs)(`div`,{role:`group`,"aria-label":`Accounts per rotation`,className:`inline-flex items-center gap-1 rounded-control border border-inner-border bg-surface-1 p-1`,children:[(0,Q.jsx)(`span`,{className:`px-2 text-badge text-text-secondary`,children:`Accounts/rotation`}),(0,Q.jsx)(_,{variant:`ghost`,size:`icon`,className:`size-9 rounded-tiny`,"aria-label":`Decrease accounts per rotation`,disabled:i.rotateCount<=1,icon:(0,Q.jsx)(P,{size:14}),onClick:()=>M(-1)}),(0,Q.jsx)(`output`,{className:`min-w-8 text-center text-body font-semibold tabular-nums`,"aria-live":`polite`,children:i.rotateCount}),(0,Q.jsx)(_,{variant:`ghost`,size:`icon`,className:`size-9 rounded-tiny`,"aria-label":`Increase accounts per rotation`,disabled:i.rotateCount>=1e3,icon:(0,Q.jsx)(ne,{size:14}),onClick:()=>M(1)})]}):null,(0,Q.jsx)(W,{checked:i.roundRobinEnabled,onChange:i.setRoundRobinEnabled,id:`routing-round-robin`})]}),children:(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsx)(`label`,{htmlFor:`routing-round-robin`,children:(0,Q.jsxs)(Y,{gap:`6px`,className:`text-body font-semibold`,children:[(0,Q.jsx)(yt,{size:15,"aria-hidden":`true`,className:`shrink-0 ${i.roundRobinEnabled?`text-accent`:`text-text-tertiary`}`}),`Rotate accounts`]})}),(0,Q.jsx)(`div`,{className:`mt-1 text-badge text-text-tertiary`,children:`Off uses priority order with failover. On rotates requests across this provider's accounts.`})]})}),(0,Q.jsx)(Lt,{action:(0,Q.jsx)(W,{checked:i.skipProxy,onChange:i.setSkipProxy,id:`routing-skip-proxy`}),children:(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsx)(`label`,{htmlFor:`routing-skip-proxy`,children:(0,Q.jsxs)(Y,{gap:`6px`,className:`text-body font-semibold`,children:[(0,Q.jsx)(ht,{size:15,"aria-hidden":`true`,className:`shrink-0 ${i.skipProxy?`text-accent`:`text-text-tertiary`}`}),`Always direct`]})}),(0,Q.jsx)(`div`,{className:`mt-1 text-badge text-text-tertiary`,children:`Bypass automatic proxy-pool routing for this provider and always dial direct`})]})})]}),(0,Q.jsxs)(`div`,{className:`grid gap-3`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-4 border-b border-inner-border pb-3`,children:[(0,Q.jsx)(`span`,{className:`text-micro font-bold uppercase tracking-label text-text-tertiary`,children:`Proxy pools`}),(0,Q.jsxs)(`span`,{className:`inline-flex items-center gap-2 text-badge text-text-secondary`,children:[(0,Q.jsx)(`span`,{className:`status-indicator-dot${i.skipProxy?` bg-text-tertiary`:` bg-accent`}`,"aria-hidden":`true`}),b]}),(0,Q.jsx)(_,{variant:`ghost`,size:`sm`,className:`shrink-0 -my-1`,"aria-label":`How pool routing works`,onClick:()=>d(!0),children:`How it works`})]}),(0,Q.jsx)(Lt,{action:(0,Q.jsxs)(Y,{gap:`8px`,align:`center`,children:[g?.strategy===`round_robin`&&!i.skipProxy?(0,Q.jsxs)(`div`,{role:`group`,"aria-label":`Pools per rotation`,className:`inline-flex items-center gap-1 rounded-control border border-inner-border bg-surface-1 p-1`,children:[(0,Q.jsx)(`span`,{className:`px-2 text-badge text-text-secondary`,children:`Pools/rotation`}),(0,Q.jsx)(_,{variant:`ghost`,size:`icon`,className:`size-9 rounded-tiny`,"aria-label":`Decrease pools per rotation`,disabled:o.isPending||g.rotateCount<=1,icon:(0,Q.jsx)(P,{size:14}),onClick:()=>I(-1)}),(0,Q.jsx)(`output`,{className:`min-w-8 text-center text-body font-semibold tabular-nums`,"aria-live":`polite`,children:g.rotateCount}),(0,Q.jsx)(_,{variant:`ghost`,size:`icon`,className:`size-9 rounded-tiny`,"aria-label":`Increase pools per rotation`,disabled:o.isPending||g.rotateCount>=1e3,icon:(0,Q.jsx)(ne,{size:14}),onClick:()=>I(1)})]}):null,(0,Q.jsx)(q,{id:`routing-pool-strategy`,"aria-label":`Pool selection mode`,value:g?.strategy??``,disabled:i.skipProxy||o.isPending,options:Nt,onValueChange:te})]}),children:(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsx)(`label`,{htmlFor:`routing-pool-strategy`,children:(0,Q.jsxs)(Y,{gap:`6px`,className:`text-body font-semibold`,children:[(0,Q.jsx)(xt,{size:15,"aria-hidden":`true`,className:`shrink-0 ${i.skipProxy?`text-text-tertiary`:`text-accent`}`}),`Pool mode`]})}),(0,Q.jsxs)(`div`,{className:`mt-1 text-badge text-text-tertiary`,children:[`How proxy pools are chosen when this provider dials one.`,i.skipProxy?` Disabled while “Always direct” is on.`:``]})]})})]}),(0,Q.jsxs)(`div`,{className:`routing-controls-grid grid gap-5 min-w-0 w-full`,children:[(0,Q.jsxs)(`div`,{className:`px-6 py-5 rounded-control border border-inner-border bg-surface-2 min-w-0`,children:[(0,Q.jsxs)(Y,{gap:`6px`,className:`text-body font-semibold mb-3`,children:[(0,Q.jsx)(l,{size:15,"aria-hidden":`true`,className:`text-text-tertiary shrink-0`}),`Client identity`]}),r?(0,Q.jsx)(q,{id:`routing-user-agent-preset`,"aria-label":`Client identity`,value:i.userAgent,options:m,onValueChange:N}):(0,Q.jsx)(q,{id:`routing-user-agent-fixed`,"aria-label":`Client identity`,disabled:!0,value:re,options:[{value:re,label:re}]}),(0,Q.jsx)(`div`,{className:`text-badge text-text-tertiary mt-2`,children:r?`None sends the request as-is — whatever the runtime or egress sets, with no identity stamped by the gateway. A chosen value overrides it.`:`Set by the provider. It cannot be changed.`})]}),(0,Q.jsxs)(`div`,{className:`px-6 py-5 rounded-control border border-inner-border bg-surface-2 min-w-0`,children:[(0,Q.jsx)(`label`,{htmlFor:`routing-max-inflight`,className:`form-label`,children:(0,Q.jsxs)(Y,{gap:`6px`,className:`text-body font-semibold`,children:[(0,Q.jsx)(O,{size:15,"aria-hidden":`true`,className:`text-text-tertiary shrink-0`}),`Max inflight / account`]})}),(0,Q.jsxs)(`div`,{className:`text-badge text-text-tertiary mb-3`,children:[`Per-account ceiling, not a provider-wide one: each account enforces its own limit, so a full account spills to the next. One step past `,Pt,` is unlimited.`]}),(0,Q.jsxs)(Y,{gap:`10px`,className:`mt-3`,children:[(0,Q.jsx)(`input`,{id:`routing-max-inflight`,type:`range`,className:`routing-slider flex-1 min-w-0`,"data-unlimited":S?`true`:void 0,min:1,max:51,step:1,value:C,"aria-valuetext":S?`Unlimited`:String(i.maxInflight),onChange:e=>{let t=Number(e.target.value);Number.isFinite(t)&&i.setMaxInflight(t>Pt?null:Math.round(t))},style:{"--slider-pct":`${C/51*100}%`}}),(0,Q.jsx)(`input`,{type:`text`,inputMode:`numeric`,"aria-label":`Max inflight per account`,value:w,onChange:e=>{let t=e.target.value.trim();if(t===``||t===`∞`){i.setMaxInflight(null);return}let n=Number(t);Number.isFinite(n)&&n>=1&&i.setMaxInflight(Math.min(Ft,Math.round(n)))},className:`form-input w-26 shrink-0 px-2 py-3 text-center text-body ${S?`text-status-success`:``}`})]})]})]}),(0,Q.jsxs)(`div`,{className:`px-6 py-5 rounded-control border border-inner-border bg-surface-2 min-w-0${k?` opacity-60`:``}`,children:[(0,Q.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[(0,Q.jsxs)(`label`,{htmlFor:`routing-max-inflight-per-proxy`,className:`min-w-0`,children:[(0,Q.jsxs)(Y,{gap:`6px`,className:`text-body font-semibold`,children:[(0,Q.jsx)(Ct,{size:15,"aria-hidden":`true`,className:`text-text-tertiary shrink-0`}),`Max inflight / proxy`]}),(0,Q.jsx)(`div`,{className:`mt-1 text-badge text-text-tertiary`,children:`Each proxy pool carries at most this many concurrent requests for this provider. Other providers on the same pool are unaffected.`})]}),(0,Q.jsx)(_,{variant:`ghost`,size:`sm`,className:`shrink-0`,"aria-label":`How per-proxy limits work`,onClick:()=>c(!0),children:`How it works`})]}),(0,Q.jsxs)(Y,{gap:`10px`,className:`mt-3`,children:[(0,Q.jsx)(`input`,{id:`routing-max-inflight-per-proxy`,type:`range`,className:`routing-slider flex-1 min-w-0`,"data-unlimited":T?`true`:void 0,min:1,max:51,step:1,disabled:k,value:E,"aria-valuetext":T?`Unlimited`:String(i.maxInflightPerProxy),onChange:e=>{let t=Number(e.target.value);Number.isFinite(t)&&i.setMaxInflightPerProxy(t>Pt?null:Math.round(t))},style:{"--slider-pct":`${E/51*100}%`}}),(0,Q.jsx)(`input`,{type:`text`,inputMode:`numeric`,"aria-label":`Max inflight per proxy`,disabled:k,value:D,onChange:e=>{let t=e.target.value.trim();if(t===``||t===`∞`){i.setMaxInflightPerProxy(null);return}let n=Number(t);Number.isFinite(n)&&n>=1&&i.setMaxInflightPerProxy(Math.min(Ft,Math.round(n)))},className:`form-input w-26 shrink-0 px-2 py-3 text-center text-body ${T?`text-status-success`:``}`})]}),(0,Q.jsx)(`div`,{className:`mt-2 text-badge text-text-tertiary`,children:k?`Always direct is on, so this provider never dials a pool. The limit is kept for when a pool is used again.`:`One step past ${Pt} is unlimited.`})]}),(0,Q.jsx)(F,{open:s,onClose:()=>c(!1),title:`How concurrency limits stack`,size:`md`,children:(0,Q.jsxs)(`div`,{className:`grid gap-4 text-body`,children:[(0,Q.jsx)(`p`,{className:`text-text-secondary`,children:`Three limits apply at once. Each one bounds a different thing; none replaces another.`}),(0,Q.jsxs)(`dl`,{className:`grid gap-3`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`dt`,{className:`font-semibold`,children:`Max inflight / account`}),(0,Q.jsx)(`dd`,{className:`text-badge text-text-tertiary`,children:`One account of this provider, across every proxy. Set here, above.`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`dt`,{className:`font-semibold`,children:`Max inflight / proxy`}),(0,Q.jsxs)(`dd`,{className:`text-badge text-text-tertiary`,children:[`One proxy pool's concurrent requests `,(0,Q.jsx)(`em`,{children:`for this provider`}),`. The same number applies to every pool; each pool counts separately. This is the field above.`]})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`dt`,{className:`font-semibold`,children:`Pool capacity`}),(0,Q.jsx)(`dd`,{className:`text-badge text-text-tertiary`,children:`Everything through one pool, all providers combined. Set on the proxy itself, on the Proxies page.`})]})]}),(0,Q.jsxs)(`p`,{className:`text-badge text-text-tertiary`,children:[`A request must clear all three. When a pool is full for this provider, the request moves to another pool that still has room; it only fails with`,` `,(0,Q.jsx)(`code`,{children:`429`}),` when every pool is full.`]}),(0,Q.jsx)(`p`,{className:`text-badge text-text-tertiary`,children:`Unlimited means no counter is kept for this provider, so the limit costs nothing until you set one.`})]})}),(0,Q.jsx)(F,{open:u,onClose:()=>d(!1),title:`How pool routing works`,size:`md`,children:(0,Q.jsxs)(`div`,{className:`grid gap-4 text-body`,children:[(0,Q.jsx)(`p`,{className:`text-text-secondary`,children:`When a provider dials a proxy pool, the gateway picks the pool with one of three modes. All modes skip pools that are cooling down, full, or disabled — the pool's own gates always apply.`}),(0,Q.jsxs)(`dl`,{className:`grid gap-3`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`dt`,{className:`font-semibold`,children:`Least loaded`}),(0,Q.jsx)(`dd`,{className:`text-badge text-text-tertiary`,children:`Each request goes to the pool with the most headroom (weighted). The default — spreads load and prefers the fastest-available egress.`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`dt`,{className:`font-semibold`,children:`Round robin`}),(0,Q.jsx)(`dd`,{className:`text-badge text-text-tertiary`,children:`Requests rotate across pools in a fixed order, with a set number of successful requests per pool before moving on. Useful for even request counts across pools.`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`dt`,{className:`font-semibold`,children:`Random`}),(0,Q.jsx)(`dd`,{className:`text-badge text-text-tertiary`,children:`Each request picks from the eligible pools at random, so a burst does not gang up on the first pools in the order.`})]})]}),(0,Q.jsx)(`p`,{className:`text-badge text-text-tertiary`,children:`Turning on “Always direct” bypasses pools entirely — this mode has no effect then.`})]})}),f&&(0,Q.jsxs)(Y,{gap:`6px`,align:`flex-start`,className:`mt-1 text-badge text-text-tertiary`,children:[(0,Q.jsx)(gt,{size:12,className:`shrink-0 mt-0.5`}),(0,Q.jsx)(`span`,{children:`This provider doesn't reliably work through a plain HTTP/S proxy — use a SOCKS5 or proxy pool instead if you need to route it.`})]})]})})]})}function zt(e){if(typeof e!=`object`||!e)throw{status:500,code:`invalid_response`,message:`Invalid InferHub summary`};let t=e;return{models:Array.isArray(t.models)?t.models:[],providers:Array.isArray(t.providers)?t.providers:[],pricingConfig:t.pricingConfig??null,meta:t.meta??{fetchedAt:0,ageSeconds:0,stale:!0},error:t.error??null}}function Bt(e=!0){return ue({queryKey:R.inferhub.summary,queryFn:e=>pe(`/inferhub/summary`,{signal:le(e)}).then(zt),enabled:e,...de,staleTime:6e4})}function Vt(e){return e===null?`—`:`$${e.toFixed(4)}`}function Ht(e){return e===null?`—`:`${e}%`}function Ut(e){return e<60?`${e}s ago`:e<3600?`${Math.floor(e/60)}m ago`:`${Math.floor(e/3600)}h ago`}var Wt={provider:`Provider (A–Z)`,availability:`Highest availability`,sustainable:`Sustainable price`,price:`Lowest price`,discount:`Biggest discount`};function Gt(e,t){return(n,r)=>{let i=e(n),a=e(r);return i===null&&a===null?0:i===null?1:a===null?-1:t===`asc`?i-a:a-i}}function Kt(e){switch(e){case`provider`:return(e,t)=>e.family.localeCompare(t.family,void 0,{sensitivity:`base`})||e.prefix.localeCompare(t.prefix);case`availability`:return(e,t)=>t.providersLive-e.providersLive||Gt(e=>e.health.successRatePct,`desc`)(e,t);case`sustainable`:return Gt(e=>e.capacityPriceIn,`asc`);case`price`:return Gt(e=>e.minAskIn,`asc`);case`discount`:return Gt(e=>e.tiersIn[0]?.discountPct??null,`desc`)}}function qt(e){return e===`operational`?`ok`:e===`degraded`?`warn`:e===`major_outage`?`err`:`default`}function Jt(e,t){return e.providers.find(e=>e.prefix===t)}function Yt(e){return e.providersLive>0&&e.routable&&e.minAskIn!==null}function Xt(){let e=Bt(),t=e.data,[n,r]=(0,Z.useState)(!1),[i,a]=(0,Z.useState)(!1),[o,s]=(0,Z.useState)(!0),[c,l]=(0,Z.useState)(`provider`),u=t?.models??[],d=u.filter(Yt),f=(0,Z.useMemo)(()=>{let e=[...i?u:d].sort(Kt(c)),t=new Map;for(let n of e){let e=t.get(n.prefix);e===void 0?t.set(n.prefix,[n]):e.push(n)}return[...t.entries()].map(([e,t])=>({prefix:e,family:t[0]?.family??e,models:t}))},[u,d,i,c]),p=(0,Q.jsxs)(_,{variant:`secondary`,size:`sm`,onClick:()=>void e.refetch(),disabled:e.isFetching,title:`Re-read InferHub market data now`,children:[(0,Q.jsx)(ie,{size:14}),e.isFetching?`Refreshing…`:`Refresh`]});if(t===void 0&&!e.isError)return(0,Q.jsxs)(H,{children:[(0,Q.jsx)(He,{title:`InferHub market`,subtitle:e.isPending?`Reading market data…`:void 0,icon:(0,Q.jsx)(ie,{size:16})}),(0,Q.jsx)(V,{children:e.isError?(0,Q.jsx)(X,{tone:`danger`,surface:`raised`,live:`none`,children:`InferHub market data could not be read.`}):null})]});if(t===void 0)return(0,Q.jsxs)(H,{children:[(0,Q.jsx)(He,{title:`InferHub market`,icon:(0,Q.jsx)(ie,{size:16}),action:p}),(0,Q.jsx)(V,{children:(0,Q.jsx)(X,{tone:`danger`,surface:`raised`,live:`none`,children:`InferHub market data could not be read.`})})]});let m=f,g=m.reduce((e,t)=>e+t.models.length,0),v=u.length-g;return(0,Q.jsxs)(H,{children:[(0,Q.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,Q.jsxs)(`button`,{type:`button`,"aria-expanded":n,"aria-label":n?`Collapse InferHub market`:`Expand InferHub market`,onClick:()=>r(e=>!e),className:`flex min-w-0 flex-1 items-start gap-3 border-0 bg-transparent p-0 text-left text-inherit`,children:[(0,Q.jsx)(Ee,{size:15,"aria-hidden":`true`,className:h(`mt-1 shrink-0 transition-transform`,!n&&`-rotate-90`)}),(0,Q.jsxs)(J,{gap:`1px`,children:[(0,Q.jsx)(`h2`,{className:`text-body font-bold`,children:`InferHub market`}),t.meta.fetchedAt>0?(0,Q.jsxs)(`p`,{className:`mt-1 text-badge text-text-tertiary`,children:[`Updated `,Ut(t.meta.ageSeconds)]}):null]})]}),(0,Q.jsx)(`div`,{className:`flex items-center gap-2`,children:n?p:null})]}),n?(0,Q.jsxs)(V,{children:[(0,Q.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,Q.jsx)(Qt,{onSaved:()=>void e.refetch()}),(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,Q.jsxs)(`label`,{className:`flex items-center gap-2 text-caption text-text-secondary`,children:[`Sort`,(0,Q.jsx)(q,{value:c,onValueChange:e=>l(e),options:Object.keys(Wt).map(e=>({value:e,label:Wt[e]})),"aria-label":`Sort InferHub models`})]}),(0,Q.jsxs)(`label`,{className:`flex items-center gap-2 text-caption text-text-secondary cursor-pointer`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:o,onChange:e=>s(e.target.checked),className:`cursor-pointer`}),`Show availability`]})]})]}),t.error===`no_config_key`?(0,Q.jsxs)(X,{tone:`warning`,surface:`raised`,live:`none`,children:[`No InferHub `,(0,Q.jsx)(`code`,{children:`config_read`}),` key is configured, so the marketplace catalog cannot be read. Add one above.`]}):null,t.error===`upstream_unavailable`?(0,Q.jsxs)(X,{tone:`warning`,surface:`raised`,live:`none`,children:[`InferHub did not answer. Showing the last snapshot that was read`,t.meta.fetchedAt>0?` (${Ut(t.meta.ageSeconds)})`:``,`.`]}):null,t.meta.stale&&t.error===null?(0,Q.jsxs)(X,{tone:`warning`,surface:`raised`,live:`none`,children:[`This snapshot is `,Ut(t.meta.ageSeconds),` — press Refresh for current prices.`]}):null,(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,Q.jsxs)(`p`,{className:`text-micro text-text-tertiary`,children:[g,` of `,u.length,` models`]}),(0,Q.jsxs)(`label`,{className:`flex items-center gap-2 text-caption text-text-secondary cursor-pointer`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:i,onChange:e=>a(e.target.checked),className:`cursor-pointer`}),`Show all`,v>0?(0,Q.jsxs)(`span`,{className:`text-micro text-text-tertiary`,children:[`(includes `,v,` hidden)`]}):null]})]}),m.length===0?(0,Q.jsx)(`p`,{className:`mt-3 text-caption text-text-secondary`,children:`No models to show.`}):(0,Q.jsx)(`div`,{className:`mt-3 flex flex-col gap-3`,children:m.map(e=>(0,Q.jsx)(Zt,{group:e,showUpstreams:o,summary:t},e.prefix))})]}):null]})}function Zt({group:e,showUpstreams:t,summary:n}){let[r,i]=(0,Z.useState)(!0),a=Jt(n,e.prefix),o=a?.familyState??null,s=e.models.find(e=>e.systemPromptNote!==null)?.systemPromptNote??null;return(0,Q.jsxs)(`div`,{className:`rounded-card border border-inner-border bg-surface-2`,children:[(0,Q.jsxs)(`button`,{type:`button`,"aria-expanded":r,"aria-label":`${r?`Collapse`:`Expand`} ${e.family} models`,onClick:()=>i(e=>!e),className:`flex w-full items-center gap-2 border-0 bg-transparent px-3 py-2 text-left text-inherit`,children:[(0,Q.jsx)(Ee,{size:14,"aria-hidden":`true`,className:h(`shrink-0 transition-transform`,!r&&`-rotate-90`)}),(0,Q.jsx)(`span`,{className:`text-caption font-bold`,children:e.family}),(0,Q.jsxs)(`span`,{className:`font-mono text-micro text-text-tertiary`,children:[e.prefix,`/`]}),o===null?null:(0,Q.jsx)(G,{tone:qt(o),dot:!0,children:o.replace(/_/g,` `)}),t&&a!==void 0?(0,Q.jsxs)(`span`,{className:`text-micro text-text-tertiary tabular-nums`,children:[`24h `,Ht(a.availability24hPct),` · 7d`,` `,Ht(a.availability7dPct)]}):null,(0,Q.jsxs)(`span`,{className:`ml-auto text-micro text-text-tertiary`,children:[e.models.length,` model`,e.models.length===1?``:`s`]})]}),r?(0,Q.jsxs)(`div`,{className:`px-3 pb-3`,children:[s===null?null:(0,Q.jsx)(`p`,{className:`mb-2 text-micro text-text-secondary`,children:s}),(0,Q.jsx)(`div`,{className:`overflow-x-auto`,children:(0,Q.jsxs)(`table`,{className:`w-full text-caption`,children:[(0,Q.jsx)(`thead`,{children:(0,Q.jsxs)(`tr`,{className:`text-left text-text-secondary`,children:[(0,Q.jsx)(`th`,{className:`py-1 pr-3`,children:`Model`}),(0,Q.jsx)(`th`,{className:`py-1 pr-3`,children:`Input`}),(0,Q.jsx)(`th`,{className:`py-1 pr-3`,children:`Output`}),(0,Q.jsx)(`th`,{className:`py-1 pr-3`,children:`Discount`}),(0,Q.jsx)(`th`,{className:`py-1 pr-3`,children:`Live`}),(0,Q.jsx)(`th`,{className:`py-1 pr-3`,children:t?`24h`:`Success`})]})}),(0,Q.jsx)(`tbody`,{children:e.models.map(e=>(0,Q.jsxs)(`tr`,{className:`border-t border-inner-border`,children:[(0,Q.jsx)(`td`,{className:`py-1 pr-3 font-mono`,children:e.id}),(0,Q.jsxs)(`td`,{className:`py-1 pr-3 tabular-nums`,children:[Vt(e.minAskIn),e.capacityPriceIn!==null&&e.capacityPriceIn!==e.minAskIn?(0,Q.jsxs)(`div`,{className:`text-micro text-text-secondary`,children:[Vt(e.capacityPriceIn),` sustainable`]}):null]}),(0,Q.jsx)(`td`,{className:`py-1 pr-3 tabular-nums`,children:Vt(e.minAskOut)}),(0,Q.jsx)(`td`,{className:`py-1 pr-3 tabular-nums`,children:e.tiersIn[0]?.discountPct===void 0||e.tiersIn[0]?.discountPct===null?`—`:`−${e.tiersIn[0].discountPct}%`}),(0,Q.jsx)(`td`,{className:`py-1 pr-3 tabular-nums`,children:e.providersLive===0?(0,Q.jsx)(G,{children:`none`}):e.providersLive}),(0,Q.jsx)(`td`,{className:`py-1 pr-3 tabular-nums`,children:Ht(t?a?.availability24hPct??null:e.health.successRatePct)})]},e.id))})]})})]}):null]})}function Qt({onSaved:e}){let[t,n]=(0,Z.useState)(``),[r,i]=(0,Z.useState)(null),[a,o]=(0,Z.useState)(!1),[s,c]=(0,Z.useState)(null),l=async()=>{if(t.trim().length!==0){o(!0),c(null);try{await pe(`/inferhub/key`,{method:`PUT`,body:JSON.stringify({key:t.trim()})}),n(``),i({configured:!0,last4:null}),e()}catch{c(`Could not save the key.`)}finally{o(!1)}}},u=async()=>{o(!0),c(null);try{await pe(`/inferhub/key`,{method:`DELETE`}),i({configured:!1,last4:null}),e()}catch{c(`Could not remove the key.`)}finally{o(!1)}};return(0,Q.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-end gap-2`,children:[(0,Q.jsx)(`div`,{className:`min-w-64 flex-1`,children:(0,Q.jsx)(K,{type:`password`,value:t,onChange:e=>n(e.target.value),placeholder:`sk-airo-… (config_read key)`,"aria-label":`InferHub config_read key`,autoComplete:`off`})}),(0,Q.jsx)(_,{size:`sm`,onClick:()=>void l(),disabled:a||t.trim().length===0,children:a?`Saving…`:`Save key`}),r?.configured?(0,Q.jsx)(_,{size:`sm`,variant:`secondary`,onClick:()=>void u(),disabled:a,children:`Remove`}):null]}),(0,Q.jsxs)(`p`,{className:`text-micro text-text-tertiary`,children:[`Stored encrypted beside the market settings, never in this provider's accounts. Must be a`,` `,(0,Q.jsx)(`code`,{children:`config_read`}),` key — never an inference key.`]}),s===null?null:(0,Q.jsx)(X,{tone:`danger`,surface:`raised`,live:`alert`,children:s})]})}function $t({providerId:e}){let t=Mt(e,!1),n=ct(),r=tt(e),i=(0,Z.useMemo)(()=>tn(n.data?.accounts??[],e),[n.data,e]),a=(0,Z.useRef)(null),o=(0,Z.useMemo)(()=>[...r.data?.values()??[]].reduce((e,t)=>e+t,0),[r.data]);(0,Z.useEffect)(()=>{if(a.current===null){a.current=o;return}a.current!==o&&(a.current=o,n.refetch())},[o,n]);let[s,c]=(0,Z.useState)(`40`),[l,u]=(0,Z.useState)(`percent`),d=t.usageFloor!==null;(0,Z.useEffect)(()=>{t.usageFloor!==null&&c(String(t.usageFloor)),u(t.usageFloorUnit)},[t.usageFloor,t.usageFloorUnit]);let f=Number(s),p=Number.isInteger(f)&&f>=0&&f<=1e6,m=i===null||i.remaining<=0?`text-status-danger`:i.percent<=10?`text-status-warning`:`text-status-success`,h=(e,n)=>{(e===null||p)&&t.setUsageFloor(e,n)};return(0,Q.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,Q.jsxs)(`section`,{className:`usage-floor-panel flex flex-col gap-4 px-5 py-4 border border-inner-border rounded-narrow bg-surface-2`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-3 text-body font-semibold text-text-primary`,children:[(0,Q.jsx)(O,{size:14}),(0,Q.jsx)(`span`,{children:`Usage floor`}),(0,Q.jsx)(`span`,{className:`badge border border-warning-line bg-surface-2 text-micro tracking-label text-status-warning`,children:`BETA`})]}),(0,Q.jsx)(`p`,{className:`mt-0.5 text-badge leading-normal text-text-tertiary`,children:`Per account. Skip an account once its remaining allowance reaches this, and send the request to the next one.`})]}),(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-4`,children:[i!==null&&(0,Q.jsxs)(`div`,{className:`flex min-h-24 min-w-0 flex-[1_1_20rem] flex-col justify-center gap-2 py-2`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-2 gap-y-1 text-micro font-semibold tracking-label uppercase text-text-tertiary`,children:[(0,Q.jsx)(`span`,{children:`Pooled credits`}),(0,Q.jsx)(`span`,{className:`text-text-primary`,children:i.accounts}),(0,Q.jsx)(`span`,{children:i.accounts===1?`active account`:`active accounts`}),i.inactiveAccounts>0?(0,Q.jsxs)(`span`,{className:`badge border border-warning-line text-status-warning normal-case tracking-normal`,title:`Disabled or cooled accounts hold credits this provider cannot route to. Enable or recover them to add their balance.`,children:[i.inactiveAccounts,` inactive`]}):null]}),(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-baseline gap-x-2 gap-y-1 text-caption font-semibold tabular-nums text-text-primary`,title:`Combined allowance across active accounts; the usage floor is evaluated per account`,children:[(0,Q.jsx)(`strong`,{className:`font-bold ${m}`,children:nn(i.remaining)}),(0,Q.jsx)(`span`,{className:`font-medium text-text-secondary`,children:`credits available`}),(0,Q.jsxs)(`span`,{className:`font-medium opacity-75`,children:[`of `,nn(i.total)]}),(0,Q.jsxs)(`span`,{className:`font-bold ${m}`,children:[i.percent,`%`]})]}),(0,Q.jsx)(`p`,{className:`text-micro leading-normal text-text-tertiary`,children:t.usageFloor===null?`Floor off · exhausted quota windows are still skipped`:`Floor ${nn(t.usageFloor)} ${t.usageFloorUnit===`credit`?`credits`:`%`} per account`})]}),i===null&&(0,Q.jsxs)(`p`,{className:`flex min-h-24 min-w-0 flex-[1_1_20rem] flex-col justify-center gap-2 py-2 text-badge leading-normal text-text-tertiary`,children:[(0,Q.jsx)(`span`,{children:`No combined credit balance is available. Separate quota windows are not added together, and exhausted windows are still skipped.`}),(0,Q.jsx)(`span`,{className:`text-micro`,children:t.usageFloor===null?`Floor off · exhausted quota windows are still skipped`:`Floor ${nn(t.usageFloor)} ${t.usageFloorUnit===`credit`?`credits`:`%`} per account`})]}),(0,Q.jsxs)(`div`,{className:`ml-auto flex max-w-full shrink-0 flex-col items-end justify-center gap-2`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center justify-end gap-x-3 gap-y-2`,children:[(0,Q.jsx)(`span`,{className:`text-micro font-semibold tracking-label uppercase text-text-tertiary`,children:`Floor threshold`}),(0,Q.jsxs)(`label`,{className:`flex h-12 max-w-full items-center overflow-hidden rounded-tiny border border-inner-border bg-surface-1 focus-within:border-text-tertiary`,children:[(0,Q.jsx)(`input`,{type:`number`,min:0,max:1e6,value:d?s:``,placeholder:`40`,disabled:!d,"aria-label":`Usage floor amount`,className:`h-full w-24 border-0 bg-transparent px-3 text-right font-mono text-body font-semibold tabular-nums text-text-primary disabled:text-text-tertiary`,onChange:e=>c(e.target.value),onBlur:()=>{d&&h(f,l)}}),(0,Q.jsxs)(`select`,{value:l,disabled:!d,"aria-label":`Usage floor unit`,className:`h-full border-0 border-l border-inner-border bg-hover px-3 text-body font-semibold text-text-secondary disabled:cursor-default disabled:opacity-60`,onChange:e=>{let t=e.target.value===`credit`?`credit`:`percent`;u(t),d&&h(f,t)},children:[(0,Q.jsx)(`option`,{value:`percent`,children:`%`}),(0,Q.jsx)(`option`,{value:`credit`,children:`credits`})]})]}),(0,Q.jsx)(W,{checked:d,label:`Enabled`,"aria-label":`Usage floor`,className:`usage-floor-switch`,onChange:e=>h(e?p?f:40:null,l)})]}),t.saveFailed?(0,Q.jsx)(`p`,{role:`alert`,className:`text-right text-micro leading-normal text-status-danger`,children:`Usage floor save failed. The last saved setting has been restored.`}):null]})]})]}),(0,Q.jsx)(en,{providerId:e})]})}function en({providerId:e}){let{enabled:t,setEnabled:n}=dt(e);return(0,Q.jsxs)(`div`,{className:`flex items-center justify-between flex-wrap gap-6 px-6 py-5 border border-inner-border rounded-control bg-surface-2`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0 flex-auto basis-110`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-3 text-body font-semibold text-text-primary`,children:[(0,Q.jsx)(E,{size:14}),(0,Q.jsx)(`span`,{children:`Mysterious accounts`})]}),(0,Q.jsx)(`p`,{className:`mt-0.5 text-badge leading-normal text-text-tertiary`,children:`Hide this provider's emails and usernames. Stored in this browser only.`})]}),(0,Q.jsx)(`div`,{className:`flex items-center gap-4 shrink-0`,children:(0,Q.jsx)(W,{checked:t,"aria-label":`Mysterious accounts`,onChange:n})})]})}function tn(e,t){let n=0,r=0,i=0,a=0,o=!1;for(let s of e)if(s.provider===t){if(!s.active){a+=1;continue}if(i+=1,s.quota!==null)for(let e of s.quota.windows){if(e.accounting!==`pooled`)continue;let t=typeof e.limit==`number`&&Number.isFinite(e.limit)?e.limit:null;if(t===null)continue;let i=typeof e.remaining==`number`&&Number.isFinite(e.remaining)?e.remaining:typeof e.used==`number`&&Number.isFinite(e.used)?t-e.used:null;i!==null&&(n+=Math.min(t,Math.max(0,i)),r+=t,o=!0)}}return i>0&&o?{accounts:i,inactiveAccounts:a,remaining:n,total:r,percent:r>0?Math.round(n/r*100):0}:null}function nn(e){return e.toLocaleString(void 0,{maximumFractionDigits:1})}function rn({provider:e}){let t=e.credentialUrl,n=e.credentialHint,r=e.operatorNotice;if(!t&&!n&&!r)return null;let i=e.oauthFlows?.browser===!0||e.oauthFlows?.device===!0,a=n??(i?`This provider authorizes through its own login flow; there is no key to paste.`:e.requiresAccount?`Create a credential on the provider site, then add it as an account below.`:`This provider needs no credential.`);return(0,Q.jsx)(H,{density:`compact`,children:(0,Q.jsx)(V,{children:(0,Q.jsxs)(Y,{gap:`12px`,className:`items-center flex-wrap`,children:[(0,Q.jsxs)(`span`,{className:`min-w-110 flex-1 text-caption text-text-secondary`,children:[a,r?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`br`,{}),r]}):null]}),t?(0,Q.jsxs)(`a`,{href:t,target:`_blank`,rel:`noreferrer`,title:t,className:y({size:`sm`,className:`shrink-0 no-underline`}),children:[(0,Q.jsx)(`span`,{className:`btn-icon-wrapper`,"aria-hidden":`true`,children:(0,Q.jsx)(ze,{size:13})}),i?`Sign in`:`Get API Key`]}):null]})})})}function an({provider:e}){let t=ke(),[n,r]=(0,Z.useState)(!1),[i,a]=(0,Z.useState)(e.baseUrl??``);(0,Z.useEffect)(()=>{a(e.baseUrl??``)},[e.providerId,e.baseUrl]);let o=(e.baseUrl??``).replace(/\/+$/,``),s=i.trim().replace(/\/+$/,``),c=s!==o,l=s.length>0&&c&&!t.isPending;return(0,Q.jsxs)(H,{children:[(0,Q.jsx)(He,{title:`Custom Provider Endpoint`,subtitle:`Upstream base URL`,icon:(0,Q.jsx)(b,{size:16})}),(0,Q.jsx)(V,{children:(0,Q.jsxs)(J,{gap:`12px`,children:[n?(0,Q.jsx)(K,{label:`Base URL`,id:`custom-provider-base-url`,type:`url`,value:i,onChange:e=>a(e.target.value),placeholder:`https://api.example.com/v1`,autoFocus:!0}):(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsx)(`div`,{className:`text-micro font-semibold uppercase tracking-label text-text-tertiary`,children:`Base URL`}),(0,Q.jsx)(`code`,{className:`mt-1 block min-w-0 break-all font-mono text-caption text-text-primary`,children:e.baseUrl??`Not configured`})]}),(0,Q.jsxs)(Y,{gap:`8px`,className:`w-full flex-wrap`,justify:`end`,children:[n?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(_,{size:`sm`,variant:`primary`,icon:(0,Q.jsx)(bt,{size:13}),disabled:!l,loading:t.isPending,onClick:()=>{l&&t.mutate({providerId:e.providerId,request:{baseUrl:s}},{onSuccess:()=>r(!1)})},children:`Save endpoint`}),(0,Q.jsx)(_,{size:`sm`,variant:`secondary`,icon:(0,Q.jsx)(te,{size:13}),disabled:t.isPending,onClick:()=>{a(e.baseUrl??``),r(!1)},children:`Cancel`})]}):(0,Q.jsx)(_,{size:`sm`,variant:`secondary`,icon:(0,Q.jsx)(I,{size:13}),onClick:()=>r(!0),children:`Edit endpoint`}),e.requiresAccount?(0,Q.jsx)(_,{size:`sm`,variant:`secondary`,icon:(0,Q.jsx)(N,{size:13}),onClick:()=>{let e=document.getElementById(`provider-accounts`);e?.scrollIntoView({behavior:`smooth`,block:`start`}),e?.focus({preventScroll:!0})},children:`Manage API keys`}):null]})]})})]})}async function on(e,t,n){let r=Array(e.length),i=Math.max(1,Math.min(t,e.length)),a=0;return await Promise.all(Array.from({length:i},async()=>{for(;;){let t=a;if(t>=e.length)return;a+=1;try{r[t]={status:`fulfilled`,value:await n(e[t],t)}}catch(e){r[t]={status:`rejected`,reason:e}}}})),r}var sn={quota_fetch_failed:`Quota unreachable`,quota_exhausted:`Quota exhausted`,policy_blocked:`Policy blocked`,rate_limit_transient:`Rate limited`,missing_credential:`No credential`,validation_required:`Verification required`},cn=new Set([`quota_fetch_failed`]);function ln(e){return e===void 0||e.length===0?!1:!cn.has(e)}function un(e){return e===`oauth`?`Re-login required`:`Replace API key`}function dn(e,t){return e===`auth_invalidated`?un(t):sn[e]??e}var fn=/https?:\/\/[^\s"'\\]+/;function pn(e){if(e)return fn.exec(e)?.[0]}function mn({cooldowns:e,reason:t}){if(!e)return null;let n=$e(e.until),r=`Soonest: ${e.modelId} — ${n}`;return(0,Q.jsxs)(G,{tone:`warn`,dot:!0,title:t?`${t} — ${r}`:r,children:[e.count,` model`,e.count===1?``:`s`,` cooling · `,n]})}function hn(e){if(e.credentialKind===`oauth`)return`OAuth`;if(e.credentialMode===`jwt`)return`JWT`}function gn(e){if(!ln(e.lastErrorCategory)||e.lastErrorCategory===`quota_exhausted`&&pt(e))return null;let t=dn(e.lastErrorCategory,e.credentialKind),n=e.lastError??e.lastErrorCategory;if(e.lastErrorCategory===`validation_required`){let r=pn(e.lastError);if(r!==void 0)return(0,Q.jsx)(`a`,{href:r,target:`_blank`,rel:`noreferrer noopener`,title:n,children:(0,Q.jsxs)(G,{tone:`warn`,children:[t,(0,Q.jsx)(ze,{size:12,className:`shrink-0`,"aria-hidden":`true`})]})})}return(0,Q.jsx)(G,{tone:`warn`,title:n,children:t})}function _n(e){return e.credentialKind===`oauth`?`blue`:`ok`}function vn({account:e}){let t=e.providerCooldowns;if(!t||t.length===0)return null;let n=Date.now(),r=t.filter(e=>new Date(e.until).getTime()>n);if(r.length===0)return null;let i=r.some(e=>e.blocked),a=r.reduce((e,t)=>{let n=new Date(t.until).getTime();return n<e?n:e},1/0),o=r.map(e=>`${e.providerId}: ${e.reason}${e.blocked?` (blocked)`:``}`).join(` · `);return(0,Q.jsx)(G,{tone:`warn`,title:`${o} — resets ${$e(new Date(a).toISOString())}`,children:i?`Egress blocked`:`Rate-limited`})}function yn({account:e}){let t=e.cooldownUntil?new Date(e.cooldownUntil).getTime():NaN,n=Number.isFinite(t)&&t>Date.now(),r=pt(e);if(e.status===`disabled`){let t=hn(e),n=e.lastErrorCategory===`auth_invalidated`;return(0,Q.jsxs)(Y,{gap:`4px`,children:[(0,Q.jsxs)(G,{tone:`disabled`,dot:!0,title:e.lastError,children:[`Disabled`,t?` - ${t}`:``]}),n?(0,Q.jsx)(G,{tone:`warn`,title:e.lastError,children:un(e.credentialKind)}):gn(e),(0,Q.jsx)(mn,{cooldowns:r,reason:e.lastErrorCategory===`quota_exhausted`?e.lastError:void 0})]})}return e.status===`active`?(0,Q.jsxs)(Y,{gap:`4px`,children:[(0,Q.jsxs)(G,{tone:_n(e),dot:!0,children:[`Active`,hn(e)?` - ${hn(e)}`:``]}),(0,Q.jsx)(vn,{account:e}),gn(e),(0,Q.jsx)(mn,{cooldowns:r,reason:e.lastErrorCategory===`quota_exhausted`?e.lastError:void 0})]}):e.status===`cooldown`||n?(0,Q.jsxs)(Y,{gap:`4px`,children:[(0,Q.jsxs)(G,{tone:`warn`,dot:!0,children:[`Cooldown`,hn(e)?` - ${hn(e)}`:``,` `,e.cooldownUntil?`(${$e(e.cooldownUntil)})`:``]}),(0,Q.jsx)(vn,{account:e}),gn(e),(0,Q.jsx)(mn,{cooldowns:r,reason:e.lastErrorCategory===`quota_exhausted`?e.lastError:void 0})]}):(0,Q.jsx)(G,{tone:`disabled`,children:`Disabled`})}function bn(e){if(e===void 0)return;let t=new Date(e).getTime();if(Number.isFinite(t))return t<=Date.now()?`Expired ${new Date(e).toLocaleDateString()}`:$e(e,!1)}function xn({windows:e}){let t=Qe(e??[]);return t.text===null?null:(0,Q.jsxs)(`span`,{className:`inline-flex items-center gap-2.5 max-w-full px-3.5 py-1 border border-inner-border rounded-chip bg-surface-1 text-text-secondary text-badge leading-normal whitespace-nowrap`,"data-tone":t.low?`warn`:void 0,title:t.hasCredits?`${Sn(t.remaining)} credits available of ${Sn(t.total)}`:`Lowest remaining percent across this account's quota windows`,children:[(0,Q.jsx)(`span`,{className:`text-text-tertiary text-micro font-semibold uppercase tracking-label`,children:`Quota`}),t.text]})}function Sn(e){return e.toLocaleString(void 0,{maximumFractionDigits:1})}function Cn({providerId:e,account:t,onClose:n}){let r=me(),[i,a]=(0,Z.useState)(``),o=t.label||t.id.slice(0,8),s=r.isPending,c=i.trim().length>0&&!s,l=async()=>{try{a(await navigator.clipboard.readText())}catch{v.error(`Clipboard access denied`)}};return(0,Q.jsx)(F,{open:!0,onClose:n,title:`Replace API key — ${o}`,width:560,footer:(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,onClick:n,disabled:s,children:`Cancel`}),(0,Q.jsx)(_,{size:`sm`,variant:`primary`,disabled:!c,onClick:()=>{let a=i.trim();a&&r.mutate({providerId:e,accountId:t.id,request:{secret:a}},{onSuccess:()=>{v.success(`API key replaced`,o),n()},onError:e=>{let t=e instanceof Error?e.message:`Unable to update account`;v.error(`Failed to replace key`,t)}})},children:s?`Saving…`:`Replace key`})]}),children:(0,Q.jsxs)(`div`,{className:`flex flex-col gap-5`,children:[(0,Q.jsx)(`p`,{className:`m-0 text-caption text-text-secondary`,children:`Paste the new key for this account. The old key stops working immediately; the account keeps its label, history, and routing.`}),(0,Q.jsxs)(J,{gap:`6px`,className:`min-w-0`,children:[(0,Q.jsx)(`label`,{className:`text-caption font-semibold text-text-secondary`,children:`New API key`}),(0,Q.jsx)(`textarea`,{value:i,onChange:e=>a(e.target.value),placeholder:`Paste the replacement key…`,rows:4,spellCheck:!1,autoFocus:!0,className:`font-mono tabular-nums w-full min-w-0 min-h-65 rounded-control border border-inner-border bg-input-bg px-6 py-5 text-caption text-text-primary resize-y box-border`}),(0,Q.jsx)(Y,{gap:`8px`,className:`justify-end`,children:(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,onClick:()=>void l(),children:`Paste`})})]})]})})}function wn({providerId:e,account:t,inflight:n,quota:r,selected:a,onToggleSelect:o,onDelete:s}){let c=me(),l=Ce(),u=lt(t.id),d=ot(),m=t.kind===`pool`,h=t.networkPoolId,g=at(m?h:void 0),y=t.status===`disabled`,b=t.cooldownUntil?new Date(t.cooldownUntil).getTime():NaN,x=Number.isFinite(b)&&b>Date.now(),S=t.status===`cooldown`||x,[C,w]=(0,Z.useState)(!1),[T,E]=(0,Z.useState)(!1),[D,O]=(0,Z.useState)(!1),[,k]=(0,Z.useState)(0),[ee,te]=(0,Z.useState)(!1),[P,ne]=(0,Z.useState)(``),ie=dt(e),oe=(t.label?.match(/[^\s@]+@[^\s@]+/)?.[0]??t.label)||t.id.slice(0,8),L=ie.enabled?`Mysterious accounts`:oe,ce=bn(t.tokenExpiresAt),le=ft(t),ue=Math.max(x&&t.cooldownUntil?b:0,le??0);(0,Z.useEffect)(()=>{if(ue<=Date.now())return;let e=setInterval(()=>k(e=>e+1),1e3);return()=>clearInterval(e)},[ue]);let de=()=>{let n=P.trim();te(!1),n&&n!==(t.label??``)&&c.mutate({providerId:e,accountId:t.id,request:{label:n}},{onSuccess:()=>v.success(`Account renamed`,n),onError:e=>v.error(`Rename failed`,e.message??`Unable to rename account`)})};return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`div`,{className:`account-row account-row-grid grid items-center gap-5 px-5 py-4 border rounded-control bg-surface-2 ${a?`border-accent`:`border-inner-border`} hover:bg-hover`,role:`listitem`,"data-selected":a?`true`:void 0,style:{opacity:y?.62:1},children:[(0,Q.jsx)(`div`,{className:`flex items-center`,children:(0,Q.jsx)(`input`,{type:`checkbox`,checked:a,onChange:e=>o(t.id,e.target.checked),"aria-label":`Select ${L}`,className:`cursor-pointer`})}),(0,Q.jsxs)(`div`,{className:`min-w-0 flex flex-col gap-1.5`,children:[(0,Q.jsx)(`div`,{className:`flex items-center gap-3 min-w-0`,children:ee?(0,Q.jsx)(K,{value:P,onChange:e=>ne(e.target.value),onKeyDown:e=>{e.key===`Enter`&&de(),e.key===`Escape`&&te(!1)},onBlur:de,autoFocus:!0,"aria-label":`Account label`,className:`text-body max-w-120`}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`span`,{className:`text-body font-semibold text-text-primary min-w-0 overflow-hidden text-ellipsis whitespace-nowrap`,title:t.label||t.id,children:L}),m?(0,Q.jsx)(`span`,{className:`inline-flex items-center gap-1 px-2 py-0.5 border border-inner-border rounded-tiny bg-surface-1 text-micro font-bold uppercase tracking-label text-text-secondary`,title:`Proxy pool routing as an account for this ip-scoped provider`,children:`Pool`}):null,(0,Q.jsx)(`button`,{type:`button`,className:`shrink-0 grid place-items-center w-10 h-10 p-0 border-0 bg-transparent text-text-tertiary cursor-pointer rounded-tiny hover:bg-inner-border hover:text-text-primary`,title:`Rename account`,"aria-label":`Rename ${L}`,onClick:()=>{ne(t.label??``),te(!0)},children:(0,Q.jsx)(I,{size:11})})]})}),(0,Q.jsxs)(`div`,{className:`flex items-center flex-nowrap gap-2 min-w-0 overflow-hidden`,children:[(0,Q.jsx)(yn,{account:t}),ce?(0,Q.jsx)(`span`,{className:`inline-flex items-center gap-2.5 max-w-full px-3.5 py-1 border border-inner-border rounded-chip bg-surface-1 text-text-secondary text-badge leading-normal whitespace-nowrap`,title:ce,children:ce}):null]}),(0,Q.jsxs)(`div`,{className:`flex items-center flex-wrap gap-2 min-w-0`,children:[(0,Q.jsxs)(`span`,{className:`inline-flex items-center gap-2.5 max-w-full px-3.5 py-1 border border-inner-border rounded-chip bg-surface-1 text-text-secondary text-badge leading-normal whitespace-nowrap`,title:`Today: ${t.usageToday.totalTokens.toLocaleString()} tokens, ${t.usageToday.requests.toLocaleString()} requests`,children:[(0,Q.jsx)(`span`,{className:`text-text-tertiary text-micro font-semibold uppercase tracking-label`,children:`Today`}),t.usageToday.totalTokens.toLocaleString(),` tok · `,t.usageToday.requests.toLocaleString(),` req`]}),(0,Q.jsxs)(`span`,{className:`inline-flex items-center gap-2.5 max-w-full px-3.5 py-1 border border-inner-border rounded-chip bg-surface-1 text-text-secondary text-badge leading-normal whitespace-nowrap`,title:`Lifetime totals are backfilled from telemetry still retained when tracking starts; new totals survive telemetry cleanup.`,children:[(0,Q.jsx)(`span`,{className:`text-text-tertiary text-micro font-semibold uppercase tracking-label`,children:`All time`}),t.usageAllTime.totalTokens.toLocaleString(),` tok · `,t.usageAllTime.requests.toLocaleString(),` req`]}),(0,Q.jsx)(xn,{windows:r}),(0,Q.jsxs)(`span`,{className:`inline-flex items-center gap-2.5 max-w-full px-3.5 py-1 border border-inner-border rounded-chip bg-surface-1 text-text-secondary text-badge leading-normal whitespace-nowrap`,title:`Concurrency comes from this provider’s Routing Strategy; accounts carry no manual ceilings.`,children:[(0,Q.jsx)(`span`,{className:`text-text-tertiary text-micro font-semibold uppercase tracking-label`,children:`In flight`}),n?.toLocaleString()??`—`]})]})]}),(0,Q.jsxs)(`div`,{className:`account-row-actions flex items-center justify-end gap-3 flex-wrap`,children:[m?(0,Q.jsx)(_,{size:`icon`,variant:`secondary`,icon:(0,Q.jsx)(i,{size:12}),label:`Health`,"aria-label":`Health for ${L}`,onClick:()=>E(!0),title:`View pool health & error history`}):(0,Q.jsx)(_,{size:`icon`,variant:`secondary`,icon:(0,Q.jsx)(i,{size:12}),label:`Health`,"aria-label":`Health for ${L}`,onClick:()=>w(!0),title:`View Health & Error History`}),m?(0,Q.jsx)(_,{size:`icon`,variant:`secondary`,icon:d.isPending?(0,Q.jsx)(f,{size:12,className:`animate-spin`}):(0,Q.jsx)(p,{size:12}),label:d.isPending?`Testing…`:`Test`,"aria-label":`Test ${L}`,disabled:d.isPending||h===void 0,onClick:()=>{h&&d.mutate({poolId:h,providerId:e},{onSuccess:e=>{e.status===`allowed`?v.success(`Pool probe passed`,L):e.status===`blocked`?v.error(`Pool blocked`,e.reason??`Upstream refused this egress`):e.status===`throttled`?v.error(`Pool rate-limited`,e.reason??`Address accepted; rate limit spent`):v.error(`Pool unreachable`,e.reason??`Probe could not complete`)},onError:e=>v.error(`Pool probe failed`,e.message??`Probe failed`)})},title:`Probe this pool against the provider`}):(0,Q.jsx)(_,{size:`icon`,variant:`secondary`,icon:u.isPending?(0,Q.jsx)(f,{size:12,className:`animate-spin`}):(0,Q.jsx)(p,{size:12}),label:u.isPending?`Testing…`:`Test`,"aria-label":`Test ${L}`,disabled:u.isPending,onClick:()=>{u.mutate(void 0,{onSuccess:e=>{e?.ok?v.success(`Account test passed`,L):v.error(`Account test failed`,e?.message??`Provider reported an error`)},onError:e=>v.error(`Account test failed`,e.message??`Unable to test account`)})},title:`Refresh quota and health for this account`}),m?null:(0,Q.jsx)(_,{size:`icon`,variant:`secondary`,icon:(0,Q.jsx)(N,{size:12}),label:`Edit key`,"aria-label":`Replace API key for ${L}`,onClick:()=>O(!0),title:`Replace API key`}),m?null:(0,Q.jsx)(_,{size:`icon`,variant:`secondary`,icon:y?(0,Q.jsx)(_t,{size:12}):(0,Q.jsx)(re,{size:12}),label:y?`Enable`:`Disable`,"aria-label":y?`Enable ${L}`:`Disable ${L}`,disabled:c.isPending,onClick:()=>{let n=y;c.mutate({providerId:e,accountId:t.id,request:{status:n?`active`:`disabled`}},{onSuccess:()=>v.success(n?`Account enabled`:`Account disabled`,L),onError:e=>v.error(`Update failed`,e.message??`Unable to update account`)})},title:y?`Enable account`:`Disable account`}),S?(0,Q.jsx)(_,{size:`icon`,variant:`secondary`,icon:(0,Q.jsx)(ae,{size:12,className:l.isPending?`animate-spin`:``}),label:l.isPending?`Recovering…`:`Recover`,"aria-label":`Recover ${L}`,disabled:l.isPending,onClick:()=>l.mutate({providerId:e,accountId:t.id}),title:`Clear cooldown / restore active status`}):null,m?null:(0,Q.jsx)(_,{size:`icon`,variant:`danger`,icon:(0,Q.jsx)(se,{size:12}),label:`Delete`,"aria-label":`Delete ${L}`,onClick:()=>s(t),title:`Delete account`})]})]}),C&&(0,Q.jsx)(ut,{summary:{providerId:e,accountId:t.id,title:t.label||t.id.slice(0,8),status:t.status,errorCategory:t.lastErrorCategory??void 0,errorMessage:t.lastError??void 0,emptyMessage:`Status transitions, rate limits, and auto-recoveries will appear here.`,staticToken:t.staticToken===!0,credentialKind:t.credentialKind,credentialMode:t.credentialMode,jwtIssuer:t.jwtIssuer},onClose:()=>w(!1)}),D&&(0,Q.jsx)(Cn,{providerId:e,account:t,onClose:()=>O(!1)}),T&&(0,Q.jsx)(F,{open:!0,title:`Pool Health & Error History`,onClose:()=>E(!1),width:640,footer:(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,onClick:()=>E(!1),children:`Close`}),children:(0,Q.jsx)(`div`,{className:`flex flex-col gap-3 min-h-40`,children:g.isPending?(0,Q.jsx)(j,{label:`Loading pool health events…`}):g.isError?(0,Q.jsx)(A,{message:`Failed to load pool health events`,onRetry:()=>void g.refetch()}):(g.data??[]).length===0?(0,Q.jsx)(M,{compact:!0,title:`No health events recorded`,message:`Status transitions, rate limits, and auto-recoveries will appear here.`}):(0,Q.jsx)(`div`,{className:`scroll-region max-h-160 overflow-y-auto pr-1 flex flex-col gap-3`,children:(g.data??[]).map(e=>(0,Q.jsxs)(`div`,{className:`rounded-control border border-inner-border bg-surface-2 px-4 py-3 text-badge`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,Q.jsx)(`span`,{className:`font-mono tabular-nums text-micro text-text-tertiary`,children:new Date(e.createdAt).toLocaleString()}),(0,Q.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[(0,Q.jsxs)(`span`,{className:`text-text-tertiary text-micro uppercase tracking-label`,children:[e.fromStatus??`—`,` → `,e.toStatus]}),e.errorCategory?(0,Q.jsx)(`span`,{className:`rounded-pill border border-warning-line bg-surface-2 px-2.5 py-px font-mono text-micro text-status-warning`,children:e.errorCategory}):null]})]}),e.reason?(0,Q.jsx)(`p`,{className:`mt-2 text-micro text-text-secondary [overflow-wrap:anywhere] break-words`,children:e.reason}):null]},e.id))})})})]})}var Tn=[`access`,`accessToken`,`access_token`,`sessionToken`,`session_token`,`token`,`apiKey`,`api_key`,`key`,`credential`,`pat`,`secret`],En=[`refresh`,`refreshToken`,`refresh_token`],Dn=[`credentialKind`,`providerId`,`accessToken`],On=[`accounts`,`items`,`connections`],kn=[`email`,`name`,`accountId`,`account_id`,`id`,`login`,`username`];function $(e){if(typeof e==`object`&&e&&!Array.isArray(e))return Object.fromEntries(Object.entries(e))}function An(e){let t=e.data;if(typeof t==`string`)try{return $(JSON.parse(t))}catch{return}return $(t)}function jn(e){for(let t of Tn){let n=e[t];if(typeof n==`string`&&n.trim().length>0)return{value:n.trim(),extracted:!0,source:t}}let t=An(e);if(t)for(let e of Tn){let n=t[e];if(typeof n==`string`&&n.trim().length>0)return{value:n.trim(),extracted:!0,source:`data.${e}`}}}function Mn(e){for(let t of kn){let n=e[t];if(typeof n==`string`&&n.trim().length>0)return n.trim()}let t=An(e);if(t)for(let e of kn){let n=t[e];if(typeof n==`string`&&n.trim().length>0)return n.trim()}}function Nn(e){let t=(e,t)=>t.some(t=>typeof e[t]==`string`||typeof e[t]==`number`),n=e=>t(e,En);if(n(e))return!0;let r=An(e);return r?n(r):!1}function Pn(e){let t=e.trim().split(`.`);if(t.length===3)try{let e=t[1].replaceAll(`-`,`+`).replaceAll(`_`,`/`),n=e.padEnd(e.length+(4-e.length%4)%4,`=`);return $(JSON.parse(atob(n)))}catch{return}}function Fn(e){let t=Pn(e)?.exp;if(typeof t!=`number`||!Number.isFinite(t))return;let n=new Date(t*1e3);return Number.isFinite(n.getTime())?n.toISOString():void 0}function In(e){let t={},n=0;for(let r of e.split(/\r?\n/)){let e=/^\s*([A-Za-z_][\w-]*)\s*:\s*(.*)$/.exec(r),i=e?.[1],a=e?.[2];i!==void 0&&a!==void 0&&(t[i]=a.trim(),n+=1)}return n>0?t:void 0}function Ln(e){if(e.startsWith(`{`)||e.startsWith(`[`))try{return JSON.parse(e)}catch{return}}var Rn=[{id:`codebuddy`,counterpart:`WorkBuddy`},{id:`workbuddy`,counterpart:`CodeBuddy`}];function zn(e,t){let n=`${e} ${t}`.toLowerCase().replace(/[^a-z]/g,``);for(let e of Rn)if(n.includes(e.id))return{provider:e.id,counterpart:e.counterpart}}function Bn(e){let t=e.trim(),n=$(Ln(t))??In(t);return n&&Nn(n)?`oauth`:Pn((n?jn(n)?.value:void 0)??t)===void 0?`api_key`:`jwt`}function Vn(e){return e.length!==0&&!!(e.some(e=>Array.isArray(e.cookies)&&(typeof e.domain==`string`||typeof e.originalUrl==`string`))||e.every(e=>typeof e.name==`string`&&typeof e.value==`string`&&(e.domain!==void 0||e.path!==void 0||e.expirationDate!==void 0)))}function Hn(e,t){let n,r=!1,i=(e,t)=>{let i=e.toLowerCase();(i===`userid`||i===`uid`||i===`accountid`||i===`cuserid`)&&(n||=t.replace(/^"|"$/g,``).trim()),(i.includes(`token`)||i.includes(`ph`)||i.includes(`auth`)||i.includes(`session`))&&(r=!0)};for(let e of t)if(Array.isArray(e.cookies)){for(let t of e.cookies)if(t&&typeof t==`object`){let e=t;typeof e.name==`string`&&typeof e.value==`string`&&i(e.name,e.value)}}else typeof e.name==`string`&&typeof e.value==`string`&&i(e.name,e.value);return{value:e,kind:r?`oauth`:`api_key`,...n?{identity:n}:{}}}function Un(e){let t=e.credentialKind;if(typeof t==`string`&&typeof e.accessToken==`string`&&Dn.every(t=>t in e)){let n=typeof e.label==`string`&&e.label.trim().length>0?e.label.trim():void 0,r=e.accessToken,i=t===`oauth`&&Nn(e);return{value:i?JSON.stringify(e):r,kind:i?`oauth`:`api_key`,...n?{identity:n}:{}}}let n=jn(e),r=Nn(e)?`oauth`:Bn(n?.value??JSON.stringify(e)),i=r===`oauth`?JSON.stringify(e):n?.value??JSON.stringify(e),a=Mn(e);return a?{value:i,kind:r,identity:a}:{value:i,kind:r}}function Wn(e){for(let t of On){let n=e[t];if(!Array.isArray(n))continue;let r=n.map(e=>$(e)).filter(e=>e!==void 0);if(r.length>0)return r}}function Gn(e){let t=e.trim();if(!t)return[];let n=Ln(t);if(Array.isArray(n)){let e=n.map(e=>$(e)).filter(e=>e!==void 0);if(e.length>0)return Vn(e)?[Hn(t,e)]:e.map(Un)}else{let e=$(n);if(e){let t=Wn(e);return t?t.map(Un):[Un(e)]}}let r=t.split(/\r?\n/).map(e=>e.trim()).filter(e=>e.length>0);if(r.length===0)return[];if(r.length===1){let e=In(r[0]);return e?[Un(e)]:Kn(r[0])}let i=In(t);return i&&(jn(i)||Object.keys(i).length===r.length)?[Un(i)]:r.flatMap(Kn)}function Kn(e){let t=$(Ln(e));if(t){let e=Wn(t);return e?e.map(Un):[Un(t)]}return[{value:e,kind:Bn(e)}]}function qn(e,t,n){let r=new Set(n),i=1;return e.map(e=>{let n=e.identity;if(!n){for(;r.has(`${t}-${i}`);)i+=1;n=`${t}-${i}`,i+=1}let a=n,o=2;for(;r.has(a);)a=`${n} (${o++})`;return r.add(a),a})}function Jn(e){let t=[];for(let n of e){let e=n.text.trim();if(!e)continue;let r=Ln(e);if(Array.isArray(r)){let n=r.filter(e=>$(e)!==void 0);if(n.length>0&&Vn(n)){t.push(e);continue}for(let e of r){let n=$(e);t.push(n===void 0?String(e):JSON.stringify(n))}continue}let i=$(r);if(i){let n=Wn(i);if(n!==void 0){for(let e of n)t.push(JSON.stringify(e));continue}t.push(e);continue}Gn(e).length<=1?t.push(e):t.push(...e.split(/\r?\n/).map(e=>e.trim()).filter(e=>e.length>0))}let n=t.join(`
2
- `);return{text:n,entries:Gn(n)}}function Yn(e,t=50){if(t<1)throw RangeError(`chunk size must be at least 1`);let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}var Xn=2097152,Zn=Xn/1048576;function Qn({providerId:e,accounts:t,onClose:n}){let r=Se(),i=Ne(),[a,o]=(0,Z.useState)(``),[s,c]=(0,Z.useState)(``),[l,u]=(0,Z.useState)(!1),[d,f]=(0,Z.useState)(`auto`),[p,m]=(0,Z.useState)(void 0),[h,g]=(0,Z.useState)(!1),b=(0,Z.useRef)(null),x=Gn(s),S=x.length>1,C=x.length===1?x[0]:void 0,w=d===`auto`?C?.kind:d,T=C&&w===`jwt`?Fn(C.value):void 0,E=x.length>0?zn(e,s):void 0,D=E!==void 0&&p!==s,O=t.map(e=>e.label),k=S?qn(x,e,O):[],A=e=>{let t=d===`auto`?e.kind===`jwt`?`jwt`:`auto`:d;return{credentialKind:t===`auto`&&e.kind===`oauth`?`oauth`:`api_key`,credentialMode:t,secret:e.value}},j=r.isPending||l,M=async()=>{try{let e=await navigator.clipboard.readText();c(e);let t=Gn(e);if(t.length>1)v.success(`Pasted from clipboard`,`Detected ${t.length} credentials`);else{let e=t[0]?.kind??`api_key`,n=e===`oauth`?`OAuth export`:e===`jwt`?`Static JWT`:`API key`;v.success(`Pasted from clipboard`,`Detected: ${n}`)}}catch{v.error(`Clipboard access denied`)}},N=e=>{if(e.length===0)return;let t=e.find(e=>e.size>Xn);if(t){v.error(`File too large`,`${t.name} is over ${Zn} MB — credential files must be ${Zn} MB or smaller.`);return}let n=e.map(e=>new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(typeof r.result==`string`?r.result:``),r.onerror=()=>n(Error(`Could not read ${e.name}`)),r.readAsText(e)}));Promise.all(n).then(t=>{let n=Jn(e.map((e,n)=>({name:e.name,text:t[n]??``})));if(n.entries.length===0){v.error(`Nothing to import`,`None of the selected files held a credential the gateway recognises.`);return}c(n.text),v.success(`Imported ${e.length} file${e.length===1?``:`s`}`,n.entries.length>1?`Detected ${n.entries.length} credentials`:n.entries[0]?.kind===`oauth`?`Detected: OAuth export`:`Detected: API key`)}).catch(e=>v.error(`Could not read those files`,String(e)))},ee=async()=>{if(x.length!==0&&!D){if(x.length===1){let t=x[0];r.mutate({providerId:e,request:{label:(a.trim()||t.identity)??void 0,...A(t)}},{onSuccess:()=>{v.success(`Account connected`,`New ${t.kind===`oauth`?`OAuth`:t.kind===`jwt`?`Static JWT`:`API key`} account registered successfully`),n()},onError:e=>v.error(`Failed to add account`,e.message??`Invalid credentials`)});return}u(!0);try{let t=Yn(x.map((e,t)=>({label:k[t],...A(e)}))),r=0,a=[],o=!1;for(let[n,s]of t.entries())try{let t=await i.mutateAsync({providerId:e,accounts:s});r+=t.created;let o=n*50;for(let e of t.results)e.ok||a.push(`${k[o+e.index]??o+e.index}: ${e.error??`rejected`}`)}catch(e){o=!0,a.push(`chunk ${n+1}/${t.length}: ${fe(e,`request failed`)}`);break}let s=a.length;r>0&&v.success(`${r} account${r===1?``:`s`} added`,o?`stopped partway; ${s} failed`:s>0?`${s} skipped`:void 0),s>0&&v.error(`${s} account${s===1?``:`s`} skipped`,a.slice(0,5).join(`
3
- `)+(s>5?`\n…and ${s-5} more`:``)),r>0&&n()}finally{u(!1)}}};return(0,Q.jsx)(F,{open:!0,onClose:n,title:`Add Account (API key / JSON)`,width:560,footer:(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,onClick:n,disabled:j,children:`Cancel`}),(0,Q.jsx)(_,{size:`sm`,variant:`primary`,disabled:j||x.length===0,onClick:()=>void ee(),children:j?`Connecting...`:D?`Confirm below`:S?`Add ${x.length} Accounts`:`Add Account`})]}),children:(0,Q.jsxs)(`div`,{className:`flex flex-col gap-5`,children:[!S&&(0,Q.jsx)(K,{label:`Account label (optional)`,value:a,onChange:e=>o(e.target.value),placeholder:C?.identity??`${e} account`}),(0,Q.jsx)(q,{label:`Credential type`,id:`credential-mode`,value:d,onValueChange:e=>f(e===`jwt`||e===`api_key`?e:`auto`),options:[{value:`auto`,label:`Auto — detect JWT, OAuth, or API key`},{value:`jwt`,label:`JWT — static, no refresh`},{value:`api_key`,label:`API key — do not decode as JWT`}]}),(0,Q.jsxs)(J,{gap:`6px`,className:`min-w-0`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,Q.jsx)(`label`,{className:`text-caption font-semibold text-text-secondary`,children:`API key, OAuth token, or exported JSON — one or many`}),S?(0,Q.jsxs)(G,{tone:`accent`,children:[`Detected: `,x.length,` accounts`]}):C?(0,Q.jsxs)(G,{tone:w===`oauth`||w===`jwt`?`accent`:`default`,children:[`Detected:`,` `,w===`oauth`?`OAuth`:w===`jwt`?`Static JWT`:`API key`,C.identity?` · ${C.identity}`:``]}):null,C&&w===`jwt`?(0,Q.jsxs)(`p`,{className:`text-micro text-text-tertiary`,children:[`Static JWT · no refresh token`,T?` · expires ${new Date(T).toLocaleString()}`:` · no expiry claim`]}):null]}),(0,Q.jsxs)(`div`,{className:`flex flex-col gap-2 rounded-control border-2 border-dashed p-3 transition-colors`,"data-drag-active":h?`true`:void 0,onDragOver:e=>{e.preventDefault(),g(!0)},onDragLeave:()=>g(!1),onDrop:e=>{e.preventDefault(),g(!1);let t=[...e.dataTransfer.files].filter(e=>e.name.endsWith(`.json`)||e.name.endsWith(`.jsonl`)||e.name.endsWith(`.ndjson`)||e.name.endsWith(`.txt`)||e.type.startsWith(`application/json`)||e.type.startsWith(`text/plain`));if(t.length===0){v.error(`Unsupported file`,`Drop .json, .txt, .jsonl, or .ndjson credential files.`);return}N(t)},children:[(0,Q.jsx)(`textarea`,{value:s,onChange:e=>c(e.target.value),placeholder:`Paste one credential, or many — one per line, a JSON array, or newline-delimited OAuth exports. Kind and account naming are detected automatically…`,rows:6,spellCheck:!1,className:`font-mono tabular-nums w-full min-w-0 min-h-65 rounded-control border border-inner-border bg-input-bg px-6 py-5 text-caption text-text-primary resize-y box-border`}),(0,Q.jsx)(`p`,{className:`text-micro text-text-tertiary text-center`,children:`Or drop credential files here — JSON, .txt, .jsonl, .ndjson — several at once, merged and detected together.`})]}),(0,Q.jsxs)(Y,{gap:`8px`,className:`justify-end`,children:[(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,onClick:()=>void M(),children:`Paste`}),(0,Q.jsxs)(`label`,{className:y({size:`sm`,className:`cursor-pointer`}),children:[(0,Q.jsx)(`input`,{ref:b,type:`file`,accept:`.json,.txt,.jsonl,.ndjson,application/json,text/plain`,multiple:!0,"aria-label":`Import credentials from files`,className:`hidden`,onChange:e=>{let t=[...e.target.files??[]];e.target.value=``,t.length>0&&N(t)}}),`Import files`]})]})]}),S&&(0,Q.jsx)(`div`,{className:`flex flex-col gap-2 max-h-75 overflow-y-auto rounded-control border border-inner-border bg-surface-2 px-4 py-5`,children:x.map((e,t)=>(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-4 text-badge`,children:[(0,Q.jsx)(`span`,{className:`truncate min-w-0`,children:k[t]}),(0,Q.jsx)(G,{tone:e.kind===`oauth`?`accent`:`default`,children:e.kind===`oauth`?`OAuth`:`API key`})]},t))}),E&&(0,Q.jsxs)(`div`,{className:`flex flex-col gap-3 rounded-control border border-warning-line bg-surface-2 px-4 py-5`,role:`alert`,children:[(0,Q.jsx)(`div`,{className:`flex items-start gap-3`,children:(0,Q.jsx)(`span`,{className:`inline-flex items-center flex-none px-3.5 py-px border rounded-md bg-surface-2 text-badge tabular-nums border-warning-line text-status-warning`,children:`Cross-channel credential`})}),(0,Q.jsxs)(`p`,{className:`text-caption text-text-primary`,children:[`This looks like a `,E.provider,` credential.`,` `,E.provider,` and `,E.counterpart,` tokens are interchangeable — one works in the other — but using a token on a channel it was not issued for can raise the risk of the account being banned, because it appears active somewhere it never authenticated. The same applies in reverse.`]}),D?(0,Q.jsxs)(Y,{gap:`8px`,className:`justify-end`,children:[(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,onClick:()=>{c(``),n()},children:`Cancel`}),(0,Q.jsx)(_,{size:`sm`,variant:`primary`,onClick:()=>m(s),children:`Add anyway`})]}):(0,Q.jsx)(`p`,{className:`text-micro text-text-tertiary`,children:`Acknowledged — you can add this account now.`})]})]})})}function $n(e){return e===`active`?0:e===`cooldown`?2:3}var er=[{value:`added-asc`,label:`Added · oldest`},{value:`added-desc`,label:`Added · newest`},{value:`label-asc`,label:`Name · A–Z`},{value:`label-desc`,label:`Name · Z–A`},{value:`status-asc`,label:`Status · active first`},{value:`status-desc`,label:`Status · disabled first`},{value:`lastCheck-desc`,label:`Last check · newest`},{value:`lastCheck-asc`,label:`Last check · oldest`}];function tr(e,t,n){let r=(e,t)=>(e.label||e.id).localeCompare(t.label||t.id)||e.createdAt.localeCompare(t.createdAt)||e.id.localeCompare(t.id);if(n===`added`)return e.sortIndex-t.sortIndex||e.createdAt.localeCompare(t.createdAt)||e.id.localeCompare(t.id);if(n===`label`)return r(e,t);if(n===`status`){let n=$n(e.status)-$n(t.status);return n===0?r(e,t):n}let i=new Date(e.lastSuccessAt??e.createdAt).getTime();return new Date(t.lastSuccessAt??t.createdAt).getTime()-i||r(e,t)}function nr({providerId:e,accounts:t,onDelete:n,showGrokProbe:r=!1,grokProbePending:i=!1,onGrokProbe:a}){let o=ce(),s=me(),c=Ce(),l=Ae(),u=tt(e).data??new Map,f=ct(),m=(0,Z.useMemo)(()=>{let t=new Map;for(let n of f.data?.accounts??[])n.provider===e&&n.quota&&t.set(n.id,n.quota.windows);return t},[f.data,e]),[h,g]=(0,Z.useState)(``),[y,b]=(0,Z.useState)(new Set),[x,S]=(0,Z.useState)(`added-asc`),[C,w]=(0,Z.useState)(!1),[T,E]=(0,Z.useState)(null),[D,O]=(0,Z.useState)(!1),k=h.trim().toLowerCase(),A=(0,Z.useMemo)(()=>k?t.filter(e=>{let t=`${e.label??``} ${e.id} ${e.credentialKind} ${e.status}`.toLowerCase();return k.split(/\s+/).every(e=>t.includes(e))}):t,[t,k]),j=(0,Z.useMemo)(()=>{let e=x.slice(0,x.lastIndexOf(`-`)),t=x.endsWith(`-desc`)?-1:1,n=[...A];return n.sort((n,r)=>t*tr(n,r,e)),n},[A,x]),N=(0,Z.useMemo)(()=>t.filter(e=>e.kind!==`pool`&&y.has(e.id)),[t,y]),ee=A.length>0&&A.every(e=>y.has(e.id)),P=N.some(e=>e.status===`disabled`),F=N.some(e=>e.status!==`disabled`),I=N.length===0,ne=(e,t)=>{b(n=>{let r=new Set(n);return t?r.add(e):r.delete(e),r})},ie=()=>{b(e=>{let t=new Set(e);if(ee)for(let e of A)t.delete(e.id);else for(let e of A)e.kind!==`pool`&&t.add(e.id);return t})},L=async(e,t)=>{if(N.length===0)return;w(!0);let n=await Promise.allSettled(N.map(e=>t(e))),r=n.filter(e=>e.status===`rejected`).length,i=n.length-r;w(!1),r===0?v.success(`${e} complete`,`${i} account${i===1?``:`s`}`):v.error(`${e} partially failed`,`${i} succeeded, ${r} failed`)},le=()=>L(`Recover`,t=>c.mutateAsync({providerId:e,accountId:t.id})),ue=async()=>{let e=t.filter(e=>e.kind!==`pool`);e.length!==0&&(w(!0),E({done:0,total:e.length}),await on(e,3,async(e,n)=>{let r=await pe(`/accounts/${encodeURIComponent(e.id)}/quota/refresh`,{method:`POST`});return E({done:n+1,total:t.length}),r}),await Promise.all([o.invalidateQueries({queryKey:R.quota.all}),o.invalidateQueries({queryKey:R.providers.all})]),w(!1),E(null),v.success(`Test complete`,`${e.length} account${e.length===1?``:`s`} tested`))},de=t=>L(t?`Enable`:`Disable`,n=>s.mutateAsync({providerId:e,accountId:n.id,request:{status:t?`active`:`disabled`}})),fe=async()=>{if(N.length!==0){w(!0);try{let t=await l.mutateAsync({providerId:e,accountIds:N.map(e=>e.id)}),n=new Date().toISOString().replace(/[:.]/g,`-`);Ue(`${e}-accounts-${n}.json`,JSON.stringify(t,null,2),`application/json`),v.success(`Accounts exported`,`${t.accounts.length} account${t.accounts.length===1?``:`s`} — contains plaintext credentials`)}catch(e){v.error(`Export failed`,e.message??`Unable to export accounts`)}finally{w(!1)}}};return(0,Q.jsxs)(J,{gap:`8px`,children:[(0,Q.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-2 p-3 border border-inner-border rounded-control bg-surface-2`,children:[(0,Q.jsxs)(`label`,{className:`relative w-full`,children:[(0,Q.jsx)(oe,{size:13,"aria-hidden":`true`,className:`pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-text-tertiary`}),(0,Q.jsx)(K,{id:`accounts-search`,value:h,onChange:e=>g(e.target.value),placeholder:`Search accounts...`,"aria-label":`Search accounts`,className:`pl-9`})]}),(0,Q.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2`,children:[(0,Q.jsx)(_,{size:`sm`,variant:`primary`,icon:(0,Q.jsx)(p,{size:12}),disabled:C||t.length===0,onClick:ue,"aria-label":T===null?`Test all accounts`:`Testing accounts, ${T.done} of ${T.total} tested`,title:`Test every account, regardless of selection or filters`,children:T===null?`Test all`:`Tested ${T.done}/${T.total}`}),(0,Q.jsx)(_,{size:`sm`,variant:`secondary`,icon:(0,Q.jsx)(ae,{size:12}),disabled:C||I,title:I?`Select at least one account to recover it`:`Clear cooldowns and retry-wait states on the selected accounts`,onClick:()=>void le(),children:`Recover`}),(0,Q.jsx)(_,{size:`sm`,variant:`secondary`,icon:(0,Q.jsx)(_t,{size:12}),disabled:C||!P,title:I?`Select at least one disabled account to enable it`:P?`Enable the selected accounts`:`No selected account is currently disabled`,onClick:()=>void de(!0),children:`Enable`}),(0,Q.jsx)(_,{size:`sm`,variant:`secondary`,icon:(0,Q.jsx)(re,{size:12}),disabled:C||!F,title:I?`Select at least one enabled account to disable it`:F?`Disable the selected accounts`:`No selected account is currently enabled`,onClick:()=>void de(!1),children:`Disable`}),(0,Q.jsx)(_,{size:`sm`,variant:`secondary`,icon:(0,Q.jsx)(d,{size:12}),disabled:C||I,title:I?`Select at least one account to export`:`Download the selected accounts as JSON`,onClick:()=>void fe(),children:`Export`}),(0,Q.jsx)(_,{size:`sm`,variant:`danger`,icon:(0,Q.jsx)(se,{size:12}),disabled:C||I,title:I?`Select at least one account to delete`:`Delete ${N.length} selected account${N.length===1?``:`s`}`,onClick:()=>O(!0),children:`Delete`}),r?(0,Q.jsx)(_,{size:`sm`,variant:`secondary`,icon:(0,Q.jsx)(p,{size:12,className:i?`animate-spin`:``}),disabled:i||t.length===0,onClick:a,title:`Probe every Grok account with the live 407 streaming request`,children:i?`Testing…`:`Test 407`}):null,(0,Q.jsx)(`label`,{className:`inline-flex h-15 shrink-0 items-center gap-2 text-caption font-semibold text-text-secondary [&_.radix-select-trigger]:font-semibold [&_.radix-select-trigger]:bg-hover [&_.radix-select-trigger]:text-text-primary`,children:(0,Q.jsx)(q,{size:`sm`,value:x,onValueChange:e=>S(e),options:er,"aria-label":`Sort accounts by`})}),(0,Q.jsxs)(`label`,{className:`inline-flex h-15 shrink-0 items-center gap-2 text-caption font-semibold text-text-secondary`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:ee,onChange:ie,"aria-label":`Select accounts`}),(0,Q.jsx)(`span`,{children:`Select`})]}),I?null:(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>b(new Set),className:`inline-flex h-15 shrink-0 items-center gap-1 rounded-control border border-inner-border px-3 text-badge font-semibold text-text-secondary hover:bg-hover`,title:`Clear selection`,children:[N.length,` selected`,(0,Q.jsx)(te,{size:11,"aria-hidden":`true`})]})]})]}),(0,Q.jsx)(`div`,{className:`account-list flex flex-col gap-3 max-h-230 overflow-y-auto pr-1 [container-type:inline-size] [container-name:account-list]`,role:`list`,"aria-label":`Provider accounts`,children:j.length===0?(0,Q.jsx)(M,{compact:!0,icon:(0,Q.jsx)(oe,{size:20}),title:`No matching accounts`,message:k?`Nothing matches “${k}”. Clear the filter to see all ${t.length} account${t.length===1?``:`s`}.`:`This provider has no accounts yet.`}):j.map(t=>(0,Q.jsx)(wn,{providerId:e,account:t,inflight:u.get(t.id)??t.inflight,quota:m.get(t.id),selected:y.has(t.id),onToggleSelect:ne,onDelete:n},t.id))}),(0,Q.jsx)(`div`,{className:`flex items-center justify-between text-badge text-text-tertiary`,children:(0,Q.jsxs)(`span`,{children:[`Showing `,A.length,` account`,A.length===1?``:`s`,k?` (filtered from ${t.length})`:``]})}),(0,Q.jsx)(he,{open:D,onClose:()=>{C||O(!1)},onConfirm:async()=>{await L(`Delete`,async e=>{let t=e.tenantId===null?`/global/accounts/${encodeURIComponent(e.id)}`:`/accounts/${encodeURIComponent(e.id)}`;await pe(t,{method:`DELETE`}),o.removeQueries({queryKey:R.quota.account(e.id),exact:!0})}),b(new Set),O(!1),await Promise.all([o.invalidateQueries({queryKey:R.providers.accounts(e)}),o.invalidateQueries({queryKey:R.providers.all}),o.invalidateQueries({queryKey:R.quota.all})])},title:`Delete ${N.length} account${N.length===1?``:`s`}?`,message:`This permanently removes the selected accounts and their credentials. This cannot be undone.`,confirmLabel:`Delete`,danger:!0})]})}function rr(e){let t=e.trim(),n=e=>{try{return new URL(e).searchParams}catch{return}},r=n(t)??new URLSearchParams(t.startsWith(`?`)?t.slice(1):t),i=r.get(`code`);if(i)return{code:i};let a=r.get(`error_description`)??r.get(`error`);return a?{error:`The provider refused the login: ${a}`}:r.has(`authCodeInfo`)||r.has(`refreshToken`)||r.has(`refresh_token`)?{code:r.toString()}:n(t)!==void 0||t.startsWith(`?`)?{error:`That redirect URL carries no authorization code — copy the full URL from the address bar.`}:{code:t}}function ir({providerId:e,authorizeUrl:t,state:n,popup:r,onClose:i}){let[a,o]=(0,Z.useState)(!1),[s,c]=(0,Z.useState)(``),l=Fe(),d=mt(),p=ce(),m=je(e),h=(0,Z.useRef)(null),y=(0,Z.useRef)(!1),[b,x]=(0,Z.useState)(!0);(0,Z.useEffect)(()=>{let t=setInterval(()=>{p.invalidateQueries({queryKey:R.providers.accounts(e)})},1500);return()=>clearInterval(t)},[p,e]),(0,Z.useEffect)(()=>{let t=!1;return p.invalidateQueries({queryKey:R.providers.accounts(e)}).finally(()=>{t||x(!1)}),()=>{t=!0}},[p,e]),(0,Z.useEffect)(()=>{if(b)return;let e=m.data?.map(e=>e.id)??null;if(e!==null){if(h.current===null){h.current=new Set(e);return}y.current||e.find(e=>!h.current.has(e))!==void 0&&(y.current=!0,r.close(),v.success(`Account connected`,`OAuth login completed successfully`),i(!0))}},[m.data,b,r,i]);let S=()=>{r.close(),i(!1)},[C,w]=(0,Z.useState)(!1),T=()=>{w(!0),p.invalidateQueries({queryKey:R.providers.accounts(e)}).finally(()=>w(!1))},E=async()=>{try{let e=await navigator.clipboard.readText();if(!e.trim()){v.error(`Clipboard is empty`);return}c(e),v.success(`Pasted redirect URL`)}catch{v.error(`Clipboard unavailable on this origin`)}};return(0,Q.jsx)(F,{open:!0,onClose:S,title:`Connect via OAuth`,size:`sm`,footer:(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,onClick:S,disabled:l.isPending,children:`Cancel`}),(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,onClick:T,disabled:l.isPending||C,title:`You already approved in the popup — check now instead of waiting`,children:C?`Checking…`:`Complete`}),(0,Q.jsx)(_,{variant:`primary`,size:`sm`,disabled:l.isPending||s.trim().length===0,onClick:()=>{let t=rr(s);if(`error`in t){v.error(`OAuth callback failed`,t.error);return}l.mutate({providerId:e,code:t.code,state:n},{onSuccess:()=>{r.close(),v.success(`Account connected`,`OAuth login completed successfully`),i(!0)},onError:e=>v.error(`OAuth callback failed`,e.message??`Invalid or expired authorization code`)})},children:l.isPending?`Connecting…`:`Connect`})]}),children:(0,Q.jsxs)(J,{gap:`14px`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2.5 px-3.5 py-2.5 rounded-card border border-inner-border bg-surface-2`,children:[(0,Q.jsx)(f,{size:16,className:`animate-spin text-accent shrink-0`}),(0,Q.jsx)(`span`,{className:`text-body font-semibold`,children:`Waiting for popup authorization…`})]}),(0,Q.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,Q.jsx)(`div`,{className:`text-body font-semibold text-text-primary`,children:`Step 1: Open this URL in your browser`}),(0,Q.jsxs)(Y,{gap:`8px`,children:[(0,Q.jsx)(`a`,{className:`min-w-0 flex-1 font-mono text-badge text-accent overflow-hidden text-ellipsis whitespace-nowrap px-2.5 py-2 rounded-control bg-input-bg border border-inner-border`,href:t,target:`_blank`,rel:`noreferrer`,title:t,children:t}),(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,icon:a?(0,Q.jsx)(g,{size:12}):(0,Q.jsx)(u,{size:12}),onClick:()=>{navigator.clipboard?.writeText(t),o(!0),d(()=>o(!1),1500)},className:`shrink-0`,children:a?`Copied`:`Copy`})]}),(0,Q.jsx)(`p`,{className:`text-badge leading-snug text-text-tertiary`,children:`A popup should open automatically. If it was blocked, open the URL above manually.`})]}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-2.5 text-micro font-bold uppercase tracking-label text-text-tertiary`,children:[(0,Q.jsx)(`span`,{"aria-hidden":`true`,className:`flex-1 h-px bg-inner-border`}),(0,Q.jsx)(`span`,{children:`Or complete manually`}),(0,Q.jsx)(`span`,{"aria-hidden":`true`,className:`flex-1 h-px bg-inner-border`})]}),(0,Q.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,Q.jsx)(`div`,{className:`text-body font-semibold text-text-primary`,children:`Step 2: Paste the redirect URL here`}),(0,Q.jsx)(`p`,{className:`text-badge leading-snug text-text-tertiary`,children:`If the redirect lands on an unreachable address, copy that page's full URL from your browser and paste it below — this works from any machine, not just localhost.`}),(0,Q.jsxs)(Y,{gap:`8px`,align:`flex-start`,children:[(0,Q.jsx)(`textarea`,{value:s,onChange:e=>c(e.target.value),placeholder:`http://127.0.0.1:59653/callback?code=…&state=… (or just the code)`,rows:2,spellCheck:!1,className:`w-full min-h-16 resize-y rounded-control border border-inner-border bg-input-bg px-2.5 py-2 font-mono text-badge text-text-primary box-border focus-visible:outline-2 focus-visible:outline-accent focus-visible:outline-offset-1 flex-1`}),(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,onClick:()=>void E(),className:`shrink-0`,children:`Paste`})]})]})]})})}function ar(e){try{return new URL(e).host}catch{return e}}function or({providerId:e,parameters:t,onClose:n}){let r=Be(),i=z(),[a,o]=(0,Z.useState)(null),[s,c]=(0,Z.useState)(!1),[l,d]=(0,Z.useState)(!1),p=mt();(0,Z.useEffect)(()=>{let i=!1;return r.mutate({providerId:e,...t===void 0||Object.keys(t).length===0?{}:{parameters:t}},{onSuccess:e=>{i||o(e)},onError:e=>{i||(v.error(`Failed to start device login`,e.message??`Unable to start device authorization`),n())}}),()=>{i=!0}},[]);let m=(0,Z.useRef)(null),[h,y]=(0,Z.useState)(!1);return(0,Z.useEffect)(()=>{if(!a)return;let e=window.open(a.verificationUri,`cartethyia-device`,`popup,width=720,height=820`);return e?m.current=e:y(!0),()=>{let e=m.current;m.current=null,e&&!e.closed&&e.close()}},[a]),(0,Z.useEffect)(()=>{if(!a)return;let t=Date.now(),r=Math.max(1,a.expiresInSeconds)*1e3,o=!1,s=Math.max(1,a.intervalSeconds)*1e3,c=!1,l=0,u=()=>window.clearTimeout(l),d=e=>{u(),l=window.setTimeout(f,e)},f=()=>{if(!c){if(Date.now()-t>r){u(),v.error(`Device login expired`,`Please try again.`),n();return}o||(o=!0,i.mutate({providerId:e,deviceAuthId:a.deviceAuthId},{onSuccess:e=>{if(o=!1,!c){if(e.status===`complete`){u();let e=m.current;e&&!e.closed&&e.close(),v.success(`OAuth account connected`,`Device authorization complete`),n()}else e.status===`failed`?(u(),v.error(`Device login failed`,e.reason),n()):e.status===`slow_down`?(s=(e.retryAfterSeconds===void 0?s+5e3:Math.max(1,e.retryAfterSeconds)*1e3)+1e3,d(s)):(e.status===`pending`&&e.retryAfterSeconds!==void 0&&(s=Math.max(1,e.retryAfterSeconds)*1e3+1e3),d(s))}},onError:()=>{o=!1,c||d(s)}}))}};return d(s+1e3),()=>{c=!0,u()}},[a]),(0,Q.jsx)(F,{open:!0,onClose:n,title:`Login with OAuth (device code)`,size:`sm`,footer:(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,onClick:n,children:`Cancel`}),null]}),children:(0,Q.jsx)(J,{gap:`14px`,children:a?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2.5 px-3.5 py-2.5 rounded-card border border-inner-border bg-surface-2`,children:[(0,Q.jsx)(f,{size:16,className:`animate-spin text-accent shrink-0`}),(0,Q.jsx)(`span`,{className:`text-body font-semibold`,children:`Waiting for authorization…`})]}),a.userCode?(0,Q.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,Q.jsx)(`div`,{className:`text-body font-semibold text-text-primary`,children:`Step 1: Enter this code`}),(0,Q.jsxs)(`div`,{className:`rounded-card border border-inner-border bg-surface-2 p-3.5 flex flex-col gap-1.5 items-center text-center`,children:[(0,Q.jsx)(`div`,{className:`text-micro font-bold uppercase tracking-label text-text-tertiary`,children:`Device code`}),(0,Q.jsx)(`div`,{className:`font-mono text-display font-bold tracking-code text-text-primary`,children:a.userCode}),(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,icon:l?(0,Q.jsx)(g,{size:12}):(0,Q.jsx)(u,{size:12}),onClick:()=>{navigator.clipboard?.writeText(a.userCode),d(!0),p(()=>d(!1),1500)},children:l?`Copied`:`Copy code`})]})]}):null,(0,Q.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,Q.jsx)(`div`,{className:`text-body font-semibold text-text-primary`,children:a.userCode?`Step 2: Open the verification page`:`Open the verification page to authorize`}),(0,Q.jsxs)(Y,{gap:`8px`,children:[(0,Q.jsx)(`a`,{className:`min-w-0 flex-1 font-mono text-badge text-accent overflow-hidden text-ellipsis whitespace-nowrap px-2.5 py-2 rounded-control bg-input-bg border border-inner-border`,href:a.verificationUri,target:`_blank`,rel:`noreferrer`,title:a.verificationUri,children:ar(a.verificationUri)}),(0,Q.jsx)(_,{variant:`primary`,size:`sm`,icon:(0,Q.jsx)(ze,{size:12}),onClick:()=>window.open(a.verificationUri,`_blank`,`noopener`),className:`shrink-0`,children:`Open`}),(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,icon:s?(0,Q.jsx)(g,{size:12}):(0,Q.jsx)(u,{size:12}),onClick:()=>{navigator.clipboard?.writeText(a.verificationUri),c(!0),p(()=>c(!1),1500)},className:`shrink-0`,children:s?`Copied`:`Copy`})]}),(0,Q.jsx)(`p`,{className:`text-badge leading-snug text-text-tertiary`,children:h?`The popup was blocked — open the page with Open above, finish signing in there, then press Check now.`:`The page opened in a popup. Finish signing in there — this dialog closes automatically once the account connects, or press Check now.`})]})]}):(0,Q.jsxs)(`div`,{className:`flex items-center gap-2.5 px-3.5 py-2.5 rounded-card border border-inner-border bg-surface-2`,children:[(0,Q.jsx)(f,{size:16,className:`animate-spin text-accent shrink-0`}),(0,Q.jsx)(`span`,{className:`text-body font-semibold`,children:`Starting device authorization…`})]})})})}function sr({providerId:e}){let[t,n]=(0,Z.useState)(!1),r=xe(e,t);return(0,Q.jsxs)(H,{children:[(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>n(e=>!e),"aria-expanded":t,className:`card-header-bar w-full cursor-pointer list-none text-left`,children:[(0,Q.jsxs)(`div`,{className:`card-header-left`,children:[(0,Q.jsx)(`div`,{className:`card-header-icon`,children:(0,Q.jsx)(i,{size:16,"aria-hidden":`true`})}),(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsx)(`div`,{className:`font-bold text-text-primary`,children:`Activity Matrix`}),(0,Q.jsxs)(`div`,{className:`text-caption text-text-secondary`,children:[`Daily token usage, last `,r.data?.days??30,` days · expand to load`]})]})]}),(0,Q.jsx)(`div`,{className:`card-header-right`,children:(0,Q.jsx)(Ee,{size:14,"aria-hidden":`true`,className:h(`transition-transform`,t&&`rotate-180`)})})]}),t?(0,Q.jsx)(yr,{matrix:r}):null]})}function cr(e){let t=new Map,n=new Map,r={requests:0,tokens:0,cachedTokens:0,costUsd:0};for(let i of e.rows){let e=t.get(i.day)??{tokens:0,models:new Map},a=i.inputTokens+i.outputTokens;e.tokens+=a;let o=i.model??`unknown`,s=e.models.get(o)??{tokens:0,requests:0};s.tokens+=a,s.requests+=i.requests,e.models.set(o,s),t.set(i.day,e);let c=n.get(o)??{tokens:0,requests:0};c.tokens+=a,c.requests+=i.requests,n.set(o,c),r.requests+=i.requests,r.tokens+=a,r.cachedTokens+=i.cachedInputTokens,r.costUsd+=i.costUsd}let i=Math.min(Math.max(e.days,1),366),a=new Date,o=Date.UTC(a.getUTCFullYear(),a.getUTCMonth(),a.getUTCDate()),s=[],c=[`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`,`Sun`],l=0;for(let e of t.values())l=Math.max(l,e.tokens);let u=new Date(o-(i-1)*864e5),d=(u.getUTCDay()+6)%7,f=u.getTime()-d*864e5,p=[];for(;;){if(f>o){if(p.length>0||s.length===0){for(;p.length<7;)p.push(null);s.push({cells:p})}break}let e=new Date(f),n=e.toISOString().slice(0,10),r=t.get(n),i=r?[...r.models.entries()].map(([e,t])=>({name:e,tokens:t.tokens,requests:t.requests,color:lr(e)})).sort((e,t)=>t.tokens-e.tokens):[],a=r?{day:n,label:`${c[(e.getUTCDay()+6)%7]} ${n.slice(5)}`,total:r.tokens,color:i[0]?.color??`var(--surface-2)`,models:i}:null;p.push(a),p.length===7&&(s.push({cells:p}),p=[]),f+=864e5}let m=[...n.entries()].map(([e,t])=>({name:e,tokens:t.tokens,requests:t.requests,color:lr(e)})).sort((e,t)=>t.tokens-e.tokens);return{weeks:s,maxDay:l,totals:r,models:m}}function lr(e){let t=5381;for(let n=0;n<e.length;n++)t=t*33^e.charCodeAt(n);let n=Math.abs(t)%360;return`hsl(${(n<60||n>110?n:n+130)%360} 65% 60%)`}function ur(e,t){if(e<=0||t<=0)return 0;let n=e/t,r=1;for(let e=1;e<dr.length;e++)n>e/(dr.length-1)&&(r=e);return Math.min(r,dr.length-1)}var dr=[0,.18,.38,.62,.9];function fr(e){return dr[Math.min(Math.max(Math.trunc(e),0),dr.length-1)]??0}function pr(e){let t=fr(e)*100;return t===0?`var(--surface-2)`:`color-mix(in srgb, var(--text-primary) ${t}%, transparent)`}function mr(e,t){if(t===0)return{backgroundColor:`var(--surface-2)`,borderColor:`var(--inner-border)`};let n=fr(t)*100;return{backgroundColor:`color-mix(in srgb, ${e.color} ${n}%, transparent)`,borderColor:`color-mix(in srgb, ${e.color} 45%, transparent)`}}function hr(e){return[`${e.label} — ${Ye(e.total)} tokens`,...e.models.map(t=>`• ${t.name}: ${Ye(t.tokens)} (${Math.round(t.tokens/e.total*100)}%) · ${t.requests} req`)].join(`
4
- `)}var gr=`26px repeat(7, minmax(0, 1fr))`,_r=420,vr=360;function yr({matrix:e}){let t=(0,Z.useMemo)(()=>e.data?cr(e.data):void 0,[e.data]),n;return n=e.isPending?(0,Q.jsx)(`p`,{className:`p-4 text-caption text-text-secondary`,children:`Loading activity…`}):e.isError?(0,Q.jsx)(`p`,{className:`p-4 text-caption text-status-danger`,children:`Failed to load activity matrix.`}):!t||t.totals.requests===0?(0,Q.jsx)(`p`,{className:`p-4 text-caption text-text-secondary`,children:`No usage recorded for this provider in the window.`}):(0,Q.jsx)(xr,{view:t}),(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:`border-t border-inner-border`,children:(0,Q.jsxs)(`div`,{className:`grid grid-cols-2 gap-4 p-4 max-small:p-3 min-[641px]:grid-cols-4`,children:[(0,Q.jsx)(br,{label:`Total tokens`,value:Ye(t?.totals.tokens)}),(0,Q.jsx)(br,{label:`Requests`,value:(t?.totals.requests??0).toLocaleString(`en-US`)}),(0,Q.jsx)(br,{label:`Cached`,value:Ye(t?.totals.cachedTokens)}),(0,Q.jsx)(br,{label:`Est. cost`,value:w(t?.totals.costUsd)})]})}),(0,Q.jsxs)(`div`,{className:`min-w-0 overflow-x-auto border-t border-inner-border p-4 max-small:p-3`,children:[n,t&&t.totals.requests>0?(0,Q.jsxs)(`div`,{className:`mt-3 flex items-center justify-end gap-1.5 text-micro text-text-tertiary`,children:[(0,Q.jsx)(`span`,{children:`Less`}),[0,1,2,3,4].map(e=>(0,Q.jsx)(`span`,{className:`size-3 rounded-micro border border-inner-border`,style:{backgroundColor:pr(e)}},e)),(0,Q.jsx)(`span`,{children:`More`})]}):null,t&&t.totals.requests>0&&t.models.length>0?(0,Q.jsxs)(`details`,{className:`group mt-4 border-t border-inner-border pt-3`,children:[(0,Q.jsxs)(`summary`,{className:`flex cursor-pointer list-none items-center justify-between gap-3 text-caption text-text-secondary [&::-webkit-details-marker]:hidden`,children:[(0,Q.jsxs)(`span`,{className:`font-semibold`,children:[`Usage by model (`,t.models.length,`) · sorted by tokens`]}),(0,Q.jsx)(Ee,{size:14,"aria-hidden":`true`,className:`shrink-0 transition-transform group-open:rotate-180`})]}),(0,Q.jsx)(`div`,{className:`mt-3 flex flex-col gap-2.5`,children:t.models.map(e=>{let n=t.totals.tokens>0?e.tokens/t.totals.tokens:0;return(0,Q.jsxs)(`div`,{className:`flex min-w-0 items-center gap-3`,children:[(0,Q.jsx)(`span`,{className:`min-w-0 shrink truncate text-caption font-semibold`,style:{color:e.color},title:e.name,children:e.name}),(0,Q.jsx)(`span`,{className:`h-2.5 min-w-0 flex-1 rounded-micro`,style:{backgroundColor:`var(--surface-2)`,backgroundImage:`linear-gradient(to right, ${e.color} ${Math.max(n*100,2)}%, transparent ${Math.max(n*100,2)}%)`}}),(0,Q.jsxs)(`span`,{className:`shrink-0 font-mono text-caption text-text-secondary`,children:[Ye(e.tokens),` `,(0,Q.jsxs)(`span`,{className:`text-text-tertiary`,children:[Math.round(n*100),`%`]}),` ·`,` `,e.requests.toLocaleString(`en-US`),` req`]})]},e.name)})})]}):null]})]})}function br({label:e,value:t}){return(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsx)(`div`,{className:`text-micro font-semibold uppercase tracking-label text-text-tertiary`,children:e}),(0,Q.jsx)(`div`,{className:`mt-0.5 font-mono text-lg font-bold text-text-primary`,children:t})]})}function xr({view:e}){return(0,Q.jsx)(`div`,{style:{minWidth:vr},children:(0,Q.jsxs)(`div`,{className:`grid gap-1`,style:{gridTemplateColumns:gr,maxWidth:_r},children:[(0,Q.jsx)(`div`,{}),[`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`,`Sun`].map(e=>(0,Q.jsx)(`div`,{className:`text-center text-micro text-text-tertiary`,children:e},e)),e.weeks.map((t,n)=>(0,Q.jsxs)(`div`,{className:`contents`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center text-micro text-text-tertiary`,children:[`W`,n+1]}),t.cells.map((t,r)=>t===null?(0,Q.jsx)(`div`,{},`${n}-${r}`):(0,Q.jsx)(`div`,{className:`aspect-square cursor-pointer rounded-micro border border-inner-border transition-[outline-offset] hover:outline hover:outline-2 hover:outline-accent`,style:mr(t,ur(t.total,e.maxDay)),title:hr(t)},t.day))]},n))]})})}function Sr(e){let t={};for(let n of e)t[n.key]=n.defaultValue??``;return t}function Cr(e,t){return e.filter(e=>e.required===!0&&(t[e.key]??``).trim().length===0).map(e=>e.key)}function wr({fields:e,values:t,onChange:n,idPrefix:r}){return e.length===0?null:(0,Q.jsx)(J,{gap:`10px`,children:e.map(e=>{let i=`${r}-${e.key}`,a=t[e.key]??``;return e.options&&e.options.length>0?(0,Q.jsx)(q,{id:i,label:e.label,value:a,onValueChange:t=>n(e.key,t),options:e.options.map(e=>({value:e.value,label:e.label}))},e.key):(0,Q.jsx)(K,{id:i,label:e.label,value:a,placeholder:e.placeholder??``,type:e.secret===!0?`password`:`text`,autoComplete:`off`,onChange:t=>n(e.key,t.target.value)},e.key)})})}function Tr({providerId:e,providerName:t,fields:n,onClose:r}){let i=B(),[a,o]=(0,Z.useState)(``),[s,c]=(0,Z.useState)(``),[l,u]=(0,Z.useState)(()=>Sr(n)),d=(0,Z.useMemo)(()=>Cr(n,l),[n,l]);return(0,Q.jsx)(F,{open:!0,onClose:r,title:`Import a ${t} credential`,size:`sm`,footer:(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,onClick:r,disabled:i.isPending,children:`Cancel`}),(0,Q.jsx)(_,{variant:`primary`,size:`sm`,onClick:()=>{if(a.trim().length===0){v.error(`Credential required`,`Paste the token, key or exported JSON to import.`);return}if(d.length>0){v.error(`Missing required fields`,`Fill in: ${d.join(`, `)}`);return}i.mutate({providerId:e,credential:a.trim(),...Object.keys(l).length>0?{fields:l}:{},...s.trim().length>0?{accountLabel:s.trim()}:{}},{onSuccess:()=>{v.success(`Account imported`,`The credential was validated and saved`),r()},onError:e=>v.error(`Import failed`,e.message??`The provider rejected this credential`)})},disabled:i.isPending,icon:i.isPending?(0,Q.jsx)(f,{size:13,className:`animate-spin`}):void 0,children:i.isPending?`Validating…`:`Import`})]}),children:(0,Q.jsxs)(J,{gap:`12px`,children:[(0,Q.jsxs)(`p`,{className:`text-badge leading-snug text-text-tertiary`,children:[`The credential is checked against `,t,` before it is saved, so one that no longer works is reported here instead of being stored.`]}),(0,Q.jsx)(wr,{fields:n,values:l,idPrefix:`import`,onChange:(e,t)=>u(n=>({...n,[e]:t}))}),(0,Q.jsx)(K,{id:`import-account-label`,label:`Account label`,hint:`optional`,value:s,placeholder:e,onChange:e=>c(e.target.value)}),(0,Q.jsx)(K,{id:`import-credential`,label:`Credential`,value:a,placeholder:`Paste the token, key, or exported JSON`,type:`password`,autoComplete:`off`,onChange:e=>o(e.target.value)})]})})}function Er(e,t,n){let r=n?.trim()??``,i=r.indexOf(` — `),a=i>0?r.slice(0,i):``,o=i>0?r.slice(i+3):r;return{title:`${e}/${t} probe failed${a.length>0?` via ${a}`:``}`,detail:o.length>0?o:`Unknown error`}}function Dr(e,t,n){let{title:r,detail:i}=Er(e,t,n);return[r,i]}function Or(e){return e===`builtin`?`Built-in model`:e===`auto_free`?`Free tier, discovered from the provider`:e===`discovered`?`Fetched from provider`:`Added manually`}function kr(e){return e===`auto_free`?`Free tier`:e===`discovered`?`Fetched`:`Manual`}var Ar=[{key:`builtin`,label:`Built-in models`,hint:`Compiled catalog — can be disabled, not deleted`,matches:e=>e===null||e===`builtin`},{key:`auto_free`,label:`Free models (auto)`,hint:`Discovered from the provider's free tier`,matches:e=>e===`auto_free`},{key:`manual`,label:`Manually added`,hint:`Added by hand from the Add Model dialog`,matches:e=>e===`manual`},{key:`fetched`,label:`Fetched from provider`,hint:`Listed by the provider's /v1/models`,matches:e=>e!==null&&e!==`builtin`&&e!==`auto_free`&&e!==`manual`}],jr={key:`disabled`,label:`Disabled models`,hint:`Turned off — not routable until re-enabled`};function Mr(){return wt.map(e=>({value:e,label:e===`auto`?`Thinking: auto`:e.charAt(0).toUpperCase()+e.slice(1)}))}function Nr({value:e,onChange:t,disabled:n,id:r=`probe-thinking-effort`}){return(0,Q.jsx)(`div`,{title:`Reasoning effort every test in this section sends. Auto leaves the model's own reasoning default in place.`,className:`min-w-74 shrink-0`,children:(0,Q.jsx)(q,{id:r,"aria-label":`Thinking effort`,value:e,disabled:n,onValueChange:e=>t(e),options:Mr()})})}function Pr({providerId:e,provider:t,onClose:n}){let r=Pe(),i=Ve(),[a,o]=(0,Z.useState)(``),s=t?.supportedWireFamilies,c=t?.wireFamilyDefault!==void 0&&(s===void 0||s.includes(t.wireFamilyDefault))?t.wireFamilyDefault:s?.[0],l=(0,Z.useMemo)(()=>{let e=[`chat`,`responses`,`messages`],t=(s??[]).filter(t=>e.includes(t));return[...t,...e.filter(e=>!t.includes(e))]},[s]),[u,d]=(0,Z.useState)(c??`chat`),[m,h]=(0,Z.useState)(`auto`),[g,y]=(0,Z.useState)(`idle`),[b,x]=(0,Z.useState)(``),[S,C]=(0,Z.useState)(Rr),w=a.trim(),T=w.toLowerCase().startsWith(`${e.toLowerCase()}/`)&&w.length>e.length+1?w.slice(e.length+1):w,E=T!==w,D=()=>{T&&(y(`testing`),x(``),r.mutate({providerId:e,request:{modelId:T,wireFamily:u,reasoningEffort:m,serviceKind:`llm`}},{onSuccess:e=>{e.ok?y(`passed`):(y(`failed`),x(e.error??`Model probe failed`))},onError:e=>{y(`failed`),x(e.message??`Model probe failed`)}}))};return(0,Q.jsx)(F,{open:!0,onClose:n,title:`Add Custom Model`,size:`sm`,footer:(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,onClick:n,disabled:i.isPending,children:`Cancel`}),(0,Q.jsx)(_,{variant:`primary`,size:`sm`,disabled:i.isPending||T.length===0,onClick:()=>{if(!T)return;let t=U(S.contextLimit),r=U(S.outputLimit);if(t===null||r===null){v.error(`Invalid limits`,`Use a token count such as 512k, 200000, or 1.5m.`);return}i.mutate({providerId:e,modelIds:[T],wireFamily:u,metadata:{contextLimit:t??null,outputLimit:r??null,passthrough:S.passthrough,image:S.passthrough?!0:S.image,reasoning:S.passthrough?!0:S.reasoning,toolCall:S.passthrough?!0:S.toolCall}},{onSuccess:()=>{v.success(`Custom model added`,`Sent to ${e}/${T}`),n()},onError:e=>v.error(`Failed to add model`,e.message??`Unable to register model`)})},children:i.isPending?`Adding...`:`Add Model`})]}),children:(0,Q.jsxs)(J,{gap:`10px`,children:[(0,Q.jsxs)(Y,{gap:`8px`,align:`flex-end`,children:[(0,Q.jsx)(K,{label:`Model ID`,autoFocus:!0,placeholder:`e.g. gpt-4o, free-model-id`,value:a,onChange:e=>{o(e.target.value),y(`idle`),x(``)},onKeyDown:e=>{e.key===`Enter`&&T.length>0&&D()},className:`flex-1`}),(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,icon:g===`testing`?(0,Q.jsx)(f,{size:13,className:`animate-spin`}):(0,Q.jsx)(p,{size:13}),disabled:r.isPending||T.length===0,onClick:D,className:`shrink-0`,children:g===`testing`?`Testing...`:`Test`})]}),E&&(0,Q.jsxs)(`div`,{className:`mt-1 text-badge text-text-tertiary`,children:[`Using `,(0,Q.jsx)(`span`,{className:`font-mono tabular-nums`,children:T}),` (provider prefix removed).`]}),(0,Q.jsx)(q,{label:`Wire family`,id:`add-model-wire-family`,value:u,onValueChange:e=>{d(e),y(`idle`),x(``)},options:l.map(e=>({value:e,label:Wr(e)}))}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`div`,{className:`text-badge font-semibold text-text-secondary mb-2`,children:`Thinking`}),(0,Q.jsx)(Nr,{id:`add-model-thinking-effort`,value:m,onChange:e=>{h(e),y(`idle`),x(``)},disabled:r.isPending}),(0,Q.jsx)(`div`,{className:`text-badge text-text-tertiary mt-2`,children:`Sent with the test. Auto leaves the model's own reasoning default in place.`})]}),(0,Q.jsx)(zr,{draft:S,onChange:C,idPrefix:`add-model`,disabled:i.isPending}),s!==void 0&&!s.includes(u)&&(0,Q.jsxs)(`div`,{className:`mt-1 text-badge text-text-tertiary`,children:[`This provider does not declare the`,` `,(0,Q.jsx)(`span`,{className:`font-mono tabular-nums`,children:Wr(u)}),` wire. The request is sent as chosen; the upstream decides whether it answers.`]}),g===`passed`&&(0,Q.jsx)(X,{tone:`success`,live:`status`,children:`Model test passed — ready to add.`}),g===`failed`&&(0,Q.jsx)(X,{tone:`danger`,live:`alert`,children:b||`Model test failed.`})]})})}function Fr(){return{contextLimit:``,outputLimit:``,passthrough:!1,image:!0,reasoning:!0,toolCall:!0}}var Ir=String(qe),Lr=String(We);function Rr(){return{...Fr(),contextLimit:Ir,outputLimit:Lr}}function zr({draft:e,onChange:t,idPrefix:n,disabled:r=!1}){let i=e.passthrough;return(0,Q.jsxs)(J,{gap:`10px`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`div`,{className:`text-badge font-semibold text-text-secondary mb-2`,children:`Limits`}),(0,Q.jsxs)(Y,{gap:`8px`,children:[(0,Q.jsx)(K,{label:`Context`,id:`${n}-context`,placeholder:Ir,value:e.contextLimit,disabled:r,onChange:n=>t({...e,contextLimit:n.target.value}),className:`flex-1`}),(0,Q.jsx)(K,{label:`Output`,id:`${n}-output`,placeholder:Lr,value:e.outputLimit,disabled:r,onChange:n=>t({...e,outputLimit:n.target.value}),className:`flex-1`})]}),(0,Q.jsxs)(`label`,{className:`inline-flex items-center gap-2 mt-2 text-badge text-text-secondary cursor-pointer`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,id:`${n}-fallback-limits`,checked:e.contextLimit===Ir&&e.outputLimit===Lr,disabled:r,onChange:n=>t(n.target.checked?{...e,contextLimit:Ir,outputLimit:Lr}:{...e,contextLimit:``,outputLimit:``})}),`Use fallback — `,Ge(qe),` ctx ·`,` `,Ge(We),` out`]})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`div`,{className:`text-badge font-semibold text-text-secondary mb-2`,children:`Capabilities`}),(0,Q.jsx)(J,{gap:`6px`,children:[[`image`,`Can image`,e.image],[`reasoning`,`Reasoning`,e.reasoning],[`toolCall`,`Tools`,e.toolCall]].map(([a,o,s])=>(0,Q.jsxs)(`label`,{className:`inline-flex items-center gap-2 text-badge text-text-secondary`,style:i?{opacity:.5}:void 0,children:[(0,Q.jsx)(`input`,{type:`checkbox`,id:`${n}-${a}`,checked:i?!0:s,disabled:r||i,onChange:n=>t({...e,[a]:n.target.checked})}),o]},a))}),(0,Q.jsxs)(`label`,{className:`inline-flex items-center gap-2 mt-2 text-badge text-text-secondary cursor-pointer`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,id:`${n}-passthrough`,checked:e.passthrough,disabled:r,onChange:n=>t({...e,passthrough:n.target.checked})}),`Passthrough — accept every capability`]}),i?(0,Q.jsx)(`div`,{className:`text-badge text-text-tertiary mt-2`,children:`Passthrough grants all of the above, so they are locked on. Uncheck it to restore your own choices.`}):null]})]})}function Br({providerId:e,model:t,onClose:n}){let r=ve(),[i,a]=(0,Z.useState)(()=>({contextLimit:t.contextLimit?String(t.contextLimit):``,outputLimit:t.outputLimit?String(t.outputLimit):``,passthrough:!1,image:t.vision===!0,reasoning:t.reasoning===!0,toolCall:t.toolCall===!0}));return(0,Q.jsx)(F,{open:!0,onClose:n,title:`Edit Model`,size:`sm`,footer:(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,onClick:n,disabled:r.isPending,children:`Cancel`}),(0,Q.jsx)(_,{variant:`primary`,size:`sm`,disabled:r.isPending,onClick:()=>{let a=U(i.contextLimit),o=U(i.outputLimit);if(a===null||o===null){v.error(`Invalid limits`,`Use a token count such as 512k, 200000, or 1.5m.`);return}r.mutate({providerId:e,modelId:t.modelId,route:t.route??``,metadata:{contextLimit:a??null,outputLimit:o??null,passthrough:i.passthrough,image:i.passthrough?!0:i.image,reasoning:i.passthrough?!0:i.reasoning,toolCall:i.passthrough?!0:i.toolCall}},{onSuccess:()=>n(),onError:e=>v.error(`Failed to update model`,e.message??`Unable to update model`)})},children:r.isPending?`Saving...`:`Save`})]}),children:(0,Q.jsxs)(J,{gap:`10px`,children:[(0,Q.jsxs)(`div`,{className:`text-badge text-text-tertiary`,children:[`Editing `,(0,Q.jsx)(`span`,{className:`font-mono tabular-nums`,children:t.modelId})]}),(0,Q.jsx)(zr,{draft:i,onChange:a,idPrefix:`edit-model`,disabled:r.isPending})]})})}function Vr({providerId:e,model:t,serviceKind:n,searchCapable:r,thinkingEffort:i,onDeleteRequest:a,onEditRequest:c,deletePending:l}){let d=Pe(),h=ye(),[y,w]=(0,Z.useState)(!1),[E,O]=(0,Z.useState)(null),k=mt(),A=n===`llm`?Tt(t.modelId,i===`auto`?null:i):t.modelId,j=`${e}/${A}`,M=n===`websearch`?`Searching…`:`Thinking…`,N=()=>{d.mutate({providerId:e,request:{modelId:t.modelId,route:t.route,...n===`llm`?{reasoningEffort:i}:{},serviceKind:n}},{onSuccess:t=>{if(O({ok:t.ok,latencyMs:t.latencyMs}),!t.ok){let{title:n,detail:r}=Er(e,A,t.error);v.error(n,r);return}let n=t.sample?.trim()??``,r=t.reportedModel?.trim()??``;v.successRich(`${A} · END ${m(t.latencyMs)}`,(0,Q.jsxs)(`span`,{className:`grid gap-2 min-w-0`,children:[r?(0,Q.jsxs)(Y,{gap:`6px`,align:`center`,className:`min-w-0`,children:[(0,Q.jsx)(T,{size:12,"aria-hidden":`true`,className:`shrink-0 text-text-tertiary`}),(0,Q.jsx)(`span`,{className:`truncate font-mono text-badge text-text-secondary`,title:r,children:r})]}):null,(0,Q.jsx)(`span`,{children:n||`No sample text in the response.`})]}),[r,n].filter(Boolean).join(`
5
- `)||`No sample text in the response.`)},onError:t=>{O({ok:!1,latencyMs:0}),v.error(...Dr(e,A,t.message))}})},ee=()=>{let n=!t.enabled;h.mutate({providerId:e,request:{modelId:t.modelId,route:t.route,enabled:n}},{onSuccess:()=>v.success(n?`Model enabled`:`Model disabled`,t.modelId),onError:e=>v.error(`Failed to update model`,e.message??`Unable to update model`)})};return(0,Q.jsx)(Q.Fragment,{children:(0,Q.jsxs)(`div`,{className:`model-card box-border flex w-full min-w-0 flex-1-auto flex-col gap-5 rounded-panel border border-inner-border p-6 ${t.enabled?`bg-surface-2`:`bg-surface-1 opacity-72`}`,children:[(0,Q.jsxs)(`div`,{className:`flex items-start gap-4 min-w-0`,children:[(0,Q.jsx)(`span`,{className:`inline-flex items-center justify-center w-13 h-13 rounded-inset bg-teal-soft text-teal shrink-0`,children:(0,Q.jsx)(o,{size:14})}),(0,Q.jsxs)(`div`,{className:`flex-1 min-w-0 flex flex-col gap-1`,children:[(0,Q.jsx)(`div`,{title:j,className:`font-mono tabular-nums min-w-0 truncate text-caption font-semibold leading-[1.35]`,children:A}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-3 min-w-0 text-micro text-text-tertiary`,children:[(0,Q.jsx)(`span`,{title:`${t.wireFamily} · ${t.route??e}`,className:`shrink-0 rounded-tiny px-3.5 py-0.5 text-micro font-bold`,style:{...Ur(t.wireFamily)},children:Wr(t.wireFamily)}),t.source!==null&&t.source!==`builtin`?(0,Q.jsx)(`span`,{title:Or(t.source),className:`shrink-0 rounded-pill border border-teal-soft px-3 py-0.5 text-micro font-bold tracking-[0.04em] text-teal`,children:kr(t.source)}):null,t.proOnly===!0?(0,Q.jsx)(`span`,{title:`Refused on a free plan. Nothing in the provider's model directory predicts it, so this comes from a real dispatch: the upstream answers that the model is not allowed for a free user type.`,className:`shrink-0 rounded-tiny border border-orange bg-orange-soft px-3.5 py-0.5 text-micro font-bold uppercase tracking-[0.04em] text-orange`,children:`Pro`}):null,t.freeTier===!0&&t.source!==`auto_free`?(0,Q.jsx)(`span`,{title:`Free on this provider's plan. Taken from the provider's own model directory, not a hardcoded list, so it tracks plan changes.`,className:`shrink-0 rounded-pill border border-teal-soft px-3 py-0.5 text-micro font-bold text-teal`,children:`Free tier`}):null,t.enabled?null:(0,Q.jsx)(`span`,{className:`shrink-0 rounded-pill bg-red-soft px-3 py-0.5 text-micro font-bold tracking-[0.04em] text-red`,children:`Off`})]})]}),(0,Q.jsx)(_,{variant:`ghost`,size:`sm`,icon:y?(0,Q.jsx)(g,{size:12}):(0,Q.jsx)(u,{size:12}),"aria-label":`Copy ${j}`,title:`Copy ${j}`,onClick:()=>{navigator.clipboard?.writeText(j),w(!0),k(()=>w(!1),1500)},className:`shrink-0 p-2 opacity-70`})]}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-3 min-w-0 text-badge text-text-secondary`,children:[(0,Q.jsxs)(`span`,{className:`inline-flex gap-2.5`,children:[t.reasoning?(0,Q.jsx)(`span`,{title:`Reasoning`,"aria-label":`Reasoning`,className:`inline-flex text-purple`,children:(0,Q.jsx)(s,{size:12})}):null,t.vision?(0,Q.jsx)(`span`,{title:`Vision`,"aria-label":`Vision`,className:`inline-flex text-status-info`,children:(0,Q.jsx)(D,{size:12})}):null,t.toolCall?(0,Q.jsx)(`span`,{title:`Tool calling`,"aria-label":`Tool calling`,className:`inline-flex text-orange`,children:(0,Q.jsx)(L,{size:12})}):null,r?(0,Q.jsx)(`span`,{title:`Web search`,"aria-label":`Web search`,className:`inline-flex text-teal`,children:(0,Q.jsx)(b,{size:12})}):null]}),(0,Q.jsxs)(`span`,{className:`whitespace-nowrap`,children:[t.limitsEstimated?(0,Q.jsx)(`span`,{title:Ke,"aria-label":`Limits are a fallback estimate`,className:`estimate-dot inline-flex items-center justify-center rounded-full border border-inner-border bg-surface-2 text-orange cursor-help mr-1 align-middle`,children:(0,Q.jsx)(S,{size:9,"aria-hidden":`true`})}):null,t.contextLimit?`${Ge(t.contextLimit)} ctx`:(0,Q.jsx)(`span`,{title:Je,className:`cursor-help`,children:`n/a ctx`}),t.outputLimit?` · ${Ge(t.outputLimit)} out`:(0,Q.jsx)(`span`,{title:Je,className:`cursor-help`,children:` · n/a out`})]}),c?(0,Q.jsx)(`button`,{type:`button`,className:`shrink-0 grid place-items-center w-6 h-6 p-0 border-0 bg-transparent text-text-tertiary cursor-pointer rounded-tiny hover:bg-inner-border hover:text-text-primary`,title:`Edit limits and capabilities`,"aria-label":`Edit ${t.modelId} limits and capabilities`,onClick:()=>c(t),children:(0,Q.jsx)(I,{size:11})}):null]}),(0,Q.jsxs)(`div`,{className:`flex gap-3 items-center flex-wrap`,children:[(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,disabled:d.isPending,onClick:N,"aria-label":`Test ${A}`,title:d.isPending?`Probing ${A}…`:E?.ok?`Last probe OK in ${m(E.latencyMs)} — click to re-test`:E?`Last probe failed — click to retry`:`Test ${A}`,className:`flex-1 justify-center`,icon:d.isPending?(0,Q.jsx)(f,{size:12,className:`animate-spin`}):E?E.ok?(0,Q.jsx)(`span`,{className:`inline-flex text-green`,children:(0,Q.jsx)(C,{size:12})}):(0,Q.jsx)(`span`,{className:`inline-flex text-red`,children:(0,Q.jsx)(x,{size:12})}):(0,Q.jsx)(p,{size:12}),children:d.isPending?M:E?.ok?m(E.latencyMs):E?`Fail`:`Test`}),(0,Q.jsx)(_,{variant:`ghost`,size:`sm`,disabled:h.isPending,onClick:ee,icon:t.enabled?(0,Q.jsx)(re,{size:12}):(0,Q.jsx)(_t,{size:12}),"aria-label":t.enabled?`Disable ${t.modelId}`:`Enable ${t.modelId}`,title:t.enabled?`Disable model`:`Enable model`,className:`flex-1 justify-center ${t.enabled?`text-red`:`text-green`}`,children:t.enabled?`Disable`:`Enable`}),t.source===`builtin`?null:(0,Q.jsx)(_,{variant:`ghost`,size:`sm`,disabled:l,onClick:()=>a(t),icon:(0,Q.jsx)(se,{size:12}),"aria-label":`Delete ${t.modelId}`,title:`Delete model`,className:`model-card-delete shrink-0 px-4 py-3 text-text-tertiary`})]})]})})}var Hr=(0,Z.memo)(Vr);function Ur(e){return e===`responses`?{color:`var(--purple)`,background:`var(--purple-soft)`}:e===`messages`?{color:`var(--orange)`,background:`color-mix(in srgb, var(--orange) 14%, transparent)`}:{color:`var(--teal)`,background:`var(--teal-soft)`}}function Wr(e){let t=e.toLowerCase();return t===`responses`?`Responses`:t===`messages`?`Messages`:`Chat`}function Gr({providerId:e,models:t,thinkingEffort:n,serviceKind:r=`llm`,searchCapable:i=!1}){let a=we(),[o,s]=(0,Z.useState)(null),[c,l]=(0,Z.useState)(null),u=e=>e.enabled!==!1,d=Ar.map(e=>({...e,rows:t.filter(t=>u(t)&&e.matches(t.source))})).filter(e=>e.rows.length>0),f=t.filter(e=>!u(e)),p=t=>(0,Q.jsx)(Hr,{providerId:e,model:t,serviceKind:r,searchCapable:i,thinkingEffort:n,deletePending:a.isPending,onDeleteRequest:s,onEditRequest:t.source===`builtin`?void 0:l},`${t.modelId}::${t.route}`);return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(J,{gap:`16px`,children:[d.map(e=>(0,Q.jsxs)(`section`,{className:`flex flex-col gap-4`,children:[(0,Q.jsxs)(`div`,{className:`flex items-baseline gap-4 min-w-0`,children:[(0,Q.jsx)(`span`,{className:`text-caption font-bold text-text-secondary`,children:e.label}),(0,Q.jsx)(`span`,{className:`mt-1 text-badge text-text-tertiary`,children:e.rows.length}),(0,Q.jsxs)(`span`,{title:e.hint,className:`text-micro text-text-tertiary overflow-hidden truncate`,children:[`· `,e.hint]})]}),(0,Q.jsx)(`div`,{className:`provider-grid grid gap-4 items-stretch`,children:e.rows.map(p)})]},e.key)),f.length===0?null:(0,Q.jsxs)(`section`,{className:`flex flex-col gap-4`,children:[(0,Q.jsxs)(`div`,{className:`flex items-baseline gap-4 min-w-0`,children:[(0,Q.jsx)(`span`,{className:`text-caption font-bold text-text-secondary`,children:jr.label}),(0,Q.jsx)(`span`,{className:`mt-1 text-badge text-text-tertiary`,children:f.length}),(0,Q.jsxs)(`span`,{title:jr.hint,className:`text-micro text-text-tertiary overflow-hidden truncate`,children:[`· `,jr.hint]})]}),(0,Q.jsx)(`div`,{className:`provider-grid grid gap-4 items-stretch`,children:f.map(p)})]})]}),(0,Q.jsx)(he,{open:o!==null,onClose:()=>{a.isPending||s(null)},onConfirm:async()=>{o!==null&&(await a.mutateAsync({providerId:e,request:{modelId:o.modelId,route:o.route}}),v.success(`Model deleted`,`${e}/${o.modelId}`),s(null))},title:`Delete model?`,message:`Delete ${e}/${o?.modelId??``} from the provider catalog?`,confirmLabel:`Delete`,danger:!0}),c===null?null:(0,Q.jsx)(Br,{providerId:e,model:c,onClose:()=>l(null)})]})}function Kr(e){return e===`llm`?`LLM`:e===`websearch`?`Search`:e===`imageGeneration`?`Image`:e===`videoGeneration`?`Video`:e}function qr(e){let t=e.serviceKinds;return Array.isArray(t)&&t.length>0?t:[`llm`]}function Jr(){let{providerId:e}=Me(),[t]=Ie(),n=e??``,r=t.get(`service`),[i,a]=(0,Z.useState)(r===`websearch`||r===`imageGeneration`||r===`videoGeneration`?r:`llm`),o=Oe(n),s=De(n),l=je(n),u=be(),f=be({silent:!0}),[p,m]=(0,Z.useState)(!1),h=Te(),g=_e(),y=ge(),x=ce(),[S,C]=(0,Z.useState)(!1),[w,T]=(0,Z.useState)(!1),E=Pe(),[D,O]=(0,Z.useState)(``),[ee,te]=(0,Z.useState)(``),[P,I]=(0,Z.useState)(null),ae=e=>`cartethyia:provider:${e}:thinking-effort`,oe=e=>{if(typeof window>`u`||!window.localStorage)return`auto`;let t=window.localStorage.getItem(ae(e));if(t===null)return`auto`;let n=t.trim().toLowerCase();return wt.includes(n)?n:`auto`},[L,le]=(0,Z.useState)(()=>oe(n));(0,Z.useEffect)(()=>{if(!n)return;let e=oe(n);e!==L&&le(e)},[n]),(0,Z.useEffect)(()=>{typeof window>`u`||!window.localStorage||!n||window.localStorage.setItem(ae(n),L)},[n,L]);let[ue,de]=(0,Z.useState)(!1),[fe,me]=(0,Z.useState)(!1),[ve,ye]=(0,Z.useState)(null),[xe,Se]=(0,Z.useState)({}),[Ce,we]=(0,Z.useState)({}),[z,Ee]=(0,Z.useState)(null),[ke,Ae]=(0,Z.useState)(!1),[Ne,Fe]=(0,Z.useState)(null),Le=(0,Z.useRef)(null),Re=(0,Z.useRef)(null);(0,Z.useEffect)(()=>()=>{let e=Le.current;Le.current=null,e&&!e.closed&&e.close()},[]);let B=o.data,Be=n===`opencode`||n===`cline`,Ve=B===void 0?[`llm`]:qr(B),Ue=[];for(let e of Ve)(e===`llm`||e===`websearch`||e===`imageGeneration`||e===`videoGeneration`)&&Ue.push(e);(0,Z.useEffect)(()=>{if(B===void 0)return;let e=r===`websearch`||r===`imageGeneration`||r===`videoGeneration`||r===`llm`?r:void 0,t=Ue[0];if(e!==void 0&&Ue.includes(e)){i!==e&&a(e);return}!Ue.includes(i)&&t!==void 0&&a(t)},[B,r,i,Ue.join(`|`)]),(0,Z.useEffect)(()=>{Be&&B!==void 0&&B.supportsModelDiscovery!==!1&&Re.current!==n&&(Re.current=n,f.mutate(n))},[Be,f,n,B?.supportsModelDiscovery]);let U=l.data??[],We=s.data??[],Ge=(()=>{let e=new Map;for(let t of We){let n=`${t.serviceKind??`llm`}:${t.modelId}`,r=e.get(n);if(!r)e.set(n,t);else{let i=r.contextLimit??0;(t.contextLimit??0)>i&&e.set(n,t)}}return[...e.values()].sort((e,t)=>e.modelId.localeCompare(t.modelId))})(),Ke=Ge.filter(e=>e.serviceKind===`llm`||e.serviceKind===void 0),qe=Ge.filter(e=>e.serviceKind===`websearch`),Je=Ge.filter(e=>e.serviceKind===`imageGeneration`),Ye=Ge.filter(e=>e.serviceKind===`videoGeneration`),W=Ue.includes(i)?i:Ue[0],G=ee||qe[0]?.modelId||``,K=()=>{let e=D.trim();G&&e&&(I(null),E.mutate({providerId:n,request:{modelId:G,serviceKind:`websearch`,prompt:e}},{onSuccess:e=>I({ok:e.ok,latencyMs:e.latencyMs,...e.searchResults?{results:e.searchResults,count:e.searchResults.length}:{},...e.error?{error:e.error}:{}}),onError:e=>I({ok:!1,error:e instanceof Error?e.message:`Search test failed`})}))};if(o.isPending)return(0,Q.jsx)(j,{label:`Loading provider...`});if(o.isError)return(0,Q.jsx)(A,{title:`Unable to load providers`,message:`The provider details could not be read, so this page cannot resolve its endpoint settings.`,onRetry:()=>void o.refetch(),retrying:o.isFetching,action:(0,Q.jsx)(Et,{to:`/providers`,label:`Back to providers`})});if(!B)return(0,Q.jsx)(M,{icon:(0,Q.jsx)(vt,{size:20}),title:`Provider not found`,message:`No provider named “${n}”. It may have been removed, or the link is stale.`,action:(0,Q.jsx)(Et,{to:`/providers`,label:`Back to providers`})});let q=U.filter(e=>e.status===`active`).length,Qe=e=>{let t=e===`browser`?B?.oauthFlows?.browserLoginFields??[]:B?.oauthFlows?.deviceLoginFields??[];if(t.length===0){e===`browser`?X():de(!0);return}Se(Sr(t)),ye(e)},$e=()=>{if(ve===null)return;let e=Cr(ve===`browser`?B?.oauthFlows?.browserLoginFields??[]:B?.oauthFlows?.deviceLoginFields??[],xe);if(e.length>0){v.error(`Missing required fields`,`Fill in: ${e.join(`, `)}`);return}let t=ve;ye(null),t===`browser`?X(xe):(we(xe),de(!0))},X=e=>{let t=Le.current;t&&!t.closed&&t.close();let r=`cartethyia-oauth-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,i=window.open(`about:blank`,r,`popup,width=720,height=820`);i&&(i.opener=null,Le.current=i),y.mutate({providerId:n,...e===void 0?{}:{parameters:e}},{onSuccess:({authorizeUrl:e,state:t})=>{let n=null;if(i&&!i.closed?(i.location.href=e,n=i):(n=window.open(e,r,`popup,width=720,height=820`),n&&(n.opener=null,Le.current=n)),!n){v.error(`Popup blocked`,`Allow popups to complete OAuth login.`);return}Fe({authorizeUrl:e,state:t,popup:n})},onError:e=>{i&&!i.closed&&i.close(),Le.current===i&&(Le.current=null),v.error(`Failed to start OAuth`,e.message??`Unable to start authorization`)}})};return(0,Q.jsxs)(J,{gap:`16px`,children:[(0,Q.jsx)(Dt,{title:`${B.label||B.displayName}${W?` (${Kr(W)})`:``}`,description:`${B.providerId}/${B.baseUrl?` · ${B.baseUrl}`:``}`,icon:(0,Q.jsx)(Xe,{icon:B.providerId,name:B.label||B.displayName,size:28}),back:{to:`/providers`,label:`Back to Providers`},actions:(0,Q.jsx)(Y,{gap:`8px`,className:`flex-wrap w-full max-w-full min-w-0`,children:B.isBuiltIn?(0,Q.jsx)(_,{variant:B.enabled?`danger`:`secondary`,icon:B.enabled?(0,Q.jsx)(re,{size:13}):(0,Q.jsx)(_t,{size:13}),loading:g.isPending,onClick:()=>g.mutate({providerId:n,enabled:!B.enabled},{onSuccess:e=>v.success(e.enabled?`Provider enabled`:`Provider disabled`,B.label||B.displayName),onError:e=>v.error(`Provider update failed`,e.message??`Unable to change provider availability`)}),title:B.enabled?`Disable provider globally`:`Enable provider globally`,children:B.enabled?`Disable`:`Enable`}):null})}),(0,Q.jsx)(rn,{provider:B}),B.isBuiltIn?null:(0,Q.jsx)(an,{provider:B}),W===`llm`?(0,Q.jsx)(Rt,{providerId:n,clientVersion:B.clientVersion,routeIdentityVersions:B.routeIdentityVersions,userAgentEditable:Ot(B)}):null,(0,Q.jsx)(sr,{providerId:n}),(0,Q.jsx)(`div`,{id:`provider-accounts`,tabIndex:-1,children:B.requiresAccount===!1&&U.length===0?(0,Q.jsxs)(H,{children:[(0,Q.jsx)(He,{title:`Accounts`,icon:(0,Q.jsx)(ht,{size:16})}),(0,Q.jsx)(V,{children:(0,Q.jsx)(`p`,{className:`text-caption text-text-secondary`,children:`This provider is a public, unauthenticated route — no account or credential is needed. Routing already works without any setup here.`})})]}):(0,Q.jsxs)(H,{children:[(0,Q.jsx)(He,{title:`Accounts`,subtitle:`${U.length} total · ${q} active · ${U.length-q} disabled`,icon:(0,Q.jsx)(ht,{size:16}),action:(0,Q.jsxs)(Ze,{children:[B.oauthFlows?.browser&&(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,icon:(0,Q.jsx)(ze,{size:13}),disabled:y.isPending,onClick:()=>Qe(`browser`),title:`Browser OAuth login — opens the provider authorize page in a popup`,children:y.isPending?`Starting...`:`Login with browser`}),B.oauthFlows?.device&&(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,icon:(0,Q.jsx)(N,{size:13}),onClick:()=>Qe(`device`),title:`Device-code login — enter the shown code on the provider site`,children:`Login with device code`}),B.oauthFlows?.import&&(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,icon:(0,Q.jsx)(d,{size:13}),onClick:()=>me(!0),title:B.oauthFlows.browser||B.oauthFlows.device||B.oauthFlows.refreshable?`Import a credential you already hold — a refresh token, an exported auth blob, or an API key`:`Add and validate an API key`,children:B.oauthFlows.browser||B.oauthFlows.device||B.oauthFlows.refreshable?`Import credential`:`Add API key`}),B.requiresAccount?(0,Q.jsx)(_,{variant:`primary`,size:`sm`,icon:(0,Q.jsx)(ne,{size:13}),onClick:()=>C(!0),children:`Add Account`}):null]})}),(0,Q.jsxs)(V,{className:`flex flex-col gap-5`,children:[(0,Q.jsx)($t,{providerId:n}),l.isPending?(0,Q.jsx)(j,{label:`Loading accounts...`}):l.isError?(0,Q.jsx)(A,{message:`Failed to load accounts`,onRetry:()=>l.refetch()}):U.length===0?(0,Q.jsx)(M,{title:`No accounts connected`,message:`Add an API key or OAuth credential to route requests to this provider.`}):(0,Q.jsx)(nr,{providerId:n,accounts:U,onDelete:e=>Ee(e),showGrokProbe:W===`llm`&&n===`grok`,grokProbePending:h.isPending,onGrokProbe:()=>{h.mutate({providerId:n,request:{modelId:`grok-4.6`,prompt:`reply my message with exact number 407`,stream:!0,serviceKind:`llm`}},{onSuccess:e=>{let t=e.results.filter(e=>e.ok).length,n=e.results.filter(e=>e.statusCode===202).length,r=e.results.length-t-n;v.success(`Grok account probe complete`,`${t} passed · ${n} returned 202 and were parked in cooldown · ${r} other failures`)},onError:e=>v.error(`Grok account probe failed`,e.message??`Unable to probe Grok accounts`)})}})]})]})}),W===`llm`?(0,Q.jsxs)(Q.Fragment,{children:[n===`inferhub`?(0,Q.jsx)(Xt,{}):null,(0,Q.jsxs)(H,{children:[(0,Q.jsx)(He,{title:`Models`,subtitle:`${Ke.length} model${Ke.length===1?``:`s`} registered`,icon:(0,Q.jsx)(c,{size:16}),action:(0,Q.jsxs)(Y,{gap:`6px`,className:`flex-wrap items-center`,children:[(0,Q.jsx)(Nr,{id:`models-section-thinking-effort`,value:L,onChange:le}),(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,icon:(0,Q.jsx)(ie,{size:13,className:u.isPending||f.isPending?`animate-spin`:``}),disabled:u.isPending||f.isPending,onClick:()=>u.mutate(n),children:u.isPending||f.isPending?`Fetching...`:`Fetch models`}),(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,icon:(0,Q.jsx)(se,{size:13,className:p?`animate-spin`:``}),disabled:u.isPending||f.isPending||p||Ke.filter(e=>e.source!==`builtin`&&e.source!==null).length===0,onClick:async()=>{let e=Ke.filter(e=>e.source!==`builtin`&&e.source!==null);if(e.length!==0&&confirm(`Delete ${e.length} fetched/manual model(s) for ${n}?`)){m(!0);try{let t=await pe(`/providers/${encodeURIComponent(n)}/models/bulk`,{method:`DELETE`,body:JSON.stringify({items:e.map(e=>({modelId:e.modelId,route:e.route}))})});await Promise.all([x.invalidateQueries({queryKey:R.providers.models(n)}),x.invalidateQueries({queryKey:R.providers.all})]);let r=t.failures.length;v.success(`Fetched models deleted`,r>0?`${t.deleted}/${t.total} removed, ${r} failed`:`${t.deleted}/${t.total} removed`)}catch(e){v.error(`Failed to delete fetched models`,e.message??`Unable to delete models`)}finally{m(!1)}}},children:p?`Deleting…`:`Delete fetched`}),(0,Q.jsx)(_,{variant:`primary`,size:`sm`,icon:(0,Q.jsx)(ne,{size:13}),onClick:()=>T(!0),children:`Add Model`})]})}),(0,Q.jsx)(V,{className:`flex flex-col gap-8`,children:s.isPending?(0,Q.jsx)(j,{label:`Loading models...`}):s.isError?(0,Q.jsx)(A,{message:`Failed to load models`,onRetry:()=>s.refetch()}):Ke.length===0?(0,Q.jsx)(M,{title:`No LLM models found`,message:`No LLM models published by this provider yet. Sync or add a custom model above.`}):(0,Q.jsx)(Gr,{providerId:n,models:Ke,serviceKind:`llm`,thinkingEffort:L,searchCapable:B?.supportsWebSearch===!0})})]})]}):W===`websearch`?(0,Q.jsxs)(H,{children:[(0,Q.jsx)(He,{title:`Web Search`,subtitle:`Run a real search request through the selected provider.`,icon:(0,Q.jsx)(b,{size:16})}),(0,Q.jsx)(V,{className:`flex flex-col gap-6`,children:s.isPending?(0,Q.jsx)(j,{label:`Loading search models...`}):s.isError?(0,Q.jsx)(A,{message:`Failed to load search models`,onRetry:()=>s.refetch()}):qe.length===0?(0,Q.jsx)(M,{title:`No Search models found`,message:`This provider advertises Search, but no websearch model is registered yet.`}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`label`,{className:`flex flex-col gap-2.5 text-badge text-text-secondary`,children:[`Search model`,(0,Q.jsx)(`select`,{value:G,onChange:e=>{te(e.target.value),I(null)},className:`w-full min-h-17 rounded-inset border border-inner-border bg-surface-1 text-text-primary px-4.5 py-0`,children:qe.map(e=>(0,Q.jsx)(`option`,{value:e.modelId,children:e.modelId},`${e.modelId}:${e.route}`))})]}),(0,Q.jsxs)(`label`,{className:`flex flex-col gap-2.5 text-badge text-text-secondary`,children:[`Query`,(0,Q.jsx)(`input`,{value:D,onChange:e=>O(e.target.value),onKeyDown:e=>{e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),K())},placeholder:`What is the latest news about AI?`,className:`w-full min-h-17 rounded-inset border border-inner-border bg-surface-1 text-text-primary px-4.5 py-0`})]}),(0,Q.jsxs)(Y,{gap:`8px`,className:`items-center flex-wrap`,children:[(0,Q.jsx)(_,{variant:`primary`,size:`sm`,disabled:E.isPending||D.trim().length===0,loading:E.isPending,onClick:K,children:`Test search`}),P?(0,Q.jsx)(`span`,{className:`text-badge`,style:{color:P.ok?`var(--green)`:`var(--red)`},children:P.ok?`Search ok · ${P.latencyMs}ms · ${P.count??0} result(s)`:P.error??`Search failed.`}):null]}),P&&P.results&&P.results.length>0?(0,Q.jsx)(`div`,{className:`flex max-h-110 flex-col gap-4 overflow-y-auto rounded-inset border border-inner-border bg-surface-1 p-4`,children:P.results.map((e,t)=>(0,Q.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,Q.jsx)(`a`,{href:e.url,target:`_blank`,rel:`noreferrer`,className:`text-caption text-text-primary font-semibold`,children:e.title||e.url}),(0,Q.jsx)(`span`,{className:`text-badge text-text-tertiary break-all`,children:e.url}),e.snippet?(0,Q.jsx)(`span`,{className:`text-badge text-text-secondary`,children:e.snippet}):null]},`${e.url}:${t}`))}):null]})})]}):W===`imageGeneration`||W===`videoGeneration`?(0,Q.jsxs)(H,{children:[(0,Q.jsx)(He,{title:Kr(W),subtitle:W===`imageGeneration`?`Models that return an image rather than text.`:`Models that return a video. Wired and routable; not yet verified against a live account.`,icon:W===`imageGeneration`?(0,Q.jsx)(k,{size:16}):(0,Q.jsx)(St,{size:16})}),(0,Q.jsx)(V,{className:`flex flex-col gap-6`,children:s.isPending?(0,Q.jsx)(j,{label:`Loading ${Kr(W).toLowerCase()} models...`}):s.isError?(0,Q.jsx)(A,{message:`Failed to load ${Kr(W).toLowerCase()} models`,onRetry:()=>s.refetch()}):(W===`imageGeneration`?Je:Ye).length===0?(0,Q.jsx)(M,{title:`No ${Kr(W)} models found`,message:`This provider advertises ${Kr(W)}, but no ${W} model is registered yet.`}):(0,Q.jsx)(Gr,{providerId:n,models:W===`imageGeneration`?Je:Ye,serviceKind:`llm`,searchCapable:!1,thinkingEffort:`auto`})})]}):(0,Q.jsx)(H,{children:(0,Q.jsx)(V,{children:(0,Q.jsx)(M,{title:`Service not available`,message:`This provider advertises ${Ve.map(Kr).join(`, `)}, but the dashboard has no controls for the selected service yet.`})})}),S&&(0,Q.jsx)(Qn,{providerId:n,accounts:U,onClose:()=>C(!1)}),W===`llm`&&w?(0,Q.jsx)(Pr,{providerId:n,provider:B,onClose:()=>T(!1)}):null,(0,Q.jsx)(he,{open:z!==null,onClose:()=>{ke||Ee(null)},onConfirm:async()=>{if(z){Ae(!0);try{let e=z.tenantId===null?`/global/accounts/${encodeURIComponent(z.id)}`:`/accounts/${encodeURIComponent(z.id)}`;await pe(e,{method:`DELETE`}),x.removeQueries({queryKey:R.quota.account(z.id),exact:!0}),await Promise.all([x.invalidateQueries({queryKey:R.providers.accounts(n)}),x.invalidateQueries({queryKey:R.providers.healthEvents(n,z.id)}),x.invalidateQueries({queryKey:R.providers.all}),x.invalidateQueries({queryKey:R.quota.all})]),v.success(`Account deleted`,z.label||z.id.slice(0,8)),Ee(null)}catch(e){throw v.error(`Failed to delete account`,e.message??`Unable to delete account`),e}finally{Ae(!1)}}},title:`Delete account?`,message:`Delete "${z?.label||z?.id.slice(0,8)}"? This cannot be undone.`,confirmLabel:`Delete`,danger:!0}),ue&&(0,Q.jsx)(or,{providerId:n,parameters:Ce,onClose:()=>{de(!1),we({})}}),ve!==null&&(0,Q.jsx)(F,{open:!0,onClose:()=>ye(null),title:ve===`browser`?`Sign in with`:`Device sign-in details`,size:`sm`,footer:(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(_,{variant:`secondary`,size:`sm`,onClick:()=>ye(null),children:`Cancel`}),(0,Q.jsx)(_,{variant:`primary`,size:`sm`,onClick:$e,children:`Continue`})]}),children:(0,Q.jsxs)(J,{gap:`12px`,children:[(0,Q.jsx)(`p`,{className:`text-badge leading-snug text-text-tertiary`,children:ve===`browser`?`Choose how ${B.label||B.displayName} should identify you, then continue to its sign-in page.`:`These decide which organization the device code is issued for.`}),(0,Q.jsx)(wr,{fields:ve===`browser`?B?.oauthFlows?.browserLoginFields??[]:B?.oauthFlows?.deviceLoginFields??[],values:xe,idPrefix:`flow-${ve}`,onChange:(e,t)=>Se(n=>({...n,[e]:t}))})]})}),fe&&B?.oauthFlows?.import===!0&&(0,Q.jsx)(Tr,{providerId:n,providerName:B.label||B.displayName,fields:B.oauthFlows.importFields,onClose:()=>me(!1)}),Ne&&(0,Q.jsx)(ir,{providerId:n,authorizeUrl:Ne.authorizeUrl,state:Ne.state,popup:Ne.popup,onClose:e=>{Le.current=null,Fe(null),e&&x.invalidateQueries({queryKey:R.providers.accounts(n)})}})]})}export{Jr as default};
@@ -1 +0,0 @@
1
- import{o as e,r as t,t as n}from"./jsx-runtime-CXUMngI_.js";var r=e(t(),1),i=n(),a=new Set,o={claude:{file:`claude-code`,ext:`svg`},anthropic:{file:`anthropics`,ext:`webp`},openai:{file:`openai-light`,ext:`svg`},codex:{file:`codex`,ext:`webp`},opencode:{file:`opencode`,ext:`webp`},"opencode-zen":{file:`opencode`,ext:`webp`},"opencode-go":{file:`opencode-go`,ext:`webp`},"google-antigravity":{file:`antigravity`,ext:`svg`},antigravity:{file:`antigravity`,ext:`svg`},blackbox:{file:`blackbox`,ext:`svg`},blackboxai:{file:`blackbox`,ext:`svg`},grok:{file:`grok-build`,ext:`webp`},"grok-build":{file:`grok-build`,ext:`webp`},xai:{file:`grok-build`,ext:`webp`},inferhub:{file:`inferhub`,ext:`svg`},gemini:{file:`gemini`,ext:`webp`},alibaba:{file:`alibaba`,ext:`svg`},alibabacp:{file:`alibaba`,ext:`svg`},dashscope:{file:`alibaba`,ext:`svg`},fireworks:{file:`fireworks`,ext:`webp`},exa:{file:`exa`,ext:`svg`},perplexity:{file:`perplexity`,ext:`webp`},tokenharbor:{file:`tokenharbor`,ext:`svg`},aihubmix:{file:`aihubmix`,ext:`svg`},zcode:{file:`zai-coding-plan`,ext:`svg`},"kimi-code":{file:`kimi-code`,ext:`webp`},kimi:{file:`kimi-code`,ext:`webp`},github:{file:`github`,ext:`webp`},copilot:{file:`copilot`,ext:`webp`},xiaomipg:{file:`mimo`,ext:`webp`},xiaomitp:{file:`mimo`,ext:`webp`},mimo:{file:`mimo`,ext:`webp`},cb:{file:`codebuddy`,ext:`webp`},cbcn:{file:`codebuddy`,ext:`webp`},workbuddy:{file:`codebuddy`,ext:`webp`},workbuddycn:{file:`codebuddy`,ext:`webp`},agentrouter:{file:`agentrouter`,ext:`svg`},parallel:{file:`parallel`,ext:`svg`},gmi:{file:`gmi-cloud`,ext:`svg`},hermes:{file:`hermes`,ext:`webp`},nous:{file:`nous-research`,ext:`svg`},inception:{file:`inception`,ext:`svg`},bai:{file:`bai`,ext:`svg`},cline:{file:`cline`,ext:`webp`},cerebras:{file:`cerebras`,ext:`webp`},qoder:{file:`qoder`,ext:`webp`},qodercn:{file:`qoder`,ext:`webp`},mistral:{file:`mistral`,ext:`webp`},muse:{file:`muse`,ext:`svg`},meta:{file:`muse`,ext:`svg`},openrouter:{file:`openrouter`,ext:`webp`},ollama:{file:`ollama`,ext:`webp`},ollamacloud:{file:`ollama-cloud`,ext:`webp`},nvidia:{file:`nvidia`,ext:`webp`},deepseek:{file:`deepseek`,ext:`webp`},"deepseek-tui":{file:`deepseek-tui`,ext:`webp`},droid:{file:`droid`,ext:`webp`},jcode:{file:`jcode`,ext:`webp`},kilo:{file:`kilocode`,ext:`webp`},"kilo-gateway":{file:`kilocode-gateway`,ext:`webp`},openclaw:{file:`openclaw`,ext:`webp`},cowork:{file:`claude`,ext:`webp`},roo:{file:`roo`,ext:`webp`},continue:{file:`continue`,ext:`webp`},amp:{file:`amp`,ext:`webp`},qwen:{file:`qwen`,ext:`webp`},kiro:{file:`kiro`,ext:`webp`},kimchi:{file:`kimchi`,ext:`webp`},commandcode:{file:`commandcode`,ext:`webp`},cursor:{file:`cursor`,ext:`webp`},trae:{file:`trae`,ext:`webp`},traecn:{file:`trae`,ext:`webp`}};function s(e){let t=e.toLowerCase().trim();return o[t]??{file:t,ext:`webp`}}function c(e){let t=e.trim().split(/[\s-]+/).filter(Boolean);return t.length>=2?(t[0][0]+t[1][0]).toUpperCase():e.slice(0,2).toUpperCase()}var l=(0,r.memo)(function({icon:e,name:t,size:n=32,imageSize:o,style:l,className:u}){let[d,f]=(0,r.useState)(()=>a.has(e)),p=s(e),m=o??n;return(0,i.jsx)(`div`,{className:u,style:{width:`${n}px`,height:`${n}px`,borderRadius:`8px`,background:`var(--surface-2)`,display:`grid`,placeItems:`center`,flexShrink:0,overflow:`hidden`,border:`1px solid var(--inner-border)`,...l},role:`img`,"aria-label":`${t} provider`,children:d?(0,i.jsx)(`span`,{style:{fontSize:`${Math.max(10,Math.floor(n*.35))}px`,fontWeight:700,color:`var(--text-secondary)`},children:c(t)}):(0,i.jsx)(`img`,{src:`/assets/providers/${p.file}.${p.ext}`,alt:``,width:m,height:m,loading:`lazy`,decoding:`async`,style:{width:`${m}px`,height:`${m}px`,objectFit:`contain`,padding:p.ext===`svg`?`1px`:`2px`},onError:()=>{a.add(e),f(!0)}})})});export{l as t};