@amir83nasr/10router 0.1.11 → 0.1.12

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 (684) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +6 -5
  3. package/.next/build-manifest.json +2 -2
  4. package/.next/prerender-manifest.json +23 -23
  5. package/.next/routes-manifest.json +6 -0
  6. package/.next/server/app/(dashboard)/dashboard/basic-chat/page.js +1 -1
  7. package/.next/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js +2 -2
  9. package/.next/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  10. package/.next/server/app/(dashboard)/dashboard/cli-tools/page.js +1 -1
  11. package/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  12. package/.next/server/app/(dashboard)/dashboard/combos/page.js +1 -1
  13. package/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  14. package/.next/server/app/(dashboard)/dashboard/console-log/page.js +1 -1
  15. package/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  16. package/.next/server/app/(dashboard)/dashboard/endpoint/page.js +1 -1
  17. package/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  18. package/.next/server/app/(dashboard)/dashboard/media-providers/systemone/[id]/page.js +2 -2
  19. package/.next/server/app/(dashboard)/dashboard/media-providers/systemone/[id]/page_client-reference-manifest.js +1 -1
  20. package/.next/server/app/(dashboard)/dashboard/media-providers/systemone/page.js +1 -1
  21. package/.next/server/app/(dashboard)/dashboard/media-providers/systemone/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/(dashboard)/dashboard/page.js +1 -1
  23. package/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  24. package/.next/server/app/(dashboard)/dashboard/profile/page.js +1 -1
  25. package/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  26. package/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js +2 -2
  27. package/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  28. package/.next/server/app/(dashboard)/dashboard/providers/new/page.js +1 -1
  29. package/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  30. package/.next/server/app/(dashboard)/dashboard/providers/page.js +1 -1
  31. package/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  32. package/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js +2 -2
  33. package/.next/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  34. package/.next/server/app/(dashboard)/dashboard/pxpipe/page.js +1 -1
  35. package/.next/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -1
  36. package/.next/server/app/(dashboard)/dashboard/quota/page.js +1 -1
  37. package/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  38. package/.next/server/app/(dashboard)/dashboard/token-saver/page.js +1 -1
  39. package/.next/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  40. package/.next/server/app/(dashboard)/dashboard/usage/page.js +1 -1
  41. package/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  42. package/.next/server/app/_global-error/page.js +2 -2
  43. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  44. package/.next/server/app/_global-error.html +1 -1
  45. package/.next/server/app/_global-error.rsc +1 -1
  46. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  47. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  48. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  49. package/.next/server/app/_not-found/page.js +1 -1
  50. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  51. package/.next/server/app/_not-found.html +1 -1
  52. package/.next/server/app/_not-found.rsc +6 -6
  53. package/.next/server/app/_not-found.segments/_full.segment.rsc +6 -6
  54. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +6 -6
  55. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  56. package/.next/server/app/api/auth/login/route.js +1 -1
  57. package/.next/server/app/api/auth/logout/route.js +1 -1
  58. package/.next/server/app/api/auth/oidc/callback/route.js +1 -1
  59. package/.next/server/app/api/auth/oidc/start/route.js +1 -1
  60. package/.next/server/app/api/auth/oidc/test/route.js +1 -1
  61. package/.next/server/app/api/auth/reset-password/route.js +1 -1
  62. package/.next/server/app/api/auth/saml/acs/route.js +1 -1
  63. package/.next/server/app/api/auth/saml/metadata/route.js +1 -1
  64. package/.next/server/app/api/auth/saml/start/route.js +2 -2
  65. package/.next/server/app/api/auth/saml/test/route.js +1 -1
  66. package/.next/server/app/api/auth/status/route.js +1 -1
  67. package/.next/server/app/api/changelog/route.js +1 -1
  68. package/.next/server/app/api/cli-tools/all-statuses/route.js +1 -1
  69. package/.next/server/app/api/cli-tools/claude-settings/route.js +1 -1
  70. package/.next/server/app/api/cli-tools/codex-settings/route.js +1 -1
  71. package/.next/server/app/api/cli-tools/cowork-mcp-registry/route.js +1 -1
  72. package/.next/server/app/api/cli-tools/cowork-mcp-tools/route.js +2 -2
  73. package/.next/server/app/api/cli-tools/cowork-settings/route.js +1 -1
  74. package/.next/server/app/api/cli-tools/dsh-settings/route.js +1 -1
  75. package/.next/server/app/api/cli-tools/opencode-settings/route.js +1 -1
  76. package/.next/server/app/api/combos/[id]/route.js +1 -1
  77. package/.next/server/app/api/combos/route.js +1 -1
  78. package/.next/server/app/api/dashboard/chat/completions/route.js +1 -0
  79. package/.next/server/app/api/dashboard/chat/completions/route.js.nft.json +1 -0
  80. package/.next/server/app/api/dashboard/chat/completions/route_client-reference-manifest.js +1 -0
  81. package/.next/server/app/api/headroom/extras/route.js +1 -1
  82. package/.next/server/app/api/headroom/proxy/[...path]/route.js +1 -1
  83. package/.next/server/app/api/headroom/restart/route.js +1 -1
  84. package/.next/server/app/api/headroom/start/route.js +1 -1
  85. package/.next/server/app/api/headroom/status/route.js +1 -1
  86. package/.next/server/app/api/headroom/stop/route.js +1 -1
  87. package/.next/server/app/api/health/route.js +1 -1
  88. package/.next/server/app/api/init/route.js +1 -1
  89. package/.next/server/app/api/keys/[id]/route.js +1 -1
  90. package/.next/server/app/api/keys/route.js +1 -1
  91. package/.next/server/app/api/locale/route.js +1 -1
  92. package/.next/server/app/api/mcp/[plugin]/message/route.js +1 -1
  93. package/.next/server/app/api/mcp/[plugin]/sse/route.js +2 -2
  94. package/.next/server/app/api/media-providers/tts/deepgram/voices/route.js +1 -1
  95. package/.next/server/app/api/media-providers/tts/elevenlabs/voices/route.js +1 -1
  96. package/.next/server/app/api/media-providers/tts/inworld/voices/route.js +1 -1
  97. package/.next/server/app/api/media-providers/tts/minimax/voices/route.js +1 -1
  98. package/.next/server/app/api/media-providers/tts/voices/route.js +1 -1
  99. package/.next/server/app/api/models/alias/route.js +1 -1
  100. package/.next/server/app/api/models/availability/route.js +1 -1
  101. package/.next/server/app/api/models/catalog-sync/route.js +1 -1
  102. package/.next/server/app/api/models/custom/route.js +1 -1
  103. package/.next/server/app/api/models/disabled/route.js +1 -1
  104. package/.next/server/app/api/models/route.js +1 -1
  105. package/.next/server/app/api/models/test/route.js +1 -1
  106. package/.next/server/app/api/oauth/[provider]/[action]/route.js +1 -1
  107. package/.next/server/app/api/oauth/codex/bulk-import/route.js +1 -1
  108. package/.next/server/app/api/oauth/codex/import-token/route.js +1 -1
  109. package/.next/server/app/api/oauth/cursor/auto-import/route.js +2 -2
  110. package/.next/server/app/api/oauth/cursor/import/route.js +1 -1
  111. package/.next/server/app/api/oauth/gitlab/pat/route.js +1 -1
  112. package/.next/server/app/api/oauth/grok-cli/bulk-import/route.js +1 -1
  113. package/.next/server/app/api/oauth/iflow/cookie/route.js +1 -1
  114. package/.next/server/app/api/oauth/xiaomi-mimo/api-key/route.js +1 -1
  115. package/.next/server/app/api/oauth/xiaomi-mimo/auto-import/route.js +2 -2
  116. package/.next/server/app/api/pricing/route.js +1 -1
  117. package/.next/server/app/api/provider-nodes/[id]/route.js +1 -1
  118. package/.next/server/app/api/provider-nodes/route.js +1 -1
  119. package/.next/server/app/api/provider-nodes/validate/route.js +1 -1
  120. package/.next/server/app/api/providers/[id]/models/route.js +1 -1
  121. package/.next/server/app/api/providers/[id]/route.js +1 -1
  122. package/.next/server/app/api/providers/[id]/test/route.js +1 -1
  123. package/.next/server/app/api/providers/[id]/test-models/route.js +1 -1
  124. package/.next/server/app/api/providers/client/route.js +1 -1
  125. package/.next/server/app/api/providers/kilo/free-models/route.js +1 -1
  126. package/.next/server/app/api/providers/route.js +1 -1
  127. package/.next/server/app/api/providers/suggested-models/route.js +1 -1
  128. package/.next/server/app/api/providers/test-batch/route.js +1 -1
  129. package/.next/server/app/api/providers/validate/route.js +1 -1
  130. package/.next/server/app/api/proxy-pools/[id]/route.js +1 -1
  131. package/.next/server/app/api/proxy-pools/[id]/test/route.js +1 -1
  132. package/.next/server/app/api/proxy-pools/cloudflare-deploy/route.js +1 -1
  133. package/.next/server/app/api/proxy-pools/deno-deploy/route.js +2 -2
  134. package/.next/server/app/api/proxy-pools/route.js +1 -1
  135. package/.next/server/app/api/proxy-pools/vercel-deploy/route.js +2 -2
  136. package/.next/server/app/api/pxpipe/health/route.js +1 -1
  137. package/.next/server/app/api/pxpipe/install/route.js +1 -1
  138. package/.next/server/app/api/pxpipe/logs/route.js +1 -1
  139. package/.next/server/app/api/pxpipe/restart/route.js +1 -1
  140. package/.next/server/app/api/pxpipe/start/route.js +1 -1
  141. package/.next/server/app/api/pxpipe/stats/route.js +1 -1
  142. package/.next/server/app/api/pxpipe/status/route.js +1 -1
  143. package/.next/server/app/api/pxpipe/stop/route.js +1 -1
  144. package/.next/server/app/api/settings/database/route.js +1 -1
  145. package/.next/server/app/api/settings/proxy-test/route.js +1 -1
  146. package/.next/server/app/api/settings/require-login/route.js +1 -1
  147. package/.next/server/app/api/settings/route.js +1 -1
  148. package/.next/server/app/api/shutdown/route.js +1 -1
  149. package/.next/server/app/api/tags/route.js +1 -1
  150. package/.next/server/app/api/translator/console-logs/route.js +1 -1
  151. package/.next/server/app/api/translator/console-logs/stream/route.js +2 -2
  152. package/.next/server/app/api/translator/load/route.js +1 -1
  153. package/.next/server/app/api/translator/save/route.js +1 -1
  154. package/.next/server/app/api/translator/send/route.js +1 -1
  155. package/.next/server/app/api/translator/translate/route.js +1 -1
  156. package/.next/server/app/api/tunnel/disable/route.js +1 -1
  157. package/.next/server/app/api/tunnel/enable/route.js +1 -1
  158. package/.next/server/app/api/tunnel/status/route.js +1 -1
  159. package/.next/server/app/api/tunnel/tailscale-check/route.js +1 -1
  160. package/.next/server/app/api/tunnel/tailscale-disable/route.js +1 -1
  161. package/.next/server/app/api/tunnel/tailscale-enable/route.js +1 -1
  162. package/.next/server/app/api/tunnel/tailscale-install/route.js +3 -3
  163. package/.next/server/app/api/usage/[connectionId]/codex-reset-credits/route.js +1 -1
  164. package/.next/server/app/api/usage/[connectionId]/route.js +1 -1
  165. package/.next/server/app/api/usage/chart/route.js +1 -1
  166. package/.next/server/app/api/usage/health/route.js +1 -1
  167. package/.next/server/app/api/usage/history/route.js +1 -1
  168. package/.next/server/app/api/usage/logs/route.js +1 -1
  169. package/.next/server/app/api/usage/providers/route.js +1 -1
  170. package/.next/server/app/api/usage/request-details/route.js +1 -1
  171. package/.next/server/app/api/usage/request-logs/route.js +1 -1
  172. package/.next/server/app/api/usage/stats/route.js +1 -1
  173. package/.next/server/app/api/usage/stream/route.js +2 -2
  174. package/.next/server/app/api/v1/api/chat/route.js +1 -1
  175. package/.next/server/app/api/v1/audio/speech/route.js +1 -1
  176. package/.next/server/app/api/v1/audio/transcriptions/route.js +1 -1
  177. package/.next/server/app/api/v1/audio/voices/route.js +1 -1
  178. package/.next/server/app/api/v1/chat/completions/route.js +1 -1
  179. package/.next/server/app/api/v1/embeddings/route.js +1 -1
  180. package/.next/server/app/api/v1/images/generations/route.js +2 -2
  181. package/.next/server/app/api/v1/messages/count_tokens/route.js +1 -1
  182. package/.next/server/app/api/v1/messages/route.js +1 -1
  183. package/.next/server/app/api/v1/models/[...model]/route.js +1 -1
  184. package/.next/server/app/api/v1/models/info/route.js +1 -1
  185. package/.next/server/app/api/v1/models/route.js +1 -1
  186. package/.next/server/app/api/v1/responses/compact/route.js +1 -1
  187. package/.next/server/app/api/v1/responses/route.js +1 -1
  188. package/.next/server/app/api/v1/route.js +1 -1
  189. package/.next/server/app/api/v1/search/route.js +1 -1
  190. package/.next/server/app/api/v1/systemone/route.js +1 -1
  191. package/.next/server/app/api/v1/videos/[id]/route.js +1 -1
  192. package/.next/server/app/api/v1/videos/edits/route.js +1 -1
  193. package/.next/server/app/api/v1/videos/extensions/route.js +1 -1
  194. package/.next/server/app/api/v1/videos/generations/route.js +1 -1
  195. package/.next/server/app/api/v1/web/fetch/route.js +1 -1
  196. package/.next/server/app/api/v1beta/models/[...path]/route.js +1 -1
  197. package/.next/server/app/api/v1beta/models/route.js +1 -1
  198. package/.next/server/app/api/version/route.js +1 -1
  199. package/.next/server/app/api/version/shutdown/route.js +1 -1
  200. package/.next/server/app/api/version/update/route.js +1 -1
  201. package/.next/server/app/callback/page.js +1 -1
  202. package/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  203. package/.next/server/app/callback.html +1 -1
  204. package/.next/server/app/callback.rsc +7 -7
  205. package/.next/server/app/callback.segments/_full.segment.rsc +7 -7
  206. package/.next/server/app/callback.segments/_tree.segment.rsc +2 -2
  207. package/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +7 -7
  208. package/.next/server/app/dashboard/basic-chat.html +1 -1
  209. package/.next/server/app/dashboard/basic-chat.rsc +8 -8
  210. package/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +8 -8
  211. package/.next/server/app/dashboard/basic-chat.segments/_full.segment.rsc +8 -8
  212. package/.next/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
  213. package/.next/server/app/dashboard/cli-tools.html +1 -1
  214. package/.next/server/app/dashboard/cli-tools.rsc +9 -9
  215. package/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +8 -8
  216. package/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +9 -9
  217. package/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
  218. package/.next/server/app/dashboard/combos.html +1 -1
  219. package/.next/server/app/dashboard/combos.rsc +8 -8
  220. package/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +8 -8
  221. package/.next/server/app/dashboard/combos.segments/_full.segment.rsc +8 -8
  222. package/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
  223. package/.next/server/app/dashboard/endpoint.html +1 -1
  224. package/.next/server/app/dashboard/endpoint.rsc +9 -9
  225. package/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +8 -8
  226. package/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +9 -9
  227. package/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
  228. package/.next/server/app/dashboard/media-providers/systemone.html +1 -1
  229. package/.next/server/app/dashboard/media-providers/systemone.rsc +8 -8
  230. package/.next/server/app/dashboard/media-providers/systemone.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/systemone/__PAGE__.segment.rsc +8 -8
  231. package/.next/server/app/dashboard/media-providers/systemone.segments/_full.segment.rsc +8 -8
  232. package/.next/server/app/dashboard/media-providers/systemone.segments/_tree.segment.rsc +2 -2
  233. package/.next/server/app/dashboard/profile.html +1 -1
  234. package/.next/server/app/dashboard/profile.rsc +8 -8
  235. package/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +8 -8
  236. package/.next/server/app/dashboard/profile.segments/_full.segment.rsc +8 -8
  237. package/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
  238. package/.next/server/app/dashboard/providers/new.html +1 -1
  239. package/.next/server/app/dashboard/providers/new.rsc +8 -8
  240. package/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +8 -8
  241. package/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +8 -8
  242. package/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
  243. package/.next/server/app/dashboard/providers.html +1 -1
  244. package/.next/server/app/dashboard/providers.rsc +8 -8
  245. package/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +8 -8
  246. package/.next/server/app/dashboard/providers.segments/_full.segment.rsc +8 -8
  247. package/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
  248. package/.next/server/app/dashboard/proxy-pools.html +1 -1
  249. package/.next/server/app/dashboard/proxy-pools.rsc +8 -8
  250. package/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +8 -8
  251. package/.next/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +8 -8
  252. package/.next/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
  253. package/.next/server/app/dashboard/pxpipe.html +1 -1
  254. package/.next/server/app/dashboard/pxpipe.rsc +7 -7
  255. package/.next/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +7 -7
  256. package/.next/server/app/dashboard/pxpipe.segments/_full.segment.rsc +7 -7
  257. package/.next/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +2 -2
  258. package/.next/server/app/dashboard/quota.html +2 -2
  259. package/.next/server/app/dashboard/quota.rsc +9 -9
  260. package/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +9 -9
  261. package/.next/server/app/dashboard/quota.segments/_full.segment.rsc +9 -9
  262. package/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
  263. package/.next/server/app/dashboard/settings/pricing/page.js +1 -1
  264. package/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  265. package/.next/server/app/dashboard/settings/pricing.html +1 -1
  266. package/.next/server/app/dashboard/settings/pricing.rsc +6 -6
  267. package/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +6 -6
  268. package/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
  269. package/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +6 -6
  270. package/.next/server/app/dashboard/token-saver.html +1 -1
  271. package/.next/server/app/dashboard/token-saver.rsc +7 -7
  272. package/.next/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +7 -7
  273. package/.next/server/app/dashboard/token-saver.segments/_full.segment.rsc +7 -7
  274. package/.next/server/app/dashboard/token-saver.segments/_tree.segment.rsc +2 -2
  275. package/.next/server/app/dashboard/usage.html +2 -2
  276. package/.next/server/app/dashboard/usage.rsc +8 -8
  277. package/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +8 -8
  278. package/.next/server/app/dashboard/usage.segments/_full.segment.rsc +8 -8
  279. package/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
  280. package/.next/server/app/dashboard.html +1 -1
  281. package/.next/server/app/dashboard.rsc +9 -9
  282. package/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +8 -8
  283. package/.next/server/app/dashboard.segments/_full.segment.rsc +9 -9
  284. package/.next/server/app/dashboard.segments/_tree.segment.rsc +2 -2
  285. package/.next/server/app/index.html +1 -1
  286. package/.next/server/app/index.rsc +6 -6
  287. package/.next/server/app/index.segments/__PAGE__.segment.rsc +6 -6
  288. package/.next/server/app/index.segments/_full.segment.rsc +6 -6
  289. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  290. package/.next/server/app/landing/page.js +1 -1
  291. package/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  292. package/.next/server/app/landing.html +1 -1
  293. package/.next/server/app/landing.rsc +7 -7
  294. package/.next/server/app/landing.segments/_full.segment.rsc +7 -7
  295. package/.next/server/app/landing.segments/_tree.segment.rsc +2 -2
  296. package/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +7 -7
  297. package/.next/server/app/login/page.js +1 -1
  298. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  299. package/.next/server/app/login.html +1 -1
  300. package/.next/server/app/login.rsc +6 -6
  301. package/.next/server/app/login.segments/_full.segment.rsc +6 -6
  302. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  303. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +6 -6
  304. package/.next/server/app/manifest.webmanifest/route.js +2 -2
  305. package/.next/server/app/page.js +1 -1
  306. package/.next/server/app/page_client-reference-manifest.js +1 -1
  307. package/.next/server/app-paths-manifest.json +6 -5
  308. package/.next/server/chunks/1011.js +1 -1
  309. package/.next/server/chunks/1194.js +1 -1
  310. package/.next/server/chunks/1289.js +1 -1
  311. package/.next/server/chunks/1633.js +1 -1
  312. package/.next/server/chunks/1985.js +1 -1
  313. package/.next/server/chunks/2282.js +6 -6
  314. package/.next/server/chunks/2339.js +1 -1
  315. package/.next/server/chunks/2706.js +1 -1
  316. package/.next/server/chunks/2801.js +1 -1
  317. package/.next/server/chunks/3034.js +1 -1
  318. package/.next/server/chunks/3425.js +1 -1
  319. package/.next/server/chunks/4129.js +1 -1
  320. package/.next/server/chunks/6056.js +1 -1
  321. package/.next/server/chunks/7348.js +1 -1
  322. package/.next/server/chunks/7816.js +1 -1
  323. package/.next/server/chunks/9429.js +1 -1
  324. package/.next/server/middleware-build-manifest.js +1 -1
  325. package/.next/server/middleware.js +3 -3
  326. package/.next/server/pages/404.html +1 -1
  327. package/.next/server/pages/500.html +1 -1
  328. package/.next/server/server-reference-manifest.js +1 -1
  329. package/.next/server/server-reference-manifest.json +1 -1
  330. package/.next/static/C423Aljus-j0GJlKCHgC1/_buildManifest.js +1 -0
  331. package/.next/static/chunks/1278-3b5ed69340ddb23f.js +1 -0
  332. package/.next/static/chunks/{1471-10f225f62f7469cc.js → 1471-69a7c30abf98c656.js} +1 -1
  333. package/.next/static/chunks/159-89c77cec422bd76f.js +1 -0
  334. package/.next/static/chunks/2392-b07fcae4714087ef.js +65 -0
  335. package/.next/static/chunks/2441-96064c4ee1216099.js +1 -0
  336. package/.next/static/chunks/{2836-d97f0aa2718945d5.js → 2836-4781ea7374870f4a.js} +1 -1
  337. package/.next/static/chunks/{3577-cd98d40e3099e1b0.js → 3577-1f02993330d7fba7.js} +1 -1
  338. package/.next/static/chunks/{5862-f98c2f3d480b80d2.js → 5862-6f3a3a6d4c00100d.js} +1 -1
  339. package/.next/static/chunks/9320-ae7eb68edeb92e89.js +3 -0
  340. package/.next/static/chunks/{9369-0d43b295968c2168.js → 9369-07e432041bb48a39.js} +1 -1
  341. package/.next/static/chunks/{9ce8c186-3c7d7dbc5d428052.js → 9ce8c186-6cd204e9c27ecee1.js} +1 -1
  342. package/.next/static/chunks/app/(dashboard)/dashboard/basic-chat/page-34f4d77aa3df67a8.js +1 -0
  343. package/.next/static/chunks/app/(dashboard)/dashboard/cli-tools/[toolId]/{page-e8bceccb95695755.js → page-36ad70a4f906c64b.js} +2 -2
  344. package/.next/static/chunks/app/(dashboard)/dashboard/cli-tools/{page-adee408d9de02423.js → page-aae6be7f75fcd819.js} +1 -1
  345. package/.next/static/chunks/app/(dashboard)/dashboard/combos/{page-d4c1e29e8d038f09.js → page-18212c87b17b33cf.js} +1 -1
  346. package/.next/static/chunks/app/(dashboard)/dashboard/console-log/{page-3cc58622294c8c8a.js → page-52b5a6dc2c2d2d93.js} +1 -1
  347. package/.next/static/chunks/app/(dashboard)/dashboard/endpoint/page-9287a3cbd098b9c4.js +1 -0
  348. package/.next/static/chunks/app/(dashboard)/dashboard/media-providers/systemone/[id]/{page-b751d9603cb82e62.js → page-610d962dd8bd1744.js} +1 -1
  349. package/.next/static/chunks/app/(dashboard)/dashboard/media-providers/systemone/{page-49b3b4867d06cbe0.js → page-9dbf4cd6901b6042.js} +1 -1
  350. package/.next/static/chunks/app/(dashboard)/dashboard/page-1d6e969653676c7d.js +1 -0
  351. package/.next/static/chunks/app/(dashboard)/dashboard/profile/{page-65b2c7989dbe2663.js → page-2ab30b6e1baf1efd.js} +1 -1
  352. package/.next/static/chunks/app/(dashboard)/dashboard/providers/[id]/{page-d5d480e209fdc55a.js → page-b17607bc2ed06d50.js} +1 -1
  353. package/.next/static/chunks/app/(dashboard)/dashboard/providers/new/{page-9b68243ab9555702.js → page-0e649a78a041306a.js} +1 -1
  354. package/.next/static/chunks/app/(dashboard)/dashboard/providers/{page-2396571281d02804.js → page-b10c05192c664e8d.js} +1 -1
  355. package/.next/static/chunks/app/(dashboard)/dashboard/proxy-pools/{page-cfd6bcb7e55d7d18.js → page-b33051a3fc600082.js} +2 -2
  356. package/.next/static/chunks/app/(dashboard)/dashboard/quota/{page-fef6edb7aafd8bd0.js → page-ee2a0fa91d9bea9c.js} +1 -1
  357. package/.next/static/chunks/app/(dashboard)/dashboard/usage/{page-697f46461825d7fc.js → page-2457f236bc58e590.js} +1 -1
  358. package/.next/static/chunks/app/(dashboard)/{layout-5039502fc12707c9.js → layout-7ef1d599b3c4c6d2.js} +1 -1
  359. package/.next/static/chunks/app/_global-error/page-a826a2eb5dc30149.js +1 -0
  360. package/.next/static/chunks/app/api/auth/login/route-a826a2eb5dc30149.js +1 -0
  361. package/.next/static/chunks/app/api/auth/logout/route-a826a2eb5dc30149.js +1 -0
  362. package/.next/static/chunks/app/api/auth/oidc/callback/route-a826a2eb5dc30149.js +1 -0
  363. package/.next/static/chunks/app/api/auth/oidc/start/route-a826a2eb5dc30149.js +1 -0
  364. package/.next/static/chunks/app/api/auth/oidc/test/route-a826a2eb5dc30149.js +1 -0
  365. package/.next/static/chunks/app/api/auth/reset-password/route-a826a2eb5dc30149.js +1 -0
  366. package/.next/static/chunks/app/api/auth/saml/acs/route-a826a2eb5dc30149.js +1 -0
  367. package/.next/static/chunks/app/api/auth/saml/metadata/route-a826a2eb5dc30149.js +1 -0
  368. package/.next/static/chunks/app/api/auth/saml/start/route-a826a2eb5dc30149.js +1 -0
  369. package/.next/static/chunks/app/api/auth/saml/test/route-a826a2eb5dc30149.js +1 -0
  370. package/.next/static/chunks/app/api/auth/status/route-a826a2eb5dc30149.js +1 -0
  371. package/.next/static/chunks/app/api/changelog/route-a826a2eb5dc30149.js +1 -0
  372. package/.next/static/chunks/app/api/cli-tools/all-statuses/route-a826a2eb5dc30149.js +1 -0
  373. package/.next/static/chunks/app/api/cli-tools/claude-settings/route-a826a2eb5dc30149.js +1 -0
  374. package/.next/static/chunks/app/api/cli-tools/codex-settings/route-a826a2eb5dc30149.js +1 -0
  375. package/.next/static/chunks/app/api/cli-tools/cowork-mcp-registry/route-a826a2eb5dc30149.js +1 -0
  376. package/.next/static/chunks/app/api/cli-tools/cowork-mcp-tools/route-a826a2eb5dc30149.js +1 -0
  377. package/.next/static/chunks/app/api/cli-tools/cowork-settings/route-a826a2eb5dc30149.js +1 -0
  378. package/.next/static/chunks/app/api/cli-tools/dsh-settings/route-a826a2eb5dc30149.js +1 -0
  379. package/.next/static/chunks/app/api/cli-tools/opencode-settings/route-a826a2eb5dc30149.js +1 -0
  380. package/.next/static/chunks/app/api/combos/[id]/route-a826a2eb5dc30149.js +1 -0
  381. package/.next/static/chunks/app/api/combos/route-a826a2eb5dc30149.js +1 -0
  382. package/.next/static/chunks/app/api/dashboard/chat/completions/route-a826a2eb5dc30149.js +1 -0
  383. package/.next/static/chunks/app/api/headroom/extras/route-a826a2eb5dc30149.js +1 -0
  384. package/.next/static/chunks/app/api/headroom/proxy/[...path]/route-a826a2eb5dc30149.js +1 -0
  385. package/.next/static/chunks/app/api/headroom/restart/route-a826a2eb5dc30149.js +1 -0
  386. package/.next/static/chunks/app/api/headroom/start/route-a826a2eb5dc30149.js +1 -0
  387. package/.next/static/chunks/app/api/headroom/status/route-a826a2eb5dc30149.js +1 -0
  388. package/.next/static/chunks/app/api/headroom/stop/route-a826a2eb5dc30149.js +1 -0
  389. package/.next/static/chunks/app/api/health/route-a826a2eb5dc30149.js +1 -0
  390. package/.next/static/chunks/app/api/init/route-a826a2eb5dc30149.js +1 -0
  391. package/.next/static/chunks/app/api/keys/[id]/route-a826a2eb5dc30149.js +1 -0
  392. package/.next/static/chunks/app/api/keys/route-a826a2eb5dc30149.js +1 -0
  393. package/.next/static/chunks/app/api/locale/route-a826a2eb5dc30149.js +1 -0
  394. package/.next/static/chunks/app/api/mcp/[plugin]/message/route-a826a2eb5dc30149.js +1 -0
  395. package/.next/static/chunks/app/api/mcp/[plugin]/sse/route-a826a2eb5dc30149.js +1 -0
  396. package/.next/static/chunks/app/api/media-providers/tts/deepgram/voices/route-a826a2eb5dc30149.js +1 -0
  397. package/.next/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-a826a2eb5dc30149.js +1 -0
  398. package/.next/static/chunks/app/api/media-providers/tts/inworld/voices/route-a826a2eb5dc30149.js +1 -0
  399. package/.next/static/chunks/app/api/media-providers/tts/minimax/voices/route-a826a2eb5dc30149.js +1 -0
  400. package/.next/static/chunks/app/api/media-providers/tts/voices/route-a826a2eb5dc30149.js +1 -0
  401. package/.next/static/chunks/app/api/models/alias/route-a826a2eb5dc30149.js +1 -0
  402. package/.next/static/chunks/app/api/models/availability/route-a826a2eb5dc30149.js +1 -0
  403. package/.next/static/chunks/app/api/models/catalog-sync/route-a826a2eb5dc30149.js +1 -0
  404. package/.next/static/chunks/app/api/models/custom/route-a826a2eb5dc30149.js +1 -0
  405. package/.next/static/chunks/app/api/models/disabled/route-a826a2eb5dc30149.js +1 -0
  406. package/.next/static/chunks/app/api/models/route-a826a2eb5dc30149.js +1 -0
  407. package/.next/static/chunks/app/api/models/test/route-a826a2eb5dc30149.js +1 -0
  408. package/.next/static/chunks/app/api/oauth/[provider]/[action]/route-a826a2eb5dc30149.js +1 -0
  409. package/.next/static/chunks/app/api/oauth/codex/bulk-import/route-a826a2eb5dc30149.js +1 -0
  410. package/.next/static/chunks/app/api/oauth/codex/import-token/route-a826a2eb5dc30149.js +1 -0
  411. package/.next/static/chunks/app/api/oauth/cursor/auto-import/route-a826a2eb5dc30149.js +1 -0
  412. package/.next/static/chunks/app/api/oauth/cursor/import/route-a826a2eb5dc30149.js +1 -0
  413. package/.next/static/chunks/app/api/oauth/gitlab/pat/route-a826a2eb5dc30149.js +1 -0
  414. package/.next/static/chunks/app/api/oauth/grok-cli/bulk-import/route-a826a2eb5dc30149.js +1 -0
  415. package/.next/static/chunks/app/api/oauth/iflow/cookie/route-a826a2eb5dc30149.js +1 -0
  416. package/.next/static/chunks/app/api/oauth/xiaomi-mimo/api-key/route-a826a2eb5dc30149.js +1 -0
  417. package/.next/static/chunks/app/api/oauth/xiaomi-mimo/auto-import/route-a826a2eb5dc30149.js +1 -0
  418. package/.next/static/chunks/app/api/pricing/route-a826a2eb5dc30149.js +1 -0
  419. package/.next/static/chunks/app/api/provider-nodes/[id]/route-a826a2eb5dc30149.js +1 -0
  420. package/.next/static/chunks/app/api/provider-nodes/route-a826a2eb5dc30149.js +1 -0
  421. package/.next/static/chunks/app/api/provider-nodes/validate/route-a826a2eb5dc30149.js +1 -0
  422. package/.next/static/chunks/app/api/providers/[id]/models/route-a826a2eb5dc30149.js +1 -0
  423. package/.next/static/chunks/app/api/providers/[id]/route-a826a2eb5dc30149.js +1 -0
  424. package/.next/static/chunks/app/api/providers/[id]/test/route-a826a2eb5dc30149.js +1 -0
  425. package/.next/static/chunks/app/api/providers/[id]/test-models/route-a826a2eb5dc30149.js +1 -0
  426. package/.next/static/chunks/app/api/providers/client/route-a826a2eb5dc30149.js +1 -0
  427. package/.next/static/chunks/app/api/providers/kilo/free-models/route-a826a2eb5dc30149.js +1 -0
  428. package/.next/static/chunks/app/api/providers/route-a826a2eb5dc30149.js +1 -0
  429. package/.next/static/chunks/app/api/providers/suggested-models/route-a826a2eb5dc30149.js +1 -0
  430. package/.next/static/chunks/app/api/providers/test-batch/route-a826a2eb5dc30149.js +1 -0
  431. package/.next/static/chunks/app/api/providers/validate/route-a826a2eb5dc30149.js +1 -0
  432. package/.next/static/chunks/app/api/proxy-pools/[id]/route-a826a2eb5dc30149.js +1 -0
  433. package/.next/static/chunks/app/api/proxy-pools/[id]/test/route-a826a2eb5dc30149.js +1 -0
  434. package/.next/static/chunks/app/api/proxy-pools/cloudflare-deploy/route-a826a2eb5dc30149.js +1 -0
  435. package/.next/static/chunks/app/api/proxy-pools/deno-deploy/route-a826a2eb5dc30149.js +1 -0
  436. package/.next/static/chunks/app/api/proxy-pools/route-a826a2eb5dc30149.js +1 -0
  437. package/.next/static/chunks/app/api/proxy-pools/vercel-deploy/route-a826a2eb5dc30149.js +1 -0
  438. package/.next/static/chunks/app/api/pxpipe/health/route-a826a2eb5dc30149.js +1 -0
  439. package/.next/static/chunks/app/api/pxpipe/install/route-a826a2eb5dc30149.js +1 -0
  440. package/.next/static/chunks/app/api/pxpipe/logs/route-a826a2eb5dc30149.js +1 -0
  441. package/.next/static/chunks/app/api/pxpipe/restart/route-a826a2eb5dc30149.js +1 -0
  442. package/.next/static/chunks/app/api/pxpipe/start/route-a826a2eb5dc30149.js +1 -0
  443. package/.next/static/chunks/app/api/pxpipe/stats/route-a826a2eb5dc30149.js +1 -0
  444. package/.next/static/chunks/app/api/pxpipe/status/route-a826a2eb5dc30149.js +1 -0
  445. package/.next/static/chunks/app/api/pxpipe/stop/route-a826a2eb5dc30149.js +1 -0
  446. package/.next/static/chunks/app/api/settings/database/route-a826a2eb5dc30149.js +1 -0
  447. package/.next/static/chunks/app/api/settings/proxy-test/route-a826a2eb5dc30149.js +1 -0
  448. package/.next/static/chunks/app/api/settings/require-login/route-a826a2eb5dc30149.js +1 -0
  449. package/.next/static/chunks/app/api/settings/route-a826a2eb5dc30149.js +1 -0
  450. package/.next/static/chunks/app/api/shutdown/route-a826a2eb5dc30149.js +1 -0
  451. package/.next/static/chunks/app/api/tags/route-a826a2eb5dc30149.js +1 -0
  452. package/.next/static/chunks/app/api/translator/console-logs/route-a826a2eb5dc30149.js +1 -0
  453. package/.next/static/chunks/app/api/translator/console-logs/stream/route-a826a2eb5dc30149.js +1 -0
  454. package/.next/static/chunks/app/api/translator/load/route-a826a2eb5dc30149.js +1 -0
  455. package/.next/static/chunks/app/api/translator/save/route-a826a2eb5dc30149.js +1 -0
  456. package/.next/static/chunks/app/api/translator/send/route-a826a2eb5dc30149.js +1 -0
  457. package/.next/static/chunks/app/api/translator/translate/route-a826a2eb5dc30149.js +1 -0
  458. package/.next/static/chunks/app/api/tunnel/disable/route-a826a2eb5dc30149.js +1 -0
  459. package/.next/static/chunks/app/api/tunnel/enable/route-a826a2eb5dc30149.js +1 -0
  460. package/.next/static/chunks/app/api/tunnel/status/route-a826a2eb5dc30149.js +1 -0
  461. package/.next/static/chunks/app/api/tunnel/tailscale-check/route-a826a2eb5dc30149.js +1 -0
  462. package/.next/static/chunks/app/api/tunnel/tailscale-disable/route-a826a2eb5dc30149.js +1 -0
  463. package/.next/static/chunks/app/api/tunnel/tailscale-enable/route-a826a2eb5dc30149.js +1 -0
  464. package/.next/static/chunks/app/api/tunnel/tailscale-install/route-a826a2eb5dc30149.js +1 -0
  465. package/.next/static/chunks/app/api/usage/[connectionId]/codex-reset-credits/route-a826a2eb5dc30149.js +1 -0
  466. package/.next/static/chunks/app/api/usage/[connectionId]/route-a826a2eb5dc30149.js +1 -0
  467. package/.next/static/chunks/app/api/usage/chart/route-a826a2eb5dc30149.js +1 -0
  468. package/.next/static/chunks/app/api/usage/health/route-a826a2eb5dc30149.js +1 -0
  469. package/.next/static/chunks/app/api/usage/history/route-a826a2eb5dc30149.js +1 -0
  470. package/.next/static/chunks/app/api/usage/logs/route-a826a2eb5dc30149.js +1 -0
  471. package/.next/static/chunks/app/api/usage/providers/route-a826a2eb5dc30149.js +1 -0
  472. package/.next/static/chunks/app/api/usage/request-details/route-a826a2eb5dc30149.js +1 -0
  473. package/.next/static/chunks/app/api/usage/request-logs/route-a826a2eb5dc30149.js +1 -0
  474. package/.next/static/chunks/app/api/usage/stats/route-a826a2eb5dc30149.js +1 -0
  475. package/.next/static/chunks/app/api/usage/stream/route-a826a2eb5dc30149.js +1 -0
  476. package/.next/static/chunks/app/api/v1/api/chat/route-a826a2eb5dc30149.js +1 -0
  477. package/.next/static/chunks/app/api/v1/audio/speech/route-a826a2eb5dc30149.js +1 -0
  478. package/.next/static/chunks/app/api/v1/audio/transcriptions/route-a826a2eb5dc30149.js +1 -0
  479. package/.next/static/chunks/app/api/v1/audio/voices/route-a826a2eb5dc30149.js +1 -0
  480. package/.next/static/chunks/app/api/v1/chat/completions/route-a826a2eb5dc30149.js +1 -0
  481. package/.next/static/chunks/app/api/v1/embeddings/route-a826a2eb5dc30149.js +1 -0
  482. package/.next/static/chunks/app/api/v1/images/generations/route-a826a2eb5dc30149.js +1 -0
  483. package/.next/static/chunks/app/api/v1/messages/count_tokens/route-a826a2eb5dc30149.js +1 -0
  484. package/.next/static/chunks/app/api/v1/messages/route-a826a2eb5dc30149.js +1 -0
  485. package/.next/static/chunks/app/api/v1/models/[...model]/route-a826a2eb5dc30149.js +1 -0
  486. package/.next/static/chunks/app/api/v1/models/info/route-a826a2eb5dc30149.js +1 -0
  487. package/.next/static/chunks/app/api/v1/models/route-a826a2eb5dc30149.js +1 -0
  488. package/.next/static/chunks/app/api/v1/responses/compact/route-a826a2eb5dc30149.js +1 -0
  489. package/.next/static/chunks/app/api/v1/responses/route-a826a2eb5dc30149.js +1 -0
  490. package/.next/static/chunks/app/api/v1/route-a826a2eb5dc30149.js +1 -0
  491. package/.next/static/chunks/app/api/v1/search/route-a826a2eb5dc30149.js +1 -0
  492. package/.next/static/chunks/app/api/v1/systemone/route-a826a2eb5dc30149.js +1 -0
  493. package/.next/static/chunks/app/api/v1/videos/[id]/route-a826a2eb5dc30149.js +1 -0
  494. package/.next/static/chunks/app/api/v1/videos/edits/route-a826a2eb5dc30149.js +1 -0
  495. package/.next/static/chunks/app/api/v1/videos/extensions/route-a826a2eb5dc30149.js +1 -0
  496. package/.next/static/chunks/app/api/v1/videos/generations/route-a826a2eb5dc30149.js +1 -0
  497. package/.next/static/chunks/app/api/v1/web/fetch/route-a826a2eb5dc30149.js +1 -0
  498. package/.next/static/chunks/app/api/v1beta/models/[...path]/route-a826a2eb5dc30149.js +1 -0
  499. package/.next/static/chunks/app/api/v1beta/models/route-a826a2eb5dc30149.js +1 -0
  500. package/.next/static/chunks/app/api/version/route-a826a2eb5dc30149.js +1 -0
  501. package/.next/static/chunks/app/api/version/shutdown/route-a826a2eb5dc30149.js +1 -0
  502. package/.next/static/chunks/app/api/version/update/route-a826a2eb5dc30149.js +1 -0
  503. package/.next/static/chunks/app/{layout-dc929483cad9f77f.js → layout-f34e075b1872747e.js} +1 -1
  504. package/.next/static/chunks/app/manifest.webmanifest/route-a826a2eb5dc30149.js +1 -0
  505. package/.next/static/chunks/app/page-a826a2eb5dc30149.js +1 -0
  506. package/.next/static/chunks/next/dist/client/components/builtin/app-error-a826a2eb5dc30149.js +1 -0
  507. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-a826a2eb5dc30149.js +1 -0
  508. package/.next/static/chunks/next/dist/client/components/builtin/not-found-a826a2eb5dc30149.js +1 -0
  509. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-a826a2eb5dc30149.js +1 -0
  510. package/.next/static/css/{c66cbd684164cacf.css → a2628e64fa8ac12e.css} +1 -1
  511. package/CHANGELOG.md +8 -0
  512. package/open-sse/providers/registry/opencode-go.js +4 -0
  513. package/open-sse/providers/registry/opencode-zen.js +4 -0
  514. package/open-sse/providers/registry/opencode.js +3 -0
  515. package/open-sse/translator/concerns/thinkingUnified.js +16 -1
  516. package/open-sse/translator/concerns/toolCall.js +2 -1
  517. package/open-sse/translator/formats/openai.js +10 -2
  518. package/open-sse/translator/request/claude-to-openai.js +9 -5
  519. package/open-sse/translator/response/openai-to-claude.js +66 -32
  520. package/open-sse/translator/schema/defaults.js +6 -0
  521. package/open-sse/translator/schema/index.js +1 -1
  522. package/package.json +2 -1
  523. package/src/app/(dashboard)/dashboard/basic-chat/BasicChatPageClient.tsx +45 -7
  524. package/src/app/api/dashboard/chat/completions/route.ts +45 -0
  525. package/src/app/globals.css +54 -13
  526. package/src/components/app-sidebar.tsx +1 -0
  527. package/src/shared/components/Header.tsx +8 -0
  528. package/.next/static/Xxof6vr5MvX0-6oReU23d/_buildManifest.js +0 -1
  529. package/.next/static/chunks/1278-f11c7d84c52342fc.js +0 -1
  530. package/.next/static/chunks/159-ec207a220d7d5c16.js +0 -1
  531. package/.next/static/chunks/1699-13ee6864a8a31a96.js +0 -67
  532. package/.next/static/chunks/app/(dashboard)/dashboard/basic-chat/page-ce1364b2b9589785.js +0 -1
  533. package/.next/static/chunks/app/(dashboard)/dashboard/endpoint/page-67516b120adbc4d7.js +0 -1
  534. package/.next/static/chunks/app/(dashboard)/dashboard/page-315c9f52c472a700.js +0 -1
  535. package/.next/static/chunks/app/_global-error/page-9a2a13ac6b89ba91.js +0 -1
  536. package/.next/static/chunks/app/api/auth/login/route-9a2a13ac6b89ba91.js +0 -1
  537. package/.next/static/chunks/app/api/auth/logout/route-9a2a13ac6b89ba91.js +0 -1
  538. package/.next/static/chunks/app/api/auth/oidc/callback/route-9a2a13ac6b89ba91.js +0 -1
  539. package/.next/static/chunks/app/api/auth/oidc/start/route-9a2a13ac6b89ba91.js +0 -1
  540. package/.next/static/chunks/app/api/auth/oidc/test/route-9a2a13ac6b89ba91.js +0 -1
  541. package/.next/static/chunks/app/api/auth/reset-password/route-9a2a13ac6b89ba91.js +0 -1
  542. package/.next/static/chunks/app/api/auth/saml/acs/route-9a2a13ac6b89ba91.js +0 -1
  543. package/.next/static/chunks/app/api/auth/saml/metadata/route-9a2a13ac6b89ba91.js +0 -1
  544. package/.next/static/chunks/app/api/auth/saml/start/route-9a2a13ac6b89ba91.js +0 -1
  545. package/.next/static/chunks/app/api/auth/saml/test/route-9a2a13ac6b89ba91.js +0 -1
  546. package/.next/static/chunks/app/api/auth/status/route-9a2a13ac6b89ba91.js +0 -1
  547. package/.next/static/chunks/app/api/changelog/route-9a2a13ac6b89ba91.js +0 -1
  548. package/.next/static/chunks/app/api/cli-tools/all-statuses/route-9a2a13ac6b89ba91.js +0 -1
  549. package/.next/static/chunks/app/api/cli-tools/claude-settings/route-9a2a13ac6b89ba91.js +0 -1
  550. package/.next/static/chunks/app/api/cli-tools/codex-settings/route-9a2a13ac6b89ba91.js +0 -1
  551. package/.next/static/chunks/app/api/cli-tools/cowork-mcp-registry/route-9a2a13ac6b89ba91.js +0 -1
  552. package/.next/static/chunks/app/api/cli-tools/cowork-mcp-tools/route-9a2a13ac6b89ba91.js +0 -1
  553. package/.next/static/chunks/app/api/cli-tools/cowork-settings/route-9a2a13ac6b89ba91.js +0 -1
  554. package/.next/static/chunks/app/api/cli-tools/dsh-settings/route-9a2a13ac6b89ba91.js +0 -1
  555. package/.next/static/chunks/app/api/cli-tools/opencode-settings/route-9a2a13ac6b89ba91.js +0 -1
  556. package/.next/static/chunks/app/api/combos/[id]/route-9a2a13ac6b89ba91.js +0 -1
  557. package/.next/static/chunks/app/api/combos/route-9a2a13ac6b89ba91.js +0 -1
  558. package/.next/static/chunks/app/api/headroom/extras/route-9a2a13ac6b89ba91.js +0 -1
  559. package/.next/static/chunks/app/api/headroom/proxy/[...path]/route-9a2a13ac6b89ba91.js +0 -1
  560. package/.next/static/chunks/app/api/headroom/restart/route-9a2a13ac6b89ba91.js +0 -1
  561. package/.next/static/chunks/app/api/headroom/start/route-9a2a13ac6b89ba91.js +0 -1
  562. package/.next/static/chunks/app/api/headroom/status/route-9a2a13ac6b89ba91.js +0 -1
  563. package/.next/static/chunks/app/api/headroom/stop/route-9a2a13ac6b89ba91.js +0 -1
  564. package/.next/static/chunks/app/api/health/route-9a2a13ac6b89ba91.js +0 -1
  565. package/.next/static/chunks/app/api/init/route-9a2a13ac6b89ba91.js +0 -1
  566. package/.next/static/chunks/app/api/keys/[id]/route-9a2a13ac6b89ba91.js +0 -1
  567. package/.next/static/chunks/app/api/keys/route-9a2a13ac6b89ba91.js +0 -1
  568. package/.next/static/chunks/app/api/locale/route-9a2a13ac6b89ba91.js +0 -1
  569. package/.next/static/chunks/app/api/mcp/[plugin]/message/route-9a2a13ac6b89ba91.js +0 -1
  570. package/.next/static/chunks/app/api/mcp/[plugin]/sse/route-9a2a13ac6b89ba91.js +0 -1
  571. package/.next/static/chunks/app/api/media-providers/tts/deepgram/voices/route-9a2a13ac6b89ba91.js +0 -1
  572. package/.next/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-9a2a13ac6b89ba91.js +0 -1
  573. package/.next/static/chunks/app/api/media-providers/tts/inworld/voices/route-9a2a13ac6b89ba91.js +0 -1
  574. package/.next/static/chunks/app/api/media-providers/tts/minimax/voices/route-9a2a13ac6b89ba91.js +0 -1
  575. package/.next/static/chunks/app/api/media-providers/tts/voices/route-9a2a13ac6b89ba91.js +0 -1
  576. package/.next/static/chunks/app/api/models/alias/route-9a2a13ac6b89ba91.js +0 -1
  577. package/.next/static/chunks/app/api/models/availability/route-9a2a13ac6b89ba91.js +0 -1
  578. package/.next/static/chunks/app/api/models/catalog-sync/route-9a2a13ac6b89ba91.js +0 -1
  579. package/.next/static/chunks/app/api/models/custom/route-9a2a13ac6b89ba91.js +0 -1
  580. package/.next/static/chunks/app/api/models/disabled/route-9a2a13ac6b89ba91.js +0 -1
  581. package/.next/static/chunks/app/api/models/route-9a2a13ac6b89ba91.js +0 -1
  582. package/.next/static/chunks/app/api/models/test/route-9a2a13ac6b89ba91.js +0 -1
  583. package/.next/static/chunks/app/api/oauth/[provider]/[action]/route-9a2a13ac6b89ba91.js +0 -1
  584. package/.next/static/chunks/app/api/oauth/codex/bulk-import/route-9a2a13ac6b89ba91.js +0 -1
  585. package/.next/static/chunks/app/api/oauth/codex/import-token/route-9a2a13ac6b89ba91.js +0 -1
  586. package/.next/static/chunks/app/api/oauth/cursor/auto-import/route-9a2a13ac6b89ba91.js +0 -1
  587. package/.next/static/chunks/app/api/oauth/cursor/import/route-9a2a13ac6b89ba91.js +0 -1
  588. package/.next/static/chunks/app/api/oauth/gitlab/pat/route-9a2a13ac6b89ba91.js +0 -1
  589. package/.next/static/chunks/app/api/oauth/grok-cli/bulk-import/route-9a2a13ac6b89ba91.js +0 -1
  590. package/.next/static/chunks/app/api/oauth/iflow/cookie/route-9a2a13ac6b89ba91.js +0 -1
  591. package/.next/static/chunks/app/api/oauth/xiaomi-mimo/api-key/route-9a2a13ac6b89ba91.js +0 -1
  592. package/.next/static/chunks/app/api/oauth/xiaomi-mimo/auto-import/route-9a2a13ac6b89ba91.js +0 -1
  593. package/.next/static/chunks/app/api/pricing/route-9a2a13ac6b89ba91.js +0 -1
  594. package/.next/static/chunks/app/api/provider-nodes/[id]/route-9a2a13ac6b89ba91.js +0 -1
  595. package/.next/static/chunks/app/api/provider-nodes/route-9a2a13ac6b89ba91.js +0 -1
  596. package/.next/static/chunks/app/api/provider-nodes/validate/route-9a2a13ac6b89ba91.js +0 -1
  597. package/.next/static/chunks/app/api/providers/[id]/models/route-9a2a13ac6b89ba91.js +0 -1
  598. package/.next/static/chunks/app/api/providers/[id]/route-9a2a13ac6b89ba91.js +0 -1
  599. package/.next/static/chunks/app/api/providers/[id]/test/route-9a2a13ac6b89ba91.js +0 -1
  600. package/.next/static/chunks/app/api/providers/[id]/test-models/route-9a2a13ac6b89ba91.js +0 -1
  601. package/.next/static/chunks/app/api/providers/client/route-9a2a13ac6b89ba91.js +0 -1
  602. package/.next/static/chunks/app/api/providers/kilo/free-models/route-9a2a13ac6b89ba91.js +0 -1
  603. package/.next/static/chunks/app/api/providers/route-9a2a13ac6b89ba91.js +0 -1
  604. package/.next/static/chunks/app/api/providers/suggested-models/route-9a2a13ac6b89ba91.js +0 -1
  605. package/.next/static/chunks/app/api/providers/test-batch/route-9a2a13ac6b89ba91.js +0 -1
  606. package/.next/static/chunks/app/api/providers/validate/route-9a2a13ac6b89ba91.js +0 -1
  607. package/.next/static/chunks/app/api/proxy-pools/[id]/route-9a2a13ac6b89ba91.js +0 -1
  608. package/.next/static/chunks/app/api/proxy-pools/[id]/test/route-9a2a13ac6b89ba91.js +0 -1
  609. package/.next/static/chunks/app/api/proxy-pools/cloudflare-deploy/route-9a2a13ac6b89ba91.js +0 -1
  610. package/.next/static/chunks/app/api/proxy-pools/deno-deploy/route-9a2a13ac6b89ba91.js +0 -1
  611. package/.next/static/chunks/app/api/proxy-pools/route-9a2a13ac6b89ba91.js +0 -1
  612. package/.next/static/chunks/app/api/proxy-pools/vercel-deploy/route-9a2a13ac6b89ba91.js +0 -1
  613. package/.next/static/chunks/app/api/pxpipe/health/route-9a2a13ac6b89ba91.js +0 -1
  614. package/.next/static/chunks/app/api/pxpipe/install/route-9a2a13ac6b89ba91.js +0 -1
  615. package/.next/static/chunks/app/api/pxpipe/logs/route-9a2a13ac6b89ba91.js +0 -1
  616. package/.next/static/chunks/app/api/pxpipe/restart/route-9a2a13ac6b89ba91.js +0 -1
  617. package/.next/static/chunks/app/api/pxpipe/start/route-9a2a13ac6b89ba91.js +0 -1
  618. package/.next/static/chunks/app/api/pxpipe/stats/route-9a2a13ac6b89ba91.js +0 -1
  619. package/.next/static/chunks/app/api/pxpipe/status/route-9a2a13ac6b89ba91.js +0 -1
  620. package/.next/static/chunks/app/api/pxpipe/stop/route-9a2a13ac6b89ba91.js +0 -1
  621. package/.next/static/chunks/app/api/settings/database/route-9a2a13ac6b89ba91.js +0 -1
  622. package/.next/static/chunks/app/api/settings/proxy-test/route-9a2a13ac6b89ba91.js +0 -1
  623. package/.next/static/chunks/app/api/settings/require-login/route-9a2a13ac6b89ba91.js +0 -1
  624. package/.next/static/chunks/app/api/settings/route-9a2a13ac6b89ba91.js +0 -1
  625. package/.next/static/chunks/app/api/shutdown/route-9a2a13ac6b89ba91.js +0 -1
  626. package/.next/static/chunks/app/api/tags/route-9a2a13ac6b89ba91.js +0 -1
  627. package/.next/static/chunks/app/api/translator/console-logs/route-9a2a13ac6b89ba91.js +0 -1
  628. package/.next/static/chunks/app/api/translator/console-logs/stream/route-9a2a13ac6b89ba91.js +0 -1
  629. package/.next/static/chunks/app/api/translator/load/route-9a2a13ac6b89ba91.js +0 -1
  630. package/.next/static/chunks/app/api/translator/save/route-9a2a13ac6b89ba91.js +0 -1
  631. package/.next/static/chunks/app/api/translator/send/route-9a2a13ac6b89ba91.js +0 -1
  632. package/.next/static/chunks/app/api/translator/translate/route-9a2a13ac6b89ba91.js +0 -1
  633. package/.next/static/chunks/app/api/tunnel/disable/route-9a2a13ac6b89ba91.js +0 -1
  634. package/.next/static/chunks/app/api/tunnel/enable/route-9a2a13ac6b89ba91.js +0 -1
  635. package/.next/static/chunks/app/api/tunnel/status/route-9a2a13ac6b89ba91.js +0 -1
  636. package/.next/static/chunks/app/api/tunnel/tailscale-check/route-9a2a13ac6b89ba91.js +0 -1
  637. package/.next/static/chunks/app/api/tunnel/tailscale-disable/route-9a2a13ac6b89ba91.js +0 -1
  638. package/.next/static/chunks/app/api/tunnel/tailscale-enable/route-9a2a13ac6b89ba91.js +0 -1
  639. package/.next/static/chunks/app/api/tunnel/tailscale-install/route-9a2a13ac6b89ba91.js +0 -1
  640. package/.next/static/chunks/app/api/usage/[connectionId]/codex-reset-credits/route-9a2a13ac6b89ba91.js +0 -1
  641. package/.next/static/chunks/app/api/usage/[connectionId]/route-9a2a13ac6b89ba91.js +0 -1
  642. package/.next/static/chunks/app/api/usage/chart/route-9a2a13ac6b89ba91.js +0 -1
  643. package/.next/static/chunks/app/api/usage/health/route-9a2a13ac6b89ba91.js +0 -1
  644. package/.next/static/chunks/app/api/usage/history/route-9a2a13ac6b89ba91.js +0 -1
  645. package/.next/static/chunks/app/api/usage/logs/route-9a2a13ac6b89ba91.js +0 -1
  646. package/.next/static/chunks/app/api/usage/providers/route-9a2a13ac6b89ba91.js +0 -1
  647. package/.next/static/chunks/app/api/usage/request-details/route-9a2a13ac6b89ba91.js +0 -1
  648. package/.next/static/chunks/app/api/usage/request-logs/route-9a2a13ac6b89ba91.js +0 -1
  649. package/.next/static/chunks/app/api/usage/stats/route-9a2a13ac6b89ba91.js +0 -1
  650. package/.next/static/chunks/app/api/usage/stream/route-9a2a13ac6b89ba91.js +0 -1
  651. package/.next/static/chunks/app/api/v1/api/chat/route-9a2a13ac6b89ba91.js +0 -1
  652. package/.next/static/chunks/app/api/v1/audio/speech/route-9a2a13ac6b89ba91.js +0 -1
  653. package/.next/static/chunks/app/api/v1/audio/transcriptions/route-9a2a13ac6b89ba91.js +0 -1
  654. package/.next/static/chunks/app/api/v1/audio/voices/route-9a2a13ac6b89ba91.js +0 -1
  655. package/.next/static/chunks/app/api/v1/chat/completions/route-9a2a13ac6b89ba91.js +0 -1
  656. package/.next/static/chunks/app/api/v1/embeddings/route-9a2a13ac6b89ba91.js +0 -1
  657. package/.next/static/chunks/app/api/v1/images/generations/route-9a2a13ac6b89ba91.js +0 -1
  658. package/.next/static/chunks/app/api/v1/messages/count_tokens/route-9a2a13ac6b89ba91.js +0 -1
  659. package/.next/static/chunks/app/api/v1/messages/route-9a2a13ac6b89ba91.js +0 -1
  660. package/.next/static/chunks/app/api/v1/models/[...model]/route-9a2a13ac6b89ba91.js +0 -1
  661. package/.next/static/chunks/app/api/v1/models/info/route-9a2a13ac6b89ba91.js +0 -1
  662. package/.next/static/chunks/app/api/v1/models/route-9a2a13ac6b89ba91.js +0 -1
  663. package/.next/static/chunks/app/api/v1/responses/compact/route-9a2a13ac6b89ba91.js +0 -1
  664. package/.next/static/chunks/app/api/v1/responses/route-9a2a13ac6b89ba91.js +0 -1
  665. package/.next/static/chunks/app/api/v1/route-9a2a13ac6b89ba91.js +0 -1
  666. package/.next/static/chunks/app/api/v1/search/route-9a2a13ac6b89ba91.js +0 -1
  667. package/.next/static/chunks/app/api/v1/systemone/route-9a2a13ac6b89ba91.js +0 -1
  668. package/.next/static/chunks/app/api/v1/videos/[id]/route-9a2a13ac6b89ba91.js +0 -1
  669. package/.next/static/chunks/app/api/v1/videos/edits/route-9a2a13ac6b89ba91.js +0 -1
  670. package/.next/static/chunks/app/api/v1/videos/extensions/route-9a2a13ac6b89ba91.js +0 -1
  671. package/.next/static/chunks/app/api/v1/videos/generations/route-9a2a13ac6b89ba91.js +0 -1
  672. package/.next/static/chunks/app/api/v1/web/fetch/route-9a2a13ac6b89ba91.js +0 -1
  673. package/.next/static/chunks/app/api/v1beta/models/[...path]/route-9a2a13ac6b89ba91.js +0 -1
  674. package/.next/static/chunks/app/api/v1beta/models/route-9a2a13ac6b89ba91.js +0 -1
  675. package/.next/static/chunks/app/api/version/route-9a2a13ac6b89ba91.js +0 -1
  676. package/.next/static/chunks/app/api/version/shutdown/route-9a2a13ac6b89ba91.js +0 -1
  677. package/.next/static/chunks/app/api/version/update/route-9a2a13ac6b89ba91.js +0 -1
  678. package/.next/static/chunks/app/manifest.webmanifest/route-9a2a13ac6b89ba91.js +0 -1
  679. package/.next/static/chunks/app/page-9a2a13ac6b89ba91.js +0 -1
  680. package/.next/static/chunks/next/dist/client/components/builtin/app-error-9a2a13ac6b89ba91.js +0 -1
  681. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-9a2a13ac6b89ba91.js +0 -1
  682. package/.next/static/chunks/next/dist/client/components/builtin/not-found-9a2a13ac6b89ba91.js +0 -1
  683. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-9a2a13ac6b89ba91.js +0 -1
  684. /package/.next/static/{Xxof6vr5MvX0-6oReU23d → C423Aljus-j0GJlKCHgC1}/_ssgManifest.js +0 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  All notable changes to 10Router will be documented in this file.
4
4
 
5
+ ## [0.1.12] — 2026-10-20
6
+
7
+ - Fix: Claude Code routed through the `opencode` free lane failed tool calls with `400 unknown field "thinking"`. The OpenAI-dialect endpoint inherited the model's `zai`/`deepseek` capability thinking shape and sent `body.thinking`; the transport now declares `thinkingFormat: "openai"` (opencode, opencode-zen and opencode-go OpenAI transports) and `resolveFormat` prefers the transport matching the target format. Claude- and Gemini-format transports keep their native shape.
8
+ - Fix: a stream that closed without `finish_reason` left the `tool_use` block open and the message unterminated, so the client dropped the turn as failed. The end-of-stream flush now closes open blocks, emits buffered tool arguments, and always sends `message_delta` + `message_stop`; truncated tool JSON degrades to `end_turn` instead of a broken `tool_use`.
9
+ - Fix: empty `tool_result` content (empty array, image-only, or a missing response) was sent as `""` or `"[]"` and rejected by OpenAI-dialect upstreams with `Message content must contain text`. A shared `EMPTY_TOOL_RESULT` placeholder is now applied when converting Claude tool results, when backfilling missing tool responses, and in `filterToOpenAIFormat`.
10
+ - Fix: the built-in chat page posted to `/api/dashboard/chat/completions`, a route that never existed, so every message 404'd. The route now delegates to `handleChat` and mints/reuses a local API key server-side; the page is reachable from the sidebar, renders markdown, and surfaces SSE error events.
11
+ - Tests: `tests/unit/claude-code-tool-flow.test.js` covers the thinking wire format per provider/transport, stream finalize without `finish_reason`, truncated tool arguments, empty tool results, and the flush contract.
12
+
5
13
  ## [0.1.11] — 2026-10-18
6
14
 
7
15
  - Fix: the CLI update notice never fired on networks that silently drop IPv6. `registry.npmjs.org` resolves to both A and AAAA records, so Node blackholes the first connection for ~10s before Happy Eyeballs falls back to IPv4, while the check aborted at 3s — a cold check routinely needs 2-14s. Measured 5/8 fetches and 1/12 notices here; the 10s budget now measures 8/8.
@@ -31,6 +31,9 @@ export default {
31
31
  format: "openai",
32
32
  baseUrl: "https://opencode.ai/inference/go/v1/chat/completions",
33
33
  auth: { combined: true, header: "Authorization", scheme: "bearer" },
34
+ // OpenAI dialect only: the gateway rejects `thinking`/`enable_thinking`
35
+ // (400 unknown field "thinking"), so normalize reasoning to reasoning_effort.
36
+ thinkingFormat: "openai",
34
37
  },
35
38
  {
36
39
  format: "claude",
@@ -41,6 +44,7 @@ export default {
41
44
  format: "openai-responses",
42
45
  baseUrl: "https://opencode.ai/inference/go/v1/responses",
43
46
  auth: { combined: true, header: "Authorization", scheme: "bearer" },
47
+ thinkingFormat: "openai",
44
48
  },
45
49
  ],
46
50
  // supportedFormats follow the endpoint table in https://opencode.ai/v2/docs/console/go
@@ -31,6 +31,9 @@ export default {
31
31
  format: "openai",
32
32
  baseUrl: "https://opencode.ai/inference/openai/v1/chat/completions",
33
33
  auth: { combined: true, header: "Authorization", scheme: "bearer" },
34
+ // OpenAI dialect only: the gateway rejects `thinking`/`enable_thinking`
35
+ // (400 unknown field "thinking"), so normalize reasoning to reasoning_effort.
36
+ thinkingFormat: "openai",
34
37
  },
35
38
  {
36
39
  format: "claude",
@@ -41,6 +44,7 @@ export default {
41
44
  format: "openai-responses",
42
45
  baseUrl: "https://opencode.ai/inference/openai/v1/responses",
43
46
  auth: { combined: true, header: "Authorization", scheme: "bearer" },
47
+ thinkingFormat: "openai",
44
48
  },
45
49
  ],
46
50
  // supportedFormats follow the per-model API families (chat completions /
@@ -19,6 +19,9 @@ export default {
19
19
  },
20
20
  forceStream: true,
21
21
  noAuth: true,
22
+ // OpenAI dialect only: the gateway rejects `thinking`/`enable_thinking`
23
+ // (400 unknown field "thinking"), so normalize reasoning to reasoning_effort.
24
+ thinkingFormat: "openai",
22
25
  quirks: {
23
26
  forceAutoToolChoiceModels: [
24
27
  "muse-spark-1.2-contributor-free",
@@ -124,9 +124,24 @@ const NATIVE_ONLY_FORMATS = new Set([
124
124
  "kiro",
125
125
  ]); // "kiro" legacy (provider removed)
126
126
 
127
+ // Provider/transport-level wire override. Multi-endpoint providers declare one
128
+ // entry per endpoint format, so prefer the entry matching targetFormat; fall back
129
+ // to the provider's default transport. The override describes an OpenAI-dialect
130
+ // endpoint, so it only applies on OpenAI-family wires — a Claude/Gemini endpoint
131
+ // keeps deriving its native thinking shape from the capabilities below.
132
+ function providerThinkingFormat(provider, targetFormat) {
133
+ if (targetFormat !== "openai" && targetFormat !== "openai-responses") return null;
134
+ const cfg = provider ? PROVIDERS[provider] : null;
135
+ if (!cfg) return null;
136
+ const entry = Array.isArray(cfg.transports)
137
+ ? cfg.transports.find((t) => (t.format || "openai") === targetFormat) || cfg
138
+ : cfg;
139
+ return entry.thinkingFormat || null;
140
+ }
141
+
127
142
  function resolveFormat(targetFormat, model, provider) {
128
143
  if (targetFormat === "commandcode") return "commandcode";
129
- const providerFmt = provider ? PROVIDERS[provider]?.thinkingFormat : null;
144
+ const providerFmt = providerThinkingFormat(provider, targetFormat);
130
145
  if (providerFmt) return providerFmt;
131
146
  const caps = getCapabilitiesForModel(provider, model);
132
147
  const isOpenAIWire = targetFormat === "openai" || targetFormat === "openai-responses";
@@ -1,6 +1,7 @@
1
1
  // Tool call helper functions for translator
2
2
 
3
3
  import { FORMATS } from "../formats.js";
4
+ import { EMPTY_TOOL_RESULT } from "../schema/index.js";
4
5
 
5
6
  // Anthropic tool_use.id must match: ^[a-zA-Z0-9_-]+$
6
7
  const TOOL_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;
@@ -147,7 +148,7 @@ export function fixMissingToolResponses(body) {
147
148
  newMessages.push({
148
149
  role: "tool",
149
150
  tool_call_id: id,
150
- content: "",
151
+ content: EMPTY_TOOL_RESULT,
151
152
  });
152
153
  }
153
154
  }
@@ -5,6 +5,7 @@ import {
5
5
  CLAUDE_BLOCK,
6
6
  VALID_OPENAI_CONTENT_TYPES,
7
7
  VALID_OPENAI_MESSAGE_TYPES,
8
+ EMPTY_TOOL_RESULT,
8
9
  } from "../schema/index.js";
9
10
 
10
11
  // Re-export valid-type lists (moved to schema/blocks.js) to keep existing importers working.
@@ -26,8 +27,15 @@ export function filterToOpenAIFormat(body, opts = {}) {
26
27
  // Normalize developer role to system (many providers don't support developer)
27
28
  if (msg.role === ROLE.DEVELOPER) msg = { ...msg, role: ROLE.SYSTEM };
28
29
 
29
- // Keep tool messages as-is (OpenAI format)
30
- if (msg.role === ROLE.TOOL) return msg;
30
+ // Keep tool messages as-is (OpenAI format) — but an empty one is a 400 on
31
+ // several OpenAI-dialect upstreams ("Message content must contain text").
32
+ if (msg.role === ROLE.TOOL) {
33
+ const empty =
34
+ msg.content === "" ||
35
+ msg.content == null ||
36
+ (Array.isArray(msg.content) && msg.content.length === 0);
37
+ return empty ? { ...msg, content: EMPTY_TOOL_RESULT } : msg;
38
+ }
31
39
 
32
40
  // Keep assistant messages with tool_calls as-is
33
41
  if (msg.role === ROLE.ASSISTANT && msg.tool_calls) return msg;
@@ -2,7 +2,7 @@ import { register } from "../index.js";
2
2
  import { FORMATS } from "../formats.js";
3
3
  import { adjustMaxTokens } from "../formats/maxTokens.js";
4
4
  import { encodeDataUri } from "../concerns/image.js";
5
- import { ROLE, OPENAI_BLOCK, CLAUDE_BLOCK } from "../schema/index.js";
5
+ import { ROLE, OPENAI_BLOCK, CLAUDE_BLOCK, EMPTY_TOOL_RESULT } from "../schema/index.js";
6
6
  import { collapseTextParts } from "../concerns/message.js";
7
7
 
8
8
  function stripAnthropicBillingHeader(text) {
@@ -62,7 +62,7 @@ export function claudeToOpenAIRequest(model, body, stream) {
62
62
  }
63
63
 
64
64
  // Fix missing tool responses - OpenAI requires every tool_call to have a response.
65
- // Local variant: scans contiguous tool replies + inserts "[No response received]"
65
+ // Local variant: scans contiguous tool replies + inserts EMPTY_TOOL_RESULT
66
66
  // (distinct from the global immediate-next check in concerns/toolCall, runs on the openai leg).
67
67
  fixMissingToolResponsesOpenAI(result.messages);
68
68
 
@@ -123,7 +123,7 @@ function fixMissingToolResponsesOpenAI(messages) {
123
123
  const missingResponses = missingIds.map((id) => ({
124
124
  role: ROLE.TOOL,
125
125
  tool_call_id: id,
126
- content: "[No response received]",
126
+ content: EMPTY_TOOL_RESULT,
127
127
  }));
128
128
  messages.splice(insertPosition, 0, ...missingResponses);
129
129
  i = insertPosition + missingResponses.length - 1;
@@ -216,7 +216,9 @@ function convertClaudeMessage(msg) {
216
216
  const textOnly = block.content.filter((c) => c?.type === CLAUDE_BLOCK.TEXT);
217
217
  resultContent =
218
218
  textOnly.map((c) => c.text).join("\n") ||
219
- (resultImages.length ? "" : JSON.stringify(block.content));
219
+ (resultImages.length || block.content.length === 0
220
+ ? ""
221
+ : JSON.stringify(block.content));
220
222
  } else if (block.content) {
221
223
  resultContent = JSON.stringify(block.content);
222
224
  }
@@ -224,7 +226,9 @@ function convertClaudeMessage(msg) {
224
226
  toolResults.push({
225
227
  role: ROLE.TOOL,
226
228
  tool_call_id: block.tool_use_id,
227
- content: resultContent,
229
+ // Empty content is a 400 on several OpenAI-dialect upstreams
230
+ // ("Message content must contain text"); keep a placeholder.
231
+ content: resultContent || EMPTY_TOOL_RESULT,
228
232
  });
229
233
  // The OpenAI tool role is text-only, so a screenshot or any other image a
230
234
  // tool returned would otherwise vanish. Hand it to the model in the user
@@ -70,9 +70,73 @@ function stopTextBlock(state, results) {
70
70
  state.textBlockStarted = false;
71
71
  }
72
72
 
73
+ // Buffered tool args parse as JSON → safe to hand the client a tool_use finish.
74
+ function bufferedArgsComplete(state) {
75
+ for (const [idx] of state.toolCalls) {
76
+ const buffered = state.toolArgBuffers?.get(idx);
77
+ if (!buffered) continue;
78
+ try {
79
+ JSON.parse(buffered);
80
+ } catch {
81
+ return false;
82
+ }
83
+ }
84
+ return true;
85
+ }
86
+
87
+ // Close every open block, flush tool args, then message_delta + message_stop.
88
+ // Shared by the finish_reason path and the end-of-stream flush so a stream that
89
+ // dies without a finish chunk still terminates instead of truncating the turn.
90
+ function emitMessageFinish(state, results, reason) {
91
+ if (state.claudeFinishEmitted) return;
92
+ state.claudeFinishEmitted = true;
93
+
94
+ stopThinkingBlock(state, results);
95
+ stopTextBlock(state, results);
96
+
97
+ for (const [idx, toolInfo] of state.toolCalls) {
98
+ // Emit buffered + sanitized args as single delta before stop
99
+ const buffered = state.toolArgBuffers?.get(idx);
100
+ if (buffered) {
101
+ const sanitized = sanitizeToolArgs(toolInfo.name, buffered);
102
+ results.push({
103
+ type: "content_block_delta",
104
+ index: toolInfo.blockIndex,
105
+ delta: { type: "input_json_delta", partial_json: sanitized },
106
+ });
107
+ }
108
+ results.push({
109
+ type: "content_block_stop",
110
+ index: toolInfo.blockIndex,
111
+ });
112
+ }
113
+
114
+ // Mark finish for later usage injection in stream.js
115
+ state.finishReason = reason;
116
+
117
+ // Use tracked usage (will be estimated in stream.js if not valid)
118
+ const finalUsage = state.usage || { input_tokens: 0, output_tokens: 0 };
119
+ results.push({
120
+ type: "message_delta",
121
+ delta: { stop_reason: convertFinishReason(reason) },
122
+ usage: finalUsage,
123
+ });
124
+ results.push({ type: "message_stop" });
125
+ }
126
+
73
127
  // Convert OpenAI stream chunk to Claude format
74
128
  export function openaiToClaudeResponse(chunk, state) {
75
- if (!chunk || !chunk.choices?.[0]) return null;
129
+ // End-of-stream flush (stream.js calls the translator with chunk=null): the
130
+ // upstream can close right after a tool-call delta without ever sending
131
+ // finish_reason, which used to leave the client with an unterminated message.
132
+ if (!chunk) {
133
+ if (!state.messageStartSent || state.claudeFinishEmitted) return null;
134
+ const results = [];
135
+ const reason = state.toolCalls.size > 0 && bufferedArgsComplete(state) ? "tool_calls" : "stop";
136
+ emitMessageFinish(state, results, reason);
137
+ return results;
138
+ }
139
+ if (!chunk.choices?.[0]) return null;
76
140
 
77
141
  const results = [];
78
142
  const choice = chunk.choices[0];
@@ -234,37 +298,7 @@ export function openaiToClaudeResponse(chunk, state) {
234
298
 
235
299
  // Finish
236
300
  if (choice.finish_reason) {
237
- stopThinkingBlock(state, results);
238
- stopTextBlock(state, results);
239
-
240
- for (const [idx, toolInfo] of state.toolCalls) {
241
- // Emit buffered + sanitized args as single delta before stop
242
- const buffered = state.toolArgBuffers?.get(idx);
243
- if (buffered) {
244
- const sanitized = sanitizeToolArgs(toolInfo.name, buffered);
245
- results.push({
246
- type: "content_block_delta",
247
- index: toolInfo.blockIndex,
248
- delta: { type: "input_json_delta", partial_json: sanitized },
249
- });
250
- }
251
- results.push({
252
- type: "content_block_stop",
253
- index: toolInfo.blockIndex,
254
- });
255
- }
256
-
257
- // Mark finish for later usage injection in stream.js
258
- state.finishReason = choice.finish_reason;
259
-
260
- // Use tracked usage (will be estimated in stream.js if not valid)
261
- const finalUsage = state.usage || { input_tokens: 0, output_tokens: 0 };
262
- results.push({
263
- type: "message_delta",
264
- delta: { stop_reason: convertFinishReason(choice.finish_reason) },
265
- usage: finalUsage,
266
- });
267
- results.push({ type: "message_stop" });
301
+ emitMessageFinish(state, results, choice.finish_reason);
268
302
  }
269
303
 
270
304
  return results.length > 0 ? results : null;
@@ -5,3 +5,9 @@ export const MODEL_FALLBACK = "unknown";
5
5
 
6
6
  // Default image mime when source omits it (base64 blobs without a declared type).
7
7
  export const DEFAULT_IMAGE_MIME = "image/png";
8
+
9
+ // Placeholder for a tool result with no text (image-only, empty array, or a
10
+ // missing response). OpenAI-dialect wires reject `role:"tool"` with empty
11
+ // content. Deliberately not JSON-shaped: a leading "[" reads as a raw-JSON
12
+ // stringification bug to callers inspecting the bridge.
13
+ export const EMPTY_TOOL_RESULT = "(no output)";
@@ -8,4 +8,4 @@ export {
8
8
  VALID_OPENAI_MESSAGE_TYPES,
9
9
  } from "./blocks.js";
10
10
  export { OPENAI_FINISH, CLAUDE_STOP, GEMINI_FINISH } from "./finishReasons.js";
11
- export { MODEL_FALLBACK, DEFAULT_IMAGE_MIME } from "./defaults.js";
11
+ export { MODEL_FALLBACK, DEFAULT_IMAGE_MIME, EMPTY_TOOL_RESULT } from "./defaults.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amir83nasr/10router",
3
- "version": "0.1.11",
3
+ "version": "0.1.12",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/Amir83Nasr/10Router.git"
@@ -62,6 +62,7 @@
62
62
  "class-variance-authority": "^0.7.1",
63
63
  "cn": "^0.3.0",
64
64
  "confbox": "^0.2.4",
65
+ "dompurify": "^3.2.7",
65
66
  "jose": "^6.1.3",
66
67
  "lucide-react": "^1.47.0",
67
68
  "marked": "^18.0.1",
@@ -2,6 +2,8 @@
2
2
  import Icon from "@/shared/components/Icon";
3
3
 
4
4
  import { useEffect, useMemo, useRef, useState } from "react";
5
+ import DOMPurify from "dompurify";
6
+ import { marked } from "marked";
5
7
  import { Badge } from "@/components/ui/badge";
6
8
  import { Button } from "@/components/ui/button";
7
9
  import { getModelsByProviderId } from "@/shared/constants/models";
@@ -10,6 +12,8 @@ import {
10
12
  isOpenAICompatibleProvider,
11
13
  } from "@/shared/constants/providers";
12
14
 
15
+ marked.setOptions({ gfm: true, breaks: true });
16
+
13
17
  const STORAGE_KEYS = {
14
18
  sessions: "basic-chat.sessions",
15
19
  activeSessionId: "basic-chat.activeSessionId",
@@ -100,6 +104,28 @@ function readAssistantText(chunk) {
100
104
  return pieces[0] || "";
101
105
  }
102
106
 
107
+ // Errors arrive as SSE events (`{ error }` or a Responses-style `{ type: "error" }`)
108
+ // with no choices; the content-only parse would drop them and end the turn empty.
109
+ function readChunkError(chunk) {
110
+ if (!chunk || typeof chunk !== "object") return "";
111
+ if (chunk.error) return textValue(chunk.error) || "Request failed";
112
+ if (chunk.type === "error") return textValue(chunk.message) || "Request failed";
113
+ return "";
114
+ }
115
+
116
+ function MarkdownMessage({ text }) {
117
+ const raw = textValue(text);
118
+ const html = useMemo(() => {
119
+ if (!raw) return "";
120
+ // DOMPurify needs a DOM; the server render has none (sessions hydrate from storage).
121
+ if (typeof window === "undefined") return null;
122
+ return DOMPurify.sanitize(marked.parse(raw, { async: false }));
123
+ }, [raw]);
124
+
125
+ if (html === null) return <span className="whitespace-pre-wrap break-words">{raw}</span>;
126
+ return <div className="chat-markdown break-words" dangerouslySetInnerHTML={{ __html: html }} />;
127
+ }
128
+
103
129
  async function fileToDataUrl(file) {
104
130
  return await new Promise((resolve, reject) => {
105
131
  const reader = new FileReader();
@@ -747,6 +773,7 @@ export default function BasicChatPageClient() {
747
773
  const decoder = new TextDecoder();
748
774
  let buffer = "";
749
775
  let assistantText = "";
776
+ let streamError = "";
750
777
 
751
778
  while (true) {
752
779
  const { value, done } = await reader.read();
@@ -765,6 +792,12 @@ export default function BasicChatPageClient() {
765
792
 
766
793
  try {
767
794
  const chunk = JSON.parse(payload);
795
+ const chunkError = readChunkError(chunk);
796
+ if (chunkError) {
797
+ streamError = chunkError;
798
+ continue;
799
+ }
800
+
768
801
  const text = readAssistantText(chunk);
769
802
  if (!text) continue;
770
803
 
@@ -787,13 +820,16 @@ export default function BasicChatPageClient() {
787
820
 
788
821
  updateSession(sessionId, (currentSession) => ({
789
822
  ...currentSession,
790
- messages: currentSession.messages.map((message) =>
791
- message.id === assistantMessageId
792
- ? { ...message, content: assistantText || message.content, status: "done" }
793
- : message,
794
- ),
823
+ messages: currentSession.messages.map((message) => {
824
+ if (message.id !== assistantMessageId) return message;
825
+ if (!assistantText && streamError) {
826
+ return { ...message, content: message.content || streamError, status: "error" };
827
+ }
828
+ return { ...message, content: assistantText || message.content, status: "done" };
829
+ }),
795
830
  updatedAt: new Date().toISOString(),
796
831
  }));
832
+ if (!assistantText && streamError) setLoadError(streamError);
797
833
  finalizeSessionTitle(sessionId, userText);
798
834
  } catch (error) {
799
835
  if (error.name !== "AbortError") {
@@ -1036,8 +1072,10 @@ export default function BasicChatPageClient() {
1036
1072
  </div>
1037
1073
  ) : null}
1038
1074
 
1039
- <div className="whitespace-pre-wrap break-words text-[15px] leading-7">
1040
- {content}
1075
+ <div
1076
+ className={`break-words text-[15px] leading-7 ${isAssistant ? "" : "whitespace-pre-wrap"}`}
1077
+ >
1078
+ {isAssistant ? <MarkdownMessage text={content} /> : content}
1041
1079
  {isAssistant && isStreaming && !streamingText ? (
1042
1080
  <span className="inline-block animate-pulse">▋</span>
1043
1081
  ) : null}
@@ -0,0 +1,45 @@
1
+ import { handleChat } from "@/sse/handlers/chat.js";
2
+ import { getApiKeys, createApiKey } from "@/lib/localDb";
3
+ import { getConsistentMachineId } from "@/shared/utils/machineId";
4
+
5
+ export const dynamic = "force-dynamic";
6
+
7
+ // The browser only holds the dashboard JWT. The LLM handler still enforces
8
+ // requireApiKey, so reuse (or mint) a local key server-side; it never reaches the client.
9
+ async function getInternalApiKey(): Promise<string> {
10
+ const keys = await getApiKeys();
11
+ const active = keys.find((k) => k.isActive !== false);
12
+ if (active) return active.key;
13
+ const created = await createApiKey("Default Key", await getConsistentMachineId());
14
+ return created.key;
15
+ }
16
+
17
+ export async function POST(request: Request) {
18
+ let body: unknown;
19
+ try {
20
+ body = await request.json();
21
+ } catch {
22
+ return Response.json({ error: "Invalid JSON body" }, { status: 400 });
23
+ }
24
+
25
+ let apiKey: string;
26
+ try {
27
+ apiKey = await getInternalApiKey();
28
+ } catch {
29
+ return Response.json({ error: "Failed to prepare API key" }, { status: 500 });
30
+ }
31
+
32
+ // Only the body matters here; forwarding the browser's headers would also hand
33
+ // cookies/origin to upstream executors that read rawHeaders.
34
+ const upstreamRequest = new Request(request.url, {
35
+ method: "POST",
36
+ headers: {
37
+ "Content-Type": "application/json",
38
+ Authorization: `Bearer ${apiKey}`,
39
+ },
40
+ body: JSON.stringify(body),
41
+ signal: request.signal,
42
+ });
43
+
44
+ return handleChat(upstreamRequest);
45
+ }
@@ -300,57 +300,98 @@
300
300
  }
301
301
 
302
302
  /* ── MARKDOWN BODY ─────────────────────────────────────── */
303
- /* Changelog modal markdown. Scoped to ChangelogModal. */
304
- .changelog-body h1 {
303
+ /* Shared by the changelog modal and chat assistant messages. */
304
+ :is(.changelog-body, .chat-markdown) h1 {
305
305
  font-size: 1.4rem;
306
306
  font-weight: 700;
307
307
  margin: 1.5rem 0 0.75rem;
308
308
  padding-bottom: 0.5rem;
309
309
  border-bottom: 1px solid var(--border);
310
310
  }
311
- .changelog-body h1:first-child {
311
+ :is(.changelog-body, .chat-markdown) h1:first-child {
312
312
  margin-top: 0;
313
313
  }
314
- .changelog-body h2 {
314
+ :is(.changelog-body, .chat-markdown) h2 {
315
315
  font-size: 1.3rem;
316
316
  font-weight: 700;
317
317
  margin: 2.25rem 0 0.6rem;
318
- color: var(--primary);
319
318
  }
320
- .changelog-body h2:first-child {
319
+ :is(.changelog-body, .chat-markdown) h2:first-child {
321
320
  margin-top: 0;
322
321
  }
323
- .changelog-body h3 {
322
+ /* Changelog headings use --primary; chat keeps inherited color (its panel is always dark). */
323
+ .changelog-body h2 {
324
+ color: var(--primary);
325
+ }
326
+ :is(.changelog-body, .chat-markdown) h3 {
324
327
  font-size: 0.95rem;
325
328
  font-weight: 600;
326
329
  margin: 0.75rem 0 0.4rem;
327
330
  }
328
- .changelog-body ul {
331
+ :is(.changelog-body, .chat-markdown) ul {
329
332
  list-style: disc;
330
333
  padding-left: 1.5rem;
331
334
  margin: 0.5rem 0;
332
335
  }
333
- .changelog-body li {
336
+ :is(.changelog-body, .chat-markdown) ol {
337
+ list-style: decimal;
338
+ padding-left: 1.5rem;
339
+ margin: 0.5rem 0;
340
+ }
341
+ :is(.changelog-body, .chat-markdown) li {
334
342
  margin: 0.25rem 0;
335
343
  line-height: 1.6;
336
344
  }
337
- .changelog-body p {
345
+ :is(.changelog-body, .chat-markdown) p {
338
346
  margin: 0.5rem 0;
339
347
  line-height: 1.6;
340
348
  }
341
- .changelog-body code {
349
+ :is(.changelog-body, .chat-markdown) code {
342
350
  background: var(--muted);
343
351
  padding: 0.1rem 0.35rem;
344
352
  border-radius: 4px;
345
353
  font-size: 0.875em;
346
354
  font-family: ui-monospace, monospace;
347
355
  }
348
- .changelog-body a {
356
+ :is(.changelog-body, .chat-markdown) pre {
357
+ background: var(--muted);
358
+ border: 1px solid var(--border);
359
+ border-radius: 10px;
360
+ padding: 0.75rem 1rem;
361
+ margin: 0.75rem 0;
362
+ overflow-x: auto;
363
+ }
364
+ :is(.changelog-body, .chat-markdown) pre code {
365
+ background: none;
366
+ padding: 0;
367
+ border-radius: 0;
368
+ font-size: 0.85em;
369
+ line-height: 1.55;
370
+ }
371
+ :is(.changelog-body, .chat-markdown) a {
349
372
  color: var(--primary);
350
373
  text-decoration: underline;
351
374
  }
352
- .changelog-body hr {
375
+ :is(.changelog-body, .chat-markdown) hr {
353
376
  border: none;
354
377
  border-top: 1px solid var(--border);
355
378
  margin: 1.5rem 0;
356
379
  }
380
+
381
+ /* Chat panel is always dark (#212121), so theme tokens resolve to light values there. */
382
+ .chat-markdown h1 {
383
+ border-bottom-color: rgba(255, 255, 255, 0.15);
384
+ }
385
+ .chat-markdown code {
386
+ background: rgba(255, 255, 255, 0.1);
387
+ }
388
+ .chat-markdown pre {
389
+ background: rgba(0, 0, 0, 0.35);
390
+ border-color: rgba(255, 255, 255, 0.12);
391
+ }
392
+ .chat-markdown a {
393
+ color: #7cc4ff;
394
+ }
395
+ .chat-markdown hr {
396
+ border-top-color: rgba(255, 255, 255, 0.15);
397
+ }
@@ -31,6 +31,7 @@ interface NavItem {
31
31
  }
32
32
 
33
33
  const NAV: NavItem[] = [
34
+ { id: "chat", href: "/dashboard/basic-chat", label: "Chat", icon: "chat" },
34
35
  {
35
36
  id: "endpoint",
36
37
  href: "/dashboard",
@@ -145,6 +145,14 @@ const getPageInfo = (pathname) => {
145
145
  icon: "waypoints",
146
146
  breadcrumbs: [],
147
147
  };
148
+ if (pathname.includes("/basic-chat"))
149
+ return {
150
+ title: "Chat",
151
+ description: "Test any connected model",
152
+ icon: "chat",
153
+ breadcrumbs: [],
154
+ };
155
+
148
156
  if (pathname.includes("/endpoint"))
149
157
  return {
150
158
  title: "Endpoint",
@@ -1 +0,0 @@
1
- self.__BUILD_MANIFEST=function(e,s,t,a){return{__rewrites:{afterFiles:[{has:e,source:"/v1/v1/:path*",destination:s},{has:e,source:"/v1/v1",destination:t},{has:e,source:"/codex/:path*",destination:a},{has:e,source:"/responses",destination:a},{has:e,source:"/v1beta/:path*",destination:"/api/v1beta/:path*"},{has:e,source:"/v1beta",destination:"/api/v1beta"},{has:e,source:"/v1/:path*",destination:s},{has:e,source:"/v1",destination:t}],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:147,errorRate:1e-4,numBits:2819,numHashes:14,bitArray:[0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,0,1,1,1,1,0,1,0,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,1,1,0,0,1,1,0,0,0,0,0,0,0,1,1,0,1,0,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,1,0,0,1,0,0,0,1,1,1,1,1,1,0,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,0,1,0,0,0,1,0,1,1,0,0,0,1,1,0,1,0,1,0,0,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,1,0,0,0,0,1,1,1,0,0,1,0,0,0,1,0,1,0,0,0,1,1,1,1,1,0,1,0,0,0,0,1,0,0,1,1,0,1,0,0,1,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,1,0,1,0,0,0,1,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,1,1,0,0,1,0,1,1,1,0,1,1,0,1,0,1,0,1,0,1,0,0,0,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,1,1,1,0,0,1,1,1,1,1,0,1,0,1,0,0,1,1,1,0,0,1,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,1,1,0,1,0,1,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,0,0,0,0,1,0,1,0,1,1,0,1,1,0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,0,0,1,1,1,0,0,0,0,1,0,1,0,0,1,0,1,1,0,1,1,1,1,0,1,0,0,0,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,1,0,1,1,0,1,0,0,1,1,1,0,1,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,0,1,1,0,0,1,0,1,0,1,1,1,0,0,0,0,1,1,1,1,0,1,0,0,0,1,0,1,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,0,0,1,0,1,0,1,1,0,1,0,0,0,0,1,0,1,1,0,0,1,0,1,1,0,1,1,1,0,0,1,0,1,0,1,0,0,1,1,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,1,0,1,1,1,1,0,1,0,0,1,1,1,1,0,0,1,0,1,0,0,1,1,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,0,0,0,1,1,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,0,0,0,1,0,1,1,1,1,1,0,1,0,1,0,1,1,0,1,1,1,0,0,0,0,1,0,1,1,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,0,1,0,0,1,0,1,1,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,0,1,1,0,1,1,1,1,0,0,1,0,1,1,1,0,0,0,0,0,1,1,0,1,0,1,1,0,0,0,0,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,1,0,1,0,1,0,1,1,1,1,1,1,0,0,1,1,1,0,1,0,1,0,1,0,1,0,1,0,0,1,0,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,0,0,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,1,1,1,0,1,0,1,0,0,1,1,0,1,1,0,0,1,0,1,1,0,1,1,1,0,1,0,1,0,0,1,0,1,0,1,1,0,1,1,0,1,1,1,0,0,0,1,0,1,1,0,0,0,1,1,1,0,0,1,0,1,1,0,1,0,0,0,1,0,1,1,1,0,0,1,1,0,1,0,0,1,1,1,0,0,0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,1,0,1,0,0,1,1,1,0,1,0,1,1,1,1,0,0,1,1,1,0,0,0,1,0,1,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,1,1,0,0,1,1,0,1,0,0,1,0,0,0,1,1,1,0,0,0,1,0,1,1,1,1,1,1,1,0,1,0,1,0,0,0,0,0,0,1,1,0,0,1,0,0,1,1,0,1,1,0,1,0,1,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,1,1,0,1,1,1,1,1,0,1,0,1,0,1,1,0,0,0,0,1,0,0,0,1,0,1,0,0,1,1,1,0,1,1,1,1,0,1,1,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,1,1,1,1,1,0,0,0,0,1,0,0,1,1,0,0,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,1,1,0,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,0,0,1,0,0,1,0,0,1,0,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,1,0,0,1,1,1,1,0,0,1,1,1,1,1,0,1,0,0,1,0,0,1,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,1,0,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,0,0,1,1,1,0,1,1,1,0,0,0,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,0,1,1,1,0,1,1,0,0,1,0,1,1,0,1,1,0,0,0,1,1,1,0,0,1,1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,1,0,1,0,0,0,1,1,1,0,0,1,1,1,1,0,0,1,1,1,0,0,0,1,1,1,0,1,1,1,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,1,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,1,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,1,1,0,0,1,1,0,1,0,1,0,1,0,0,1,0,1,0,1,1,1,1,0,0,0,0,1,1,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,1,1,1,0,0,1,1,0,1,0,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,0,1,1,0,0,0,1,0,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,1,0,0,0,0,1,1,0,1,0,0,1,1,1,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,1,0,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,1,0,1,0,1,0,0,1,0,1,0,1,1,0,0,1,1,1,0,0,1,1,0,0,1,1,0,0,1,0,1,1,0,1,0,1,0,0,0,1,1,0,0,1,1,0,1,1,0,1,1,0,0,1,1,1,1,0,1,1,1,0,0,1,0,0,0,0,1,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,0,1,0,1,0,0,0,1,1,1,1,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,1,1,0,1,0,0,0,0,0,1,1,0,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,1,1,1,1,1,0,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,1,1,0,1,1,1,0,0,1,1,0,1,1,0,0,0,0,1,0,1,1,0,0,1,0,0,1,1,0,0,1,0,0,1,0,0,1,0,1,1,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,1,1,0,0,1,1,0,1,1,0,0,0,1,1,0,1,0,0,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,1,1,1,0,1,0,0,1,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,1,0,0,0,1,0,1,1,0,0,1,1,1,0,1,1,0,0,0,0,1,1,0,1,1,1,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,1,0,1,0,0,0,0,0,1,0,1,0,1,0,1,0,1,1,1,1,0,0,0,1,1,1,1,1,1,0,1,1,0,1,0,0,0,1,0,1,0,1,1,1,0,0,1,0,1,1,0,1,0,0,0,0,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,1,1,0,1,1,0,0,0,1,0,1,1,0,1,0,0,0,1,1,1,1,1,0,0,1,0,0,1,1,1,1,1,1,0,1,1,0,1,0,0,1,1,1,0,1,1,1,0,0,1,1,0,1,0,1,1,0,1,1,0,1,1,0,0,0,1,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,1,1,1,0,1,1,1,1,0,1,1,0,0,0,1,0,1,1,1,0,0,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,1,1,1,0,1,1,1,0,0,1,1,1,1,0,1,1,0,1,0,0,0,0,0,1,0,1,1,1,0,1,1,1,1,0,1,0,0,1,1,0,1,1,0,0,0,1,0,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,1,0,1,1,1,1,0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,1,1,0,1,1,1,1,1,0,1,1,0,0,1,0,0,1,1,0,1,0,0,1,1,1,0,1,1,1,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,1,1,1,0,1,1,1,1,0,0,0,0,1,1,0,1,1,0,1,1,1,1,1,1,0,1,0,1,1,0,1,0,0,1,1,1,1,1,0,0,0,1,0,1,1,0,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,1,0,1,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,1,0,1,0,1,0,0,0,0,0,1,0,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,0,1,1,0,0,1,1,1,0,0,1,0,1,0,0,0,1,1,1,1,1,0,1,0,1,1,0,0,1,0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,0,1,0,0,1,0,0,1,1,0,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1,1,0,1,0,0,0,1,0,0,0,0,1,1,1,1,0,0,1,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,1,1,0,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1,1]},__routerFilterDynamic:{numItems:15,errorRate:1e-4,numBits:288,numHashes:14,bitArray:[0,1,1,1,1,1,0,0,0,0,1,1,0,1,1,1,0,0,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,1,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,0,0,1,1,0,0,1,1,1,0,1,0,0,1,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,1,1,0,0,1,0,0,1,1,0,1,0,0,0,0,0,0,1,1,0,1,0,0,1,0,1,1,1,1,0,0,0,0,1,0,1,1,0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,1,1,0,0,0,1,0,0,1,1,0,1,1,1,1,1,0,0,0,1,1,0,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,0,1,1,1,1,0,0,1,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,1,1,1,1,0,1,1,0,0,1,1,1,1,0,0,1,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,0,0,1,0,1,1,1,1,1,0,0,1,0,1,0,1,1,0,0,0,0,0,1,0,0,0,1,1,1,0,0,1,0,1,1,0,1,1]},sortedPages:["/_app"]}}(void 0,"/api/v1/:path*","/api/v1","/api/v1/responses"),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();