ai-agent-router 0.2.0 → 0.2.2

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 (354) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +14 -0
  3. package/.next/build-manifest.json +2 -2
  4. package/.next/fallback-build-manifest.json +2 -2
  5. package/.next/next-server.js.nft.json +1 -1
  6. package/.next/prerender-manifest.json +3 -3
  7. package/.next/required-server-files.js +4 -4
  8. package/.next/required-server-files.json +4 -4
  9. package/.next/routes-manifest.json +84 -0
  10. package/.next/server/app/_global-error/page.js +1 -1
  11. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  12. package/.next/server/app/_global-error.html +2 -2
  13. package/.next/server/app/_global-error.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  16. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  18. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  19. package/.next/server/app/_not-found/page.js +2 -2
  20. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  21. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/_not-found.html +1 -1
  23. package/.next/server/app/_not-found.rsc +2 -2
  24. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  25. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  26. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  27. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  28. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  29. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  30. package/.next/server/app/api/config/route.js.nft.json +1 -1
  31. package/.next/server/app/api/gateway/[...path]/route.js.nft.json +1 -1
  32. package/.next/server/app/api/gateway/models/route.js.nft.json +1 -1
  33. package/.next/server/app/api/gateway/route.js.nft.json +1 -1
  34. package/.next/server/app/api/ide/claude/apply/route.js.nft.json +1 -1
  35. package/.next/server/app/api/ide/claude/available-models/route.js.nft.json +1 -1
  36. package/.next/server/app/api/ide/claude/restore/route.js.nft.json +1 -1
  37. package/.next/server/app/api/ide/claude/save/route.js.nft.json +1 -1
  38. package/.next/server/app/api/ide/claude/status/route.js.nft.json +1 -1
  39. package/.next/server/app/api/ide/claude/test/route.js +1 -1
  40. package/.next/server/app/api/ide/claude/test/route.js.nft.json +1 -1
  41. package/.next/server/app/api/ide/openclaw/apply/route/app-paths-manifest.json +3 -0
  42. package/.next/server/app/api/ide/openclaw/apply/route/build-manifest.json +11 -0
  43. package/.next/server/app/api/ide/openclaw/apply/route/server-reference-manifest.json +4 -0
  44. package/.next/server/app/api/ide/openclaw/apply/route.js +7 -0
  45. package/.next/server/app/api/ide/openclaw/apply/route.js.map +5 -0
  46. package/.next/server/app/api/ide/openclaw/apply/route.js.nft.json +1 -0
  47. package/.next/server/app/api/ide/openclaw/apply/route_client-reference-manifest.js +2 -0
  48. package/.next/server/app/api/ide/openclaw/available-models/route/app-paths-manifest.json +3 -0
  49. package/.next/server/app/api/ide/openclaw/available-models/route/build-manifest.json +11 -0
  50. package/.next/server/app/api/ide/openclaw/available-models/route/server-reference-manifest.json +4 -0
  51. package/.next/server/app/api/ide/openclaw/available-models/route.js +7 -0
  52. package/.next/server/app/api/ide/openclaw/available-models/route.js.map +5 -0
  53. package/.next/server/app/api/ide/openclaw/available-models/route.js.nft.json +1 -0
  54. package/.next/server/app/api/ide/openclaw/available-models/route_client-reference-manifest.js +2 -0
  55. package/.next/server/app/api/ide/openclaw/preview/route/app-paths-manifest.json +3 -0
  56. package/.next/server/app/api/ide/openclaw/preview/route/build-manifest.json +11 -0
  57. package/.next/server/app/api/ide/openclaw/preview/route/server-reference-manifest.json +4 -0
  58. package/.next/server/app/api/ide/openclaw/preview/route.js +7 -0
  59. package/.next/server/app/api/ide/openclaw/preview/route.js.map +5 -0
  60. package/.next/server/app/api/ide/openclaw/preview/route.js.nft.json +1 -0
  61. package/.next/server/app/api/ide/openclaw/preview/route_client-reference-manifest.js +2 -0
  62. package/.next/server/app/api/ide/openclaw/restore/route/app-paths-manifest.json +3 -0
  63. package/.next/server/app/api/ide/openclaw/restore/route/build-manifest.json +11 -0
  64. package/.next/server/app/api/ide/openclaw/restore/route/server-reference-manifest.json +4 -0
  65. package/.next/server/app/api/ide/openclaw/restore/route.js +6 -0
  66. package/.next/server/app/api/ide/openclaw/restore/route.js.map +5 -0
  67. package/.next/server/app/api/ide/openclaw/restore/route.js.nft.json +1 -0
  68. package/.next/server/app/api/ide/openclaw/restore/route_client-reference-manifest.js +2 -0
  69. package/.next/server/app/api/ide/openclaw/save/route/app-paths-manifest.json +3 -0
  70. package/.next/server/app/api/ide/openclaw/save/route/build-manifest.json +11 -0
  71. package/.next/server/app/api/ide/openclaw/save/route/server-reference-manifest.json +4 -0
  72. package/.next/server/app/api/ide/openclaw/save/route.js +7 -0
  73. package/.next/server/app/api/ide/openclaw/save/route.js.map +5 -0
  74. package/.next/server/app/api/ide/openclaw/save/route.js.nft.json +1 -0
  75. package/.next/server/app/api/ide/openclaw/save/route_client-reference-manifest.js +2 -0
  76. package/.next/server/app/api/ide/openclaw/status/route/app-paths-manifest.json +3 -0
  77. package/.next/server/app/api/ide/openclaw/status/route/build-manifest.json +11 -0
  78. package/.next/server/app/api/ide/openclaw/status/route/server-reference-manifest.json +4 -0
  79. package/.next/server/app/api/ide/openclaw/status/route.js +7 -0
  80. package/.next/server/app/api/ide/openclaw/status/route.js.map +5 -0
  81. package/.next/server/app/api/ide/openclaw/status/route.js.nft.json +1 -0
  82. package/.next/server/app/api/ide/openclaw/status/route_client-reference-manifest.js +2 -0
  83. package/.next/server/app/api/ide/openclaw/test/route/app-paths-manifest.json +3 -0
  84. package/.next/server/app/api/ide/openclaw/test/route/build-manifest.json +11 -0
  85. package/.next/server/app/api/ide/openclaw/test/route/server-reference-manifest.json +4 -0
  86. package/.next/server/app/api/ide/openclaw/test/route.js +6 -0
  87. package/.next/server/app/api/ide/openclaw/test/route.js.map +5 -0
  88. package/.next/server/app/api/ide/openclaw/test/route.js.nft.json +1 -0
  89. package/.next/server/app/api/ide/openclaw/test/route_client-reference-manifest.js +2 -0
  90. package/.next/server/app/api/ide/opencode/apply/route/app-paths-manifest.json +3 -0
  91. package/.next/server/app/api/ide/opencode/apply/route/build-manifest.json +11 -0
  92. package/.next/server/app/api/ide/opencode/apply/route/server-reference-manifest.json +4 -0
  93. package/.next/server/app/api/ide/opencode/apply/route.js +7 -0
  94. package/.next/server/app/api/ide/opencode/apply/route.js.map +5 -0
  95. package/.next/server/app/api/ide/opencode/apply/route.js.nft.json +1 -0
  96. package/.next/server/app/api/ide/opencode/apply/route_client-reference-manifest.js +2 -0
  97. package/.next/server/app/api/ide/opencode/available-models/route/app-paths-manifest.json +3 -0
  98. package/.next/server/app/api/ide/opencode/available-models/route/build-manifest.json +11 -0
  99. package/.next/server/app/api/ide/opencode/available-models/route/server-reference-manifest.json +4 -0
  100. package/.next/server/app/api/ide/opencode/available-models/route.js +7 -0
  101. package/.next/server/app/api/ide/opencode/available-models/route.js.map +5 -0
  102. package/.next/server/app/api/ide/opencode/available-models/route.js.nft.json +1 -0
  103. package/.next/server/app/api/ide/opencode/available-models/route_client-reference-manifest.js +2 -0
  104. package/.next/server/app/api/ide/opencode/preview/route/app-paths-manifest.json +3 -0
  105. package/.next/server/app/api/ide/opencode/preview/route/build-manifest.json +11 -0
  106. package/.next/server/app/api/ide/opencode/preview/route/server-reference-manifest.json +4 -0
  107. package/.next/server/app/api/ide/opencode/preview/route.js +7 -0
  108. package/.next/server/app/api/ide/opencode/preview/route.js.map +5 -0
  109. package/.next/server/app/api/ide/opencode/preview/route.js.nft.json +1 -0
  110. package/.next/server/app/api/ide/opencode/preview/route_client-reference-manifest.js +2 -0
  111. package/.next/server/app/api/ide/opencode/restore/route/app-paths-manifest.json +3 -0
  112. package/.next/server/app/api/ide/opencode/restore/route/build-manifest.json +11 -0
  113. package/.next/server/app/api/ide/opencode/restore/route/server-reference-manifest.json +4 -0
  114. package/.next/server/app/api/ide/opencode/restore/route.js +6 -0
  115. package/.next/server/app/api/ide/opencode/restore/route.js.map +5 -0
  116. package/.next/server/app/api/ide/opencode/restore/route.js.nft.json +1 -0
  117. package/.next/server/app/api/ide/opencode/restore/route_client-reference-manifest.js +2 -0
  118. package/.next/server/app/api/ide/opencode/save/route/app-paths-manifest.json +3 -0
  119. package/.next/server/app/api/ide/opencode/save/route/build-manifest.json +11 -0
  120. package/.next/server/app/api/ide/opencode/save/route/server-reference-manifest.json +4 -0
  121. package/.next/server/app/api/ide/opencode/save/route.js +7 -0
  122. package/.next/server/app/api/ide/opencode/save/route.js.map +5 -0
  123. package/.next/server/app/api/ide/opencode/save/route.js.nft.json +1 -0
  124. package/.next/server/app/api/ide/opencode/save/route_client-reference-manifest.js +2 -0
  125. package/.next/server/app/api/ide/opencode/status/route/app-paths-manifest.json +3 -0
  126. package/.next/server/app/api/ide/opencode/status/route/build-manifest.json +11 -0
  127. package/.next/server/app/api/ide/opencode/status/route/server-reference-manifest.json +4 -0
  128. package/.next/server/app/api/ide/opencode/status/route.js +7 -0
  129. package/.next/server/app/api/ide/opencode/status/route.js.map +5 -0
  130. package/.next/server/app/api/ide/opencode/status/route.js.nft.json +1 -0
  131. package/.next/server/app/api/ide/opencode/status/route_client-reference-manifest.js +2 -0
  132. package/.next/server/app/api/ide/opencode/test/route/app-paths-manifest.json +3 -0
  133. package/.next/server/app/api/ide/opencode/test/route/build-manifest.json +11 -0
  134. package/.next/server/app/api/ide/opencode/test/route/server-reference-manifest.json +4 -0
  135. package/.next/server/app/api/ide/opencode/test/route.js +6 -0
  136. package/.next/server/app/api/ide/opencode/test/route.js.map +5 -0
  137. package/.next/server/app/api/ide/opencode/test/route.js.nft.json +1 -0
  138. package/.next/server/app/api/ide/opencode/test/route_client-reference-manifest.js +2 -0
  139. package/.next/server/app/api/logs/route.js.nft.json +1 -1
  140. package/.next/server/app/api/models/route.js.nft.json +1 -1
  141. package/.next/server/app/api/providers/route.js.nft.json +1 -1
  142. package/.next/server/app/api/providers/test/route.js.nft.json +1 -1
  143. package/.next/server/app/api/service/force-stop/route.js.nft.json +1 -1
  144. package/.next/server/app/api/service/start/route.js.nft.json +1 -1
  145. package/.next/server/app/api/service/status/route.js.nft.json +1 -1
  146. package/.next/server/app/api/service/stop/route.js.nft.json +1 -1
  147. package/.next/server/app/ide/page.js +2 -2
  148. package/.next/server/app/ide/page.js.nft.json +1 -1
  149. package/.next/server/app/ide/page_client-reference-manifest.js +1 -1
  150. package/.next/server/app/ide.html +1 -1
  151. package/.next/server/app/ide.rsc +3 -3
  152. package/.next/server/app/ide.segments/_full.segment.rsc +3 -3
  153. package/.next/server/app/ide.segments/_head.segment.rsc +1 -1
  154. package/.next/server/app/ide.segments/_index.segment.rsc +2 -2
  155. package/.next/server/app/ide.segments/_tree.segment.rsc +2 -2
  156. package/.next/server/app/ide.segments/ide/__PAGE__.segment.rsc +2 -2
  157. package/.next/server/app/ide.segments/ide.segment.rsc +1 -1
  158. package/.next/server/app/index.html +1 -1
  159. package/.next/server/app/index.rsc +2 -2
  160. package/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  161. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  162. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  163. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  164. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  165. package/.next/server/app/logs/page.js +2 -2
  166. package/.next/server/app/logs/page.js.nft.json +1 -1
  167. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  168. package/.next/server/app/logs.html +1 -1
  169. package/.next/server/app/logs.rsc +3 -3
  170. package/.next/server/app/logs.segments/_full.segment.rsc +3 -3
  171. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  172. package/.next/server/app/logs.segments/_index.segment.rsc +2 -2
  173. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  174. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +2 -2
  175. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  176. package/.next/server/app/models/page.js +2 -2
  177. package/.next/server/app/models/page.js.nft.json +1 -1
  178. package/.next/server/app/models/page_client-reference-manifest.js +1 -1
  179. package/.next/server/app/models.html +1 -1
  180. package/.next/server/app/models.rsc +2 -2
  181. package/.next/server/app/models.segments/_full.segment.rsc +2 -2
  182. package/.next/server/app/models.segments/_head.segment.rsc +1 -1
  183. package/.next/server/app/models.segments/_index.segment.rsc +2 -2
  184. package/.next/server/app/models.segments/_tree.segment.rsc +2 -2
  185. package/.next/server/app/models.segments/models/__PAGE__.segment.rsc +1 -1
  186. package/.next/server/app/models.segments/models.segment.rsc +1 -1
  187. package/.next/server/app/page.js +2 -2
  188. package/.next/server/app/page.js.nft.json +1 -1
  189. package/.next/server/app/page_client-reference-manifest.js +1 -1
  190. package/.next/server/app/providers/page.js +2 -2
  191. package/.next/server/app/providers/page.js.nft.json +1 -1
  192. package/.next/server/app/providers/page_client-reference-manifest.js +1 -1
  193. package/.next/server/app/providers.html +1 -1
  194. package/.next/server/app/providers.rsc +2 -2
  195. package/.next/server/app/providers.segments/_full.segment.rsc +2 -2
  196. package/.next/server/app/providers.segments/_head.segment.rsc +1 -1
  197. package/.next/server/app/providers.segments/_index.segment.rsc +2 -2
  198. package/.next/server/app/providers.segments/_tree.segment.rsc +2 -2
  199. package/.next/server/app/providers.segments/providers/__PAGE__.segment.rsc +1 -1
  200. package/.next/server/app/providers.segments/providers.segment.rsc +1 -1
  201. package/.next/server/app-paths-manifest.json +14 -0
  202. package/.next/server/chunks/[root-of-the-server]__001d5756._.js +3 -0
  203. package/.next/server/chunks/[root-of-the-server]__001d5756._.js.map +1 -0
  204. package/.next/server/chunks/[root-of-the-server]__05f8578b._.js +3 -0
  205. package/.next/server/chunks/[root-of-the-server]__05f8578b._.js.map +1 -0
  206. package/.next/server/chunks/[root-of-the-server]__3a204d25._.js +1 -1
  207. package/.next/server/chunks/[root-of-the-server]__3a204d25._.js.map +1 -1
  208. package/.next/server/chunks/[root-of-the-server]__43810962._.js +3 -0
  209. package/.next/server/chunks/[root-of-the-server]__43810962._.js.map +1 -0
  210. package/.next/server/chunks/[root-of-the-server]__4a8f9bc7._.js +1 -1
  211. package/.next/server/chunks/[root-of-the-server]__4a8f9bc7._.js.map +1 -1
  212. package/.next/server/chunks/[root-of-the-server]__55cd88b8._.js +3 -0
  213. package/.next/server/chunks/[root-of-the-server]__55cd88b8._.js.map +1 -0
  214. package/.next/server/chunks/[root-of-the-server]__5e8276bc._.js +1 -1
  215. package/.next/server/chunks/[root-of-the-server]__5e8276bc._.js.map +1 -1
  216. package/.next/server/chunks/[root-of-the-server]__760eaa16._.js +3 -0
  217. package/.next/server/chunks/[root-of-the-server]__760eaa16._.js.map +1 -0
  218. package/.next/server/chunks/[root-of-the-server]__7c298a19._.js +3 -0
  219. package/.next/server/chunks/[root-of-the-server]__7c298a19._.js.map +1 -0
  220. package/.next/server/chunks/[root-of-the-server]__85540228._.js +3 -0
  221. package/.next/server/chunks/[root-of-the-server]__85540228._.js.map +1 -0
  222. package/.next/server/chunks/[root-of-the-server]__94fe8d3c._.js +3 -0
  223. package/.next/server/chunks/[root-of-the-server]__94fe8d3c._.js.map +1 -0
  224. package/.next/server/chunks/[root-of-the-server]__97622908._.js +3 -0
  225. package/.next/server/chunks/[root-of-the-server]__97622908._.js.map +1 -0
  226. package/.next/server/chunks/[root-of-the-server]__a02e6618._.js +3 -0
  227. package/.next/server/chunks/[root-of-the-server]__a02e6618._.js.map +1 -0
  228. package/.next/server/chunks/[root-of-the-server]__a32a20a7._.js +3 -0
  229. package/.next/server/chunks/[root-of-the-server]__a32a20a7._.js.map +1 -0
  230. package/.next/server/chunks/[root-of-the-server]__af5b556a._.js +3 -0
  231. package/.next/server/chunks/[root-of-the-server]__af5b556a._.js.map +1 -0
  232. package/.next/server/chunks/[root-of-the-server]__c1b4b601._.js +16 -16
  233. package/.next/server/chunks/[root-of-the-server]__c1b4b601._.js.map +1 -1
  234. package/.next/server/chunks/[root-of-the-server]__cafe113e._.js +3 -0
  235. package/.next/server/chunks/[root-of-the-server]__cafe113e._.js.map +1 -0
  236. package/.next/server/chunks/[root-of-the-server]__dc8b0bed._.js +3 -0
  237. package/.next/server/chunks/[root-of-the-server]__dc8b0bed._.js.map +1 -0
  238. package/.next/server/chunks/[root-of-the-server]__f0461b8d._.js +1 -1
  239. package/.next/server/chunks/[root-of-the-server]__f0461b8d._.js.map +1 -1
  240. package/.next/server/chunks/[root-of-the-server]__f8949f88._.js +1 -1
  241. package/.next/server/chunks/[root-of-the-server]__f8949f88._.js.map +1 -1
  242. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_apply_route_actions_2cb9e4b4.js +3 -0
  243. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_apply_route_actions_2cb9e4b4.js.map +1 -0
  244. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_preview_route_actions_9814a8e4.js +3 -0
  245. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_preview_route_actions_9814a8e4.js.map +1 -0
  246. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_restore_route_actions_10ad8f9d.js +3 -0
  247. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_restore_route_actions_10ad8f9d.js.map +1 -0
  248. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_save_route_actions_044ad081.js +3 -0
  249. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_save_route_actions_044ad081.js.map +1 -0
  250. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_status_route_actions_ed9786d2.js +3 -0
  251. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_status_route_actions_ed9786d2.js.map +1 -0
  252. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_test_route_actions_ce2cb808.js +3 -0
  253. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_test_route_actions_ce2cb808.js.map +1 -0
  254. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_apply_route_actions_6c422244.js +3 -0
  255. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_apply_route_actions_6c422244.js.map +1 -0
  256. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_preview_route_actions_256c82e0.js +3 -0
  257. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_preview_route_actions_256c82e0.js.map +1 -0
  258. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_restore_route_actions_371993d3.js +3 -0
  259. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_restore_route_actions_371993d3.js.map +1 -0
  260. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_save_route_actions_6e4c9c41.js +3 -0
  261. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_save_route_actions_6e4c9c41.js.map +1 -0
  262. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_status_route_actions_498ad77b.js +3 -0
  263. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_status_route_actions_498ad77b.js.map +1 -0
  264. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_test_route_actions_c71be510.js +3 -0
  265. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_test_route_actions_c71be510.js.map +1 -0
  266. package/.next/server/chunks/ce889_server_app_api_ide_openclaw_available-models_route_actions_e568e70b.js +3 -0
  267. package/.next/server/chunks/ce889_server_app_api_ide_openclaw_available-models_route_actions_e568e70b.js.map +1 -0
  268. package/.next/server/chunks/ce889_server_app_api_ide_opencode_available-models_route_actions_95230db3.js +3 -0
  269. package/.next/server/chunks/ce889_server_app_api_ide_opencode_available-models_route_actions_95230db3.js.map +1 -0
  270. package/.next/server/chunks/ssr/{[root-of-the-server]__bec95712._.js → [root-of-the-server]__81937253._.js} +2 -2
  271. package/.next/server/chunks/ssr/{[root-of-the-server]__bec95712._.js.map → [root-of-the-server]__81937253._.js.map} +1 -1
  272. package/.next/server/chunks/ssr/{[root-of-the-server]__71c85955._.js → [root-of-the-server]__976ad963._.js} +2 -2
  273. package/.next/server/chunks/ssr/{[root-of-the-server]__71c85955._.js.map → [root-of-the-server]__976ad963._.js.map} +1 -1
  274. package/.next/server/chunks/ssr/_69468f4c._.js +3 -0
  275. package/.next/server/chunks/ssr/_69468f4c._.js.map +1 -0
  276. package/.next/server/chunks/ssr/src_app_ide_page_tsx_8962793b._.js +1 -1
  277. package/.next/server/chunks/ssr/src_app_ide_page_tsx_8962793b._.js.map +1 -1
  278. package/.next/server/chunks/ssr/src_app_logs_page_tsx_7b7b7b83._.js +1 -1
  279. package/.next/server/chunks/ssr/src_app_logs_page_tsx_7b7b7b83._.js.map +1 -1
  280. package/.next/server/pages/404.html +1 -1
  281. package/.next/server/pages/500.html +2 -2
  282. package/.next/server/server-reference-manifest.js +1 -1
  283. package/.next/server/server-reference-manifest.json +1 -1
  284. package/.next/static/chunks/64f547b3bcd3aef4.js +1 -0
  285. package/.next/static/chunks/6992685fe009e8fd.css +1 -0
  286. package/.next/static/chunks/{b6b258e8582e47c4.js → 7c8b7cbb3339f139.js} +1 -1
  287. package/.next/static/chunks/8ccc14e022ff6de3.js +1 -0
  288. package/.next/types/routes.d.ts +15 -1
  289. package/.next/types/validator.ts +126 -0
  290. package/README.md +31 -4
  291. package/dist/.next/dev/types/validator.js +56 -0
  292. package/dist/.next/types/validator.js +56 -0
  293. package/dist/package.json +55 -0
  294. package/dist/src/app/api/config/route.js +17 -0
  295. package/dist/src/app/api/ide/claude/apply/route.js +126 -31
  296. package/dist/src/app/api/ide/claude/restore/route.js +30 -0
  297. package/dist/src/app/api/ide/claude/save/route.js +79 -0
  298. package/dist/src/app/api/ide/claude/status/route.js +6 -1
  299. package/dist/src/app/api/ide/openclaw/apply/route.js +92 -0
  300. package/dist/src/app/api/ide/openclaw/available-models/route.js +46 -0
  301. package/dist/src/app/api/ide/openclaw/build-config.js +101 -0
  302. package/dist/src/app/api/ide/openclaw/preview/route.js +49 -0
  303. package/dist/src/app/api/ide/openclaw/restore/route.js +24 -0
  304. package/dist/src/app/api/ide/openclaw/save/route.js +54 -0
  305. package/dist/src/app/api/ide/openclaw/status/route.js +139 -0
  306. package/dist/src/app/api/ide/openclaw/test/route.js +158 -0
  307. package/dist/src/app/api/ide/opencode/apply/route.js +89 -0
  308. package/dist/src/app/api/ide/opencode/available-models/route.js +46 -0
  309. package/dist/src/app/api/ide/opencode/build-config.js +54 -0
  310. package/dist/src/app/api/ide/opencode/preview/route.js +36 -0
  311. package/dist/src/app/api/ide/opencode/restore/route.js +40 -0
  312. package/dist/src/app/api/ide/opencode/save/route.js +123 -0
  313. package/dist/src/app/api/ide/opencode/status/route.js +106 -0
  314. package/dist/src/app/api/ide/opencode/test/route.js +136 -0
  315. package/dist/src/app/components/Footer.js +11 -0
  316. package/dist/src/app/ide/page.js +651 -81
  317. package/dist/src/app/layout.js +5 -1
  318. package/dist/src/app/logs/page.js +4 -2
  319. package/dist/src/db/database.js +44 -8
  320. package/package.json +1 -1
  321. package/src/app/api/config/route.ts +17 -0
  322. package/src/app/api/ide/claude/apply/route.ts +140 -31
  323. package/src/app/api/ide/claude/restore/route.ts +36 -1
  324. package/src/app/api/ide/claude/save/route.ts +91 -1
  325. package/src/app/api/ide/claude/status/route.ts +12 -2
  326. package/src/app/api/ide/openclaw/apply/route.ts +103 -0
  327. package/src/app/api/ide/openclaw/available-models/route.ts +59 -0
  328. package/src/app/api/ide/openclaw/build-config.ts +152 -0
  329. package/src/app/api/ide/openclaw/preview/route.ts +57 -0
  330. package/src/app/api/ide/openclaw/restore/route.ts +27 -0
  331. package/src/app/api/ide/openclaw/save/route.ts +67 -0
  332. package/src/app/api/ide/openclaw/status/route.ts +178 -0
  333. package/src/app/api/ide/openclaw/test/route.ts +194 -0
  334. package/src/app/api/ide/opencode/apply/route.ts +92 -0
  335. package/src/app/api/ide/opencode/available-models/route.ts +59 -0
  336. package/src/app/api/ide/opencode/build-config.ts +69 -0
  337. package/src/app/api/ide/opencode/preview/route.ts +40 -0
  338. package/src/app/api/ide/opencode/restore/route.ts +52 -0
  339. package/src/app/api/ide/opencode/save/route.ts +131 -0
  340. package/src/app/api/ide/opencode/status/route.ts +128 -0
  341. package/src/app/api/ide/opencode/test/route.ts +145 -0
  342. package/src/app/components/Footer.tsx +9 -0
  343. package/src/app/globals.css +17 -0
  344. package/src/app/ide/page.tsx +1587 -118
  345. package/src/app/layout.tsx +3 -1
  346. package/src/app/logs/page.tsx +4 -2
  347. package/src/db/database.ts +55 -8
  348. package/.next/server/chunks/ssr/src_app_b2b1d928._.js +0 -3
  349. package/.next/server/chunks/ssr/src_app_b2b1d928._.js.map +0 -1
  350. package/.next/static/chunks/6418ca50028376b7.css +0 -1
  351. package/.next/static/chunks/9ec3b97741b6575e.js +0 -1
  352. /package/.next/static/{ryTeHAYUvjT1bYolc-x9Z → cf2SWIkI5HVbnDjLExI42}/_buildManifest.js +0 -0
  353. /package/.next/static/{ryTeHAYUvjT1bYolc-x9Z → cf2SWIkI5HVbnDjLExI42}/_clientMiddlewareManifest.json +0 -0
  354. /package/.next/static/{ryTeHAYUvjT1bYolc-x9Z → cf2SWIkI5HVbnDjLExI42}/_ssgManifest.js +0 -0
@@ -1,3 +1,3 @@
1
- module.exports=[82602,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(81844),e=a.i(21215),f=a.i(71862);function g(){let[a,g]=(0,c.useState)([]),[h,i]=(0,c.useState)(null),[j,k]=(0,c.useState)(!0),[l,m]=(0,c.useState)(0),[n,o]=(0,c.useState)(0),[p,q]=(0,c.useState)([]),[r,s]=(0,c.useState)(!1),[t,u]=(0,c.useState)(null),[v,w]=(0,c.useState)(""),[x,y]=(0,c.useState)(""),{showToast:z}=(0,e.useToast)(),A=async a=>{try{await navigator.clipboard.writeText(a),z("已复制到剪贴板","success")}catch{z("复制失败,请手动复制","error")}},B=async()=>{0!==p.length&&u({open:!0,title:"删除确认",message:`确定要删除选中的 ${p.length} 条日志吗?`,onConfirm:async()=>{try{let a=await fetch(`/api/logs?ids=${p.join(",")}`,{method:"DELETE"}),b=await a.json();a.ok?(q([]),s(!1),D(),z("删除成功","success"),u(null)):z("删除失败:"+(b.error||"未知错误"),"error")}catch(a){console.error("Failed to delete logs:",a),z("删除失败","error")}}})},C=async()=>{u({open:!0,title:"清空日志",message:"确定要清空所有日志吗?此操作不可恢复!",onConfirm:async()=>{try{let a=await fetch("/api/logs?clear_all=true",{method:"DELETE"}),b=await a.json();a.ok?(m(0),q([]),s(!1),D(),z("清空成功","success"),u(null)):z("清空失败:"+(b.error||"未知错误"),"error")}catch(a){console.error("Failed to clear logs:",a),z("清空失败","error")}}})},D=async a=>{try{k(!0);let b=new URLSearchParams({limit:"50",offset:(50*l).toString()});a&&b.set("search",a);let c=await fetch(`/api/logs?${b.toString()}`),d=await c.json();g(d.logs||[]),o(d.total||0)}catch(a){console.error("Failed to load logs:",a),z("加载日志失败","error")}finally{k(!1)}},E=()=>{w(x),m(0),D(x)};(0,c.useEffect)(()=>{D()},[l,50]);let F=a=>"string"==typeof a?a:JSON.stringify(a),G=a=>I(a)?H(a):F(a),H=a=>{let b;if(!a)return"";try{b=JSON.parse(a)}catch{b=a}if(!b.includes("data:")||!b.includes("\n\n"))try{let a=JSON.parse(b);return JSON.stringify(a)}catch{return String(b)}let c=b.split("\n\n").filter(a=>a.trim()),d=[];for(let a of c){let b=a.trim();b=b.split("\n").map(a=>a.startsWith("data: ")?a.substring(6):a).join("\n"),d.push(b)}return d.join("\n\n")},I=a=>{if(!a)return!1;let b=a.includes("data:"),c=a.includes("\n\n"),d=a.includes("event:");return b||c||d};return j?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(d.default,{}),(0,b.jsx)("div",{className:"min-h-screen flex items-center justify-center",children:(0,b.jsx)("div",{className:"text-lg",children:"加载中..."})})]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(d.default,{}),(0,b.jsx)("main",{className:"max-w-6xl mx-auto py-6 sm:px-6 lg:px-8",children:(0,b.jsxs)("div",{className:"px-4 py-4 sm:px-0",children:[(0,b.jsxs)("div",{className:"mb-5 flex items-center justify-between",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-lg font-bold text-slate-800",children:"请求日志"}),(0,b.jsx)("p",{className:"text-xs text-slate-500 mt-1",children:"查看所有 API 请求记录和响应详情"})]}),(0,b.jsxs)("div",{className:"flex gap-2 items-center",children:[(0,b.jsxs)("div",{className:"relative group",children:[(0,b.jsx)("input",{type:"text",placeholder:"搜索日志...",value:x,onChange:a=>y(a.target.value),onKeyPress:a=>{"Enter"===a.key&&E()},className:"w-64 pl-9 pr-20 py-1.5 text-xs border border-slate-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-emerald-500/30 focus:border-emerald-500 transition-all"}),(0,b.jsx)("svg",{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,b.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"})}),(0,b.jsx)("div",{className:"absolute right-2 top-1/2 -translate-y-1/2 flex items-center gap-1",children:x?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("button",{onClick:E,className:"p-0.5 text-emerald-500 hover:text-emerald-600 hover:bg-emerald-50 rounded transition-colors",title:"确认搜索",children:(0,b.jsx)("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,b.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})})}),(0,b.jsx)("button",{onClick:()=>{y(""),v&&(w(""),m(0),D())},className:"p-0.5 text-slate-400 hover:text-rose-500 hover:bg-rose-50 rounded transition-colors",title:"清除搜索",children:(0,b.jsx)("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,b.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]}):null})]}),p.length>0&&(0,b.jsxs)("button",{onClick:B,className:"px-3 py-1.5 bg-rose-600 hover:bg-rose-700 text-white text-xs font-semibold rounded-lg border border-rose-200 transition-all duration-300",children:["删除选中 (",p.length,")"]}),(0,b.jsx)("button",{onClick:C,className:"px-3 py-1.5 bg-slate-600 hover:bg-slate-700 text-white text-xs font-semibold rounded-lg border border-slate-200 transition-all duration-300",children:"清空所有"})]})]}),(0,b.jsx)("div",{className:"bg-white/70 backdrop-blur-sm shadow-md rounded-2xl border border-emerald-100/50 overflow-hidden",children:(0,b.jsxs)("table",{className:"min-w-full divide-y divide-slate-100",children:[(0,b.jsx)("thead",{className:"bg-emerald-50/30",children:(0,b.jsxs)("tr",{children:[(0,b.jsx)("th",{className:"px-4 py-3.5 w-10",children:(0,b.jsx)("input",{type:"checkbox",checked:r&&a.length>0,onChange:b=>{var c;s(c=b.target.checked),q(c?a.map(a=>a.id):[])},className:"w-4 h-4 rounded border-slate-300 text-emerald-600 focus:ring-emerald-500"})}),(0,b.jsx)("th",{className:"px-4 py-2.5 text-left text-xs font-semibold text-slate-600 uppercase tracking-wider",children:"时间"}),(0,b.jsx)("th",{className:"px-6 py-3.5 text-left text-xs font-semibold text-gray-700 uppercase tracking-wider",children:"模型"}),(0,b.jsx)("th",{className:"px-6 py-3.5 text-left text-xs font-semibold text-gray-700 uppercase tracking-wider",children:"方法"}),(0,b.jsx)("th",{className:"px-6 py-3.5 text-left text-xs font-semibold text-gray-700 uppercase tracking-wider",children:"路径"}),(0,b.jsx)("th",{className:"px-6 py-3.5 text-left text-xs font-semibold text-gray-700 uppercase tracking-wider",children:"状态"}),(0,b.jsx)("th",{className:"px-6 py-3.5 text-left text-xs font-semibold text-gray-700 uppercase tracking-wider",children:"响应时间"}),(0,b.jsx)("th",{className:"px-6 py-3.5 text-right text-xs font-semibold text-gray-700 uppercase tracking-wider",children:"操作"})]})}),(0,b.jsx)("tbody",{className:"bg-white divide-y divide-slate-100",children:0===a.length?(0,b.jsx)("tr",{children:(0,b.jsx)("td",{colSpan:8,className:"px-4 py-12 text-center",children:(0,b.jsxs)("div",{className:"text-slate-400",children:[(0,b.jsx)("svg",{className:"mx-auto h-10 w-10 mb-3 text-slate-300",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,b.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.5,d:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})}),(0,b.jsx)("p",{className:"text-xs text-slate-500",children:v?"未找到匹配的日志":"暂无日志记录"}),v&&(0,b.jsx)("button",{onClick:()=>{y(""),w("")},className:"mt-2 text-xs text-emerald-600 hover:text-emerald-700",children:"清除搜索"})]})})}):a.map(a=>{let c=((a,b)=>{try{let c=a?JSON.parse(a):{},d=(b?JSON.parse(b):{}).model||c.model;if(Array.isArray(d)){let a=d[d.length-1];if(a&&"object"==typeof a&&"model"in a)return a.model}return"string"==typeof d?d:null}catch{return null}})(a.request_query,a.request_body)||a.model_name||"Gateway";return(0,b.jsxs)("tr",{className:"hover:bg-emerald-50/20 transition-colors duration-300",children:[(0,b.jsx)("td",{className:"px-4 py-3",children:(0,b.jsx)("input",{type:"checkbox",checked:p.includes(a.id),onChange:b=>{var c;return c=a.id,void(b.target.checked?q([...p,c]):(q(p.filter(a=>a!==c)),s(!1)))},className:"w-4 h-4 rounded border-slate-300 text-emerald-600 focus:ring-emerald-500",onClick:a=>a.stopPropagation()})}),(0,b.jsx)("td",{className:"px-4 py-3 whitespace-nowrap",children:(0,b.jsx)("div",{className:"text-xs text-slate-600",children:function(a){if(!a||"string"!=typeof a)return"";let b=a.trim();if(!b)return"";let c=new Date(/[Z+-]\d{2}:?\d{2}$/.test(b)?b:b.replace(" ","T")+"Z");return Number.isNaN(c.getTime())?b:c.toLocaleString("zh-CN")}(a.created_at)})}),(0,b.jsx)("td",{className:"px-4 py-3 whitespace-nowrap",children:(0,b.jsxs)("div",{className:"text-xs",children:[(0,b.jsx)("div",{className:"font-medium text-slate-800",children:c}),a.provider_name&&(0,b.jsx)("div",{className:"text-[10px] text-slate-500",children:a.provider_name})]})}),(0,b.jsx)("td",{className:"px-4 py-3 whitespace-nowrap",children:(0,b.jsx)("span",{className:`px-2 py-0.5 inline-flex text-xs leading-4 font-semibold rounded-lg border ${"GET"===a.request_method?"bg-sky-50 text-sky-700 border-sky-200/50":"POST"===a.request_method?"bg-emerald-50 text-emerald-700 border-emerald-200/50":"bg-slate-50 text-slate-600 border-slate-200/50"}`,children:a.request_method})}),(0,b.jsx)("td",{className:"px-4 py-3",children:(0,b.jsx)("div",{className:"text-xs text-slate-600 font-mono max-w-xs truncate",children:a.request_path})}),(0,b.jsx)("td",{className:"px-4 py-3 whitespace-nowrap",children:(0,b.jsx)("span",{className:`px-2 py-0.5 inline-flex text-xs leading-4 font-semibold rounded-full border ${a.response_status>=200&&a.response_status<300?"bg-emerald-100/80 text-emerald-700 border-emerald-200/50":a.response_status>=400&&a.response_status<500?"bg-amber-100/80 text-amber-700 border-amber-200/50":a.response_status>=500?"bg-rose-100/80 text-rose-700 border-rose-200/50":"bg-slate-100/80 text-slate-600 border-slate-200/50"}`,children:a.response_status})}),(0,b.jsx)("td",{className:"px-4 py-3 whitespace-nowrap",children:(0,b.jsxs)("div",{className:"text-xs text-slate-600",children:[a.response_time_ms,"ms"]})}),(0,b.jsx)("td",{className:"px-4 py-3 whitespace-nowrap text-right text-xs font-medium",children:(0,b.jsx)("button",{onClick:()=>i(a),className:"text-emerald-600 hover:text-emerald-700 font-medium transition-colors duration-300",children:"查看详情"})})]},a.id)})})]})}),(0,b.jsxs)("div",{className:"mt-5 flex items-center justify-between",children:[(0,b.jsx)("div",{className:"text-xs text-slate-600",children:v?(0,b.jsxs)("span",{children:['搜索 "',(0,b.jsx)("span",{className:"font-semibold text-slate-800",children:v}),'" 找到 ',(0,b.jsx)("span",{className:"font-semibold text-slate-800",children:n})," 条结果"]}):(0,b.jsxs)("span",{children:["共 ",(0,b.jsx)("span",{className:"font-semibold text-slate-800",children:n})," 条记录"]})}),(0,b.jsxs)("div",{className:"flex space-x-2",children:[(0,b.jsx)("button",{onClick:()=>m(Math.max(0,l-1)),disabled:0===l,className:"px-3 py-1.5 border border-slate-200 rounded-lg text-xs font-medium text-slate-600 bg-white hover:bg-slate-50 disabled:opacity-50 disabled:cursor-not-allowed transition-all duration-300",children:"上一页"}),(0,b.jsx)("button",{onClick:()=>m(l+1),disabled:(l+1)*50>=n,className:"px-3 py-1.5 border border-slate-200 rounded-lg text-xs font-medium text-slate-600 bg-white hover:bg-slate-50 disabled:opacity-50 disabled:cursor-not-allowed transition-all duration-300",children:"下一页"})]})]})]})}),h&&(0,b.jsx)("div",{className:"fixed z-50 inset-0 overflow-y-auto",children:(0,b.jsxs)("div",{className:"flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-slate-900/40 backdrop-blur-sm transition-opacity",onClick:()=>i(null)}),(0,b.jsx)("div",{className:"inline-block align-bottom bg-white rounded-2xl text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-3xl sm:w-full border border-emerald-100/50",children:(0,b.jsxs)("div",{className:"bg-white px-6 pt-5 pb-4 sm:p-6",children:[(0,b.jsxs)("div",{className:"mb-5",children:[(0,b.jsx)("h3",{className:"text-base font-bold text-slate-800 mb-1",children:"请求详情"}),(0,b.jsx)("p",{className:"text-xs text-slate-500",children:"查看完整的请求和响应信息"})]}),(0,b.jsxs)("div",{className:"space-y-4 max-h-[60vh] overflow-y-auto",children:[(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,b.jsx)("h4",{className:"text-xs font-semibold text-slate-700",children:"请求头"}),(0,b.jsx)("button",{onClick:()=>A(F(h.request_headers)),className:"px-2 py-0.5 text-xs text-emerald-600 hover:text-emerald-700 font-medium transition-colors",children:"复制"})]}),(0,b.jsx)("pre",{className:"bg-slate-50/80 border border-slate-200 p-3 rounded-xl text-[10px] overflow-x-auto font-mono text-slate-700",children:F(h.request_headers)})]}),(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,b.jsx)("h4",{className:"text-xs font-semibold text-slate-700",children:"请求 Query"}),(0,b.jsx)("button",{onClick:()=>A(F(h.request_query)),className:"px-2 py-0.5 text-xs text-emerald-600 hover:text-emerald-700 font-medium transition-colors",children:"复制"})]}),(0,b.jsx)("pre",{className:"bg-slate-50/80 border border-slate-200 p-3 rounded-xl text-[10px] overflow-x-auto font-mono text-slate-700",children:F(h.request_query)})]}),(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,b.jsx)("h4",{className:"text-xs font-semibold text-slate-700",children:"请求 Body"}),(0,b.jsx)("button",{onClick:()=>A(F(h.request_body)),className:"px-2 py-0.5 text-xs text-emerald-600 hover:text-emerald-700 font-medium transition-colors",children:"复制"})]}),(0,b.jsx)("pre",{className:"bg-slate-50/80 border border-slate-200 p-3 rounded-xl text-[10px] overflow-x-auto font-mono text-slate-700",children:F(h.request_body)})]}),(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,b.jsx)("h4",{className:"text-xs font-semibold text-slate-700",children:"响应 Body"}),(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[h&&I(h.response_body)&&(0,b.jsx)("span",{className:"px-2 py-0.5 text-xs bg-indigo-100 text-indigo-700 rounded-full border border-indigo-200",children:"流式响应"}),(0,b.jsx)("button",{onClick:()=>A(G(h.response_body)),className:"px-2 py-0.5 text-xs text-emerald-600 hover:text-emerald-700 font-medium transition-colors",children:"复制"})]})]}),(0,b.jsx)("div",{className:"bg-slate-50/80 border border-slate-200 rounded-xl p-3 max-h-96 overflow-auto",children:(0,b.jsx)("pre",{className:"bg-slate-50/80 border border-slate-200 p-3 rounded-xl text-[10px] overflow-x-auto font-mono text-slate-700",children:G(h.response_body)})})]})]}),(0,b.jsx)("div",{className:"mt-5 flex justify-end",children:(0,b.jsx)("button",{type:"button",onClick:()=>i(null),className:"px-4 py-1.5 border border-slate-200 rounded-lg text-xs font-semibold text-slate-600 bg-white hover:bg-slate-50 focus:outline-none focus:ring-2 focus:ring-offset-1 focus:ring-slate-400/30 transition-all duration-300",children:"关闭"})})]})})]})}),t&&(0,b.jsx)(f.default,{open:t.open,title:t.title,message:t.message,onConfirm:t.onConfirm,onCancel:()=>u(null),type:"danger"})]})}a.s(["default",()=>g])}];
1
+ module.exports=[82602,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(81844),e=a.i(21215),f=a.i(71862);function g(){let[a,g]=(0,c.useState)([]),[h,i]=(0,c.useState)(null),[j,k]=(0,c.useState)(!0),[l,m]=(0,c.useState)(0),[n,o]=(0,c.useState)(0),[p,q]=(0,c.useState)([]),[r,s]=(0,c.useState)(!1),[t,u]=(0,c.useState)(null),[v,w]=(0,c.useState)(""),[x,y]=(0,c.useState)(""),{showToast:z}=(0,e.useToast)(),A=async a=>{try{await navigator.clipboard.writeText(a),z("已复制到剪贴板","success")}catch{z("复制失败,请手动复制","error")}},B=async()=>{0!==p.length&&u({open:!0,title:"删除确认",message:`确定要删除选中的 ${p.length} 条日志吗?`,onConfirm:async()=>{try{let a=await fetch(`/api/logs?ids=${p.join(",")}`,{method:"DELETE"}),b=await a.json();a.ok?(q([]),s(!1),D(),z("删除成功","success"),u(null)):z("删除失败:"+(b.error||"未知错误"),"error")}catch(a){console.error("Failed to delete logs:",a),z("删除失败","error")}}})},C=async()=>{u({open:!0,title:"清空日志",message:"确定要清空所有日志吗?此操作不可恢复!",onConfirm:async()=>{try{let a=await fetch("/api/logs?clear_all=true",{method:"DELETE"}),b=await a.json();a.ok?(m(0),q([]),s(!1),D(),z("清空成功","success"),u(null)):z("清空失败:"+(b.error||"未知错误"),"error")}catch(a){console.error("Failed to clear logs:",a),z("清空失败","error")}}})},D=async a=>{try{k(!0);let b=new URLSearchParams({limit:"50",offset:(50*l).toString()});a&&b.set("search",a);let c=await fetch(`/api/logs?${b.toString()}`),d=await c.json();g(d.logs||[]),o(d.total||0)}catch(a){console.error("Failed to load logs:",a),z("加载日志失败","error")}finally{k(!1)}},E=()=>{w(x),m(0),D(x)};(0,c.useEffect)(()=>{D()},[l,50]);let F=a=>"string"==typeof a?a:JSON.stringify(a),G=a=>I(a)?H(a):F(a),H=a=>{let b;if(!a)return"";try{b=JSON.parse(a)}catch{b=a}if(!b.includes("data:")||!b.includes("\n\n"))try{let a=JSON.parse(b);return JSON.stringify(a)}catch{return String(b)}let c=b.split("\n\n").filter(a=>a.trim()),d=[];for(let a of c){let b=a.trim();b=b.split("\n").map(a=>a.startsWith("data: ")?a.substring(6):a).join("\n"),d.push(b)}return d.join("\n\n")},I=a=>{if(!a)return!1;let b=a.includes("data:"),c=a.includes("\n\n"),d=a.includes("event:");return b||c||d};return j?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(d.default,{}),(0,b.jsx)("div",{className:"min-h-screen flex items-center justify-center",children:(0,b.jsx)("div",{className:"text-lg",children:"加载中..."})})]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(d.default,{}),(0,b.jsx)("main",{className:"max-w-6xl mx-auto py-6 sm:px-6 lg:px-8",children:(0,b.jsxs)("div",{className:"px-4 py-4 sm:px-0",children:[(0,b.jsxs)("div",{className:"mb-5 flex items-center justify-between",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-lg font-bold text-slate-800",children:"请求日志"}),(0,b.jsx)("p",{className:"text-xs text-slate-500 mt-1",children:"查看所有 API 请求记录和响应详情"})]}),(0,b.jsxs)("div",{className:"flex gap-2 items-center",children:[(0,b.jsxs)("div",{className:"relative group",children:[(0,b.jsx)("input",{type:"text",placeholder:"搜索日志...",value:x,onChange:a=>y(a.target.value),onKeyPress:a=>{"Enter"===a.key&&E()},className:"w-64 pl-9 pr-20 py-1.5 text-xs border border-slate-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-emerald-500/30 focus:border-emerald-500 transition-all"}),(0,b.jsx)("svg",{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,b.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"})}),(0,b.jsx)("div",{className:"absolute right-2 top-1/2 -translate-y-1/2 flex items-center gap-1",children:x?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("button",{onClick:E,className:"p-0.5 text-emerald-500 hover:text-emerald-600 hover:bg-emerald-50 rounded transition-colors",title:"确认搜索",children:(0,b.jsx)("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,b.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})})}),(0,b.jsx)("button",{onClick:()=>{y(""),v&&(w(""),m(0),D())},className:"p-0.5 text-slate-400 hover:text-rose-500 hover:bg-rose-50 rounded transition-colors",title:"清除搜索",children:(0,b.jsx)("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,b.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]}):null})]}),p.length>0&&(0,b.jsxs)("button",{onClick:B,className:"px-3 py-1.5 bg-rose-600 hover:bg-rose-700 text-white text-xs font-semibold rounded-lg border border-rose-200 transition-all duration-300",children:["删除选中 (",p.length,")"]}),(0,b.jsx)("button",{onClick:C,className:"px-3 py-1.5 bg-slate-600 hover:bg-slate-700 text-white text-xs font-semibold rounded-lg border border-slate-200 transition-all duration-300",children:"清空所有"})]})]}),(0,b.jsx)("div",{className:"bg-white/70 backdrop-blur-sm shadow-md rounded-2xl border border-emerald-100/50 overflow-hidden",children:(0,b.jsxs)("table",{className:"min-w-full divide-y divide-slate-100",children:[(0,b.jsx)("thead",{className:"bg-emerald-50/30",children:(0,b.jsxs)("tr",{children:[(0,b.jsx)("th",{className:"px-4 py-3.5 w-10",children:(0,b.jsx)("input",{type:"checkbox",checked:r&&a.length>0,onChange:b=>{var c;s(c=b.target.checked),q(c?a.map(a=>a.id):[])},className:"w-4 h-4 rounded border-slate-300 text-emerald-600 focus:ring-emerald-500"})}),(0,b.jsx)("th",{className:"px-4 py-2.5 text-left text-xs font-semibold text-slate-600 uppercase tracking-wider",children:"时间"}),(0,b.jsx)("th",{className:"px-6 py-3.5 text-left text-xs font-semibold text-gray-700 uppercase tracking-wider",children:"模型"}),(0,b.jsx)("th",{className:"px-6 py-3.5 text-left text-xs font-semibold text-gray-700 uppercase tracking-wider",children:"方法"}),(0,b.jsx)("th",{className:"px-6 py-3.5 text-left text-xs font-semibold text-gray-700 uppercase tracking-wider",children:"路径"}),(0,b.jsx)("th",{className:"px-6 py-3.5 text-left text-xs font-semibold text-gray-700 uppercase tracking-wider",children:"状态"}),(0,b.jsx)("th",{className:"px-6 py-3.5 text-left text-xs font-semibold text-gray-700 uppercase tracking-wider",children:"响应时间"}),(0,b.jsx)("th",{className:"px-6 py-3.5 text-right text-xs font-semibold text-gray-700 uppercase tracking-wider",children:"操作"})]})}),(0,b.jsx)("tbody",{className:"bg-white divide-y divide-slate-100",children:0===a.length?(0,b.jsx)("tr",{children:(0,b.jsx)("td",{colSpan:8,className:"px-4 py-12 text-center",children:(0,b.jsxs)("div",{className:"text-slate-400",children:[(0,b.jsx)("svg",{className:"mx-auto h-10 w-10 mb-3 text-slate-300",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,b.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.5,d:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})}),(0,b.jsx)("p",{className:"text-xs text-slate-500",children:v?"未找到匹配的日志":"暂无日志记录"}),v&&(0,b.jsx)("button",{onClick:()=>{y(""),w("")},className:"mt-2 text-xs text-emerald-600 hover:text-emerald-700",children:"清除搜索"})]})})}):a.map(a=>{let c=((a,b)=>{try{let c=a?JSON.parse(a):{},d=(b?JSON.parse(b):{}).model||c.model;if(Array.isArray(d)){let a=d[d.length-1];if(a&&"object"==typeof a&&"model"in a)return a.model}return"string"==typeof d?d:null}catch{return null}})(a.request_query,a.request_body)||a.model_name||"Gateway";return(0,b.jsxs)("tr",{className:"hover:bg-emerald-50/20 transition-colors duration-300",children:[(0,b.jsx)("td",{className:"px-4 py-3",children:(0,b.jsx)("input",{type:"checkbox",checked:p.includes(a.id),onChange:b=>{var c;return c=a.id,void(b.target.checked?q([...p,c]):(q(p.filter(a=>a!==c)),s(!1)))},className:"w-4 h-4 rounded border-slate-300 text-emerald-600 focus:ring-emerald-500",onClick:a=>a.stopPropagation()})}),(0,b.jsx)("td",{className:"px-4 py-3 whitespace-nowrap",children:(0,b.jsx)("div",{className:"text-xs text-slate-600",children:function(a){if(!a||"string"!=typeof a)return"";let b=a.trim();if(!b)return"";let c=new Date(/[Z+-]\d{2}:?\d{2}$/.test(b)?b:b.replace(" ","T"));return Number.isNaN(c.getTime())?b:c.toLocaleString("zh-CN")}(a.created_at)})}),(0,b.jsx)("td",{className:"px-4 py-3 whitespace-nowrap",children:(0,b.jsxs)("div",{className:"text-xs",children:[(0,b.jsx)("div",{className:"font-medium text-slate-800",children:c}),a.provider_name&&(0,b.jsx)("div",{className:"text-[10px] text-slate-500",children:a.provider_name})]})}),(0,b.jsx)("td",{className:"px-4 py-3 whitespace-nowrap",children:(0,b.jsx)("span",{className:`px-2 py-0.5 inline-flex text-xs leading-4 font-semibold rounded-lg border ${"GET"===a.request_method?"bg-sky-50 text-sky-700 border-sky-200/50":"POST"===a.request_method?"bg-emerald-50 text-emerald-700 border-emerald-200/50":"bg-slate-50 text-slate-600 border-slate-200/50"}`,children:a.request_method})}),(0,b.jsx)("td",{className:"px-4 py-3",children:(0,b.jsx)("div",{className:"text-xs text-slate-600 font-mono max-w-xs truncate",children:a.request_path})}),(0,b.jsx)("td",{className:"px-4 py-3 whitespace-nowrap",children:(0,b.jsx)("span",{className:`px-2 py-0.5 inline-flex text-xs leading-4 font-semibold rounded-full border ${a.response_status>=200&&a.response_status<300?"bg-emerald-100/80 text-emerald-700 border-emerald-200/50":a.response_status>=400&&a.response_status<500?"bg-amber-100/80 text-amber-700 border-amber-200/50":a.response_status>=500?"bg-rose-100/80 text-rose-700 border-rose-200/50":"bg-slate-100/80 text-slate-600 border-slate-200/50"}`,children:a.response_status})}),(0,b.jsx)("td",{className:"px-4 py-3 whitespace-nowrap",children:(0,b.jsxs)("div",{className:"text-xs text-slate-600",children:[a.response_time_ms,"ms"]})}),(0,b.jsx)("td",{className:"px-4 py-3 whitespace-nowrap text-right text-xs font-medium",children:(0,b.jsx)("button",{onClick:()=>i(a),className:"text-emerald-600 hover:text-emerald-700 font-medium transition-colors duration-300",children:"查看详情"})})]},a.id)})})]})}),(0,b.jsxs)("div",{className:"mt-5 flex items-center justify-between",children:[(0,b.jsx)("div",{className:"text-xs text-slate-600",children:v?(0,b.jsxs)("span",{children:['搜索 "',(0,b.jsx)("span",{className:"font-semibold text-slate-800",children:v}),'" 找到 ',(0,b.jsx)("span",{className:"font-semibold text-slate-800",children:n})," 条结果"]}):(0,b.jsxs)("span",{children:["共 ",(0,b.jsx)("span",{className:"font-semibold text-slate-800",children:n})," 条记录"]})}),(0,b.jsxs)("div",{className:"flex space-x-2",children:[(0,b.jsx)("button",{onClick:()=>m(Math.max(0,l-1)),disabled:0===l,className:"px-3 py-1.5 border border-slate-200 rounded-lg text-xs font-medium text-slate-600 bg-white hover:bg-slate-50 disabled:opacity-50 disabled:cursor-not-allowed transition-all duration-300",children:"上一页"}),(0,b.jsx)("button",{onClick:()=>m(l+1),disabled:(l+1)*50>=n,className:"px-3 py-1.5 border border-slate-200 rounded-lg text-xs font-medium text-slate-600 bg-white hover:bg-slate-50 disabled:opacity-50 disabled:cursor-not-allowed transition-all duration-300",children:"下一页"})]})]})]})}),h&&(0,b.jsx)("div",{className:"fixed z-50 inset-0 overflow-y-auto",children:(0,b.jsxs)("div",{className:"flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-slate-900/40 backdrop-blur-sm transition-opacity",onClick:()=>i(null)}),(0,b.jsx)("div",{className:"inline-block align-bottom bg-white rounded-2xl text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-3xl sm:w-full border border-emerald-100/50",children:(0,b.jsxs)("div",{className:"bg-white px-6 pt-5 pb-4 sm:p-6",children:[(0,b.jsxs)("div",{className:"mb-5",children:[(0,b.jsx)("h3",{className:"text-base font-bold text-slate-800 mb-1",children:"请求详情"}),(0,b.jsx)("p",{className:"text-xs text-slate-500",children:"查看完整的请求和响应信息"})]}),(0,b.jsxs)("div",{className:"space-y-4 max-h-[60vh] overflow-y-auto",children:[(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,b.jsx)("h4",{className:"text-xs font-semibold text-slate-700",children:"请求头"}),(0,b.jsx)("button",{onClick:()=>A(F(h.request_headers)),className:"px-2 py-0.5 text-xs text-emerald-600 hover:text-emerald-700 font-medium transition-colors",children:"复制"})]}),(0,b.jsx)("pre",{className:"bg-slate-50/80 border border-slate-200 p-3 rounded-xl text-[10px] overflow-x-auto font-mono text-slate-700",children:F(h.request_headers)})]}),(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,b.jsx)("h4",{className:"text-xs font-semibold text-slate-700",children:"请求 Query"}),(0,b.jsx)("button",{onClick:()=>A(F(h.request_query)),className:"px-2 py-0.5 text-xs text-emerald-600 hover:text-emerald-700 font-medium transition-colors",children:"复制"})]}),(0,b.jsx)("pre",{className:"bg-slate-50/80 border border-slate-200 p-3 rounded-xl text-[10px] overflow-x-auto font-mono text-slate-700",children:F(h.request_query)})]}),(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,b.jsx)("h4",{className:"text-xs font-semibold text-slate-700",children:"请求 Body"}),(0,b.jsx)("button",{onClick:()=>A(F(h.request_body)),className:"px-2 py-0.5 text-xs text-emerald-600 hover:text-emerald-700 font-medium transition-colors",children:"复制"})]}),(0,b.jsx)("pre",{className:"bg-slate-50/80 border border-slate-200 p-3 rounded-xl text-[10px] overflow-x-auto font-mono text-slate-700",children:F(h.request_body)})]}),(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,b.jsx)("h4",{className:"text-xs font-semibold text-slate-700",children:"响应 Body"}),(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[h&&I(h.response_body)&&(0,b.jsx)("span",{className:"px-2 py-0.5 text-xs bg-indigo-100 text-indigo-700 rounded-full border border-indigo-200",children:"流式响应"}),(0,b.jsx)("button",{onClick:()=>A(G(h.response_body)),className:"px-2 py-0.5 text-xs text-emerald-600 hover:text-emerald-700 font-medium transition-colors",children:"复制"})]})]}),(0,b.jsx)("div",{className:"bg-slate-50/80 border border-slate-200 rounded-xl p-3 max-h-96 overflow-auto",children:(0,b.jsx)("pre",{className:"bg-slate-50/80 border border-slate-200 p-3 rounded-xl text-[10px] overflow-x-auto font-mono text-slate-700",children:G(h.response_body)})})]})]}),(0,b.jsx)("div",{className:"mt-5 flex justify-end",children:(0,b.jsx)("button",{type:"button",onClick:()=>i(null),className:"px-4 py-1.5 border border-slate-200 rounded-lg text-xs font-semibold text-slate-600 bg-white hover:bg-slate-50 focus:outline-none focus:ring-2 focus:ring-offset-1 focus:ring-slate-400/30 transition-all duration-300",children:"关闭"})})]})})]})}),t&&(0,b.jsx)(f.default,{open:t.open,title:t.title,message:t.message,onConfirm:t.onConfirm,onCancel:()=>u(null),type:"danger"})]})}a.s(["default",()=>g])}];
2
2
 
3
3
  //# sourceMappingURL=src_app_logs_page_tsx_7b7b7b83._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app/logs/page.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useEffect, useCallback } from 'react';\nimport Nav from '../components/Nav';\nimport { useToast } from '../components/ToastProvider';\nimport ConfirmDialog from '../components/ConfirmDialog';\n\ninterface RequestLog {\n id: number;\n model_id: number | null;\n model_name?: string | null;\n provider_name?: string | null;\n request_method: string;\n request_path: string;\n request_headers: string;\n request_query: string;\n request_body: string;\n response_status: number;\n response_body: string;\n response_time_ms: number;\n created_at: string;\n}\n\n/** 将服务端返回的 created_at 格式化为本地显示。无时区后缀时按 UTC 解析再转本地,避免差 8 小时。 */\nfunction formatCreatedAt(createdAt: string): string {\n if (!createdAt || typeof createdAt !== 'string') return '';\n const s = createdAt.trim();\n if (!s) return '';\n const hasTz = /[Z+-]\\d{2}:?\\d{2}$/.test(s);\n const iso = hasTz ? s : s.replace(' ', 'T') + 'Z';\n const date = new Date(iso);\n return Number.isNaN(date.getTime()) ? s : date.toLocaleString('zh-CN');\n}\n\nexport default function LogsPage() {\n const [logs, setLogs] = useState<RequestLog[]>([]);\n const [selectedLog, setSelectedLog] = useState<RequestLog | null>(null);\n const [loading, setLoading] = useState(true);\n const [page, setPage] = useState(0);\n const [total, setTotal] = useState(0);\n const [selectedIds, setSelectedIds] = useState<number[]>([]);\n const [selectAll, setSelectAll] = useState(false);\n const [confirmDialog, setConfirmDialog] = useState<{ open: boolean; title: string; message: string; onConfirm: () => void } | null>(null);\n const [searchQuery, setSearchQuery] = useState('');\n const [searchInput, setSearchInput] = useState('');\n const limit = 50;\n const { showToast } = useToast();\n\n const copyToClipboard = async (text: string) => {\n try {\n await navigator.clipboard.writeText(text);\n showToast('已复制到剪贴板', 'success');\n } catch {\n showToast('复制失败,请手动复制', 'error');\n }\n };\n\n const handleDeleteSelected = async () => {\n if (selectedIds.length === 0) return;\n setConfirmDialog({\n open: true,\n title: '删除确认',\n message: `确定要删除选中的 ${selectedIds.length} 条日志吗?`,\n onConfirm: async () => {\n try {\n const res = await fetch(`/api/logs?ids=${selectedIds.join(',')}`, { method: 'DELETE' });\n const data = await res.json();\n if (res.ok) {\n setSelectedIds([]);\n setSelectAll(false);\n loadLogs();\n showToast('删除成功', 'success');\n setConfirmDialog(null);\n } else {\n showToast('删除失败:' + (data.error || '未知错误'), 'error');\n }\n } catch (error) {\n console.error('Failed to delete logs:', error);\n showToast('删除失败', 'error');\n }\n },\n });\n };\n\n const handleClearAll = async () => {\n setConfirmDialog({\n open: true,\n title: '清空日志',\n message: '确定要清空所有日志吗?此操作不可恢复!',\n onConfirm: async () => {\n try {\n const res = await fetch('/api/logs?clear_all=true', { method: 'DELETE' });\n const data = await res.json();\n if (res.ok) {\n setPage(0);\n setSelectedIds([]);\n setSelectAll(false);\n loadLogs();\n showToast('清空成功', 'success');\n setConfirmDialog(null);\n } else {\n showToast('清空失败:' + (data.error || '未知错误'), 'error');\n }\n } catch (error) {\n console.error('Failed to clear logs:', error);\n showToast('清空失败', 'error');\n }\n },\n });\n };\n\n const handleSelectAll = (checked: boolean) => {\n setSelectAll(checked);\n setSelectedIds(checked ? logs.map(log => log.id) : []);\n };\n\n const handleSelectLog = (id: number, checked: boolean) => {\n if (checked) {\n setSelectedIds([...selectedIds, id]);\n } else {\n setSelectedIds(selectedIds.filter(sid => sid !== id));\n setSelectAll(false);\n }\n };\n\n const loadLogs = async (search?: string) => {\n try {\n setLoading(true);\n const params = new URLSearchParams({\n limit: limit.toString(),\n offset: (page * limit).toString(),\n });\n if (search) {\n params.set('search', search);\n }\n const res = await fetch(`/api/logs?${params.toString()}`);\n const data = await res.json();\n setLogs(data.logs || []);\n setTotal(data.total || 0);\n } catch (error) {\n console.error('Failed to load logs:', error);\n showToast('加载日志失败', 'error');\n } finally {\n setLoading(false);\n }\n };\n\n // 手动触发搜索\n const handleSearch = () => {\n setSearchQuery(searchInput);\n setPage(0);\n loadLogs(searchInput);\n };\n\n // 清除搜索\n const clearSearch = () => {\n setSearchInput('');\n if (searchQuery) {\n setSearchQuery('');\n setPage(0);\n loadLogs();\n }\n };\n\n // 键盘搜索支持\n const handleKeyPress = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n handleSearch();\n }\n };\n\n useEffect(() => {\n loadLogs();\n }, [page, limit]);\n\n const formatJSONSimple = (jsonString: string): string => {\n return typeof jsonString === 'string' ? jsonString : JSON.stringify(jsonString);\n }\n\n const formatRespon = (str: string): string => {\n if (isStreamingResponse(str)) {\n return formatSSEStream(str);\n }\n return formatJSONSimple(str);\n }\n\n const formatSSEStream = (responseBody: any): string => {\n if (!responseBody) return '';\n\n let sseData: string;\n try {\n sseData = JSON.parse(responseBody);\n } catch {\n sseData = responseBody;\n }\n\n if (!sseData.includes('data:') || !sseData.includes('\\n\\n')) {\n try {\n const parsed = JSON.parse(sseData);\n return JSON.stringify(parsed);\n } catch {\n return String(sseData);\n }\n }\n\n const chunks = sseData.split('\\n\\n').filter(chunk => chunk.trim());\n const formattedChunks: string[] = [];\n\n for (const chunk of chunks) {\n let content = chunk.trim();\n let tmp = content.split(\"\\n\").map((line) => {\n return line.startsWith(\"data: \") ? line.substring(6) : line;\n });\n content = tmp.join(\"\\n\");\n if (content === 'data: [DONE]' || content === '[DONE]') {\n formattedChunks.push(content);\n } else {\n // event: content_block_stop\n // data: {\"type\": \"content_block_stop\", \"index\": 0}\n formattedChunks.push(content);\n }\n }\n return formattedChunks.join('\\n\\n');\n };\n\n // 检测是否为流式响应\n const isStreamingResponse = (responseBody: any): boolean => {\n if (!responseBody) return false;\n const bodyStr = responseBody;\n // OpenAI格式: data: {...}\\n\\ndata: {...}\\n\\n\n // Anthropic格式: event: xxx\\ndata: {...}\\n\\nevent: xxx\\ndata: {...}\\n\\n\n const hasDataMarkers = bodyStr.includes('data:');\n const hasNewlinePairs = bodyStr.includes('\\n\\n');\n const hasEventMarkers = bodyStr.includes('event:');\n return (hasDataMarkers || hasNewlinePairs) || hasEventMarkers;\n };\n\n const parseModelFromRequest = (query: string, body: string): string | null => {\n try {\n const parsedQuery = query ? JSON.parse(query) : {};\n const parsedBody = body ? JSON.parse(body) : {};\n\n const model = parsedBody.model || parsedQuery.model;\n\n // 处理可能为数组的情况(如 message 格式)\n if (Array.isArray(model)) {\n const lastMessage = model[model.length - 1];\n if (lastMessage && typeof lastMessage === 'object' && 'model' in lastMessage) {\n return lastMessage.model;\n }\n }\n\n return typeof model === 'string' ? model : null;\n } catch {\n return null;\n }\n };\n\n const getStatusColor = (status: number) => {\n if (status >= 200 && status < 300) return 'text-green-600';\n if (status >= 400 && status < 500) return 'text-yellow-600';\n if (status >= 500) return 'text-red-600';\n return 'text-gray-600';\n };\n\n if (loading) {\n return (\n <>\n <Nav />\n <div className=\"min-h-screen flex items-center justify-center\">\n <div className=\"text-lg\">加载中...</div>\n </div>\n </>\n );\n }\n\n return (\n <>\n <Nav />\n <main className=\"max-w-6xl mx-auto py-6 sm:px-6 lg:px-8\">\n <div className=\"px-4 py-4 sm:px-0\">\n <div className=\"mb-5 flex items-center justify-between\">\n <div>\n <h1 className=\"text-lg font-bold text-slate-800\">请求日志</h1>\n <p className=\"text-xs text-slate-500 mt-1\">查看所有 API 请求记录和响应详情</p>\n </div>\n <div className=\"flex gap-2 items-center\">\n {/* 搜索框 */}\n <div className=\"relative group\">\n <input\n type=\"text\"\n placeholder=\"搜索日志...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n onKeyPress={handleKeyPress}\n className=\"w-64 pl-9 pr-20 py-1.5 text-xs border border-slate-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-emerald-500/30 focus:border-emerald-500 transition-all\"\n />\n <svg\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-400\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n {/* 操作按钮 */}\n <div className=\"absolute right-2 top-1/2 -translate-y-1/2 flex items-center gap-1\">\n {searchInput ? (\n <>\n <button\n onClick={handleSearch}\n className=\"p-0.5 text-emerald-500 hover:text-emerald-600 hover:bg-emerald-50 rounded transition-colors\"\n title=\"确认搜索\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n </button>\n <button\n onClick={clearSearch}\n className=\"p-0.5 text-slate-400 hover:text-rose-500 hover:bg-rose-50 rounded transition-colors\"\n title=\"清除搜索\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </>\n ) : null}\n </div>\n </div>\n {selectedIds.length > 0 && (\n <button\n onClick={handleDeleteSelected}\n className=\"px-3 py-1.5 bg-rose-600 hover:bg-rose-700 text-white text-xs font-semibold rounded-lg border border-rose-200 transition-all duration-300\"\n >\n 删除选中 ({selectedIds.length})\n </button>\n )}\n <button\n onClick={handleClearAll}\n className=\"px-3 py-1.5 bg-slate-600 hover:bg-slate-700 text-white text-xs font-semibold rounded-lg border border-slate-200 transition-all duration-300\"\n >\n 清空所有\n </button>\n </div>\n </div>\n\n <div className=\"bg-white/70 backdrop-blur-sm shadow-md rounded-2xl border border-emerald-100/50 overflow-hidden\">\n <table className=\"min-w-full divide-y divide-slate-100\">\n <thead className=\"bg-emerald-50/30\">\n <tr>\n <th className=\"px-4 py-3.5 w-10\">\n <input\n type=\"checkbox\"\n checked={selectAll && logs.length > 0}\n onChange={(e) => handleSelectAll(e.target.checked)}\n className=\"w-4 h-4 rounded border-slate-300 text-emerald-600 focus:ring-emerald-500\"\n />\n </th>\n <th className=\"px-4 py-2.5 text-left text-xs font-semibold text-slate-600 uppercase tracking-wider\">\n 时间\n </th>\n <th className=\"px-6 py-3.5 text-left text-xs font-semibold text-gray-700 uppercase tracking-wider\">\n 模型\n </th>\n <th className=\"px-6 py-3.5 text-left text-xs font-semibold text-gray-700 uppercase tracking-wider\">\n 方法\n </th>\n <th className=\"px-6 py-3.5 text-left text-xs font-semibold text-gray-700 uppercase tracking-wider\">\n 路径\n </th>\n <th className=\"px-6 py-3.5 text-left text-xs font-semibold text-gray-700 uppercase tracking-wider\">\n 状态\n </th>\n <th className=\"px-6 py-3.5 text-left text-xs font-semibold text-gray-700 uppercase tracking-wider\">\n 响应时间\n </th>\n <th className=\"px-6 py-3.5 text-right text-xs font-semibold text-gray-700 uppercase tracking-wider\">\n 操作\n </th>\n </tr>\n </thead>\n <tbody className=\"bg-white divide-y divide-slate-100\">\n {logs.length === 0 ? (\n <tr>\n <td colSpan={8} className=\"px-4 py-12 text-center\">\n <div className=\"text-slate-400\">\n <svg className=\"mx-auto h-10 w-10 mb-3 text-slate-300\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n <p className=\"text-xs text-slate-500\">\n {searchQuery ? '未找到匹配的日志' : '暂无日志记录'}\n </p>\n {searchQuery && (\n <button\n onClick={() => {\n setSearchInput('');\n setSearchQuery('');\n }}\n className=\"mt-2 text-xs text-emerald-600 hover:text-emerald-700\"\n >\n 清除搜索\n </button>\n )}\n </div>\n </td>\n </tr>\n ) : (\n logs.map((log) => {\n const parsedModel = parseModelFromRequest(log.request_query, log.request_body);\n const displayModel = parsedModel || log.model_name || 'Gateway';\n\n return (\n <tr key={log.id} className=\"hover:bg-emerald-50/20 transition-colors duration-300\">\n <td className=\"px-4 py-3\">\n <input\n type=\"checkbox\"\n checked={selectedIds.includes(log.id)}\n onChange={(e) => handleSelectLog(log.id, e.target.checked)}\n className=\"w-4 h-4 rounded border-slate-300 text-emerald-600 focus:ring-emerald-500\"\n onClick={(e) => e.stopPropagation()}\n />\n </td>\n <td className=\"px-4 py-3 whitespace-nowrap\">\n <div className=\"text-xs text-slate-600\">\n {formatCreatedAt(log.created_at)}\n </div>\n </td>\n <td className=\"px-4 py-3 whitespace-nowrap\">\n <div className=\"text-xs\">\n <div className=\"font-medium text-slate-800\">{displayModel}</div>\n {log.provider_name && (\n <div className=\"text-[10px] text-slate-500\">{log.provider_name}</div>\n )}\n </div>\n </td>\n <td className=\"px-4 py-3 whitespace-nowrap\">\n <span className={`px-2 py-0.5 inline-flex text-xs leading-4 font-semibold rounded-lg border ${log.request_method === 'GET' ? 'bg-sky-50 text-sky-700 border-sky-200/50' :\n log.request_method === 'POST' ? 'bg-emerald-50 text-emerald-700 border-emerald-200/50' :\n 'bg-slate-50 text-slate-600 border-slate-200/50'\n }`}>\n {log.request_method}\n </span>\n </td>\n <td className=\"px-4 py-3\">\n <div className=\"text-xs text-slate-600 font-mono max-w-xs truncate\">\n {log.request_path}\n </div>\n </td>\n <td className=\"px-4 py-3 whitespace-nowrap\">\n <span className={`px-2 py-0.5 inline-flex text-xs leading-4 font-semibold rounded-full border ${log.response_status >= 200 && log.response_status < 300 ? 'bg-emerald-100/80 text-emerald-700 border-emerald-200/50' :\n log.response_status >= 400 && log.response_status < 500 ? 'bg-amber-100/80 text-amber-700 border-amber-200/50' :\n log.response_status >= 500 ? 'bg-rose-100/80 text-rose-700 border-rose-200/50' :\n 'bg-slate-100/80 text-slate-600 border-slate-200/50'\n }`}>\n {log.response_status}\n </span>\n </td>\n <td className=\"px-4 py-3 whitespace-nowrap\">\n <div className=\"text-xs text-slate-600\">\n {log.response_time_ms}ms\n </div>\n </td>\n <td className=\"px-4 py-3 whitespace-nowrap text-right text-xs font-medium\">\n <button\n onClick={() => setSelectedLog(log)}\n className=\"text-emerald-600 hover:text-emerald-700 font-medium transition-colors duration-300\"\n >\n 查看详情\n </button>\n </td>\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n\n <div className=\"mt-5 flex items-center justify-between\">\n <div className=\"text-xs text-slate-600\">\n {searchQuery ? (\n <span>\n 搜索 \"<span className=\"font-semibold text-slate-800\">{searchQuery}</span>\"\n 找到 <span className=\"font-semibold text-slate-800\">{total}</span> 条结果\n </span>\n ) : (\n <span>共 <span className=\"font-semibold text-slate-800\">{total}</span> 条记录</span>\n )}\n </div>\n <div className=\"flex space-x-2\">\n <button\n onClick={() => setPage(Math.max(0, page - 1))}\n disabled={page === 0}\n className=\"px-3 py-1.5 border border-slate-200 rounded-lg text-xs font-medium text-slate-600 bg-white hover:bg-slate-50 disabled:opacity-50 disabled:cursor-not-allowed transition-all duration-300\"\n >\n 上一页\n </button>\n <button\n onClick={() => setPage(page + 1)}\n disabled={(page + 1) * limit >= total}\n className=\"px-3 py-1.5 border border-slate-200 rounded-lg text-xs font-medium text-slate-600 bg-white hover:bg-slate-50 disabled:opacity-50 disabled:cursor-not-allowed transition-all duration-300\"\n >\n 下一页\n </button>\n </div>\n </div>\n </div>\n </main>\n\n {selectedLog && (\n <div className=\"fixed z-50 inset-0 overflow-y-auto\">\n <div className=\"flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0\">\n <div className=\"fixed inset-0 bg-slate-900/40 backdrop-blur-sm transition-opacity\" onClick={() => setSelectedLog(null)}></div>\n <div className=\"inline-block align-bottom bg-white rounded-2xl text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-3xl sm:w-full border border-emerald-100/50\">\n <div className=\"bg-white px-6 pt-5 pb-4 sm:p-6\">\n <div className=\"mb-5\">\n <h3 className=\"text-base font-bold text-slate-800 mb-1\">\n 请求详情\n </h3>\n <p className=\"text-xs text-slate-500\">查看完整的请求和响应信息</p>\n </div>\n <div className=\"space-y-4 max-h-[60vh] overflow-y-auto\">\n <div>\n <div className=\"flex items-center justify-between mb-2\">\n <h4 className=\"text-xs font-semibold text-slate-700\">请求头</h4>\n <button\n onClick={() => copyToClipboard(formatJSONSimple(selectedLog.request_headers))}\n className=\"px-2 py-0.5 text-xs text-emerald-600 hover:text-emerald-700 font-medium transition-colors\"\n >\n 复制\n </button>\n </div>\n <pre className=\"bg-slate-50/80 border border-slate-200 p-3 rounded-xl text-[10px] overflow-x-auto font-mono text-slate-700\">\n {formatJSONSimple(selectedLog.request_headers)}\n </pre>\n </div>\n <div>\n <div className=\"flex items-center justify-between mb-2\">\n <h4 className=\"text-xs font-semibold text-slate-700\">请求 Query</h4>\n <button\n onClick={() => copyToClipboard(formatJSONSimple(selectedLog.request_query))}\n className=\"px-2 py-0.5 text-xs text-emerald-600 hover:text-emerald-700 font-medium transition-colors\"\n >\n 复制\n </button>\n </div>\n <pre className=\"bg-slate-50/80 border border-slate-200 p-3 rounded-xl text-[10px] overflow-x-auto font-mono text-slate-700\">\n {formatJSONSimple(selectedLog.request_query)}\n </pre>\n </div>\n <div>\n <div className=\"flex items-center justify-between mb-2\">\n <h4 className=\"text-xs font-semibold text-slate-700\">请求 Body</h4>\n <button\n onClick={() => copyToClipboard(formatJSONSimple(selectedLog.request_body))}\n className=\"px-2 py-0.5 text-xs text-emerald-600 hover:text-emerald-700 font-medium transition-colors\"\n >\n 复制\n </button>\n </div>\n <pre className=\"bg-slate-50/80 border border-slate-200 p-3 rounded-xl text-[10px] overflow-x-auto font-mono text-slate-700\">\n {formatJSONSimple(selectedLog.request_body)}\n </pre>\n </div>\n <div>\n <div className=\"flex items-center justify-between mb-2\">\n <h4 className=\"text-xs font-semibold text-slate-700\">响应 Body</h4>\n <div className=\"flex items-center gap-2\">\n {selectedLog && isStreamingResponse(selectedLog.response_body) && (\n <span className=\"px-2 py-0.5 text-xs bg-indigo-100 text-indigo-700 rounded-full border border-indigo-200\">\n 流式响应\n </span>\n )}\n <button\n onClick={() => copyToClipboard(formatRespon(selectedLog.response_body))}\n className=\"px-2 py-0.5 text-xs text-emerald-600 hover:text-emerald-700 font-medium transition-colors\"\n >\n 复制\n </button>\n </div>\n </div>\n <div className=\"bg-slate-50/80 border border-slate-200 rounded-xl p-3 max-h-96 overflow-auto\">\n {(\n <pre className=\"bg-slate-50/80 border border-slate-200 p-3 rounded-xl text-[10px] overflow-x-auto font-mono text-slate-700\">\n {formatRespon(selectedLog.response_body)}\n </pre>\n )}\n </div>\n </div>\n </div>\n <div className=\"mt-5 flex justify-end\">\n <button\n type=\"button\"\n onClick={() => setSelectedLog(null)}\n className=\"px-4 py-1.5 border border-slate-200 rounded-lg text-xs font-semibold text-slate-600 bg-white hover:bg-slate-50 focus:outline-none focus:ring-2 focus:ring-offset-1 focus:ring-slate-400/30 transition-all duration-300\"\n >\n 关闭\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {confirmDialog && (\n <ConfirmDialog\n open={confirmDialog.open}\n title={confirmDialog.title}\n message={confirmDialog.message}\n onConfirm={confirmDialog.onConfirm}\n onCancel={() => setConfirmDialog(null)}\n type=\"danger\"\n />\n )}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/app/logs/page.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useEffect, useCallback } from 'react';\nimport Nav from '../components/Nav';\nimport { useToast } from '../components/ToastProvider';\nimport ConfirmDialog from '../components/ConfirmDialog';\n\ninterface RequestLog {\n id: number;\n model_id: number | null;\n model_name?: string | null;\n provider_name?: string | null;\n request_method: string;\n request_path: string;\n request_headers: string;\n request_query: string;\n request_body: string;\n response_status: number;\n response_body: string;\n response_time_ms: number;\n created_at: string;\n}\n\n/** 将服务端返回的 created_at 格式化为本地显示。数据库存储的是本地时间,无需追加 Z 后缀。 */\nfunction formatCreatedAt(createdAt: string): string {\n if (!createdAt || typeof createdAt !== 'string') return '';\n const s = createdAt.trim();\n if (!s) return '';\n // 数据库使用 datetime('now','localtime') 存储的已经是本地时间,\n // 不带时区后缀时直接按本地时间解析,不要追加 'Z'(否则会多偏移 8 小时)\n const hasTz = /[Z+-]\\d{2}:?\\d{2}$/.test(s);\n const iso = hasTz ? s : s.replace(' ', 'T');\n const date = new Date(iso);\n return Number.isNaN(date.getTime()) ? s : date.toLocaleString('zh-CN');\n}\n\nexport default function LogsPage() {\n const [logs, setLogs] = useState<RequestLog[]>([]);\n const [selectedLog, setSelectedLog] = useState<RequestLog | null>(null);\n const [loading, setLoading] = useState(true);\n const [page, setPage] = useState(0);\n const [total, setTotal] = useState(0);\n const [selectedIds, setSelectedIds] = useState<number[]>([]);\n const [selectAll, setSelectAll] = useState(false);\n const [confirmDialog, setConfirmDialog] = useState<{ open: boolean; title: string; message: string; onConfirm: () => void } | null>(null);\n const [searchQuery, setSearchQuery] = useState('');\n const [searchInput, setSearchInput] = useState('');\n const limit = 50;\n const { showToast } = useToast();\n\n const copyToClipboard = async (text: string) => {\n try {\n await navigator.clipboard.writeText(text);\n showToast('已复制到剪贴板', 'success');\n } catch {\n showToast('复制失败,请手动复制', 'error');\n }\n };\n\n const handleDeleteSelected = async () => {\n if (selectedIds.length === 0) return;\n setConfirmDialog({\n open: true,\n title: '删除确认',\n message: `确定要删除选中的 ${selectedIds.length} 条日志吗?`,\n onConfirm: async () => {\n try {\n const res = await fetch(`/api/logs?ids=${selectedIds.join(',')}`, { method: 'DELETE' });\n const data = await res.json();\n if (res.ok) {\n setSelectedIds([]);\n setSelectAll(false);\n loadLogs();\n showToast('删除成功', 'success');\n setConfirmDialog(null);\n } else {\n showToast('删除失败:' + (data.error || '未知错误'), 'error');\n }\n } catch (error) {\n console.error('Failed to delete logs:', error);\n showToast('删除失败', 'error');\n }\n },\n });\n };\n\n const handleClearAll = async () => {\n setConfirmDialog({\n open: true,\n title: '清空日志',\n message: '确定要清空所有日志吗?此操作不可恢复!',\n onConfirm: async () => {\n try {\n const res = await fetch('/api/logs?clear_all=true', { method: 'DELETE' });\n const data = await res.json();\n if (res.ok) {\n setPage(0);\n setSelectedIds([]);\n setSelectAll(false);\n loadLogs();\n showToast('清空成功', 'success');\n setConfirmDialog(null);\n } else {\n showToast('清空失败:' + (data.error || '未知错误'), 'error');\n }\n } catch (error) {\n console.error('Failed to clear logs:', error);\n showToast('清空失败', 'error');\n }\n },\n });\n };\n\n const handleSelectAll = (checked: boolean) => {\n setSelectAll(checked);\n setSelectedIds(checked ? logs.map(log => log.id) : []);\n };\n\n const handleSelectLog = (id: number, checked: boolean) => {\n if (checked) {\n setSelectedIds([...selectedIds, id]);\n } else {\n setSelectedIds(selectedIds.filter(sid => sid !== id));\n setSelectAll(false);\n }\n };\n\n const loadLogs = async (search?: string) => {\n try {\n setLoading(true);\n const params = new URLSearchParams({\n limit: limit.toString(),\n offset: (page * limit).toString(),\n });\n if (search) {\n params.set('search', search);\n }\n const res = await fetch(`/api/logs?${params.toString()}`);\n const data = await res.json();\n setLogs(data.logs || []);\n setTotal(data.total || 0);\n } catch (error) {\n console.error('Failed to load logs:', error);\n showToast('加载日志失败', 'error');\n } finally {\n setLoading(false);\n }\n };\n\n // 手动触发搜索\n const handleSearch = () => {\n setSearchQuery(searchInput);\n setPage(0);\n loadLogs(searchInput);\n };\n\n // 清除搜索\n const clearSearch = () => {\n setSearchInput('');\n if (searchQuery) {\n setSearchQuery('');\n setPage(0);\n loadLogs();\n }\n };\n\n // 键盘搜索支持\n const handleKeyPress = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n handleSearch();\n }\n };\n\n useEffect(() => {\n loadLogs();\n }, [page, limit]);\n\n const formatJSONSimple = (jsonString: string): string => {\n return typeof jsonString === 'string' ? jsonString : JSON.stringify(jsonString);\n }\n\n const formatRespon = (str: string): string => {\n if (isStreamingResponse(str)) {\n return formatSSEStream(str);\n }\n return formatJSONSimple(str);\n }\n\n const formatSSEStream = (responseBody: any): string => {\n if (!responseBody) return '';\n\n let sseData: string;\n try {\n sseData = JSON.parse(responseBody);\n } catch {\n sseData = responseBody;\n }\n\n if (!sseData.includes('data:') || !sseData.includes('\\n\\n')) {\n try {\n const parsed = JSON.parse(sseData);\n return JSON.stringify(parsed);\n } catch {\n return String(sseData);\n }\n }\n\n const chunks = sseData.split('\\n\\n').filter(chunk => chunk.trim());\n const formattedChunks: string[] = [];\n\n for (const chunk of chunks) {\n let content = chunk.trim();\n let tmp = content.split(\"\\n\").map((line) => {\n return line.startsWith(\"data: \") ? line.substring(6) : line;\n });\n content = tmp.join(\"\\n\");\n if (content === 'data: [DONE]' || content === '[DONE]') {\n formattedChunks.push(content);\n } else {\n // event: content_block_stop\n // data: {\"type\": \"content_block_stop\", \"index\": 0}\n formattedChunks.push(content);\n }\n }\n return formattedChunks.join('\\n\\n');\n };\n\n // 检测是否为流式响应\n const isStreamingResponse = (responseBody: any): boolean => {\n if (!responseBody) return false;\n const bodyStr = responseBody;\n // OpenAI格式: data: {...}\\n\\ndata: {...}\\n\\n\n // Anthropic格式: event: xxx\\ndata: {...}\\n\\nevent: xxx\\ndata: {...}\\n\\n\n const hasDataMarkers = bodyStr.includes('data:');\n const hasNewlinePairs = bodyStr.includes('\\n\\n');\n const hasEventMarkers = bodyStr.includes('event:');\n return (hasDataMarkers || hasNewlinePairs) || hasEventMarkers;\n };\n\n const parseModelFromRequest = (query: string, body: string): string | null => {\n try {\n const parsedQuery = query ? JSON.parse(query) : {};\n const parsedBody = body ? JSON.parse(body) : {};\n\n const model = parsedBody.model || parsedQuery.model;\n\n // 处理可能为数组的情况(如 message 格式)\n if (Array.isArray(model)) {\n const lastMessage = model[model.length - 1];\n if (lastMessage && typeof lastMessage === 'object' && 'model' in lastMessage) {\n return lastMessage.model;\n }\n }\n\n return typeof model === 'string' ? model : null;\n } catch {\n return null;\n }\n };\n\n const getStatusColor = (status: number) => {\n if (status >= 200 && status < 300) return 'text-green-600';\n if (status >= 400 && status < 500) return 'text-yellow-600';\n if (status >= 500) return 'text-red-600';\n return 'text-gray-600';\n };\n\n if (loading) {\n return (\n <>\n <Nav />\n <div className=\"min-h-screen flex items-center justify-center\">\n <div className=\"text-lg\">加载中...</div>\n </div>\n </>\n );\n }\n\n return (\n <>\n <Nav />\n <main className=\"max-w-6xl mx-auto py-6 sm:px-6 lg:px-8\">\n <div className=\"px-4 py-4 sm:px-0\">\n <div className=\"mb-5 flex items-center justify-between\">\n <div>\n <h1 className=\"text-lg font-bold text-slate-800\">请求日志</h1>\n <p className=\"text-xs text-slate-500 mt-1\">查看所有 API 请求记录和响应详情</p>\n </div>\n <div className=\"flex gap-2 items-center\">\n {/* 搜索框 */}\n <div className=\"relative group\">\n <input\n type=\"text\"\n placeholder=\"搜索日志...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n onKeyPress={handleKeyPress}\n className=\"w-64 pl-9 pr-20 py-1.5 text-xs border border-slate-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-emerald-500/30 focus:border-emerald-500 transition-all\"\n />\n <svg\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-400\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n {/* 操作按钮 */}\n <div className=\"absolute right-2 top-1/2 -translate-y-1/2 flex items-center gap-1\">\n {searchInput ? (\n <>\n <button\n onClick={handleSearch}\n className=\"p-0.5 text-emerald-500 hover:text-emerald-600 hover:bg-emerald-50 rounded transition-colors\"\n title=\"确认搜索\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n </button>\n <button\n onClick={clearSearch}\n className=\"p-0.5 text-slate-400 hover:text-rose-500 hover:bg-rose-50 rounded transition-colors\"\n title=\"清除搜索\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </>\n ) : null}\n </div>\n </div>\n {selectedIds.length > 0 && (\n <button\n onClick={handleDeleteSelected}\n className=\"px-3 py-1.5 bg-rose-600 hover:bg-rose-700 text-white text-xs font-semibold rounded-lg border border-rose-200 transition-all duration-300\"\n >\n 删除选中 ({selectedIds.length})\n </button>\n )}\n <button\n onClick={handleClearAll}\n className=\"px-3 py-1.5 bg-slate-600 hover:bg-slate-700 text-white text-xs font-semibold rounded-lg border border-slate-200 transition-all duration-300\"\n >\n 清空所有\n </button>\n </div>\n </div>\n\n <div className=\"bg-white/70 backdrop-blur-sm shadow-md rounded-2xl border border-emerald-100/50 overflow-hidden\">\n <table className=\"min-w-full divide-y divide-slate-100\">\n <thead className=\"bg-emerald-50/30\">\n <tr>\n <th className=\"px-4 py-3.5 w-10\">\n <input\n type=\"checkbox\"\n checked={selectAll && logs.length > 0}\n onChange={(e) => handleSelectAll(e.target.checked)}\n className=\"w-4 h-4 rounded border-slate-300 text-emerald-600 focus:ring-emerald-500\"\n />\n </th>\n <th className=\"px-4 py-2.5 text-left text-xs font-semibold text-slate-600 uppercase tracking-wider\">\n 时间\n </th>\n <th className=\"px-6 py-3.5 text-left text-xs font-semibold text-gray-700 uppercase tracking-wider\">\n 模型\n </th>\n <th className=\"px-6 py-3.5 text-left text-xs font-semibold text-gray-700 uppercase tracking-wider\">\n 方法\n </th>\n <th className=\"px-6 py-3.5 text-left text-xs font-semibold text-gray-700 uppercase tracking-wider\">\n 路径\n </th>\n <th className=\"px-6 py-3.5 text-left text-xs font-semibold text-gray-700 uppercase tracking-wider\">\n 状态\n </th>\n <th className=\"px-6 py-3.5 text-left text-xs font-semibold text-gray-700 uppercase tracking-wider\">\n 响应时间\n </th>\n <th className=\"px-6 py-3.5 text-right text-xs font-semibold text-gray-700 uppercase tracking-wider\">\n 操作\n </th>\n </tr>\n </thead>\n <tbody className=\"bg-white divide-y divide-slate-100\">\n {logs.length === 0 ? (\n <tr>\n <td colSpan={8} className=\"px-4 py-12 text-center\">\n <div className=\"text-slate-400\">\n <svg className=\"mx-auto h-10 w-10 mb-3 text-slate-300\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n <p className=\"text-xs text-slate-500\">\n {searchQuery ? '未找到匹配的日志' : '暂无日志记录'}\n </p>\n {searchQuery && (\n <button\n onClick={() => {\n setSearchInput('');\n setSearchQuery('');\n }}\n className=\"mt-2 text-xs text-emerald-600 hover:text-emerald-700\"\n >\n 清除搜索\n </button>\n )}\n </div>\n </td>\n </tr>\n ) : (\n logs.map((log) => {\n const parsedModel = parseModelFromRequest(log.request_query, log.request_body);\n const displayModel = parsedModel || log.model_name || 'Gateway';\n\n return (\n <tr key={log.id} className=\"hover:bg-emerald-50/20 transition-colors duration-300\">\n <td className=\"px-4 py-3\">\n <input\n type=\"checkbox\"\n checked={selectedIds.includes(log.id)}\n onChange={(e) => handleSelectLog(log.id, e.target.checked)}\n className=\"w-4 h-4 rounded border-slate-300 text-emerald-600 focus:ring-emerald-500\"\n onClick={(e) => e.stopPropagation()}\n />\n </td>\n <td className=\"px-4 py-3 whitespace-nowrap\">\n <div className=\"text-xs text-slate-600\">\n {formatCreatedAt(log.created_at)}\n </div>\n </td>\n <td className=\"px-4 py-3 whitespace-nowrap\">\n <div className=\"text-xs\">\n <div className=\"font-medium text-slate-800\">{displayModel}</div>\n {log.provider_name && (\n <div className=\"text-[10px] text-slate-500\">{log.provider_name}</div>\n )}\n </div>\n </td>\n <td className=\"px-4 py-3 whitespace-nowrap\">\n <span className={`px-2 py-0.5 inline-flex text-xs leading-4 font-semibold rounded-lg border ${log.request_method === 'GET' ? 'bg-sky-50 text-sky-700 border-sky-200/50' :\n log.request_method === 'POST' ? 'bg-emerald-50 text-emerald-700 border-emerald-200/50' :\n 'bg-slate-50 text-slate-600 border-slate-200/50'\n }`}>\n {log.request_method}\n </span>\n </td>\n <td className=\"px-4 py-3\">\n <div className=\"text-xs text-slate-600 font-mono max-w-xs truncate\">\n {log.request_path}\n </div>\n </td>\n <td className=\"px-4 py-3 whitespace-nowrap\">\n <span className={`px-2 py-0.5 inline-flex text-xs leading-4 font-semibold rounded-full border ${log.response_status >= 200 && log.response_status < 300 ? 'bg-emerald-100/80 text-emerald-700 border-emerald-200/50' :\n log.response_status >= 400 && log.response_status < 500 ? 'bg-amber-100/80 text-amber-700 border-amber-200/50' :\n log.response_status >= 500 ? 'bg-rose-100/80 text-rose-700 border-rose-200/50' :\n 'bg-slate-100/80 text-slate-600 border-slate-200/50'\n }`}>\n {log.response_status}\n </span>\n </td>\n <td className=\"px-4 py-3 whitespace-nowrap\">\n <div className=\"text-xs text-slate-600\">\n {log.response_time_ms}ms\n </div>\n </td>\n <td className=\"px-4 py-3 whitespace-nowrap text-right text-xs font-medium\">\n <button\n onClick={() => setSelectedLog(log)}\n className=\"text-emerald-600 hover:text-emerald-700 font-medium transition-colors duration-300\"\n >\n 查看详情\n </button>\n </td>\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n\n <div className=\"mt-5 flex items-center justify-between\">\n <div className=\"text-xs text-slate-600\">\n {searchQuery ? (\n <span>\n 搜索 \"<span className=\"font-semibold text-slate-800\">{searchQuery}</span>\"\n 找到 <span className=\"font-semibold text-slate-800\">{total}</span> 条结果\n </span>\n ) : (\n <span>共 <span className=\"font-semibold text-slate-800\">{total}</span> 条记录</span>\n )}\n </div>\n <div className=\"flex space-x-2\">\n <button\n onClick={() => setPage(Math.max(0, page - 1))}\n disabled={page === 0}\n className=\"px-3 py-1.5 border border-slate-200 rounded-lg text-xs font-medium text-slate-600 bg-white hover:bg-slate-50 disabled:opacity-50 disabled:cursor-not-allowed transition-all duration-300\"\n >\n 上一页\n </button>\n <button\n onClick={() => setPage(page + 1)}\n disabled={(page + 1) * limit >= total}\n className=\"px-3 py-1.5 border border-slate-200 rounded-lg text-xs font-medium text-slate-600 bg-white hover:bg-slate-50 disabled:opacity-50 disabled:cursor-not-allowed transition-all duration-300\"\n >\n 下一页\n </button>\n </div>\n </div>\n </div>\n </main>\n\n {selectedLog && (\n <div className=\"fixed z-50 inset-0 overflow-y-auto\">\n <div className=\"flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0\">\n <div className=\"fixed inset-0 bg-slate-900/40 backdrop-blur-sm transition-opacity\" onClick={() => setSelectedLog(null)}></div>\n <div className=\"inline-block align-bottom bg-white rounded-2xl text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-3xl sm:w-full border border-emerald-100/50\">\n <div className=\"bg-white px-6 pt-5 pb-4 sm:p-6\">\n <div className=\"mb-5\">\n <h3 className=\"text-base font-bold text-slate-800 mb-1\">\n 请求详情\n </h3>\n <p className=\"text-xs text-slate-500\">查看完整的请求和响应信息</p>\n </div>\n <div className=\"space-y-4 max-h-[60vh] overflow-y-auto\">\n <div>\n <div className=\"flex items-center justify-between mb-2\">\n <h4 className=\"text-xs font-semibold text-slate-700\">请求头</h4>\n <button\n onClick={() => copyToClipboard(formatJSONSimple(selectedLog.request_headers))}\n className=\"px-2 py-0.5 text-xs text-emerald-600 hover:text-emerald-700 font-medium transition-colors\"\n >\n 复制\n </button>\n </div>\n <pre className=\"bg-slate-50/80 border border-slate-200 p-3 rounded-xl text-[10px] overflow-x-auto font-mono text-slate-700\">\n {formatJSONSimple(selectedLog.request_headers)}\n </pre>\n </div>\n <div>\n <div className=\"flex items-center justify-between mb-2\">\n <h4 className=\"text-xs font-semibold text-slate-700\">请求 Query</h4>\n <button\n onClick={() => copyToClipboard(formatJSONSimple(selectedLog.request_query))}\n className=\"px-2 py-0.5 text-xs text-emerald-600 hover:text-emerald-700 font-medium transition-colors\"\n >\n 复制\n </button>\n </div>\n <pre className=\"bg-slate-50/80 border border-slate-200 p-3 rounded-xl text-[10px] overflow-x-auto font-mono text-slate-700\">\n {formatJSONSimple(selectedLog.request_query)}\n </pre>\n </div>\n <div>\n <div className=\"flex items-center justify-between mb-2\">\n <h4 className=\"text-xs font-semibold text-slate-700\">请求 Body</h4>\n <button\n onClick={() => copyToClipboard(formatJSONSimple(selectedLog.request_body))}\n className=\"px-2 py-0.5 text-xs text-emerald-600 hover:text-emerald-700 font-medium transition-colors\"\n >\n 复制\n </button>\n </div>\n <pre className=\"bg-slate-50/80 border border-slate-200 p-3 rounded-xl text-[10px] overflow-x-auto font-mono text-slate-700\">\n {formatJSONSimple(selectedLog.request_body)}\n </pre>\n </div>\n <div>\n <div className=\"flex items-center justify-between mb-2\">\n <h4 className=\"text-xs font-semibold text-slate-700\">响应 Body</h4>\n <div className=\"flex items-center gap-2\">\n {selectedLog && isStreamingResponse(selectedLog.response_body) && (\n <span className=\"px-2 py-0.5 text-xs bg-indigo-100 text-indigo-700 rounded-full border border-indigo-200\">\n 流式响应\n </span>\n )}\n <button\n onClick={() => copyToClipboard(formatRespon(selectedLog.response_body))}\n className=\"px-2 py-0.5 text-xs text-emerald-600 hover:text-emerald-700 font-medium transition-colors\"\n >\n 复制\n </button>\n </div>\n </div>\n <div className=\"bg-slate-50/80 border border-slate-200 rounded-xl p-3 max-h-96 overflow-auto\">\n {(\n <pre className=\"bg-slate-50/80 border border-slate-200 p-3 rounded-xl text-[10px] overflow-x-auto font-mono text-slate-700\">\n {formatRespon(selectedLog.response_body)}\n </pre>\n )}\n </div>\n </div>\n </div>\n <div className=\"mt-5 flex justify-end\">\n <button\n type=\"button\"\n onClick={() => setSelectedLog(null)}\n className=\"px-4 py-1.5 border border-slate-200 rounded-lg text-xs font-semibold text-slate-600 bg-white hover:bg-slate-50 focus:outline-none focus:ring-2 focus:ring-offset-1 focus:ring-slate-400/30 transition-all duration-300\"\n >\n 关闭\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {confirmDialog && (\n <ConfirmDialog\n open={confirmDialog.open}\n title={confirmDialog.title}\n message={confirmDialog.message}\n onConfirm={confirmDialog.onConfirm}\n onCancel={() => setConfirmDialog(null)}\n type=\"danger\"\n />\n )}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- <!DOCTYPE html><!--ryTeHAYUvjT1bYolc_x9Z--><html lang="zh-CN"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/6418ca50028376b7.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/6e0dee5b6681763c.js"/><script src="/_next/static/chunks/f2f58a7e93290fbb.js" async=""></script><script src="/_next/static/chunks/a7f539bf6487f4ff.js" async=""></script><script src="/_next/static/chunks/turbopack-fdb839c72e10c2ea.js" async=""></script><script src="/_next/static/chunks/75f76753fd97c8fd.js" async=""></script><script src="/_next/static/chunks/d2be314c3ece3fbe.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>AAR - AI Agent Router</title><meta name="description" content="Unified API gateway for managing multiple AI model providers"/><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/6e0dee5b6681763c.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[97100,[\"/_next/static/chunks/75f76753fd97c8fd.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"ToastProvider\"]\n3:I[39756,[\"/_next/static/chunks/75f76753fd97c8fd.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n4:I[37457,[\"/_next/static/chunks/75f76753fd97c8fd.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n5:I[97367,[\"/_next/static/chunks/75f76753fd97c8fd.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"OutletBoundary\"]\n6:\"$Sreact.suspense\"\n8:I[97367,[\"/_next/static/chunks/75f76753fd97c8fd.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"ViewportBoundary\"]\na:I[97367,[\"/_next/static/chunks/75f76753fd97c8fd.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"MetadataBoundary\"]\nc:I[68027,[\"/_next/static/chunks/75f76753fd97c8fd.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n:HL[\"/_next/static/chunks/6418ca50028376b7.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"ryTeHAYUvjT1bYolc-x9Z\",\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/6418ca50028376b7.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/75f76753fd97c8fd.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/d2be314c3ece3fbe.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"zh-CN\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@7\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"7:null\nb:[[\"$\",\"title\",\"0\",{\"children\":\"AAR - AI Agent Router\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Unified API gateway for managing multiple AI model providers\"}]]\n"])</script></body></html>
1
+ <!DOCTYPE html><!--cf2SWIkI5HVbnDjLExI42--><html lang="zh-CN"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/6992685fe009e8fd.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/6e0dee5b6681763c.js"/><script src="/_next/static/chunks/f2f58a7e93290fbb.js" async=""></script><script src="/_next/static/chunks/a7f539bf6487f4ff.js" async=""></script><script src="/_next/static/chunks/turbopack-fdb839c72e10c2ea.js" async=""></script><script src="/_next/static/chunks/75f76753fd97c8fd.js" async=""></script><script src="/_next/static/chunks/d2be314c3ece3fbe.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>AAR - AI Agent Router</title><meta name="description" content="Unified API gateway for managing multiple AI model providers"/><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body class="pb-10"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><footer class="fixed bottom-0 left-0 right-0 py-2 text-center text-xs text-gray-400 bg-gray-50 border-t border-gray-200"><span>AAR v<!-- -->0.2.2</span></footer><script src="/_next/static/chunks/6e0dee5b6681763c.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[97100,[\"/_next/static/chunks/75f76753fd97c8fd.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"ToastProvider\"]\n3:I[39756,[\"/_next/static/chunks/75f76753fd97c8fd.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n4:I[37457,[\"/_next/static/chunks/75f76753fd97c8fd.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n5:I[97367,[\"/_next/static/chunks/75f76753fd97c8fd.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"OutletBoundary\"]\n6:\"$Sreact.suspense\"\n8:I[97367,[\"/_next/static/chunks/75f76753fd97c8fd.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"ViewportBoundary\"]\na:I[97367,[\"/_next/static/chunks/75f76753fd97c8fd.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"MetadataBoundary\"]\nc:I[68027,[\"/_next/static/chunks/75f76753fd97c8fd.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n:HL[\"/_next/static/chunks/6992685fe009e8fd.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"cf2SWIkI5HVbnDjLExI42\",\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/6992685fe009e8fd.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/75f76753fd97c8fd.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/d2be314c3ece3fbe.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"zh-CN\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"className\":\"pb-10\",\"children\":[[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}],[\"$\",\"footer\",null,{\"className\":\"fixed bottom-0 left-0 right-0 py-2 text-center text-xs text-gray-400 bg-gray-50 border-t border-gray-200\",\"children\":[\"$\",\"span\",null,{\"children\":[\"AAR v\",\"0.2.2\"]}]}]]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:0:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:0:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:0:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:0:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@7\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"7:null\nb:[[\"$\",\"title\",\"0\",{\"children\":\"AAR - AI Agent Router\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Unified API gateway for managing multiple AI model providers\"}]]\n"])</script></body></html>
@@ -1,2 +1,2 @@
1
- <!DOCTYPE html><!--ryTeHAYUvjT1bYolc_x9Z--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/6e0dee5b6681763c.js"/><script src="/_next/static/chunks/f2f58a7e93290fbb.js" async=""></script><script src="/_next/static/chunks/a7f539bf6487f4ff.js" async=""></script><script src="/_next/static/chunks/turbopack-fdb839c72e10c2ea.js" async=""></script><script src="/_next/static/chunks/ff1a16fafef87110.js" async=""></script><script src="/_next/static/chunks/d2be314c3ece3fbe.js" async=""></script><title>500: Internal Server Error.</title><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
2
- @media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/6e0dee5b6681763c.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n4:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"ViewportBoundary\"]\n9:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"MetadataBoundary\"]\nb:I[68027,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"ryTeHAYUvjT1bYolc-x9Z\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/ff1a16fafef87110.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/d2be314c3ece3fbe.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\na:[]\n"])</script></body></html>
1
+ <!DOCTYPE html><!--cf2SWIkI5HVbnDjLExI42--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/6e0dee5b6681763c.js"/><script src="/_next/static/chunks/f2f58a7e93290fbb.js" async=""></script><script src="/_next/static/chunks/a7f539bf6487f4ff.js" async=""></script><script src="/_next/static/chunks/turbopack-fdb839c72e10c2ea.js" async=""></script><script src="/_next/static/chunks/ff1a16fafef87110.js" async=""></script><script src="/_next/static/chunks/d2be314c3ece3fbe.js" async=""></script><title>500: Internal Server Error.</title><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
2
+ @media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/6e0dee5b6681763c.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n4:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"ViewportBoundary\"]\n9:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"MetadataBoundary\"]\nb:I[68027,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"cf2SWIkI5HVbnDjLExI42\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/ff1a16fafef87110.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/d2be314c3ece3fbe.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\na:[]\n"])</script></body></html>
@@ -1 +1 @@
1
- self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"t/IHj7AcgqK6dbw4FhMQe4sEVOHK3Qajm0qXYSwMHHc=\"\n}"
1
+ self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"sZmRXNgz+8TP6ej7ajOx/xKFqBURYt+fNE4mPo9ilms=\"\n}"
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "node": {},
3
3
  "edge": {},
4
- "encryptionKey": "t/IHj7AcgqK6dbw4FhMQe4sEVOHK3Qajm0qXYSwMHHc="
4
+ "encryptionKey": "sZmRXNgz+8TP6ej7ajOx/xKFqBURYt+fNE4mPo9ilms="
5
5
  }
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,33525,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"warnOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},98183,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={assign:function(){return l},searchParamsToUrlQuery:function(){return u},urlQueryToSearchParams:function(){return i}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});function u(e){let t={};for(let[r,n]of e.entries()){let e=t[r];void 0===e?t[r]=n:Array.isArray(e)?e.push(n):t[r]=[e,n]}return t}function a(e){return"string"==typeof e?e:("number"!=typeof e||isNaN(e))&&"boolean"!=typeof e?"":String(e)}function i(e){let t=new URLSearchParams;for(let[r,n]of Object.entries(e))if(Array.isArray(n))for(let e of n)t.append(r,a(e));else t.set(r,a(n));return t}function l(e,...t){for(let r of t){for(let t of r.keys())e.delete(t);for(let[t,n]of r.entries())e.append(t,n)}return e}},95057,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={formatUrl:function(){return i},formatWithValidation:function(){return s},urlObjectKeys:function(){return l}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(90809)._(e.r(98183)),a=/https?|ftp|gopher|file/;function i(e){let{auth:t,hostname:r}=e,n=e.protocol||"",o=e.pathname||"",i=e.hash||"",l=e.query||"",s=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?s=t+e.host:r&&(s=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(s+=":"+e.port)),l&&"object"==typeof l&&(l=String(u.urlQueryToSearchParams(l)));let c=e.search||l&&`?${l}`||"";return n&&!n.endsWith(":")&&(n+=":"),e.slashes||(!n||a.test(n))&&!1!==s?(s="//"+(s||""),o&&"/"!==o[0]&&(o="/"+o)):s||(s=""),i&&"#"!==i[0]&&(i="#"+i),c&&"?"!==c[0]&&(c="?"+c),o=o.replace(/[?#]/g,encodeURIComponent),c=c.replace("#","%23"),`${n}${s}${o}${c}${i}`}let l=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function s(e){return i(e)}},18581,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return o}});let n=e.r(71645);function o(e,t){let r=(0,n.useRef)(null),o=(0,n.useRef)(null);return(0,n.useCallback)(n=>{if(null===n){let e=r.current;e&&(r.current=null,e());let t=o.current;t&&(o.current=null,t())}else e&&(r.current=u(e,n)),t&&(o.current=u(t,n))},[e,t])}function u(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},18967,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={DecodeError:function(){return y},MiddlewareNotFoundError:function(){return j},MissingStaticPage:function(){return v},NormalizeError:function(){return b},PageNotFoundError:function(){return x},SP:function(){return m},ST:function(){return g},WEB_VITALS:function(){return u},execOnce:function(){return a},getDisplayName:function(){return f},getLocationOrigin:function(){return s},getURL:function(){return c},isAbsoluteUrl:function(){return l},isResSent:function(){return d},loadGetInitialProps:function(){return h},normalizeRepeatedSlashes:function(){return p},stringifyError:function(){return P}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=["CLS","FCP","FID","INP","LCP","TTFB"];function a(e){let t,r=!1;return(...n)=>(r||(r=!0,t=e(...n)),t)}let i=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,l=e=>i.test(e);function s(){let{protocol:e,hostname:t,port:r}=window.location;return`${e}//${t}${r?":"+r:""}`}function c(){let{href:e}=window.location,t=s();return e.substring(t.length)}function f(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function d(e){return e.finished||e.headersSent}function p(e){let t=e.split("?");return t[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(t[1]?`?${t.slice(1).join("?")}`:"")}async function h(e,t){let r=t.res||t.ctx&&t.ctx.res;if(!e.getInitialProps)return t.ctx&&t.Component?{pageProps:await h(t.Component,t.ctx)}:{};let n=await e.getInitialProps(t);if(r&&d(r))return n;if(!n)throw Object.defineProperty(Error(`"${f(e)}.getInitialProps()" should resolve to an object. But found "${n}" instead.`),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});return n}let m="u">typeof performance,g=m&&["mark","measure","getEntriesByName"].every(e=>"function"==typeof performance[e]);class y extends Error{}class b extends Error{}class x extends Error{constructor(e){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message=`Cannot find module for page: ${e}`}}class v extends Error{constructor(e,t){super(),this.message=`Failed to load static file for page: ${e} ${t}`}}class j extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function P(e){return JSON.stringify({message:e.message,stack:e.stack})}},73668,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return u}});let n=e.r(18967),o=e.r(52817);function u(e){if(!(0,n.isAbsoluteUrl)(e))return!0;try{let t=(0,n.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,o.hasBasePath)(r.pathname)}catch(e){return!1}}},84508,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"errorOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},22016,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={default:function(){return y},useLinkStatus:function(){return x}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(90809),a=e.r(43476),i=u._(e.r(71645)),l=e.r(95057),s=e.r(8372),c=e.r(18581),f=e.r(18967),d=e.r(5550);e.r(33525);let p=e.r(91949),h=e.r(73668),m=e.r(9396);function g(e){return"string"==typeof e?e:(0,l.formatUrl)(e)}function y(t){var r;let n,o,u,[l,y]=(0,i.useOptimistic)(p.IDLE_LINK_STATUS),x=(0,i.useRef)(null),{href:v,as:j,children:P,prefetch:_=null,passHref:O,replace:E,shallow:N,scroll:S,onClick:T,onMouseEnter:C,onTouchStart:R,legacyBehavior:w=!1,onNavigate:A,ref:L,unstable_dynamicOnHover:M,...$}=t;n=P,w&&("string"==typeof n||"number"==typeof n)&&(n=(0,a.jsx)("a",{children:n}));let k=i.default.useContext(s.AppRouterContext),I=!1!==_,U=!1!==_?null===(r=_)||"auto"===r?m.FetchStrategy.PPR:m.FetchStrategy.Full:m.FetchStrategy.PPR,{href:F,as:D}=i.default.useMemo(()=>{let e=g(v);return{href:e,as:j?g(j):e}},[v,j]);if(w){if(n?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});o=i.default.Children.only(n)}let B=w?o&&"object"==typeof o&&o.ref:L,K=i.default.useCallback(e=>(null!==k&&(x.current=(0,p.mountLinkInstance)(e,F,k,U,I,y)),()=>{x.current&&((0,p.unmountLinkForCurrentNavigation)(x.current),x.current=null),(0,p.unmountPrefetchableInstance)(e)}),[I,F,k,U,y]),z={ref:(0,c.useMergedRef)(K,B),onClick(t){w||"function"!=typeof T||T(t),w&&o.props&&"function"==typeof o.props.onClick&&o.props.onClick(t),!k||t.defaultPrevented||function(t,r,n,o,u,a,l){if("u">typeof window){let s,{nodeName:c}=t.currentTarget;if("A"===c.toUpperCase()&&((s=t.currentTarget.getAttribute("target"))&&"_self"!==s||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,h.isLocalURL)(r)){u&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),l){let e=!1;if(l({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:f}=e.r(99781);i.default.startTransition(()=>{f(n||r,u?"replace":"push",a??!0,o.current)})}}(t,F,D,x,E,S,A)},onMouseEnter(e){w||"function"!=typeof C||C(e),w&&o.props&&"function"==typeof o.props.onMouseEnter&&o.props.onMouseEnter(e),k&&I&&(0,p.onNavigationIntent)(e.currentTarget,!0===M)},onTouchStart:function(e){w||"function"!=typeof R||R(e),w&&o.props&&"function"==typeof o.props.onTouchStart&&o.props.onTouchStart(e),k&&I&&(0,p.onNavigationIntent)(e.currentTarget,!0===M)}};return(0,f.isAbsoluteUrl)(D)?z.href=D:w&&!O&&("a"!==o.type||"href"in o.props)||(z.href=(0,d.addBasePath)(D)),u=w?i.default.cloneElement(o,z):(0,a.jsx)("a",{...$,...z,children:n}),(0,a.jsx)(b.Provider,{value:l,children:u})}e.r(84508);let b=(0,i.createContext)(p.IDLE_LINK_STATUS),x=()=>(0,i.useContext)(b);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},18566,(e,t,r)=>{t.exports=e.r(76562)},19739,e=>{"use strict";var t=e.i(43476),r=e.i(22016),n=e.i(18566);function o(){let e=(0,n.usePathname)();return(0,t.jsx)("nav",{className:"bg-white/70 backdrop-blur-xl border-b border-emerald-100/30 sticky top-0 z-50",children:(0,t.jsx)("div",{className:"max-w-7xl mx-auto px-6 sm:px-8 lg:px-10",children:(0,t.jsx)("div",{className:"flex items-center justify-between h-16",children:(0,t.jsxs)("div",{className:"flex items-center space-x-12",children:[(0,t.jsxs)(r.default,{href:"/",className:"flex flex-col group transition-all duration-300",children:[(0,t.jsx)("span",{className:"text-xl font-bold text-emerald-700 group-hover:text-emerald-600 transition-colors duration-300 leading-none",children:"AAR"}),(0,t.jsx)("span",{className:"text-[9px] font-medium text-slate-400 tracking-wider uppercase mt-0.5 leading-none",children:"AI Agent Router"})]}),(0,t.jsx)("div",{className:"hidden sm:flex sm:items-center",children:[{href:"/",label:"配置"},{href:"/ide",label:"IDE"},{href:"/providers",label:"供应商"},{href:"/models",label:"模型"},{href:"/logs",label:"日志"}].map(n=>{let o=e===n.href;return(0,t.jsxs)(r.default,{href:n.href,className:"relative inline-flex items-center justify-center w-[68px] h-9 text-xs font-medium transition-colors duration-300 group",style:{minWidth:"68px",maxWidth:"68px"},children:[(0,t.jsx)("span",{className:`absolute inset-0 flex items-center justify-center transition-colors duration-300 ${o?"text-emerald-700 font-semibold":"text-slate-500 group-hover:text-slate-700"}`,children:n.label}),(0,t.jsx)("span",{className:`absolute inset-0 rounded-lg transition-all duration-300 ${o?"bg-emerald-50/60":"bg-transparent group-hover:bg-slate-50/40"}`})]},n.href)})})]})})})})}e.s(["default",()=>o])}]);
@@ -0,0 +1 @@
1
+ *,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border:0 solid #e5e7eb}:before,:after{--tw-content:""}html,:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{line-height:inherit;margin:0}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-feature-settings:normal;font-variation-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:#0000;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{margin:0;padding:0;list-style:none}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder{opacity:1;color:#9ca3af}textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.bottom-0{bottom:0}.left-0{left:0}.left-1\/2{left:50%}.left-2\.5{left:.625rem}.left-3{left:.75rem}.left-4{left:1rem}.left-9{left:2.25rem}.right-0{right:0}.right-2{right:.5rem}.right-2\.5{right:.625rem}.right-4{right:1rem}.top-0{top:0}.top-1\/2{top:50%}.top-20{top:5rem}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.-ml-1{margin-left:-.25rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-10{margin-bottom:2.5rem}.mb-2{margin-bottom:.5rem}.mb-2\.5{margin-bottom:.625rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-2\.5{margin-top:.625rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-8{margin-top:2rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-10{height:2.5rem}.h-16{height:4rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[2px\]{height:2px}.max-h-44{max-height:11rem}.max-h-56{max-height:14rem}.max-h-96{max-height:24rem}.max-h-\[240px\]{max-height:240px}.max-h-\[60vh\]{max-height:60vh}.min-h-\[12rem\]{min-height:12rem}.min-h-\[38px\]{min-height:38px}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-16{width:4rem}.w-2\.5{width:.625rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-\[68px\]{width:68px}.w-full{width:100%}.min-w-full{min-width:100%}.max-w-3xl{max-width:48rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-xs{max-width:20rem}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x:-50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:1s linear infinite spin}.cursor-pointer{cursor:pointer}.resize-y{resize:vertical}.list-none{list-style-type:none}.appearance-none{appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*calc(1 - var(--tw-space-x-reverse)))}.space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3rem*var(--tw-space-x-reverse));margin-left:calc(3rem*calc(1 - var(--tw-space-x-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*calc(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*calc(1 - var(--tw-space-x-reverse)))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.875rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.divide-slate-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(241 245 249/var(--tw-divide-opacity,1))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.border{border-width:1px}.border-0{border-width:0}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-t-0{border-top-width:0}.border-dashed{border-style:dashed}.border-amber-200\/50{border-color:#fde68a80}.border-amber-200\/60{border-color:#fde68a99}.border-amber-200\/80{border-color:#fde68acc}.border-emerald-100\/30{border-color:#d1fae54d}.border-emerald-100\/50{border-color:#d1fae580}.border-emerald-200\/50{border-color:#a7f3d080}.border-emerald-200\/60{border-color:#a7f3d099}.border-emerald-600\/30{border-color:#0596694d}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-indigo-200{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity,1))}.border-rose-200{--tw-border-opacity:1;border-color:rgb(254 205 211/var(--tw-border-opacity,1))}.border-rose-200\/50{border-color:#fecdd380}.border-rose-200\/60{border-color:#fecdd399}.border-rose-600\/30{border-color:#e11d484d}.border-sky-200\/50{border-color:#bae6fd80}.border-slate-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity,1))}.border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity,1))}.border-slate-200\/40{border-color:#e2e8f066}.border-slate-200\/50{border-color:#e2e8f080}.border-slate-200\/80{border-color:#e2e8f0cc}.border-slate-300{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity,1))}.border-slate-700\/30{border-color:#3341554d}.border-slate-800{--tw-border-opacity:1;border-color:rgb(30 41 59/var(--tw-border-opacity,1))}.border-slate-900{--tw-border-opacity:1;border-color:rgb(15 23 42/var(--tw-border-opacity,1))}.border-transparent{border-color:#0000}.border-white\/40{border-color:#fff6}.border-t-slate-900{--tw-border-opacity:1;border-top-color:rgb(15 23 42/var(--tw-border-opacity,1))}.bg-amber-100{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity,1))}.bg-amber-100\/80{background-color:#fef3c7cc}.bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.bg-amber-50\/80{background-color:#fffbebcc}.bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.bg-emerald-100{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity,1))}.bg-emerald-100\/50{background-color:#d1fae580}.bg-emerald-100\/80{background-color:#d1fae5cc}.bg-emerald-50{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity,1))}.bg-emerald-50\/20{background-color:#ecfdf533}.bg-emerald-50\/30{background-color:#ecfdf54d}.bg-emerald-50\/60{background-color:#ecfdf599}.bg-emerald-50\/80{background-color:#ecfdf5cc}.bg-emerald-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity,1))}.bg-emerald-600{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity,1))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.bg-indigo-100{--tw-bg-opacity:1;background-color:rgb(224 231 255/var(--tw-bg-opacity,1))}.bg-indigo-100\/80{background-color:#e0e7ffcc}.bg-rose-100{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity,1))}.bg-rose-100\/50{background-color:#ffe4e680}.bg-rose-100\/80{background-color:#ffe4e6cc}.bg-rose-50\/60{background-color:#fff1f299}.bg-rose-500{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity,1))}.bg-rose-600{--tw-bg-opacity:1;background-color:rgb(225 29 72/var(--tw-bg-opacity,1))}.bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity,1))}.bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.bg-slate-100\/60{background-color:#f1f5f999}.bg-slate-100\/80{background-color:#f1f5f9cc}.bg-slate-100\/90{background-color:#f1f5f9e6}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.bg-slate-50\/60{background-color:#f8fafc99}.bg-slate-50\/80{background-color:#f8fafccc}.bg-slate-600{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity,1))}.bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.bg-slate-900\/40{background-color:#0f172a66}.bg-slate-900\/95{background-color:#0f172af2}.bg-slate-950{--tw-bg-opacity:1;background-color:rgb(2 6 23/var(--tw-bg-opacity,1))}.bg-transparent{background-color:#0000}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-white\/40{background-color:#fff6}.bg-white\/50{background-color:#ffffff80}.bg-white\/60{background-color:#fff9}.bg-white\/70{background-color:#ffffffb3}.bg-white\/80{background-color:#fffc}.bg-white\/90{background-color:#ffffffe6}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-emerald-50\/30{--tw-gradient-from:#ecfdf54d var(--tw-gradient-from-position);--tw-gradient-to:#ecfdf500 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-white\/50{--tw-gradient-from:#ffffff80 var(--tw-gradient-from-position);--tw-gradient-to:#fff0 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.via-white{--tw-gradient-to:#fff0 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),#fff var(--tw-gradient-via-position),var(--tw-gradient-to)}.to-slate-50\/50{--tw-gradient-to:#f8fafc80 var(--tw-gradient-to-position)}.to-transparent{--tw-gradient-to:transparent var(--tw-gradient-to-position)}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-3\.5{padding:.875rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.pb-10{padding-bottom:2.5rem}.pb-20{padding-bottom:5rem}.pb-4{padding-bottom:1rem}.pl-9{padding-left:2.25rem}.pr-20{padding-right:5rem}.pr-3{padding-right:.75rem}.pr-7{padding-right:1.75rem}.pr-8{padding-right:2rem}.pr-9{padding-right:2.25rem}.pt-1{padding-top:.25rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-bottom{vertical-align:bottom}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-4{line-height:1rem}.leading-none{line-height:1}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.text-amber-600{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity,1))}.text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.text-emerald-500{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity,1))}.text-emerald-600{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity,1))}.text-emerald-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity,1))}.text-emerald-700\/80{color:#047857cc}.text-emerald-800{--tw-text-opacity:1;color:rgb(6 95 70/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.text-indigo-700{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity,1))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.text-rose-500{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity,1))}.text-rose-600{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity,1))}.text-rose-700{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity,1))}.text-rose-700\/80{color:#be123ccc}.text-sky-700{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity,1))}.text-slate-200{--tw-text-opacity:1;color:rgb(226 232 240/var(--tw-text-opacity,1))}.text-slate-300{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity,1))}.text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}.text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}.text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity,1))}.text-slate-700{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity,1))}.text-slate-800{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity,1))}.text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-yellow-600{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity,1))}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-emerald-500\/20{--tw-shadow-color:#10b98133;--tw-shadow:var(--tw-shadow-colored)}.shadow-rose-500\/20{--tw-shadow-color:#f43f5e33;--tw-shadow:var(--tw-shadow-colored)}.shadow-slate-600\/20{--tw-shadow-color:#47556933;--tw-shadow:var(--tw-shadow-colored)}.filter{filter:var(--tw-blur)var(--tw-brightness)var(--tw-contrast)var(--tw-grayscale)var(--tw-hue-rotate)var(--tw-invert)var(--tw-saturate)var(--tw-sepia)var(--tw-drop-shadow)}.backdrop-blur-md{--tw-backdrop-blur:blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur)var(--tw-backdrop-brightness)var(--tw-backdrop-contrast)var(--tw-backdrop-grayscale)var(--tw-backdrop-hue-rotate)var(--tw-backdrop-invert)var(--tw-backdrop-opacity)var(--tw-backdrop-saturate)var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur)var(--tw-backdrop-brightness)var(--tw-backdrop-contrast)var(--tw-backdrop-grayscale)var(--tw-backdrop-hue-rotate)var(--tw-backdrop-invert)var(--tw-backdrop-opacity)var(--tw-backdrop-saturate)var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur)var(--tw-backdrop-brightness)var(--tw-backdrop-contrast)var(--tw-backdrop-grayscale)var(--tw-backdrop-hue-rotate)var(--tw-backdrop-invert)var(--tw-backdrop-opacity)var(--tw-backdrop-saturate)var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur)var(--tw-backdrop-brightness)var(--tw-backdrop-contrast)var(--tw-backdrop-grayscale)var(--tw-backdrop-hue-rotate)var(--tw-backdrop-invert)var(--tw-backdrop-opacity)var(--tw-backdrop-saturate)var(--tw-backdrop-sepia)}.backdrop-blur-xl{--tw-backdrop-blur:blur(24px);-webkit-backdrop-filter:var(--tw-backdrop-blur)var(--tw-backdrop-brightness)var(--tw-backdrop-contrast)var(--tw-backdrop-grayscale)var(--tw-backdrop-hue-rotate)var(--tw-backdrop-invert)var(--tw-backdrop-opacity)var(--tw-backdrop-saturate)var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur)var(--tw-backdrop-brightness)var(--tw-backdrop-contrast)var(--tw-backdrop-grayscale)var(--tw-backdrop-hue-rotate)var(--tw-backdrop-invert)var(--tw-backdrop-opacity)var(--tw-backdrop-saturate)var(--tw-backdrop-sepia)}.transition-all{transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-property:opacity;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-property:transform;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}:root{--background:#fafbf9;--foreground:#2d3436;--emerald-50:#ecfdf5;--emerald-100:#d1fae5;--emerald-500:#10b981;--emerald-700:#047857;--slate-50:#f8fafc;--slate-100:#f1f5f9;--slate-400:#94a3b8;--slate-500:#64748b;--slate-600:#475569;--slate-700:#334155;--slate-800:#1e293b}body{color:var(--foreground);background:var(--background);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;letter-spacing:-.01em;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}input,select,textarea{transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1)}input:focus,select:focus,textarea:focus{outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:#34d39933;--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;outline:2px solid #0000}button{transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1)}button:disabled{cursor:not-allowed;opacity:.5}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:#f1f5f9}::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#94a3b8}.opencode-preview-textarea::-moz-selection{color:inherit!important;background:0 0!important}.opencode-preview-textarea::selection{color:inherit!important;background:0 0!important}.opencode-preview-textarea:focus{box-shadow:none!important;--tw-ring-shadow:none!important;--tw-ring-offset-shadow:none!important;outline:none!important}.placeholder\:text-slate-500::placeholder{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}.last\:border-0:last-child{border-width:0}.hover\:border-amber-300:hover{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity,1))}.hover\:border-emerald-300:hover{--tw-border-opacity:1;border-color:rgb(110 231 183/var(--tw-border-opacity,1))}.hover\:border-slate-300:hover{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity,1))}.hover\:border-slate-300\/60:hover{border-color:#cbd5e199}.hover\:border-slate-300\/80:hover{border-color:#cbd5e1cc}.hover\:bg-amber-100:hover{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity,1))}.hover\:bg-amber-200:hover{--tw-bg-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity,1))}.hover\:bg-amber-50:hover{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.hover\:bg-amber-50\/50:hover{background-color:#fffbeb80}.hover\:bg-amber-600:hover{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity,1))}.hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity,1))}.hover\:bg-emerald-100:hover{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity,1))}.hover\:bg-emerald-200:hover{--tw-bg-opacity:1;background-color:rgb(167 243 208/var(--tw-bg-opacity,1))}.hover\:bg-emerald-50:hover{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity,1))}.hover\:bg-emerald-50\/20:hover{background-color:#ecfdf533}.hover\:bg-emerald-50\/50:hover{background-color:#ecfdf580}.hover\:bg-emerald-700:hover{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity,1))}.hover\:bg-indigo-50:hover{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity,1))}.hover\:bg-rose-50:hover{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity,1))}.hover\:bg-rose-600:hover{--tw-bg-opacity:1;background-color:rgb(225 29 72/var(--tw-bg-opacity,1))}.hover\:bg-rose-700:hover{--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity,1))}.hover\:bg-slate-200\/80:hover{background-color:#e2e8f0cc}.hover\:bg-slate-50:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.hover\:bg-slate-700:hover{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity,1))}.hover\:bg-slate-800:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.hover\:bg-white:hover{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.hover\:from-slate-50\/60:hover{--tw-gradient-from:#f8fafc99 var(--tw-gradient-from-position);--tw-gradient-to:#f8fafc00 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.hover\:text-amber-700:hover{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.hover\:text-emerald-600:hover{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity,1))}.hover\:text-emerald-700:hover{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity,1))}.hover\:text-rose-500:hover{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity,1))}.hover\:text-rose-600:hover{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity,1))}.hover\:text-slate-600:hover{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity,1))}.hover\:text-slate-700:hover{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity,1))}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-sm:hover{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:border-amber-400:focus{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity,1))}.focus\:border-emerald-400:focus{--tw-border-opacity:1;border-color:rgb(52 211 153/var(--tw-border-opacity,1))}.focus\:border-emerald-500:focus{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity,1))}.focus\:border-indigo-400:focus{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity,1))}.focus\:border-rose-400:focus{--tw-border-opacity:1;border-color:rgb(251 113 133/var(--tw-border-opacity,1))}.focus\:border-slate-400\/80:focus{border-color:#94a3b8cc}.focus\:outline-none:focus{outline-offset:2px;outline:2px solid #0000}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-amber-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(253 230 138/var(--tw-ring-opacity,1))}.focus\:ring-amber-500\/50:focus{--tw-ring-color:#f59e0b80}.focus\:ring-blue-500\/50:focus{--tw-ring-color:#3b82f680}.focus\:ring-emerald-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(167 243 208/var(--tw-ring-opacity,1))}.focus\:ring-emerald-400\/20:focus{--tw-ring-color:#34d39933}.focus\:ring-emerald-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(16 185 129/var(--tw-ring-opacity,1))}.focus\:ring-emerald-500\/30:focus{--tw-ring-color:#10b9814d}.focus\:ring-emerald-500\/50:focus{--tw-ring-color:#10b98180}.focus\:ring-indigo-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(199 210 254/var(--tw-ring-opacity,1))}.focus\:ring-indigo-200\/50:focus{--tw-ring-color:#c7d2fe80}.focus\:ring-rose-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(254 205 211/var(--tw-ring-opacity,1))}.focus\:ring-rose-200\/50:focus{--tw-ring-color:#fecdd380}.focus\:ring-rose-500\/50:focus{--tw-ring-color:#f43f5e80}.focus\:ring-slate-200\/50:focus{--tw-ring-color:#e2e8f080}.focus\:ring-slate-400\/30:focus{--tw-ring-color:#94a3b84d}.focus\:ring-offset-0:focus{--tw-ring-offset-width:0px}.focus\:ring-offset-1:focus{--tw-ring-offset-width:1px}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group[open] .group-open\:rotate-90{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.group\/tip:hover .group-hover\/tip\:visible{visibility:visible}.group:hover .group-hover\:bg-slate-50\/40{background-color:#f8fafc66}.group:hover .group-hover\:text-emerald-600{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity,1))}.group:hover .group-hover\:text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity,1))}.group:hover .group-hover\:text-slate-700{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity,1))}.group\/tip:hover .group-hover\/tip\:opacity-100{opacity:1}@media (min-width:640px){.sm\:my-8{margin-top:2rem;margin-bottom:2rem}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:w-full{width:100%}.sm\:max-w-3xl{max-width:48rem}.sm\:max-w-md{max-width:28rem}.sm\:max-w-sm{max-width:24rem}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:p-0{padding:0}.sm\:p-6{padding:1.5rem}.sm\:px-0{padding-left:0;padding-right:0}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:px-8{padding-left:2rem;padding-right:2rem}.sm\:align-middle{vertical-align:middle}}@media (min-width:1024px){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:px-10{padding-left:2.5rem;padding-right:2.5rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}}.\[\&\:\:-webkit-scrollbar-thumb\]\:rounded-full::-webkit-scrollbar-thumb{border-radius:9999px}.\[\&\:\:-webkit-scrollbar-thumb\]\:bg-slate-600::-webkit-scrollbar-thumb{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity,1))}.\[\&\:\:-webkit-scrollbar-track\]\:bg-slate-900::-webkit-scrollbar-track{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.\[\&\:\:-webkit-scrollbar\]\:w-2::-webkit-scrollbar{width:.5rem}