@whxway/loom 1.0.1 → 1.1.0

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 (353) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build/56416d4ae4ce586f.js +6 -0
  3. package/.next/build/56416d4ae4ce586f.js.map +5 -0
  4. package/.next/build/chunks/[root-of-the-server]__0oj80bi._.js +206 -0
  5. package/.next/build/chunks/[root-of-the-server]__0oj80bi._.js.map +8 -0
  6. package/.next/build/chunks/[root-of-the-server]__1f933tp._.js +500 -0
  7. package/.next/build/chunks/[root-of-the-server]__1f933tp._.js.map +11 -0
  8. package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_0b7xl6g._.js +13 -0
  9. package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_0b7xl6g._.js.map +5 -0
  10. package/.next/build/chunks/[turbopack]_runtime.js +890 -0
  11. package/.next/build/chunks/[turbopack]_runtime.js.map +11 -0
  12. package/.next/build/chunks/node_modules_20v-8wl._.js +6824 -0
  13. package/.next/build/chunks/node_modules_20v-8wl._.js.map +47 -0
  14. package/.next/build/package.json +1 -0
  15. package/.next/build-manifest.json +3 -3
  16. package/.next/cache/.previewinfo +1 -0
  17. package/.next/cache/.rscinfo +1 -0
  18. package/.next/cache/.tsbuildinfo +1 -0
  19. package/.next/diagnostics/build-diagnostics.json +6 -0
  20. package/.next/diagnostics/framework.json +1 -0
  21. package/.next/diagnostics/route-bundle-stats.json +488 -0
  22. package/.next/fallback-build-manifest.json +3 -3
  23. package/.next/prerender-manifest.json +3 -3
  24. package/.next/server/app/(auth)/login/page_client-reference-manifest.js +1 -1
  25. package/.next/server/app/(dashboard)/logs/page_client-reference-manifest.js +1 -1
  26. package/.next/server/app/(dashboard)/mcp/page.js.nft.json +1 -1
  27. package/.next/server/app/(dashboard)/mcp/page_client-reference-manifest.js +1 -1
  28. package/.next/server/app/(dashboard)/mcp/presets/page_client-reference-manifest.js +1 -1
  29. package/.next/server/app/(dashboard)/models/[name]/page_client-reference-manifest.js +1 -1
  30. package/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  31. package/.next/server/app/(dashboard)/playground/audio/speech/page_client-reference-manifest.js +1 -1
  32. package/.next/server/app/(dashboard)/playground/audio/transcription/page_client-reference-manifest.js +1 -1
  33. package/.next/server/app/(dashboard)/playground/chat/page.js.nft.json +1 -1
  34. package/.next/server/app/(dashboard)/playground/chat/page_client-reference-manifest.js +1 -1
  35. package/.next/server/app/(dashboard)/playground/embedding/page_client-reference-manifest.js +1 -1
  36. package/.next/server/app/(dashboard)/playground/image/page_client-reference-manifest.js +1 -1
  37. package/.next/server/app/(dashboard)/playground/page_client-reference-manifest.js +1 -1
  38. package/.next/server/app/(dashboard)/playground/video/page_client-reference-manifest.js +1 -1
  39. package/.next/server/app/(dashboard)/providers/[name]/page.js.nft.json +1 -1
  40. package/.next/server/app/(dashboard)/providers/[name]/page_client-reference-manifest.js +1 -1
  41. package/.next/server/app/(dashboard)/providers/page.js.nft.json +1 -1
  42. package/.next/server/app/(dashboard)/providers/page_client-reference-manifest.js +1 -1
  43. package/.next/server/app/(dashboard)/settings/api-keys/page_client-reference-manifest.js +1 -1
  44. package/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
  45. package/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
  46. package/.next/server/app/(dashboard)/settings/users/page.js.nft.json +1 -1
  47. package/.next/server/app/(dashboard)/settings/users/page_client-reference-manifest.js +1 -1
  48. package/.next/server/app/_global-error.html +1 -1
  49. package/.next/server/app/_global-error.rsc +1 -1
  50. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  51. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  52. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  53. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  54. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  55. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  56. package/.next/server/app/_not-found.html +2 -2
  57. package/.next/server/app/_not-found.rsc +3 -3
  58. package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  59. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  60. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  61. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  62. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  63. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  64. package/.next/server/app/api/adapters/route.js.nft.json +1 -1
  65. package/.next/server/app/api/apikeys/[id]/route.js.nft.json +1 -1
  66. package/.next/server/app/api/apikeys/route.js.nft.json +1 -1
  67. package/.next/server/app/api/capabilities/route.js.nft.json +1 -1
  68. package/.next/server/app/api/conversations/[id]/messages/route.js.nft.json +1 -1
  69. package/.next/server/app/api/conversations/[id]/route.js.nft.json +1 -1
  70. package/.next/server/app/api/conversations/route.js.nft.json +1 -1
  71. package/.next/server/app/api/health/route.js.nft.json +1 -1
  72. package/.next/server/app/api/login/route.js.nft.json +1 -1
  73. package/.next/server/app/api/logout/route.js.nft.json +1 -1
  74. package/.next/server/app/api/logs/generations/[id]/images/[idx]/route.js.nft.json +1 -1
  75. package/.next/server/app/api/logs/generations/[id]/route.js.nft.json +1 -1
  76. package/.next/server/app/api/logs/generations/route.js.nft.json +1 -1
  77. package/.next/server/app/api/mcp/presets/route.js.nft.json +1 -1
  78. package/.next/server/app/api/mcp/servers/[id]/check/route.js.nft.json +1 -1
  79. package/.next/server/app/api/mcp/servers/[id]/route.js.nft.json +1 -1
  80. package/.next/server/app/api/mcp/servers/[id]/tools/route.js.nft.json +1 -1
  81. package/.next/server/app/api/mcp/servers/route.js.nft.json +1 -1
  82. package/.next/server/app/api/messages/[id]/rate/route.js.nft.json +1 -1
  83. package/.next/server/app/api/models/[id]/route.js.nft.json +1 -1
  84. package/.next/server/app/api/models/route.js.nft.json +1 -1
  85. package/.next/server/app/api/ping/route.js.nft.json +1 -1
  86. package/.next/server/app/api/playground/chat/route.js.nft.json +1 -1
  87. package/.next/server/app/api/playground/embedding/route.js.nft.json +1 -1
  88. package/.next/server/app/api/providers/[id]/check/route.js.nft.json +1 -1
  89. package/.next/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  90. package/.next/server/app/api/providers/[id]/route.js.nft.json +1 -1
  91. package/.next/server/app/api/providers/probe/route.js.nft.json +1 -1
  92. package/.next/server/app/api/providers/reload/route.js.nft.json +1 -1
  93. package/.next/server/app/api/providers/route.js.nft.json +1 -1
  94. package/.next/server/app/api/stats/models/[name]/route.js.nft.json +1 -1
  95. package/.next/server/app/api/stats/route.js.nft.json +1 -1
  96. package/.next/server/app/api/tools/[id]/route.js.nft.json +1 -1
  97. package/.next/server/app/api/tools/route.js.nft.json +1 -1
  98. package/.next/server/app/api/users/[username]/route.js.nft.json +1 -1
  99. package/.next/server/app/api/users/me/preferences/route.js.nft.json +1 -1
  100. package/.next/server/app/api/users/me/route.js.nft.json +1 -1
  101. package/.next/server/app/api/users/route.js.nft.json +1 -1
  102. package/.next/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  103. package/.next/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
  104. package/.next/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  105. package/.next/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  106. package/.next/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  107. package/.next/server/app/api/v1/models/route.js.nft.json +1 -1
  108. package/.next/server/app/api/v1/rerank/route.js.nft.json +1 -1
  109. package/.next/server/app/api/v1/videos/[id]/content/route.js.nft.json +1 -1
  110. package/.next/server/app/api/v1/videos/[id]/route.js.nft.json +1 -1
  111. package/.next/server/app/api/v1/videos/route.js.nft.json +1 -1
  112. package/.next/server/app/api/variants/route.js.nft.json +1 -1
  113. package/.next/server/app/index.html +2 -2
  114. package/.next/server/app/index.rsc +3 -3
  115. package/.next/server/app/index.segments/!KGRhc2hib2FyZCk/__PAGE__.segment.rsc +1 -1
  116. package/.next/server/app/index.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  117. package/.next/server/app/index.segments/_full.segment.rsc +3 -3
  118. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  119. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  120. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  121. package/.next/server/app/login.html +2 -2
  122. package/.next/server/app/login.rsc +3 -3
  123. package/.next/server/app/login.segments/!KGF1dGgp/login/__PAGE__.segment.rsc +1 -1
  124. package/.next/server/app/login.segments/!KGF1dGgp/login.segment.rsc +1 -1
  125. package/.next/server/app/login.segments/!KGF1dGgp.segment.rsc +1 -1
  126. package/.next/server/app/login.segments/_full.segment.rsc +3 -3
  127. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  128. package/.next/server/app/login.segments/_index.segment.rsc +2 -2
  129. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  130. package/.next/server/app/logs.html +2 -2
  131. package/.next/server/app/logs.rsc +3 -3
  132. package/.next/server/app/logs.segments/!KGRhc2hib2FyZCk/logs/__PAGE__.segment.rsc +1 -1
  133. package/.next/server/app/logs.segments/!KGRhc2hib2FyZCk/logs.segment.rsc +1 -1
  134. package/.next/server/app/logs.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  135. package/.next/server/app/logs.segments/_full.segment.rsc +3 -3
  136. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  137. package/.next/server/app/logs.segments/_index.segment.rsc +2 -2
  138. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  139. package/.next/server/app/mcp/presets.html +2 -2
  140. package/.next/server/app/mcp/presets.rsc +5 -5
  141. package/.next/server/app/mcp/presets.segments/!KGRhc2hib2FyZCk/mcp/presets/__PAGE__.segment.rsc +2 -2
  142. package/.next/server/app/mcp/presets.segments/!KGRhc2hib2FyZCk/mcp/presets.segment.rsc +1 -1
  143. package/.next/server/app/mcp/presets.segments/!KGRhc2hib2FyZCk/mcp.segment.rsc +1 -1
  144. package/.next/server/app/mcp/presets.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  145. package/.next/server/app/mcp/presets.segments/_full.segment.rsc +5 -5
  146. package/.next/server/app/mcp/presets.segments/_head.segment.rsc +1 -1
  147. package/.next/server/app/mcp/presets.segments/_index.segment.rsc +2 -2
  148. package/.next/server/app/mcp/presets.segments/_tree.segment.rsc +2 -2
  149. package/.next/server/app/mcp.html +2 -2
  150. package/.next/server/app/mcp.rsc +5 -5
  151. package/.next/server/app/mcp.segments/!KGRhc2hib2FyZCk/mcp/__PAGE__.segment.rsc +2 -2
  152. package/.next/server/app/mcp.segments/!KGRhc2hib2FyZCk/mcp.segment.rsc +1 -1
  153. package/.next/server/app/mcp.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  154. package/.next/server/app/mcp.segments/_full.segment.rsc +5 -5
  155. package/.next/server/app/mcp.segments/_head.segment.rsc +1 -1
  156. package/.next/server/app/mcp.segments/_index.segment.rsc +2 -2
  157. package/.next/server/app/mcp.segments/_tree.segment.rsc +2 -2
  158. package/.next/server/app/playground/audio/speech.html +2 -2
  159. package/.next/server/app/playground/audio/speech.rsc +3 -3
  160. package/.next/server/app/playground/audio/speech.segments/!KGRhc2hib2FyZCk/playground/audio/speech/__PAGE__.segment.rsc +1 -1
  161. package/.next/server/app/playground/audio/speech.segments/!KGRhc2hib2FyZCk/playground/audio/speech.segment.rsc +1 -1
  162. package/.next/server/app/playground/audio/speech.segments/!KGRhc2hib2FyZCk/playground/audio.segment.rsc +1 -1
  163. package/.next/server/app/playground/audio/speech.segments/!KGRhc2hib2FyZCk/playground.segment.rsc +1 -1
  164. package/.next/server/app/playground/audio/speech.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  165. package/.next/server/app/playground/audio/speech.segments/_full.segment.rsc +3 -3
  166. package/.next/server/app/playground/audio/speech.segments/_head.segment.rsc +1 -1
  167. package/.next/server/app/playground/audio/speech.segments/_index.segment.rsc +2 -2
  168. package/.next/server/app/playground/audio/speech.segments/_tree.segment.rsc +2 -2
  169. package/.next/server/app/playground/audio/transcription.html +2 -2
  170. package/.next/server/app/playground/audio/transcription.rsc +3 -3
  171. package/.next/server/app/playground/audio/transcription.segments/!KGRhc2hib2FyZCk/playground/audio/transcription/__PAGE__.segment.rsc +1 -1
  172. package/.next/server/app/playground/audio/transcription.segments/!KGRhc2hib2FyZCk/playground/audio/transcription.segment.rsc +1 -1
  173. package/.next/server/app/playground/audio/transcription.segments/!KGRhc2hib2FyZCk/playground/audio.segment.rsc +1 -1
  174. package/.next/server/app/playground/audio/transcription.segments/!KGRhc2hib2FyZCk/playground.segment.rsc +1 -1
  175. package/.next/server/app/playground/audio/transcription.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  176. package/.next/server/app/playground/audio/transcription.segments/_full.segment.rsc +3 -3
  177. package/.next/server/app/playground/audio/transcription.segments/_head.segment.rsc +1 -1
  178. package/.next/server/app/playground/audio/transcription.segments/_index.segment.rsc +2 -2
  179. package/.next/server/app/playground/audio/transcription.segments/_tree.segment.rsc +2 -2
  180. package/.next/server/app/playground/chat.html +2 -2
  181. package/.next/server/app/playground/chat.rsc +5 -5
  182. package/.next/server/app/playground/chat.segments/!KGRhc2hib2FyZCk/playground/chat/__PAGE__.segment.rsc +2 -2
  183. package/.next/server/app/playground/chat.segments/!KGRhc2hib2FyZCk/playground/chat.segment.rsc +1 -1
  184. package/.next/server/app/playground/chat.segments/!KGRhc2hib2FyZCk/playground.segment.rsc +1 -1
  185. package/.next/server/app/playground/chat.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  186. package/.next/server/app/playground/chat.segments/_full.segment.rsc +5 -5
  187. package/.next/server/app/playground/chat.segments/_head.segment.rsc +1 -1
  188. package/.next/server/app/playground/chat.segments/_index.segment.rsc +2 -2
  189. package/.next/server/app/playground/chat.segments/_tree.segment.rsc +2 -2
  190. package/.next/server/app/playground/embedding.html +2 -2
  191. package/.next/server/app/playground/embedding.rsc +3 -3
  192. package/.next/server/app/playground/embedding.segments/!KGRhc2hib2FyZCk/playground/embedding/__PAGE__.segment.rsc +1 -1
  193. package/.next/server/app/playground/embedding.segments/!KGRhc2hib2FyZCk/playground/embedding.segment.rsc +1 -1
  194. package/.next/server/app/playground/embedding.segments/!KGRhc2hib2FyZCk/playground.segment.rsc +1 -1
  195. package/.next/server/app/playground/embedding.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  196. package/.next/server/app/playground/embedding.segments/_full.segment.rsc +3 -3
  197. package/.next/server/app/playground/embedding.segments/_head.segment.rsc +1 -1
  198. package/.next/server/app/playground/embedding.segments/_index.segment.rsc +2 -2
  199. package/.next/server/app/playground/embedding.segments/_tree.segment.rsc +2 -2
  200. package/.next/server/app/playground/image.html +2 -2
  201. package/.next/server/app/playground/image.rsc +3 -3
  202. package/.next/server/app/playground/image.segments/!KGRhc2hib2FyZCk/playground/image/__PAGE__.segment.rsc +1 -1
  203. package/.next/server/app/playground/image.segments/!KGRhc2hib2FyZCk/playground/image.segment.rsc +1 -1
  204. package/.next/server/app/playground/image.segments/!KGRhc2hib2FyZCk/playground.segment.rsc +1 -1
  205. package/.next/server/app/playground/image.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  206. package/.next/server/app/playground/image.segments/_full.segment.rsc +3 -3
  207. package/.next/server/app/playground/image.segments/_head.segment.rsc +1 -1
  208. package/.next/server/app/playground/image.segments/_index.segment.rsc +2 -2
  209. package/.next/server/app/playground/image.segments/_tree.segment.rsc +2 -2
  210. package/.next/server/app/playground/video.html +2 -2
  211. package/.next/server/app/playground/video.rsc +3 -3
  212. package/.next/server/app/playground/video.segments/!KGRhc2hib2FyZCk/playground/video/__PAGE__.segment.rsc +1 -1
  213. package/.next/server/app/playground/video.segments/!KGRhc2hib2FyZCk/playground/video.segment.rsc +1 -1
  214. package/.next/server/app/playground/video.segments/!KGRhc2hib2FyZCk/playground.segment.rsc +1 -1
  215. package/.next/server/app/playground/video.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  216. package/.next/server/app/playground/video.segments/_full.segment.rsc +3 -3
  217. package/.next/server/app/playground/video.segments/_head.segment.rsc +1 -1
  218. package/.next/server/app/playground/video.segments/_index.segment.rsc +2 -2
  219. package/.next/server/app/playground/video.segments/_tree.segment.rsc +2 -2
  220. package/.next/server/app/playground.html +2 -2
  221. package/.next/server/app/playground.rsc +3 -3
  222. package/.next/server/app/playground.segments/!KGRhc2hib2FyZCk/playground/__PAGE__.segment.rsc +1 -1
  223. package/.next/server/app/playground.segments/!KGRhc2hib2FyZCk/playground.segment.rsc +1 -1
  224. package/.next/server/app/playground.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  225. package/.next/server/app/playground.segments/_full.segment.rsc +3 -3
  226. package/.next/server/app/playground.segments/_head.segment.rsc +1 -1
  227. package/.next/server/app/playground.segments/_index.segment.rsc +2 -2
  228. package/.next/server/app/playground.segments/_tree.segment.rsc +2 -2
  229. package/.next/server/app/providers.html +2 -2
  230. package/.next/server/app/providers.rsc +5 -5
  231. package/.next/server/app/providers.segments/!KGRhc2hib2FyZCk/providers/__PAGE__.segment.rsc +2 -2
  232. package/.next/server/app/providers.segments/!KGRhc2hib2FyZCk/providers.segment.rsc +1 -1
  233. package/.next/server/app/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  234. package/.next/server/app/providers.segments/_full.segment.rsc +5 -5
  235. package/.next/server/app/providers.segments/_head.segment.rsc +1 -1
  236. package/.next/server/app/providers.segments/_index.segment.rsc +2 -2
  237. package/.next/server/app/providers.segments/_tree.segment.rsc +2 -2
  238. package/.next/server/app/settings/api-keys.html +2 -2
  239. package/.next/server/app/settings/api-keys.rsc +3 -3
  240. package/.next/server/app/settings/api-keys.segments/!KGRhc2hib2FyZCk/settings/api-keys/__PAGE__.segment.rsc +1 -1
  241. package/.next/server/app/settings/api-keys.segments/!KGRhc2hib2FyZCk/settings/api-keys.segment.rsc +1 -1
  242. package/.next/server/app/settings/api-keys.segments/!KGRhc2hib2FyZCk/settings.segment.rsc +1 -1
  243. package/.next/server/app/settings/api-keys.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  244. package/.next/server/app/settings/api-keys.segments/_full.segment.rsc +3 -3
  245. package/.next/server/app/settings/api-keys.segments/_head.segment.rsc +1 -1
  246. package/.next/server/app/settings/api-keys.segments/_index.segment.rsc +2 -2
  247. package/.next/server/app/settings/api-keys.segments/_tree.segment.rsc +2 -2
  248. package/.next/server/app/settings/users.html +2 -2
  249. package/.next/server/app/settings/users.rsc +5 -5
  250. package/.next/server/app/settings/users.segments/!KGRhc2hib2FyZCk/settings/users/__PAGE__.segment.rsc +2 -2
  251. package/.next/server/app/settings/users.segments/!KGRhc2hib2FyZCk/settings/users.segment.rsc +1 -1
  252. package/.next/server/app/settings/users.segments/!KGRhc2hib2FyZCk/settings.segment.rsc +1 -1
  253. package/.next/server/app/settings/users.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  254. package/.next/server/app/settings/users.segments/_full.segment.rsc +5 -5
  255. package/.next/server/app/settings/users.segments/_head.segment.rsc +1 -1
  256. package/.next/server/app/settings/users.segments/_index.segment.rsc +2 -2
  257. package/.next/server/app/settings/users.segments/_tree.segment.rsc +2 -2
  258. package/.next/server/app/settings.html +2 -2
  259. package/.next/server/app/settings.rsc +5 -5
  260. package/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings/__PAGE__.segment.rsc +2 -2
  261. package/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings.segment.rsc +1 -1
  262. package/.next/server/app/settings.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  263. package/.next/server/app/settings.segments/_full.segment.rsc +5 -5
  264. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  265. package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  266. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  267. package/.next/server/chunks/[root-of-the-server]__02sypva._.js +2 -2
  268. package/.next/server/chunks/[root-of-the-server]__02sypva._.js.map +1 -1
  269. package/.next/server/chunks/[root-of-the-server]__0g3mnim._.js +4 -1
  270. package/.next/server/chunks/[root-of-the-server]__0g3mnim._.js.map +1 -1
  271. package/.next/server/chunks/[root-of-the-server]__0myi8j1._.js +2 -2
  272. package/.next/server/chunks/[root-of-the-server]__0myi8j1._.js.map +1 -1
  273. package/.next/server/chunks/[root-of-the-server]__1qg3d87._.js +2 -2
  274. package/.next/server/chunks/[root-of-the-server]__1qg3d87._.js.map +1 -1
  275. package/.next/server/chunks/ssr/_001fhst._.js +3 -0
  276. package/.next/server/chunks/ssr/_001fhst._.js.map +1 -0
  277. package/.next/server/chunks/ssr/_02wtd-0._.js +3 -0
  278. package/.next/server/chunks/ssr/_02wtd-0._.js.map +1 -0
  279. package/.next/server/chunks/ssr/_05ufvn1._.js +9 -0
  280. package/.next/server/chunks/ssr/_05ufvn1._.js.map +1 -0
  281. package/.next/server/chunks/ssr/{_1fd20ju._.js → _066w-6f._.js} +2 -2
  282. package/.next/server/chunks/ssr/{_1fd20ju._.js.map → _066w-6f._.js.map} +1 -1
  283. package/.next/server/chunks/ssr/_0gd7kq_._.js +1 -1
  284. package/.next/server/chunks/ssr/_0gd7kq_._.js.map +1 -1
  285. package/.next/server/chunks/ssr/_0k-6auj._.js +3 -0
  286. package/.next/server/chunks/ssr/_0k-6auj._.js.map +1 -0
  287. package/.next/server/chunks/ssr/_0qo9tx1._.js +3 -0
  288. package/.next/server/chunks/ssr/_0qo9tx1._.js.map +1 -0
  289. package/.next/server/chunks/ssr/_0uom5g-._.js +9 -0
  290. package/.next/server/chunks/ssr/_0uom5g-._.js.map +1 -0
  291. package/.next/server/chunks/ssr/_1b09eqp._.js +1 -1
  292. package/.next/server/chunks/ssr/_1b09eqp._.js.map +1 -1
  293. package/.next/server/chunks/ssr/_1oi0iqt._.js +9 -0
  294. package/.next/server/chunks/ssr/_1oi0iqt._.js.map +1 -0
  295. package/.next/server/chunks/ssr/_1q3gglq._.js +3 -0
  296. package/.next/server/chunks/ssr/_1q3gglq._.js.map +1 -0
  297. package/.next/server/chunks/ssr/_1y5sreb._.js +3 -0
  298. package/.next/server/chunks/ssr/_1y5sreb._.js.map +1 -0
  299. package/.next/server/chunks/ssr/_1zlpzyk._.js +1 -1
  300. package/.next/server/chunks/ssr/_1zlpzyk._.js.map +1 -1
  301. package/.next/server/chunks/ssr/app_(dashboard)_mcp_page_tsx_0cg7pz9._.js +1 -1
  302. package/.next/server/chunks/ssr/app_(dashboard)_mcp_page_tsx_0cg7pz9._.js.map +1 -1
  303. package/.next/server/middleware-build-manifest.js +3 -3
  304. package/.next/server/pages/404.html +2 -2
  305. package/.next/server/pages/500.html +1 -1
  306. package/.next/server/server-reference-manifest.js +1 -1
  307. package/.next/server/server-reference-manifest.json +1 -1
  308. package/.next/static/chunks/0brzabhj3foow.js +1 -0
  309. package/.next/static/chunks/0cbg1vmtl84ae.css +1 -0
  310. package/.next/static/chunks/0hf0pedij0d6a.js +7 -0
  311. package/.next/static/chunks/1lo5yg9gvb9eg.js +7 -0
  312. package/.next/static/chunks/1s-rfyrjre6lb.js +1 -0
  313. package/.next/static/chunks/27siz43i4h5l7.js +9 -0
  314. package/.next/static/chunks/29p-wdja_cbgh.js +11 -0
  315. package/.next/static/chunks/396ikhrcofosq.js +7 -0
  316. package/.next/static/chunks/3m3fw3fmcc301.js +7 -0
  317. package/.next/trace +2 -0
  318. package/.next/trace-build +1 -1
  319. package/.next/types/cache-life.d.ts +145 -0
  320. package/.next/types/routes.d.ts +139 -0
  321. package/.next/types/validator.ts +682 -0
  322. package/bin/loom.mjs +80 -21
  323. package/package.json +1 -1
  324. package/.next/server/chunks/ssr/_0g6iz5n._.js +0 -3
  325. package/.next/server/chunks/ssr/_0g6iz5n._.js.map +0 -1
  326. package/.next/server/chunks/ssr/_0mim08o._.js +0 -3
  327. package/.next/server/chunks/ssr/_0mim08o._.js.map +0 -1
  328. package/.next/server/chunks/ssr/_0xm-krv._.js +0 -9
  329. package/.next/server/chunks/ssr/_0xm-krv._.js.map +0 -1
  330. package/.next/server/chunks/ssr/_0zxn_u0._.js +0 -3
  331. package/.next/server/chunks/ssr/_0zxn_u0._.js.map +0 -1
  332. package/.next/server/chunks/ssr/_151pht4._.js +0 -9
  333. package/.next/server/chunks/ssr/_151pht4._.js.map +0 -1
  334. package/.next/server/chunks/ssr/_18tl_0o._.js +0 -9
  335. package/.next/server/chunks/ssr/_18tl_0o._.js.map +0 -1
  336. package/.next/server/chunks/ssr/_19nuoa6._.js +0 -9
  337. package/.next/server/chunks/ssr/_19nuoa6._.js.map +0 -1
  338. package/.next/server/chunks/ssr/_1ax02l9._.js +0 -3
  339. package/.next/server/chunks/ssr/_1ax02l9._.js.map +0 -1
  340. package/.next/server/chunks/ssr/_1fze3ic._.js +0 -9
  341. package/.next/server/chunks/ssr/_1fze3ic._.js.map +0 -1
  342. package/.next/static/chunks/0zryggvaj_s87.js +0 -7
  343. package/.next/static/chunks/16bx44gr1d_ij.js +0 -7
  344. package/.next/static/chunks/172e7ymu9a3w9.js +0 -1
  345. package/.next/static/chunks/1_w-1rm5wy0l7.css +0 -1
  346. package/.next/static/chunks/2j_bpzzylp1un.js +0 -9
  347. package/.next/static/chunks/2r2pwisd9bptv.js +0 -11
  348. package/.next/static/chunks/3at-42v-_yh7y.js +0 -7
  349. package/.next/static/chunks/3bp0ieicfxx5n.js +0 -1
  350. package/.next/static/chunks/3et56kszc9f9a.js +0 -7
  351. /package/.next/static/{S-TxD5uw__EHY12mebgvS → wCZkC7ZaYrxG37d-e2tac}/_buildManifest.js +0 -0
  352. /package/.next/static/{S-TxD5uw__EHY12mebgvS → wCZkC7ZaYrxG37d-e2tac}/_clientMiddlewareManifest.js +0 -0
  353. /package/.next/static/{S-TxD5uw__EHY12mebgvS → wCZkC7ZaYrxG37d-e2tac}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../components/tools/mcp-table.tsx","../../../../components/tools/_parts/sections.tsx","../../../../components/tools/mcp-details-sheet.tsx","../../../../app/%28dashboard%29/mcp/page.tsx","../../../../node_modules/lucide-react/src/icons/circle-x.ts"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { CheckCircle2, Loader2, Pencil, RefreshCcw, Trash2, XCircle } from \"lucide-react\"\nimport { toast } from \"sonner\"\n\nimport { mcpServers } from \"@/lib/api\"\nimport type { McpServerDTO } from \"@/lib/schemas/mcp\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n DataTableBody,\n DataTableCell,\n DataTableEmpty,\n DataTableHead,\n DataTableHeader,\n DataTableHeaderRow,\n DataTableRow,\n DataTableShell,\n} from \"@/components/ui/data-table\"\nimport { Switch } from \"@/components/ui/switch\"\nimport { cn } from \"@/lib/utils\"\n\ninterface Props {\n servers: McpServerDTO[]\n onSelect?: (s: McpServerDTO) => void\n onEdit?: (s: McpServerDTO) => void\n onDelete?: (s: McpServerDTO) => void\n /** When set, the row matching this id renders with an accent\n * background — mirrors the providers/models table selection. */\n selectedId?: string | null\n}\n\nfunction summarizeConfig(s: McpServerDTO): string {\n const c = s.config ?? {}\n if (s.transport === \"stdio\") {\n const command = typeof c.command === \"string\" ? c.command : \"\"\n const args = Array.isArray(c.args) ? (c.args as string[]).join(\" \") : \"\"\n return `${command} ${args}`.trim()\n }\n return typeof c.url === \"string\" ? c.url : \"\"\n}\n\nfunction HealthCell({ s }: { s: McpServerDTO }) {\n if (s.last_check_status === \"ok\") {\n const count = s.tools_cache?.length ?? 0\n return (\n <span className=\"inline-flex items-center gap-1.5 text-[11px] text-emerald-600 dark:text-emerald-400\">\n <CheckCircle2 className=\"h-3.5 w-3.5\" />\n {count} tool{count === 1 ? \"\" : \"s\"}\n </span>\n )\n }\n if (s.last_check_status === \"error\") {\n return (\n <span\n className=\"inline-flex items-center gap-1.5 text-[11px] text-destructive\"\n title={s.last_check_error ?? undefined}\n >\n <XCircle className=\"h-3.5 w-3.5\" />\n Failed\n </span>\n )\n }\n return (\n <span className=\"inline-flex items-center gap-1.5 text-[11px] text-muted-foreground\">\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n Checking…\n </span>\n )\n}\n\nexport function McpServersTable({ servers, onSelect, onEdit, onDelete, selectedId }: Props) {\n const showActions = !!onEdit || !!onDelete\n const colCount = showActions ? 6 : 5\n // Mutations are read once at the table level so a single in-flight\n // toggle / re-check doesn't blow away unrelated rows' cache.\n const update = mcpServers.useUpdate({\n onError: (e: Error) => toast.error(e.message || \"Update failed\"),\n })\n const check = mcpServers.useCheck({\n onSuccess: (s) => {\n if (s.last_check_status === \"ok\") {\n toast.success(`${s.name}: ${s.tools_cache?.length ?? 0} tools`)\n } else {\n // First-line summary; the full multi-line trace lives\n // on the details sheet's error block.\n const first = (s.last_check_error ?? \"check failed\").split(\"\\n\", 1)[0]\n toast.error(`${s.name}: ${first}`)\n }\n },\n onError: (e) => toast.error(e.message || \"Check failed\"),\n })\n\n return (\n <DataTableShell>\n <DataTableHeader>\n <DataTableHeaderRow>\n <DataTableHead>Name</DataTableHead>\n <DataTableHead>Transport</DataTableHead>\n <DataTableHead>Endpoint / Command</DataTableHead>\n <DataTableHead>Health</DataTableHead>\n <DataTableHead className=\"w-[80px] text-center\">Enabled</DataTableHead>\n {showActions && <DataTableHead className=\"w-[124px] text-right\">Actions</DataTableHead>}\n </DataTableHeaderRow>\n </DataTableHeader>\n <DataTableBody>\n {servers.length === 0 ? (\n <DataTableEmpty colSpan={colCount} />\n ) : (\n servers.map((s) => (\n <DataTableRow\n key={s.id}\n className={cn(\n \"transition-colors\",\n onSelect && \"cursor-pointer hover:bg-muted/40\",\n selectedId === s.id && \"bg-muted/60\",\n !s.enabled && \"opacity-60\",\n )}\n onClick={onSelect ? () => onSelect(s) : undefined}\n >\n <DataTableCell className=\"font-mono text-xs max-w-[200px] truncate\" title={s.name}>\n {s.name}\n </DataTableCell>\n <DataTableCell>\n <span className=\"inline-flex items-center rounded border border-border bg-muted/40 px-1.5 py-0.5 font-mono text-[10px] uppercase tracking-wider text-muted-foreground\">\n {s.transport}\n </span>\n </DataTableCell>\n <DataTableCell className=\"font-mono text-xs text-muted-foreground max-w-[360px] truncate\" title={summarizeConfig(s)}>\n {summarizeConfig(s) || <span className=\"italic\">—</span>}\n </DataTableCell>\n <DataTableCell>\n <HealthCell s={s} />\n </DataTableCell>\n <DataTableCell className=\"text-center\">\n <Switch\n checked={s.enabled}\n disabled={!onEdit || update.isPending}\n onCheckedChange={(checked) => {\n update.mutate({ id: s.id, data: { enabled: checked } })\n }}\n onClick={(e) => e.stopPropagation()}\n title={s.enabled ? \"Disable\" : \"Enable\"}\n />\n </DataTableCell>\n {showActions && (\n <DataTableCell className=\"text-right\">\n <div className=\"flex items-center justify-end gap-0.5\">\n {onEdit && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={(e) => {\n e.stopPropagation()\n check.mutate(s.id)\n }}\n disabled={check.isPending && check.variables === s.id}\n title=\"Re-check connection\"\n >\n <RefreshCcw className={cn(\n \"h-3.5 w-3.5\",\n check.isPending && check.variables === s.id && \"animate-spin\",\n )} />\n </Button>\n )}\n {onEdit && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={(e) => { e.stopPropagation(); onEdit(s) }}\n title=\"Edit\"\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n {onDelete && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7 text-muted-foreground hover:text-destructive hover:bg-destructive/10\"\n onClick={(e) => { e.stopPropagation(); onDelete(s) }}\n title=\"Delete\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n </div>\n </DataTableCell>\n )}\n </DataTableRow>\n ))\n )}\n </DataTableBody>\n </DataTableShell>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { CheckCircle2, ExternalLink, Loader2, RefreshCcw, XCircle } from \"lucide-react\"\n\nimport type {\n McpServerDTO,\n McpServerInfo,\n McpPromptDescriptor,\n McpResourcesSnapshot,\n McpToolDescriptor,\n} from \"@/lib/schemas/mcp\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Button } from \"@/components/ui/button\"\nimport { cn, formatToLocal } from \"@/lib/utils\"\n\n/** Per-section components for the MCP details sheet.\n * Co-located so adding a new MCP capability surface\n * (e.g. \"Sampling\", \"Roots\") = 1 new function below + 1\n * invocation in the sheet shell. */\n\nfunction isSecretKey(k: string): boolean {\n return /token|secret|key|password|auth/i.test(k)\n}\n\nfunction StatusDot({ status }: { status: \"ok\" | \"error\" | null }) {\n if (status === \"ok\") return <CheckCircle2 className=\"h-4 w-4 text-emerald-500\" />\n if (status === \"error\") return <XCircle className=\"h-4 w-4 text-destructive\" />\n return <Loader2 className=\"h-4 w-4 text-muted-foreground animate-spin\" />\n}\n\nfunction EmptyHint({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"rounded-md border border-dashed p-3 text-xs text-muted-foreground italic\">\n {children}\n </div>\n )\n}\n\nfunction Tag({ children }: { children: React.ReactNode }) {\n return (\n <span className=\"not-italic inline-flex items-center rounded border border-border bg-muted/40 px-1 font-mono text-[10px] uppercase tracking-wider text-muted-foreground mx-0.5\">\n {children}\n </span>\n )\n}\n\nexport function HealthSection({\n server,\n onCheck,\n isChecking,\n isAdmin,\n}: {\n server: McpServerDTO\n onCheck: () => void\n isChecking: boolean\n isAdmin: boolean\n}) {\n const status = server.last_check_status\n const checkedAt = server.last_check_at ? formatToLocal(server.last_check_at) : \"never\"\n return (\n <section className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">Health</h3>\n {isAdmin && (\n <Button size=\"sm\" variant=\"outline\" onClick={onCheck} disabled={isChecking} className=\"h-7 text-xs\">\n {isChecking\n ? <Loader2 className=\"h-3 w-3 mr-1.5 animate-spin\" />\n : <RefreshCcw className=\"h-3 w-3 mr-1.5\" />}\n Re-check\n </Button>\n )}\n </div>\n <div className=\"rounded-md border p-3 text-sm space-y-1.5\">\n <div className=\"flex items-center gap-2\">\n <StatusDot status={status} />\n <span className=\"font-medium\">\n {status === \"ok\" && \"Connected\"}\n {status === \"error\" && \"Failed\"}\n {status === null && \"Never checked\"}\n </span>\n </div>\n <div className=\"text-[11px] text-muted-foreground\">Last check: {checkedAt}</div>\n {status === \"error\" && server.last_check_error && (\n <pre className=\"mt-1.5 font-mono text-[11px] leading-snug whitespace-pre-wrap break-words bg-destructive/10 text-destructive rounded p-2 max-h-72 overflow-auto\">\n {server.last_check_error}\n </pre>\n )}\n </div>\n </section>\n )\n}\n\nexport function ServerInfoSection({ info }: { info: McpServerInfo }) {\n const hasIdentity = !!(info.name || info.version)\n const hasInstructions = !!info.instructions?.trim()\n const caps = info.capabilities ? Object.keys(info.capabilities) : []\n if (!hasIdentity && !hasInstructions && caps.length === 0) return null\n return (\n <section className=\"space-y-2\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n Server\n </h3>\n <div className=\"rounded-md border p-3 space-y-2 text-sm\">\n {hasIdentity && (\n <div className=\"font-mono text-xs\">\n {info.name ?? \"<unnamed>\"}\n {info.version && <span className=\"text-muted-foreground\"> @ {info.version}</span>}\n </div>\n )}\n {caps.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {caps.map((cap) => (\n <span\n key={cap}\n className=\"inline-flex items-center rounded border border-border bg-muted/40 px-1.5 py-0.5 font-mono text-[10px] uppercase tracking-wider text-muted-foreground\"\n title={`Server advertises the \"${cap}\" capability`}\n >\n {cap}\n </span>\n ))}\n </div>\n )}\n {hasInstructions && (\n <div>\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground mb-1\">\n Instructions\n </div>\n <p className=\"text-xs text-muted-foreground leading-relaxed whitespace-pre-wrap\">\n {info.instructions}\n </p>\n </div>\n )}\n </div>\n </section>\n )\n}\n\nexport function EndpointSection({ server, isAdmin }: { server: McpServerDTO; isAdmin: boolean }) {\n const c = server.config ?? {}\n return (\n <section className=\"space-y-2\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {server.transport === \"stdio\" ? \"Command\" : \"Endpoint\"}\n </h3>\n <div className=\"rounded-md border p-3 space-y-2\">\n {server.transport === \"stdio\" ? (\n <>\n <div className=\"font-mono text-xs break-all\">\n <span className=\"text-muted-foreground\">$ </span>\n {String(c.command ?? \"\")}{\" \"}\n {Array.isArray(c.args) ? (c.args as string[]).join(\" \") : \"\"}\n </div>\n {c.env && isAdmin && Object.keys(c.env as object).length > 0 && (\n <div>\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground mb-1\">Env</div>\n <ul className=\"font-mono text-[11px] space-y-0.5\">\n {Object.entries(c.env as Record<string, string>).map(([k, v]) => (\n <li key={k} className=\"truncate\">\n <span className=\"text-muted-foreground\">{k}</span>={isSecretKey(k) ? \"•••\" : v}\n </li>\n ))}\n </ul>\n </div>\n )}\n </>\n ) : (\n <>\n <div className=\"font-mono text-xs break-all\">{String(c.url ?? \"\")}</div>\n {c.headers && isAdmin && Object.keys(c.headers as object).length > 0 && (\n <div>\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground mb-1\">Headers</div>\n <ul className=\"font-mono text-[11px] space-y-0.5\">\n {Object.entries(c.headers as Record<string, string>).map(([k, v]) => (\n <li key={k} className=\"truncate\">\n <span className=\"text-muted-foreground\">{k}:</span> {isSecretKey(k) ? \"•••\" : v}\n </li>\n ))}\n </ul>\n </div>\n )}\n </>\n )}\n </div>\n </section>\n )\n}\n\nexport function ToolsSection({\n tools,\n status,\n}: {\n tools: McpToolDescriptor[]\n status: \"ok\" | \"error\" | null\n}) {\n return (\n <section className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n Tools {tools.length > 0 && <span className=\"ml-1 text-foreground\">({tools.length})</span>}\n </h3>\n </div>\n {tools.length === 0 ? (\n <div className=\"rounded-md border p-3 text-xs text-muted-foreground italic\">\n {status === \"error\"\n ? \"No tools cached — last check failed.\"\n : \"No tools cached yet. Run a check to populate.\"}\n </div>\n ) : (\n <ul className=\"rounded-md border divide-y\">\n {tools.map((t) => (\n <ToolRow key={t.name} tool={t} />\n ))}\n </ul>\n )}\n </section>\n )\n}\n\nfunction ToolRow({ tool }: { tool: McpToolDescriptor }) {\n const [open, setOpen] = React.useState(false)\n const params = tool.parameters as { properties?: Record<string, unknown>; required?: string[] }\n const propEntries = params?.properties ? Object.entries(params.properties) : []\n const required = new Set(params?.required ?? [])\n return (\n <li className={cn(\"p-3 text-xs space-y-1.5\", open && \"bg-muted/30\")}>\n <button\n type=\"button\"\n onClick={() => setOpen((o) => !o)}\n className=\"flex w-full items-center gap-2 text-left\"\n >\n <ExternalLink className=\"h-3 w-3 text-muted-foreground rotate-90\" />\n <span className=\"font-mono text-foreground\">{tool.name}</span>\n {propEntries.length > 0 && (\n <span className=\"text-[10px] text-muted-foreground\">{propEntries.length} param{propEntries.length === 1 ? \"\" : \"s\"}</span>\n )}\n </button>\n {tool.description && (\n <p className=\"text-muted-foreground pl-5 leading-snug\">{tool.description}</p>\n )}\n {open && (\n <div className=\"pl-5 pt-1\">\n {propEntries.length === 0 ? (\n <p className=\"text-muted-foreground italic\">(no parameters)</p>\n ) : (\n <ul className=\"space-y-1\">\n {propEntries.map(([k, v]) => {\n const meta = v as { type?: string; description?: string }\n return (\n <li key={k} className=\"flex gap-2\">\n <span className=\"font-mono text-foreground\">{k}</span>\n {meta?.type && (\n <span className=\"font-mono text-muted-foreground text-[10px]\">\n : {meta.type}\n </span>\n )}\n {required.has(k) && (\n <Badge variant=\"outline\" className=\"h-3.5 px-1 text-[9px]\">required</Badge>\n )}\n {meta?.description && (\n <span className=\"text-muted-foreground text-[11px] truncate\">— {meta.description}</span>\n )}\n </li>\n )\n })}\n </ul>\n )}\n </div>\n )}\n </li>\n )\n}\n\nexport function ResourcesSection({\n snapshot,\n capabilityAdvertised,\n status,\n}: {\n snapshot: McpResourcesSnapshot | null\n capabilityAdvertised: boolean\n status: \"ok\" | \"error\" | null\n}) {\n const total = snapshot ? snapshot.resources.length + snapshot.templates.length : 0\n return (\n <section className=\"space-y-2\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n Resources {total > 0 && <span className=\"ml-1 text-foreground\">({total})</span>}\n </h3>\n {!capabilityAdvertised ? (\n <EmptyHint>This server does not advertise the <Tag>resources</Tag> capability.</EmptyHint>\n ) : snapshot === null ? (\n <EmptyHint>\n {status === \"error\"\n ? \"Last check failed — run another to populate.\"\n : \"Server advertises resources but the list call did not complete.\"}\n </EmptyHint>\n ) : total === 0 ? (\n <EmptyHint>Server advertises resources but exposes none.</EmptyHint>\n ) : (\n <ul className=\"rounded-md border divide-y\">\n {snapshot.resources.map((r) => (\n <li key={`r-${r.uri}`} className=\"p-3 text-xs space-y-0.5\">\n <div className=\"font-mono text-foreground break-all\">{r.uri}</div>\n <div className=\"flex items-baseline gap-2\">\n {r.name && <span className=\"text-foreground\">{r.name}</span>}\n {r.mimeType && (\n <span className=\"font-mono text-[10px] text-muted-foreground\">{r.mimeType}</span>\n )}\n </div>\n {r.description && (\n <p className=\"text-muted-foreground leading-snug\">{r.description}</p>\n )}\n </li>\n ))}\n {snapshot.templates.map((t) => (\n <li key={`t-${t.uriTemplate}`} className=\"p-3 text-xs space-y-0.5 bg-muted/10\">\n <div className=\"flex items-baseline gap-2\">\n <span className=\"inline-flex items-center rounded border border-border bg-muted/40 px-1 font-mono text-[9px] uppercase tracking-wider text-muted-foreground\">\n template\n </span>\n <span className=\"font-mono text-foreground break-all\">{t.uriTemplate}</span>\n </div>\n {(t.name || t.mimeType) && (\n <div className=\"flex items-baseline gap-2 pl-[60px]\">\n {t.name && <span className=\"text-foreground\">{t.name}</span>}\n {t.mimeType && (\n <span className=\"font-mono text-[10px] text-muted-foreground\">{t.mimeType}</span>\n )}\n </div>\n )}\n {t.description && (\n <p className=\"text-muted-foreground leading-snug pl-[60px]\">{t.description}</p>\n )}\n </li>\n ))}\n </ul>\n )}\n </section>\n )\n}\n\nexport function PromptsSection({\n prompts,\n capabilityAdvertised,\n status,\n}: {\n prompts: McpPromptDescriptor[] | null\n capabilityAdvertised: boolean\n status: \"ok\" | \"error\" | null\n}) {\n return (\n <section className=\"space-y-2\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n Prompts {prompts && prompts.length > 0 && (\n <span className=\"ml-1 text-foreground\">({prompts.length})</span>\n )}\n </h3>\n {!capabilityAdvertised ? (\n <EmptyHint>This server does not advertise the <Tag>prompts</Tag> capability.</EmptyHint>\n ) : prompts === null ? (\n <EmptyHint>\n {status === \"error\"\n ? \"Last check failed — run another to populate.\"\n : \"Server advertises prompts but the list call did not complete.\"}\n </EmptyHint>\n ) : prompts.length === 0 ? (\n <EmptyHint>Server advertises prompts but exposes none.</EmptyHint>\n ) : (\n <ul className=\"rounded-md border divide-y\">\n {prompts.map((p) => (\n <PromptRow key={p.name} prompt={p} />\n ))}\n </ul>\n )}\n </section>\n )\n}\n\nfunction PromptRow({ prompt }: { prompt: McpPromptDescriptor }) {\n const [open, setOpen] = React.useState(false)\n const args = prompt.arguments ?? []\n return (\n <li className={cn(\"p-3 text-xs space-y-1.5\", open && \"bg-muted/30\")}>\n <button\n type=\"button\"\n onClick={() => setOpen((o) => !o)}\n className=\"flex w-full items-center gap-2 text-left\"\n >\n <ExternalLink className=\"h-3 w-3 text-muted-foreground rotate-90\" />\n <span className=\"font-mono text-foreground\">{prompt.name}</span>\n {args.length > 0 && (\n <span className=\"text-[10px] text-muted-foreground\">{args.length} arg{args.length === 1 ? \"\" : \"s\"}</span>\n )}\n </button>\n {prompt.description && (\n <p className=\"text-muted-foreground pl-5 leading-snug\">{prompt.description}</p>\n )}\n {open && args.length > 0 && (\n <ul className=\"pl-5 pt-1 space-y-1\">\n {args.map((a) => (\n <li key={a.name} className=\"flex gap-2\">\n <span className=\"font-mono text-foreground\">{a.name}</span>\n {a.required && (\n <Badge variant=\"outline\" className=\"h-3.5 px-1 text-[9px]\">required</Badge>\n )}\n {a.description && (\n <span className=\"text-muted-foreground text-[11px] truncate\">— {a.description}</span>\n )}\n </li>\n ))}\n </ul>\n )}\n </li>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { toast } from \"sonner\"\nimport { Wrench } from \"lucide-react\"\n\nimport { mcpServers } from \"@/lib/api\"\nimport type { McpServerDTO } from \"@/lib/schemas/mcp\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from \"@/components/ui/sheet\"\nimport {\n EndpointSection,\n HealthSection,\n PromptsSection,\n ResourcesSection,\n ServerInfoSection,\n ToolsSection,\n} from \"./_parts/sections\"\n\ninterface Props {\n server: McpServerDTO | null\n open: boolean\n onOpenChange: (open: boolean) => void\n isAdmin: boolean\n}\n\n/**\n * Read-only details panel for one MCP server. Composes per-capability\n * sections from `_parts/sections.tsx`; adding a new MCP capability\n * surface only requires writing a new section component there and one\n * invocation below — the shell stays small.\n */\nexport function McpServerDetailsSheet({ server, open, onOpenChange, isAdmin }: Props) {\n const check = mcpServers.useCheck({\n onSuccess: (s) => {\n if (s.last_check_status === \"ok\") {\n toast.success(`Check passed — ${s.tools_cache?.length ?? 0} tools`)\n } else {\n const first = (s.last_check_error ?? \"unknown error\").split(\"\\n\", 1)[0]\n toast.error(`Check failed: ${first}`)\n }\n },\n onError: (e) => toast.error(e.message || \"Check failed\"),\n })\n\n const runCheck = React.useCallback(() => {\n if (!server) return\n check.mutate(server.id)\n }, [server, check])\n\n // Silent backfill: rows created before the server_info column\n // existed have it null even when the server is healthy. Trigger\n // a re-check on first open so the section populates without\n // forcing the user to hunt for the button.\n const backfillIdRef = React.useRef<string | null>(null)\n React.useEffect(() => {\n if (!open || !server) return\n if (server.server_info) return\n if (server.last_check_status !== \"ok\") return\n if (backfillIdRef.current === server.id) return\n backfillIdRef.current = server.id\n check.mutate(server.id)\n }, [open, server, check])\n\n if (!server) return null\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent side=\"right\" className=\"w-full sm:max-w-[640px] overflow-y-auto scrollbar-thin p-0\">\n <SheetHeader className=\"px-6 py-4 border-b\">\n <SheetTitle className=\"flex items-center gap-2 text-base\">\n <Wrench className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"font-mono\">{server.name}</span>\n <Badge variant=\"outline\" className=\"text-[10px] uppercase ml-2\">\n {server.transport}\n </Badge>\n {!server.enabled && (\n <Badge variant=\"secondary\" className=\"text-[10px] uppercase\">\n disabled\n </Badge>\n )}\n </SheetTitle>\n <SheetDescription className=\"text-xs text-muted-foreground pt-1\">\n {server.description || \"MCP server connection details, health, and discovered tools.\"}\n </SheetDescription>\n </SheetHeader>\n\n <div className=\"px-6 py-4 space-y-5\">\n <HealthSection server={server} onCheck={runCheck} isChecking={check.isPending} isAdmin={isAdmin} />\n {server.server_info && <ServerInfoSection info={server.server_info} />}\n <EndpointSection server={server} isAdmin={isAdmin} />\n <ToolsSection tools={server.tools_cache ?? []} status={server.last_check_status} />\n <ResourcesSection\n snapshot={server.resources_cache}\n capabilityAdvertised={!!server.server_info?.capabilities?.resources}\n status={server.last_check_status}\n />\n <PromptsSection\n prompts={server.prompts_cache}\n capabilityAdvertised={!!server.server_info?.capabilities?.prompts}\n status={server.last_check_status}\n />\n </div>\n </SheetContent>\n </Sheet>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport Link from \"next/link\"\nimport { useSearchParams } from \"next/navigation\"\nimport { LayoutGrid, Plus, Sparkles } from \"lucide-react\"\nimport { toast } from \"sonner\"\n\nimport { mcpServers } from \"@/lib/api/mcp\"\nimport { useAuth } from \"@/context/auth-context\"\nimport type { McpServerDTO } from \"@/lib/schemas/mcp\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { ConfirmDialog } from \"@/components/ui/confirm-dialog\"\nimport { LoadingState } from \"@/components/ui/loading-state\"\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\"\nimport { McpFormDialog } from \"@/components/tools/mcp-form-dialog\"\nimport { McpServersTable } from \"@/components/tools/mcp-table\"\nimport { McpServerDetailsSheet } from \"@/components/tools/mcp-details-sheet\"\n\ntype McpDialogState = { open: boolean; mode: \"create\" | \"edit\"; server?: McpServerDTO | null }\n\n/** Primary MCP / Skills page. Hand-written tool definitions live in\n * /settings as a less-prominent escape hatch — MCP is the headline. */\nexport default function McpPage() {\n const { user } = useAuth()\n const isAdmin = user?.role === \"admin\"\n const [activeTab, setActiveTab] = React.useState(\"mcp\")\n\n const { data: mcpList, isLoading: loadingMcp } = mcpServers.useList(undefined, {\n enabled: activeTab === \"mcp\",\n // Auto-refresh while any server is still \"checking\" (status\n // null) so the post-create background probe surfaces without\n // a manual refresh.\n refetchInterval: (q) => {\n const data = q.state.data as McpServerDTO[] | undefined\n if (!data) return false\n return data.some((s) => s.last_check_status === null) ? 2_000 : false\n },\n })\n\n const [mcpDialog, setMcpDialog] = React.useState<McpDialogState>({ open: false, mode: \"create\" })\n const [deleteServer, setDeleteServer] = React.useState<McpServerDTO | null>(null)\n\n // Catalogue page links back with `?selected=<id>` after a\n // successful create so the new row's details sheet opens right\n // away. Read once on mount via lazy state init — no effect, no\n // setState-during-render.\n const searchParams = useSearchParams()\n const [selectedId, setSelectedId] = React.useState<string | null>(\n () => searchParams?.get(\"selected\") ?? null,\n )\n\n const selectedServer = React.useMemo(\n () => (mcpList ?? []).find((s) => s.id === selectedId) ?? null,\n [mcpList, selectedId],\n )\n\n const deleteServerMutation = mcpServers.useDelete({\n onSuccess: () => {\n toast.success(\"Server deleted\")\n setDeleteServer(null)\n if (selectedId === deleteServer?.id) setSelectedId(null)\n },\n onError: (e) => toast.error(e.message || \"Delete failed\"),\n })\n\n return (\n <div className=\"h-full flex flex-col p-4 overflow-y-hidden\">\n <Tabs\n defaultValue=\"mcp\"\n className=\"flex-1 flex flex-col min-h-0 w-full gap-4\"\n onValueChange={setActiveTab}\n >\n <div className=\"flex items-center gap-2 px-1 flex-wrap md:flex-nowrap\">\n <TabsList className=\"h-8 p-0.5\">\n <TabsTrigger value=\"mcp\" className=\"h-7 px-3 text-xs\">MCP</TabsTrigger>\n <TabsTrigger value=\"skills\" className=\"h-7 px-3 text-xs\">Skills</TabsTrigger>\n </TabsList>\n\n {activeTab === \"mcp\" && (\n <div className=\"flex items-center gap-1.5 ml-auto\">\n <Link href=\"/mcp/presets\">\n <Button size=\"sm\" variant=\"secondary\" className=\"h-8 text-xs gap-1.5\">\n <LayoutGrid className=\"h-3.5 w-3.5\" />\n Catalogue\n </Button>\n </Link>\n {isAdmin && (\n <Button\n size=\"icon\"\n variant=\"secondary\"\n className=\"h-8 w-8 shrink-0\"\n onClick={() => setMcpDialog({ open: true, mode: \"create\" })}\n title=\"Add MCP server\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n </div>\n )}\n </div>\n\n <TabsContent value=\"mcp\" className=\"flex-1 min-h-0 flex flex-col\">\n <div className=\"flex-1 border rounded-xl bg-card shadow-sm flex flex-col overflow-hidden relative\">\n {loadingMcp && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-background/50 z-10\">\n <LoadingState label=\"Loading MCP servers…\" />\n </div>\n )}\n <div className=\"flex-1 overflow-auto\">\n <McpServersTable\n servers={mcpList ?? []}\n onSelect={(s) => setSelectedId(s.id)}\n onEdit={isAdmin ? (s) => setMcpDialog({ open: true, mode: \"edit\", server: s }) : undefined}\n onDelete={isAdmin ? setDeleteServer : undefined}\n selectedId={selectedId}\n />\n </div>\n </div>\n </TabsContent>\n\n <TabsContent value=\"skills\" className=\"flex-1 min-h-0 flex flex-col items-center justify-center text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-2xl bg-gradient-to-br from-amber-500/20 to-orange-500/20\">\n <Sparkles className=\"h-6 w-6 text-amber-500\" />\n </div>\n <h2 className=\"mt-3 text-base font-semibold tracking-tight\">Skills</h2>\n <p className=\"mt-1 text-xs text-muted-foreground\">Coming soon.</p>\n </TabsContent>\n </Tabs>\n\n <McpFormDialog\n open={mcpDialog.open}\n onOpenChange={(open) => setMcpDialog((s) => ({ ...s, open }))}\n mode={mcpDialog.mode}\n server={mcpDialog.server}\n />\n\n <McpServerDetailsSheet\n server={selectedServer}\n open={!!selectedServer}\n onOpenChange={(o) => !o && setSelectedId(null)}\n isAdmin={isAdmin}\n />\n\n <ConfirmDialog\n open={!!deleteServer}\n onOpenChange={(o) => !o && setDeleteServer(null)}\n title=\"Delete MCP server?\"\n description={<>This will delete <b>{deleteServer?.name}</b>.</>}\n confirmLabel=\"Delete\"\n destructive\n isLoading={deleteServerMutation.isPending}\n onConfirm={() => deleteServer && deleteServerMutation.mutate(deleteServer.id)}\n />\n </div>\n )\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['path', { d: 'm15 9-6 6', key: '1uzhvr' }],\n ['path', { d: 'm9 9 6 6', key: 'z0biqf' }],\n];\n\n/**\n * @component @name CircleX\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJtMTUgOS02IDYiIC8+CiAgPHBhdGggZD0ibTkgOSA2IDYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/circle-x\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleX = createLucideIcon('circle-x', __iconNode);\n\nexport default CircleX;\n"],"names":[],"mappings":"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","ignoreList":[4]}
1
+ {"version":3,"sources":["../../../../components/tools/mcp-table.tsx","../../../../components/tools/_parts/sections.tsx","../../../../components/tools/mcp-details-sheet.tsx","../../../../app/%28dashboard%29/mcp/page.tsx","../../../../node_modules/lucide-react/src/icons/circle-x.ts"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { CheckCircle2, Loader2, Pencil, RefreshCcw, Trash2, XCircle } from \"lucide-react\"\nimport { toast } from \"sonner\"\n\nimport { mcpServers } from \"@/lib/api\"\nimport type { McpServerDTO } from \"@/lib/schemas/mcp\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n DataTableBody,\n DataTableCell,\n DataTableEmpty,\n DataTableHead,\n DataTableHeader,\n DataTableHeaderRow,\n DataTableRow,\n DataTableShell,\n} from \"@/components/ui/data-table\"\nimport { Switch } from \"@/components/ui/switch\"\nimport { cn } from \"@/lib/utils\"\n\ninterface Props {\n servers: McpServerDTO[]\n onSelect?: (s: McpServerDTO) => void\n onEdit?: (s: McpServerDTO) => void\n onDelete?: (s: McpServerDTO) => void\n /** When set, the row matching this id renders with an accent\n * background — mirrors the providers/models table selection. */\n selectedId?: string | null\n}\n\nfunction summarizeConfig(s: McpServerDTO): string {\n const c = s.config ?? {}\n if (s.transport === \"stdio\") {\n const command = typeof c.command === \"string\" ? c.command : \"\"\n const args = Array.isArray(c.args) ? (c.args as string[]).join(\" \") : \"\"\n return `${command} ${args}`.trim()\n }\n return typeof c.url === \"string\" ? c.url : \"\"\n}\n\nfunction HealthCell({ s }: { s: McpServerDTO }) {\n if (s.last_check_status === \"ok\") {\n const count = s.tools_cache?.length ?? 0\n return (\n <span className=\"inline-flex items-center gap-1.5 text-[11px] text-emerald-600 dark:text-emerald-400\">\n <CheckCircle2 className=\"h-3.5 w-3.5\" />\n {count} tool{count === 1 ? \"\" : \"s\"}\n </span>\n )\n }\n if (s.last_check_status === \"error\") {\n return (\n <span\n className=\"inline-flex items-center gap-1.5 text-[11px] text-destructive\"\n title={s.last_check_error ?? undefined}\n >\n <XCircle className=\"h-3.5 w-3.5\" />\n Failed\n </span>\n )\n }\n return (\n <span className=\"inline-flex items-center gap-1.5 text-[11px] text-muted-foreground\">\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n Checking…\n </span>\n )\n}\n\nexport function McpServersTable({ servers, onSelect, onEdit, onDelete, selectedId }: Props) {\n const showActions = !!onEdit || !!onDelete\n const colCount = showActions ? 6 : 5\n // Mutations are read once at the table level so a single in-flight\n // toggle / re-check doesn't blow away unrelated rows' cache.\n const update = mcpServers.useUpdate({\n onError: (e: Error) => toast.error(e.message || \"Update failed\"),\n })\n const check = mcpServers.useCheck({\n onSuccess: (s) => {\n if (s.last_check_status === \"ok\") {\n toast.success(`${s.name}: ${s.tools_cache?.length ?? 0} tools`)\n } else {\n // First-line summary; the full multi-line trace lives\n // on the details sheet's error block.\n const first = (s.last_check_error ?? \"check failed\").split(\"\\n\", 1)[0]\n toast.error(`${s.name}: ${first}`)\n }\n },\n onError: (e) => toast.error(e.message || \"Check failed\"),\n })\n\n return (\n <DataTableShell>\n <DataTableHeader>\n <DataTableHeaderRow>\n <DataTableHead>Name</DataTableHead>\n <DataTableHead>Transport</DataTableHead>\n <DataTableHead>Endpoint / Command</DataTableHead>\n <DataTableHead>Health</DataTableHead>\n <DataTableHead className=\"w-[80px] text-center\">Enabled</DataTableHead>\n {showActions && <DataTableHead className=\"w-[124px] text-right\">Actions</DataTableHead>}\n </DataTableHeaderRow>\n </DataTableHeader>\n <DataTableBody>\n {servers.length === 0 ? (\n <DataTableEmpty colSpan={colCount} />\n ) : (\n servers.map((s) => (\n <DataTableRow\n key={s.id}\n className={cn(\n \"transition-colors\",\n onSelect && \"cursor-pointer hover:bg-muted/40\",\n selectedId === s.id && \"bg-muted/60\",\n !s.enabled && \"opacity-60\",\n )}\n onClick={onSelect ? () => onSelect(s) : undefined}\n >\n <DataTableCell className=\"font-mono text-xs max-w-[200px] truncate\" title={s.name}>\n {s.name}\n </DataTableCell>\n <DataTableCell>\n <span className=\"inline-flex items-center rounded border border-border bg-muted/40 px-1.5 py-0.5 font-mono text-[10px] uppercase tracking-wider text-muted-foreground\">\n {s.transport}\n </span>\n </DataTableCell>\n <DataTableCell className=\"font-mono text-xs text-muted-foreground max-w-[360px] truncate\" title={summarizeConfig(s)}>\n {summarizeConfig(s) || <span className=\"italic\">—</span>}\n </DataTableCell>\n <DataTableCell>\n <HealthCell s={s} />\n </DataTableCell>\n <DataTableCell className=\"text-center\">\n <Switch\n checked={s.enabled}\n disabled={!onEdit || update.isPending}\n onCheckedChange={(checked) => {\n update.mutate({ id: s.id, data: { enabled: checked } })\n }}\n onClick={(e) => e.stopPropagation()}\n title={s.enabled ? \"Disable\" : \"Enable\"}\n />\n </DataTableCell>\n {showActions && (\n <DataTableCell className=\"text-right\">\n <div className=\"flex items-center justify-end gap-0.5\">\n {onEdit && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={(e) => {\n e.stopPropagation()\n check.mutate(s.id)\n }}\n disabled={check.isPending && check.variables === s.id}\n title=\"Re-check connection\"\n >\n <RefreshCcw className={cn(\n \"h-3.5 w-3.5\",\n check.isPending && check.variables === s.id && \"animate-spin\",\n )} />\n </Button>\n )}\n {onEdit && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={(e) => { e.stopPropagation(); onEdit(s) }}\n title=\"Edit\"\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n {onDelete && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7 text-muted-foreground hover:text-destructive hover:bg-destructive/10\"\n onClick={(e) => { e.stopPropagation(); onDelete(s) }}\n title=\"Delete\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n </div>\n </DataTableCell>\n )}\n </DataTableRow>\n ))\n )}\n </DataTableBody>\n </DataTableShell>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { CheckCircle2, ExternalLink, Loader2, RefreshCcw, XCircle } from \"lucide-react\"\n\nimport type {\n McpServerDTO,\n McpServerInfo,\n McpPromptDescriptor,\n McpResourcesSnapshot,\n McpToolDescriptor,\n} from \"@/lib/schemas/mcp\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Button } from \"@/components/ui/button\"\nimport { cn, formatToLocal } from \"@/lib/utils\"\n\n/** Per-section components for the MCP details sheet.\n * Co-located so adding a new MCP capability surface\n * (e.g. \"Sampling\", \"Roots\") = 1 new function below + 1\n * invocation in the sheet shell. */\n\nfunction isSecretKey(k: string): boolean {\n return /token|secret|key|password|auth/i.test(k)\n}\n\nfunction StatusDot({ status }: { status: \"ok\" | \"error\" | null }) {\n if (status === \"ok\") return <CheckCircle2 className=\"h-4 w-4 text-emerald-500\" />\n if (status === \"error\") return <XCircle className=\"h-4 w-4 text-destructive\" />\n return <Loader2 className=\"h-4 w-4 text-muted-foreground animate-spin\" />\n}\n\nfunction EmptyHint({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"rounded-md border border-dashed p-3 text-xs text-muted-foreground italic\">\n {children}\n </div>\n )\n}\n\nfunction Tag({ children }: { children: React.ReactNode }) {\n return (\n <span className=\"not-italic inline-flex items-center rounded border border-border bg-muted/40 px-1 font-mono text-[10px] uppercase tracking-wider text-muted-foreground mx-0.5\">\n {children}\n </span>\n )\n}\n\nexport function HealthSection({\n server,\n onCheck,\n isChecking,\n isAdmin,\n streaming,\n}: {\n server: McpServerDTO\n onCheck: () => void\n isChecking: boolean\n isAdmin: boolean\n /** Optional live-stream state for the in-flight check. When provided,\n * the phase badge + log panel render while the check is running and\n * for a few moments after so admins can review what just happened.\n * Falls back to the legacy spinner-only behaviour when absent. */\n streaming?: {\n phase: \"spawning\" | \"starting\" | \"connecting\" | \"listing\" | \"ready\" | null\n logs: string[]\n error: string | null\n }\n}) {\n const status = server.last_check_status\n const checkedAt = server.last_check_at ? formatToLocal(server.last_check_at) : \"never\"\n const phaseLabel = streaming?.phase ? PHASE_LABELS[streaming.phase] : null\n const hasLiveLogs = !!streaming && (isChecking || streaming.logs.length > 0)\n return (\n <section className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">Health</h3>\n {isAdmin && (\n <Button size=\"sm\" variant=\"outline\" onClick={onCheck} disabled={isChecking} className=\"h-7 text-xs\">\n {isChecking\n ? <Loader2 className=\"h-3 w-3 mr-1.5 animate-spin\" />\n : <RefreshCcw className=\"h-3 w-3 mr-1.5\" />}\n Re-check\n </Button>\n )}\n </div>\n <div className=\"rounded-md border p-3 text-sm space-y-1.5\">\n <div className=\"flex items-center gap-2\">\n <StatusDot status={isChecking ? null : status} />\n <span className=\"font-medium\">\n {isChecking && (phaseLabel ?? \"Checking…\")}\n {!isChecking && status === \"ok\" && \"Connected\"}\n {!isChecking && status === \"error\" && \"Failed\"}\n {!isChecking && status === null && \"Never checked\"}\n </span>\n {isChecking && phaseLabel && (\n <Badge variant=\"outline\" className=\"ml-auto text-[10px] uppercase tracking-wider\">\n {streaming?.phase}\n </Badge>\n )}\n </div>\n <div className=\"text-[11px] text-muted-foreground\">Last check: {checkedAt}</div>\n {hasLiveLogs && (\n <CheckLogPanel logs={streaming!.logs} isStreaming={isChecking} />\n )}\n {!isChecking && status === \"error\" && server.last_check_error && (\n <pre className=\"mt-1.5 font-mono text-[11px] leading-snug whitespace-pre-wrap break-words bg-destructive/10 text-destructive rounded p-2 max-h-72 overflow-auto\">\n {server.last_check_error}\n </pre>\n )}\n </div>\n </section>\n )\n}\n\nconst PHASE_LABELS: Record<string, string> = {\n spawning: \"Spawning…\",\n starting: \"Installing / starting…\",\n connecting: \"Connecting…\",\n listing: \"Fetching tools…\",\n ready: \"Ready\",\n}\n\nfunction CheckLogPanel({ logs, isStreaming }: { logs: string[]; isStreaming: boolean }) {\n const scrollRef = React.useRef<HTMLDivElement | null>(null)\n React.useEffect(() => {\n const el = scrollRef.current\n if (el) el.scrollTop = el.scrollHeight\n }, [logs.length])\n\n return (\n <div className=\"mt-2 rounded border border-border bg-muted/30\">\n <div className=\"flex items-center justify-between border-b border-border px-2 py-1 text-[10px] uppercase tracking-wider text-muted-foreground\">\n <span>Install / startup logs</span>\n <span>{logs.length} line{logs.length === 1 ? \"\" : \"s\"}</span>\n </div>\n <div\n ref={scrollRef}\n className=\"max-h-56 overflow-auto scrollbar-thin px-2 py-1.5 font-mono text-[11px] leading-snug whitespace-pre-wrap break-words\"\n >\n {logs.length === 0 ? (\n <span className=\"italic text-muted-foreground\">\n {isStreaming ? \"Waiting for output…\" : \"No output captured.\"}\n </span>\n ) : (\n logs.map((line, i) => <div key={i}>{line || \"\\u00a0\"}</div>)\n )}\n </div>\n </div>\n )\n}\n\nexport function ServerInfoSection({ info }: { info: McpServerInfo }) {\n const hasIdentity = !!(info.name || info.version)\n const hasInstructions = !!info.instructions?.trim()\n const caps = info.capabilities ? Object.keys(info.capabilities) : []\n if (!hasIdentity && !hasInstructions && caps.length === 0) return null\n return (\n <section className=\"space-y-2\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n Server\n </h3>\n <div className=\"rounded-md border p-3 space-y-2 text-sm\">\n {hasIdentity && (\n <div className=\"font-mono text-xs\">\n {info.name ?? \"<unnamed>\"}\n {info.version && <span className=\"text-muted-foreground\"> @ {info.version}</span>}\n </div>\n )}\n {caps.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {caps.map((cap) => (\n <span\n key={cap}\n className=\"inline-flex items-center rounded border border-border bg-muted/40 px-1.5 py-0.5 font-mono text-[10px] uppercase tracking-wider text-muted-foreground\"\n title={`Server advertises the \"${cap}\" capability`}\n >\n {cap}\n </span>\n ))}\n </div>\n )}\n {hasInstructions && (\n <div>\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground mb-1\">\n Instructions\n </div>\n <p className=\"text-xs text-muted-foreground leading-relaxed whitespace-pre-wrap\">\n {info.instructions}\n </p>\n </div>\n )}\n </div>\n </section>\n )\n}\n\nexport function EndpointSection({ server, isAdmin }: { server: McpServerDTO; isAdmin: boolean }) {\n const c = server.config ?? {}\n return (\n <section className=\"space-y-2\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {server.transport === \"stdio\" ? \"Command\" : \"Endpoint\"}\n </h3>\n <div className=\"rounded-md border p-3 space-y-2\">\n {server.transport === \"stdio\" ? (\n <>\n <div className=\"font-mono text-xs break-all\">\n <span className=\"text-muted-foreground\">$ </span>\n {String(c.command ?? \"\")}{\" \"}\n {Array.isArray(c.args) ? (c.args as string[]).join(\" \") : \"\"}\n </div>\n {c.env && isAdmin && Object.keys(c.env as object).length > 0 && (\n <div>\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground mb-1\">Env</div>\n <ul className=\"font-mono text-[11px] space-y-0.5\">\n {Object.entries(c.env as Record<string, string>).map(([k, v]) => (\n <li key={k} className=\"truncate\">\n <span className=\"text-muted-foreground\">{k}</span>={isSecretKey(k) ? \"•••\" : v}\n </li>\n ))}\n </ul>\n </div>\n )}\n </>\n ) : (\n <>\n <div className=\"font-mono text-xs break-all\">{String(c.url ?? \"\")}</div>\n {c.headers && isAdmin && Object.keys(c.headers as object).length > 0 && (\n <div>\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground mb-1\">Headers</div>\n <ul className=\"font-mono text-[11px] space-y-0.5\">\n {Object.entries(c.headers as Record<string, string>).map(([k, v]) => (\n <li key={k} className=\"truncate\">\n <span className=\"text-muted-foreground\">{k}:</span> {isSecretKey(k) ? \"•••\" : v}\n </li>\n ))}\n </ul>\n </div>\n )}\n </>\n )}\n </div>\n </section>\n )\n}\n\nexport function ToolsSection({\n tools,\n status,\n}: {\n tools: McpToolDescriptor[]\n status: \"ok\" | \"error\" | null\n}) {\n return (\n <section className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n Tools {tools.length > 0 && <span className=\"ml-1 text-foreground\">({tools.length})</span>}\n </h3>\n </div>\n {tools.length === 0 ? (\n <div className=\"rounded-md border p-3 text-xs text-muted-foreground italic\">\n {status === \"error\"\n ? \"No tools cached — last check failed.\"\n : \"No tools cached yet. Run a check to populate.\"}\n </div>\n ) : (\n <ul className=\"rounded-md border divide-y\">\n {tools.map((t) => (\n <ToolRow key={t.name} tool={t} />\n ))}\n </ul>\n )}\n </section>\n )\n}\n\nfunction ToolRow({ tool }: { tool: McpToolDescriptor }) {\n const [open, setOpen] = React.useState(false)\n const params = tool.parameters as { properties?: Record<string, unknown>; required?: string[] }\n const propEntries = params?.properties ? Object.entries(params.properties) : []\n const required = new Set(params?.required ?? [])\n return (\n <li className={cn(\"p-3 text-xs space-y-1.5\", open && \"bg-muted/30\")}>\n <button\n type=\"button\"\n onClick={() => setOpen((o) => !o)}\n className=\"flex w-full items-center gap-2 text-left\"\n >\n <ExternalLink className=\"h-3 w-3 text-muted-foreground rotate-90\" />\n <span className=\"font-mono text-foreground\">{tool.name}</span>\n {propEntries.length > 0 && (\n <span className=\"text-[10px] text-muted-foreground\">{propEntries.length} param{propEntries.length === 1 ? \"\" : \"s\"}</span>\n )}\n </button>\n {tool.description && (\n <p className=\"text-muted-foreground pl-5 leading-snug\">{tool.description}</p>\n )}\n {open && (\n <div className=\"pl-5 pt-1\">\n {propEntries.length === 0 ? (\n <p className=\"text-muted-foreground italic\">(no parameters)</p>\n ) : (\n <ul className=\"space-y-1\">\n {propEntries.map(([k, v]) => {\n const meta = v as { type?: string; description?: string }\n return (\n <li key={k} className=\"flex gap-2\">\n <span className=\"font-mono text-foreground\">{k}</span>\n {meta?.type && (\n <span className=\"font-mono text-muted-foreground text-[10px]\">\n : {meta.type}\n </span>\n )}\n {required.has(k) && (\n <Badge variant=\"outline\" className=\"h-3.5 px-1 text-[9px]\">required</Badge>\n )}\n {meta?.description && (\n <span className=\"text-muted-foreground text-[11px] truncate\">— {meta.description}</span>\n )}\n </li>\n )\n })}\n </ul>\n )}\n </div>\n )}\n </li>\n )\n}\n\nexport function ResourcesSection({\n snapshot,\n capabilityAdvertised,\n status,\n}: {\n snapshot: McpResourcesSnapshot | null\n capabilityAdvertised: boolean\n status: \"ok\" | \"error\" | null\n}) {\n const total = snapshot ? snapshot.resources.length + snapshot.templates.length : 0\n return (\n <section className=\"space-y-2\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n Resources {total > 0 && <span className=\"ml-1 text-foreground\">({total})</span>}\n </h3>\n {!capabilityAdvertised ? (\n <EmptyHint>This server does not advertise the <Tag>resources</Tag> capability.</EmptyHint>\n ) : snapshot === null ? (\n <EmptyHint>\n {status === \"error\"\n ? \"Last check failed — run another to populate.\"\n : \"Server advertises resources but the list call did not complete.\"}\n </EmptyHint>\n ) : total === 0 ? (\n <EmptyHint>Server advertises resources but exposes none.</EmptyHint>\n ) : (\n <ul className=\"rounded-md border divide-y\">\n {snapshot.resources.map((r) => (\n <li key={`r-${r.uri}`} className=\"p-3 text-xs space-y-0.5\">\n <div className=\"font-mono text-foreground break-all\">{r.uri}</div>\n <div className=\"flex items-baseline gap-2\">\n {r.name && <span className=\"text-foreground\">{r.name}</span>}\n {r.mimeType && (\n <span className=\"font-mono text-[10px] text-muted-foreground\">{r.mimeType}</span>\n )}\n </div>\n {r.description && (\n <p className=\"text-muted-foreground leading-snug\">{r.description}</p>\n )}\n </li>\n ))}\n {snapshot.templates.map((t) => (\n <li key={`t-${t.uriTemplate}`} className=\"p-3 text-xs space-y-0.5 bg-muted/10\">\n <div className=\"flex items-baseline gap-2\">\n <span className=\"inline-flex items-center rounded border border-border bg-muted/40 px-1 font-mono text-[9px] uppercase tracking-wider text-muted-foreground\">\n template\n </span>\n <span className=\"font-mono text-foreground break-all\">{t.uriTemplate}</span>\n </div>\n {(t.name || t.mimeType) && (\n <div className=\"flex items-baseline gap-2 pl-[60px]\">\n {t.name && <span className=\"text-foreground\">{t.name}</span>}\n {t.mimeType && (\n <span className=\"font-mono text-[10px] text-muted-foreground\">{t.mimeType}</span>\n )}\n </div>\n )}\n {t.description && (\n <p className=\"text-muted-foreground leading-snug pl-[60px]\">{t.description}</p>\n )}\n </li>\n ))}\n </ul>\n )}\n </section>\n )\n}\n\nexport function PromptsSection({\n prompts,\n capabilityAdvertised,\n status,\n}: {\n prompts: McpPromptDescriptor[] | null\n capabilityAdvertised: boolean\n status: \"ok\" | \"error\" | null\n}) {\n return (\n <section className=\"space-y-2\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n Prompts {prompts && prompts.length > 0 && (\n <span className=\"ml-1 text-foreground\">({prompts.length})</span>\n )}\n </h3>\n {!capabilityAdvertised ? (\n <EmptyHint>This server does not advertise the <Tag>prompts</Tag> capability.</EmptyHint>\n ) : prompts === null ? (\n <EmptyHint>\n {status === \"error\"\n ? \"Last check failed — run another to populate.\"\n : \"Server advertises prompts but the list call did not complete.\"}\n </EmptyHint>\n ) : prompts.length === 0 ? (\n <EmptyHint>Server advertises prompts but exposes none.</EmptyHint>\n ) : (\n <ul className=\"rounded-md border divide-y\">\n {prompts.map((p) => (\n <PromptRow key={p.name} prompt={p} />\n ))}\n </ul>\n )}\n </section>\n )\n}\n\nfunction PromptRow({ prompt }: { prompt: McpPromptDescriptor }) {\n const [open, setOpen] = React.useState(false)\n const args = prompt.arguments ?? []\n return (\n <li className={cn(\"p-3 text-xs space-y-1.5\", open && \"bg-muted/30\")}>\n <button\n type=\"button\"\n onClick={() => setOpen((o) => !o)}\n className=\"flex w-full items-center gap-2 text-left\"\n >\n <ExternalLink className=\"h-3 w-3 text-muted-foreground rotate-90\" />\n <span className=\"font-mono text-foreground\">{prompt.name}</span>\n {args.length > 0 && (\n <span className=\"text-[10px] text-muted-foreground\">{args.length} arg{args.length === 1 ? \"\" : \"s\"}</span>\n )}\n </button>\n {prompt.description && (\n <p className=\"text-muted-foreground pl-5 leading-snug\">{prompt.description}</p>\n )}\n {open && args.length > 0 && (\n <ul className=\"pl-5 pt-1 space-y-1\">\n {args.map((a) => (\n <li key={a.name} className=\"flex gap-2\">\n <span className=\"font-mono text-foreground\">{a.name}</span>\n {a.required && (\n <Badge variant=\"outline\" className=\"h-3.5 px-1 text-[9px]\">required</Badge>\n )}\n {a.description && (\n <span className=\"text-muted-foreground text-[11px] truncate\">— {a.description}</span>\n )}\n </li>\n ))}\n </ul>\n )}\n </li>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { toast } from \"sonner\"\nimport { Wrench } from \"lucide-react\"\n\nimport { mcpServers } from \"@/lib/api\"\nimport type { McpServerDTO } from \"@/lib/schemas/mcp\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from \"@/components/ui/sheet\"\nimport {\n EndpointSection,\n HealthSection,\n PromptsSection,\n ResourcesSection,\n ServerInfoSection,\n ToolsSection,\n} from \"./_parts/sections\"\n\ninterface Props {\n server: McpServerDTO | null\n open: boolean\n onOpenChange: (open: boolean) => void\n isAdmin: boolean\n}\n\n/**\n * Read-only details panel for one MCP server. Composes per-capability\n * sections from `_parts/sections.tsx`; adding a new MCP capability\n * surface only requires writing a new section component there and one\n * invocation below — the shell stays small.\n */\nexport function McpServerDetailsSheet({ server, open, onOpenChange, isAdmin }: Props) {\n // Streaming check — live stderr lines + phase transitions surface\n // in the HealthSection so slow `npx`/`uvx` installs aren't silent.\n const check = mcpServers.useCheckStream()\n\n React.useEffect(() => {\n if (check.result) {\n if (check.result.last_check_status === \"ok\") {\n toast.success(`Check passed — ${check.result.tools_cache?.length ?? 0} tools`)\n } else {\n const first = (check.result.last_check_error ?? \"unknown error\").split(\"\\n\", 1)[0]\n toast.error(`Check failed: ${first}`)\n }\n }\n }, [check.result])\n\n React.useEffect(() => {\n if (check.error && !check.result) toast.error(check.error)\n }, [check.error, check.result])\n\n const runCheck = React.useCallback(() => {\n if (!server) return\n void check.run(server.id)\n }, [server, check])\n\n // Silent backfill: rows created before the server_info column\n // existed have it null even when the server is healthy. Trigger\n // a re-check on first open so the section populates without\n // forcing the user to hunt for the button.\n const backfillIdRef = React.useRef<string | null>(null)\n React.useEffect(() => {\n if (!open || !server) return\n if (server.server_info) return\n if (server.last_check_status !== \"ok\") return\n if (backfillIdRef.current === server.id) return\n backfillIdRef.current = server.id\n void check.run(server.id)\n }, [open, server, check])\n\n // Reset stream state when switching between rows so the previous\n // server's logs don't bleed into the new sheet.\n const lastSheetIdRef = React.useRef<string | null>(null)\n React.useEffect(() => {\n if (!open) return\n const id = server?.id ?? null\n if (lastSheetIdRef.current && lastSheetIdRef.current !== id) {\n check.cancel()\n check.reset()\n }\n lastSheetIdRef.current = id\n }, [open, server, check])\n\n if (!server) return null\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent side=\"right\" className=\"w-full sm:max-w-[640px] overflow-y-auto scrollbar-thin p-0\">\n <SheetHeader className=\"px-6 py-4 border-b\">\n <SheetTitle className=\"flex items-center gap-2 text-base\">\n <Wrench className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"font-mono\">{server.name}</span>\n <Badge variant=\"outline\" className=\"text-[10px] uppercase ml-2\">\n {server.transport}\n </Badge>\n {!server.enabled && (\n <Badge variant=\"secondary\" className=\"text-[10px] uppercase\">\n disabled\n </Badge>\n )}\n </SheetTitle>\n <SheetDescription className=\"text-xs text-muted-foreground pt-1\">\n {server.description || \"MCP server connection details, health, and discovered tools.\"}\n </SheetDescription>\n </SheetHeader>\n\n <div className=\"px-6 py-4 space-y-5\">\n <HealthSection\n server={server}\n onCheck={runCheck}\n isChecking={check.isChecking}\n isAdmin={isAdmin}\n streaming={{\n phase: check.phase,\n logs: check.logs,\n error: check.error,\n }}\n />\n {server.server_info && <ServerInfoSection info={server.server_info} />}\n <EndpointSection server={server} isAdmin={isAdmin} />\n <ToolsSection tools={server.tools_cache ?? []} status={server.last_check_status} />\n <ResourcesSection\n snapshot={server.resources_cache}\n capabilityAdvertised={!!server.server_info?.capabilities?.resources}\n status={server.last_check_status}\n />\n <PromptsSection\n prompts={server.prompts_cache}\n capabilityAdvertised={!!server.server_info?.capabilities?.prompts}\n status={server.last_check_status}\n />\n </div>\n </SheetContent>\n </Sheet>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport Link from \"next/link\"\nimport { useSearchParams } from \"next/navigation\"\nimport { LayoutGrid, Plus, Sparkles } from \"lucide-react\"\nimport { toast } from \"sonner\"\n\nimport { mcpServers } from \"@/lib/api/mcp\"\nimport { useAuth } from \"@/context/auth-context\"\nimport type { McpServerDTO } from \"@/lib/schemas/mcp\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { ConfirmDialog } from \"@/components/ui/confirm-dialog\"\nimport { LoadingState } from \"@/components/ui/loading-state\"\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\"\nimport { McpFormDialog } from \"@/components/tools/mcp-form-dialog\"\nimport { McpServersTable } from \"@/components/tools/mcp-table\"\nimport { McpServerDetailsSheet } from \"@/components/tools/mcp-details-sheet\"\n\ntype McpDialogState = { open: boolean; mode: \"create\" | \"edit\"; server?: McpServerDTO | null }\n\n/** Primary MCP / Skills page. Hand-written tool definitions live in\n * /settings as a less-prominent escape hatch — MCP is the headline. */\nexport default function McpPage() {\n const { user } = useAuth()\n const isAdmin = user?.role === \"admin\"\n const [activeTab, setActiveTab] = React.useState(\"mcp\")\n\n const { data: mcpList, isLoading: loadingMcp } = mcpServers.useList(undefined, {\n enabled: activeTab === \"mcp\",\n // Auto-refresh while any server is still \"checking\" (status\n // null) so the post-create background probe surfaces without\n // a manual refresh.\n refetchInterval: (q) => {\n const data = q.state.data as McpServerDTO[] | undefined\n if (!data) return false\n return data.some((s) => s.last_check_status === null) ? 2_000 : false\n },\n })\n\n const [mcpDialog, setMcpDialog] = React.useState<McpDialogState>({ open: false, mode: \"create\" })\n const [deleteServer, setDeleteServer] = React.useState<McpServerDTO | null>(null)\n\n // Catalogue page links back with `?selected=<id>` after a\n // successful create so the new row's details sheet opens right\n // away. Read once on mount via lazy state init — no effect, no\n // setState-during-render.\n const searchParams = useSearchParams()\n const [selectedId, setSelectedId] = React.useState<string | null>(\n () => searchParams?.get(\"selected\") ?? null,\n )\n\n const selectedServer = React.useMemo(\n () => (mcpList ?? []).find((s) => s.id === selectedId) ?? null,\n [mcpList, selectedId],\n )\n\n const deleteServerMutation = mcpServers.useDelete({\n onSuccess: () => {\n toast.success(\"Server deleted\")\n setDeleteServer(null)\n if (selectedId === deleteServer?.id) setSelectedId(null)\n },\n onError: (e) => toast.error(e.message || \"Delete failed\"),\n })\n\n return (\n <div className=\"h-full flex flex-col p-4 overflow-y-hidden\">\n <Tabs\n defaultValue=\"mcp\"\n className=\"flex-1 flex flex-col min-h-0 w-full gap-4\"\n onValueChange={setActiveTab}\n >\n <div className=\"flex items-center gap-2 px-1 flex-wrap md:flex-nowrap\">\n <TabsList className=\"h-8 p-0.5\">\n <TabsTrigger value=\"mcp\" className=\"h-7 px-3 text-xs\">MCP</TabsTrigger>\n <TabsTrigger value=\"skills\" className=\"h-7 px-3 text-xs\">Skills</TabsTrigger>\n </TabsList>\n\n {activeTab === \"mcp\" && (\n <div className=\"flex items-center gap-1.5 ml-auto\">\n <Link href=\"/mcp/presets\">\n <Button size=\"sm\" variant=\"secondary\" className=\"h-8 text-xs gap-1.5\">\n <LayoutGrid className=\"h-3.5 w-3.5\" />\n Catalogue\n </Button>\n </Link>\n {isAdmin && (\n <Button\n size=\"icon\"\n variant=\"secondary\"\n className=\"h-8 w-8 shrink-0\"\n onClick={() => setMcpDialog({ open: true, mode: \"create\" })}\n title=\"Add MCP server\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n </div>\n )}\n </div>\n\n <TabsContent value=\"mcp\" className=\"flex-1 min-h-0 flex flex-col\">\n <div className=\"flex-1 border rounded-xl bg-card shadow-sm flex flex-col overflow-hidden relative\">\n {loadingMcp && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-background/50 z-10\">\n <LoadingState label=\"Loading MCP servers…\" />\n </div>\n )}\n <div className=\"flex-1 overflow-auto\">\n <McpServersTable\n servers={mcpList ?? []}\n onSelect={(s) => setSelectedId(s.id)}\n onEdit={isAdmin ? (s) => setMcpDialog({ open: true, mode: \"edit\", server: s }) : undefined}\n onDelete={isAdmin ? setDeleteServer : undefined}\n selectedId={selectedId}\n />\n </div>\n </div>\n </TabsContent>\n\n <TabsContent value=\"skills\" className=\"flex-1 min-h-0 flex flex-col items-center justify-center text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-2xl bg-gradient-to-br from-amber-500/20 to-orange-500/20\">\n <Sparkles className=\"h-6 w-6 text-amber-500\" />\n </div>\n <h2 className=\"mt-3 text-base font-semibold tracking-tight\">Skills</h2>\n <p className=\"mt-1 text-xs text-muted-foreground\">Coming soon.</p>\n </TabsContent>\n </Tabs>\n\n <McpFormDialog\n open={mcpDialog.open}\n onOpenChange={(open) => setMcpDialog((s) => ({ ...s, open }))}\n mode={mcpDialog.mode}\n server={mcpDialog.server}\n />\n\n <McpServerDetailsSheet\n server={selectedServer}\n open={!!selectedServer}\n onOpenChange={(o) => !o && setSelectedId(null)}\n isAdmin={isAdmin}\n />\n\n <ConfirmDialog\n open={!!deleteServer}\n onOpenChange={(o) => !o && setDeleteServer(null)}\n title=\"Delete MCP server?\"\n description={<>This will delete <b>{deleteServer?.name}</b>.</>}\n confirmLabel=\"Delete\"\n destructive\n isLoading={deleteServerMutation.isPending}\n onConfirm={() => deleteServer && deleteServerMutation.mutate(deleteServer.id)}\n />\n </div>\n )\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['path', { d: 'm15 9-6 6', key: '1uzhvr' }],\n ['path', { d: 'm9 9 6 6', key: 'z0biqf' }],\n];\n\n/**\n * @component @name CircleX\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJtMTUgOS02IDYiIC8+CiAgPHBhdGggZD0ibTkgOSA2IDYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/circle-x\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleX = createLucideIcon('circle-x', __iconNode);\n\nexport default CircleX;\n"],"names":[],"mappings":"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","ignoreList":[4]}
@@ -7,9 +7,9 @@ globalThis.__BUILD_MANIFEST = {
7
7
  "static/chunks/0cz1d0mv5g_q7.js"
8
8
  ],
9
9
  "lowPriorityFiles": [
10
- "static/S-TxD5uw__EHY12mebgvS/_buildManifest.js",
11
- "static/S-TxD5uw__EHY12mebgvS/_ssgManifest.js",
12
- "static/S-TxD5uw__EHY12mebgvS/_clientMiddlewareManifest.js"
10
+ "static/wCZkC7ZaYrxG37d-e2tac/_buildManifest.js",
11
+ "static/wCZkC7ZaYrxG37d-e2tac/_ssgManifest.js",
12
+ "static/wCZkC7ZaYrxG37d-e2tac/_clientMiddlewareManifest.js"
13
13
  ],
14
14
  "rootMainFiles": [
15
15
  "static/chunks/1jexzsn2qdw84.js",
@@ -1,5 +1,5 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/233p45nuh4m5b.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/1_w-1rm5wy0l7.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/1jexzsn2qdw84.js"/><script src="/_next/static/chunks/2-n3y00tm0437.js" async=""></script><script src="/_next/static/chunks/3zgk7uytcvwnj.js" async=""></script><script src="/_next/static/chunks/11_hrwa6kernl.js" async=""></script><script src="/_next/static/chunks/0g8ku62w0yb2s.js" async=""></script><script src="/_next/static/chunks/turbopack-09oh1_wbex94r.js" async=""></script><script src="/_next/static/chunks/0gwy6u53e_4ul.js" async=""></script><script src="/_next/static/chunks/2izbovk1ixytg.js" async=""></script><script src="/_next/static/chunks/1giwad-u52ub-.js" async=""></script><script src="/_next/static/chunks/1ntn7efqc-iiw.js" async=""></script><script src="/_next/static/chunks/0k4-ojig21nwu.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>Loom</title><meta name="description" content="Self-hosted AI portal · OpenAI-compatible · MCP · Playground · Logs"/><link rel="icon" href="/icon.svg?icon.3ehpc5vjf2gkq.svg" sizes="any" type="image/svg+xml"/><style id="loom-theme-tokens">:root[data-theme="paper"]{--background:oklch(0.97 0.02 80);--foreground:oklch(0.20 0.02 60);--card:oklch(0.99 0.015 80);--card-foreground:oklch(0.20 0.02 60);--popover:oklch(0.99 0.015 80);--popover-foreground:oklch(0.20 0.02 60);--primary:oklch(0.45 0.10 40);--primary-foreground:oklch(0.97 0.02 80);--secondary:oklch(0.92 0.02 75);--secondary-foreground:oklch(0.25 0.03 50);--muted:oklch(0.93 0.015 75);--muted-foreground:oklch(0.48 0.02 50);--accent:oklch(0.91 0.04 70);--accent-foreground:oklch(0.25 0.05 50);--border:oklch(0.85 0.02 70);--input:oklch(0.88 0.02 70);--ring:oklch(0.55 0.08 40);--radius:0.875rem;}
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/233p45nuh4m5b.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/0cbg1vmtl84ae.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/1jexzsn2qdw84.js"/><script src="/_next/static/chunks/2-n3y00tm0437.js" async=""></script><script src="/_next/static/chunks/3zgk7uytcvwnj.js" async=""></script><script src="/_next/static/chunks/11_hrwa6kernl.js" async=""></script><script src="/_next/static/chunks/0g8ku62w0yb2s.js" async=""></script><script src="/_next/static/chunks/turbopack-09oh1_wbex94r.js" async=""></script><script src="/_next/static/chunks/0gwy6u53e_4ul.js" async=""></script><script src="/_next/static/chunks/2izbovk1ixytg.js" async=""></script><script src="/_next/static/chunks/1giwad-u52ub-.js" async=""></script><script src="/_next/static/chunks/1ntn7efqc-iiw.js" async=""></script><script src="/_next/static/chunks/0k4-ojig21nwu.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>Loom</title><meta name="description" content="Self-hosted AI portal · OpenAI-compatible · MCP · Playground · Logs"/><link rel="icon" href="/icon.svg?icon.3ehpc5vjf2gkq.svg" sizes="any" type="image/svg+xml"/><style id="loom-theme-tokens">:root[data-theme="paper"]{--background:oklch(0.97 0.02 80);--foreground:oklch(0.20 0.02 60);--card:oklch(0.99 0.015 80);--card-foreground:oklch(0.20 0.02 60);--popover:oklch(0.99 0.015 80);--popover-foreground:oklch(0.20 0.02 60);--primary:oklch(0.45 0.10 40);--primary-foreground:oklch(0.97 0.02 80);--secondary:oklch(0.92 0.02 75);--secondary-foreground:oklch(0.25 0.03 50);--muted:oklch(0.93 0.015 75);--muted-foreground:oklch(0.48 0.02 50);--accent:oklch(0.91 0.04 70);--accent-foreground:oklch(0.25 0.05 50);--border:oklch(0.85 0.02 70);--input:oklch(0.88 0.02 70);--ring:oklch(0.55 0.08 40);--radius:0.875rem;}
2
2
  :root[data-theme="paper"].dark{--background:oklch(0.18 0.015 60);--foreground:oklch(0.94 0.02 80);--card:oklch(0.23 0.018 60);--card-foreground:oklch(0.94 0.02 80);--popover:oklch(0.23 0.018 60);--popover-foreground:oklch(0.94 0.02 80);--primary:oklch(0.78 0.10 40);--primary-foreground:oklch(0.18 0.015 60);--secondary:oklch(0.27 0.02 55);--secondary-foreground:oklch(0.94 0.02 80);--muted:oklch(0.27 0.02 55);--muted-foreground:oklch(0.70 0.02 75);--accent:oklch(0.30 0.05 60);--accent-foreground:oklch(0.94 0.02 80);--border:oklch(1 0 0 / 12%);--input:oklch(1 0 0 / 15%);--ring:oklch(0.65 0.08 40);--radius:0.875rem;}
3
3
  :root[data-theme="terminal"].dark{--background:oklch(0.13 0.015 145);--foreground:oklch(0.92 0.18 145);--card:oklch(0.16 0.02 145);--card-foreground:oklch(0.92 0.18 145);--popover:oklch(0.16 0.02 145);--popover-foreground:oklch(0.92 0.18 145);--primary:oklch(0.85 0.20 145);--primary-foreground:oklch(0.13 0.015 145);--secondary:oklch(0.22 0.04 145);--secondary-foreground:oklch(0.92 0.18 145);--muted:oklch(0.22 0.04 145);--muted-foreground:oklch(0.65 0.12 145);--accent:oklch(0.25 0.06 145);--accent-foreground:oklch(0.92 0.18 145);--destructive:oklch(0.72 0.22 28);--border:oklch(0.85 0.18 145 / 18%);--input:oklch(0.85 0.18 145 / 14%);--ring:oklch(0.85 0.18 145 / 50%);--radius:0.25rem;--font-sans:var(--font-geist-mono);}
4
4
  :root[data-theme="aurora"]{--background:oklch(0.985 0.005 280);--foreground:oklch(0.20 0.05 290);--card:oklch(1 0 0);--card-foreground:oklch(0.20 0.05 290);--popover:oklch(1 0 0);--popover-foreground:oklch(0.20 0.05 290);--primary:oklch(0.55 0.22 290);--primary-foreground:oklch(0.985 0.005 280);--secondary:oklch(0.95 0.02 285);--secondary-foreground:oklch(0.25 0.06 290);--muted:oklch(0.95 0.015 285);--muted-foreground:oklch(0.50 0.04 290);--accent:oklch(0.85 0.10 190);--accent-foreground:oklch(0.20 0.05 290);--border:oklch(0.88 0.02 285);--input:oklch(0.90 0.02 285);--ring:oklch(0.55 0.22 290);--radius:0.875rem;}
5
- :root[data-theme="aurora"].dark{--background:oklch(0.17 0.04 280);--foreground:oklch(0.95 0.015 280);--card:oklch(0.22 0.05 280);--card-foreground:oklch(0.95 0.015 280);--popover:oklch(0.22 0.05 280);--popover-foreground:oklch(0.95 0.015 280);--primary:oklch(0.72 0.20 290);--primary-foreground:oklch(0.17 0.04 280);--secondary:oklch(0.28 0.06 280);--secondary-foreground:oklch(0.95 0.015 280);--muted:oklch(0.28 0.06 280);--muted-foreground:oklch(0.72 0.04 285);--accent:oklch(0.70 0.16 195);--accent-foreground:oklch(0.17 0.04 280);--border:oklch(0.72 0.20 290 / 18%);--input:oklch(0.72 0.20 290 / 14%);--ring:oklch(0.72 0.20 290 / 60%);--radius:0.875rem;}</style><script>(function(){try{var raw=localStorage.getItem("loom-theme");if(!raw)return;var t=JSON.parse(raw);if(t&&typeof t.id==="string")document.documentElement.dataset.theme=t.id;var s=t&&t.scheme;if(s==="system")s=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light";if(s==="dark")document.documentElement.classList.add("dark");else if(s==="light")document.documentElement.classList.remove("dark");}catch(e){}})();</script><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body class="geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased"><div hidden=""><!--$--><!--/$--></div><script>((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}})("class","theme","system",null,["light","dark"],null,true,true)</script><!--$!--><template data-dgst="BAILOUT_TO_CLIENT_SIDE_RENDERING"></template><!--/$--><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section><script src="/_next/static/chunks/1jexzsn2qdw84.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n9:I[168027,[\"/_next/static/chunks/0gwy6u53e_4ul.js\",\"/_next/static/chunks/2izbovk1ixytg.js\",\"/_next/static/chunks/1giwad-u52ub-.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/233p45nuh4m5b.css\",\"style\"]\n:HL[\"/_next/static/chunks/1_w-1rm5wy0l7.css\",\"style\"]\n2:Tcac,"])</script><script>self.__next_f.push([1,":root[data-theme=\"paper\"]{--background:oklch(0.97 0.02 80);--foreground:oklch(0.20 0.02 60);--card:oklch(0.99 0.015 80);--card-foreground:oklch(0.20 0.02 60);--popover:oklch(0.99 0.015 80);--popover-foreground:oklch(0.20 0.02 60);--primary:oklch(0.45 0.10 40);--primary-foreground:oklch(0.97 0.02 80);--secondary:oklch(0.92 0.02 75);--secondary-foreground:oklch(0.25 0.03 50);--muted:oklch(0.93 0.015 75);--muted-foreground:oklch(0.48 0.02 50);--accent:oklch(0.91 0.04 70);--accent-foreground:oklch(0.25 0.05 50);--border:oklch(0.85 0.02 70);--input:oklch(0.88 0.02 70);--ring:oklch(0.55 0.08 40);--radius:0.875rem;}\n:root[data-theme=\"paper\"].dark{--background:oklch(0.18 0.015 60);--foreground:oklch(0.94 0.02 80);--card:oklch(0.23 0.018 60);--card-foreground:oklch(0.94 0.02 80);--popover:oklch(0.23 0.018 60);--popover-foreground:oklch(0.94 0.02 80);--primary:oklch(0.78 0.10 40);--primary-foreground:oklch(0.18 0.015 60);--secondary:oklch(0.27 0.02 55);--secondary-foreground:oklch(0.94 0.02 80);--muted:oklch(0.27 0.02 55);--muted-foreground:oklch(0.70 0.02 75);--accent:oklch(0.30 0.05 60);--accent-foreground:oklch(0.94 0.02 80);--border:oklch(1 0 0 / 12%);--input:oklch(1 0 0 / 15%);--ring:oklch(0.65 0.08 40);--radius:0.875rem;}\n:root[data-theme=\"terminal\"].dark{--background:oklch(0.13 0.015 145);--foreground:oklch(0.92 0.18 145);--card:oklch(0.16 0.02 145);--card-foreground:oklch(0.92 0.18 145);--popover:oklch(0.16 0.02 145);--popover-foreground:oklch(0.92 0.18 145);--primary:oklch(0.85 0.20 145);--primary-foreground:oklch(0.13 0.015 145);--secondary:oklch(0.22 0.04 145);--secondary-foreground:oklch(0.92 0.18 145);--muted:oklch(0.22 0.04 145);--muted-foreground:oklch(0.65 0.12 145);--accent:oklch(0.25 0.06 145);--accent-foreground:oklch(0.92 0.18 145);--destructive:oklch(0.72 0.22 28);--border:oklch(0.85 0.18 145 / 18%);--input:oklch(0.85 0.18 145 / 14%);--ring:oklch(0.85 0.18 145 / 50%);--radius:0.25rem;--font-sans:var(--font-geist-mono);}\n:root[data-theme=\"aurora\"]{--background:oklch(0.985 0.005 280);--foreground:oklch(0.20 0.05 290);--card:oklch(1 0 0);--card-foreground:oklch(0.20 0.05 290);--popover:oklch(1 0 0);--popover-foreground:oklch(0.20 0.05 290);--primary:oklch(0.55 0.22 290);--primary-foreground:oklch(0.985 0.005 280);--secondary:oklch(0.95 0.02 285);--secondary-foreground:oklch(0.25 0.06 290);--muted:oklch(0.95 0.015 285);--muted-foreground:oklch(0.50 0.04 290);--accent:oklch(0.85 0.10 190);--accent-foreground:oklch(0.20 0.05 290);--border:oklch(0.88 0.02 285);--input:oklch(0.90 0.02 285);--ring:oklch(0.55 0.22 290);--radius:0.875rem;}\n:root[data-theme=\"aurora\"].dark{--background:oklch(0.17 0.04 280);--foreground:oklch(0.95 0.015 280);--card:oklch(0.22 0.05 280);--card-foreground:oklch(0.95 0.015 280);--popover:oklch(0.22 0.05 280);--popover-foreground:oklch(0.95 0.015 280);--primary:oklch(0.72 0.20 290);--primary-foreground:oklch(0.17 0.04 280);--secondary:oklch(0.28 0.06 280);--secondary-foreground:oklch(0.95 0.015 280);--muted:oklch(0.28 0.06 280);--muted-foreground:oklch(0.72 0.04 285);--accent:oklch(0.70 0.16 195);--accent-foreground:oklch(0.17 0.04 280);--border:oklch(0.72 0.20 290 / 18%);--input:oklch(0.72 0.20 290 / 14%);--ring:oklch(0.72 0.20 290 / 60%);--radius:0.875rem;}"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/233p45nuh4m5b.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/1_w-1rm5wy0l7.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0gwy6u53e_4ul.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/2izbovk1ixytg.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/1giwad-u52ub-.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-3\",{\"src\":\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"style\",null,{\"id\":\"loom-theme-tokens\",\"dangerouslySetInnerHTML\":{\"__html\":\"$2\"}}],\"$L3\"]}],\"$L4\"]}]]}],{\"children\":[\"$L5\",{\"children\":[\"$L6\",{},null,false,null]},null,false,\"$@7\"]},null,false,null],\"$L8\",false]],\"m\":\"$undefined\",\"G\":[\"$9\",[\"$La\",\"$Lb\"]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"S-TxD5uw__EHY12mebgvS\"}\n"])</script><script>self.__next_f.push([1,"c:I[26229,[\"/_next/static/chunks/0gwy6u53e_4ul.js\",\"/_next/static/chunks/2izbovk1ixytg.js\",\"/_next/static/chunks/1giwad-u52ub-.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"AppProviders\"]\nd:I[339756,[\"/_next/static/chunks/0gwy6u53e_4ul.js\",\"/_next/static/chunks/2izbovk1ixytg.js\",\"/_next/static/chunks/1giwad-u52ub-.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"default\"]\ne:I[837457,[\"/_next/static/chunks/0gwy6u53e_4ul.js\",\"/_next/static/chunks/2izbovk1ixytg.js\",\"/_next/static/chunks/1giwad-u52ub-.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"default\"]\nf:I[522016,[\"/_next/static/chunks/0gwy6u53e_4ul.js\",\"/_next/static/chunks/2izbovk1ixytg.js\",\"/_next/static/chunks/1giwad-u52ub-.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/0k4-ojig21nwu.js\"],\"\"]\n10:I[897367,[\"/_next/static/chunks/0gwy6u53e_4ul.js\",\"/_next/static/chunks/2izbovk1ixytg.js\",\"/_next/static/chunks/1giwad-u52ub-.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"OutletBoundary\"]\n11:\"$Sreact.suspense\"\n14:I[897367,[\"/_next/static/chunks/0gwy6u53e_4ul.js\",\"/_next/static/chunks/2izbovk1ixytg.js\",\"/_next/static/chunks/1giwad-u52ub-.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"ViewportBoundary\"]\n16:I[897367,[\"/_next/static/chunks/0gwy6u53e_4ul.js\",\"/_next/static/chunks/2izbovk1ixytg.js\",\"/_next/static/chunks/1giwad-u52ub-.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"MetadataBoundary\"]\n3:[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var raw=localStorage.getItem(\\\"loom-theme\\\");if(!raw)return;var t=JSON.parse(raw);if(t\u0026\u0026typeof t.id===\\\"string\\\")document.documentElement.dataset.theme=t.id;var s=t\u0026\u0026t.scheme;if(s===\\\"system\\\")s=window.matchMedia\u0026\u0026window.matchMedia(\\\"(prefers-color-scheme: dark)\\\").matches?\\\"dark\\\":\\\"light\\\";if(s===\\\"dark\\\")document.documentElement.classList.add(\\\"dark\\\");else if(s===\\\"light\\\")document.documentElement.classList.remove(\\\"dark\\\");}catch(e){}})();\"}}]\n"])</script><script>self.__next_f.push([1,"4:[\"$\",\"body\",null,{\"className\":\"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased\",\"children\":[\"$\",\"$Lc\",null,{\"children\":[\"$\",\"$Ld\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$Le\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"div\",null,{\"className\":\"flex h-screen w-full items-center justify-center p-6 bg-background\",\"children\":[\"$\",\"div\",null,{\"className\":\"max-w-md w-full space-y-4 text-center\",\"children\":[[\"$\",\"h1\",null,{\"className\":\"text-6xl font-semibold text-muted-foreground/40\",\"children\":\"404\"}],[\"$\",\"h2\",null,{\"className\":\"text-lg font-semibold text-foreground\",\"children\":\"Page not found\"}],[\"$\",\"p\",null,{\"className\":\"text-sm text-muted-foreground\",\"children\":\"The page you're looking for doesn't exist or has been moved.\"}],[\"$\",\"div\",null,{\"className\":\"pt-2\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/\",\"children\":\"Back to dashboard\",\"data-slot\":\"button\",\"data-variant\":\"default\",\"data-size\":\"default\",\"className\":\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [\u0026_svg]:pointer-events-none [\u0026_svg:not([class*='size-'])]:size-4 shrink-0 [\u0026_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive bg-primary text-primary-foreground hover:bg-primary/90 h-9 px-4 py-2 has-[\u003esvg]:px-3\",\"ref\":null}]}]]}]}],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]\n"])</script><script>self.__next_f.push([1,"5:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$Ld\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$Le\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\n"])</script><script>self.__next_f.push([1,"6:[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"div\",null,{\"className\":\"flex h-screen w-full items-center justify-center p-6 bg-background\",\"children\":[\"$\",\"div\",null,{\"className\":\"max-w-md w-full space-y-4 text-center\",\"children\":[[\"$\",\"h1\",null,{\"className\":\"text-6xl font-semibold text-muted-foreground/40\",\"children\":\"404\"}],[\"$\",\"h2\",null,{\"className\":\"text-lg font-semibold text-foreground\",\"children\":\"Page not found\"}],[\"$\",\"p\",null,{\"className\":\"text-sm text-muted-foreground\",\"children\":\"The page you're looking for doesn't exist or has been moved.\"}],[\"$\",\"div\",null,{\"className\":\"pt-2\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/\",\"children\":\"Back to dashboard\",\"data-slot\":\"button\",\"data-variant\":\"default\",\"data-size\":\"default\",\"className\":\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [\u0026_svg]:pointer-events-none [\u0026_svg:not([class*='size-'])]:size-4 shrink-0 [\u0026_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive bg-primary text-primary-foreground hover:bg-primary/90 h-9 px-4 py-2 has-[\u003esvg]:px-3\",\"ref\":null}]}]]}]}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0k4-ojig21nwu.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L10\",null,{\"children\":[\"$\",\"$11\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@12\"}]}]]}]\n"])</script><script>self.__next_f.push([1,"13:[]\n7:\"$W13\"\n8:[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L14\",null,{\"children\":\"$L15\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L16\",null,{\"children\":[\"$\",\"$11\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L17\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}]\na:[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/233p45nuh4m5b.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]\nb:[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/1_w-1rm5wy0l7.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]\n"])</script><script>self.__next_f.push([1,"15:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"18:I[27201,[\"/_next/static/chunks/0gwy6u53e_4ul.js\",\"/_next/static/chunks/2izbovk1ixytg.js\",\"/_next/static/chunks/1giwad-u52ub-.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"IconMark\"]\n12:null\n17:[[\"$\",\"title\",\"0\",{\"children\":\"Loom\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Self-hosted AI portal · OpenAI-compatible · MCP · Playground · Logs\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.svg?icon.3ehpc5vjf2gkq.svg\",\"sizes\":\"any\",\"type\":\"image/svg+xml\"}],[\"$\",\"$L18\",\"3\",{}]]\n"])</script></body></html>
5
+ :root[data-theme="aurora"].dark{--background:oklch(0.17 0.04 280);--foreground:oklch(0.95 0.015 280);--card:oklch(0.22 0.05 280);--card-foreground:oklch(0.95 0.015 280);--popover:oklch(0.22 0.05 280);--popover-foreground:oklch(0.95 0.015 280);--primary:oklch(0.72 0.20 290);--primary-foreground:oklch(0.17 0.04 280);--secondary:oklch(0.28 0.06 280);--secondary-foreground:oklch(0.95 0.015 280);--muted:oklch(0.28 0.06 280);--muted-foreground:oklch(0.72 0.04 285);--accent:oklch(0.70 0.16 195);--accent-foreground:oklch(0.17 0.04 280);--border:oklch(0.72 0.20 290 / 18%);--input:oklch(0.72 0.20 290 / 14%);--ring:oklch(0.72 0.20 290 / 60%);--radius:0.875rem;}</style><script>(function(){try{var raw=localStorage.getItem("loom-theme");if(!raw)return;var t=JSON.parse(raw);if(t&&typeof t.id==="string")document.documentElement.dataset.theme=t.id;var s=t&&t.scheme;if(s==="system")s=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light";if(s==="dark")document.documentElement.classList.add("dark");else if(s==="light")document.documentElement.classList.remove("dark");}catch(e){}})();</script><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body class="geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased"><div hidden=""><!--$--><!--/$--></div><script>((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}})("class","theme","system",null,["light","dark"],null,true,true)</script><!--$!--><template data-dgst="BAILOUT_TO_CLIENT_SIDE_RENDERING"></template><!--/$--><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section><script src="/_next/static/chunks/1jexzsn2qdw84.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n9:I[168027,[\"/_next/static/chunks/0gwy6u53e_4ul.js\",\"/_next/static/chunks/2izbovk1ixytg.js\",\"/_next/static/chunks/1giwad-u52ub-.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/233p45nuh4m5b.css\",\"style\"]\n:HL[\"/_next/static/chunks/0cbg1vmtl84ae.css\",\"style\"]\n2:Tcac,"])</script><script>self.__next_f.push([1,":root[data-theme=\"paper\"]{--background:oklch(0.97 0.02 80);--foreground:oklch(0.20 0.02 60);--card:oklch(0.99 0.015 80);--card-foreground:oklch(0.20 0.02 60);--popover:oklch(0.99 0.015 80);--popover-foreground:oklch(0.20 0.02 60);--primary:oklch(0.45 0.10 40);--primary-foreground:oklch(0.97 0.02 80);--secondary:oklch(0.92 0.02 75);--secondary-foreground:oklch(0.25 0.03 50);--muted:oklch(0.93 0.015 75);--muted-foreground:oklch(0.48 0.02 50);--accent:oklch(0.91 0.04 70);--accent-foreground:oklch(0.25 0.05 50);--border:oklch(0.85 0.02 70);--input:oklch(0.88 0.02 70);--ring:oklch(0.55 0.08 40);--radius:0.875rem;}\n:root[data-theme=\"paper\"].dark{--background:oklch(0.18 0.015 60);--foreground:oklch(0.94 0.02 80);--card:oklch(0.23 0.018 60);--card-foreground:oklch(0.94 0.02 80);--popover:oklch(0.23 0.018 60);--popover-foreground:oklch(0.94 0.02 80);--primary:oklch(0.78 0.10 40);--primary-foreground:oklch(0.18 0.015 60);--secondary:oklch(0.27 0.02 55);--secondary-foreground:oklch(0.94 0.02 80);--muted:oklch(0.27 0.02 55);--muted-foreground:oklch(0.70 0.02 75);--accent:oklch(0.30 0.05 60);--accent-foreground:oklch(0.94 0.02 80);--border:oklch(1 0 0 / 12%);--input:oklch(1 0 0 / 15%);--ring:oklch(0.65 0.08 40);--radius:0.875rem;}\n:root[data-theme=\"terminal\"].dark{--background:oklch(0.13 0.015 145);--foreground:oklch(0.92 0.18 145);--card:oklch(0.16 0.02 145);--card-foreground:oklch(0.92 0.18 145);--popover:oklch(0.16 0.02 145);--popover-foreground:oklch(0.92 0.18 145);--primary:oklch(0.85 0.20 145);--primary-foreground:oklch(0.13 0.015 145);--secondary:oklch(0.22 0.04 145);--secondary-foreground:oklch(0.92 0.18 145);--muted:oklch(0.22 0.04 145);--muted-foreground:oklch(0.65 0.12 145);--accent:oklch(0.25 0.06 145);--accent-foreground:oklch(0.92 0.18 145);--destructive:oklch(0.72 0.22 28);--border:oklch(0.85 0.18 145 / 18%);--input:oklch(0.85 0.18 145 / 14%);--ring:oklch(0.85 0.18 145 / 50%);--radius:0.25rem;--font-sans:var(--font-geist-mono);}\n:root[data-theme=\"aurora\"]{--background:oklch(0.985 0.005 280);--foreground:oklch(0.20 0.05 290);--card:oklch(1 0 0);--card-foreground:oklch(0.20 0.05 290);--popover:oklch(1 0 0);--popover-foreground:oklch(0.20 0.05 290);--primary:oklch(0.55 0.22 290);--primary-foreground:oklch(0.985 0.005 280);--secondary:oklch(0.95 0.02 285);--secondary-foreground:oklch(0.25 0.06 290);--muted:oklch(0.95 0.015 285);--muted-foreground:oklch(0.50 0.04 290);--accent:oklch(0.85 0.10 190);--accent-foreground:oklch(0.20 0.05 290);--border:oklch(0.88 0.02 285);--input:oklch(0.90 0.02 285);--ring:oklch(0.55 0.22 290);--radius:0.875rem;}\n:root[data-theme=\"aurora\"].dark{--background:oklch(0.17 0.04 280);--foreground:oklch(0.95 0.015 280);--card:oklch(0.22 0.05 280);--card-foreground:oklch(0.95 0.015 280);--popover:oklch(0.22 0.05 280);--popover-foreground:oklch(0.95 0.015 280);--primary:oklch(0.72 0.20 290);--primary-foreground:oklch(0.17 0.04 280);--secondary:oklch(0.28 0.06 280);--secondary-foreground:oklch(0.95 0.015 280);--muted:oklch(0.28 0.06 280);--muted-foreground:oklch(0.72 0.04 285);--accent:oklch(0.70 0.16 195);--accent-foreground:oklch(0.17 0.04 280);--border:oklch(0.72 0.20 290 / 18%);--input:oklch(0.72 0.20 290 / 14%);--ring:oklch(0.72 0.20 290 / 60%);--radius:0.875rem;}"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/233p45nuh4m5b.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0cbg1vmtl84ae.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0gwy6u53e_4ul.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/2izbovk1ixytg.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/1giwad-u52ub-.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-3\",{\"src\":\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"style\",null,{\"id\":\"loom-theme-tokens\",\"dangerouslySetInnerHTML\":{\"__html\":\"$2\"}}],\"$L3\"]}],\"$L4\"]}]]}],{\"children\":[\"$L5\",{\"children\":[\"$L6\",{},null,false,null]},null,false,\"$@7\"]},null,false,null],\"$L8\",false]],\"m\":\"$undefined\",\"G\":[\"$9\",[\"$La\",\"$Lb\"]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"wCZkC7ZaYrxG37d-e2tac\"}\n"])</script><script>self.__next_f.push([1,"c:I[26229,[\"/_next/static/chunks/0gwy6u53e_4ul.js\",\"/_next/static/chunks/2izbovk1ixytg.js\",\"/_next/static/chunks/1giwad-u52ub-.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"AppProviders\"]\nd:I[339756,[\"/_next/static/chunks/0gwy6u53e_4ul.js\",\"/_next/static/chunks/2izbovk1ixytg.js\",\"/_next/static/chunks/1giwad-u52ub-.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"default\"]\ne:I[837457,[\"/_next/static/chunks/0gwy6u53e_4ul.js\",\"/_next/static/chunks/2izbovk1ixytg.js\",\"/_next/static/chunks/1giwad-u52ub-.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"default\"]\nf:I[522016,[\"/_next/static/chunks/0gwy6u53e_4ul.js\",\"/_next/static/chunks/2izbovk1ixytg.js\",\"/_next/static/chunks/1giwad-u52ub-.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/0k4-ojig21nwu.js\"],\"\"]\n10:I[897367,[\"/_next/static/chunks/0gwy6u53e_4ul.js\",\"/_next/static/chunks/2izbovk1ixytg.js\",\"/_next/static/chunks/1giwad-u52ub-.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"OutletBoundary\"]\n11:\"$Sreact.suspense\"\n14:I[897367,[\"/_next/static/chunks/0gwy6u53e_4ul.js\",\"/_next/static/chunks/2izbovk1ixytg.js\",\"/_next/static/chunks/1giwad-u52ub-.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"ViewportBoundary\"]\n16:I[897367,[\"/_next/static/chunks/0gwy6u53e_4ul.js\",\"/_next/static/chunks/2izbovk1ixytg.js\",\"/_next/static/chunks/1giwad-u52ub-.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"MetadataBoundary\"]\n3:[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var raw=localStorage.getItem(\\\"loom-theme\\\");if(!raw)return;var t=JSON.parse(raw);if(t\u0026\u0026typeof t.id===\\\"string\\\")document.documentElement.dataset.theme=t.id;var s=t\u0026\u0026t.scheme;if(s===\\\"system\\\")s=window.matchMedia\u0026\u0026window.matchMedia(\\\"(prefers-color-scheme: dark)\\\").matches?\\\"dark\\\":\\\"light\\\";if(s===\\\"dark\\\")document.documentElement.classList.add(\\\"dark\\\");else if(s===\\\"light\\\")document.documentElement.classList.remove(\\\"dark\\\");}catch(e){}})();\"}}]\n"])</script><script>self.__next_f.push([1,"4:[\"$\",\"body\",null,{\"className\":\"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased\",\"children\":[\"$\",\"$Lc\",null,{\"children\":[\"$\",\"$Ld\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$Le\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"div\",null,{\"className\":\"flex h-screen w-full items-center justify-center p-6 bg-background\",\"children\":[\"$\",\"div\",null,{\"className\":\"max-w-md w-full space-y-4 text-center\",\"children\":[[\"$\",\"h1\",null,{\"className\":\"text-6xl font-semibold text-muted-foreground/40\",\"children\":\"404\"}],[\"$\",\"h2\",null,{\"className\":\"text-lg font-semibold text-foreground\",\"children\":\"Page not found\"}],[\"$\",\"p\",null,{\"className\":\"text-sm text-muted-foreground\",\"children\":\"The page you're looking for doesn't exist or has been moved.\"}],[\"$\",\"div\",null,{\"className\":\"pt-2\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/\",\"children\":\"Back to dashboard\",\"data-slot\":\"button\",\"data-variant\":\"default\",\"data-size\":\"default\",\"className\":\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [\u0026_svg]:pointer-events-none [\u0026_svg:not([class*='size-'])]:size-4 shrink-0 [\u0026_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive bg-primary text-primary-foreground hover:bg-primary/90 h-9 px-4 py-2 has-[\u003esvg]:px-3\",\"ref\":null}]}]]}]}],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]\n"])</script><script>self.__next_f.push([1,"5:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$Ld\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$Le\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\n"])</script><script>self.__next_f.push([1,"6:[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"div\",null,{\"className\":\"flex h-screen w-full items-center justify-center p-6 bg-background\",\"children\":[\"$\",\"div\",null,{\"className\":\"max-w-md w-full space-y-4 text-center\",\"children\":[[\"$\",\"h1\",null,{\"className\":\"text-6xl font-semibold text-muted-foreground/40\",\"children\":\"404\"}],[\"$\",\"h2\",null,{\"className\":\"text-lg font-semibold text-foreground\",\"children\":\"Page not found\"}],[\"$\",\"p\",null,{\"className\":\"text-sm text-muted-foreground\",\"children\":\"The page you're looking for doesn't exist or has been moved.\"}],[\"$\",\"div\",null,{\"className\":\"pt-2\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/\",\"children\":\"Back to dashboard\",\"data-slot\":\"button\",\"data-variant\":\"default\",\"data-size\":\"default\",\"className\":\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [\u0026_svg]:pointer-events-none [\u0026_svg:not([class*='size-'])]:size-4 shrink-0 [\u0026_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive bg-primary text-primary-foreground hover:bg-primary/90 h-9 px-4 py-2 has-[\u003esvg]:px-3\",\"ref\":null}]}]]}]}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0k4-ojig21nwu.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L10\",null,{\"children\":[\"$\",\"$11\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@12\"}]}]]}]\n"])</script><script>self.__next_f.push([1,"13:[]\n7:\"$W13\"\n8:[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L14\",null,{\"children\":\"$L15\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L16\",null,{\"children\":[\"$\",\"$11\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L17\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}]\na:[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/233p45nuh4m5b.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]\nb:[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0cbg1vmtl84ae.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]\n"])</script><script>self.__next_f.push([1,"15:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"18:I[27201,[\"/_next/static/chunks/0gwy6u53e_4ul.js\",\"/_next/static/chunks/2izbovk1ixytg.js\",\"/_next/static/chunks/1giwad-u52ub-.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"IconMark\"]\n12:null\n17:[[\"$\",\"title\",\"0\",{\"children\":\"Loom\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Self-hosted AI portal · OpenAI-compatible · MCP · Playground · Logs\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.svg?icon.3ehpc5vjf2gkq.svg\",\"sizes\":\"any\",\"type\":\"image/svg+xml\"}],[\"$\",\"$L18\",\"3\",{}]]\n"])</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><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/1jexzsn2qdw84.js"/><script src="/_next/static/chunks/2-n3y00tm0437.js" async=""></script><script src="/_next/static/chunks/3zgk7uytcvwnj.js" async=""></script><script src="/_next/static/chunks/11_hrwa6kernl.js" async=""></script><script src="/_next/static/chunks/0g8ku62w0yb2s.js" async=""></script><script src="/_next/static/chunks/turbopack-09oh1_wbex94r.js" async=""></script><script src="/_next/static/chunks/2yl1jv4w6po1z.js" async=""></script><script src="/_next/static/chunks/1ntn7efqc-iiw.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/0cz1d0mv5g_q7.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;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/1jexzsn2qdw84.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[339756,[\"/_next/static/chunks/2yl1jv4w6po1z.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"default\"]\n3:I[837457,[\"/_next/static/chunks/2yl1jv4w6po1z.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"default\"]\n4:I[897367,[\"/_next/static/chunks/2yl1jv4w6po1z.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[897367,[\"/_next/static/chunks/2yl1jv4w6po1z.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"ViewportBoundary\"]\na:I[897367,[\"/_next/static/chunks/2yl1jv4w6po1z.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"MetadataBoundary\"]\nc:I[168027,[\"/_next/static/chunks/2yl1jv4w6po1z.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"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: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"S-TxD5uw__EHY12mebgvS\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\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,"6:null\nb:[]\n"])</script></body></html>
1
+ <!DOCTYPE html><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/1jexzsn2qdw84.js"/><script src="/_next/static/chunks/2-n3y00tm0437.js" async=""></script><script src="/_next/static/chunks/3zgk7uytcvwnj.js" async=""></script><script src="/_next/static/chunks/11_hrwa6kernl.js" async=""></script><script src="/_next/static/chunks/0g8ku62w0yb2s.js" async=""></script><script src="/_next/static/chunks/turbopack-09oh1_wbex94r.js" async=""></script><script src="/_next/static/chunks/2yl1jv4w6po1z.js" async=""></script><script src="/_next/static/chunks/1ntn7efqc-iiw.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/0cz1d0mv5g_q7.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;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/1jexzsn2qdw84.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[339756,[\"/_next/static/chunks/2yl1jv4w6po1z.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"default\"]\n3:I[837457,[\"/_next/static/chunks/2yl1jv4w6po1z.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"default\"]\n4:I[897367,[\"/_next/static/chunks/2yl1jv4w6po1z.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[897367,[\"/_next/static/chunks/2yl1jv4w6po1z.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"ViewportBoundary\"]\na:I[897367,[\"/_next/static/chunks/2yl1jv4w6po1z.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"MetadataBoundary\"]\nc:I[168027,[\"/_next/static/chunks/2yl1jv4w6po1z.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\"],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"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: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"wCZkC7ZaYrxG37d-e2tac\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\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,"6:null\nb:[]\n"])</script></body></html>
@@ -1 +1 @@
1
- self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"0wklBEQJ2+IQckxJxZFMeXP/JU5SITdIfE6nFMre9CQ=\"\n}"
1
+ self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"W3u4/V222joP07ra1PtEZRE8BIa06TNAxGmuinmXHlY=\"\n}"
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "node": {},
3
3
  "edge": {},
4
- "encryptionKey": "0wklBEQJ2+IQckxJxZFMeXP/JU5SITdIfE6nFMre9CQ="
4
+ "encryptionKey": "W3u4/V222joP07ra1PtEZRE8BIa06TNAxGmuinmXHlY="
5
5
  }