switchboard-router 0.9.39 → 0.9.42

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 (393) hide show
  1. package/app/.next/static/chunks/{1321-227ff10ac053e663.js → 1321-b1d92a764bdc4978.js} +1 -1
  2. package/app/.next-cli-build/BUILD_ID +1 -1
  3. package/app/.next-cli-build/app-path-routes-manifest.json +11 -11
  4. package/app/.next-cli-build/build-manifest.json +2 -2
  5. package/app/.next-cli-build/prerender-manifest.json +3 -3
  6. package/app/.next-cli-build/server/app/(dashboard)/dashboard/agent-library/page.js +1 -1
  7. package/app/.next-cli-build/server/app/(dashboard)/dashboard/agent-library/page.js.nft.json +1 -1
  8. package/app/.next-cli-build/server/app/(dashboard)/dashboard/agent-library/page_client-reference-manifest.js +1 -1
  9. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js +1 -1
  10. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
  11. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  12. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
  13. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  14. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  15. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  16. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
  17. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  18. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/routing/page.js +1 -1
  19. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/routing/page.js.nft.json +1 -1
  20. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/routing/page_client-reference-manifest.js +1 -1
  21. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js +1 -1
  22. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
  23. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  24. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js +1 -1
  25. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  26. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  27. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js +1 -1
  28. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
  29. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  30. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js +1 -1
  31. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +1 -1
  32. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  33. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +1 -1
  34. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js.nft.json +1 -1
  35. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  36. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/page.js +1 -1
  37. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/page.js.nft.json +1 -1
  38. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/page_client-reference-manifest.js +1 -1
  39. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js +1 -1
  40. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js.nft.json +1 -1
  41. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  42. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
  43. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  44. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  45. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  46. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js +1 -1
  47. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
  48. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  49. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
  50. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  51. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js +1 -1
  52. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
  53. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  54. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js +1 -1
  55. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
  56. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  57. package/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page.js +1 -1
  58. package/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page.js.nft.json +1 -1
  59. package/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -1
  60. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js +1 -1
  61. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
  62. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  63. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/[id]/page.js +1 -1
  64. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/[id]/page.js.nft.json +1 -1
  65. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/[id]/page_client-reference-manifest.js +1 -1
  66. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js +1 -1
  67. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js.nft.json +1 -1
  68. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  69. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page.js +1 -1
  70. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page.js.nft.json +1 -1
  71. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  72. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js +1 -1
  73. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
  74. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  75. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js +1 -1
  76. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
  77. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  78. package/app/.next-cli-build/server/app/_global-error/page.js.nft.json +1 -1
  79. package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  80. package/app/.next-cli-build/server/app/_global-error.html +1 -1
  81. package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  82. package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  83. package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  84. package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  85. package/app/.next-cli-build/server/app/_not-found/page.js.nft.json +1 -1
  86. package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  87. package/app/.next-cli-build/server/app/_not-found.html +1 -1
  88. package/app/.next-cli-build/server/app/_not-found.rsc +3 -3
  89. package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +3 -3
  90. package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +3 -3
  91. package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  92. package/app/.next-cli-build/server/app/api/agent-library/catalog/route.js.nft.json +1 -1
  93. package/app/.next-cli-build/server/app/api/agent-library/doctor/route.js.nft.json +1 -1
  94. package/app/.next-cli-build/server/app/api/agent-library/export/route.js.nft.json +1 -1
  95. package/app/.next-cli-build/server/app/api/agent-library/mcp/route.js.nft.json +1 -1
  96. package/app/.next-cli-build/server/app/api/agent-library/route.js.nft.json +1 -1
  97. package/app/.next-cli-build/server/app/api/agent-library/skills/route.js.nft.json +1 -1
  98. package/app/.next-cli-build/server/app/api/agent-library/sync/route.js.nft.json +1 -1
  99. package/app/.next-cli-build/server/app/api/agent-library/updates/route.js.nft.json +1 -1
  100. package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
  101. package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
  102. package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
  103. package/app/.next-cli-build/server/app/api/cli-tools/aider-settings/route.js +2 -2
  104. package/app/.next-cli-build/server/app/api/cli-tools/aider-settings/route.js.nft.json +1 -1
  105. package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js +5 -5
  106. package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
  107. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js +1 -1
  108. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  109. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
  110. package/app/.next-cli-build/server/app/api/cli-tools/claude-full-catalog/route.js.nft.json +1 -1
  111. package/app/.next-cli-build/server/app/api/cli-tools/claude-picker-labels/route.js.nft.json +1 -1
  112. package/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -1
  113. package/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js +2 -2
  114. package/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js.nft.json +1 -1
  115. package/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js +1 -1
  116. package/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -1
  117. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js +1 -1
  118. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js.nft.json +1 -1
  119. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js +2 -2
  120. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js.nft.json +1 -1
  121. package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js +1 -1
  122. package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
  123. package/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js +2 -2
  124. package/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js.nft.json +1 -1
  125. package/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js +2 -2
  126. package/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -1
  127. package/app/.next-cli-build/server/app/api/cli-tools/gemini-cli-settings/route.js +2 -2
  128. package/app/.next-cli-build/server/app/api/cli-tools/gemini-cli-settings/route.js.nft.json +1 -1
  129. package/app/.next-cli-build/server/app/api/cli-tools/grok-settings/route.js +2 -2
  130. package/app/.next-cli-build/server/app/api/cli-tools/grok-settings/route.js.nft.json +1 -1
  131. package/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js +2 -2
  132. package/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js.nft.json +1 -1
  133. package/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js +1 -1
  134. package/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js.nft.json +1 -1
  135. package/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js +2 -2
  136. package/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js.nft.json +1 -1
  137. package/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js +2 -2
  138. package/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -1
  139. package/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js +1 -1
  140. package/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -1
  141. package/app/.next-cli-build/server/app/api/cli-tools/pi-settings/route.js +1 -1
  142. package/app/.next-cli-build/server/app/api/cli-tools/pi-settings/route.js.nft.json +1 -1
  143. package/app/.next-cli-build/server/app/api/cli-tools/picker-labels/route.js.nft.json +1 -1
  144. package/app/.next-cli-build/server/app/api/combos/[id]/route.js +1 -1
  145. package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
  146. package/app/.next-cli-build/server/app/api/combos/route.js +1 -1
  147. package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
  148. package/app/.next-cli-build/server/app/api/headroom/extras/route.js.nft.json +1 -1
  149. package/app/.next-cli-build/server/app/api/headroom/proxy/[...path]/route.js.nft.json +1 -1
  150. package/app/.next-cli-build/server/app/api/headroom/restart/route.js.nft.json +1 -1
  151. package/app/.next-cli-build/server/app/api/headroom/start/route.js.nft.json +1 -1
  152. package/app/.next-cli-build/server/app/api/headroom/status/route.js.nft.json +1 -1
  153. package/app/.next-cli-build/server/app/api/headroom/stop/route.js.nft.json +1 -1
  154. package/app/.next-cli-build/server/app/api/health/route.js.nft.json +1 -1
  155. package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
  156. package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
  157. package/app/.next-cli-build/server/app/api/locale/route.js.nft.json +1 -1
  158. package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
  159. package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
  160. package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
  161. package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
  162. package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
  163. package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
  164. package/app/.next-cli-build/server/app/api/media-providers/tts/voices/route.js.nft.json +1 -1
  165. package/app/.next-cli-build/server/app/api/mgmt/v1/combos/[id]/route.js +1 -1
  166. package/app/.next-cli-build/server/app/api/mgmt/v1/combos/[id]/route.js.nft.json +1 -1
  167. package/app/.next-cli-build/server/app/api/mgmt/v1/combos/[id]/strategy/route.js +1 -1
  168. package/app/.next-cli-build/server/app/api/mgmt/v1/combos/[id]/strategy/route.js.nft.json +1 -1
  169. package/app/.next-cli-build/server/app/api/mgmt/v1/combos/route.js +1 -1
  170. package/app/.next-cli-build/server/app/api/mgmt/v1/combos/route.js.nft.json +1 -1
  171. package/app/.next-cli-build/server/app/api/mgmt/v1/health/route.js.nft.json +1 -1
  172. package/app/.next-cli-build/server/app/api/mgmt/v1/metrics/route.js.nft.json +1 -1
  173. package/app/.next-cli-build/server/app/api/mgmt/v1/providers/route.js.nft.json +1 -1
  174. package/app/.next-cli-build/server/app/api/mgmt/v1/routing/route.js.nft.json +1 -1
  175. package/app/.next-cli-build/server/app/api/mgmt/v1/usage/route.js.nft.json +1 -1
  176. package/app/.next-cli-build/server/app/api/mgmt/v1/version/route.js.nft.json +1 -1
  177. package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
  178. package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
  179. package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
  180. package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
  181. package/app/.next-cli-build/server/app/api/models/routable/route.js +1 -1
  182. package/app/.next-cli-build/server/app/api/models/routable/route.js.nft.json +1 -1
  183. package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
  184. package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
  185. package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  186. package/app/.next-cli-build/server/app/api/oauth/codex/bulk-import/route.js.nft.json +1 -1
  187. package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
  188. package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
  189. package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
  190. package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
  191. package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
  192. package/app/.next-cli-build/server/app/api/oauth/kiro/api-key/route.js.nft.json +1 -1
  193. package/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -1
  194. package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
  195. package/app/.next-cli-build/server/app/api/oauth/kiro/import-cli-proxy/route.js.nft.json +1 -1
  196. package/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js.nft.json +1 -1
  197. package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
  198. package/app/.next-cli-build/server/app/api/pricing/defaults/route.js.nft.json +1 -1
  199. package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
  200. package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
  201. package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
  202. package/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js.nft.json +1 -1
  203. package/app/.next-cli-build/server/app/api/providers/[id]/model-probes/batch/route.js.nft.json +1 -1
  204. package/app/.next-cli-build/server/app/api/providers/[id]/model-probes/cache/route.js.nft.json +1 -1
  205. package/app/.next-cli-build/server/app/api/providers/[id]/model-probes/prepare/route.js.nft.json +1 -1
  206. package/app/.next-cli-build/server/app/api/providers/[id]/model-probes/remove-unavailable/route.js.nft.json +1 -1
  207. package/app/.next-cli-build/server/app/api/providers/[id]/model-probes/route.js.nft.json +1 -1
  208. package/app/.next-cli-build/server/app/api/providers/[id]/model-probes/verify/cancel/route.js.nft.json +1 -1
  209. package/app/.next-cli-build/server/app/api/providers/[id]/model-probes/verify/start/route.js.nft.json +1 -1
  210. package/app/.next-cli-build/server/app/api/providers/[id]/model-probes/verify/status/route.js.nft.json +1 -1
  211. package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js +1 -1
  212. package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  213. package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
  214. package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  215. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
  216. package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
  217. package/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js.nft.json +1 -1
  218. package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
  219. package/app/.next-cli-build/server/app/api/providers/suggested-models/route.js.nft.json +1 -1
  220. package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  221. package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
  222. package/app/.next-cli-build/server/app/api/pxpipe/health/route.js.nft.json +1 -1
  223. package/app/.next-cli-build/server/app/api/pxpipe/install/route.js.nft.json +1 -1
  224. package/app/.next-cli-build/server/app/api/pxpipe/logs/route.js.nft.json +1 -1
  225. package/app/.next-cli-build/server/app/api/pxpipe/restart/route.js.nft.json +1 -1
  226. package/app/.next-cli-build/server/app/api/pxpipe/start/route.js.nft.json +1 -1
  227. package/app/.next-cli-build/server/app/api/pxpipe/stats/route.js.nft.json +1 -1
  228. package/app/.next-cli-build/server/app/api/pxpipe/status/route.js.nft.json +1 -1
  229. package/app/.next-cli-build/server/app/api/pxpipe/stop/route.js.nft.json +1 -1
  230. package/app/.next-cli-build/server/app/api/routing/feedback/route.js.nft.json +1 -1
  231. package/app/.next-cli-build/server/app/api/routing/insights/route.js.nft.json +1 -1
  232. package/app/.next-cli-build/server/app/api/routing/learn/route.js +1 -1
  233. package/app/.next-cli-build/server/app/api/routing/learn/route.js.nft.json +1 -1
  234. package/app/.next-cli-build/server/app/api/routing/stats/route.js.nft.json +1 -1
  235. package/app/.next-cli-build/server/app/api/routing/versions/promote/route.js.nft.json +1 -1
  236. package/app/.next-cli-build/server/app/api/routing/versions/rollback/route.js.nft.json +1 -1
  237. package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
  238. package/app/.next-cli-build/server/app/api/settings/proxy-test/route.js.nft.json +1 -1
  239. package/app/.next-cli-build/server/app/api/settings/route.js +1 -1
  240. package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
  241. package/app/.next-cli-build/server/app/api/shutdown/route.js.nft.json +1 -1
  242. package/app/.next-cli-build/server/app/api/skills/[id]/route.js.nft.json +1 -1
  243. package/app/.next-cli-build/server/app/api/tags/route.js.nft.json +1 -1
  244. package/app/.next-cli-build/server/app/api/token-saver/vault-stats/route.js.nft.json +1 -1
  245. package/app/.next-cli-build/server/app/api/translator/console-logs/route.js.nft.json +1 -1
  246. package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js.nft.json +1 -1
  247. package/app/.next-cli-build/server/app/api/translator/load/route.js.nft.json +1 -1
  248. package/app/.next-cli-build/server/app/api/translator/save/route.js.nft.json +1 -1
  249. package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
  250. package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
  251. package/app/.next-cli-build/server/app/api/usage/[connectionId]/codex-reset-credits/route.js +1 -1
  252. package/app/.next-cli-build/server/app/api/usage/[connectionId]/codex-reset-credits/route.js.nft.json +1 -1
  253. package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js +1 -1
  254. package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  255. package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
  256. package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
  257. package/app/.next-cli-build/server/app/api/usage/logs/route.js.nft.json +1 -1
  258. package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
  259. package/app/.next-cli-build/server/app/api/usage/request-details/[id]/route.js.nft.json +1 -1
  260. package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
  261. package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  262. package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
  263. package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
  264. package/app/.next-cli-build/server/app/api/v1/api/chat/route.js +1 -1
  265. package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  266. package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  267. package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
  268. package/app/.next-cli-build/server/app/api/v1/audio/voices/route.js.nft.json +1 -1
  269. package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js +1 -1
  270. package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  271. package/app/.next-cli-build/server/app/api/v1/embeddings/route.js +1 -1
  272. package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  273. package/app/.next-cli-build/server/app/api/v1/images/generations/route.js +1 -1
  274. package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  275. package/app/.next-cli-build/server/app/api/v1/messages/count_tokens/route.js.nft.json +1 -1
  276. package/app/.next-cli-build/server/app/api/v1/messages/route.js +1 -1
  277. package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
  278. package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js +1 -1
  279. package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
  280. package/app/.next-cli-build/server/app/api/v1/models/info/route.js +1 -1
  281. package/app/.next-cli-build/server/app/api/v1/models/info/route.js.nft.json +1 -1
  282. package/app/.next-cli-build/server/app/api/v1/models/route.js +1 -1
  283. package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
  284. package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js +1 -1
  285. package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  286. package/app/.next-cli-build/server/app/api/v1/responses/route.js +1 -1
  287. package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
  288. package/app/.next-cli-build/server/app/api/v1/route.js +1 -1
  289. package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
  290. package/app/.next-cli-build/server/app/api/v1/search/route.js +1 -1
  291. package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
  292. package/app/.next-cli-build/server/app/api/v1/videos/[id]/route.js +1 -1
  293. package/app/.next-cli-build/server/app/api/v1/videos/[id]/route.js.nft.json +1 -1
  294. package/app/.next-cli-build/server/app/api/v1/videos/edits/route.js +1 -1
  295. package/app/.next-cli-build/server/app/api/v1/videos/edits/route.js.nft.json +1 -1
  296. package/app/.next-cli-build/server/app/api/v1/videos/extensions/route.js +1 -1
  297. package/app/.next-cli-build/server/app/api/v1/videos/extensions/route.js.nft.json +1 -1
  298. package/app/.next-cli-build/server/app/api/v1/videos/generations/route.js +1 -1
  299. package/app/.next-cli-build/server/app/api/v1/videos/generations/route.js.nft.json +1 -1
  300. package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js +1 -1
  301. package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
  302. package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js +1 -1
  303. package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  304. package/app/.next-cli-build/server/app/api/v1beta/models/route.js +1 -1
  305. package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
  306. package/app/.next-cli-build/server/app/api/version/route.js +1 -1
  307. package/app/.next-cli-build/server/app/api/version/route.js.nft.json +1 -1
  308. package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
  309. package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
  310. package/app/.next-cli-build/server/app/callback/page.js.nft.json +1 -1
  311. package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  312. package/app/.next-cli-build/server/app/callback.html +1 -1
  313. package/app/.next-cli-build/server/app/callback.rsc +3 -3
  314. package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +3 -3
  315. package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
  316. package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +3 -3
  317. package/app/.next-cli-build/server/app/dashboard/settings/pricing/page.js.nft.json +1 -1
  318. package/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  319. package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  320. package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +3 -3
  321. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
  322. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  323. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +3 -3
  324. package/app/.next-cli-build/server/app/favicon.ico/route.js.nft.json +1 -1
  325. package/app/.next-cli-build/server/app/index.html +1 -1
  326. package/app/.next-cli-build/server/app/index.rsc +3 -3
  327. package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +3 -3
  328. package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +3 -3
  329. package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
  330. package/app/.next-cli-build/server/app/landing/page.js.nft.json +1 -1
  331. package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  332. package/app/.next-cli-build/server/app/landing.html +1 -1
  333. package/app/.next-cli-build/server/app/landing.rsc +3 -3
  334. package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +3 -3
  335. package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
  336. package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +3 -3
  337. package/app/.next-cli-build/server/app/login/page.js +1 -1
  338. package/app/.next-cli-build/server/app/login/page.js.nft.json +1 -1
  339. package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  340. package/app/.next-cli-build/server/app/login.html +1 -1
  341. package/app/.next-cli-build/server/app/login.rsc +4 -4
  342. package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +4 -4
  343. package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
  344. package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
  345. package/app/.next-cli-build/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  346. package/app/.next-cli-build/server/app/page.js.nft.json +1 -1
  347. package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  348. package/app/.next-cli-build/server/app-paths-manifest.json +11 -11
  349. package/app/.next-cli-build/server/chunks/1274.js +1 -1
  350. package/app/.next-cli-build/server/chunks/1350.js +1 -1
  351. package/app/.next-cli-build/server/chunks/2619.js +1 -0
  352. package/app/.next-cli-build/server/chunks/2847.js +1 -1
  353. package/app/.next-cli-build/server/chunks/369.js +2 -2
  354. package/app/.next-cli-build/server/chunks/4330.js +1 -1
  355. package/app/.next-cli-build/server/chunks/5139.js +1 -1
  356. package/app/.next-cli-build/server/chunks/5350.js +1 -1
  357. package/app/.next-cli-build/server/chunks/5565.js +1 -1
  358. package/app/.next-cli-build/server/chunks/5624.js +1 -1
  359. package/app/.next-cli-build/server/chunks/5717.js +1 -1
  360. package/app/.next-cli-build/server/chunks/5781.js +2 -2
  361. package/app/.next-cli-build/server/chunks/6533.js +1 -0
  362. package/app/.next-cli-build/server/chunks/7201.js +1 -1
  363. package/app/.next-cli-build/server/chunks/7828.js +4 -0
  364. package/app/.next-cli-build/server/chunks/8400.js +1 -1
  365. package/app/.next-cli-build/server/chunks/869.js +1 -1
  366. package/app/.next-cli-build/server/chunks/8789.js +1 -1
  367. package/app/.next-cli-build/server/chunks/8915.js +1 -1
  368. package/app/.next-cli-build/server/chunks/8998.js +21 -21
  369. package/app/.next-cli-build/server/chunks/9261.js +9 -9
  370. package/app/.next-cli-build/server/chunks/9264.js +1 -1
  371. package/app/.next-cli-build/server/chunks/9421.js +2 -2
  372. package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  373. package/app/.next-cli-build/server/middleware.js +2 -2
  374. package/app/.next-cli-build/server/pages/404.html +1 -1
  375. package/app/.next-cli-build/server/pages/500.html +1 -1
  376. package/app/.next-cli-build/server/server-reference-manifest.js +1 -1
  377. package/app/.next-cli-build/server/server-reference-manifest.json +1 -1
  378. package/app/.next-cli-build/static/chunks/{1321-227ff10ac053e663.js → 1321-b1d92a764bdc4978.js} +1 -1
  379. package/app/open-sse/identity/tls/bin/darwin/arm64/switchboard-claude-tls +0 -0
  380. package/app/open-sse/identity/tls/bin/darwin/x64/switchboard-claude-tls +0 -0
  381. package/app/open-sse/identity/tls/bin/linux/arm64/switchboard-claude-tls +0 -0
  382. package/app/open-sse/identity/tls/bin/linux/x64/switchboard-claude-tls +0 -0
  383. package/app/open-sse/identity/tls/bin/win32/arm64/switchboard-claude-tls.exe +0 -0
  384. package/app/open-sse/identity/tls/bin/win32/x64/switchboard-claude-tls.exe +0 -0
  385. package/app/package.json +1 -1
  386. package/package.json +1 -1
  387. package/app/.next-cli-build/server/chunks/1351.js +0 -1
  388. package/app/.next-cli-build/server/chunks/3735.js +0 -4
  389. package/app/.next-cli-build/server/chunks/403.js +0 -1
  390. /package/app/.next/static/{NvDkTo00u9NnH7x0us5x_ → _QJazGP3H6y4MJykGD5aW}/_buildManifest.js +0 -0
  391. /package/app/.next/static/{NvDkTo00u9NnH7x0us5x_ → _QJazGP3H6y4MJykGD5aW}/_ssgManifest.js +0 -0
  392. /package/app/.next-cli-build/static/{NvDkTo00u9NnH7x0us5x_ → _QJazGP3H6y4MJykGD5aW}/_buildManifest.js +0 -0
  393. /package/app/.next-cli-build/static/{NvDkTo00u9NnH7x0us5x_ → _QJazGP3H6y4MJykGD5aW}/_ssgManifest.js +0 -0
@@ -61,7 +61,7 @@ ${g}
61
61
  export GEMINI_API_KEY="${b}"
62
62
  export GEMINI_MODEL="${c}"
63
63
  export GOOGLE_GEMINI_BASE_URL="${a.replace(/\/v1$/,"")}"
64
- `},{filename:"~/.gemini/settings.json (merge these keys — keep your other settings)",content:JSON.stringify({model:{name:c},experimental:{dynamicModelConfiguration:!0},modelConfigs:{modelDefinitions:Object.fromEntries(d.map(a=>[a,{displayName:`Switchboard \xb7 ${a.split("/").pop()||a}`,family:"switchboard",tier:"custom",isPreview:!1,isVisible:!0,features:{thinking:!0,multimodalToolUse:!0}}]))}},null,2)}]})}let ak="http://127.0.0.1:20128";function al(){return ak}function am({apiKeys:a,cloudEnabled:b,onStatusChange:c}){let[g,h]=(0,e.useState)(null),[i,j]=(0,e.useState)(!1),[k,l]=(0,e.useState)(!1),[m,n]=(0,e.useState)(""),[o,p]=(0,e.useState)(()=>a?.[0]?.keySecret||""),[q,r]=(0,e.useState)(null),[s,t]=(0,e.useState)(null),[u,v]=(0,e.useState)(null),[w,x]=(0,e.useState)(al),[y,z]=(0,e.useState)(null),[A,B]=(0,e.useState)(!0),C=g?.isWin===!0,D=C||g?.hasCachedPassword||g?.needsSudoPassword===!1,E=g?.isAdmin!==!1,F=(0,e.useCallback)(async()=>{try{let a=await fetch("/api/cli-tools/antigravity-mitm");if(a.ok){let b=await a.json();h(b),b.mitmRouterBaseUrl&&x(b.mitmRouterBaseUrl),c?.(b)}}catch{h({running:!1,certExists:!1,dnsStatus:{}})}},[c]),G=a=>{v(null),g&&(D?H(a,""):(r(a),l(!0),t(null)))},H=async(c,d,e=!1)=>{j(!0),v(null);try{let f;if("trust-cert"===c)f=await fetch("/api/cli-tools/antigravity-mitm",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"trust-cert",sudoPassword:d})});else if("start"===c){let c=o?.trim()||(a?.length>0?a[0].keySecret:null)||(b?null:"sk_switchboard");f=await fetch("/api/cli-tools/antigravity-mitm",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:c,sudoPassword:d,mitmRouterBaseUrl:w.trim()||ak,forceKillPort443:e})})}else f=await fetch("/api/cli-tools/antigravity-mitm",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({sudoPassword:d})});if(!f.ok){let a=await f.json().catch(()=>({}));if("PORT_443_BUSY"===a.code&&a.portOwner){l(!1),z({owner:a.portOwner,password:d});return}v(a.error||`Failed to ${c} MITM server`);return}l(!1),n(""),z(null),await F()}catch(a){v(a.message||"Network error")}finally{j(!1),r(null)}},I=()=>{l(!1),n(""),t(null)},J=()=>{m.trim()?H(q,m):t("Sudo password is required")},K=g?.running;return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f.Zp,{padding:"sm",className:"border-primary/20 bg-primary/5",children:(0,d.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,d.jsxs)("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between",children:[(0,d.jsxs)("div",{className:"flex min-w-0 flex-wrap items-center gap-2",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-primary text-[20px]",children:"security"}),(0,d.jsx)("span",{className:"font-semibold text-sm text-text-main",children:"MITM Server"}),K?(0,d.jsx)(f.Ex,{variant:"success",size:"sm",children:"Running"}):(0,d.jsx)(f.Ex,{variant:"default",size:"sm",children:"Stopped"})]}),(0,d.jsx)("div",{className:"flex flex-wrap items-center gap-1 text-xs text-text-muted","data-i18n-skip":"true",children:[{label:"Cert",ok:g?.certExists},{label:"Trusted",ok:g?.certTrusted},{label:"Server",ok:K}].map(({label:a,ok:b})=>(0,d.jsxs)("span",{className:`flex items-center gap-0.5 px-1.5 py-0.5 rounded ${b?"text-green-600":"text-text-muted"}`,children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[12px]",children:b?"check_circle":"cancel"}),a]},a))})]}),(0,d.jsxs)("div",{className:"px-2 py-2 rounded-lg bg-surface/50 border border-border/50 flex flex-col gap-2",children:[(0,d.jsxs)("p",{className:"text-[11px] text-text-muted leading-relaxed",children:[(0,d.jsx)("span",{className:"font-medium text-text-main",children:"Purpose:"})," Use Antigravity IDE & GitHub Copilot → with ANY provider/model from Switchboard"]}),(0,d.jsxs)("p",{className:"text-[11px] text-text-muted leading-relaxed",children:[(0,d.jsx)("span",{className:"font-medium text-text-main",children:"How it works:"})," Antigravity/Copilot IDE request → DNS redirect to localhost:443 → MITM proxy intercepts → Switchboard → response to Antigravity/Copilot"]})]}),(0,d.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,d.jsxs)("div",{className:"grid gap-1 sm:grid-cols-[8rem_auto_1fr] sm:items-center sm:gap-2",children:[(0,d.jsx)("label",{htmlFor:"mitm-router-base-url",className:"text-xs font-semibold text-text-main sm:text-right sm:text-sm",children:"Switchboard Base URL"}),(0,d.jsx)("span",{className:"material-symbols-outlined hidden text-text-muted text-[14px] sm:inline","aria-hidden":"true",children:"arrow_forward"}),(0,d.jsx)("input",{id:"mitm-router-base-url",type:"text",value:w,onChange:a=>x(a.target.value),placeholder:ak,disabled:K,className:"flex-1 min-w-0 px-2 py-1.5 bg-surface rounded border border-border text-xs text-text-main focus:outline-none focus:ring-1 focus:ring-primary/50 disabled:opacity-50"})]}),!K&&(0,d.jsxs)("div",{className:"grid gap-1 sm:grid-cols-[8rem_auto_1fr] sm:items-center sm:gap-2",children:[(0,d.jsx)("label",{htmlFor:"mitm-api-key",className:"text-xs font-semibold text-text-main sm:text-right sm:text-sm",children:"API Key"}),(0,d.jsx)("span",{className:"material-symbols-outlined hidden text-text-muted text-[14px] sm:inline","aria-hidden":"true",children:"arrow_forward"}),(0,d.jsx)("input",{id:"mitm-api-key",type:"password",list:"mitm-api-keys",value:o,onChange:a=>{B(!1),p(a.target.value)},placeholder:b?"Enter or pick API key":"sk_switchboard (default)",className:"flex-1 min-w-0 px-2 py-1.5 bg-surface rounded border border-border text-xs text-text-main focus:outline-none focus:ring-1 focus:ring-primary/50"}),a?.length>0&&(0,d.jsx)("datalist",{id:"mitm-api-keys",children:a.map(a=>(0,d.jsx)("option",{value:a.keySecret||"",children:a.name||a.keyPrefix},a.id))})]})]}),(0,d.jsxs)("div",{className:"flex flex-col gap-2 sm:flex-row sm:flex-wrap sm:items-center","data-i18n-skip":"true",children:[g?.certExists&&!g?.certTrusted&&(0,d.jsxs)("button",{onClick:()=>G("trust-cert"),disabled:i,className:"flex w-full items-center justify-center gap-1.5 rounded-lg border border-yellow-500/30 bg-yellow-500/10 px-4 py-2 text-xs font-medium text-yellow-600 transition-colors hover:bg-yellow-500/20 disabled:opacity-50 sm:w-auto sm:py-1.5",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"verified_user"}),"Trust Cert"]}),K?(0,d.jsxs)("button",{onClick:()=>G("stop"),disabled:i,className:"flex w-full items-center justify-center gap-1.5 rounded-lg border border-red-500/30 bg-red-500/10 px-4 py-2 text-xs font-medium text-red-500 transition-colors hover:bg-red-500/20 disabled:opacity-50 sm:w-auto sm:py-1.5",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"stop_circle"}),"Stop Server"]}):(0,d.jsxs)("button",{onClick:()=>G("start"),disabled:i||!g||C&&!E,title:C&&!E?"Administrator required":void 0,className:"flex w-full items-center justify-center gap-1.5 rounded-lg border border-primary/30 bg-primary/10 px-4 py-2 text-xs font-medium text-primary transition-colors hover:bg-primary/20 disabled:opacity-50 sm:w-auto sm:py-1.5",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"play_circle"}),"Start Server"]}),K&&(0,d.jsx)("p",{className:"text-xs text-text-muted",children:"Enable DNS per tool below to activate interception"})]}),u&&(0,d.jsxs)("div",{className:"flex items-start gap-2 px-2 py-1.5 rounded text-xs bg-red-500/10 text-red-600 dark:text-red-400 border border-red-500/20",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[14px] mt-0.5 shrink-0",children:"error"}),(0,d.jsx)("span",{children:u})]}),C&&!E&&(0,d.jsxs)("div",{className:"flex items-center gap-2 px-2 py-1.5 rounded text-xs bg-red-500/10 text-red-600 border border-red-500/20",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"shield_lock"}),(0,d.jsx)("span",{children:"Administrator required — restart Switchboard as Administrator to use MITM"})]})]})}),(0,d.jsx)(f.aF,{isOpen:k,onClose:()=>{i||I()},title:"Sudo Password Required",size:"sm",footer:(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f.$n,{variant:"ghost",size:"sm",onClick:I,disabled:i,children:"Cancel"}),(0,d.jsx)(f.$n,{variant:"primary",size:"sm",onClick:J,loading:i,children:"Confirm"})]}),children:(0,d.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,d.jsxs)("div",{className:"flex items-start gap-3 p-3 bg-yellow-500/10 border border-yellow-500/30 rounded-lg",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-yellow-500 text-[20px]","aria-hidden":"true",children:"warning"}),(0,d.jsx)("p",{className:"text-xs text-text-muted",children:"Required for SSL certificate and server startup"})]}),(0,d.jsx)(f.pd,{label:"Sudo password",type:"password",autoFocus:!0,placeholder:"Enter sudo password",value:m,onChange:a=>n(a.target.value),onKeyDown:a=>{"Enter"!==a.key||i||J()}}),s&&(0,d.jsxs)("div",{role:"alert",className:"flex items-center gap-2 px-2 py-1.5 rounded text-xs bg-red-500/10 text-red-600",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[14px]","aria-hidden":"true",children:"error"}),(0,d.jsx)("span",{children:s})]})]})}),(0,d.jsx)(f.aF,{isOpen:!!y,onClose:()=>{i||(z(null),j(!1))},title:"Port 443 Already In Use",footer:(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f.$n,{variant:"ghost",size:"sm",onClick:()=>{z(null),j(!1)},disabled:i,children:"Cancel"}),(0,d.jsx)(f.$n,{variant:"primary",size:"sm",onClick:()=>{H("start",y?.password||"",!0)},loading:i,children:"Kill & Start"})]}),children:(0,d.jsxs)("div",{className:"flex items-start gap-3 p-3 bg-yellow-500/10 border border-yellow-500/30 rounded-lg",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-yellow-500 text-[20px]",children:"warning"}),(0,d.jsxs)("div",{className:"flex flex-col gap-1 text-xs text-text-muted",children:[(0,d.jsx)("p",{children:"Port 443 is currently used by another process:"}),(0,d.jsxs)("p",{className:"font-mono text-text-main","data-i18n-skip":"true",children:[y?.owner.name," (PID ",y?.owner.pid,")"]}),(0,d.jsx)("p",{children:"Kill this process to start MITM Server?"})]})]})})]})}var an=c(36811);function ao({tool:a,isExpanded:b,onToggle:c,serverRunning:h,dnsActive:i,hasCachedPassword:j,needsSudoPassword:k,isWin:l,apiKeys:m,activeProviders:n,hasActiveProviders:o,modelAliases:p={},cloudEnabled:q,onDnsChange:r}){let[s,t]=(0,e.useState)(!1),[u,v]=(0,e.useState)(null),[w,x]=(0,e.useState)(!1),[y,z]=(0,e.useState)(""),[A,B]=(0,e.useState)(null),[C,D]=(0,e.useState)(null),[E,F]=(0,e.useState)(null),[G,H]=(0,e.useState)(null),I=(0,e.useRef)(Promise.resolve()),[J,K]=(0,e.useState)(!1),[L,M]=(0,e.useState)(null),N=an.TOOL_HOSTS[a.id]??[],O=l||j||!1===k;(0,e.useCallback)(async()=>{try{let b=await fetch(`/api/cli-tools/antigravity-mitm/alias?tool=${a.id}`);if(b.ok){let a=await b.json();setModelMappings(a.aliases||{})}}catch{}},[a.id]);let P=(0,e.useCallback)(b=>{let c=I.current.then(async()=>{let c=await fetch("/api/cli-tools/antigravity-mitm/alias",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({tool:a.id,mappings:b})});if(!c.ok)throw Error(`Failed to save model mappings (status ${c.status})`)});return I.current=c.catch(()=>{}),c},[a.id]),Q=a=>{H(null),P(a).catch(a=>{H(a?.message||"Failed to save model mappings")})},R=(a,b)=>{let c={...modelMappings};return b?c[a]=b:delete c[a],c},S=()=>{if(!h)return;let a=i?"disable":"enable";O?T(a,""):(B(a),x(!0),D(null))},T=async(b,c)=>{t(!0),v(null),F(null);try{let d=await fetch("/api/cli-tools/antigravity-mitm",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({tool:a.id,action:b,sudoPassword:c})}),e=await d.json().catch(()=>({}));if(!d.ok)throw Error(e.error||`Failed to toggle DNS (status ${d.status})`);"enable"===b&&v(`Restart ${a.name} to apply changes`),x(!1),z(""),r?.(e)}catch(a){F(a?.message||"Failed to toggle DNS")}finally{t(!1),B(null)}},U=()=>{y.trim()?T(A,y):D("Sudo password is required")};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)(f.Zp,{padding:"xs",className:"overflow-hidden",children:[(0,d.jsxs)("div",{role:"button",tabIndex:0,"aria-expanded":b,"aria-label":`${b?"Collapse":"Expand"} ${a.name} settings`,className:"flex items-start justify-between gap-3 hover:cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/40 rounded-lg sm:items-center",onClick:c,onKeyDown:a=>{("Enter"===a.key||" "===a.key)&&(a.preventDefault(),c())},children:[(0,d.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,d.jsx)("div",{className:"size-8 flex items-center justify-center shrink-0",children:(0,d.jsx)(g.default,{src:a.image,alt:"",width:32,height:32,className:"size-8 object-contain rounded-lg",sizes:"32px",onError:a=>{a.target.style.display="none"}})}),(0,d.jsxs)("div",{className:"min-w-0",children:[(0,d.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,d.jsx)("h3",{className:"font-medium text-sm",children:a.name}),h?i?(0,d.jsx)(f.Ex,{variant:"success",size:"sm",children:"Active"}):(0,d.jsx)(f.Ex,{variant:"warning",size:"sm",children:"DNS off"}):(0,d.jsx)(f.Ex,{variant:"default",size:"sm",children:"Server off"})]}),(0,d.jsxs)("p",{className:"text-xs text-text-muted sm:truncate",children:["Intercept ",a.name," requests via MITM proxy"]})]})]}),(0,d.jsx)("span",{className:`material-symbols-outlined text-text-muted text-[20px] transition-transform ${b?"rotate-180":""}`,"aria-hidden":"true",children:"expand_more"})]}),b&&(0,d.jsxs)("div",{className:"mt-4 pt-4 border-t border-border flex flex-col gap-4",children:[N.length>0&&(0,d.jsxs)("div",{className:"mt-2 rounded-md border border-border bg-surface/50 px-2 py-1.5",children:[(0,d.jsx)("p",{className:"text-[10px] font-medium tracking-wide text-text-main/80 mb-1",children:"Edit hosts file manually to add the following entries:"}),(0,d.jsx)("ul",{className:"list-none space-y-0.5 font-mono text-[10px] text-text-muted break-all",children:N.map(a=>(0,d.jsxs)("li",{children:["127.0.0.1 ",a]},a))})]}),(0,d.jsxs)("div",{className:"flex flex-col gap-0.5 text-[11px] text-text-muted px-1",children:[(0,d.jsxs)("p",{children:["Toggle DNS to redirect ",a.name," traffic through Switchboard via MITM."]}),!i&&(0,d.jsx)("p",{className:"text-amber-600 text-[10px] mt-1",children:"⚠️ Enable DNS to edit model mappings"})]}),a.defaultModels?.length>0&&(0,d.jsx)("div",{className:"flex flex-col gap-2",children:a.defaultModels.map(a=>(0,d.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[9rem_auto_1fr_auto] sm:items-center sm:gap-2",children:[(0,d.jsx)("span",{className:"text-xs font-semibold text-text-main sm:text-right",children:a.name}),(0,d.jsx)("span",{className:"material-symbols-outlined hidden text-text-muted text-[14px] sm:inline",children:"arrow_forward"}),(0,d.jsxs)("div",{className:"relative w-full min-w-0",children:[(0,d.jsx)("input",{type:"text",value:modelMappings[a.alias]||"",onChange:b=>{var c,d;return c=a.alias,d=b.target.value,void setModelMappings(a=>{let b={...a};return d?b[c]=d:delete b[c],b})},onBlur:b=>{Q(R(a.alias,b.target.value))},placeholder:"provider/model-id",disabled:!i,className:`w-full min-w-0 pl-2 pr-7 py-2 bg-surface rounded border border-border text-xs focus:outline-none focus:ring-1 focus:ring-primary/50 sm:py-1.5 ${!i?"opacity-50 cursor-not-allowed":""}`}),modelMappings[a.alias]&&(0,d.jsx)("button",{onClick:()=>{let b=R(a.alias,"");setModelMappings(b),Q(b)},className:"absolute right-1 top-1/2 -translate-y-1/2 p-0.5 text-text-muted hover:text-red-500 rounded transition-colors",title:"Clear",children:(0,d.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"close"})})]}),(0,d.jsx)("button",{onClick:()=>openModelSelector(a.alias),disabled:!o||!i,className:`rounded border px-2 py-2 text-xs transition-colors sm:py-1.5 ${o&&i?"bg-surface border-border hover:border-primary cursor-pointer":"opacity-50 cursor-not-allowed border-border"}`,children:"Select"})]},a.alias))}),a.defaultModels?.length===0&&(0,d.jsx)("p",{className:"text-xs text-text-muted px-1",children:"Model mappings will be available soon."}),(0,d.jsxs)("div",{className:"flex flex-col gap-2 sm:items-start",children:[i?(0,d.jsxs)("button",{onClick:S,disabled:!h||s,className:"flex w-full items-center justify-center gap-1.5 rounded-lg border border-red-500/30 bg-red-500/10 px-4 py-2 text-xs font-medium text-red-500 transition-colors hover:bg-red-500/20 disabled:cursor-not-allowed disabled:opacity-50 sm:w-auto sm:py-1.5",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"stop_circle"}),"Stop DNS"]}):(0,d.jsxs)("button",{onClick:S,disabled:!h||s,className:"flex w-full items-center justify-center gap-1.5 rounded-lg border border-primary/30 bg-primary/10 px-4 py-2 text-xs font-medium text-primary transition-colors hover:bg-primary/20 disabled:cursor-not-allowed disabled:opacity-50 sm:w-auto sm:py-1.5",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"play_circle"}),"Start DNS"]}),u&&(0,d.jsxs)("div",{className:"flex items-center gap-2 px-2 py-1.5 rounded text-xs text-amber-500",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"warning"}),(0,d.jsx)("span",{children:u})]}),(E||G)&&(0,d.jsxs)("div",{role:"alert",className:"flex items-center gap-2 px-2 py-1.5 rounded text-xs bg-red-500/10 text-red-600 dark:text-red-400",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"error"}),(0,d.jsx)("span",{children:E||G})]})]})]})]}),w&&(0,d.jsx)("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm",onKeyDown:a=>{"Escape"!==a.key||s||(x(!1),z(""),D(null))},children:(0,d.jsxs)("div",{role:"dialog","aria-modal":"true","aria-labelledby":"mitm-tool-sudo-title",className:"mx-4 flex w-full max-w-sm flex-col gap-4 rounded-xl border border-border bg-surface p-5 shadow-xl sm:p-6",children:[(0,d.jsx)("h3",{id:"mitm-tool-sudo-title",className:"font-semibold text-text-main",children:"Sudo Password Required"}),(0,d.jsxs)("div",{className:"flex items-start gap-3 p-3 bg-yellow-500/10 border border-yellow-500/30 rounded-lg",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-yellow-500 text-[20px]","aria-hidden":"true",children:"warning"}),(0,d.jsx)("p",{className:"text-xs text-text-muted",children:"Required to modify /etc/hosts and flush DNS cache"})]}),(0,d.jsx)(f.pd,{label:"Sudo password",type:"password",autoFocus:!0,placeholder:"Enter sudo password",value:y,onChange:a=>z(a.target.value),onKeyDown:a=>{"Enter"!==a.key||s||U()}}),C&&(0,d.jsxs)("div",{role:"alert",className:"flex items-center gap-2 px-2 py-1.5 rounded text-xs bg-red-500/10 text-red-600",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[14px]","aria-hidden":"true",children:"error"}),(0,d.jsx)("span",{children:C})]}),(0,d.jsxs)("div",{className:"flex items-center justify-end gap-2",children:[(0,d.jsx)(f.$n,{variant:"ghost",size:"sm",onClick:()=>{x(!1),z(""),D(null)},disabled:s,children:"Cancel"}),(0,d.jsx)(f.$n,{variant:"primary",size:"sm",onClick:U,loading:s,children:"Confirm"})]})]})}),(0,d.jsx)(f.rq,{isOpen:J,onClose:()=>K(!1),onSelect:a=>{if(!L)return;if(a.isPlaceholder)return void v(`"${a.value}" is a placeholder — connect the provider first, then pick a real model`);let b={...modelMappings,[L]:a.value};setModelMappings(b),Q(b)},selectedModel:L?modelMappings[L]:null,activeProviders:n,modelAliases:p,title:`Select model for ${L}`})]})}var ap=c(2116),aq=c.n(ap);function ar({tool:a}){return(0,d.jsx)(aq(),{href:"/dashboard/mitm",className:"block",children:(0,d.jsx)(f.Zp,{padding:"sm",className:"overflow-hidden hover:border-primary/50 transition-colors cursor-pointer",children:(0,d.jsxs)("div",{className:"flex items-center justify-between",children:[(0,d.jsxs)("div",{className:"flex items-center gap-3",children:[(0,d.jsx)("div",{className:"size-8 flex items-center justify-center shrink-0",children:a.image?(0,d.jsx)(g.default,{src:a.image,alt:a.name,width:32,height:32,className:"size-8 object-contain rounded-lg",sizes:"32px",onError:a=>{a.target.style.display="none"}}):(0,d.jsx)("span",{className:"flex size-8 items-center justify-center rounded-lg bg-purple-500/10 text-sm font-semibold text-purple-600 dark:text-purple-400",children:a.name?.charAt(0)?.toUpperCase()||"?"})}),(0,d.jsxs)("div",{className:"min-w-0",children:[(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[(0,d.jsx)("h3",{className:"font-medium text-sm",children:a.name}),(0,d.jsx)("span",{className:"px-1.5 py-0.5 text-[10px] font-medium bg-purple-500/10 text-purple-600 dark:text-purple-400 rounded-full",children:"MITM"})]}),(0,d.jsx)("p",{className:"text-xs text-text-muted truncate",children:a.description})]})]}),(0,d.jsx)("span",{className:"material-symbols-outlined text-text-muted text-[20px]",children:"chevron_right"})]})})})}},50412:(a,b,c)=>{c.d(b,{x0:()=>x.default,Ex:()=>j.default,$n:()=>d.default,nh:()=>C.default,Zp:()=>g.default,Qv:()=>i.CardSkeleton,CK:()=>o.default,uo:()=>h.ConfirmModal,G9:()=>t.default,wI:()=>w.default,vj:()=>v.default,vE:()=>u.default,pd:()=>e.default,Mh:()=>s.default,uR:()=>n.default,Nf:()=>p.default,aF:()=>h.default,rq:()=>m.default,gw:()=>y.default,LF:()=>l.default,Wx:()=>B.default,gM:()=>r.default,Iz:()=>z.default,l6:()=>f.default,lM:()=>k.default,m_:()=>A.default,jK:()=>q.default});var d=c(99070),e=c(83552),f=c(82389),g=c(17660),h=c(95145),i=c(74812);c(25919);var j=c(75171),k=c(95514);c(43878),c(19308),c(42196),c(32456),c(48781);var l=c(79346),m=c(83352),n=c(39645),o=c(62727),p=c(20084),q=c(87226);c(267),c(3236),c(11229);var r=c(91809);c(4481);var s=c(5291);c(56110);var t=c(51109),u=c(79488),v=c(43182),w=c(51585),x=c(67738),y=c(50585),z=c(91099),A=c(32971),B=c(11633),C=c(38930);c(5993),c(53838)},62911:(a,b,c)=>{c.d(b,{dM:()=>e,wn:()=>d});let d={antigravity:{id:"antigravity",name:"Antigravity",image:"/providers/antigravity.png",color:"#4285F4",description:"Google Antigravity IDE with MITM",configType:"mitm",mitmDomain:"daily-cloudcode-pa.googleapis.com",modelAliases:["gemini-3.5-flash-low","gemini-3-flash-agent","gemini-3.5-flash-extra-low","gemini-3.1-pro-low","gemini-pro-agent","claude-sonnet-4-6","claude-opus-4-6-thinking","gpt-oss-120b-medium","gemini-3-flash"],defaultModels:[{id:"gemini-3.5-flash-low",name:"Gemini 3.5 Flash (Medium) / Default",alias:"gemini-3.5-flash-low",mandatory:!0},{id:"gemini-3-flash-agent",name:"Gemini 3.5 Flash (High)",alias:"gemini-3-flash-agent"},{id:"gemini-3.5-flash-extra-low",name:"Gemini 3.5 Flash (Low)",alias:"gemini-3.5-flash-extra-low"},{id:"gemini-3.1-pro-low",name:"Gemini 3.1 Pro (Low)",alias:"gemini-3.1-pro-low"},{id:"gemini-pro-agent",name:"Gemini 3.1 Pro (High)",alias:"gemini-pro-agent"},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6 (Thinking)",alias:"claude-sonnet-4-6"},{id:"claude-opus-4-6-thinking",name:"Claude Opus 4.6 (Thinking)",alias:"claude-opus-4-6-thinking"},{id:"gpt-oss-120b-medium",name:"GPT-OSS 120B (Medium)",alias:"gpt-oss-120b-medium"},{id:"gemini-3-flash",name:"Gemini 3 Flash (Command)",alias:"gemini-3-flash"}]},copilot:{id:"copilot",name:"GitHub Copilot",image:"/providers/copilot.png",color:"#1F6FEB",description:"GitHub Copilot IDE with MITM",configType:"mitm",mitmDomain:"api.individual.githubcopilot.com",modelAliases:["gpt-5-mini","gpt-5.4-nano","claude-haiku-4.5","gpt-4o","gpt-4.1"],defaultModels:[{id:"gpt-5-mini",name:"GPT-5 mini",alias:"gpt-5-mini"},{id:"gpt-5.4-nano",name:"GPT-5.4 nano",alias:"gpt-5.4-nano"},{id:"claude-haiku-4.5",name:"Claude Haiku 4.5",alias:"claude-haiku-4.5"},{id:"gpt-4o",name:"GPT-4o",alias:"gpt-4o"},{id:"gpt-4.1",name:"GPT-4.1",alias:"gpt-4.1"}]},kiro:{id:"kiro",name:"Kiro",image:"/providers/kiro.png",color:"#FF6B00",description:"Kiro IDE with MITM",configType:"mitm",mitmDomain:"q.us-east-1.amazonaws.com",defaultModels:[{id:"claude-sonnet-5",name:"Claude Sonnet 5",alias:"claude-sonnet-5"},{id:"claude-sonnet-4.5",name:"Claude Sonnet 4.5",alias:"claude-sonnet-4.5"},{id:"claude-sonnet-4",name:"Claude Sonnet 4",alias:"claude-sonnet-4"},{id:"claude-haiku-4.5",name:"Claude Haiku 4.5",alias:"claude-haiku-4.5"},{id:"deepseek-3.2",name:"DeepSeek 3.2",alias:"deepseek-3.2"},{id:"minimax-m2.1",name:"MiniMax M2.1",alias:"minimax-m2.1"},{id:"simple-task",name:"Qwen3 Coder Next",alias:"simple-task"}]}},e={claude:{id:"claude",name:"Claude Code",image:"/providers/claude.png",color:"#D97757",description:"Anthropic Claude Code CLI",configType:"env",envVars:{baseUrl:"ANTHROPIC_BASE_URL",model:"ANTHROPIC_MODEL",opusModel:"ANTHROPIC_DEFAULT_OPUS_MODEL",sonnetModel:"ANTHROPIC_DEFAULT_SONNET_MODEL",fableModel:"ANTHROPIC_DEFAULT_FABLE_MODEL",haikuModel:"ANTHROPIC_DEFAULT_HAIKU_MODEL"},modelAliases:["default","sonnet","opus","fable","haiku","opusplan"],settingsFile:"~/.claude/settings.json",defaultModels:[{id:"opus",name:"Claude Opus",alias:"opus",envKey:"ANTHROPIC_DEFAULT_OPUS_MODEL",defaultValue:"cc/claude-opus-4-8"},{id:"sonnet",name:"Claude Sonnet",alias:"sonnet",envKey:"ANTHROPIC_DEFAULT_SONNET_MODEL",defaultValue:"cc/claude-sonnet-5"},{id:"fable",name:"Claude Fable",alias:"fable",envKey:"ANTHROPIC_DEFAULT_FABLE_MODEL",defaultValue:"cc/claude-fable-5"},{id:"haiku",name:"Claude Haiku",alias:"haiku",envKey:"ANTHROPIC_DEFAULT_HAIKU_MODEL",defaultValue:"cc/claude-haiku-4-5-20251001"}]},openclaw:{id:"openclaw",name:"Open Claw",image:"/providers/openclaw.png",color:"#FF6B35",description:"Open Claw AI Assistant",configType:"custom"},codex:{id:"codex",name:"OpenAI Codex CLI / App",image:"/providers/codex.png",color:"#10A37F",description:"OpenAI Codex CLI",configType:"custom"},opencode:{id:"opencode",name:"OpenCode",image:"/providers/opencode.png",color:"#E87040",description:"OpenCode AI Terminal Assistant",configType:"custom"},cowork:{id:"cowork",name:"Claude Cowork",image:"/providers/claude.png",color:"#D97757",description:"Claude Desktop Cowork (third-party inference)",configType:"custom"},hermes:{id:"hermes",name:"Hermes Agent",image:"/providers/hermes.png",color:"#8B5CF6",description:"Nous Research self-improving AI agent",configType:"custom"},droid:{id:"droid",name:"Factory Droid",image:"/providers/droid.png",color:"#00D4FF",description:"Factory Droid AI Assistant",configType:"custom"},cursor:{id:"cursor",name:"Cursor",image:"/providers/cursor.png",color:"#000000",description:"Cursor AI Code Editor",configType:"guide",modelSelection:"multiple",requiresExternalUrl:!0,notes:[{type:"warning",text:"Requires Cursor Pro account to use this feature."},{type:"cloudCheck",text:"Cursor routes requests through its own server, so local endpoint is not supported. Please enable Tunnel or Cloud Endpoint in Settings."}],guideSteps:[{step:1,title:"Open Settings",desc:"Go to Settings → Models"},{step:2,title:"Enable OpenAI API",desc:'Enable "OpenAI API key" option'},{step:3,title:"Base URL",value:"{{baseUrl}}",copyable:!0},{step:4,title:"API Key",type:"apiKeySelector"},{step:5,title:"Select Models",type:"modelSelector"},{step:6,title:"Add Custom Models",desc:"Click “View All Models” → “Add Custom Model” once for each selected model. The endpoint and API key are shared."}]},cline:{id:"cline",name:"Cline",image:"/providers/cline.png",color:"#00D1B2",description:"Cline AI Coding Assistant",configType:"custom"},kilo:{id:"kilo",name:"Kilo Code",image:"/providers/kilocode.png",color:"#FF6B6B",description:"Kilo Code AI Assistant",configType:"custom"},roo:{id:"roo",name:"Roo",image:"/providers/roo.png",color:"#FF6B6B",description:"Roo AI Assistant",configType:"guide",modelSelection:"multiple",guideSteps:[{step:1,title:"Open Settings",desc:"Go to Roo Settings panel"},{step:2,title:"Select Provider",desc:"Choose API Provider → OpenAI Compatible"},{step:3,title:"Base URL",value:"{{baseUrl}}",copyable:!0},{step:4,title:"API Key",type:"apiKeySelector"},{step:5,title:"Select Models",type:"modelSelector"},{step:6,title:"Create Profiles",desc:"Create one named Switchboard API Configuration Profile per selected model; Roo stores one model per profile."}]},continue:{id:"continue",name:"Continue",image:"/providers/continue.png",color:"#7C3AED",description:"Continue AI Assistant",configType:"guide",modelSelection:"multiple",guideSteps:[{step:1,title:"Open Config",desc:"Open Continue configuration file"},{step:2,title:"API Key",type:"apiKeySelector"},{step:3,title:"Select Models",type:"modelSelector"},{step:4,title:"Add Model Config",desc:"Merge the generated entries into ~/.continue/config.yaml."}],codeBlock:{language:"yaml",code:({baseUrl:a,apiKey:b,models:c})=>`name: Switchboard
64
+ `},{filename:"~/.gemini/settings.json (merge these keys — keep your other settings)",content:JSON.stringify({model:{name:c},experimental:{dynamicModelConfiguration:!0},modelConfigs:{modelDefinitions:Object.fromEntries(d.map(a=>[a,{displayName:`Switchboard \xb7 ${a.split("/").pop()||a}`,family:"switchboard",tier:"custom",isPreview:!1,isVisible:!0,features:{thinking:!0,multimodalToolUse:!0}}]))}},null,2)}]})}let ak="http://127.0.0.1:20128";function al(){return ak}function am({apiKeys:a,cloudEnabled:b,onStatusChange:c}){let[g,h]=(0,e.useState)(null),[i,j]=(0,e.useState)(!1),[k,l]=(0,e.useState)(!1),[m,n]=(0,e.useState)(""),[o,p]=(0,e.useState)(()=>a?.[0]?.keySecret||""),[q,r]=(0,e.useState)(null),[s,t]=(0,e.useState)(null),[u,v]=(0,e.useState)(null),[w,x]=(0,e.useState)(al),[y,z]=(0,e.useState)(null),[A,B]=(0,e.useState)(!0),C=g?.isWin===!0,D=C||g?.hasCachedPassword||g?.needsSudoPassword===!1,E=g?.isAdmin!==!1,F=(0,e.useCallback)(async()=>{try{let a=await fetch("/api/cli-tools/antigravity-mitm");if(a.ok){let b=await a.json();h(b),b.mitmRouterBaseUrl&&x(b.mitmRouterBaseUrl),c?.(b)}}catch{h({running:!1,certExists:!1,dnsStatus:{}})}},[c]),G=a=>{v(null),g&&(D?H(a,""):(r(a),l(!0),t(null)))},H=async(c,d,e=!1)=>{j(!0),v(null);try{let f;if("trust-cert"===c)f=await fetch("/api/cli-tools/antigravity-mitm",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"trust-cert",sudoPassword:d})});else if("start"===c){let c=o?.trim()||(a?.length>0?a[0].keySecret:null)||(b?null:"sk_switchboard");f=await fetch("/api/cli-tools/antigravity-mitm",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:c,sudoPassword:d,mitmRouterBaseUrl:w.trim()||ak,forceKillPort443:e})})}else f=await fetch("/api/cli-tools/antigravity-mitm",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({sudoPassword:d})});if(!f.ok){let a=await f.json().catch(()=>({}));if("PORT_443_BUSY"===a.code&&a.portOwner){l(!1),z({owner:a.portOwner,password:d});return}v(a.error||`Failed to ${c} MITM server`);return}l(!1),n(""),z(null),await F()}catch(a){v(a.message||"Network error")}finally{j(!1),r(null)}},I=()=>{l(!1),n(""),t(null)},J=()=>{m.trim()?H(q,m):t("Sudo password is required")},K=g?.running;return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f.Zp,{padding:"sm",className:"border-primary/20 bg-primary/5",children:(0,d.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,d.jsxs)("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between",children:[(0,d.jsxs)("div",{className:"flex min-w-0 flex-wrap items-center gap-2",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-primary text-[20px]",children:"security"}),(0,d.jsx)("span",{className:"font-semibold text-sm text-text-main",children:"MITM Server"}),K?(0,d.jsx)(f.Ex,{variant:"success",size:"sm",children:"Running"}):(0,d.jsx)(f.Ex,{variant:"default",size:"sm",children:"Stopped"})]}),(0,d.jsx)("div",{className:"flex flex-wrap items-center gap-1 text-xs text-text-muted","data-i18n-skip":"true",children:[{label:"Cert",ok:g?.certExists},{label:"Trusted",ok:g?.certTrusted},{label:"Server",ok:K}].map(({label:a,ok:b})=>(0,d.jsxs)("span",{className:`flex items-center gap-0.5 px-1.5 py-0.5 rounded ${b?"text-green-600":"text-text-muted"}`,children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[12px]",children:b?"check_circle":"cancel"}),a]},a))})]}),(0,d.jsxs)("div",{className:"px-2 py-2 rounded-lg bg-surface/50 border border-border/50 flex flex-col gap-2",children:[(0,d.jsxs)("p",{className:"text-[11px] text-text-muted leading-relaxed",children:[(0,d.jsx)("span",{className:"font-medium text-text-main",children:"Purpose:"})," Use Antigravity IDE & GitHub Copilot → with ANY provider/model from Switchboard"]}),(0,d.jsxs)("p",{className:"text-[11px] text-text-muted leading-relaxed",children:[(0,d.jsx)("span",{className:"font-medium text-text-main",children:"How it works:"})," Antigravity/Copilot IDE request → DNS redirect to localhost:443 → MITM proxy intercepts → Switchboard → response to Antigravity/Copilot"]})]}),(0,d.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,d.jsxs)("div",{className:"grid gap-1 sm:grid-cols-[8rem_auto_1fr] sm:items-center sm:gap-2",children:[(0,d.jsx)("label",{htmlFor:"mitm-router-base-url",className:"text-xs font-semibold text-text-main sm:text-right sm:text-sm",children:"Switchboard Base URL"}),(0,d.jsx)("span",{className:"material-symbols-outlined hidden text-text-muted text-[14px] sm:inline","aria-hidden":"true",children:"arrow_forward"}),(0,d.jsx)("input",{id:"mitm-router-base-url",type:"text",value:w,onChange:a=>x(a.target.value),placeholder:ak,disabled:K,className:"flex-1 min-w-0 px-2 py-1.5 bg-surface rounded border border-border text-xs text-text-main focus:outline-none focus:ring-1 focus:ring-primary/50 disabled:opacity-50"})]}),!K&&(0,d.jsxs)("div",{className:"grid gap-1 sm:grid-cols-[8rem_auto_1fr] sm:items-center sm:gap-2",children:[(0,d.jsx)("label",{htmlFor:"mitm-api-key",className:"text-xs font-semibold text-text-main sm:text-right sm:text-sm",children:"API Key"}),(0,d.jsx)("span",{className:"material-symbols-outlined hidden text-text-muted text-[14px] sm:inline","aria-hidden":"true",children:"arrow_forward"}),(0,d.jsx)("input",{id:"mitm-api-key",type:"password",list:"mitm-api-keys",value:o,onChange:a=>{B(!1),p(a.target.value)},placeholder:b?"Enter or pick API key":"sk_switchboard (default)",className:"flex-1 min-w-0 px-2 py-1.5 bg-surface rounded border border-border text-xs text-text-main focus:outline-none focus:ring-1 focus:ring-primary/50"}),a?.length>0&&(0,d.jsx)("datalist",{id:"mitm-api-keys",children:a.map(a=>(0,d.jsx)("option",{value:a.keySecret||"",children:a.name||a.keyPrefix},a.id))})]})]}),(0,d.jsxs)("div",{className:"flex flex-col gap-2 sm:flex-row sm:flex-wrap sm:items-center","data-i18n-skip":"true",children:[g?.certExists&&!g?.certTrusted&&(0,d.jsxs)("button",{onClick:()=>G("trust-cert"),disabled:i,className:"flex w-full items-center justify-center gap-1.5 rounded-lg border border-yellow-500/30 bg-yellow-500/10 px-4 py-2 text-xs font-medium text-yellow-600 transition-colors hover:bg-yellow-500/20 disabled:opacity-50 sm:w-auto sm:py-1.5",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"verified_user"}),"Trust Cert"]}),K?(0,d.jsxs)("button",{onClick:()=>G("stop"),disabled:i,className:"flex w-full items-center justify-center gap-1.5 rounded-lg border border-red-500/30 bg-red-500/10 px-4 py-2 text-xs font-medium text-red-500 transition-colors hover:bg-red-500/20 disabled:opacity-50 sm:w-auto sm:py-1.5",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"stop_circle"}),"Stop Server"]}):(0,d.jsxs)("button",{onClick:()=>G("start"),disabled:i||!g||C&&!E,title:C&&!E?"Administrator required":void 0,className:"flex w-full items-center justify-center gap-1.5 rounded-lg border border-primary/30 bg-primary/10 px-4 py-2 text-xs font-medium text-primary transition-colors hover:bg-primary/20 disabled:opacity-50 sm:w-auto sm:py-1.5",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"play_circle"}),"Start Server"]}),K&&(0,d.jsx)("p",{className:"text-xs text-text-muted",children:"Enable DNS per tool below to activate interception"})]}),u&&(0,d.jsxs)("div",{className:"flex items-start gap-2 px-2 py-1.5 rounded text-xs bg-red-500/10 text-red-600 dark:text-red-400 border border-red-500/20",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[14px] mt-0.5 shrink-0",children:"error"}),(0,d.jsx)("span",{children:u})]}),C&&!E&&(0,d.jsxs)("div",{className:"flex items-center gap-2 px-2 py-1.5 rounded text-xs bg-red-500/10 text-red-600 border border-red-500/20",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"shield_lock"}),(0,d.jsx)("span",{children:"Administrator required — restart Switchboard as Administrator to use MITM"})]})]})}),(0,d.jsx)(f.aF,{isOpen:k,onClose:()=>{i||I()},title:"Sudo Password Required",size:"sm",footer:(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f.$n,{variant:"ghost",size:"sm",onClick:I,disabled:i,children:"Cancel"}),(0,d.jsx)(f.$n,{variant:"primary",size:"sm",onClick:J,loading:i,children:"Confirm"})]}),children:(0,d.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,d.jsxs)("div",{className:"flex items-start gap-3 p-3 bg-yellow-500/10 border border-yellow-500/30 rounded-lg",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-yellow-500 text-[20px]","aria-hidden":"true",children:"warning"}),(0,d.jsx)("p",{className:"text-xs text-text-muted",children:"Required for SSL certificate and server startup"})]}),(0,d.jsx)(f.pd,{label:"Sudo password",type:"password",autoFocus:!0,placeholder:"Enter sudo password",value:m,onChange:a=>n(a.target.value),onKeyDown:a=>{"Enter"!==a.key||i||J()}}),s&&(0,d.jsxs)("div",{role:"alert",className:"flex items-center gap-2 px-2 py-1.5 rounded text-xs bg-red-500/10 text-red-600",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[14px]","aria-hidden":"true",children:"error"}),(0,d.jsx)("span",{children:s})]})]})}),(0,d.jsx)(f.aF,{isOpen:!!y,onClose:()=>{i||(z(null),j(!1))},title:"Port 443 Already In Use",footer:(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f.$n,{variant:"ghost",size:"sm",onClick:()=>{z(null),j(!1)},disabled:i,children:"Cancel"}),(0,d.jsx)(f.$n,{variant:"primary",size:"sm",onClick:()=>{H("start",y?.password||"",!0)},loading:i,children:"Kill & Start"})]}),children:(0,d.jsxs)("div",{className:"flex items-start gap-3 p-3 bg-yellow-500/10 border border-yellow-500/30 rounded-lg",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-yellow-500 text-[20px]",children:"warning"}),(0,d.jsxs)("div",{className:"flex flex-col gap-1 text-xs text-text-muted",children:[(0,d.jsx)("p",{children:"Port 443 is currently used by another process:"}),(0,d.jsxs)("p",{className:"font-mono text-text-main","data-i18n-skip":"true",children:[y?.owner.name," (PID ",y?.owner.pid,")"]}),(0,d.jsx)("p",{children:"Kill this process to start MITM Server?"})]})]})})]})}var an=c(36811);function ao({tool:a,isExpanded:b,onToggle:c,serverRunning:h,dnsActive:i,hasCachedPassword:j,needsSudoPassword:k,isWin:l,apiKeys:m,activeProviders:n,hasActiveProviders:o,modelAliases:p={},cloudEnabled:q,onDnsChange:r}){let[s,t]=(0,e.useState)(!1),[u,v]=(0,e.useState)(null),[w,x]=(0,e.useState)(!1),[y,z]=(0,e.useState)(""),[A,B]=(0,e.useState)(null),[C,D]=(0,e.useState)(null),[E,F]=(0,e.useState)(null),[G,H]=(0,e.useState)(null),I=(0,e.useRef)(Promise.resolve()),[J,K]=(0,e.useState)(!1),[L,M]=(0,e.useState)(null),N=an.TOOL_HOSTS[a.id]??[],O=l||j||!1===k;(0,e.useCallback)(async()=>{try{let b=await fetch(`/api/cli-tools/antigravity-mitm/alias?tool=${a.id}`);if(b.ok){let a=await b.json();setModelMappings(a.aliases||{})}}catch{}},[a.id]);let P=(0,e.useCallback)(b=>{let c=I.current.then(async()=>{let c=await fetch("/api/cli-tools/antigravity-mitm/alias",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({tool:a.id,mappings:b})});if(!c.ok)throw Error(`Failed to save model mappings (status ${c.status})`)});return I.current=c.catch(()=>{}),c},[a.id]),Q=a=>{H(null),P(a).catch(a=>{H(a?.message||"Failed to save model mappings")})},R=(a,b)=>{let c={...modelMappings};return b?c[a]=b:delete c[a],c},S=()=>{if(!h)return;let a=i?"disable":"enable";O?T(a,""):(B(a),x(!0),D(null))},T=async(b,c)=>{t(!0),v(null),F(null);try{let d=await fetch("/api/cli-tools/antigravity-mitm",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({tool:a.id,action:b,sudoPassword:c})}),e=await d.json().catch(()=>({}));if(!d.ok)throw Error(e.error||`Failed to toggle DNS (status ${d.status})`);"enable"===b&&v(`Restart ${a.name} to apply changes`),x(!1),z(""),r?.(e)}catch(a){F(a?.message||"Failed to toggle DNS")}finally{t(!1),B(null)}},U=()=>{y.trim()?T(A,y):D("Sudo password is required")};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)(f.Zp,{padding:"xs",className:"overflow-hidden",children:[(0,d.jsxs)("div",{role:"button",tabIndex:0,"aria-expanded":b,"aria-label":`${b?"Collapse":"Expand"} ${a.name} settings`,className:"flex items-start justify-between gap-3 hover:cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/40 rounded-lg sm:items-center",onClick:c,onKeyDown:a=>{("Enter"===a.key||" "===a.key)&&(a.preventDefault(),c())},children:[(0,d.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,d.jsx)("div",{className:"size-8 flex items-center justify-center shrink-0",children:(0,d.jsx)(g.default,{src:a.image,alt:"",width:32,height:32,className:"size-8 object-contain rounded-lg",sizes:"32px",onError:a=>{a.target.style.display="none"}})}),(0,d.jsxs)("div",{className:"min-w-0",children:[(0,d.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,d.jsx)("h3",{className:"font-medium text-sm",children:a.name}),h?i?(0,d.jsx)(f.Ex,{variant:"success",size:"sm",children:"Active"}):(0,d.jsx)(f.Ex,{variant:"warning",size:"sm",children:"DNS off"}):(0,d.jsx)(f.Ex,{variant:"default",size:"sm",children:"Server off"})]}),(0,d.jsxs)("p",{className:"text-xs text-text-muted sm:truncate",children:["Intercept ",a.name," requests via MITM proxy"]})]})]}),(0,d.jsx)("span",{className:`material-symbols-outlined text-text-muted text-[20px] transition-transform ${b?"rotate-180":""}`,"aria-hidden":"true",children:"expand_more"})]}),b&&(0,d.jsxs)("div",{className:"mt-4 pt-4 border-t border-border flex flex-col gap-4",children:[N.length>0&&(0,d.jsxs)("div",{className:"mt-2 rounded-md border border-border bg-surface/50 px-2 py-1.5",children:[(0,d.jsx)("p",{className:"text-[10px] font-medium tracking-wide text-text-main/80 mb-1",children:"Edit hosts file manually to add the following entries:"}),(0,d.jsx)("ul",{className:"list-none space-y-0.5 font-mono text-[10px] text-text-muted break-all",children:N.map(a=>(0,d.jsxs)("li",{children:["127.0.0.1 ",a]},a))})]}),(0,d.jsxs)("div",{className:"flex flex-col gap-0.5 text-[11px] text-text-muted px-1",children:[(0,d.jsxs)("p",{children:["Toggle DNS to redirect ",a.name," traffic through Switchboard via MITM."]}),!i&&(0,d.jsx)("p",{className:"text-amber-600 text-[10px] mt-1",children:"⚠️ Enable DNS to edit model mappings"})]}),a.defaultModels?.length>0&&(0,d.jsx)("div",{className:"flex flex-col gap-2",children:a.defaultModels.map(a=>(0,d.jsxs)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-[9rem_auto_1fr_auto] sm:items-center sm:gap-2",children:[(0,d.jsx)("span",{className:"text-xs font-semibold text-text-main sm:text-right",children:a.name}),(0,d.jsx)("span",{className:"material-symbols-outlined hidden text-text-muted text-[14px] sm:inline",children:"arrow_forward"}),(0,d.jsxs)("div",{className:"relative w-full min-w-0",children:[(0,d.jsx)("input",{type:"text",value:modelMappings[a.alias]||"",onChange:b=>{var c,d;return c=a.alias,d=b.target.value,void setModelMappings(a=>{let b={...a};return d?b[c]=d:delete b[c],b})},onBlur:b=>{Q(R(a.alias,b.target.value))},placeholder:"provider/model-id",disabled:!i,className:`w-full min-w-0 pl-2 pr-7 py-2 bg-surface rounded border border-border text-xs focus:outline-none focus:ring-1 focus:ring-primary/50 sm:py-1.5 ${!i?"opacity-50 cursor-not-allowed":""}`}),modelMappings[a.alias]&&(0,d.jsx)("button",{onClick:()=>{let b=R(a.alias,"");setModelMappings(b),Q(b)},className:"absolute right-1 top-1/2 -translate-y-1/2 p-0.5 text-text-muted hover:text-red-500 rounded transition-colors",title:"Clear",children:(0,d.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"close"})})]}),(0,d.jsx)("button",{onClick:()=>openModelSelector(a.alias),disabled:!o||!i,className:`rounded border px-2 py-2 text-xs transition-colors sm:py-1.5 ${o&&i?"bg-surface border-border hover:border-primary cursor-pointer":"opacity-50 cursor-not-allowed border-border"}`,children:"Select"})]},a.alias))}),a.defaultModels?.length===0&&(0,d.jsx)("p",{className:"text-xs text-text-muted px-1",children:"Model mappings will be available soon."}),(0,d.jsxs)("div",{className:"flex flex-col gap-2 sm:items-start",children:[i?(0,d.jsxs)("button",{onClick:S,disabled:!h||s,className:"flex w-full items-center justify-center gap-1.5 rounded-lg border border-red-500/30 bg-red-500/10 px-4 py-2 text-xs font-medium text-red-500 transition-colors hover:bg-red-500/20 disabled:cursor-not-allowed disabled:opacity-50 sm:w-auto sm:py-1.5",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"stop_circle"}),"Stop DNS"]}):(0,d.jsxs)("button",{onClick:S,disabled:!h||s,className:"flex w-full items-center justify-center gap-1.5 rounded-lg border border-primary/30 bg-primary/10 px-4 py-2 text-xs font-medium text-primary transition-colors hover:bg-primary/20 disabled:cursor-not-allowed disabled:opacity-50 sm:w-auto sm:py-1.5",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"play_circle"}),"Start DNS"]}),u&&(0,d.jsxs)("div",{className:"flex items-center gap-2 px-2 py-1.5 rounded text-xs text-amber-500",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"warning"}),(0,d.jsx)("span",{children:u})]}),(E||G)&&(0,d.jsxs)("div",{role:"alert",className:"flex items-center gap-2 px-2 py-1.5 rounded text-xs bg-red-500/10 text-red-600 dark:text-red-400",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"error"}),(0,d.jsx)("span",{children:E||G})]})]})]})]}),w&&(0,d.jsx)("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm",onKeyDown:a=>{"Escape"!==a.key||s||(x(!1),z(""),D(null))},children:(0,d.jsxs)("div",{role:"dialog","aria-modal":"true","aria-labelledby":"mitm-tool-sudo-title",className:"mx-4 flex w-full max-w-sm flex-col gap-4 rounded-xl border border-border bg-surface p-5 shadow-xl sm:p-6",children:[(0,d.jsx)("h3",{id:"mitm-tool-sudo-title",className:"font-semibold text-text-main",children:"Sudo Password Required"}),(0,d.jsxs)("div",{className:"flex items-start gap-3 p-3 bg-yellow-500/10 border border-yellow-500/30 rounded-lg",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-yellow-500 text-[20px]","aria-hidden":"true",children:"warning"}),(0,d.jsx)("p",{className:"text-xs text-text-muted",children:"Required to modify /etc/hosts and flush DNS cache"})]}),(0,d.jsx)(f.pd,{label:"Sudo password",type:"password",autoFocus:!0,placeholder:"Enter sudo password",value:y,onChange:a=>z(a.target.value),onKeyDown:a=>{"Enter"!==a.key||s||U()}}),C&&(0,d.jsxs)("div",{role:"alert",className:"flex items-center gap-2 px-2 py-1.5 rounded text-xs bg-red-500/10 text-red-600",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[14px]","aria-hidden":"true",children:"error"}),(0,d.jsx)("span",{children:C})]}),(0,d.jsxs)("div",{className:"flex items-center justify-end gap-2",children:[(0,d.jsx)(f.$n,{variant:"ghost",size:"sm",onClick:()=>{x(!1),z(""),D(null)},disabled:s,children:"Cancel"}),(0,d.jsx)(f.$n,{variant:"primary",size:"sm",onClick:U,loading:s,children:"Confirm"})]})]})}),(0,d.jsx)(f.rq,{isOpen:J,onClose:()=>K(!1),onSelect:a=>{if(!L)return;if(a.isPlaceholder)return void v(`"${a.value}" is a placeholder — connect the provider first, then pick a real model`);let b={...modelMappings,[L]:a.value};setModelMappings(b),Q(b)},selectedModel:L?modelMappings[L]:null,activeProviders:n,modelAliases:p,title:`Select model for ${L}`})]})}var ap=c(2116),aq=c.n(ap);function ar({tool:a}){return(0,d.jsx)(aq(),{href:"/dashboard/mitm",className:"block",children:(0,d.jsx)(f.Zp,{padding:"sm",className:"overflow-hidden hover:border-primary/50 transition-colors cursor-pointer",children:(0,d.jsxs)("div",{className:"flex items-center justify-between",children:[(0,d.jsxs)("div",{className:"flex items-center gap-3",children:[(0,d.jsx)("div",{className:"size-8 flex items-center justify-center shrink-0",children:a.image?(0,d.jsx)(g.default,{src:a.image,alt:a.name,width:32,height:32,className:"size-8 object-contain rounded-lg",sizes:"32px",onError:a=>{a.target.style.display="none"}}):(0,d.jsx)("span",{className:"flex size-8 items-center justify-center rounded-lg bg-purple-500/10 text-sm font-semibold text-purple-600 dark:text-purple-400",children:a.name?.charAt(0)?.toUpperCase()||"?"})}),(0,d.jsxs)("div",{className:"min-w-0",children:[(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[(0,d.jsx)("h3",{className:"font-medium text-sm",children:a.name}),(0,d.jsx)("span",{className:"px-1.5 py-0.5 text-[10px] font-medium bg-purple-500/10 text-purple-600 dark:text-purple-400 rounded-full",children:"MITM"})]}),(0,d.jsx)("p",{className:"text-xs text-text-muted truncate",children:a.description})]})]}),(0,d.jsx)("span",{className:"material-symbols-outlined text-text-muted text-[20px]",children:"chevron_right"})]})})})}},50412:(a,b,c)=>{c.d(b,{x0:()=>x.default,Ex:()=>j.default,$n:()=>d.default,nh:()=>C.default,Zp:()=>g.default,Qv:()=>i.CardSkeleton,CK:()=>o.default,uo:()=>h.ConfirmModal,G9:()=>t.default,wI:()=>w.default,vj:()=>v.default,vE:()=>u.default,pd:()=>e.default,Mh:()=>s.default,uR:()=>n.default,Nf:()=>p.default,aF:()=>h.default,rq:()=>m.default,gw:()=>y.default,LF:()=>l.default,Wx:()=>B.default,gM:()=>r.default,Iz:()=>z.default,l6:()=>f.default,lM:()=>k.default,m_:()=>A.default,jK:()=>q.default});var d=c(99070),e=c(83552),f=c(4770),g=c(17660),h=c(95145),i=c(74812);c(25919);var j=c(75171),k=c(95514);c(43878),c(19308),c(42196),c(32456),c(48781);var l=c(79346),m=c(83352),n=c(39645),o=c(62727),p=c(20084),q=c(87226);c(267),c(3236),c(11229);var r=c(91809);c(4481);var s=c(5291);c(56110);var t=c(51109),u=c(79488),v=c(43182),w=c(51585),x=c(67738),y=c(50585),z=c(91099),A=c(32971),B=c(11633),C=c(38930);c(5993),c(53838)},62911:(a,b,c)=>{c.d(b,{dM:()=>e,wn:()=>d});let d={antigravity:{id:"antigravity",name:"Antigravity",image:"/providers/antigravity.png",color:"#4285F4",description:"Google Antigravity IDE with MITM",configType:"mitm",mitmDomain:"daily-cloudcode-pa.googleapis.com",modelAliases:["gemini-3.5-flash-low","gemini-3-flash-agent","gemini-3.5-flash-extra-low","gemini-3.1-pro-low","gemini-pro-agent","claude-sonnet-4-6","claude-opus-4-6-thinking","gpt-oss-120b-medium","gemini-3-flash"],defaultModels:[{id:"gemini-3.5-flash-low",name:"Gemini 3.5 Flash (Medium) / Default",alias:"gemini-3.5-flash-low",mandatory:!0},{id:"gemini-3-flash-agent",name:"Gemini 3.5 Flash (High)",alias:"gemini-3-flash-agent"},{id:"gemini-3.5-flash-extra-low",name:"Gemini 3.5 Flash (Low)",alias:"gemini-3.5-flash-extra-low"},{id:"gemini-3.1-pro-low",name:"Gemini 3.1 Pro (Low)",alias:"gemini-3.1-pro-low"},{id:"gemini-pro-agent",name:"Gemini 3.1 Pro (High)",alias:"gemini-pro-agent"},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6 (Thinking)",alias:"claude-sonnet-4-6"},{id:"claude-opus-4-6-thinking",name:"Claude Opus 4.6 (Thinking)",alias:"claude-opus-4-6-thinking"},{id:"gpt-oss-120b-medium",name:"GPT-OSS 120B (Medium)",alias:"gpt-oss-120b-medium"},{id:"gemini-3-flash",name:"Gemini 3 Flash (Command)",alias:"gemini-3-flash"}]},copilot:{id:"copilot",name:"GitHub Copilot",image:"/providers/copilot.png",color:"#1F6FEB",description:"GitHub Copilot IDE with MITM",configType:"mitm",mitmDomain:"api.individual.githubcopilot.com",modelAliases:["gpt-5-mini","gpt-5.4-nano","claude-haiku-4.5","gpt-4o","gpt-4.1"],defaultModels:[{id:"gpt-5-mini",name:"GPT-5 mini",alias:"gpt-5-mini"},{id:"gpt-5.4-nano",name:"GPT-5.4 nano",alias:"gpt-5.4-nano"},{id:"claude-haiku-4.5",name:"Claude Haiku 4.5",alias:"claude-haiku-4.5"},{id:"gpt-4o",name:"GPT-4o",alias:"gpt-4o"},{id:"gpt-4.1",name:"GPT-4.1",alias:"gpt-4.1"}]},kiro:{id:"kiro",name:"Kiro",image:"/providers/kiro.png",color:"#FF6B00",description:"Kiro IDE with MITM",configType:"mitm",mitmDomain:"q.us-east-1.amazonaws.com",defaultModels:[{id:"claude-sonnet-5",name:"Claude Sonnet 5",alias:"claude-sonnet-5"},{id:"claude-sonnet-4.5",name:"Claude Sonnet 4.5",alias:"claude-sonnet-4.5"},{id:"claude-sonnet-4",name:"Claude Sonnet 4",alias:"claude-sonnet-4"},{id:"claude-haiku-4.5",name:"Claude Haiku 4.5",alias:"claude-haiku-4.5"},{id:"deepseek-3.2",name:"DeepSeek 3.2",alias:"deepseek-3.2"},{id:"minimax-m2.1",name:"MiniMax M2.1",alias:"minimax-m2.1"},{id:"simple-task",name:"Qwen3 Coder Next",alias:"simple-task"}]}},e={claude:{id:"claude",name:"Claude Code",image:"/providers/claude.png",color:"#D97757",description:"Anthropic Claude Code CLI",configType:"env",envVars:{baseUrl:"ANTHROPIC_BASE_URL",model:"ANTHROPIC_MODEL",opusModel:"ANTHROPIC_DEFAULT_OPUS_MODEL",sonnetModel:"ANTHROPIC_DEFAULT_SONNET_MODEL",fableModel:"ANTHROPIC_DEFAULT_FABLE_MODEL",haikuModel:"ANTHROPIC_DEFAULT_HAIKU_MODEL"},modelAliases:["default","sonnet","opus","fable","haiku","opusplan"],settingsFile:"~/.claude/settings.json",defaultModels:[{id:"opus",name:"Claude Opus",alias:"opus",envKey:"ANTHROPIC_DEFAULT_OPUS_MODEL",defaultValue:"cc/claude-opus-4-8"},{id:"sonnet",name:"Claude Sonnet",alias:"sonnet",envKey:"ANTHROPIC_DEFAULT_SONNET_MODEL",defaultValue:"cc/claude-sonnet-5"},{id:"fable",name:"Claude Fable",alias:"fable",envKey:"ANTHROPIC_DEFAULT_FABLE_MODEL",defaultValue:"cc/claude-fable-5"},{id:"haiku",name:"Claude Haiku",alias:"haiku",envKey:"ANTHROPIC_DEFAULT_HAIKU_MODEL",defaultValue:"cc/claude-haiku-4-5-20251001"}]},openclaw:{id:"openclaw",name:"Open Claw",image:"/providers/openclaw.png",color:"#FF6B35",description:"Open Claw AI Assistant",configType:"custom"},codex:{id:"codex",name:"OpenAI Codex CLI / App",image:"/providers/codex.png",color:"#10A37F",description:"OpenAI Codex CLI",configType:"custom"},opencode:{id:"opencode",name:"OpenCode",image:"/providers/opencode.png",color:"#E87040",description:"OpenCode AI Terminal Assistant",configType:"custom"},cowork:{id:"cowork",name:"Claude Cowork",image:"/providers/claude.png",color:"#D97757",description:"Claude Desktop Cowork (third-party inference)",configType:"custom"},hermes:{id:"hermes",name:"Hermes Agent",image:"/providers/hermes.png",color:"#8B5CF6",description:"Nous Research self-improving AI agent",configType:"custom"},droid:{id:"droid",name:"Factory Droid",image:"/providers/droid.png",color:"#00D4FF",description:"Factory Droid AI Assistant",configType:"custom"},cursor:{id:"cursor",name:"Cursor",image:"/providers/cursor.png",color:"#000000",description:"Cursor AI Code Editor",configType:"guide",modelSelection:"multiple",requiresExternalUrl:!0,notes:[{type:"warning",text:"Requires Cursor Pro account to use this feature."},{type:"cloudCheck",text:"Cursor routes requests through its own server, so local endpoint is not supported. Please enable Tunnel or Cloud Endpoint in Settings."}],guideSteps:[{step:1,title:"Open Settings",desc:"Go to Settings → Models"},{step:2,title:"Enable OpenAI API",desc:'Enable "OpenAI API key" option'},{step:3,title:"Base URL",value:"{{baseUrl}}",copyable:!0},{step:4,title:"API Key",type:"apiKeySelector"},{step:5,title:"Select Models",type:"modelSelector"},{step:6,title:"Add Custom Models",desc:"Click “View All Models” → “Add Custom Model” once for each selected model. The endpoint and API key are shared."}]},cline:{id:"cline",name:"Cline",image:"/providers/cline.png",color:"#00D1B2",description:"Cline AI Coding Assistant",configType:"custom"},kilo:{id:"kilo",name:"Kilo Code",image:"/providers/kilocode.png",color:"#FF6B6B",description:"Kilo Code AI Assistant",configType:"custom"},roo:{id:"roo",name:"Roo",image:"/providers/roo.png",color:"#FF6B6B",description:"Roo AI Assistant",configType:"guide",modelSelection:"multiple",guideSteps:[{step:1,title:"Open Settings",desc:"Go to Roo Settings panel"},{step:2,title:"Select Provider",desc:"Choose API Provider → OpenAI Compatible"},{step:3,title:"Base URL",value:"{{baseUrl}}",copyable:!0},{step:4,title:"API Key",type:"apiKeySelector"},{step:5,title:"Select Models",type:"modelSelector"},{step:6,title:"Create Profiles",desc:"Create one named Switchboard API Configuration Profile per selected model; Roo stores one model per profile."}]},continue:{id:"continue",name:"Continue",image:"/providers/continue.png",color:"#7C3AED",description:"Continue AI Assistant",configType:"guide",modelSelection:"multiple",guideSteps:[{step:1,title:"Open Config",desc:"Open Continue configuration file"},{step:2,title:"API Key",type:"apiKeySelector"},{step:3,title:"Select Models",type:"modelSelector"},{step:4,title:"Add Model Config",desc:"Merge the generated entries into ~/.continue/config.yaml."}],codeBlock:{language:"yaml",code:({baseUrl:a,apiKey:b,models:c})=>`name: Switchboard
65
65
  version: 1.0.0
66
66
  schema: v1
67
67
  models:
@@ -1 +1 @@
1
- "use strict";exports.id=5624,exports.ids=[5624],exports.modules={50412:(a,b,c)=>{c.d(b,{x0:()=>x.default,Ex:()=>j.default,$n:()=>d.default,nh:()=>C.default,Zp:()=>g.default,Qv:()=>i.CardSkeleton,CK:()=>o.default,uo:()=>h.ConfirmModal,G9:()=>t.default,wI:()=>w.default,vj:()=>v.default,vE:()=>u.default,pd:()=>e.default,Mh:()=>s.default,uR:()=>n.default,Nf:()=>p.default,aF:()=>h.default,rq:()=>m.default,gw:()=>y.default,LF:()=>l.default,Wx:()=>B.default,gM:()=>r.default,Iz:()=>z.default,l6:()=>f.default,lM:()=>k.default,m_:()=>A.default,jK:()=>q.default});var d=c(99070),e=c(83552),f=c(82389),g=c(17660),h=c(95145),i=c(74812);c(25919);var j=c(75171),k=c(95514);c(43878),c(19308),c(42196),c(32456),c(48781);var l=c(79346),m=c(83352),n=c(39645),o=c(62727),p=c(20084),q=c(87226);c(267),c(3236),c(11229);var r=c(91809);c(4481);var s=c(5291);c(56110);var t=c(51109),u=c(79488),v=c(43182),w=c(51585),x=c(67738),y=c(50585),z=c(91099),A=c(32971),B=c(11633),C=c(38930);c(5993),c(53838)},81847:(a,b,c)=>{c.d(b,{NA:()=>e,WX:()=>r,Z3:()=>v,Z9:()=>i,bC:()=>q,de:()=>f,v2:()=>t,yW:()=>p,zt:()=>u});let d=["peak","offPeak"],e=["always","peak-only","off-peak-only"],f=["mon","tue","wed","thu","fri","sat","sun"],g=new Set(f),h=/^([01]\d|2[0-3]):([0-5]\d)$/,i=[{id:"deepseek-current",label:"DeepSeek (current): peak 01:00–04:00 & 06:00–10:00 UTC, Mon–Fri",config:{timezone:"UTC",defaultState:"offPeak",windows:[{type:"peak",start:"01:00",end:"04:00",days:["mon","tue","wed","thu","fri"]},{type:"peak",start:"06:00",end:"10:00",days:["mon","tue","wed","thu","fri"]}]}},{id:"deepseek-2025-02",label:"DeepSeek (Feb 2025): off-peak 16:30–00:30 UTC daily",config:{timezone:"UTC",defaultState:"peak",windows:[{type:"offPeak",start:"16:30",end:"00:30"}]}}],j=new Map;function k(a){let b=j.get(a);return b||(b=new Intl.DateTimeFormat("en-US",{timeZone:a,hourCycle:"h23",weekday:"short",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}),j.set(a,b)),b}function l(a,b){let c={};for(let d of k(b).formatToParts(new Date(a)))"literal"!==d.type&&(c[d.type]=d.value);let d=Number(c.hour),e=Number(c.minute);return{weekday:c.weekday.toLowerCase(),year:Number(c.year),month:Number(c.month),day:Number(c.day),hour:d,minute:e,minutes:60*d+e}}function m(a,b){let c=Date.UTC(a.year,a.month-1,a.day,a.hour,a.minute),d=c;for(let a=0;a<3;a++){let a=l(d,b),e=Date.UTC(a.year,a.month-1,a.day,a.hour,a.minute)-c;if(0===e)break;d-=e}return d}function n(a){let b=h.exec(String(a||""));return b?60*Number(b[1])+Number(b[2]):-1}function o(a){return new Set(Array.isArray(a?.days)&&a.days.length?a.days.filter(a=>g.has(a)):f)}function p(a,b=Date.now()){if(!a||"object"!=typeof a||!Array.isArray(a.windows)||!a.windows.length)return"unscheduled";try{let c="string"==typeof a.timezone&&a.timezone?a.timezone:"UTC",d=l(b,c);for(let b of a.windows)if(b&&"object"==typeof b&&function(a,b,c,d){let e=n(a.start),g=n(a.end);if(e<0||g<0||e===g)return!1;if(e<g)return b.has(c)&&d>=e&&d<g;if(b.has(c)&&d>=e)return!0;let h=(f.indexOf(c)+6)%7,i=f[h];return b.has(i)&&d<g}(b,o(b),d.weekday,d.minutes))return"peak"===b.type?"peak":"offPeak";return"peak"===a.defaultState?"peak":"offPeak"}catch{return"unscheduled"}}function q(a,b=Date.now()){let c=p(a,b);if("unscheduled"===c)return null;let d="string"==typeof a.timezone&&a.timezone?a.timezone:"UTC",e=[],f=l(b,d);for(let b=-1;b<8;b++){let c=l(m({year:f.year,month:f.month,day:f.day,hour:12,minute:0},d)+864e5*b,d),g=l(m({year:f.year,month:f.month,day:f.day,hour:12,minute:0},d)+(b-1)*864e5,d);for(let b of a.windows){if(!b||"object"!=typeof b)continue;let a=n(b.start),f=n(b.end);if(a<0||f<0||a===f)continue;let h=o(b),i={year:c.year,month:c.month,day:c.day,hour:0,minute:0},j=a=>(function(a,b){let c=m(a,b),d=c+36e5,e=l(c,b),f=l(d,b);return e.year===f.year&&e.month===f.month&&e.day===f.day&&e.hour===f.hour&&e.minute===f.minute?[c,d]:[c]})({...i,hour:Math.floor(a/60),minute:a%60},d);h.has(c.weekday)&&(e.push(...j(a)),f>a&&e.push(...j(f))),f<a&&h.has(g.weekday)&&e.push(...j(f))}}for(let d of(e.sort((a,b)=>a-b),e))if(!(d<=b)&&p(a,d)!==c)return d;return null}function r(a){let b="string"==typeof a?a:String(a??""),c=b.indexOf("/");return -1===c?b:b.slice(0,c)}function s(a){return!!a&&"object"==typeof a&&!Array.isArray(a)}function t(a,b){if(!s(a))return{error:`Provider "${b}" schedule must be an object.`};let c=("string"==typeof a.timezone?a.timezone.trim():"")||"UTC";if(!function(a){if("string"!=typeof a||!a)return!1;try{return k(a),!0}catch{return j.delete(a),!1}}(c))return{error:`Provider "${b}" schedule timezone "${c}" is not a valid IANA zone.`};let e=c;try{e=k(c).resolvedOptions().timeZone||c}catch{}if(!Array.isArray(a.windows)||0===a.windows.length)return{error:`Provider "${b}" schedule needs at least one time window.`};if(a.windows.length>14)return{error:`Provider "${b}" schedule allows at most 14 windows.`};if(null!=a.defaultState&&!d.includes(a.defaultState))return{error:`Provider "${b}" defaultState must be "peak" or "offPeak".`};let i=[];for(let[c,d]of a.windows.entries()){if(!s(d))return{error:`Provider "${b}" window ${c+1} must be an object.`};if("peak"!==d.type&&"offPeak"!==d.type)return{error:`Provider "${b}" window ${c+1} type must be "peak" or "offPeak".`};if(!h.test(String(d.start||""))||!h.test(String(d.end||"")))return{error:`Provider "${b}" window ${c+1} start/end must be HH:MM (24h).`};if(d.start===d.end)return{error:`Provider "${b}" window ${c+1} start and end must differ.`};let a=f;if(void 0!==d.days){if(!Array.isArray(d.days)||!d.days.length||!d.days.every(a=>g.has(a)))return{error:`Provider "${b}" window ${c+1} days must be a non-empty subset of ${f.join(", ")}.`};a=[...new Set(d.days)].sort((a,b)=>f.indexOf(a)-f.indexOf(b))}i.push({type:d.type,start:d.start,end:d.end,days:a})}return{value:{timezone:e,defaultState:"peak"===a.defaultState?"peak":"offPeak",windows:i}}}function u(a){let b=Math.max(1,Math.round(a/6e4));if(b<60)return`${b} min`;let c=Math.floor(b/60),d=b%60;return d?`${c}h ${d}m`:`${c}h`}function v(a,b){return b?Object.keys(b).filter(b=>"unscheduled"===p(a?.[r(b)])):[]}}};
1
+ "use strict";exports.id=5624,exports.ids=[5624],exports.modules={50412:(a,b,c)=>{c.d(b,{x0:()=>x.default,Ex:()=>j.default,$n:()=>d.default,nh:()=>C.default,Zp:()=>g.default,Qv:()=>i.CardSkeleton,CK:()=>o.default,uo:()=>h.ConfirmModal,G9:()=>t.default,wI:()=>w.default,vj:()=>v.default,vE:()=>u.default,pd:()=>e.default,Mh:()=>s.default,uR:()=>n.default,Nf:()=>p.default,aF:()=>h.default,rq:()=>m.default,gw:()=>y.default,LF:()=>l.default,Wx:()=>B.default,gM:()=>r.default,Iz:()=>z.default,l6:()=>f.default,lM:()=>k.default,m_:()=>A.default,jK:()=>q.default});var d=c(99070),e=c(83552),f=c(4770),g=c(17660),h=c(95145),i=c(74812);c(25919);var j=c(75171),k=c(95514);c(43878),c(19308),c(42196),c(32456),c(48781);var l=c(79346),m=c(83352),n=c(39645),o=c(62727),p=c(20084),q=c(87226);c(267),c(3236),c(11229);var r=c(91809);c(4481);var s=c(5291);c(56110);var t=c(51109),u=c(79488),v=c(43182),w=c(51585),x=c(67738),y=c(50585),z=c(91099),A=c(32971),B=c(11633),C=c(38930);c(5993),c(53838)},81847:(a,b,c)=>{c.d(b,{NA:()=>e,WX:()=>r,Z3:()=>v,Z9:()=>i,bC:()=>q,de:()=>f,v2:()=>t,yW:()=>p,zt:()=>u});let d=["peak","offPeak"],e=["always","peak-only","off-peak-only"],f=["mon","tue","wed","thu","fri","sat","sun"],g=new Set(f),h=/^([01]\d|2[0-3]):([0-5]\d)$/,i=[{id:"deepseek-current",label:"DeepSeek (current): peak 01:00–04:00 & 06:00–10:00 UTC, Mon–Fri",config:{timezone:"UTC",defaultState:"offPeak",windows:[{type:"peak",start:"01:00",end:"04:00",days:["mon","tue","wed","thu","fri"]},{type:"peak",start:"06:00",end:"10:00",days:["mon","tue","wed","thu","fri"]}]}},{id:"deepseek-2025-02",label:"DeepSeek (Feb 2025): off-peak 16:30–00:30 UTC daily",config:{timezone:"UTC",defaultState:"peak",windows:[{type:"offPeak",start:"16:30",end:"00:30"}]}}],j=new Map;function k(a){let b=j.get(a);return b||(b=new Intl.DateTimeFormat("en-US",{timeZone:a,hourCycle:"h23",weekday:"short",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}),j.set(a,b)),b}function l(a,b){let c={};for(let d of k(b).formatToParts(new Date(a)))"literal"!==d.type&&(c[d.type]=d.value);let d=Number(c.hour),e=Number(c.minute);return{weekday:c.weekday.toLowerCase(),year:Number(c.year),month:Number(c.month),day:Number(c.day),hour:d,minute:e,minutes:60*d+e}}function m(a,b){let c=Date.UTC(a.year,a.month-1,a.day,a.hour,a.minute),d=c;for(let a=0;a<3;a++){let a=l(d,b),e=Date.UTC(a.year,a.month-1,a.day,a.hour,a.minute)-c;if(0===e)break;d-=e}return d}function n(a){let b=h.exec(String(a||""));return b?60*Number(b[1])+Number(b[2]):-1}function o(a){return new Set(Array.isArray(a?.days)&&a.days.length?a.days.filter(a=>g.has(a)):f)}function p(a,b=Date.now()){if(!a||"object"!=typeof a||!Array.isArray(a.windows)||!a.windows.length)return"unscheduled";try{let c="string"==typeof a.timezone&&a.timezone?a.timezone:"UTC",d=l(b,c);for(let b of a.windows)if(b&&"object"==typeof b&&function(a,b,c,d){let e=n(a.start),g=n(a.end);if(e<0||g<0||e===g)return!1;if(e<g)return b.has(c)&&d>=e&&d<g;if(b.has(c)&&d>=e)return!0;let h=(f.indexOf(c)+6)%7,i=f[h];return b.has(i)&&d<g}(b,o(b),d.weekday,d.minutes))return"peak"===b.type?"peak":"offPeak";return"peak"===a.defaultState?"peak":"offPeak"}catch{return"unscheduled"}}function q(a,b=Date.now()){let c=p(a,b);if("unscheduled"===c)return null;let d="string"==typeof a.timezone&&a.timezone?a.timezone:"UTC",e=[],f=l(b,d);for(let b=-1;b<8;b++){let c=l(m({year:f.year,month:f.month,day:f.day,hour:12,minute:0},d)+864e5*b,d),g=l(m({year:f.year,month:f.month,day:f.day,hour:12,minute:0},d)+(b-1)*864e5,d);for(let b of a.windows){if(!b||"object"!=typeof b)continue;let a=n(b.start),f=n(b.end);if(a<0||f<0||a===f)continue;let h=o(b),i={year:c.year,month:c.month,day:c.day,hour:0,minute:0},j=a=>(function(a,b){let c=m(a,b),d=c+36e5,e=l(c,b),f=l(d,b);return e.year===f.year&&e.month===f.month&&e.day===f.day&&e.hour===f.hour&&e.minute===f.minute?[c,d]:[c]})({...i,hour:Math.floor(a/60),minute:a%60},d);h.has(c.weekday)&&(e.push(...j(a)),f>a&&e.push(...j(f))),f<a&&h.has(g.weekday)&&e.push(...j(f))}}for(let d of(e.sort((a,b)=>a-b),e))if(!(d<=b)&&p(a,d)!==c)return d;return null}function r(a){let b="string"==typeof a?a:String(a??""),c=b.indexOf("/");return -1===c?b:b.slice(0,c)}function s(a){return!!a&&"object"==typeof a&&!Array.isArray(a)}function t(a,b){if(!s(a))return{error:`Provider "${b}" schedule must be an object.`};let c=("string"==typeof a.timezone?a.timezone.trim():"")||"UTC";if(!function(a){if("string"!=typeof a||!a)return!1;try{return k(a),!0}catch{return j.delete(a),!1}}(c))return{error:`Provider "${b}" schedule timezone "${c}" is not a valid IANA zone.`};let e=c;try{e=k(c).resolvedOptions().timeZone||c}catch{}if(!Array.isArray(a.windows)||0===a.windows.length)return{error:`Provider "${b}" schedule needs at least one time window.`};if(a.windows.length>14)return{error:`Provider "${b}" schedule allows at most 14 windows.`};if(null!=a.defaultState&&!d.includes(a.defaultState))return{error:`Provider "${b}" defaultState must be "peak" or "offPeak".`};let i=[];for(let[c,d]of a.windows.entries()){if(!s(d))return{error:`Provider "${b}" window ${c+1} must be an object.`};if("peak"!==d.type&&"offPeak"!==d.type)return{error:`Provider "${b}" window ${c+1} type must be "peak" or "offPeak".`};if(!h.test(String(d.start||""))||!h.test(String(d.end||"")))return{error:`Provider "${b}" window ${c+1} start/end must be HH:MM (24h).`};if(d.start===d.end)return{error:`Provider "${b}" window ${c+1} start and end must differ.`};let a=f;if(void 0!==d.days){if(!Array.isArray(d.days)||!d.days.length||!d.days.every(a=>g.has(a)))return{error:`Provider "${b}" window ${c+1} days must be a non-empty subset of ${f.join(", ")}.`};a=[...new Set(d.days)].sort((a,b)=>f.indexOf(a)-f.indexOf(b))}i.push({type:d.type,start:d.start,end:d.end,days:a})}return{value:{timezone:e,defaultState:"peak"===a.defaultState?"peak":"offPeak",windows:i}}}function u(a){let b=Math.max(1,Math.round(a/6e4));if(b<60)return`${b} min`;let c=Math.floor(b/60),d=b%60;return d?`${c}h ${d}m`:`${c}h`}function v(a,b){return b?Object.keys(b).filter(b=>"unscheduled"===p(a?.[r(b)])):[]}}};
@@ -1,7 +1,7 @@
1
1
  "use strict";exports.id=5717,exports.ids=[5717],exports.modules={1129:(a,b,c)=>{c.r(b),c.d(b,{createProviderNode:()=>l,deleteProviderNode:()=>n,getProviderNodeById:()=>k,getProviderNodes:()=>j,updateProviderNode:()=>m});var d=c(47293),e=c(36366),f=c(644),g=c(2903);function h(a){return a?{...(0,f.q)(a.data,{}),id:a.id,type:a.type,name:a.name,createdAt:a.createdAt,updatedAt:a.updatedAt}:null}function i(a,b){let c=function(a){let{id:b,type:c,name:d,createdAt:e,updatedAt:g,...h}=a;return{id:b,type:c??null,name:d??null,data:(0,f.s)(h),createdAt:e,updatedAt:g}}(b);a.run(`INSERT INTO providerNodes(id, type, name, data, createdAt, updatedAt)
2
2
  VALUES(?, ?, ?, ?, ?, ?)
3
3
  ON CONFLICT(id) DO UPDATE SET
4
- type=excluded.type, name=excluded.name, data=excluded.data, updatedAt=excluded.updatedAt`,[c.id,c.type,c.name,c.data,c.createdAt,c.updatedAt])}async function j(a={}){let b=await (0,e.c)(),c=[],d=[];a.type&&(c.push("type = ?"),d.push(a.type));let f=`SELECT * FROM providerNodes${c.length?` WHERE ${c.join(" AND ")}`:""}`;return b.all(f,d).map(h)}async function k(a){return h((await (0,e.c)()).get("SELECT * FROM providerNodes WHERE id = ?",[a]))}async function l(a){let b=await (0,e.c)(),c=new Date().toISOString(),f={id:a.id||(0,d.A)(),type:a.type,name:a.name,prefix:a.prefix,apiType:a.apiType,baseUrl:a.baseUrl,createdAt:c,updatedAt:c};return i(b,f),f}async function m(a,b){let c=await (0,e.c)(),d=null;return c.transaction(()=>{let e=c.get("SELECT * FROM providerNodes WHERE id = ?",[a]);if(!e)return;let f={...h(e),...b,updatedAt:new Date().toISOString()};i(c,f),d=f}),d}async function n(a){let b=await (0,e.c)(),c=null;return b.transaction(()=>{let d=b.get("SELECT * FROM providerNodes WHERE id = ?",[a]);d&&(c=h(d),b.run("DELETE FROM providerNodes WHERE id = ?",[a]),(0,g.uQ)(b,a))}),c}},9460:(a,b,c)=>{c.d(b,{L9:()=>s,OM:()=>j,S8:()=>o,fv:()=>l,getMitmAlias:()=>r,o5:()=>k,py:()=>p,uL:()=>q,uv:()=>n});var d=c(36366),e=c(644),f=c(22846);let g=(0,f.U)("modelAliases"),h=(0,f.U)("customModels"),i=(0,f.U)("mitmAlias");async function j(){return await g.getAll()}async function k(a,b){await g.set(a,b)}async function l(a){await g.remove(a)}function m(a,b,c){return`${a}|${b}|${c}`}async function n(){return Object.values(await h.getAll())}async function o({providerAlias:a,id:b,type:c="llm",name:f,reasoning:g}){let h=m(a,b,c),i=await (0,d.c)(),j=!1;return i.transaction(()=>{if(i.get("SELECT 1 FROM kv WHERE scope = 'customModels' AND key = ?",[h]))return;let d=(0,e.s)({providerAlias:a,id:b,type:c,name:f||b,...g?{reasoning:g}:{}});i.run("INSERT INTO kv(scope, key, value) VALUES('customModels', ?, ?)",[h,d]),j=!0}),j}async function p(a){if(!Array.isArray(a)||0===a.length)return{added:0,skipped:0};let b=await (0,d.c)(),c=0,f=0;return b.transaction(()=>{for(let d of a){let a=d?.providerAlias,g=d?.id;if(!a||!g){f+=1;continue}let h=d.type||d.kind||"llm",i=m(a,g,h);if(b.get("SELECT 1 FROM kv WHERE scope = 'customModels' AND key = ?",[i])){f+=1;continue}let j=(0,e.s)({providerAlias:a,id:g,type:h,name:d.name||g,...d.reasoning?{reasoning:d.reasoning}:{}});b.run("INSERT INTO kv(scope, key, value) VALUES('customModels', ?, ?)",[i,j]),c+=1}}),{added:c,skipped:f}}async function q({providerAlias:a,id:b,type:c="llm"}){await h.remove(m(a,b,c))}async function r(a){return a?await i.get(a)||{}:await i.getAll()}async function s(a,b){await i.set(a,b||{})}},15717:(a,b,c)=>{let d;c.d(b,{S8:()=>u.S8,py:()=>u.py,E5:()=>H.E5,PW:()=>k.authenticateApiKey,zL:()=>G,Iq:()=>k.createApiKey,jd:()=>q,iE:()=>g.createProviderConnection,i0:()=>j.createProviderNode,Lh:()=>k.deleteApiKey,CG:()=>t,uL:()=>u.uL,fv:()=>u.fv,fK:()=>g.deleteProviderConnection,op:()=>g.deleteProviderConnectionsByProvider,Pc:()=>j.deleteProviderNode,HS:()=>af.HS,tm:()=>A,oF:()=>B,zP:()=>ag,rg:()=>H.rg,yg:()=>k.getApiKeyById,PX:()=>k.getApiKeys,j$:()=>H.j$,fz:()=>k.getClientKeySpend,L:()=>o,Dj:()=>p,Uv:()=>n,b7:()=>H.b7,uv:()=>u.uv,vF:()=>z,c:()=>u.getMitmAlias,OM:()=>u.OM,p_:()=>F,r4:()=>v.r4,rr:()=>E,p3:()=>af.p3,Mc:()=>g.getProviderConnectionById,getProviderConnections:()=>g.getProviderConnections,Qu:()=>j.getProviderNodeById,Fh:()=>j.getProviderNodes,vY:()=>H.vY,Zx:()=>H.Zx,Rw:()=>ab,SL:()=>aa,mt:()=>i.getSettings,BY:()=>H.BY,K1:()=>ah,wJ:()=>k.normalizeClientKeyPatch,fp:()=>g.redactSecrets,e8:()=>af.e8,VT:()=>v.VT,yF:()=>v.yF,ox:()=>_,sZ:()=>H.sZ,L9:()=>u.L9,o5:()=>u.o5,_V:()=>H._V,uw:()=>H.uw,XW:()=>k.updateApiKey,oG:()=>s,KJ:()=>v.KJ,updateProviderConnection:()=>g.updateProviderConnection,$v:()=>g.updateProviderConnectionStatusIfCurrent,ho:()=>j.updateProviderNode,Xx:()=>i.Xx,H3:()=>i.H3,Fq:()=>D,ek:()=>k.validateApiKey});var e=c(36366),f=c(644),g=c(5781),h=c(38044),i=c(42655),j=c(1129),k=c(74452),l=c(47293);function m(a){return a?{id:a.id,name:a.name,kind:a.kind,models:(0,f.q)(a.models,[]),createdAt:a.createdAt,updatedAt:a.updatedAt}:null}async function n(){return(await (0,e.c)()).all("SELECT * FROM combos ORDER BY createdAt ASC").map(m)}async function o(a){return m((await (0,e.c)()).get("SELECT * FROM combos WHERE id = ?",[a]))}async function p(a){return m((await (0,e.c)()).get("SELECT * FROM combos WHERE name = ?",[a]))}async function q(a){let b=await (0,e.c)(),c=new Date().toISOString(),d={id:(0,l.A)(),name:a.name,kind:a.kind||null,models:a.models||[],createdAt:c,updatedAt:c};return b.run("INSERT INTO combos(id, name, kind, models, createdAt, updatedAt) VALUES(?, ?, ?, ?, ?, ?)",[d.id,d.name,d.kind,(0,f.s)(d.models),d.createdAt,d.updatedAt]),d}let r=["name","kind","models"];async function s(a,b){let c=await (0,e.c)(),d=null;return c.transaction(()=>{let e=c.get("SELECT * FROM combos WHERE id = ?",[a]);if(!e)return;let g={...m(e),updatedAt:new Date().toISOString()};for(let a of r)b&&Object.prototype.hasOwnProperty.call(b,a)&&(g[a]=b[a]);c.run("UPDATE combos SET name = ?, kind = ?, models = ?, updatedAt = ? WHERE id = ?",[g.name,g.kind,(0,f.s)(g.models||[]),g.updatedAt,a]),d=g}),d}async function t(a){let b=(await (0,e.c)()).run("DELETE FROM combos WHERE id = ?",[a]);return(b?.changes??0)>0}var u=c(9460),v=c(97914),w=c(65089);let x="disabledModels";function y(a,b){return[...new Set((Array.isArray(b)?b:[]).map(b=>(0,w.v)(b,a)).filter(Boolean))]}async function z(){let a=(await (0,e.c)()).all("SELECT key, value FROM kv WHERE scope = ?",[x]),b={};for(let c of a)b[c.key]=(0,f.q)(c.value,[]);return b}async function A(a,b){if(!a||!Array.isArray(b))return;let c=await (0,e.c)();c.transaction(()=>{let d=c.get("SELECT value FROM kv WHERE scope = ? AND key = ?",[x,a]),e=y(a,[...d&&(0,f.q)(d.value,[])||[],...b]);c.run("INSERT INTO kv(scope, key, value) VALUES(?, ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value",[x,a,(0,f.s)(e)])})}async function B(a,b){if(!a)return;let c=await (0,e.c)();c.transaction(()=>{let d;if(!Array.isArray(b)||0===b.length)return void c.run("DELETE FROM kv WHERE scope = ? AND key = ?",[x,a]);let e=c.get("SELECT value FROM kv WHERE scope = ? AND key = ?",[x,a]),g=e&&(0,f.q)(e.value,[])||[],h=(d=new Set(y(a,b)),y(a,g).filter(a=>!d.has(a)));0===h.length?c.run("DELETE FROM kv WHERE scope = ? AND key = ?",[x,a]):c.run("INSERT INTO kv(scope, key, value) VALUES(?, ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value",[x,a,(0,f.s)(h)])})}function C(a){return a?{providerId:a.provider_id,scopeKey:a.scope_key,modelId:a.model_id,kind:a.kind||"llm",status:a.status,latencyMs:null==a.latency_ms?null:Number(a.latency_ms),failureClass:a.failure_class||null,failureMessage:a.failure_message||null,checkedAt:a.checked_at}:null}async function D(a){let b=String(a?.providerId||"").trim(),c=String(a?.scopeKey||"").trim(),d=String(a?.modelId||"").trim(),f=String(a?.kind||"llm").trim()||"llm",g=String(a?.status||"").trim();if(!b||!c||!d||!["ok","dead","retryable"].includes(g))throw Error("Invalid probe result");let h=await (0,e.c)(),i=a.checkedAt||new Date().toISOString(),j=Number.isFinite(a.latencyMs)?Math.max(0,Math.round(Number(a.latencyMs))):null;return h.run(`INSERT INTO provider_model_probe(
4
+ type=excluded.type, name=excluded.name, data=excluded.data, updatedAt=excluded.updatedAt`,[c.id,c.type,c.name,c.data,c.createdAt,c.updatedAt])}async function j(a={}){let b=await (0,e.c)(),c=[],d=[];a.type&&(c.push("type = ?"),d.push(a.type));let f=`SELECT * FROM providerNodes${c.length?` WHERE ${c.join(" AND ")}`:""}`;return b.all(f,d).map(h)}async function k(a){return h((await (0,e.c)()).get("SELECT * FROM providerNodes WHERE id = ?",[a]))}async function l(a){let b=await (0,e.c)(),c=new Date().toISOString(),f={id:a.id||(0,d.A)(),type:a.type,name:a.name,prefix:a.prefix,apiType:a.apiType,baseUrl:a.baseUrl,createdAt:c,updatedAt:c};return i(b,f),f}async function m(a,b){let c=await (0,e.c)(),d=null;return c.transaction(()=>{let e=c.get("SELECT * FROM providerNodes WHERE id = ?",[a]);if(!e)return;let f={...h(e),...b,updatedAt:new Date().toISOString()};i(c,f),d=f}),d}async function n(a){let b=await (0,e.c)(),c=null;return b.transaction(()=>{let d=b.get("SELECT * FROM providerNodes WHERE id = ?",[a]);d&&(c=h(d),b.run("DELETE FROM providerNodes WHERE id = ?",[a]),(0,g.uQ)(b,a))}),c}},9460:(a,b,c)=>{c.d(b,{L9:()=>s,OM:()=>j,S8:()=>o,fv:()=>l,getMitmAlias:()=>r,o5:()=>k,py:()=>p,uL:()=>q,uv:()=>n});var d=c(36366),e=c(644),f=c(22846);let g=(0,f.U)("modelAliases"),h=(0,f.U)("customModels"),i=(0,f.U)("mitmAlias");async function j(){return await g.getAll()}async function k(a,b){await g.set(a,b)}async function l(a){await g.remove(a)}function m(a,b,c){return`${a}|${b}|${c}`}async function n(){return Object.values(await h.getAll())}async function o({providerAlias:a,id:b,type:c="llm",name:f,reasoning:g}){let h=m(a,b,c),i=await (0,d.c)(),j=!1;return i.transaction(()=>{if(i.get("SELECT 1 FROM kv WHERE scope = 'customModels' AND key = ?",[h]))return;let d=(0,e.s)({providerAlias:a,id:b,type:c,name:f||b,...g?{reasoning:g}:{}});i.run("INSERT INTO kv(scope, key, value) VALUES('customModels', ?, ?)",[h,d]),j=!0}),j}async function p(a){if(!Array.isArray(a)||0===a.length)return{added:0,skipped:0};let b=await (0,d.c)(),c=0,f=0;return b.transaction(()=>{for(let d of a){let a=d?.providerAlias,g=d?.id;if(!a||!g){f+=1;continue}let h=d.type||d.kind||"llm",i=m(a,g,h);if(b.get("SELECT 1 FROM kv WHERE scope = 'customModels' AND key = ?",[i])){f+=1;continue}let j=(0,e.s)({providerAlias:a,id:g,type:h,name:d.name||g,...d.reasoning?{reasoning:d.reasoning}:{}});b.run("INSERT INTO kv(scope, key, value) VALUES('customModels', ?, ?)",[i,j]),c+=1}}),{added:c,skipped:f}}async function q({providerAlias:a,id:b,type:c="llm"}){await h.remove(m(a,b,c))}async function r(a){return a?await i.get(a)||{}:await i.getAll()}async function s(a,b){await i.set(a,b||{})}},15717:(a,b,c)=>{let d;c.d(b,{S8:()=>u.S8,py:()=>u.py,E5:()=>H.E5,PW:()=>k.authenticateApiKey,zL:()=>G,Iq:()=>k.createApiKey,jd:()=>q,iE:()=>g.createProviderConnection,i0:()=>j.createProviderNode,Lh:()=>k.deleteApiKey,CG:()=>t,uL:()=>u.uL,fv:()=>u.fv,fK:()=>g.deleteProviderConnection,op:()=>g.deleteProviderConnectionsByProvider,Pc:()=>j.deleteProviderNode,HS:()=>af.HS,tm:()=>A,oF:()=>B,zP:()=>ag,rg:()=>H.rg,yg:()=>k.getApiKeyById,PX:()=>k.getApiKeys,j$:()=>H.j$,fz:()=>k.getClientKeySpend,L:()=>o,Dj:()=>p,Uv:()=>n,b7:()=>H.b7,uv:()=>u.uv,vF:()=>z,c:()=>u.getMitmAlias,OM:()=>u.OM,p_:()=>F,r4:()=>v.r4,rr:()=>E,p3:()=>af.p3,Mc:()=>g.getProviderConnectionById,getProviderConnections:()=>g.getProviderConnections,Qu:()=>j.getProviderNodeById,Fh:()=>j.getProviderNodes,vY:()=>H.vY,Zx:()=>H.Zx,Rw:()=>ab,SL:()=>aa,mt:()=>i.getSettings,BY:()=>H.BY,K1:()=>ah,wJ:()=>k.normalizeClientKeyPatch,fp:()=>g.redactSecrets,e8:()=>af.e8,VT:()=>v.VT,yF:()=>v.yF,ox:()=>_,sZ:()=>H.sZ,L9:()=>u.L9,o5:()=>u.o5,_V:()=>H._V,uw:()=>H.uw,XW:()=>k.updateApiKey,oG:()=>s,KJ:()=>v.KJ,updateProviderConnection:()=>g.updateProviderConnection,rS:()=>g.updateProviderConnectionCredentialsIfCurrent,$v:()=>g.updateProviderConnectionStatusIfCurrent,ho:()=>j.updateProviderNode,Xx:()=>i.Xx,H3:()=>i.H3,Fq:()=>D,ek:()=>k.validateApiKey});var e=c(36366),f=c(644),g=c(5781),h=c(38044),i=c(42655),j=c(1129),k=c(74452),l=c(47293);function m(a){return a?{id:a.id,name:a.name,kind:a.kind,models:(0,f.q)(a.models,[]),createdAt:a.createdAt,updatedAt:a.updatedAt}:null}async function n(){return(await (0,e.c)()).all("SELECT * FROM combos ORDER BY createdAt ASC").map(m)}async function o(a){return m((await (0,e.c)()).get("SELECT * FROM combos WHERE id = ?",[a]))}async function p(a){return m((await (0,e.c)()).get("SELECT * FROM combos WHERE name = ?",[a]))}async function q(a){let b=await (0,e.c)(),c=new Date().toISOString(),d={id:(0,l.A)(),name:a.name,kind:a.kind||null,models:a.models||[],createdAt:c,updatedAt:c};return b.run("INSERT INTO combos(id, name, kind, models, createdAt, updatedAt) VALUES(?, ?, ?, ?, ?, ?)",[d.id,d.name,d.kind,(0,f.s)(d.models),d.createdAt,d.updatedAt]),d}let r=["name","kind","models"];async function s(a,b){let c=await (0,e.c)(),d=null;return c.transaction(()=>{let e=c.get("SELECT * FROM combos WHERE id = ?",[a]);if(!e)return;let g={...m(e),updatedAt:new Date().toISOString()};for(let a of r)b&&Object.prototype.hasOwnProperty.call(b,a)&&(g[a]=b[a]);c.run("UPDATE combos SET name = ?, kind = ?, models = ?, updatedAt = ? WHERE id = ?",[g.name,g.kind,(0,f.s)(g.models||[]),g.updatedAt,a]),d=g}),d}async function t(a){let b=(await (0,e.c)()).run("DELETE FROM combos WHERE id = ?",[a]);return(b?.changes??0)>0}var u=c(9460),v=c(97914),w=c(65089);let x="disabledModels";function y(a,b){return[...new Set((Array.isArray(b)?b:[]).map(b=>(0,w.v)(b,a)).filter(Boolean))]}async function z(){let a=(await (0,e.c)()).all("SELECT key, value FROM kv WHERE scope = ?",[x]),b={};for(let c of a)b[c.key]=(0,f.q)(c.value,[]);return b}async function A(a,b){if(!a||!Array.isArray(b))return;let c=await (0,e.c)();c.transaction(()=>{let d=c.get("SELECT value FROM kv WHERE scope = ? AND key = ?",[x,a]),e=y(a,[...d&&(0,f.q)(d.value,[])||[],...b]);c.run("INSERT INTO kv(scope, key, value) VALUES(?, ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value",[x,a,(0,f.s)(e)])})}async function B(a,b){if(!a)return;let c=await (0,e.c)();c.transaction(()=>{let d;if(!Array.isArray(b)||0===b.length)return void c.run("DELETE FROM kv WHERE scope = ? AND key = ?",[x,a]);let e=c.get("SELECT value FROM kv WHERE scope = ? AND key = ?",[x,a]),g=e&&(0,f.q)(e.value,[])||[],h=(d=new Set(y(a,b)),y(a,g).filter(a=>!d.has(a)));0===h.length?c.run("DELETE FROM kv WHERE scope = ? AND key = ?",[x,a]):c.run("INSERT INTO kv(scope, key, value) VALUES(?, ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value",[x,a,(0,f.s)(h)])})}function C(a){return a?{providerId:a.provider_id,scopeKey:a.scope_key,modelId:a.model_id,kind:a.kind||"llm",status:a.status,latencyMs:null==a.latency_ms?null:Number(a.latency_ms),failureClass:a.failure_class||null,failureMessage:a.failure_message||null,checkedAt:a.checked_at}:null}async function D(a){let b=String(a?.providerId||"").trim(),c=String(a?.scopeKey||"").trim(),d=String(a?.modelId||"").trim(),f=String(a?.kind||"llm").trim()||"llm",g=String(a?.status||"").trim();if(!b||!c||!d||!["ok","dead","retryable"].includes(g))throw Error("Invalid probe result");let h=await (0,e.c)(),i=a.checkedAt||new Date().toISOString(),j=Number.isFinite(a.latencyMs)?Math.max(0,Math.round(Number(a.latencyMs))):null;return h.run(`INSERT INTO provider_model_probe(
5
5
  provider_id, scope_key, model_id, kind, status, latency_ms,
6
6
  failure_class, failure_message, checked_at
7
7
  )
@@ -7,9 +7,9 @@
7
7
  promptTokens = promptTokens + excluded.promptTokens,
8
8
  completionTokens = completionTokens + excluded.completionTokens,
9
9
  cachedTokens = cachedTokens + excluded.cachedTokens,
10
- cost = cost + excluded.cost`,[c.requests,c.promptTokens,c.completionTokens,c.cachedTokens,c.cost]),a.run("DELETE FROM prometheusUsageTotals WHERE provider = ?",[b])})}},5781:(a,b,c)=>{c.r(b),c.d(b,{DEFAULT_QUOTA_FRESH_MS:()=>j,cleanupProviderConnections:()=>D,connToRow:()=>p,createProviderConnection:()=>v,deleteProviderConnection:()=>A,deleteProviderConnectionsByProvider:()=>B,getProviderConnectionById:()=>s,getProviderConnections:()=>r,getProviderQuotaHeadroom:()=>t,redactSecrets:()=>n,reorderProviderConnections:()=>C,updateProviderConnection:()=>w,updateProviderConnectionStatusIfCurrent:()=>z});var d=c(47293),e=c(36366),f=c(644),g=c(38044),h=c(30869),i=c(2903);let j=2*h.oc.tickIntervalMs,k=["displayName","email","globalPriority","defaultModel","accessToken","refreshToken","expiresAt","tokenType","scope","projectId","apiKey","testStatus","lastTested","lastError","lastErrorAt","rateLimitedUntil","expiresIn","errorCode","consecutiveUseCount","idToken","lastRefreshAt"],l=new Set(["accessToken","refreshToken","idToken","apiKey","copilotToken","cookies","clientSecret","secretAccessKey"]);function m(a,b,c=!1){return"string"==typeof a?c&&a?b(a):a:c&&null!==a&&"object"!=typeof a?void 0:Array.isArray(a)?a.map(a=>m(a,b,c)):a&&"object"==typeof a?Object.fromEntries(Object.entries(a).map(([a,d])=>[a,m(d,b,c||l.has(a))])):a}function n(a){return m(a,()=>void 0)}function o(a){return a?{...m((0,f.q)(a.data,{}),a=>(0,g.wu)(a)??a),id:a.id,provider:a.provider,authType:a.authType,name:a.name,email:a.email,priority:a.priority,isActive:1===a.isActive||!0===a.isActive,createdAt:a.createdAt,updatedAt:a.updatedAt}:null}function p(a){let{id:b,provider:c,authType:d,name:e,email:h,priority:i,isActive:j,createdAt:k,updatedAt:l,...n}=a,o=m(n,g.MG);return{id:b,provider:c,authType:d,name:e??null,email:h??null,priority:i??null,isActive:+(!1!==j),data:(0,f.s)(o),createdAt:k,updatedAt:l}}function q(a,b){let c=p(b);a.run(`INSERT INTO providerConnections(id, provider, authType, name, email, priority, isActive, data, createdAt, updatedAt)
10
+ cost = cost + excluded.cost`,[c.requests,c.promptTokens,c.completionTokens,c.cachedTokens,c.cost]),a.run("DELETE FROM prometheusUsageTotals WHERE provider = ?",[b])})}},5781:(a,b,c)=>{c.r(b),c.d(b,{DEFAULT_QUOTA_FRESH_MS:()=>k,cleanupProviderConnections:()=>G,connToRow:()=>q,createProviderConnection:()=>w,deleteProviderConnection:()=>D,deleteProviderConnectionsByProvider:()=>E,getProviderConnectionById:()=>t,getProviderConnections:()=>s,getProviderQuotaHeadroom:()=>u,redactSecrets:()=>o,reorderProviderConnections:()=>F,updateProviderConnection:()=>x,updateProviderConnectionCredentialsIfCurrent:()=>C,updateProviderConnectionStatusIfCurrent:()=>A});var d=c(47293),e=c(60290),f=c(36366),g=c(644),h=c(38044),i=c(30869),j=c(2903);let k=2*i.oc.tickIntervalMs,l=["displayName","email","globalPriority","defaultModel","accessToken","refreshToken","expiresAt","tokenType","scope","projectId","apiKey","testStatus","lastTested","lastError","lastErrorAt","rateLimitedUntil","expiresIn","errorCode","consecutiveUseCount","idToken","lastRefreshAt"],m=new Set(["accessToken","refreshToken","idToken","apiKey","copilotToken","cookies","clientSecret","secretAccessKey"]);function n(a,b,c=!1){return"string"==typeof a?c&&a?b(a):a:c&&null!==a&&"object"!=typeof a?void 0:Array.isArray(a)?a.map(a=>n(a,b,c)):a&&"object"==typeof a?Object.fromEntries(Object.entries(a).map(([a,d])=>[a,n(d,b,c||m.has(a))])):a}function o(a){return n(a,()=>void 0)}function p(a){return a?{...n((0,g.q)(a.data,{}),a=>(0,h.wu)(a)??a),id:a.id,provider:a.provider,authType:a.authType,name:a.name,email:a.email,priority:a.priority,isActive:1===a.isActive||!0===a.isActive,createdAt:a.createdAt,updatedAt:a.updatedAt}:null}function q(a){let{id:b,provider:c,authType:d,name:e,email:f,priority:i,isActive:j,createdAt:k,updatedAt:l,...m}=a,o=n(m,h.MG);return{id:b,provider:c,authType:d,name:e??null,email:f??null,priority:i??null,isActive:+(!1!==j),data:(0,g.s)(o),createdAt:k,updatedAt:l}}function r(a,b){let c=q(b);a.run(`INSERT INTO providerConnections(id, provider, authType, name, email, priority, isActive, data, createdAt, updatedAt)
11
11
  VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
12
12
  ON CONFLICT(id) DO UPDATE SET
13
13
  provider=excluded.provider, authType=excluded.authType, name=excluded.name,
14
14
  email=excluded.email, priority=excluded.priority, isActive=excluded.isActive,
15
- data=excluded.data, updatedAt=excluded.updatedAt`,[c.id,c.provider,c.authType,c.name,c.email,c.priority,c.isActive,c.data,c.createdAt,c.updatedAt])}async function r(a={}){let b=await (0,e.c)(),c=[],d=[];a.provider&&(c.push("provider = ?"),d.push(a.provider)),void 0!==a.isActive&&(c.push("isActive = ?"),d.push(+!!a.isActive));let f=`SELECT * FROM providerConnections${c.length?` WHERE ${c.join(" AND ")}`:""}`,g=b.all(f,d).map(o);return g.sort((a,b)=>(a.priority??999)-(b.priority??999)),g}async function s(a){return o((await (0,e.c)()).get("SELECT * FROM providerConnections WHERE id = ?",[a]))}async function t(a=j){try{let b=Object.create(null),c=Number.isFinite(a)?a:j,d=Date.now();for(let a of(await r())){let e=a.lastQuota,f=Number(e?.at),g=Number(e?.remainingPercentage);if(!Number.isFinite(f)||d-f>c||!Number.isFinite(g))continue;let h=b[a.provider];(!Number.isFinite(h)||g>h)&&(b[a.provider]=g)}return b}catch{return{}}}function u(a,b){let c=a.all("SELECT * FROM providerConnections WHERE provider = ?",[b]).map(o);c.sort((a,b)=>{let c=(a.priority??999)-(b.priority??999);return 0!==c?c:new Date(b.updatedAt||0)-new Date(a.updatedAt||0)}),c.forEach((b,c)=>{a.run("UPDATE providerConnections SET priority = ? WHERE id = ?",[c+1,b.id])})}async function v(a){let b,c=await (0,e.c)(),f=new Date().toISOString();return c.transaction(()=>{let e=c.all("SELECT * FROM providerConnections WHERE provider = ?",[a.provider]).map(o),g=null;if("oauth"===a.authType&&a.email){let b=a.providerSpecificData?.username,c=a.providerSpecificData?.chatgptAccountId;g=e.find(d=>{if("oauth"!==d.authType||d.email!==a.email)return!1;let e=d.providerSpecificData?.chatgptAccountId;if(c&&e)return c===e;if(c&&!e||!c&&e)return!1;let f=d.providerSpecificData?.username;return b&&f?b===f:!b&&!f})}else"apikey"===a.authType&&a.name&&(g=e.find(b=>"apikey"===b.authType&&b.name===a.name));if(g){let d={...g,...a,updatedAt:f};q(c,d),b=d;return}let h=a.name||null;h||"oauth"!==a.authType&&"access_token"!==a.authType||(h=a.email||`Account ${e.length+1}`);let i=a.priority;null==i&&(i=e.reduce((a,b)=>Math.max(a,b.priority||0),0)+1);let j={id:(0,d.A)(),provider:a.provider,authType:a.authType||"oauth",name:h,priority:i,isActive:void 0===a.isActive||a.isActive,createdAt:f,updatedAt:f};for(let b of k)void 0!==a[b]&&null!==a[b]&&(j[b]=a[b]);a.providerSpecificData&&Object.keys(a.providerSpecificData).length>0&&(j.providerSpecificData=a.providerSpecificData),void 0!==a.email&&(j.email=a.email),q(c,j),u(c,a.provider),b=j}),b}async function w(a,b){let c,d=await (0,e.c)();return d.transaction(()=>{let e=d.get("SELECT * FROM providerConnections WHERE id = ?",[a]);if(!e){c=null;return}let f=o(e),g={...f,...b,updatedAt:new Date().toISOString()};q(d,g),f.provider!==g.provider&&(0,i.uQ)(d,f.provider),void 0!==b.priority&&u(d,f.provider),c=g}),c}let x=["testStatus","lastError","lastErrorAt","errorCode","backoffLevel","rateLimitedUntil"],y="modelLock_";async function z(a,b,c){if(!b||"object"!=typeof b||!c||"object"!=typeof c)throw TypeError("An account status snapshot and patch are required");if(Object.keys(c).some(a=>!x.includes(a)&&!a.startsWith(y)))throw TypeError("Only account status and model locks may be updated conditionally");let d=await (0,e.c)(),f=null;try{d.transaction(()=>{let e=d.get("SELECT * FROM providerConnections WHERE id = ?",[a]);if(!e)return;let g=o(e);if([...new Set([...x,"provider","isActive",...Object.keys(b).filter(a=>a.startsWith(y)),...Object.keys(g).filter(a=>a.startsWith(y))])].some(a=>(g[a]??null)!==(b[a]??null)))return;let h={...g,...c,updatedAt:new Date().toISOString()},i=p(h);d.run("UPDATE providerConnections SET data = ?, updatedAt = ? WHERE id = ? AND data = ? AND updatedAt = ?",[i.data,i.updatedAt,a,e.data,e.updatedAt]).changes>0&&(f=h)})}catch(a){if(a?.code!=="SQLITE_BUSY_SNAPSHOT"&&a?.errcode!==517)throw a}return f}async function A(a){let b=await (0,e.c)(),c=!1;return b.transaction(()=>{let d=b.get("SELECT provider FROM providerConnections WHERE id = ?",[a]);d&&(b.run("DELETE FROM providerConnections WHERE id = ?",[a]),u(b,d.provider),(0,i.uQ)(b,d.provider),c=!0)}),c}async function B(a){let b=await (0,e.c)(),c=0;return b.transaction(()=>{c=b.get("SELECT COUNT(*) AS n FROM providerConnections WHERE provider = ?",[a])?.n||0,b.run("DELETE FROM providerConnections WHERE provider = ?",[a]),(0,i.uQ)(b,a)}),c}async function C(a){let b=await (0,e.c)();b.transaction(()=>u(b,a))}async function D(){let a=await (0,e.c)(),b=["displayName","email","globalPriority","defaultModel","accessToken","refreshToken","expiresAt","tokenType","scope","projectId","apiKey","testStatus","lastTested","lastError","lastErrorAt","rateLimitedUntil","expiresIn","consecutiveUseCount"],c=0;return a.transaction(()=>{for(let d of a.all("SELECT * FROM providerConnections")){let e=o(d),f=!1;for(let a of b)(null===e[a]||void 0===e[a])&&a in e&&(delete e[a],c++,f=!0);e.providerSpecificData&&0===Object.keys(e.providerSpecificData).length&&(delete e.providerSpecificData,c++,f=!0),f&&q(a,e)}}),c}},38044:(a,b,c)=>{c.d(b,{BA:()=>C,E8:()=>x,MG:()=>u,O0:()=>E,Yh:()=>B,cb:()=>z,lO:()=>D,ue:()=>F,ws:()=>A,wu:()=>v});var d=c(77598),e=c.n(d),f=c(73024),g=c.n(f),h=c(76760),i=c.n(h),j=c(49120);let k="aes-256-gcm",l="enc:v1:",m="enc:v2:",n=i().join(j.nJ,"auth","data-key"),o=i().join(j.nJ,"auth","cli-secret"),p="switchboard-at-rest-v1",q=null,r=null;function s(){if(q)return q;try{let a=g().readFileSync(n);if(32===a.length)return q=a}catch{}try{let a=i().join(j.nJ,"machine-id"),b=p;try{b=g().readFileSync(a,"utf8").trim()+p}catch{}q=b===p?e().randomBytes(32):e().createHash("sha256").update(b).digest()}catch{q=e().randomBytes(32)}try{g().mkdirSync(i().dirname(n),{recursive:!0,mode:448}),g().writeFileSync(n,q,{mode:384})}catch{}return q}function t(){let a=function(){if(r)return r;try{if(r=g().readFileSync(o,"utf8").trim()||null)return r}catch{}let a=e().randomBytes(32).toString("hex");try{g().mkdirSync(i().dirname(o),{recursive:!0,mode:448}),g().writeFileSync(o,a,{mode:384,flag:"wx"}),r=a}catch{try{r=g().readFileSync(o,"utf8").trim()||null}catch{r=null}}return r}();return a?e().createHash("sha256").update(s()).update(a,"utf8").digest():null}function u(a){if(null==a||""===a||"string"!=typeof a||a.startsWith(l)||a.startsWith(m))return a;let b=t(),c=b||s(),d=e().randomBytes(12),f=e().createCipheriv(k,c,d),g=Buffer.concat([f.update(a,"utf8"),f.final()]),h=f.getAuthTag();return`${b?m:l}${d.toString("hex")}:${h.toString("hex")}:${g.toString("hex")}`}function v(a){if(null==a||""===a||"string"!=typeof a)return a;let b=a.startsWith(m);if(!b&&!a.startsWith(l))return a;try{let[c,d,f]=a.slice(m.length).split(":");if(!c||!d||!f)return null;let g=b?t():s();if(!g)return null;let h=e().createDecipheriv(k,g,Buffer.from(c,"hex"));return h.setAuthTag(Buffer.from(d,"hex")),h.update(Buffer.from(f,"hex"),void 0,"utf8")+h.final("utf8")}catch{return null}}function w(a){return e().createHash("sha256").update(`sb-key:${a}`).digest("hex")}function x(a){return a&&"string"==typeof a?a.length<=12?a.slice(0,4)+"…":a.slice(0,10)+"…":""}function y(a){return"string"==typeof a&&/^[a-f0-9]{32}$/.test(a)?e().createHash("sha256").update(`sb-key-lookup:${a}`).digest("hex"):null}function z(a){if("string"!=typeof a)return null;let b=a.split("-");return 4===b.length&&"sk"===b[0]&&b[1]&&/^[a-f0-9]{8}$/.test(b[3])?y(b[2]):null}function A(a,b=z(a)){if(!b)return`v1:${x(a)}:${w(a)}`;let c=e().randomBytes(16),d=e().scryptSync(a,c,32,{N:16384,r:8,p:1,maxmem:0x4000000});return`v2:${b}:${x(a)}:${c.toString("hex")}:${d.toString("hex")}`}function B(a){if("string"!=typeof a||!a.startsWith("v2:"))return a;let b=a.split(":");if(5!==b.length||!/^[a-f0-9]{32}$/.test(b[1]))return a;let c=y(b[1]);return`v2:${c}:${b[2]}:${b[3]}:${b[4]}`}function C(a){if(!a||"string"!=typeof a)return{version:0,lookupDigest:null,prefix:"",hash:null,salt:null,legacy:!0,raw:a};let b=B(a),c=b.split(":");return b.startsWith("v2:")&&5===c.length?{version:2,lookupDigest:/^[a-f0-9]{64}$/.test(c[1])?c[1]:null,prefix:c[2],salt:c[3],hash:c[4],legacy:!1,raw:null}:b.startsWith("v2:")&&4===c.length?{version:2,lookupDigest:null,prefix:c[1],salt:c[2],hash:c[3],legacy:!1,raw:null}:b.startsWith("v1:")&&c.length>=3?{version:1,lookupDigest:null,prefix:c[1],salt:null,hash:c.slice(2).join(":"),legacy:!1,raw:null}:{version:0,lookupDigest:z(b),prefix:x(b),hash:null,salt:null,legacy:!0,raw:b}}function D(a,b){if("string"!=typeof a||"string"!=typeof b)return!1;let c=e().createHash("sha256").update(a).digest(),d=e().createHash("sha256").update(b).digest();return e().timingSafeEqual(c,d)}function E(a,b){if(!b||"string"!=typeof b)return!1;let c=C(a);if(c.legacy)return D(String(c.raw||""),b);if(1===c.version)return!!c.hash&&D(c.hash,w(b));if(!c.salt||!c.hash)return!1;try{let a=e().scryptSync(b,Buffer.from(c.salt,"hex"),32,{N:16384,r:8,p:1,maxmem:0x4000000});return D(a.toString("hex"),c.hash)}catch{return!1}}async function F(a,b){if(!b||"string"!=typeof b)return!1;let c=C(a);if(2!==c.version)return E(a,b);if(!c.salt||!c.hash)return!1;try{let a=await new Promise((a,d)=>{e().scrypt(b,Buffer.from(c.salt,"hex"),32,{N:16384,r:8,p:1,maxmem:0x4000000},(b,c)=>{b?d(b):a(c)})});return D(a.toString("hex"),c.hash)}catch{return!1}}}};
15
+ data=excluded.data, updatedAt=excluded.updatedAt`,[c.id,c.provider,c.authType,c.name,c.email,c.priority,c.isActive,c.data,c.createdAt,c.updatedAt])}async function s(a={}){let b=await (0,f.c)(),c=[],d=[];a.provider&&(c.push("provider = ?"),d.push(a.provider)),void 0!==a.isActive&&(c.push("isActive = ?"),d.push(+!!a.isActive));let e=`SELECT * FROM providerConnections${c.length?` WHERE ${c.join(" AND ")}`:""}`,g=b.all(e,d).map(p);return g.sort((a,b)=>(a.priority??999)-(b.priority??999)),g}async function t(a){return p((await (0,f.c)()).get("SELECT * FROM providerConnections WHERE id = ?",[a]))}async function u(a=k){try{let b=Object.create(null),c=Number.isFinite(a)?a:k,d=Date.now();for(let a of(await s())){let e=a.lastQuota,f=Number(e?.at),g=Number(e?.remainingPercentage);if(!Number.isFinite(f)||d-f>c||!Number.isFinite(g))continue;let h=b[a.provider];(!Number.isFinite(h)||g>h)&&(b[a.provider]=g)}return b}catch{return{}}}function v(a,b){let c=a.all("SELECT * FROM providerConnections WHERE provider = ?",[b]).map(p);c.sort((a,b)=>{let c=(a.priority??999)-(b.priority??999);return 0!==c?c:new Date(b.updatedAt||0)-new Date(a.updatedAt||0)}),c.forEach((b,c)=>{a.run("UPDATE providerConnections SET priority = ? WHERE id = ?",[c+1,b.id])})}async function w(a){let b,c=await (0,f.c)(),e=new Date().toISOString();return c.transaction(()=>{let f=c.all("SELECT * FROM providerConnections WHERE provider = ?",[a.provider]).map(p),g=null;if("oauth"===a.authType&&a.email){let b=a.providerSpecificData?.username,c=a.providerSpecificData?.chatgptAccountId;g=f.find(d=>{if("oauth"!==d.authType||d.email!==a.email)return!1;let e=d.providerSpecificData?.chatgptAccountId;if(c&&e)return c===e;if(c&&!e||!c&&e)return!1;let f=d.providerSpecificData?.username;return b&&f?b===f:!b&&!f})}else"apikey"===a.authType&&a.name&&(g=f.find(b=>"apikey"===b.authType&&b.name===a.name));if(g){let d={...g,...a,updatedAt:e};r(c,d),b=d;return}let h=a.name||null;h||"oauth"!==a.authType&&"access_token"!==a.authType||(h=a.email||`Account ${f.length+1}`);let i=a.priority;null==i&&(i=f.reduce((a,b)=>Math.max(a,b.priority||0),0)+1);let j={id:(0,d.A)(),provider:a.provider,authType:a.authType||"oauth",name:h,priority:i,isActive:void 0===a.isActive||a.isActive,createdAt:e,updatedAt:e};for(let b of l)void 0!==a[b]&&null!==a[b]&&(j[b]=a[b]);a.providerSpecificData&&Object.keys(a.providerSpecificData).length>0&&(j.providerSpecificData=a.providerSpecificData),void 0!==a.email&&(j.email=a.email),r(c,j),v(c,a.provider),b=j}),b}async function x(a,b){let c,d=await (0,f.c)();return d.transaction(()=>{let e=d.get("SELECT * FROM providerConnections WHERE id = ?",[a]);if(!e){c=null;return}let f=p(e),g={...f,...b,updatedAt:new Date().toISOString()};r(d,g),f.provider!==g.provider&&(0,j.uQ)(d,f.provider),void 0!==b.priority&&v(d,f.provider),c=g}),c}let y=["testStatus","lastError","lastErrorAt","errorCode","backoffLevel","rateLimitedUntil"],z="modelLock_";async function A(a,b,c){if(!b||"object"!=typeof b||!c||"object"!=typeof c)throw TypeError("An account status snapshot and patch are required");if(Object.keys(c).some(a=>!y.includes(a)&&!a.startsWith(z)))throw TypeError("Only account status and model locks may be updated conditionally");let d=await (0,f.c)(),e=null;try{d.transaction(()=>{let f=d.get("SELECT * FROM providerConnections WHERE id = ?",[a]);if(!f)return;let g=p(f);if([...new Set([...y,"provider","isActive",...Object.keys(b).filter(a=>a.startsWith(z)),...Object.keys(g).filter(a=>a.startsWith(z))])].some(a=>(g[a]??null)!==(b[a]??null)))return;let h={...g,...c,updatedAt:new Date().toISOString()},i=q(h);d.run("UPDATE providerConnections SET data = ?, updatedAt = ? WHERE id = ? AND data = ? AND updatedAt = ?",[i.data,i.updatedAt,a,f.data,f.updatedAt]).changes>0&&(e=h)})}catch(a){if(a?.code!=="SQLITE_BUSY_SNAPSHOT"&&a?.errcode!==517)throw a}return e}let B=["accessToken","refreshToken","idToken","expiresAt","expiresIn","lastRefreshAt","providerSpecificData","updatedAt","projectId"];async function C(a,b,c){if(!b||!c||Object.keys(c).some(a=>!B.includes(a)))throw TypeError("A credential snapshot and credential-only patch are required");let d=await (0,f.c)(),g=null;for(let f=0;f<e.tx;f++){try{d.transaction(()=>{let e=d.get("SELECT * FROM providerConnections WHERE id = ?",[a]);if(!e)return;let f=p(e);if(["provider","authType","accessToken","refreshToken","idToken","expiresAt","lastRefreshAt"].some(a=>(f[a]??null)!==(b[a]??null))||["copilotToken","copilotTokenExpiresAt"].some(a=>(f.providerSpecificData?.[a]??null)!==(b.providerSpecificData?.[a]??null)))return;let h={...f,...c,updatedAt:new Date().toISOString(),...c.providerSpecificData?{providerSpecificData:{...f.providerSpecificData,...c.providerSpecificData}}:{}},i=q(h);d.run("UPDATE providerConnections SET data = ?, updatedAt = ? WHERE id = ? AND data = ? AND updatedAt = ?",[i.data,i.updatedAt,a,e.data,e.updatedAt]).changes>0&&(g=h)})}catch(a){if(a?.code!=="SQLITE_BUSY_SNAPSHOT"&&a?.errcode!==517)throw a;continue}return g}return null}async function D(a){let b=await (0,f.c)(),c=!1;return b.transaction(()=>{let d=b.get("SELECT provider FROM providerConnections WHERE id = ?",[a]);d&&(b.run("DELETE FROM providerConnections WHERE id = ?",[a]),v(b,d.provider),(0,j.uQ)(b,d.provider),c=!0)}),c}async function E(a){let b=await (0,f.c)(),c=0;return b.transaction(()=>{c=b.get("SELECT COUNT(*) AS n FROM providerConnections WHERE provider = ?",[a])?.n||0,b.run("DELETE FROM providerConnections WHERE provider = ?",[a]),(0,j.uQ)(b,a)}),c}async function F(a){let b=await (0,f.c)();b.transaction(()=>v(b,a))}async function G(){let a=await (0,f.c)(),b=["displayName","email","globalPriority","defaultModel","accessToken","refreshToken","expiresAt","tokenType","scope","projectId","apiKey","testStatus","lastTested","lastError","lastErrorAt","rateLimitedUntil","expiresIn","consecutiveUseCount"],c=0;return a.transaction(()=>{for(let d of a.all("SELECT * FROM providerConnections")){let e=p(d),f=!1;for(let a of b)(null===e[a]||void 0===e[a])&&a in e&&(delete e[a],c++,f=!0);e.providerSpecificData&&0===Object.keys(e.providerSpecificData).length&&(delete e.providerSpecificData,c++,f=!0),f&&r(a,e)}}),c}},38044:(a,b,c)=>{c.d(b,{BA:()=>C,E8:()=>x,MG:()=>u,O0:()=>E,Yh:()=>B,cb:()=>z,lO:()=>D,ue:()=>F,ws:()=>A,wu:()=>v});var d=c(77598),e=c.n(d),f=c(73024),g=c.n(f),h=c(76760),i=c.n(h),j=c(49120);let k="aes-256-gcm",l="enc:v1:",m="enc:v2:",n=i().join(j.nJ,"auth","data-key"),o=i().join(j.nJ,"auth","cli-secret"),p="switchboard-at-rest-v1",q=null,r=null;function s(){if(q)return q;try{let a=g().readFileSync(n);if(32===a.length)return q=a}catch{}try{let a=i().join(j.nJ,"machine-id"),b=p;try{b=g().readFileSync(a,"utf8").trim()+p}catch{}q=b===p?e().randomBytes(32):e().createHash("sha256").update(b).digest()}catch{q=e().randomBytes(32)}try{g().mkdirSync(i().dirname(n),{recursive:!0,mode:448}),g().writeFileSync(n,q,{mode:384})}catch{}return q}function t(){let a=function(){if(r)return r;try{if(r=g().readFileSync(o,"utf8").trim()||null)return r}catch{}let a=e().randomBytes(32).toString("hex");try{g().mkdirSync(i().dirname(o),{recursive:!0,mode:448}),g().writeFileSync(o,a,{mode:384,flag:"wx"}),r=a}catch{try{r=g().readFileSync(o,"utf8").trim()||null}catch{r=null}}return r}();return a?e().createHash("sha256").update(s()).update(a,"utf8").digest():null}function u(a){if(null==a||""===a||"string"!=typeof a||a.startsWith(l)||a.startsWith(m))return a;let b=t(),c=b||s(),d=e().randomBytes(12),f=e().createCipheriv(k,c,d),g=Buffer.concat([f.update(a,"utf8"),f.final()]),h=f.getAuthTag();return`${b?m:l}${d.toString("hex")}:${h.toString("hex")}:${g.toString("hex")}`}function v(a){if(null==a||""===a||"string"!=typeof a)return a;let b=a.startsWith(m);if(!b&&!a.startsWith(l))return a;try{let[c,d,f]=a.slice(m.length).split(":");if(!c||!d||!f)return null;let g=b?t():s();if(!g)return null;let h=e().createDecipheriv(k,g,Buffer.from(c,"hex"));return h.setAuthTag(Buffer.from(d,"hex")),h.update(Buffer.from(f,"hex"),void 0,"utf8")+h.final("utf8")}catch{return null}}function w(a){return e().createHash("sha256").update(`sb-key:${a}`).digest("hex")}function x(a){return a&&"string"==typeof a?a.length<=12?a.slice(0,4)+"…":a.slice(0,10)+"…":""}function y(a){return"string"==typeof a&&/^[a-f0-9]{32}$/.test(a)?e().createHash("sha256").update(`sb-key-lookup:${a}`).digest("hex"):null}function z(a){if("string"!=typeof a)return null;let b=a.split("-");return 4===b.length&&"sk"===b[0]&&b[1]&&/^[a-f0-9]{8}$/.test(b[3])?y(b[2]):null}function A(a,b=z(a)){if(!b)return`v1:${x(a)}:${w(a)}`;let c=e().randomBytes(16),d=e().scryptSync(a,c,32,{N:16384,r:8,p:1,maxmem:0x4000000});return`v2:${b}:${x(a)}:${c.toString("hex")}:${d.toString("hex")}`}function B(a){if("string"!=typeof a||!a.startsWith("v2:"))return a;let b=a.split(":");if(5!==b.length||!/^[a-f0-9]{32}$/.test(b[1]))return a;let c=y(b[1]);return`v2:${c}:${b[2]}:${b[3]}:${b[4]}`}function C(a){if(!a||"string"!=typeof a)return{version:0,lookupDigest:null,prefix:"",hash:null,salt:null,legacy:!0,raw:a};let b=B(a),c=b.split(":");return b.startsWith("v2:")&&5===c.length?{version:2,lookupDigest:/^[a-f0-9]{64}$/.test(c[1])?c[1]:null,prefix:c[2],salt:c[3],hash:c[4],legacy:!1,raw:null}:b.startsWith("v2:")&&4===c.length?{version:2,lookupDigest:null,prefix:c[1],salt:c[2],hash:c[3],legacy:!1,raw:null}:b.startsWith("v1:")&&c.length>=3?{version:1,lookupDigest:null,prefix:c[1],salt:null,hash:c.slice(2).join(":"),legacy:!1,raw:null}:{version:0,lookupDigest:z(b),prefix:x(b),hash:null,salt:null,legacy:!0,raw:b}}function D(a,b){if("string"!=typeof a||"string"!=typeof b)return!1;let c=e().createHash("sha256").update(a).digest(),d=e().createHash("sha256").update(b).digest();return e().timingSafeEqual(c,d)}function E(a,b){if(!b||"string"!=typeof b)return!1;let c=C(a);if(c.legacy)return D(String(c.raw||""),b);if(1===c.version)return!!c.hash&&D(c.hash,w(b));if(!c.salt||!c.hash)return!1;try{let a=e().scryptSync(b,Buffer.from(c.salt,"hex"),32,{N:16384,r:8,p:1,maxmem:0x4000000});return D(a.toString("hex"),c.hash)}catch{return!1}}async function F(a,b){if(!b||"string"!=typeof b)return!1;let c=C(a);if(2!==c.version)return E(a,b);if(!c.salt||!c.hash)return!1;try{let a=await new Promise((a,d)=>{e().scrypt(b,Buffer.from(c.salt,"hex"),32,{N:16384,r:8,p:1,maxmem:0x4000000},(b,c)=>{b?d(b):a(c)})});return D(a.toString("hex"),c.hash)}catch{return!1}}}};
@@ -0,0 +1 @@
1
+ "use strict";exports.id=6533,exports.ids=[6533],exports.modules={11841:(a,b,c)=>{function d(a){let b=a?.providerSpecificData||{},c=a=>"string"==typeof a?a:"";return{connectionId:c(a?.id),provider:c(a?.provider),authType:c(a?.authType),createdAt:c(a?.createdAt),email:c(a?.email),accountId:c(b.accountUuid||b.accountId||b.userId||b.chatgptAccountId),organizationId:c(b.organizationUuid||b.organizationId)}}c.d(b,{AN:()=>d,R3:()=>e,_r:()=>h,bs:()=>g});let e=3e5,f=a=>"string"==typeof a&&Number.isFinite(Date.parse(a))?new Date(a).toISOString():null;function g(a){let b=f(a?.retryAt),c=a?.result,d=null,g=f(c?.observedAt);if(g&&c?.quotas&&"object"==typeof c.quotas&&!Array.isArray(c.quotas)){let a={};for(let[b,d]of Object.entries(c.quotas))d&&["used","total","remaining","remainingPercentage"].every(a=>Number.isFinite(d[a]))&&(a[b]={used:d.used,total:d.total,remaining:d.remaining,remainingPercentage:d.remainingPercentage,resetAt:f(d.resetAt),unlimited:!0===d.unlimited});if(d={plan:"string"==typeof c.plan?c.plan:null,observedAt:g,quotas:a},c.extraUsage&&"object"==typeof c.extraUsage)for(let a of(d.extraUsage={},["is_enabled","monthly_limit","used_credits","utilization"])){let b=c.extraUsage[a];("boolean"==typeof b||Number.isFinite(b))&&(d.extraUsage[a]=b)}else d.extraUsage=null}let h=d&&Number.isFinite(a?.expiresAt)?Math.max(0,Math.min(a.expiresAt,Date.parse(d.observedAt)+e)):0;return{retryAt:b,result:d,expiresAt:h}}function h(a,b){let c=g(a),d=g(b),e=!c.result||d.result&&Date.parse(d.result.observedAt)>=Date.parse(c.result.observedAt)?d.result:c.result,f=Math.max(Date.parse(c.retryAt)||0,Date.parse(d.retryAt)||0),h=f>(Date.parse(e?.observedAt)||0)?new Date(f).toISOString():null,i=h||!e||0===d.expiresAt?0:e===d.result?d.expiresAt:c.expiresAt;return{retryAt:h,result:e,expiresAt:i}}},33234:(a,b,c)=>{c.d(b,{l:()=>k,_:()=>l});var d,e=c(36366),f=c(77598),g=c(11841);let h="providerQuotaState",i=a=>(0,f.createHash)("sha256").update(JSON.stringify(["connectionId","provider","authType","createdAt","email","accountId","organizationId"].map(b=>"string"==typeof a?.[b]?a[b]:""))).digest("hex");function j(a,b){let c;if(!b?.connectionId||!b.provider||!b.authType||!b.createdAt)return null;let d=a.get("SELECT id, provider, authType, email, createdAt, data FROM providerConnections WHERE id = ?",[b.connectionId]);if(!d)return null;try{c=JSON.parse(d.data)}catch{return null}let e=(0,g.AN)({...d,providerSpecificData:c?.providerSpecificData});return i(e)===i(b)?i(e):null}let{loadProviderQuotaState:k,saveProviderQuotaState:l}=(d=e.c,{async loadProviderQuotaState(a){let b,c=await d(),e=j(c,a);if(!e)return{invalidIdentity:!0};let f=c.get("SELECT value FROM kv WHERE scope = ? AND key = ?",[h,a.connectionId]);try{b=JSON.parse(f?.value||"null")}catch{throw Error("Invalid durable quota state")}if(b&&1!==b.version)throw Error("Unsupported durable quota state");return b?.version===1&&b.binding===e?(0,g.bs)(b):(0,g.bs)(null)},async saveProviderQuotaState(a,b){let c=await d(),e=!1;return c.transaction(()=>{let d,f=j(c,a);if(!f)return;let i=c.get("SELECT value FROM kv WHERE scope = ? AND key = ?",[h,a.connectionId]);try{d=JSON.parse(i?.value||"null")}catch{d=null}(d?.version!==1||d.binding!==f)&&(d=null);let k={version:1,binding:f,...(0,g._r)(d,b)};c.run("INSERT INTO kv(scope,key,value) VALUES(?,?,?) ON CONFLICT(scope,key) DO UPDATE SET value=excluded.value",[h,a.connectionId,JSON.stringify(k)]),e=!0}),e}})},39326:(a,b,c)=>{function d(a){return null==a?"":String(a).trim()}async function e(a={}){try{let b=function(a={}){let b=a?.connectionProxyEnabled===!0,c=d(a?.connectionProxyUrl);return{connectionProxyEnabled:b,connectionProxyUrl:c,connectionNoProxy:d(a?.connectionNoProxy)}}(a);if(b.connectionProxyEnabled&&b.connectionProxyUrl)return{source:"legacy",proxyPoolId:null,proxyPool:null,...b,strictProxy:!1,vercelRelayUrl:""};return{source:"none",proxyPoolId:null,proxyPool:null,connectionProxyEnabled:!1,connectionProxyUrl:"",connectionNoProxy:b.connectionNoProxy||"",strictProxy:!1,vercelRelayUrl:""}}catch(a){return console.error("[resolveConnectionProxyConfig] Failed to resolve proxy config:",a),{source:"error",proxyPoolId:null,proxyPool:null,connectionProxyEnabled:!1,connectionProxyUrl:"",connectionNoProxy:"",strictProxy:!1,vercelRelayUrl:""}}}c.d(b,{B:()=>e})},49263:(a,b,c)=>{c.d(b,{Bl:()=>k,Qo:()=>f,RU:()=>g,S5:()=>n,V0:()=>l,hk:()=>e,kJ:()=>m});var d=c(87252);function e(a,b,c=0){let f=b?("string"==typeof b?b:JSON.stringify(b)).toLowerCase():"";for(let b of d.t2)if(b.text&&f&&f.includes(b.text)||b.status&&b.status===a){let a=!1!==b.shouldFallback;if(b.backoff){let b=Math.min(c+1,d.EQ.maxLevel);return{shouldFallback:a,cooldownMs:function(a=0){let b=Math.max(0,a-1);return Math.min(d.EQ.base*Math.pow(2,b),d.EQ.max)}(b),newBackoffLevel:b}}return{shouldFallback:a,cooldownMs:b.cooldownMs||0}}return a>=400&&a<500&&408!==a&&429!==a?{shouldFallback:!1,cooldownMs:0}:{shouldFallback:!0,cooldownMs:d.wf}}function f(a){if(!a)return"";let b=new Date(a).getTime()-Date.now();if(b<=0)return"reset after 0s";let c=Math.ceil(b/1e3),d=Math.floor(c/3600),e=Math.floor(c%3600/60),f=c%60,g=[];return d>0&&g.push(`${d}h`),e>0&&g.push(`${e}m`),(f>0||0===g.length)&&g.push(`${f}s`),`reset after ${g.join(" ")}`}let g="reauth_required",h="modelLock_",i=`${h}__all`;function j(a){return a?`${h}${a}`:i}function k(a,b){let c=j(b);return[a?.[c],a?.[i]].some(a=>a&&new Date(a).getTime()>Date.now())}function l(a,b){let c=Date.now(),d=[a?.[j(b)],a?.[i]].map(a=>new Date(a).getTime()).filter(a=>Number.isFinite(a)&&a>c);return d.length>0?new Date(Math.max(...d)).toISOString():null}function m(a){if(!a)return null;let b=null,c=Date.now();for(let[d,e]of Object.entries(a)){if(!d.startsWith(h)||!e)continue;let a=new Date(e).getTime();a<=c||(!b||a<b)&&(b=a)}return b?new Date(b).toISOString():null}function n(a,b){return{[j(a)]:new Date(Date.now()+b).toISOString()}}},66451:(a,b,c)=>{c.d(b,{Xh:()=>f,js:()=>h,sc:()=>g});var d=c(39698);let e={el:"elevenlabs",jina:"jina-ai","jina-ai":"jina-ai",polly:"aws-polly","aws-polly":"aws-polly"};for(let a of d.A)for(let b of(e[a.id]=a.id,a.alias&&(e[a.alias]=a.id),a.aliases||[]))e[b]=a.id;function f(a){if(!a)return{provider:null,model:null,isAlias:!1,providerAlias:null};if(a.includes("/")){let b=a.indexOf("/"),c=a.slice(0,b),d=a.slice(b+1);return{provider:e[c]||c,model:d,isAlias:!1,providerAlias:c}}return{provider:null,model:a,isAlias:!0,providerAlias:null}}function g(a,b){var c,d;if(!b||"string"!=typeof a)return null;let f=b[a];if(!f){for(let[c,d]of Object.entries(b))if("string"==typeof c&&c.includes("*"))try{let b="^"+c.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*")+"$";if(RegExp(b,"i").test(a)){f=d;break}}catch{}}if(!f)return null;if("string"==typeof f&&f.includes("/")){let a=f.indexOf("/");return{provider:e[c=f.slice(0,a)]||c,model:f.slice(a+1)}}return"object"==typeof f&&f.provider&&f.model?{provider:e[d=f.provider]||d,model:f.model}:"string"==typeof f?{provider:null,model:f}:null}async function h(a,b){let c=f(a);if(!c.isAlias)return{provider:c.provider,model:c.model};let d="function"==typeof b?await b():b,e=g(c.model,d);return e||{provider:function(a){if(!a)return"openai";let b=a.toLowerCase();return i.find(([a])=>a.test(b))?.[1]||"openai"}(c.model),model:c.model}}let i=[[/^grok-build$/,"grok-cli"],[/^muse-/,"muse"],[/^claude-/,"anthropic"],[/^gemini-/,"gemini"],[/^gpt-/,"openai"],[/^o[134]/,"openai"],[/^deepseek-/,"openrouter"]]}};
@@ -2,4 +2,4 @@ exports.id=7201,exports.ids=[7201],exports.modules={4630:(a,b,c)=>{"use strict";
2
2
  ${e}${n(t)}
3
3
  `}function s(a){let b=o(a,e);if(!b)return a;let c=(0,d.Tp)(p(a,e));if(c.errors.length)throw Error(`Invalid Aider YAML: ${c.errors[0].message}`);for(let a of["openai-api-base","openai-api-key","model","alias"])b[a]?.exists?c.setIn([a],b[a].value):c.deleteIn([a]);return c.toString()}function t(a,{baseUrl:b,models:c,defaultModel:e}){let g=o(a,f)?u(a):a,h=(0,d.Tp)(g||"");if(h.errors.length)throw Error(`Invalid Hermes YAML: ${h.errors[0].message}`);let k=i(c),l=j(e,k),m=q(h.getIn(["custom_providers"])),p=Array.isArray(m)?m:[],r=p.find(a=>a?.name==="switchboard"),s=q(h.getIn(["model"])),v=p.filter(a=>a?.name!=="switchboard"),w=Object.fromEntries(k.map(a=>[a,{}]));return v.push({name:"switchboard",base_url:b,key_env:"SWITCHBOARD_API_KEY",api_mode:"chat_completions",models:w}),h.setIn(["custom_providers"],v),h.setIn(["model"],{...s&&"object"==typeof s?s:{},default:l,provider:"custom:switchboard"}),`${h.toString().trimEnd()}
4
4
  ${f}${n({previousProvider:r??null,previousModel:s??null})}
5
- `}function u(a){let b=o(a,f),c=(0,d.Tp)(p(a,f));if(c.errors.length)throw Error(`Invalid Hermes YAML: ${c.errors[0].message}`);let e=q(c.getIn(["custom_providers"]));if(Array.isArray(e)){let a=e.filter(a=>a?.name!=="switchboard");b?.previousProvider&&a.push(b.previousProvider),a.length?c.setIn(["custom_providers"],a):c.deleteIn(["custom_providers"])}return"custom:switchboard"===q(c.getIn(["model","provider"]))&&(b?.previousModel?c.setIn(["model"],b.previousModel):c.deleteIn(["model"])),c.toString()}function v(a,{baseUrl:b,apiKey:c,models:d,defaultModel:e}){let f=i(d),g=j(e,f);return{...a,model:`switchboard/${g}`,provider:{...a.provider||{},switchboard:{npm:"@ai-sdk/openai-compatible",name:"Switchboard",options:{apiKey:c,baseURL:b},models:Object.fromEntries(f.map(a=>[a,{name:k(a)}]))}}}}function w(a,{baseUrl:b,apiKey:c,models:d,defaultModel:e}){let f=i(d),g=j(e,f),h=a.providers||{},l=a.models||{};return{providers:{...h,providers:{...h.providers||{},switchboard:{type:"openai-compatible",name:"Switchboard",baseUrl:b,apiKey:c,defaultModelId:g}}},models:{...l,providers:{...l.providers||{},switchboard:{provider:{name:"Switchboard",baseUrl:b,defaultModelId:g},models:Object.fromEntries(f.map(a=>[a,{id:a,name:k(a)}]))}}}}}function x(a,{models:b,defaultModel:c}){let d=i(b),e=j(c,d),f=Object.fromEntries(Object.entries(a?.modelConfigs?.modelDefinitions&&"object"==typeof a.modelConfigs.modelDefinitions?a.modelConfigs.modelDefinitions:{}).filter(([,a])=>a?.family!=="switchboard"));return{...a,model:{...a.model||{},name:e},experimental:{...a.experimental||{},dynamicModelConfiguration:!0},modelConfigs:{...a.modelConfigs||{},modelDefinitions:{...f,...Object.fromEntries(d.map(a=>[a,{displayName:`Switchboard \xb7 ${k(a)}`,family:"switchboard",tier:"custom",isPreview:!1,isVisible:!0,features:{thinking:!0,multimodalToolUse:!0}}]))}}}}},47293:(a,b,c)=>{"use strict";c.d(b,{A:()=>f});let d=new Uint8Array(16);var e=c(50122);let f=function(a,b,c){return b||a||!crypto.randomUUID?function(a,b,c){let f=(a=a||{}).random??a.rng?.()??crypto.getRandomValues(d);if(f.length<16)throw Error("Random bytes length must be >= 16");if(f[6]=15&f[6]|64,f[8]=63&f[8]|128,b){if((c=c||0)<0||c+16>b.length)throw RangeError(`UUID byte range ${c}:${c+15} is out of buffer bounds`);for(let a=0;a<16;++a)b[c+a]=f[a];return b}return(0,e.k)(f)}(a,b,c):crypto.randomUUID()}},50122:(a,b,c)=>{"use strict";c.d(b,{k:()=>e});let d=[];for(let a=0;a<256;++a)d.push((a+256).toString(16).slice(1));function e(a,b=0){return(d[a[b+0]]+d[a[b+1]]+d[a[b+2]]+d[a[b+3]]+"-"+d[a[b+4]]+d[a[b+5]]+"-"+d[a[b+6]]+d[a[b+7]]+"-"+d[a[b+8]]+d[a[b+9]]+"-"+d[a[b+10]]+d[a[b+11]]+d[a[b+12]]+d[a[b+13]]+d[a[b+14]]+d[a[b+15]]).toLowerCase()}},57781:(a,b,c)=>{"use strict";c.d(b,{R:()=>h});var d=c(51455),e=c.n(d),f=c(76760),g=c.n(f);async function h(a,b,c="utf-8"){let d=g().dirname(a);await e().mkdir(d,{recursive:!0});let f=g().join(d,`.${g().basename(a)}.sb-tmp-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`);try{await e().writeFile(f,b,c);try{let a=await e().open(f,"r+");try{await a.sync()}finally{await a.close()}}catch{}await e().rename(f,a)}catch(a){try{await e().unlink(f)}catch{}throw a}}},68393:(a,b,c)=>{"use strict";c.d(b,{AD:()=>x,El:()=>v,JF:()=>r,LU:()=>u,Ng:()=>o,OU:()=>t,Ro:()=>h,_1:()=>s,ao:()=>l,at:()=>B,i6:()=>A,iO:()=>w,s8:()=>z,wN:()=>y});let d=Object.freeze({PASS_THROUGH:"pass-through",PROXY:"proxy",FULL_CATALOG:"full-catalog"}),e="x-switchboard-claude-mode",f="x-switchboard-claude-models",g="x-switchboard-claude-labels",h="x-switchboard-key",i="claude-switchboard-v1/",j=/^(?:claude|anthropic)-[a-z0-9][a-z0-9._-]*$/i,k=Object.freeze(["ANTHROPIC_DEFAULT_OPUS_MODEL","ANTHROPIC_DEFAULT_OPUS_MODEL_NAME","ANTHROPIC_DEFAULT_OPUS_MODEL_DESCRIPTION","ANTHROPIC_DEFAULT_SONNET_MODEL","ANTHROPIC_DEFAULT_SONNET_MODEL_NAME","ANTHROPIC_DEFAULT_SONNET_MODEL_DESCRIPTION","ANTHROPIC_DEFAULT_FABLE_MODEL","ANTHROPIC_DEFAULT_FABLE_MODEL_NAME","ANTHROPIC_DEFAULT_FABLE_MODEL_DESCRIPTION","ANTHROPIC_DEFAULT_HAIKU_MODEL","ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME","ANTHROPIC_DEFAULT_HAIKU_MODEL_DESCRIPTION"]);function l(a){let b=String(a||"");if(!b)return"";let c=0x811c9dc5;for(let a=0;a<b.length;a+=1)c^=b.charCodeAt(a),c=Math.imul(c,0x1000193);return(c>>>0).toString(16).padStart(8,"0")}let m=a=>a.replace(/(^|-)([a-z])/g,(a,b,c)=>`${b}${c.toUpperCase()}`);function n(a,b){if("string"!=typeof a)return"";for(let c of a.split(/\r?\n/)){let a=c.indexOf(":");if(!(a<0)&&c.slice(0,a).trim().toLowerCase()===b)return c.slice(a+1).trim()}return""}function o(a){return"string"==typeof a&&j.test(a)}function p(a){if(!Array.isArray(a))throw TypeError("Claude catalog models must be an array.");let b=[],c=new Set;for(let d of a){if("string"!=typeof d)throw TypeError("Each Claude catalog model must be a string.");let a=d.trim();if(a){if(/\r|\n/.test(a))throw TypeError("Claude catalog model IDs cannot contain newlines.");c.has(a)||(c.add(a),b.push(a))}}return b}function q(a){if("string"!=typeof a||!a.trim())return[];try{return p(JSON.parse(decodeURIComponent(a)))}catch{return[]}}function r(a){return q(n(a,f))}function s(a){return q(a?.get(f))}function t(a,b){if(!a||"object"!=typeof a||Array.isArray(a))return{};let c=new Set(p(b)),d={};for(let[b,e]of Object.entries(a)){if(!c.has(b))continue;let a=String(e||"").trim().replace(/[·•—–]/g," | ").replace(/[\r\n]+/g," ").replace(/\s+/g," ");a&&(d[b]=a.slice(0,48))}return d}function u(a){var b=a?.get(g);if("string"!=typeof b||!b.trim())return{};try{let a=JSON.parse(decodeURIComponent(b));return a&&"object"==typeof a&&!Array.isArray(a)?a:{}}catch{return{}}}function v(a){let b=String(a||"").trim();if(!b)throw TypeError("A Switchboard model ID is required.");let c=b.split("/").map(encodeURIComponent).join("/");return`${i}${c}`}function w(a){if("string"!=typeof a||!a.startsWith(i))return null;let b=a.slice(i.length);if(!b)return null;try{let c=b.split("/").map(decodeURIComponent).join("/");return v(c)===a?c:null}catch{return null}}function x({baseUrl:a,gatewayKey:b,models:c=[],pickerLabels:h={}}){let i=String(a||"").trim().replace(/\/+$/,""),j=String(b||"").trim();if(!i)throw TypeError("A Switchboard endpoint is required.");if(!j)throw TypeError("A Switchboard API key is required.");let l=p(c),n=t(h,l),o=function(a=[],b={}){let c=p(a),h=[`${m(e)}: ${d.FULL_CATALOG}`,`${m(f)}: ${encodeURIComponent(JSON.stringify(p(c)))}`],i=function(a,b={}){let c=t(b,a);return 0===Object.keys(c).length?"":encodeURIComponent(JSON.stringify(c))}(c,b);return i&&h.push(`${m(g)}: ${i}`),h.join("\n")}(l,n);if(new TextEncoder().encode(o).byteLength>7168)throw TypeError("This catalog is too large for Claude Code request headers. Remove models or shorten picker labels.");let q={ANTHROPIC_API_KEY:"",ANTHROPIC_AUTH_TOKEN:j,ANTHROPIC_BASE_URL:i.endsWith("/v1")?i:`${i}/v1`,ANTHROPIC_CUSTOM_HEADERS:o,ANTHROPIC_CUSTOM_MODEL_OPTION:"",CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY:"1"};for(let a of k)q[a]="";return{env:q,pickerLabels:n}}function y(a){return n(a,e).toLowerCase()===d.PASS_THROUGH}function z(a){let b=n(a,e).toLowerCase();return b===d.FULL_CATALOG||b===d.PROXY}function A(a){return a?.get(e)?.trim().toLowerCase()===d.PASS_THROUGH}function B(a){let b=a?.get(e)?.trim().toLowerCase();return b===d.FULL_CATALOG||b===d.PROXY}},78335:()=>{},85432:(a,b,c)=>{"use strict";c.d(b,{Kt:()=>m,MH:()=>l,vA:()=>k});var d=c(15717),e=c(19978),f=c(94454),g=c(29696);let h="compatible-reasoning:snapshot";async function i(){let a="function"==typeof d.Fh?(0,d.Fh)({type:"openai-compatible"}):Promise.resolve([]),b="function"==typeof d.uv?(0,d.uv)():Promise.resolve([]),[c,e]=await Promise.all([Promise.resolve(a).catch(()=>[]),Promise.resolve(b).catch(()=>[])]),f=new Map,h=new Map;for(let a of c){if(!a?.id||!a?.prefix)continue;let b={id:a.id,apiType:"responses"===a.apiType?"responses":"chat",staticFormat:(0,g.ml)(a.baseUrl)};f.set(a.id,b),h.set(a.prefix,b)}let i=new Map;for(let a of e){if(!a?.providerAlias||!a?.id||"llm"!==(a.type||"llm"))continue;let b=h.get(a.providerAlias);b&&(0,g.K5)(a.reasoning)&&i.set(`${b.id}|${a.id}`,a.reasoning)}return{nodesById:f,prefixToNode:h,byModel:i}}let j={nodesById:new Map,prefixToNode:new Map,byModel:new Map};async function k(a=15e3){try{let b=await (0,e.PO)(h,i,a);b&&(j=b)}catch{}}function l(){(0,e.Y3)(h)}function m(a,b){let c=j.prefixToNode.get(a);if(!c)return null;let d=j.byModel.get(`${c.id}|${b}`);return d||("none"===c.staticFormat?{supported:!1,effort:null}:c.staticFormat?{supported:!0,effort:"qwen"===c.staticFormat?null:c.staticFormat}:null)}(0,f.xl)(function(a,b){var c,d,e,f;if(!a||!a.startsWith("openai-compatible-"))return null;let g=j.nodesById.get(a),h=j.byModel.get(`${a}|${b}`);return h?(c=h,d=g?.apiType||"chat",c.supported?"responses"===d?"openai-responses":"nested"===c.effort?"openai-nested":"openai":"none"):g?.staticFormat?(e=g.staticFormat,f=g.apiType,"none"===e?"none":"qwen"===e?"qwen":"responses"===f?"openai-responses":"nested"===e?"openai-nested":"openai"):null})},92770:(a,b,c)=>{"use strict";c.r(b),c.d(b,{DELETE:()=>V,GET:()=>R,POST:()=>T});var d=c(49796),e=c(23211),f=c(79646),g=c(28354),h=c(79748),i=c.n(h),j=c(33873),k=c.n(j),l=c(21820),m=c.n(l),n=c(63294),o=c(23628),p=c(95510),q=c(68393),r=c(15717),s=c(43904),t=c(85432),u=c(24424);let v=(0,g.promisify)(f.exec),w="switchboard",x=Promise.resolve(),y=a=>{let b=x.then(a,a);return x=b.catch(()=>{}),b},z=()=>k().join(m().homedir(),".pi","agent"),A=()=>k().join(z(),"models.json"),B=()=>k().join(z(),"settings.json"),C=()=>k().join(z(),"switchboard-backup.json"),D=()=>k().join(z(),"models.yml"),E=async()=>{try{let a="win32"===m().platform();return await v(a?"where pi":"which pi",{windowsHide:!0}),!0}catch{try{return await i().access(z()),!0}catch{return!1}}},F=async(a,b)=>{try{let b=await i().readFile(a,"utf-8"),c=JSON.parse(b);if(!c||"object"!=typeof c||Array.isArray(c))throw TypeError(`${a} must contain a JSON object`);return c}catch(a){if("ENOENT"===a.code)return b;throw a}},G=()=>F(A(),{providers:{}}),H=()=>F(B(),{}),I=async(a,b)=>{try{let b=await i().readFile(a,"utf-8"),c=""===b.trim()?{}:(0,n.qg)(b);if(!c||"object"!=typeof c||Array.isArray(c))throw TypeError(`${a} must contain a YAML object`);return c}catch(a){if("ENOENT"===a.code)return b;throw a}},J=()=>I(D(),{providers:{}}),K=a=>Array.isArray(a)?a.map(K):a&&"object"==typeof a?Object.fromEntries(Object.keys(a).sort().map(b=>[b,K(a[b])])):a,L=(a,b)=>JSON.stringify(K(a))===JSON.stringify(K(b)),M=a=>a&&"object"==typeof a&&"boolean"==typeof a.exists,N=a=>{if(null==a)return null;if(1===a.version&&"restored"===a.state)return a;if(1!==a.version||!M(a.provider)||!["defaultProvider","defaultModel","enabledModels"].every(b=>M(a.settings?.[b]))||!a.managedProvider||!a.managedSettings)throw Error("Unsupported or invalid Pi Switchboard backup file");return a},O=async(a,b,c,d)=>{await i().mkdir(z(),{recursive:!0}),await (0,p.M_)([{filePath:C(),content:d?JSON.stringify(d,null,2):null,secret:!0},{filePath:D(),content:(0,n.As)(a),secret:!0},{filePath:A(),content:JSON.stringify(b,null,2),secret:!0},{filePath:B(),content:JSON.stringify(c,null,2),secret:!0}])},P=(a,b,c)=>{("defaultProvider"!==c&&"defaultModel"!==c||a.defaultProvider===w)&&L(a[c],b?.managedSettings?.[c])&&(0,p.S3)(a,{[c]:b.settings?.[c]})};async function Q(){try{if(!await E())return e.NextResponse.json({installed:!1,settings:null,message:"Pi is not installed"});let[a,b,c]=await Promise.all([J(),G(),H()]),d=a?.providers?.[w]||null,f=d||b?.providers?.[w]||null,g=Array.isArray(d?.models)?d.models:Array.isArray(b?.providers?.[w]?.models)?b.providers[w].models:[],h=g.map(a=>a?.id).filter(Boolean),i=Object.fromEntries(g.filter(a=>a?.id&&a?.name).map(a=>[a.id,a.name])),j=(c.defaultProvider===w&&h.includes(c.defaultModel)?c.defaultModel:null)||h[0]||null,k=f?.baseUrl||null,l=!!(f&&(a=>{try{let b=new URL(String(a||"")).hostname.toLowerCase();return"localhost"===b||"0.0.0.0"===b||/^127(?:\.\d{1,3}){3}$/.test(b)}catch{return!1}})(k)),m=l&&h.length>0;return e.NextResponse.json({installed:!0,hasSwitchboard:l,settings:{baseUrl:k,model:j,defaultModel:j,models:h,pickerLabels:i,apiKeySet:!!f?.apiKey,provider:w,scopeConfigured:m},configPath:D(),settingsPath:B()})}catch(a){return console.log("Error checking pi settings:",a),e.NextResponse.json({error:"Failed to check pi settings"},{status:500})}}async function R(){return y(Q)}async function S(a){try{let b,c;try{b=await a.json()}catch{return e.NextResponse.json({error:"Invalid JSON body"},{status:400})}let{baseUrl:d,apiKey:f,model:g,models:h,defaultModel:i,pickerLabels:j}=b||{},[k,l,m,n]=await Promise.all([J(),G(),H(),F(C(),null)]),u=N(n),v=u?.state==="restored"?null:u,x=Array.isArray(k?.providers?.[w]?.models)?k.providers[w].models:Array.isArray(l?.providers?.[w]?.models)?l.providers[w].models:[],y=void 0===h?[g,...x.map(a=>a?.id)]:h,z=(0,o.rP)(y),A=void 0===j||j&&"object"==typeof j&&!Array.isArray(j)&&Object.values(j).every(a=>"string"==typeof a);if(!(0,o.uI)(d)||!(0,o.iU)(f)||0===z.length||!A)return e.NextResponse.json({error:"baseUrl, models, API key, or picker labels are invalid"},{status:400});let E=(c=String(d||"").replace(/\/+$/,"")).endsWith("/v1")?c:`${c}/v1`,I=f||"sk_switchboard",K=(0,o.F2)(i||g,z),L=(0,q.OU)(j,z);await (0,t.vA)().catch(()=>{});let M="function"==typeof r.Uv?await Promise.resolve((0,r.Uv)()).catch(()=>[]):[],P=new Map(M.map(a=>[a.name,a])),Q=(a,b=new Set)=>{try{let c=String(a||""),d=c.indexOf("/");if(d<=0){if(b.has(c))return null;b.add(c);let a=P.get(c);if(!a||!Array.isArray(a.models)||0===a.models.length)return null;let d=null;for(let c of a.models){let a=Q(String(c),b);if(a?.reasoning)return a;a&&!d&&(d=a)}return d}let e=c.slice(0,d),f=c.slice(d+1),g=(0,t.Kt)(e,f);if(g){let a=(0,s.nl)(e,f);return{reasoning:!0===g.supported,contextWindow:a.contextWindow||null}}let h=(0,s.nl)(e,f);return{reasoning:!0===h.reasoning,contextWindow:h.contextWindow||null}}catch{return null}},R=a=>{(!a.providers||"object"!=typeof a.providers||Array.isArray(a.providers))&&(a.providers={})};R(k),R(l);let S={baseUrl:E,api:"openai-completions",apiKey:I,authHeader:!0,compat:{supportsDeveloperRole:!1,supportsReasoningEffort:!0,supportsUsageInStreaming:!0},models:(0,o.L6)(z,x,L,Q)},T={...S,discovery:{type:"openai-models-list"}},U=v?.version===1?v:{version:1,state:"active",provider:(0,p.EA)(k.providers,[w])[w],legacyProvider:(0,p.EA)(l.providers,[w])[w],settings:(0,p.EA)(m,["defaultProvider","defaultModel","enabledModels"])};k.providers[w]=T,l.providers[w]=S,m.defaultProvider=w,m.defaultModel=K;let V=((a,b)=>{if(!Array.isArray(a)||0===a.length)return;let c=a.filter(a=>"string"!=typeof a||!a.startsWith(`${w}/`));if(0!==c.length)return[...c,...b]})(m.enabledModels,z.map(a=>`${w}/${a}`));return V?m.enabledModels=V:delete m.enabledModels,U.managedProvider=T,U.managedLegacyProvider=S,U.managedSettings={defaultProvider:w,defaultModel:K,enabledModels:m.enabledModels},await O(k,l,m,U),e.NextResponse.json({success:!0,message:`Pi configured with ${z.length} model${1===z.length?"":"s"}. ${K} is the default; use /model to switch.`,pickerLabels:Object.fromEntries(S.models.map(a=>[a.id,a.name])),configPath:D(),settingsPath:B()})}catch(a){return console.log("Error updating pi settings:",a),e.NextResponse.json({error:"Failed to update pi settings"},{status:500})}}async function T(a){return y(()=>S(a))}async function U(){try{let[a,b,c,d]=await Promise.all([J(),G(),H(),F(C(),null)]),f=N(d);if(f?.state==="restored")return e.NextResponse.json({success:!0,message:"No Switchboard Pi settings to reset"});let g=a?.providers?.[w],h=b?.providers?.[w],i=!!(g||h),j=c.defaultProvider===w||Array.isArray(c.enabledModels)&&c.enabledModels.some(a=>"string"==typeof a&&a.startsWith(`${w}/`));if(!f&&!i&&!j)return e.NextResponse.json({success:!0,message:"No Switchboard Pi settings to reset"});return g&&(!f?.managedProvider||L(g,f.managedProvider))&&(f?.version===1?(0,p.S3)(a.providers,{[w]:f.provider}):delete a.providers[w]),h&&(!f?.managedLegacyProvider||L(h,f.managedLegacyProvider))&&(f?.version===1?(0,p.S3)(b.providers,{[w]:f.legacyProvider??f.provider}):delete b.providers[w]),f?.version===1?(P(c,f,"defaultModel"),P(c,f,"defaultProvider"),P(c,f,"enabledModels")):c.defaultProvider===w&&(delete c.defaultProvider,delete c.defaultModel),!f&&Array.isArray(c.enabledModels)&&(c.enabledModels=c.enabledModels.filter(a=>"string"!=typeof a||!a.startsWith(`${w}/`)),0===c.enabledModels.length&&delete c.enabledModels),await O(a,b,c,{version:1,state:"restored"}),e.NextResponse.json({success:!0,message:"Switchboard provider removed and previous Pi model settings restored"})}catch(a){return console.log("Error resetting pi settings:",a),e.NextResponse.json({error:"Failed to reset pi settings"},{status:500})}}async function V(){return y(U)}(0,u.D)([R,T,V]),(0,d.A)(R,"008e16a3f3f0893daf4369299db7993eb60a8cdb58",null),(0,d.A)(T,"407a9a96d189b486c5958a1765609984a94ffd0997",null),(0,d.A)(V,"00edb3816515ef212350aa12e93dde81d2c6ec4fe8",null)},95510:(a,b,c)=>{"use strict";c.d(b,{EA:()=>i,M_:()=>h,S3:()=>j,Yb:()=>g});var d=c(51455),e=c.n(d),f=c(57781);async function g(a,b,{secret:c=!1}={}){if(await (0,f.R)(a,b,c?{encoding:"utf-8",mode:384}:"utf-8"),c)try{await e().chmod(a,384)}catch{}}async function h(a){let b=await Promise.all(a.map(async({filePath:a})=>{try{return{exists:!0,value:await e().readFile(a)}}catch(a){if(a?.code==="ENOENT")return{exists:!1,value:null};throw a}})),c=async({filePath:a,content:b,secret:c=!1})=>{if(null!==b)return void await g(a,b,{secret:c});try{await e().unlink(a)}catch(a){if(a?.code!=="ENOENT")throw a}};try{for(let b of a)await c(b)}catch(e){let d=(await Promise.allSettled(a.map(({filePath:a,secret:d=!1},e)=>c({filePath:a,content:b[e].exists?b[e].value:null,secret:d})))).filter(a=>"rejected"===a.status);if(d.length>0)throw AggregateError([e,...d.map(a=>a.reason)],"Failed to replace CLI files and roll them back cleanly");throw e}}function i(a,b){return Object.fromEntries(b.map(b=>[b,{exists:Object.hasOwn(a,b),value:a[b]}]))}function j(a,b){for(let[c,d]of Object.entries(b||{}))d?.exists?a[c]=d.value:delete a[c]}},96487:()=>{}};
5
+ `}function u(a){let b=o(a,f),c=(0,d.Tp)(p(a,f));if(c.errors.length)throw Error(`Invalid Hermes YAML: ${c.errors[0].message}`);let e=q(c.getIn(["custom_providers"]));if(Array.isArray(e)){let a=e.filter(a=>a?.name!=="switchboard");b?.previousProvider&&a.push(b.previousProvider),a.length?c.setIn(["custom_providers"],a):c.deleteIn(["custom_providers"])}return"custom:switchboard"===q(c.getIn(["model","provider"]))&&(b?.previousModel?c.setIn(["model"],b.previousModel):c.deleteIn(["model"])),c.toString()}function v(a,{baseUrl:b,apiKey:c,models:d,defaultModel:e}){let f=i(d),g=j(e,f);return{...a,model:`switchboard/${g}`,provider:{...a.provider||{},switchboard:{npm:"@ai-sdk/openai-compatible",name:"Switchboard",options:{apiKey:c,baseURL:b},models:Object.fromEntries(f.map(a=>[a,{name:k(a)}]))}}}}function w(a,{baseUrl:b,apiKey:c,models:d,defaultModel:e}){let f=i(d),g=j(e,f),h=a.providers||{},l=a.models||{};return{providers:{...h,providers:{...h.providers||{},switchboard:{type:"openai-compatible",name:"Switchboard",baseUrl:b,apiKey:c,defaultModelId:g}}},models:{...l,providers:{...l.providers||{},switchboard:{provider:{name:"Switchboard",baseUrl:b,defaultModelId:g},models:Object.fromEntries(f.map(a=>[a,{id:a,name:k(a)}]))}}}}}function x(a,{models:b,defaultModel:c}){let d=i(b),e=j(c,d),f=Object.fromEntries(Object.entries(a?.modelConfigs?.modelDefinitions&&"object"==typeof a.modelConfigs.modelDefinitions?a.modelConfigs.modelDefinitions:{}).filter(([,a])=>a?.family!=="switchboard"));return{...a,model:{...a.model||{},name:e},experimental:{...a.experimental||{},dynamicModelConfiguration:!0},modelConfigs:{...a.modelConfigs||{},modelDefinitions:{...f,...Object.fromEntries(d.map(a=>[a,{displayName:`Switchboard \xb7 ${k(a)}`,family:"switchboard",tier:"custom",isPreview:!1,isVisible:!0,features:{thinking:!0,multimodalToolUse:!0}}]))}}}}},47293:(a,b,c)=>{"use strict";c.d(b,{A:()=>f});let d=new Uint8Array(16);var e=c(50122);let f=function(a,b,c){return b||a||!crypto.randomUUID?function(a,b,c){let f=(a=a||{}).random??a.rng?.()??crypto.getRandomValues(d);if(f.length<16)throw Error("Random bytes length must be >= 16");if(f[6]=15&f[6]|64,f[8]=63&f[8]|128,b){if((c=c||0)<0||c+16>b.length)throw RangeError(`UUID byte range ${c}:${c+15} is out of buffer bounds`);for(let a=0;a<16;++a)b[c+a]=f[a];return b}return(0,e.k)(f)}(a,b,c):crypto.randomUUID()}},50122:(a,b,c)=>{"use strict";c.d(b,{k:()=>e});let d=[];for(let a=0;a<256;++a)d.push((a+256).toString(16).slice(1));function e(a,b=0){return(d[a[b+0]]+d[a[b+1]]+d[a[b+2]]+d[a[b+3]]+"-"+d[a[b+4]]+d[a[b+5]]+"-"+d[a[b+6]]+d[a[b+7]]+"-"+d[a[b+8]]+d[a[b+9]]+"-"+d[a[b+10]]+d[a[b+11]]+d[a[b+12]]+d[a[b+13]]+d[a[b+14]]+d[a[b+15]]).toLowerCase()}},57781:(a,b,c)=>{"use strict";c.d(b,{R:()=>h});var d=c(51455),e=c.n(d),f=c(76760),g=c.n(f);async function h(a,b,c="utf-8"){let d=g().dirname(a);await e().mkdir(d,{recursive:!0});let f=g().join(d,`.${g().basename(a)}.sb-tmp-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`);try{await e().writeFile(f,b,c);try{let a=await e().open(f,"r+");try{await a.sync()}finally{await a.close()}}catch{}await e().rename(f,a)}catch(a){try{await e().unlink(f)}catch{}throw a}}},68393:(a,b,c)=>{"use strict";c.d(b,{AD:()=>x,El:()=>v,JF:()=>r,LU:()=>u,Ng:()=>o,OU:()=>t,Ro:()=>h,_1:()=>s,ao:()=>l,at:()=>B,i6:()=>A,iO:()=>w,s8:()=>z,wN:()=>y});let d=Object.freeze({PASS_THROUGH:"pass-through",PROXY:"proxy",FULL_CATALOG:"full-catalog"}),e="x-switchboard-claude-mode",f="x-switchboard-claude-models",g="x-switchboard-claude-labels",h="x-switchboard-key",i="claude-switchboard-v1/",j=/^(?:claude|anthropic)-[a-z0-9][a-z0-9._-]*$/i,k=Object.freeze(["ANTHROPIC_DEFAULT_OPUS_MODEL","ANTHROPIC_DEFAULT_OPUS_MODEL_NAME","ANTHROPIC_DEFAULT_OPUS_MODEL_DESCRIPTION","ANTHROPIC_DEFAULT_SONNET_MODEL","ANTHROPIC_DEFAULT_SONNET_MODEL_NAME","ANTHROPIC_DEFAULT_SONNET_MODEL_DESCRIPTION","ANTHROPIC_DEFAULT_FABLE_MODEL","ANTHROPIC_DEFAULT_FABLE_MODEL_NAME","ANTHROPIC_DEFAULT_FABLE_MODEL_DESCRIPTION","ANTHROPIC_DEFAULT_HAIKU_MODEL","ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME","ANTHROPIC_DEFAULT_HAIKU_MODEL_DESCRIPTION"]);function l(a){let b=String(a||"");if(!b)return"";let c=0x811c9dc5;for(let a=0;a<b.length;a+=1)c^=b.charCodeAt(a),c=Math.imul(c,0x1000193);return(c>>>0).toString(16).padStart(8,"0")}let m=a=>a.replace(/(^|-)([a-z])/g,(a,b,c)=>`${b}${c.toUpperCase()}`);function n(a,b){if("string"!=typeof a)return"";for(let c of a.split(/\r?\n/)){let a=c.indexOf(":");if(!(a<0)&&c.slice(0,a).trim().toLowerCase()===b)return c.slice(a+1).trim()}return""}function o(a){return"string"==typeof a&&j.test(a)}function p(a){if(!Array.isArray(a))throw TypeError("Claude catalog models must be an array.");let b=[],c=new Set;for(let d of a){if("string"!=typeof d)throw TypeError("Each Claude catalog model must be a string.");let a=d.trim();if(a){if(/\r|\n/.test(a))throw TypeError("Claude catalog model IDs cannot contain newlines.");c.has(a)||(c.add(a),b.push(a))}}return b}function q(a){if("string"!=typeof a||!a.trim())return[];try{return p(JSON.parse(decodeURIComponent(a)))}catch{return[]}}function r(a){return q(n(a,f))}function s(a){return q(a?.get(f))}function t(a,b){if(!a||"object"!=typeof a||Array.isArray(a))return{};let c=new Set(p(b)),d={};for(let[b,e]of Object.entries(a)){if(!c.has(b))continue;let a=String(e||"").trim().replace(/[·•—–]/g," | ").replace(/[\r\n]+/g," ").replace(/\s+/g," ");a&&(d[b]=a.slice(0,48))}return d}function u(a){var b=a?.get(g);if("string"!=typeof b||!b.trim())return{};try{let a=JSON.parse(decodeURIComponent(b));return a&&"object"==typeof a&&!Array.isArray(a)?a:{}}catch{return{}}}function v(a){let b=String(a||"").trim();if(!b)throw TypeError("A Switchboard model ID is required.");let c=b.split("/").map(encodeURIComponent).join("/");return`${i}${c}`}function w(a){if("string"!=typeof a||!a.startsWith(i))return null;let b=a.slice(i.length);if(!b)return null;try{let c=b.split("/").map(decodeURIComponent).join("/");return v(c)===a?c:null}catch{return null}}function x({baseUrl:a,gatewayKey:b,models:c=[],pickerLabels:h={}}){let i=String(a||"").trim().replace(/\/+$/,""),j=String(b||"").trim();if(!i)throw TypeError("A Switchboard endpoint is required.");if(!j)throw TypeError("A Switchboard API key is required.");let l=p(c),n=t(h,l),o=function(a=[],b={}){let c=p(a),h=[`${m(e)}: ${d.FULL_CATALOG}`,`${m(f)}: ${encodeURIComponent(JSON.stringify(p(c)))}`],i=function(a,b={}){let c=t(b,a);return 0===Object.keys(c).length?"":encodeURIComponent(JSON.stringify(c))}(c,b);return i&&h.push(`${m(g)}: ${i}`),h.join("\n")}(l,n);if(new TextEncoder().encode(o).byteLength>7168)throw TypeError("This catalog is too large for Claude Code request headers. Remove models or shorten picker labels.");let q={ANTHROPIC_API_KEY:"",ANTHROPIC_AUTH_TOKEN:j,ANTHROPIC_BASE_URL:i.endsWith("/v1")?i:`${i}/v1`,ANTHROPIC_CUSTOM_HEADERS:o,ANTHROPIC_CUSTOM_MODEL_OPTION:"",CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY:"1"};for(let a of k)q[a]="";return{env:q,pickerLabels:n}}function y(a){return n(a,e).toLowerCase()===d.PASS_THROUGH}function z(a){let b=n(a,e).toLowerCase();return b===d.FULL_CATALOG||b===d.PROXY}function A(a){return a?.get(e)?.trim().toLowerCase()===d.PASS_THROUGH}function B(a){let b=a?.get(e)?.trim().toLowerCase();return b===d.FULL_CATALOG||b===d.PROXY}},78335:()=>{},85432:(a,b,c)=>{"use strict";c.d(b,{Kt:()=>m,MH:()=>l,vA:()=>k});var d=c(15717),e=c(19978),f=c(94454),g=c(29696);let h="compatible-reasoning:snapshot";async function i(){let a="function"==typeof d.Fh?(0,d.Fh)({type:"openai-compatible"}):Promise.resolve([]),b="function"==typeof d.uv?(0,d.uv)():Promise.resolve([]),[c,e]=await Promise.all([Promise.resolve(a).catch(()=>[]),Promise.resolve(b).catch(()=>[])]),f=new Map,h=new Map;for(let a of c){if(!a?.id||!a?.prefix)continue;let b={id:a.id,apiType:"responses"===a.apiType?"responses":"chat",staticFormat:(0,g.ml)(a.baseUrl)};f.set(a.id,b),h.set(a.prefix,b)}let i=new Map;for(let a of e){if(!a?.providerAlias||!a?.id||"llm"!==(a.type||"llm"))continue;let b=h.get(a.providerAlias);b&&(0,g.K5)(a.reasoning)&&i.set(`${b.id}|${a.id}`,a.reasoning)}return{nodesById:f,prefixToNode:h,byModel:i}}let j={nodesById:new Map,prefixToNode:new Map,byModel:new Map};async function k(a=15e3){try{let b=await (0,e.PO)(h,i,a);b&&(j=b)}catch{}}function l(){(0,e.Y3)(h)}function m(a,b){let c=j.prefixToNode.get(a);if(!c)return null;let d=j.byModel.get(`${c.id}|${b}`);return d||("none"===c.staticFormat?{supported:!1,effort:null}:c.staticFormat?{supported:!0,effort:"qwen"===c.staticFormat?null:c.staticFormat}:null)}(0,f.xl)(function(a,b){var c,d,e,f;if(!a||!a.startsWith("openai-compatible-"))return null;let g=j.nodesById.get(a),h=j.byModel.get(`${a}|${b}`);return h?(c=h,d=g?.apiType||"chat",c.supported?"responses"===d?"openai-responses":"nested"===c.effort?"openai-nested":"openai":"none"):g?.staticFormat?(e=g.staticFormat,f=g.apiType,"none"===e?"none":"qwen"===e?"qwen":"responses"===f?"openai-responses":"nested"===e?"openai-nested":"openai"):null})},92770:(a,b,c)=>{"use strict";c.r(b),c.d(b,{DELETE:()=>V,GET:()=>R,POST:()=>T});var d=c(49796),e=c(23211),f=c(79646),g=c(28354),h=c(79748),i=c.n(h),j=c(33873),k=c.n(j),l=c(21820),m=c.n(l),n=c(63294),o=c(23628),p=c(95510),q=c(68393),r=c(15717),s=c(43904),t=c(85432),u=c(24424);let v=(0,g.promisify)(f.exec),w="switchboard",x=Promise.resolve(),y=a=>{let b=x.then(a,a);return x=b.catch(()=>{}),b},z=()=>k().join(m().homedir(),".pi","agent"),A=()=>k().join(z(),"models.json"),B=()=>k().join(z(),"settings.json"),C=()=>k().join(z(),"switchboard-backup.json"),D=()=>k().join(z(),"models.yml"),E=async()=>{try{let a="win32"===m().platform();return await v(a?"where pi":"which pi",{windowsHide:!0}),!0}catch{try{return await i().access(z()),!0}catch{return!1}}},F=async(a,b)=>{try{let b=await i().readFile(a,"utf-8"),c=JSON.parse(b);if(!c||"object"!=typeof c||Array.isArray(c))throw TypeError(`${a} must contain a JSON object`);return c}catch(a){if("ENOENT"===a.code)return b;throw a}},G=()=>F(A(),{providers:{}}),H=()=>F(B(),{}),I=async(a,b)=>{try{let b=await i().readFile(a,"utf-8"),c=""===b.trim()?{}:(0,n.qg)(b);if(!c||"object"!=typeof c||Array.isArray(c))throw TypeError(`${a} must contain a YAML object`);return c}catch(a){if("ENOENT"===a.code)return b;throw a}},J=()=>I(D(),{providers:{}}),K=a=>Array.isArray(a)?a.map(K):a&&"object"==typeof a?Object.fromEntries(Object.keys(a).sort().map(b=>[b,K(a[b])])):a,L=(a,b)=>JSON.stringify(K(a))===JSON.stringify(K(b)),M=a=>a&&"object"==typeof a&&"boolean"==typeof a.exists,N=a=>{if(null==a)return null;if(1===a.version&&"restored"===a.state)return a;if(1!==a.version||!M(a.provider)||!["defaultProvider","defaultModel","enabledModels"].every(b=>M(a.settings?.[b]))||!a.managedProvider||!a.managedSettings)throw Error("Unsupported or invalid Pi Switchboard backup file");return a},O=async(a,b,c,d)=>{await i().mkdir(z(),{recursive:!0}),await (0,p.M_)([{filePath:C(),content:d?JSON.stringify(d,null,2):null,secret:!0},{filePath:D(),content:(0,n.As)(a),secret:!0},{filePath:A(),content:JSON.stringify(b,null,2),secret:!0},{filePath:B(),content:JSON.stringify(c,null,2),secret:!0}])},P=(a,b,c)=>{("defaultProvider"!==c&&"defaultModel"!==c||a.defaultProvider===w)&&L(a[c],b?.managedSettings?.[c])&&(0,p.S3)(a,{[c]:b.settings?.[c]})};async function Q(){try{if(!await E())return e.NextResponse.json({installed:!1,settings:null,message:"Pi is not installed"});let[a,b,c]=await Promise.all([J(),G(),H()]),d=a?.providers?.[w]||null,f=d||b?.providers?.[w]||null,g=Array.isArray(d?.models)?d.models:Array.isArray(b?.providers?.[w]?.models)?b.providers[w].models:[],h=g.map(a=>a?.id).filter(Boolean),i=Object.fromEntries(g.filter(a=>a?.id&&a?.name).map(a=>[a.id,a.name])),j=(c.defaultProvider===w&&h.includes(c.defaultModel)?c.defaultModel:null)||h[0]||null,k=f?.baseUrl||null,l=!!(f&&(a=>{try{let b=new URL(String(a||"")).hostname.toLowerCase();return"localhost"===b||"0.0.0.0"===b||/^127(?:\.\d{1,3}){3}$/.test(b)}catch{return!1}})(k)),m=l&&h.length>0;return e.NextResponse.json({installed:!0,hasSwitchboard:l,settings:{baseUrl:k,model:j,defaultModel:j,models:h,pickerLabels:i,apiKeySet:!!f?.apiKey,provider:w,scopeConfigured:m},configPath:D(),settingsPath:B()})}catch(a){return console.log("Error checking pi settings:",a),e.NextResponse.json({error:"Failed to check pi settings"},{status:500})}}async function R(){return y(Q)}async function S(a){try{let b,c;try{b=await a.json()}catch{return e.NextResponse.json({error:"Invalid JSON body"},{status:400})}let{baseUrl:d,apiKey:f,model:g,models:h,defaultModel:i,pickerLabels:j}=b||{},[k,l,m,n]=await Promise.all([J(),G(),H(),F(C(),null)]),u=N(n),v=u?.state==="restored"?null:u,x=Array.isArray(k?.providers?.[w]?.models)?k.providers[w].models:Array.isArray(l?.providers?.[w]?.models)?l.providers[w].models:[],y=void 0===h?[g,...x.map(a=>a?.id)]:h,z=(0,o.rP)(y),A=void 0===j||j&&"object"==typeof j&&!Array.isArray(j)&&Object.values(j).every(a=>"string"==typeof a);if(!(0,o.uI)(d)||!(0,o.iU)(f)||0===z.length||!A)return e.NextResponse.json({error:"baseUrl, models, API key, or picker labels are invalid"},{status:400});let E=(c=String(d||"").replace(/\/+$/,"")).endsWith("/v1")?c:`${c}/v1`,I=f||"sk_switchboard",K=(0,o.F2)(i||g,z),L=(0,q.OU)(j,z);await (0,t.vA)().catch(()=>{});let M="function"==typeof r.Uv?await Promise.resolve((0,r.Uv)()).catch(()=>[]):[],P=new Map(M.map(a=>[a.name,a])),Q=(a,b=new Set)=>{try{let c=String(a||""),d=c.indexOf("/");if(d<=0){if(b.has(c))return null;b.add(c);let a=P.get(c);if(!a||!Array.isArray(a.models)||0===a.models.length)return null;let d=null;for(let c of a.models){let a=Q(String(c),b);if(a?.reasoning)return a;a&&!d&&(d=a)}return d}let e=c.slice(0,d),f=c.slice(d+1),g=(0,t.Kt)(e,f);if(g){let a=(0,s.nl)(e,f);return{reasoning:!0===g.supported,contextWindow:a.contextWindow||null}}let h=(0,s.nl)(e,f);return{reasoning:!0===h.reasoning,contextWindow:h.contextWindow||null}}catch{return null}},R=a=>{(!a.providers||"object"!=typeof a.providers||Array.isArray(a.providers))&&(a.providers={})};R(k),R(l);let S={baseUrl:E,api:"openai-completions",apiKey:I,authHeader:!0,compat:{supportsDeveloperRole:!1,supportsReasoningEffort:!0,supportsUsageInStreaming:!0},models:(0,o.L6)(z,x,L,Q)},T={...S,discovery:{type:"openai-models-list"}},U=v?.version===1?v:{version:1,state:"active",provider:(0,p.EA)(k.providers,[w])[w],legacyProvider:(0,p.EA)(l.providers,[w])[w],settings:(0,p.EA)(m,["defaultProvider","defaultModel","enabledModels"])};k.providers[w]=T,l.providers[w]=S,m.defaultProvider=w,m.defaultModel=K;let V=((a,b)=>{if(!Array.isArray(a)||0===a.length)return;let c=a.filter(a=>"string"!=typeof a||!a.startsWith(`${w}/`));if(0!==c.length)return[...c,...b]})(m.enabledModels,z.map(a=>`${w}/${a}`));return V?m.enabledModels=V:delete m.enabledModels,U.managedProvider=T,U.managedLegacyProvider=S,U.managedSettings={defaultProvider:w,defaultModel:K,enabledModels:m.enabledModels},await O(k,l,m,U),e.NextResponse.json({success:!0,message:`Pi configured with ${z.length} model${1===z.length?"":"s"}. ${K} is the default; use /model to switch.`,pickerLabels:Object.fromEntries(S.models.map(a=>[a.id,a.name])),configPath:D(),settingsPath:B()})}catch(a){return console.log("Error updating pi settings:",a),e.NextResponse.json({error:"Failed to update pi settings"},{status:500})}}async function T(a){return y(()=>S(a))}async function U(){try{let[a,b,c,d]=await Promise.all([J(),G(),H(),F(C(),null)]),f=N(d);if(f?.state==="restored")return e.NextResponse.json({success:!0,message:"No Switchboard Pi settings to reset"});let g=a?.providers?.[w],h=b?.providers?.[w],i=!!(g||h),j=c.defaultProvider===w||Array.isArray(c.enabledModels)&&c.enabledModels.some(a=>"string"==typeof a&&a.startsWith(`${w}/`));if(!f&&!i&&!j)return e.NextResponse.json({success:!0,message:"No Switchboard Pi settings to reset"});return g&&(!f?.managedProvider||L(g,f.managedProvider))&&(f?.version===1?(0,p.S3)(a.providers,{[w]:f.provider}):delete a.providers[w]),h&&(!f?.managedLegacyProvider||L(h,f.managedLegacyProvider))&&(f?.version===1?(0,p.S3)(b.providers,{[w]:f.legacyProvider??f.provider}):delete b.providers[w]),f?.version===1?(P(c,f,"defaultModel"),P(c,f,"defaultProvider"),P(c,f,"enabledModels")):c.defaultProvider===w&&(delete c.defaultProvider,delete c.defaultModel),!f&&Array.isArray(c.enabledModels)&&(c.enabledModels=c.enabledModels.filter(a=>"string"!=typeof a||!a.startsWith(`${w}/`)),0===c.enabledModels.length&&delete c.enabledModels),await O(a,b,c,{version:1,state:"restored"}),e.NextResponse.json({success:!0,message:"Switchboard provider removed and previous Pi model settings restored"})}catch(a){return console.log("Error resetting pi settings:",a),e.NextResponse.json({error:"Failed to reset pi settings"},{status:500})}}async function V(){return y(U)}(0,u.D)([R,T,V]),(0,d.A)(R,"002dc820eaf99c9bd4c690451ba623ec0a669cf309",null),(0,d.A)(T,"40c81a8d5fb318f1af86aecae19cbd087c4f58db4b",null),(0,d.A)(V,"00fe91cd1878e0ef5f4e3c1abe5050afafdaa47ab7",null)},95510:(a,b,c)=>{"use strict";c.d(b,{EA:()=>i,M_:()=>h,S3:()=>j,Yb:()=>g});var d=c(51455),e=c.n(d),f=c(57781);async function g(a,b,{secret:c=!1}={}){if(await (0,f.R)(a,b,c?{encoding:"utf-8",mode:384}:"utf-8"),c)try{await e().chmod(a,384)}catch{}}async function h(a){let b=await Promise.all(a.map(async({filePath:a})=>{try{return{exists:!0,value:await e().readFile(a)}}catch(a){if(a?.code==="ENOENT")return{exists:!1,value:null};throw a}})),c=async({filePath:a,content:b,secret:c=!1})=>{if(null!==b)return void await g(a,b,{secret:c});try{await e().unlink(a)}catch(a){if(a?.code!=="ENOENT")throw a}};try{for(let b of a)await c(b)}catch(e){let d=(await Promise.allSettled(a.map(({filePath:a,secret:d=!1},e)=>c({filePath:a,content:b[e].exists?b[e].value:null,secret:d})))).filter(a=>"rejected"===a.status);if(d.length>0)throw AggregateError([e,...d.map(a=>a.reason)],"Failed to replace CLI files and roll them back cleanly");throw e}}function i(a,b){return Object.fromEntries(b.map(b=>[b,{exists:Object.hasOwn(a,b),value:a[b]}]))}function j(a,b){for(let[c,d]of Object.entries(b||{}))d?.exists?a[c]=d.value:delete a[c]}},96487:()=>{}};
@@ -0,0 +1,4 @@
1
+ "use strict";exports.id=7828,exports.ids=[7828],exports.modules={7803:(a,b,c)=>{c.r(b),c.d(b,{debug:()=>h,error:()=>k,info:()=>i,maskKey:()=>o,request:()=>l,response:()=>m,stream:()=>n,warn:()=>j});let d={DEBUG:0,INFO:1,WARN:2,ERROR:3},e=d[process.env.LOG_LEVEL?.toUpperCase?.()]??d.INFO;function f(){return new Date().toLocaleTimeString("en-US",{hour12:!1})}function g(a){if(!a)return"";if("string"==typeof a)return a;try{return JSON.stringify(a)}catch{return String(a)}}function h(a,b,c){if(e<=d.DEBUG){let d=c?` ${g(c)}`:"";console.log(`[${f()}] 🔍 [${a}] ${b}${d}`)}}function i(a,b,c){if(e<=d.INFO){let d=c?` ${g(c)}`:"";console.log(`[${f()}] ℹ️ [${a}] ${b}${d}`)}}function j(a,b,c){e<=d.WARN&&c&&g(c)}function k(a,b,c){if(e<=d.ERROR){let d=c?` ${g(c)}`:"";console.log(`[${f()}] ❌ [${a}] ${b}${d}`)}}function l(a,b,c){let d=c?` ${g(c)}`:"";console.log(`\x1b[36m[${f()}] 📥 ${a} ${b}${d}\x1b[0m`)}function m(a,b,c){let d=c?` ${g(c)}`:"";console.log(`[${f()}] ${a<400?"\uD83D\uDCE4":"\uD83D\uDCA5"} ${a} (${b}ms)${d}`)}function n(a,b){let c=b?` ${g(b)}`:"";console.log(`[${f()}] 🌊 [STREAM] ${a}${c}`)}function o(a){return!a||a.length<8?"***":`${a.slice(0,4)}...${a.slice(-4)}`}},15186:(a,b,c)=>{c.d(b,{Ou:()=>k,eG:()=>j});var d=c(28730),e=c(4630),f=c(46052);let g=new Map,h=new Map,i=null;async function j(a,b,c="gemini-cli",d=null){if(!a||!b)return null;let e=g.get(a);if(e&&Date.now()-e.fetchedAt<36e5)return e.projectId;if(h.has(a))return h.get(a).promise;let f=new AbortController,i=(async()=>{try{let e=await l(b,f.signal,c,d);if(e)return g.set(a,{projectId:e,fetchedAt:Date.now()}),e;return console.warn("[ProjectId] could not fetch projectId for connection",a.slice(0,8)),null}catch(a){return console.warn(`[ProjectId] Error fetching project ID: ${a.message}`),null}finally{h.delete(a)}})();return h.set(a,{promise:i,controller:f,startedAt:Date.now()}),i}function k(a){g.delete(a)}async function l(a,b,c,g){let h=e.xq[c]||e.xq["gemini-cli"],i=await (0,f.Fm)(d.nZ.loadCodeAssist,{method:"POST",headers:{...d.Ic,Authorization:`Bearer ${a}`},body:JSON.stringify({metadata:d.zv}),signal:b,identity:h.identity,provider:c,format:h.format},g);if(!i.ok){let a=await i.text().catch(()=>"");throw Error(`loadCodeAssist failed: HTTP ${i.status} ${a.slice(0,200)}`)}let j=await i.json(),k=function(a){if(!a)return null;if("string"==typeof a.cloudaicompanionProject){let b=a.cloudaicompanionProject.trim();if(b)return b}if(a.cloudaicompanionProject&&"object"==typeof a.cloudaicompanionProject){let b=a.cloudaicompanionProject.id;if("string"==typeof b&&b.trim())return b.trim()}return null}(j);if(k)return k;let l="legacy-tier";if(Array.isArray(j.allowedTiers)){for(let a of j.allowedTiers)if(a&&"object"==typeof a&&!0===a.isDefault&&a.id&&"string"==typeof a.id&&a.id.trim()){l=a.id.trim();break}}return m(a,l,b,c,g)}async function m(a,b,c,g,h){console.log(`[ProjectId] Onboarding user with tier: ${b}`);let i={tierId:b,metadata:d.zv};for(let b=1;b<=5&&!c?.aborted;b++){let j=new AbortController,k=setTimeout(()=>j.abort(),3e4),l=()=>j.abort();c?.addEventListener("abort",l);try{let c=e.xq[g]||e.xq["gemini-cli"],l=await (0,f.Fm)(d.nZ.onboardUser,{method:"POST",headers:{...d.Ic,Authorization:`Bearer ${a}`},body:JSON.stringify(i),signal:j.signal,identity:c.identity,provider:g,format:c.format},h);if(clearTimeout(k),!l.ok){let a=await l.text().catch(()=>"");throw Error(`onboardUser HTTP ${l.status}: ${a.slice(0,200)}`)}let m=await l.json();if(!0===m.done){let a=function(a){if(!a?.response)return null;let b=a.response.cloudaicompanionProject;if("string"==typeof b){let a=b.trim();if(a)return a}if(b&&"object"==typeof b){let a=b.id;if("string"==typeof a&&a.trim())return a.trim()}return null}(m);if(a)return console.log(`[ProjectId] Successfully onboarded, project ID: ${a}`),a;throw Error("onboardUser done but no project_id in response")}console.log(`[ProjectId] Onboard attempt ${b}/5: not done yet, waiting...`),await new Promise(a=>setTimeout(a,2e3))}catch(a){if(clearTimeout(k),"AbortError"===a.name){if(console.warn(`[ProjectId] onboardUser attempt ${b} aborted (timeout or connection removed)`),c?.aborted)return null;continue}if(5===b)return console.warn(`[ProjectId] onboardUser failed after 5 attempts: ${a.message}`),null;console.warn(`[ProjectId] onboardUser attempt ${b} failed: ${a.message}, retrying...`),await new Promise(a=>setTimeout(a,2e3))}finally{clearTimeout(k),c?.removeEventListener("abort",l)}}return null}i=setInterval(()=>{try{let a=Date.now();for(let[b,c]of g)(!c||a-c.fetchedAt>=36e5)&&g.delete(b);for(let[b,c]of h){if(!c||"number"!=typeof c.startedAt){h.delete(b);continue}if(a-c.startedAt>12e4){try{c.controller.abort()}catch(a){}h.delete(b)}}}catch(a){console.warn("[ProjectId] cleanup sweep error:",a?.message??a)}},6e5),i?.unref?.()},38775:(a,b,c)=>{c.d(b,{getComboModels:()=>l,getModelInfo:()=>k});var d=c(15717),e=c(66451),f=c(39698),g=c(68393);let h={xmtp:"xiaomi-tokenplan","xiaomi-tokenplan":"xiaomi-tokenplan"},i=new Set(Object.keys(h));for(let a of f.A)for(let b of(i.add(a.id),a.alias&&i.add(a.alias),a.aliases||[]))i.add(b);async function j(a){let b=await (0,d.OM)();return(0,e.sc)(a,b)}async function k(a){let b,c=(0,g.iO)(a)||a,f=await j(c);if(f)return!f.provider&&f.model&&await (0,d.Dj)(f.model)?{provider:null,model:f.model}:f;let k=(b=(0,e.Xh)(c),b?.providerAlias&&h[b.providerAlias]?{...b,provider:h[b.providerAlias]}:b);if(!k.isAlias){if(!i.has(k.providerAlias)){let a=(await (0,d.Fh)({type:"openai-compatible"})).find(a=>a.prefix===k.providerAlias);if(a)return{provider:a.id,model:k.model};let b=(await (0,d.Fh)({type:"anthropic-compatible"})).find(a=>a.prefix===k.providerAlias);if(b)return{provider:b.id,model:k.model};let c=(await (0,d.Fh)({type:"custom-embedding"})).find(a=>a.prefix===k.providerAlias);if(c)return{provider:c.id,model:k.model}}return{provider:k.provider,model:k.model}}return await (0,d.Dj)(k.model)?{provider:null,model:k.model}:(0,e.js)(c,d.OM)}async function l(a){let b=(0,g.iO)(a)||a;if(b.includes("/"))return null;let c=await (0,d.Dj)(b);return c&&c.models&&c.models.length>0?c.models:null}},40863:(a,b,c)=>{var d=c(12407),e=c(15717),f=c(2142),g=c(38775),h=c(34772),i=c(33234);let j=!1;j=!0,(0,d.qd)({getSettings:e.mt,loadProviderQuotaState:i.l,saveProviderQuotaState:i._,trackPendingRequest:e.uw,appendRequestLog:e.E5,saveRequestDetail:e.ox,saveRequestUsage:e.sZ,getRoutingEvents:f.Kx,getClusterWorkerStats:f.GU,getPromotedLearningVersion:f.p3,createLearningVersion:f.Hr,countRoutingEvents:f.f8,listCombosWithRoutingEvents:f.dC,getLastScheduledLearnAt:f.HP,getClusterLatencyP50:f._6,getComboModels:g.getComboModels,getVaultEntry:h.Bl,putVaultEntry:h.M8,searchVault:h.$s,cleanupExpiredVault:h.ui,buildExternalIdpRefreshParams:async(...a)=>(await c.e(8080).then(c.bind(c,18080))).buildExternalIdpRefreshParams(...a),createXaiService:async()=>new(await Promise.all([c.e(9091),c.e(7557)]).then(c.bind(c,37557))).XaiService,fetchKiroProfileArn:async(...a)=>(await Promise.all([c.e(7774),c.e(4646),c.e(3904),c.e(4454),c.e(6406),c.e(9261),c.e(1937),c.e(8400),c.e(369),c.e(1837),c.e(9091)]).then(c.bind(c,74177))).fetchKiroProfileArn(...a)})},64254:(a,b,c)=>{c.d(b,{u:()=>n});var d=c(79748),e=c(21820),f=c(33873),g=c(79646);let h=(0,c(28354).promisify)(g.execFile),i=["cursorAuth/accessToken","cursorAuth/token"],j=["storage.serviceMachineId","storage.machineId","telemetry.machineId"];function k(a){if("string"!=typeof a)return a;try{let b=JSON.parse(a);return"string"==typeof b?b:a}catch{return a}}async function l(a){let{default:b}=await Promise.resolve().then(c.t.bind(c,87550,23)),d=new b(a,{readonly:!0,fileMustExist:!0});try{let a=[...i,...j],b=a.map(()=>"?").join(", "),c=d.prepare(`SELECT key, value FROM itemTable WHERE key IN (${b})`).all(...a),e=new Map(c.map(({key:a,value:b})=>[a,k(b)])),f=i.map(a=>e.get(a)).find(Boolean)||null,g=j.map(a=>e.get(a)).find(Boolean)||null;if(!f||!g)for(let{key:a,value:b}of d.prepare("SELECT key, value FROM itemTable WHERE key LIKE ? OR key LIKE ?").all("%accessToken%","%machineId%")){let c=k(b);!f&&/access.?token/i.test(a)&&(f=c),!g&&/machine.?id/i.test(a)&&(g=c)}return{accessToken:f,machineId:g}}finally{d.close()}}async function m(a){let b=async b=>{let{stdout:c}=await h("sqlite3",[a,b],{timeout:1e4});return c.trim()};try{await b("SELECT 1 FROM itemTable LIMIT 1")}catch{return{accessToken:null,machineId:null,opened:!1}}let c=null;for(let a of i)try{let d=await b(`SELECT value FROM itemTable WHERE key='${a}' LIMIT 1`);if(d){c=k(d.trim());break}}catch{}let d=null;for(let a of j)try{let c=await b(`SELECT value FROM itemTable WHERE key='${a}' LIMIT 1`);if(c){d=k(c.trim());break}}catch{}return{accessToken:c,machineId:d,opened:!0}}async function n(a={}){let b=a.platform||process.platform;if(!["darwin","win32","linux"].includes(b))return{found:!1,error:"Unsupported platform"};let c=function(a=process.platform){let b=(0,e.homedir)();if("darwin"===a)return[(0,f.join)(b,"Library/Application Support/Cursor/User/globalStorage/state.vscdb"),(0,f.join)(b,"Library/Application Support/Cursor - Insiders/User/globalStorage/state.vscdb")];if("win32"===a){let a=process.env.APPDATA||(0,f.join)(b,"AppData","Roaming"),c=process.env.LOCALAPPDATA||(0,f.join)(b,"AppData","Local");return[(0,f.join)(a,"Cursor","User","globalStorage","state.vscdb"),(0,f.join)(a,"Cursor - Insiders","User","globalStorage","state.vscdb"),(0,f.join)(c,"Cursor","User","globalStorage","state.vscdb"),(0,f.join)(c,"Programs","Cursor","User","globalStorage","state.vscdb")]}return[(0,f.join)(b,".config/Cursor/User/globalStorage/state.vscdb"),(0,f.join)(b,".config/cursor/User/globalStorage/state.vscdb")]}(b),g=null;for(let a of c)try{await (0,d.access)(a,d.constants.R_OK),g=a;break}catch{}if(!g){let a="darwin"===b?"known macOS locations":"known locations";return{found:!1,error:`Cursor database not found in ${a}:
2
+ ${c.join("\n")}
3
+
4
+ Make sure Cursor IDE is installed and opened at least once.`}}if("linux"===b&&!1!==a.verifyLinuxInstall){let a=!1;try{await h("which",["cursor"],{timeout:5e3}),a=!0}catch{try{await (0,d.access)((0,f.join)((0,e.homedir)(),".local/share/applications/cursor.desktop"),d.constants.R_OK),a=!0}catch{}}if(!a)return{found:!1,error:"Cursor config files found but Cursor IDE does not appear to be installed. Skipping auto-import."}}let i=null;try{let a=await l(g);if(a.accessToken&&a.machineId)return{found:!0,...a,dbPath:g}}catch(a){i=a}let j=!1;try{let a=await m(g);if(j=a.opened,a.accessToken&&a.machineId)return{found:!0,accessToken:a.accessToken,machineId:a.machineId,dbPath:g}}catch{}return i&&!j?{found:!1,error:`Cursor database was found but could not open it: ${i.message}`}:{found:!1,windowsManual:"win32"===b,error:"Please login to Cursor IDE first, then restart Switchboard to import its credentials.",dbPath:g}}},67828:(a,b,c)=>{c.d(b,{I9:()=>l,Yx:()=>m,eU:()=>p,vN:()=>o}),c(40863);var d=c(7803),e=c(15717),f=c(64254),g=c(15186),h=c(41029),i=c(18129),j=c(49263);let k=h.oD,l=(a,b,c)=>(0,h.I9)(a,b,c,d);async function m(a,b={}){if(a?.providerSpecificData?.authMethod!=="imported"||!b.force&&!(0,i.fp)("cursor",a))return a;try{let b=await (0,f.u)();if(!b.found||!b.accessToken||!b.machineId)return a;let c={...a.providerSpecificData||{},machineId:b.machineId,authMethod:"imported"},d=n(86400),e={...a,accessToken:b.accessToken,expiresIn:86400,expiresAt:d,providerSpecificData:c},g=b.accessToken!==a.accessToken||b.machineId!==a.providerSpecificData?.machineId||(0,i.fp)("cursor",a),h=a.connectionId||a.id;return g&&h&&await o(h,{accessToken:b.accessToken,expiresIn:86400,providerSpecificData:{machineId:b.machineId,authMethod:"imported"},existingProviderSpecificData:a.providerSpecificData||{}}),e}catch(b){return d.warn("TOKEN_REFRESH","Could not reload imported Cursor credentials",{connectionId:a.connectionId||a.id||null,error:b?.message||String(b)}),a}}function n(a){return new Date(Date.now()+1e3*a).toISOString()}async function o(a,b){try{let c,f={},g=(0,i.Jj)(a,b);b.accessToken&&(f.accessToken=b.accessToken),b.refreshToken&&(f.refreshToken=b.refreshToken),b.idToken&&(f.idToken=b.idToken),b.lastRefreshAt&&(f.lastRefreshAt=b.lastRefreshAt),b.expiresAt&&(f.expiresAt=b.expiresAt);let h=g?.expiresAt??(b.expiresAt?new Date(b.expiresAt).getTime():null);for(let a of(Number.isFinite(h)?(f.expiresAt=new Date(h).toISOString(),f.expiresIn=Math.max(0,Math.ceil((h-Date.now())/1e3))):b.expiresIn&&(f.expiresAt=n(b.expiresIn),f.expiresIn=b.expiresIn),b.providerSpecificData&&(f.providerSpecificData={...b.existingProviderSpecificData||{},...b.providerSpecificData}),(b.copilotToken||b.copilotTokenExpiresAt)&&(f.providerSpecificData={...f.providerSpecificData||b.existingProviderSpecificData||{},...b.copilotToken?{copilotToken:b.copilotToken}:{},...b.copilotTokenExpiresAt?{copilotTokenExpiresAt:b.copilotTokenExpiresAt}:{}}),b.projectId&&(f.projectId=b.projectId),["testStatus","lastError","lastErrorAt"]))a in b&&(f[a]=b[a]);if(b.reauthRequired&&(f.testStatus=j.RU),g){let d={...f},h={};for(let a of["testStatus","lastError","lastErrorAt"])a in d&&(h[a]=d[a],delete d[a]);(b.providerSpecificData||b.copilotToken||b.copilotTokenExpiresAt)&&(d.providerSpecificData={...g.providerSpecificUpdates,...b.copilotToken?{copilotToken:b.copilotToken}:{},...b.copilotTokenExpiresAt?{copilotTokenExpiresAt:b.copilotTokenExpiresAt}:{}}),(c=await (0,e.rS)(a,g.source,d))&&Object.keys(h).length>0&&await (0,e.$v)(a,g.source,h)}else c=await (0,e.updateProviderConnection)(a,f);return d.info("TOKEN_REFRESH","Credentials updated in localDb",{connectionId:a,success:!!c}),!!c}catch(b){return d.error("TOKEN_REFRESH","Error updating credentials in localDb",{connectionId:a,error:b.message}),!1}}async function p(a,b,c={}){let f={...b};!f.connectionId&&f.id&&(f.connectionId=f.id);let j=c?.force===!0;if("cursor"===a&&(f=await m(f)),j||(0,i.fp)(a,f)){let b=f.expiresAt?new Date(f.expiresAt).getTime():null,c=b?b-Date.now():null,j=(0,h.Og)(a);d.info("TOKEN_REFRESH","Refreshing provider credentials proactively",{provider:a,expiresIn:null===c?null:Math.round(c/1e3),refreshLeadMs:j,lastRefreshAt:f.lastRefreshAt||null});let k=null;try{k=await (0,i.Vq)(a,f,d)}catch(b){d.warn("TOKEN_REFRESH","Provider credential refresh failed; using existing credentials",{provider:a,error:b?.message||String(b)})}if(k?.accessToken||k?.apiKey||k?.copilotToken){let b={...k,existingProviderSpecificData:f.providerSpecificData};if(!await o(f.connectionId,b)){let a=await (0,e.Mc)(f.connectionId);if(a?.accessToken)return{...f,...a,connectionId:f.connectionId}}let c=(0,i.Jj)(f.connectionId,k),h=Number.isFinite(c?.expiresAt)?new Date(c.expiresAt).toISOString():function(a){if(!a)return null;let b=new Date(a);return Number.isFinite(b.getTime())?b.toISOString():null}(k.expiresAt);!function(a,b,c){("antigravity"===a||"gemini-cli"===a)&&b&&c&&((0,g.Ou)(b),(0,g.eG)(b,c,a).then(a=>{a&&o(b,{projectId:a}).catch(a=>{d.debug("TOKEN_REFRESH","Failed to persist refreshed projectId",{connectionId:b,error:a?.message??a})})}).catch(a=>{d.debug("TOKEN_REFRESH","Failed to fetch projectId after token refresh",{connectionId:b,error:a?.message??a})}))}(a,(f={...f,...k,expiresAt:h||(k.expiresIn?n(k.expiresIn):f.expiresAt),providerSpecificData:k.providerSpecificData?{...f.providerSpecificData,...k.providerSpecificData}:f.providerSpecificData}).connectionId,f.accessToken)}}if("github"===a){let b=f.providerSpecificData?.copilotToken,c=(f.providerSpecificData?.copilotTokenExpiresAt?1e3*f.providerSpecificData.copilotTokenExpiresAt:0)-Date.now();if(!b||c<k){let e;d.info("TOKEN_REFRESH","Copilot token expiring soon or missing, refreshing proactively",{provider:a,expiresIn:b?Math.round(c/1e3):"missing"});let g=await (e=f.accessToken,(0,h.jR)(e,d));if(g){let a={...f.providerSpecificData,copilotToken:g.token,copilotTokenExpiresAt:g.expiresAt};await o(f.connectionId,{providerSpecificData:a}),f.providerSpecificData=a,f.copilotToken=g.token}}}return f}}};