@whxway/loom 1.1.0 → 1.2.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 (347) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/cache/.tsbuildinfo +1 -1
  4. package/.next/diagnostics/route-bundle-stats.json +35 -35
  5. package/.next/fallback-build-manifest.json +3 -3
  6. package/.next/server/app/(auth)/login/page_client-reference-manifest.js +1 -1
  7. package/.next/server/app/(dashboard)/logs/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/(dashboard)/mcp/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/(dashboard)/mcp/presets/page_client-reference-manifest.js +1 -1
  10. package/.next/server/app/(dashboard)/models/[name]/page_client-reference-manifest.js +1 -1
  11. package/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  12. package/.next/server/app/(dashboard)/playground/audio/speech/page_client-reference-manifest.js +1 -1
  13. package/.next/server/app/(dashboard)/playground/audio/transcription/page_client-reference-manifest.js +1 -1
  14. package/.next/server/app/(dashboard)/playground/chat/page_client-reference-manifest.js +1 -1
  15. package/.next/server/app/(dashboard)/playground/embedding/page_client-reference-manifest.js +1 -1
  16. package/.next/server/app/(dashboard)/playground/image/page_client-reference-manifest.js +1 -1
  17. package/.next/server/app/(dashboard)/playground/page_client-reference-manifest.js +1 -1
  18. package/.next/server/app/(dashboard)/playground/video/page_client-reference-manifest.js +1 -1
  19. package/.next/server/app/(dashboard)/providers/[name]/page_client-reference-manifest.js +1 -1
  20. package/.next/server/app/(dashboard)/providers/page_client-reference-manifest.js +1 -1
  21. package/.next/server/app/(dashboard)/settings/api-keys/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
  23. package/.next/server/app/(dashboard)/settings/users/page_client-reference-manifest.js +1 -1
  24. package/.next/server/app/_global-error.html +1 -1
  25. package/.next/server/app/_global-error.rsc +1 -1
  26. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  27. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  28. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  29. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  30. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  31. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  32. package/.next/server/app/_not-found.html +2 -2
  33. package/.next/server/app/_not-found.rsc +3 -3
  34. package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  35. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  36. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  37. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  38. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  39. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  40. package/.next/server/app/api/adapters/route.js.nft.json +1 -1
  41. package/.next/server/app/api/apikeys/[id]/route.js.nft.json +1 -1
  42. package/.next/server/app/api/apikeys/route.js.nft.json +1 -1
  43. package/.next/server/app/api/capabilities/route.js.nft.json +1 -1
  44. package/.next/server/app/api/conversations/[id]/messages/route.js.nft.json +1 -1
  45. package/.next/server/app/api/conversations/[id]/route.js.nft.json +1 -1
  46. package/.next/server/app/api/conversations/route.js.nft.json +1 -1
  47. package/.next/server/app/api/health/route.js.nft.json +1 -1
  48. package/.next/server/app/api/login/route.js.nft.json +1 -1
  49. package/.next/server/app/api/logout/route.js.nft.json +1 -1
  50. package/.next/server/app/api/logs/generations/[id]/images/[idx]/route.js.nft.json +1 -1
  51. package/.next/server/app/api/logs/generations/[id]/route.js.nft.json +1 -1
  52. package/.next/server/app/api/logs/generations/route.js.nft.json +1 -1
  53. package/.next/server/app/api/mcp/presets/route.js.nft.json +1 -1
  54. package/.next/server/app/api/mcp/servers/[id]/check/route.js +1 -1
  55. package/.next/server/app/api/mcp/servers/[id]/check/route.js.nft.json +1 -1
  56. package/.next/server/app/api/mcp/servers/[id]/route.js.nft.json +1 -1
  57. package/.next/server/app/api/mcp/servers/[id]/tools/route.js.nft.json +1 -1
  58. package/.next/server/app/api/mcp/servers/route.js.nft.json +1 -1
  59. package/.next/server/app/api/messages/[id]/rate/route.js.nft.json +1 -1
  60. package/.next/server/app/api/models/[id]/route.js.nft.json +1 -1
  61. package/.next/server/app/api/models/route.js.nft.json +1 -1
  62. package/.next/server/app/api/ping/route.js.nft.json +1 -1
  63. package/.next/server/app/api/playground/chat/route.js +4 -4
  64. package/.next/server/app/api/playground/chat/route.js.nft.json +1 -1
  65. package/.next/server/app/api/playground/embedding/route.js +4 -4
  66. package/.next/server/app/api/playground/embedding/route.js.nft.json +1 -1
  67. package/.next/server/app/api/providers/[id]/check/route.js.nft.json +1 -1
  68. package/.next/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  69. package/.next/server/app/api/providers/[id]/route.js.nft.json +1 -1
  70. package/.next/server/app/api/providers/probe/route.js.nft.json +1 -1
  71. package/.next/server/app/api/providers/reload/route.js.nft.json +1 -1
  72. package/.next/server/app/api/providers/route.js.nft.json +1 -1
  73. package/.next/server/app/api/stats/models/[name]/route.js.nft.json +1 -1
  74. package/.next/server/app/api/stats/route.js.nft.json +1 -1
  75. package/.next/server/app/api/tools/[id]/route.js.nft.json +1 -1
  76. package/.next/server/app/api/tools/route.js.nft.json +1 -1
  77. package/.next/server/app/api/users/[username]/route.js.nft.json +1 -1
  78. package/.next/server/app/api/users/me/preferences/route.js +1 -1
  79. package/.next/server/app/api/users/me/preferences/route.js.nft.json +1 -1
  80. package/.next/server/app/api/users/me/route.js.nft.json +1 -1
  81. package/.next/server/app/api/users/route.js.nft.json +1 -1
  82. package/.next/server/app/api/v1/audio/speech/route.js +1 -1
  83. package/.next/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  84. package/.next/server/app/api/v1/audio/transcriptions/route.js +4 -4
  85. package/.next/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
  86. package/.next/server/app/api/v1/chat/completions/route.js +1 -1
  87. package/.next/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  88. package/.next/server/app/api/v1/embeddings/route.js +1 -1
  89. package/.next/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  90. package/.next/server/app/api/v1/images/generations/route.js +1 -1
  91. package/.next/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  92. package/.next/server/app/api/v1/models/route.js.nft.json +1 -1
  93. package/.next/server/app/api/v1/rerank/route.js +1 -1
  94. package/.next/server/app/api/v1/rerank/route.js.nft.json +1 -1
  95. package/.next/server/app/api/v1/videos/[id]/content/route.js +4 -4
  96. package/.next/server/app/api/v1/videos/[id]/content/route.js.nft.json +1 -1
  97. package/.next/server/app/api/v1/videos/[id]/route.js +4 -4
  98. package/.next/server/app/api/v1/videos/[id]/route.js.nft.json +1 -1
  99. package/.next/server/app/api/v1/videos/route.js +1 -1
  100. package/.next/server/app/api/v1/videos/route.js.nft.json +1 -1
  101. package/.next/server/app/api/variants/route.js.nft.json +1 -1
  102. package/.next/server/app/index.html +2 -2
  103. package/.next/server/app/index.rsc +7 -7
  104. package/.next/server/app/index.segments/!KGRhc2hib2FyZCk/__PAGE__.segment.rsc +2 -2
  105. package/.next/server/app/index.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  106. package/.next/server/app/index.segments/_full.segment.rsc +7 -7
  107. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  108. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  109. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  110. package/.next/server/app/login.html +2 -2
  111. package/.next/server/app/login.rsc +3 -3
  112. package/.next/server/app/login.segments/!KGF1dGgp/login/__PAGE__.segment.rsc +1 -1
  113. package/.next/server/app/login.segments/!KGF1dGgp/login.segment.rsc +1 -1
  114. package/.next/server/app/login.segments/!KGF1dGgp.segment.rsc +1 -1
  115. package/.next/server/app/login.segments/_full.segment.rsc +3 -3
  116. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  117. package/.next/server/app/login.segments/_index.segment.rsc +2 -2
  118. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  119. package/.next/server/app/logs.html +2 -2
  120. package/.next/server/app/logs.rsc +7 -7
  121. package/.next/server/app/logs.segments/!KGRhc2hib2FyZCk/logs/__PAGE__.segment.rsc +2 -2
  122. package/.next/server/app/logs.segments/!KGRhc2hib2FyZCk/logs.segment.rsc +1 -1
  123. package/.next/server/app/logs.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  124. package/.next/server/app/logs.segments/_full.segment.rsc +7 -7
  125. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  126. package/.next/server/app/logs.segments/_index.segment.rsc +2 -2
  127. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  128. package/.next/server/app/mcp/presets.html +2 -2
  129. package/.next/server/app/mcp/presets.rsc +7 -7
  130. package/.next/server/app/mcp/presets.segments/!KGRhc2hib2FyZCk/mcp/presets/__PAGE__.segment.rsc +2 -2
  131. package/.next/server/app/mcp/presets.segments/!KGRhc2hib2FyZCk/mcp/presets.segment.rsc +1 -1
  132. package/.next/server/app/mcp/presets.segments/!KGRhc2hib2FyZCk/mcp.segment.rsc +1 -1
  133. package/.next/server/app/mcp/presets.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  134. package/.next/server/app/mcp/presets.segments/_full.segment.rsc +7 -7
  135. package/.next/server/app/mcp/presets.segments/_head.segment.rsc +1 -1
  136. package/.next/server/app/mcp/presets.segments/_index.segment.rsc +2 -2
  137. package/.next/server/app/mcp/presets.segments/_tree.segment.rsc +2 -2
  138. package/.next/server/app/mcp.html +2 -2
  139. package/.next/server/app/mcp.rsc +7 -7
  140. package/.next/server/app/mcp.segments/!KGRhc2hib2FyZCk/mcp/__PAGE__.segment.rsc +2 -2
  141. package/.next/server/app/mcp.segments/!KGRhc2hib2FyZCk/mcp.segment.rsc +1 -1
  142. package/.next/server/app/mcp.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  143. package/.next/server/app/mcp.segments/_full.segment.rsc +7 -7
  144. package/.next/server/app/mcp.segments/_head.segment.rsc +1 -1
  145. package/.next/server/app/mcp.segments/_index.segment.rsc +2 -2
  146. package/.next/server/app/mcp.segments/_tree.segment.rsc +2 -2
  147. package/.next/server/app/playground/audio/speech.html +2 -2
  148. package/.next/server/app/playground/audio/speech.rsc +8 -8
  149. package/.next/server/app/playground/audio/speech.segments/!KGRhc2hib2FyZCk/playground/audio/speech/__PAGE__.segment.rsc +2 -2
  150. package/.next/server/app/playground/audio/speech.segments/!KGRhc2hib2FyZCk/playground/audio/speech.segment.rsc +1 -1
  151. package/.next/server/app/playground/audio/speech.segments/!KGRhc2hib2FyZCk/playground/audio.segment.rsc +1 -1
  152. package/.next/server/app/playground/audio/speech.segments/!KGRhc2hib2FyZCk/playground.segment.rsc +2 -2
  153. package/.next/server/app/playground/audio/speech.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  154. package/.next/server/app/playground/audio/speech.segments/_full.segment.rsc +8 -8
  155. package/.next/server/app/playground/audio/speech.segments/_head.segment.rsc +1 -1
  156. package/.next/server/app/playground/audio/speech.segments/_index.segment.rsc +2 -2
  157. package/.next/server/app/playground/audio/speech.segments/_tree.segment.rsc +2 -2
  158. package/.next/server/app/playground/audio/transcription.html +2 -2
  159. package/.next/server/app/playground/audio/transcription.rsc +8 -8
  160. package/.next/server/app/playground/audio/transcription.segments/!KGRhc2hib2FyZCk/playground/audio/transcription/__PAGE__.segment.rsc +2 -2
  161. package/.next/server/app/playground/audio/transcription.segments/!KGRhc2hib2FyZCk/playground/audio/transcription.segment.rsc +1 -1
  162. package/.next/server/app/playground/audio/transcription.segments/!KGRhc2hib2FyZCk/playground/audio.segment.rsc +1 -1
  163. package/.next/server/app/playground/audio/transcription.segments/!KGRhc2hib2FyZCk/playground.segment.rsc +2 -2
  164. package/.next/server/app/playground/audio/transcription.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  165. package/.next/server/app/playground/audio/transcription.segments/_full.segment.rsc +8 -8
  166. package/.next/server/app/playground/audio/transcription.segments/_head.segment.rsc +1 -1
  167. package/.next/server/app/playground/audio/transcription.segments/_index.segment.rsc +2 -2
  168. package/.next/server/app/playground/audio/transcription.segments/_tree.segment.rsc +2 -2
  169. package/.next/server/app/playground/chat.html +2 -2
  170. package/.next/server/app/playground/chat.rsc +8 -8
  171. package/.next/server/app/playground/chat.segments/!KGRhc2hib2FyZCk/playground/chat/__PAGE__.segment.rsc +2 -2
  172. package/.next/server/app/playground/chat.segments/!KGRhc2hib2FyZCk/playground/chat.segment.rsc +1 -1
  173. package/.next/server/app/playground/chat.segments/!KGRhc2hib2FyZCk/playground.segment.rsc +2 -2
  174. package/.next/server/app/playground/chat.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  175. package/.next/server/app/playground/chat.segments/_full.segment.rsc +8 -8
  176. package/.next/server/app/playground/chat.segments/_head.segment.rsc +1 -1
  177. package/.next/server/app/playground/chat.segments/_index.segment.rsc +2 -2
  178. package/.next/server/app/playground/chat.segments/_tree.segment.rsc +2 -2
  179. package/.next/server/app/playground/embedding.html +2 -2
  180. package/.next/server/app/playground/embedding.rsc +8 -8
  181. package/.next/server/app/playground/embedding.segments/!KGRhc2hib2FyZCk/playground/embedding/__PAGE__.segment.rsc +2 -2
  182. package/.next/server/app/playground/embedding.segments/!KGRhc2hib2FyZCk/playground/embedding.segment.rsc +1 -1
  183. package/.next/server/app/playground/embedding.segments/!KGRhc2hib2FyZCk/playground.segment.rsc +2 -2
  184. package/.next/server/app/playground/embedding.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  185. package/.next/server/app/playground/embedding.segments/_full.segment.rsc +8 -8
  186. package/.next/server/app/playground/embedding.segments/_head.segment.rsc +1 -1
  187. package/.next/server/app/playground/embedding.segments/_index.segment.rsc +2 -2
  188. package/.next/server/app/playground/embedding.segments/_tree.segment.rsc +2 -2
  189. package/.next/server/app/playground/image.html +2 -2
  190. package/.next/server/app/playground/image.rsc +8 -8
  191. package/.next/server/app/playground/image.segments/!KGRhc2hib2FyZCk/playground/image/__PAGE__.segment.rsc +2 -2
  192. package/.next/server/app/playground/image.segments/!KGRhc2hib2FyZCk/playground/image.segment.rsc +1 -1
  193. package/.next/server/app/playground/image.segments/!KGRhc2hib2FyZCk/playground.segment.rsc +2 -2
  194. package/.next/server/app/playground/image.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  195. package/.next/server/app/playground/image.segments/_full.segment.rsc +8 -8
  196. package/.next/server/app/playground/image.segments/_head.segment.rsc +1 -1
  197. package/.next/server/app/playground/image.segments/_index.segment.rsc +2 -2
  198. package/.next/server/app/playground/image.segments/_tree.segment.rsc +2 -2
  199. package/.next/server/app/playground/video.html +2 -2
  200. package/.next/server/app/playground/video.rsc +8 -8
  201. package/.next/server/app/playground/video.segments/!KGRhc2hib2FyZCk/playground/video/__PAGE__.segment.rsc +2 -2
  202. package/.next/server/app/playground/video.segments/!KGRhc2hib2FyZCk/playground/video.segment.rsc +1 -1
  203. package/.next/server/app/playground/video.segments/!KGRhc2hib2FyZCk/playground.segment.rsc +2 -2
  204. package/.next/server/app/playground/video.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  205. package/.next/server/app/playground/video.segments/_full.segment.rsc +8 -8
  206. package/.next/server/app/playground/video.segments/_head.segment.rsc +1 -1
  207. package/.next/server/app/playground/video.segments/_index.segment.rsc +2 -2
  208. package/.next/server/app/playground/video.segments/_tree.segment.rsc +2 -2
  209. package/.next/server/app/playground.html +2 -2
  210. package/.next/server/app/playground.rsc +8 -8
  211. package/.next/server/app/playground.segments/!KGRhc2hib2FyZCk/playground/__PAGE__.segment.rsc +2 -2
  212. package/.next/server/app/playground.segments/!KGRhc2hib2FyZCk/playground.segment.rsc +2 -2
  213. package/.next/server/app/playground.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  214. package/.next/server/app/playground.segments/_full.segment.rsc +8 -8
  215. package/.next/server/app/playground.segments/_head.segment.rsc +1 -1
  216. package/.next/server/app/playground.segments/_index.segment.rsc +2 -2
  217. package/.next/server/app/playground.segments/_tree.segment.rsc +2 -2
  218. package/.next/server/app/providers.html +2 -2
  219. package/.next/server/app/providers.rsc +7 -7
  220. package/.next/server/app/providers.segments/!KGRhc2hib2FyZCk/providers/__PAGE__.segment.rsc +2 -2
  221. package/.next/server/app/providers.segments/!KGRhc2hib2FyZCk/providers.segment.rsc +1 -1
  222. package/.next/server/app/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  223. package/.next/server/app/providers.segments/_full.segment.rsc +7 -7
  224. package/.next/server/app/providers.segments/_head.segment.rsc +1 -1
  225. package/.next/server/app/providers.segments/_index.segment.rsc +2 -2
  226. package/.next/server/app/providers.segments/_tree.segment.rsc +2 -2
  227. package/.next/server/app/settings/api-keys.html +2 -2
  228. package/.next/server/app/settings/api-keys.rsc +7 -7
  229. package/.next/server/app/settings/api-keys.segments/!KGRhc2hib2FyZCk/settings/api-keys/__PAGE__.segment.rsc +2 -2
  230. package/.next/server/app/settings/api-keys.segments/!KGRhc2hib2FyZCk/settings/api-keys.segment.rsc +1 -1
  231. package/.next/server/app/settings/api-keys.segments/!KGRhc2hib2FyZCk/settings.segment.rsc +1 -1
  232. package/.next/server/app/settings/api-keys.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  233. package/.next/server/app/settings/api-keys.segments/_full.segment.rsc +7 -7
  234. package/.next/server/app/settings/api-keys.segments/_head.segment.rsc +1 -1
  235. package/.next/server/app/settings/api-keys.segments/_index.segment.rsc +2 -2
  236. package/.next/server/app/settings/api-keys.segments/_tree.segment.rsc +2 -2
  237. package/.next/server/app/settings/users.html +2 -2
  238. package/.next/server/app/settings/users.rsc +7 -7
  239. package/.next/server/app/settings/users.segments/!KGRhc2hib2FyZCk/settings/users/__PAGE__.segment.rsc +2 -2
  240. package/.next/server/app/settings/users.segments/!KGRhc2hib2FyZCk/settings/users.segment.rsc +1 -1
  241. package/.next/server/app/settings/users.segments/!KGRhc2hib2FyZCk/settings.segment.rsc +1 -1
  242. package/.next/server/app/settings/users.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  243. package/.next/server/app/settings/users.segments/_full.segment.rsc +7 -7
  244. package/.next/server/app/settings/users.segments/_head.segment.rsc +1 -1
  245. package/.next/server/app/settings/users.segments/_index.segment.rsc +2 -2
  246. package/.next/server/app/settings/users.segments/_tree.segment.rsc +2 -2
  247. package/.next/server/app/settings.html +2 -2
  248. package/.next/server/app/settings.rsc +8 -8
  249. package/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings/__PAGE__.segment.rsc +2 -2
  250. package/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings.segment.rsc +1 -1
  251. package/.next/server/app/settings.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  252. package/.next/server/app/settings.segments/_full.segment.rsc +8 -8
  253. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  254. package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  255. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  256. package/.next/server/chunks/[root-of-the-server]__019oqc3._.js +3 -0
  257. package/.next/server/chunks/[root-of-the-server]__019oqc3._.js.map +1 -0
  258. package/.next/server/chunks/[root-of-the-server]__01ou67p._.js +1 -1
  259. package/.next/server/chunks/[root-of-the-server]__01ou67p._.js.map +1 -1
  260. package/.next/server/chunks/[root-of-the-server]__02sypva._.js +2 -2
  261. package/.next/server/chunks/[root-of-the-server]__02sypva._.js.map +1 -1
  262. package/.next/server/chunks/[root-of-the-server]__0myi8j1._.js +2 -2
  263. package/.next/server/chunks/[root-of-the-server]__0myi8j1._.js.map +1 -1
  264. package/.next/server/chunks/[root-of-the-server]__0wiw6hu._.js +3 -0
  265. package/.next/server/chunks/[root-of-the-server]__0wiw6hu._.js.map +1 -0
  266. package/.next/server/chunks/[root-of-the-server]__0xrm_9r._.js +3 -0
  267. package/.next/server/chunks/[root-of-the-server]__0xrm_9r._.js.map +1 -0
  268. package/.next/server/chunks/[root-of-the-server]__11t79he._.js +1 -1
  269. package/.next/server/chunks/[root-of-the-server]__11t79he._.js.map +1 -1
  270. package/.next/server/chunks/[root-of-the-server]__1fs5lo-._.js +1 -1
  271. package/.next/server/chunks/[root-of-the-server]__1fs5lo-._.js.map +1 -1
  272. package/.next/server/chunks/[root-of-the-server]__1qg3d87._.js +2 -2
  273. package/.next/server/chunks/[root-of-the-server]__1qg3d87._.js.map +1 -1
  274. package/.next/server/chunks/[root-of-the-server]__1zgou-a._.js +6 -0
  275. package/.next/server/chunks/[root-of-the-server]__1zgou-a._.js.map +1 -0
  276. package/.next/server/chunks/_00k5vl0._.js +3 -0
  277. package/.next/server/chunks/_00k5vl0._.js.map +1 -0
  278. package/.next/server/chunks/_06hthvw._.js +3 -0
  279. package/.next/server/chunks/_06hthvw._.js.map +1 -0
  280. package/.next/server/chunks/_0c6vpbw._.js +3 -0
  281. package/.next/server/chunks/_0c6vpbw._.js.map +1 -0
  282. package/.next/server/chunks/_0hawg18._.js +3 -0
  283. package/.next/server/chunks/_0hawg18._.js.map +1 -0
  284. package/.next/server/chunks/_0kr91st._.js +3 -0
  285. package/.next/server/chunks/_0kr91st._.js.map +1 -0
  286. package/.next/server/chunks/_1i4x7k4._.js +3 -0
  287. package/.next/server/chunks/_1i4x7k4._.js.map +1 -0
  288. package/.next/server/chunks/_1lk_ovb._.js +3 -0
  289. package/.next/server/chunks/_1lk_ovb._.js.map +1 -0
  290. package/.next/server/chunks/_1wk63w9._.js +3 -0
  291. package/.next/server/chunks/_1wk63w9._.js.map +1 -0
  292. package/.next/server/chunks/_1wl3z8e._.js +3 -0
  293. package/.next/server/chunks/_1wl3z8e._.js.map +1 -0
  294. package/.next/server/chunks/lib_server_11s_lvw._.js +1 -1
  295. package/.next/server/chunks/lib_server_11s_lvw._.js.map +1 -1
  296. package/.next/server/chunks/lib_server_gateway_index_ts_1nvei3v._.js +2 -2
  297. package/.next/server/chunks/lib_server_gateway_index_ts_1nvei3v._.js.map +1 -1
  298. package/.next/server/chunks/ssr/app_(dashboard)_settings_page_tsx_1hwv4x8._.js +2 -2
  299. package/.next/server/chunks/ssr/app_(dashboard)_settings_page_tsx_1hwv4x8._.js.map +1 -1
  300. package/.next/server/chunks/ssr/lib_schemas_preferences_ts_1fy1exu._.js +1 -1
  301. package/.next/server/chunks/ssr/lib_schemas_preferences_ts_1fy1exu._.js.map +1 -1
  302. package/.next/server/middleware-build-manifest.js +3 -3
  303. package/.next/server/pages/404.html +2 -2
  304. package/.next/server/pages/500.html +1 -1
  305. package/.next/static/chunks/{2zeeni2y2fh59.js → 1si1c1m377t3w.js} +1 -1
  306. package/.next/static/chunks/2yzdc8m536xea.css +1 -0
  307. package/.next/static/chunks/3oj24pftrz5zy.js +11 -0
  308. package/.next/trace +2 -2
  309. package/.next/trace-build +1 -1
  310. package/bin/loom.mjs +1 -1
  311. package/drizzle/0019_timeout_default_3600.sql +36 -0
  312. package/drizzle/meta/0019_snapshot.json +1309 -0
  313. package/drizzle/meta/_journal.json +7 -0
  314. package/package.json +1 -1
  315. package/.next/server/chunks/[root-of-the-server]__00b7x8i._.js +0 -3
  316. package/.next/server/chunks/[root-of-the-server]__00b7x8i._.js.map +0 -1
  317. package/.next/server/chunks/[root-of-the-server]__022u2d9._.js +0 -3
  318. package/.next/server/chunks/[root-of-the-server]__022u2d9._.js.map +0 -1
  319. package/.next/server/chunks/[root-of-the-server]__0g3mnim._.js +0 -6
  320. package/.next/server/chunks/[root-of-the-server]__0g3mnim._.js.map +0 -1
  321. package/.next/server/chunks/[root-of-the-server]__1gon00b._.js +0 -3
  322. package/.next/server/chunks/[root-of-the-server]__1gon00b._.js.map +0 -1
  323. package/.next/server/chunks/[root-of-the-server]__1xj9qqs._.js +0 -3
  324. package/.next/server/chunks/[root-of-the-server]__1xj9qqs._.js.map +0 -1
  325. package/.next/server/chunks/_028m5t0._.js +0 -3
  326. package/.next/server/chunks/_028m5t0._.js.map +0 -1
  327. package/.next/server/chunks/_0eq8a_c._.js +0 -3
  328. package/.next/server/chunks/_0eq8a_c._.js.map +0 -1
  329. package/.next/server/chunks/_0n06usu._.js +0 -3
  330. package/.next/server/chunks/_0n06usu._.js.map +0 -1
  331. package/.next/server/chunks/_0tcchv1._.js +0 -3
  332. package/.next/server/chunks/_0tcchv1._.js.map +0 -1
  333. package/.next/server/chunks/_14120rw._.js +0 -3
  334. package/.next/server/chunks/_14120rw._.js.map +0 -1
  335. package/.next/server/chunks/_1633jn_._.js +0 -3
  336. package/.next/server/chunks/_1633jn_._.js.map +0 -1
  337. package/.next/server/chunks/_19jpf08._.js +0 -3
  338. package/.next/server/chunks/_19jpf08._.js.map +0 -1
  339. package/.next/server/chunks/_1gi5m-_._.js +0 -3
  340. package/.next/server/chunks/_1gi5m-_._.js.map +0 -1
  341. package/.next/server/chunks/_1jgm_7u._.js +0 -3
  342. package/.next/server/chunks/_1jgm_7u._.js.map +0 -1
  343. package/.next/static/chunks/0cbg1vmtl84ae.css +0 -1
  344. package/.next/static/chunks/29p-wdja_cbgh.js +0 -11
  345. /package/.next/static/{wCZkC7ZaYrxG37d-e2tac → TZ8IS4-HWznFu8M4EwNGp}/_buildManifest.js +0 -0
  346. /package/.next/static/{wCZkC7ZaYrxG37d-e2tac → TZ8IS4-HWznFu8M4EwNGp}/_clientMiddlewareManifest.js +0 -0
  347. /package/.next/static/{wCZkC7ZaYrxG37d-e2tac → TZ8IS4-HWznFu8M4EwNGp}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../app/%28dashboard%29/settings/page.tsx","../../../../app/%28dashboard%29/settings/_sections/shared.tsx","../../../../app/%28dashboard%29/settings/_sections/appearance.tsx","../../../../app/%28dashboard%29/settings/_sections/behavior.tsx","../../../../app/%28dashboard%29/settings/_sections/chat.tsx","../../../../app/%28dashboard%29/settings/_sections/models.tsx","../../../../app/%28dashboard%29/settings/_sections/profile.tsx","../../../../components/tools/tool-form-dialog.tsx","../../../../components/tools/tools-table.tsx","../../../../app/%28dashboard%29/settings/_sections/tools.tsx","../../../../node_modules/lucide-react/src/icons/monitor.ts","../../../../node_modules/lucide-react/src/icons/sliders-vertical.ts","../../../../node_modules/lucide-react/src/icons/sun.ts","../../../../node_modules/lucide-react/src/icons/palette.ts","../../../../node_modules/lucide-react/src/icons/moon.ts"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Bot, MessageSquare, Palette, RotateCcw, Sliders, User, Wrench } from \"lucide-react\"\nimport { toast } from \"sonner\"\n\nimport { preferences } from \"@/lib/api/preferences\"\nimport { defaultUserPreferences } from \"@/lib/schemas/preferences\"\nimport { useDeviceSettingsStore } from \"@/lib/stores/device-settings-store\"\nimport { Button } from \"@/components/ui/button\"\nimport { cn } from \"@/lib/utils\"\n\nimport { AppearanceSection } from \"./_sections/appearance\"\nimport { BehaviorSection } from \"./_sections/behavior\"\nimport { ChatSection } from \"./_sections/chat\"\nimport { ModelsSection } from \"./_sections/models\"\nimport { ProfileSection } from \"./_sections/profile\"\nimport { ToolsSection } from \"./_sections/tools\"\n\ntype SectionId = \"profile\" | \"appearance\" | \"models\" | \"chat\" | \"behavior\" | \"tools\"\n\ninterface SectionDef {\n id: SectionId\n label: string\n icon: React.ElementType\n Component: React.ComponentType\n}\n\nconst SECTIONS: SectionDef[] = [\n { id: \"profile\", label: \"Profile\", icon: User, Component: ProfileSection },\n { id: \"appearance\", label: \"Appearance\", icon: Palette, Component: AppearanceSection },\n { id: \"models\", label: \"Models\", icon: Bot, Component: ModelsSection },\n { id: \"chat\", label: \"Chat\", icon: MessageSquare, Component: ChatSection },\n { id: \"behavior\", label: \"Behavior\", icon: Sliders, Component: BehaviorSection },\n { id: \"tools\", label: \"Tools\", icon: Wrench, Component: ToolsSection },\n]\n\nconst DEFAULT_SECTION: SectionId = \"appearance\"\n\nfunction parseHash(hash: string): SectionId {\n const id = hash.replace(/^#/, \"\") as SectionId\n return SECTIONS.some((s) => s.id === id) ? id : DEFAULT_SECTION\n}\n\nfunction useHashSection(): [SectionId, (next: SectionId) => void] {\n const [section, setSection] = React.useState<SectionId>(DEFAULT_SECTION)\n\n React.useEffect(() => {\n const sync = () => setSection(parseHash(window.location.hash))\n sync()\n window.addEventListener(\"hashchange\", sync)\n return () => window.removeEventListener(\"hashchange\", sync)\n }, [])\n\n const select = React.useCallback((next: SectionId) => {\n if (typeof window === \"undefined\") return\n window.location.hash = next\n }, [])\n\n return [section, select]\n}\n\nexport default function SettingsPage() {\n const [active, selectSection] = useHashSection()\n const update = preferences.useUpdate()\n const resetDeviceSettings = useDeviceSettingsStore((s) => s.resetDeviceSettings)\n\n const resetAll = () => {\n update.mutate(defaultUserPreferences, {\n onSuccess: () => {\n resetDeviceSettings()\n toast.success(\"Settings reset\")\n },\n onError: (e) => toast.error(e.message || \"Failed to reset\"),\n })\n }\n\n const ActiveComponent =\n SECTIONS.find((s) => s.id === active)?.Component ?? ProfileSection\n const activeLabel =\n SECTIONS.find((s) => s.id === active)?.label ?? \"Settings\"\n\n return (\n <div className=\"h-full overflow-y-auto scrollbar-thin\">\n <div className=\"mx-auto max-w-5xl space-y-6 p-4 md:p-6\">\n <header className=\"flex items-center justify-between gap-2\">\n <div>\n <h1 className=\"text-lg font-semibold leading-none\">Settings</h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {activeLabel}\n </p>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={resetAll}\n disabled={update.isPending}\n >\n <RotateCcw className=\"mr-2 h-4 w-4\" />\n Reset\n </Button>\n </header>\n\n <div className=\"flex flex-col gap-4 md:flex-row md:gap-6\">\n <SectionNav active={active} onSelect={selectSection} />\n <div className=\"min-w-0 flex-1\">\n <ActiveComponent />\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nfunction SectionNav({\n active,\n onSelect,\n}: {\n active: SectionId\n onSelect: (id: SectionId) => void\n}) {\n return (\n <nav\n aria-label=\"Settings sections\"\n className={cn(\n \"shrink-0 md:w-44\",\n \"scrollbar-none -mx-4 flex gap-1 overflow-x-auto px-4 md:mx-0 md:flex-col md:gap-0.5 md:overflow-visible md:px-0\"\n )}\n >\n {SECTIONS.map((s) => {\n const Icon = s.icon\n const isActive = active === s.id\n return (\n <button\n key={s.id}\n type=\"button\"\n onClick={() => onSelect(s.id)}\n className={cn(\n \"inline-flex shrink-0 items-center gap-2 rounded-md px-3 py-2 text-sm transition-colors\",\n \"md:w-full md:justify-start\",\n isActive\n ? \"bg-muted font-medium text-foreground\"\n : \"text-muted-foreground hover:bg-muted/50 hover:text-foreground\"\n )}\n >\n <Icon className=\"h-4 w-4 shrink-0\" />\n {s.label}\n </button>\n )\n })}\n </nav>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"@/components/ui/card\"\nimport { Input } from \"@/components/ui/input\"\nimport { ChevronDown, Search } from \"lucide-react\"\nimport { ProviderIcon } from \"@/components/ProviderIcon\"\n\nexport function SettingsSection({\n icon: Icon,\n title,\n description,\n action,\n children,\n}: {\n icon: React.ElementType\n title: string\n description?: string\n action?: React.ReactNode\n children: React.ReactNode\n}) {\n return (\n <Card>\n <CardHeader className=\"pb-4\">\n <div className=\"flex items-center gap-2\">\n <div className=\"rounded-lg bg-primary/10 p-2\">\n <Icon className=\"h-4 w-4 text-primary\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <CardTitle className=\"text-base\">{title}</CardTitle>\n {description && (\n <CardDescription className=\"text-sm\">{description}</CardDescription>\n )}\n </div>\n {action}\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">{children}</CardContent>\n </Card>\n )\n}\n\nexport function SettingsField({\n label,\n description,\n children,\n stacked,\n}: {\n label: string\n description?: string\n children: React.ReactNode\n /** When true, render children below the label instead of beside it. */\n stacked?: boolean\n}) {\n if (stacked) {\n return (\n <div className=\"space-y-2\">\n <div className=\"space-y-0.5\">\n <span className=\"text-sm font-medium\">{label}</span>\n {description && (\n <p className=\"text-xs text-muted-foreground\">{description}</p>\n )}\n </div>\n <div>{children}</div>\n </div>\n )\n }\n return (\n <div className=\"flex flex-col justify-between gap-2 sm:flex-row sm:items-center sm:gap-4\">\n <div className=\"shrink-0 space-y-0.5\">\n <span className=\"text-sm font-medium\">{label}</span>\n {description && (\n <p className=\"text-xs text-muted-foreground\">{description}</p>\n )}\n </div>\n <div className=\"w-full sm:max-w-[280px]\">{children}</div>\n </div>\n )\n}\n\ninterface ModelOption {\n name: string\n provider?: string\n}\n\n/** Searchable native dropdown — preserved verbatim from the previous page. */\nexport const ModelSelect = React.memo(function ModelSelect({\n value,\n onValueChange,\n models,\n isLoading,\n placeholder,\n}: {\n value: string\n onValueChange: (v: string) => void\n models: ModelOption[]\n isLoading: boolean\n placeholder: string\n}) {\n const [open, setOpen] = React.useState(false)\n const [search, setSearch] = React.useState(\"\")\n const containerRef = React.useRef<HTMLDivElement>(null)\n\n const filtered = React.useMemo(() => {\n if (!search) return models\n const q = search.toLowerCase()\n return models.filter((m) => m.name.toLowerCase().includes(q))\n }, [models, search])\n\n React.useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false)\n }\n }\n document.addEventListener(\"mousedown\", handler)\n return () => document.removeEventListener(\"mousedown\", handler)\n }, [open])\n\n React.useEffect(() => {\n if (!open) setSearch(\"\")\n }, [open])\n\n return (\n <div ref={containerRef} className=\"relative\">\n <button\n type=\"button\"\n onClick={() => !isLoading && setOpen(!open)}\n className={cn(\n \"flex h-9 w-full items-center justify-between rounded-md border bg-transparent px-3 text-sm\",\n \"transition-colors hover:bg-muted/50\",\n isLoading && \"cursor-not-allowed opacity-50\"\n )}\n disabled={isLoading}\n >\n <span className=\"truncate\">{value || placeholder}</span>\n <ChevronDown className=\"h-4 w-4 shrink-0 opacity-50\" />\n </button>\n {open && (\n <div className=\"absolute z-50 mt-1 w-full rounded-md border bg-popover shadow-md\">\n <div className=\"border-b p-2\">\n <div className=\"relative\">\n <Search className=\"absolute left-2 top-1.5 h-3.5 w-3.5 text-muted-foreground\" />\n <Input\n placeholder=\"Search...\"\n className=\"h-7 pl-7 text-xs\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n autoFocus\n />\n </div>\n </div>\n <div className=\"scrollbar-thin max-h-[240px] overflow-y-auto p-1\">\n {filtered.length === 0 ? (\n <div className=\"p-2 text-sm text-muted-foreground\">No models</div>\n ) : (\n filtered.map((model) => (\n <button\n key={model.name}\n type=\"button\"\n onClick={() => {\n onValueChange(model.name)\n setOpen(false)\n }}\n className={cn(\n \"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-xs\",\n value === model.name ? \"bg-accent\" : \"hover:bg-muted/50\"\n )}\n >\n <ProviderIcon providerName={model.provider || \"?\"} />\n <span className=\"truncate\">{model.name}</span>\n </button>\n ))\n )}\n </div>\n </div>\n )}\n </div>\n )\n})\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Palette, Sun, Moon, Monitor, Check } from \"lucide-react\"\nimport { toast } from \"sonner\"\n\nimport { preferences } from \"@/lib/api\"\nimport {\n defaultUserPreferences,\n type UserPreferencesDTO,\n} from \"@/lib/schemas/preferences\"\nimport { getAllThemes, type ThemeDescriptor } from \"@/lib/themes\"\nimport { cn } from \"@/lib/utils\"\nimport { Slider } from \"@/components/ui/slider\"\n\nimport { SettingsField, SettingsSection } from \"./shared\"\n\nexport function AppearanceSection() {\n const { data: prefsServer } = preferences.useGet()\n const prefs = prefsServer ?? defaultUserPreferences\n const update = preferences.useUpdate()\n const themes = React.useMemo(() => getAllThemes(), [])\n\n const patch = (p: Partial<UserPreferencesDTO>) =>\n update.mutate(p, { onError: (e) => toast.error(e.message || \"Failed to save\") })\n\n return (\n <div className=\"space-y-4\">\n <SettingsSection\n icon={Palette}\n title=\"Theme\"\n description=\"Pick a visual preset for the whole app.\"\n >\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {themes.map((theme) => (\n <ThemeTile\n key={theme.id}\n theme={theme}\n active={prefs.theme_id === theme.id}\n onSelect={() => patch({ theme_id: theme.id })}\n />\n ))}\n </div>\n\n <SettingsField\n label=\"Color Scheme\"\n description=\"Light, dark, or follow the OS preference.\"\n >\n <SchemeToggle\n value={prefs.theme_scheme}\n onChange={(scheme) => patch({ theme_scheme: scheme })}\n />\n </SettingsField>\n </SettingsSection>\n\n <SettingsSection\n icon={Palette}\n title=\"Chat Rendering\"\n description=\"How streamed assistant messages animate and lay out.\"\n >\n <SettingsField\n label=\"Render Mode\"\n description=\"Instant: no cursor. Stream: live + blinking cursor. Typewriter: smooth char-by-char.\"\n stacked\n >\n <SegmentedControl\n value={prefs.chat_render_mode}\n options={[\n { value: \"instant\", label: \"Instant\" },\n { value: \"stream\", label: \"Stream\" },\n { value: \"typewriter\", label: \"Typewriter\" },\n ]}\n onChange={(v) =>\n patch({ chat_render_mode: v as UserPreferencesDTO[\"chat_render_mode\"] })\n }\n />\n </SettingsField>\n\n {prefs.chat_render_mode === \"typewriter\" && (\n <SettingsField\n label=\"Typewriter Speed\"\n description={`${prefs.typewriter_cps} characters per second.`}\n stacked\n >\n <Slider\n value={[prefs.typewriter_cps]}\n min={20}\n max={400}\n step={10}\n onValueChange={([v]) => patch({ typewriter_cps: v })}\n />\n </SettingsField>\n )}\n\n <SettingsField\n label=\"Message Layout\"\n description=\"Plain: feed style. Bubble: aligned chat bubbles. Minimal: text only.\"\n stacked\n >\n <SegmentedControl\n value={prefs.chat_bubble_style}\n options={[\n { value: \"plain\", label: \"Plain\" },\n { value: \"bubble\", label: \"Bubble\" },\n { value: \"minimal\", label: \"Minimal\" },\n ]}\n onChange={(v) =>\n patch({ chat_bubble_style: v as UserPreferencesDTO[\"chat_bubble_style\"] })\n }\n />\n </SettingsField>\n </SettingsSection>\n </div>\n )\n}\n\nfunction ThemeTile({\n theme,\n active,\n onSelect,\n}: {\n theme: ThemeDescriptor\n active: boolean\n onSelect: () => void\n}) {\n const [bg, primary, accent, muted] = theme.preview.swatches\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className={cn(\n \"group relative flex items-stretch gap-3 overflow-hidden rounded-xl border bg-card p-3 text-left transition-all\",\n \"hover:border-primary/50 hover:shadow-sm\",\n active && \"border-primary ring-2 ring-primary/30\"\n )}\n >\n <div\n className=\"relative flex h-16 w-16 shrink-0 items-center justify-center overflow-hidden rounded-lg border\"\n style={{ background: bg, color: primary }}\n >\n <span className=\"text-xl font-semibold leading-none\">{theme.preview.glyph ?? \"Aa\"}</span>\n <div className=\"absolute bottom-1 left-1 right-1 flex h-1.5 gap-0.5\">\n <div className=\"flex-1 rounded-sm\" style={{ background: primary }} />\n <div className=\"flex-1 rounded-sm\" style={{ background: accent }} />\n <div className=\"flex-1 rounded-sm\" style={{ background: muted }} />\n </div>\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium\">{theme.label}</span>\n <span\n className={cn(\n \"rounded-full border px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide\",\n theme.flair === \"cool\"\n ? \"border-primary/30 bg-primary/10 text-primary\"\n : \"border-border bg-muted text-muted-foreground\"\n )}\n >\n {theme.flair}\n </span>\n </div>\n <p className=\"mt-1 line-clamp-2 text-xs text-muted-foreground\">\n {theme.description}\n </p>\n </div>\n {active && (\n <Check className=\"absolute right-2 top-2 h-4 w-4 text-primary\" />\n )}\n </button>\n )\n}\n\nfunction SchemeToggle({\n value,\n onChange,\n}: {\n value: UserPreferencesDTO[\"theme_scheme\"]\n onChange: (v: UserPreferencesDTO[\"theme_scheme\"]) => void\n}) {\n const options = [\n { value: \"light\" as const, label: \"Light\", icon: Sun },\n { value: \"dark\" as const, label: \"Dark\", icon: Moon },\n { value: \"system\" as const, label: \"System\", icon: Monitor },\n ]\n return (\n <div className=\"inline-flex rounded-md border bg-muted/30 p-0.5\">\n {options.map((opt) => {\n const Icon = opt.icon\n const active = value === opt.value\n return (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onChange(opt.value)}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded px-3 py-1.5 text-xs transition-colors\",\n active\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\"\n )}\n >\n <Icon className=\"h-3.5 w-3.5\" />\n {opt.label}\n </button>\n )\n })}\n </div>\n )\n}\n\nfunction SegmentedControl<T extends string>({\n value,\n options,\n onChange,\n}: {\n value: T\n options: { value: T; label: string }[]\n onChange: (v: T) => void\n}) {\n return (\n <div className=\"inline-flex w-full rounded-md border bg-muted/30 p-0.5 sm:w-auto\">\n {options.map((opt) => {\n const active = value === opt.value\n return (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onChange(opt.value)}\n className={cn(\n \"flex-1 rounded px-3 py-1.5 text-xs transition-colors sm:flex-initial\",\n active\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\"\n )}\n >\n {opt.label}\n </button>\n )\n })}\n </div>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Sliders } from \"lucide-react\"\n\nimport { useDeviceSettingsStore } from \"@/lib/stores/device-settings-store\"\nimport { Switch } from \"@/components/ui/switch\"\n\nimport { SettingsField, SettingsSection } from \"./shared\"\n\nexport function BehaviorSection() {\n const sendOnEnter = useDeviceSettingsStore((s) => s.sendOnEnter)\n const showTimestamps = useDeviceSettingsStore((s) => s.showTimestamps)\n const compactMode = useDeviceSettingsStore((s) => s.compactMode)\n const updateDeviceSettings = useDeviceSettingsStore((s) => s.updateDeviceSettings)\n\n return (\n <SettingsSection\n icon={Sliders}\n title=\"Device Behavior\"\n description=\"Local-only switches — stored in this browser, never synced.\"\n >\n <SettingsField label=\"Send on Enter\" description=\"Press Enter to send messages.\">\n <Switch\n checked={sendOnEnter}\n onCheckedChange={(v) => updateDeviceSettings({ sendOnEnter: v })}\n />\n </SettingsField>\n\n <SettingsField label=\"Show Timestamps\" description=\"Display message timestamps.\">\n <Switch\n checked={showTimestamps}\n onCheckedChange={(v) => updateDeviceSettings({ showTimestamps: v })}\n />\n </SettingsField>\n\n <SettingsField label=\"Compact Mode\" description=\"Reduce spacing in chat view.\">\n <Switch\n checked={compactMode}\n onCheckedChange={(v) => updateDeviceSettings({ compactMode: v })}\n />\n </SettingsField>\n </SettingsSection>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { MessageSquare } from \"lucide-react\"\nimport { toast } from \"sonner\"\n\nimport { preferences } from \"@/lib/api\"\nimport { defaultUserPreferences } from \"@/lib/schemas/preferences\"\nimport { Input } from \"@/components/ui/input\"\nimport { Textarea } from \"@/components/ui/textarea\"\n\nimport { SettingsField, SettingsSection } from \"./shared\"\n\nexport function ChatSection() {\n const { data: prefsServer } = preferences.useGet()\n const prefs = prefsServer ?? defaultUserPreferences\n const update = preferences.useUpdate()\n\n const patch = (p: Parameters<typeof update.mutate>[0]) =>\n update.mutate(p, { onError: (e) => toast.error(e.message || \"Failed to save\") })\n\n return (\n <SettingsSection icon={MessageSquare} title=\"Chat Defaults\">\n <SettingsField label=\"System Prompt\" stacked>\n <Textarea\n value={prefs.default_system_prompt}\n onChange={(e) => patch({ default_system_prompt: e.target.value })}\n rows={3}\n className=\"resize-none\"\n />\n </SettingsField>\n\n <SettingsField label=\"History Limit\">\n <Input\n type=\"number\"\n value={prefs.default_history_limit}\n onChange={(e) => patch({ default_history_limit: Number(e.target.value) })}\n min={1}\n max={50}\n />\n </SettingsField>\n </SettingsSection>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Bot } from \"lucide-react\"\nimport { toast } from \"sonner\"\n\nimport { models, preferences } from \"@/lib/api\"\nimport { defaultUserPreferences } from \"@/lib/schemas/preferences\"\n\nimport { ModelSelect, SettingsField, SettingsSection } from \"./shared\"\n\nexport function ModelsSection() {\n const { data: prefsServer } = preferences.useGet()\n const prefs = prefsServer ?? defaultUserPreferences\n const update = preferences.useUpdate()\n const { data: modelsData, isLoading } = models.useList()\n\n const modelOptions = React.useMemo(() => {\n if (!Array.isArray(modelsData)) return []\n return modelsData.map((m) => ({ name: m.name, provider: m.provider ?? undefined }))\n }, [modelsData])\n\n const patch = (p: Parameters<typeof update.mutate>[0]) =>\n update.mutate(p, { onError: (e) => toast.error(e.message || \"Failed to save\") })\n\n return (\n <SettingsSection\n icon={Bot}\n title=\"Default Models\"\n description=\"Models used when a conversation does not override them.\"\n >\n <SettingsField label=\"Chat Model\" description=\"Default model for new conversations.\">\n <ModelSelect\n value={prefs.default_model}\n onValueChange={(v) => patch({ default_model: v })}\n models={modelOptions}\n isLoading={isLoading}\n placeholder={isLoading ? \"Loading...\" : \"Select model\"}\n />\n </SettingsField>\n\n <SettingsField label=\"Summary Model\" description=\"Model for titles and summaries.\">\n <ModelSelect\n value={prefs.default_summary_model}\n onValueChange={(v) => patch({ default_summary_model: v })}\n models={modelOptions}\n isLoading={isLoading}\n placeholder={isLoading ? \"Loading...\" : \"Select model\"}\n />\n </SettingsField>\n </SettingsSection>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { User } from \"lucide-react\"\nimport { toast } from \"sonner\"\n\nimport { preferences } from \"@/lib/api/preferences\"\nimport { defaultUserPreferences } from \"@/lib/schemas/preferences\"\nimport { Input } from \"@/components/ui/input\"\nimport { cn } from \"@/lib/utils\"\n\nimport { SettingsField, SettingsSection } from \"./shared\"\n\nconst AVATAR_OPTIONS = [\n \"👤\", \"😀\", \"😎\", \"🤖\", \"🦊\", \"🐱\", \"🐶\", \"🦁\",\n \"🐼\", \"🐨\", \"🐸\", \"🦄\", \"🌟\", \"💫\", \"🎯\", \"🚀\",\n]\n\nexport function ProfileSection() {\n const { data: prefsServer } = preferences.useGet()\n const prefs = prefsServer ?? defaultUserPreferences\n const update = preferences.useUpdate()\n\n const patch = (p: Parameters<typeof update.mutate>[0]) =>\n update.mutate(p, { onError: (e) => toast.error(e.message || \"Failed to save\") })\n\n return (\n <SettingsSection\n icon={User}\n title=\"User Profile\"\n description=\"The display name and avatar shown across the app.\"\n >\n <SettingsField\n label=\"Display Name\"\n description=\"Shown in the header, chat messages, and conversation list.\"\n >\n <Input\n value={prefs.user_name}\n onChange={(e) => patch({ user_name: e.target.value })}\n placeholder=\"Your name\"\n />\n </SettingsField>\n\n <SettingsField label=\"Avatar\" description=\"Pick an emoji avatar.\" stacked>\n <div className=\"flex flex-wrap gap-1.5\">\n {AVATAR_OPTIONS.map((emoji) => (\n <button\n key={emoji}\n type=\"button\"\n onClick={() => patch({ user_avatar: emoji })}\n className={cn(\n \"flex h-9 w-9 items-center justify-center rounded-lg border text-lg transition-all hover:bg-muted\",\n prefs.user_avatar === emoji\n ? \"border-primary bg-primary/10 ring-2 ring-primary/20\"\n : \"border-transparent\"\n )}\n >\n {emoji}\n </button>\n ))}\n </div>\n </SettingsField>\n </SettingsSection>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { toast } from \"sonner\"\nimport { Loader2 } from \"lucide-react\"\n\nimport { tools } from \"@/lib/api\"\nimport type { ToolCreateInput, ToolDTO } from \"@/lib/schemas/tool\"\n\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Label } from \"@/components/ui/label\"\nimport { Switch } from \"@/components/ui/switch\"\nimport { Textarea } from \"@/components/ui/textarea\"\n\ninterface Props {\n open: boolean\n onOpenChange: (open: boolean) => void\n mode: \"create\" | \"edit\"\n tool?: ToolDTO | null\n}\n\nconst DEFAULT_PARAMETERS = `{\n \"type\": \"object\",\n \"properties\": {},\n \"required\": []\n}`\n\nexport function ToolFormDialog({ open, onOpenChange, mode, tool }: Props) {\n const [name, setName] = React.useState(\"\")\n const [description, setDescription] = React.useState(\"\")\n const [parameters, setParameters] = React.useState(DEFAULT_PARAMETERS)\n const [webhookUrl, setWebhookUrl] = React.useState(\"\")\n const [enabled, setEnabled] = React.useState(true)\n const [parseError, setParseError] = React.useState<string | null>(null)\n\n React.useEffect(() => {\n if (!open) return\n if (tool) {\n setName(tool.name)\n setDescription(tool.description ?? \"\")\n setParameters(JSON.stringify(tool.parameters ?? {}, null, 2))\n setWebhookUrl(tool.webhook_url ?? \"\")\n setEnabled(tool.enabled !== false)\n } else {\n setName(\"\")\n setDescription(\"\")\n setParameters(DEFAULT_PARAMETERS)\n setWebhookUrl(\"\")\n setEnabled(true)\n }\n setParseError(null)\n }, [open, tool])\n\n const createMutation = tools.useCreate({\n onSuccess: () => {\n toast.success(\"Saved\")\n onOpenChange(false)\n },\n onError: (e) => toast.error(e.message || \"Save failed\"),\n })\n\n const updateMutation = tools.useUpdate({\n onSuccess: () => {\n toast.success(\"Saved\")\n onOpenChange(false)\n },\n onError: (e) => toast.error(e.message || \"Save failed\"),\n })\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n if (!name.trim()) return toast.error(\"Name required\")\n\n let params: Record<string, unknown> = {}\n try {\n params = parameters.trim() ? JSON.parse(parameters) : {}\n setParseError(null)\n } catch (err) {\n setParseError(err instanceof Error ? err.message : \"Invalid JSON\")\n return\n }\n\n const payload: ToolCreateInput = {\n name: name.trim(),\n description: description.trim(),\n parameters: params,\n webhook_url: webhookUrl.trim() || null,\n enabled,\n }\n\n if (mode === \"create\") createMutation.mutate(payload)\n else if (tool) updateMutation.mutate({ id: tool.id, data: payload })\n }\n\n const isLoading = createMutation.isPending || updateMutation.isPending\n const title = mode === \"create\" ? \"Add tool\" : \"Edit\"\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className=\"sm:max-w-[640px] max-h-[90vh] overflow-y-auto\"\n onOpenAutoFocus={mode === \"edit\" ? (e) => e.preventDefault() : undefined}\n >\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n </DialogHeader>\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"grid sm:grid-cols-2 gap-3\">\n <Field label=\"Name\" htmlFor=\"t-name\">\n <Input\n id=\"t-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"get_weather\"\n className=\"h-9 text-sm font-mono\"\n />\n </Field>\n <Field label=\"Webhook URL\" htmlFor=\"t-webhook\">\n <Input\n id=\"t-webhook\"\n value={webhookUrl}\n onChange={(e) => setWebhookUrl(e.target.value)}\n placeholder=\"https://…\"\n className=\"h-9 text-sm font-mono\"\n />\n </Field>\n </div>\n\n <Field label=\"Description\" htmlFor=\"t-desc\">\n <Input\n id=\"t-desc\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n className=\"h-9 text-sm\"\n />\n </Field>\n\n <Field label=\"Parameters (JSON Schema)\" htmlFor=\"t-params\">\n <Textarea\n id=\"t-params\"\n value={parameters}\n onChange={(e) => setParameters(e.target.value)}\n rows={10}\n className=\"text-xs font-mono\"\n />\n {parseError && <span className=\"text-xs text-destructive\">{parseError}</span>}\n </Field>\n\n <div className=\"flex items-center justify-between\">\n <Label htmlFor=\"t-enabled\" className=\"text-xs\">Enabled</Label>\n <Switch id=\"t-enabled\" checked={enabled} onCheckedChange={setEnabled} />\n </div>\n\n <div className=\"flex items-center justify-end gap-2 pt-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => onOpenChange(false)} disabled={isLoading}>\n Cancel\n </Button>\n <Button type=\"submit\" size=\"sm\" disabled={isLoading}>\n {isLoading && <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />}\n Save\n </Button>\n </div>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n\nfunction Field({ label, htmlFor, children }: { label: string; htmlFor?: string; children: React.ReactNode }) {\n return (\n <div className=\"grid gap-1.5 min-w-0\">\n <Label htmlFor={htmlFor} className=\"text-xs\">{label}</Label>\n {children}\n </div>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Pencil, Trash2 } from \"lucide-react\"\n\nimport type { ToolDTO } from \"@/lib/schemas/tool\"\nimport { Badge } from \"@/components/ui/badge\"\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\"\n\ninterface Props {\n tools: ToolDTO[]\n onEdit?: (t: ToolDTO) => void\n onDelete?: (t: ToolDTO) => void\n}\n\nexport function ToolsTable({ tools, onEdit, onDelete }: Props) {\n const showActions = !!onEdit || !!onDelete\n const colCount = showActions ? 5 : 4\n\n return (\n <DataTableShell>\n <DataTableHeader>\n <DataTableHeaderRow>\n <DataTableHead>Name</DataTableHead>\n <DataTableHead>Description</DataTableHead>\n <DataTableHead>Webhook</DataTableHead>\n <DataTableHead>Status</DataTableHead>\n {showActions && <DataTableHead className=\"w-[88px] text-right\">Actions</DataTableHead>}\n </DataTableHeaderRow>\n </DataTableHeader>\n <DataTableBody>\n {tools.length === 0 ? (\n <DataTableEmpty colSpan={colCount}>No tools registered yet.</DataTableEmpty>\n ) : (\n tools.map((t) => (\n <DataTableRow key={t.id}>\n <DataTableCell className=\"font-mono text-xs max-w-[200px] truncate\" title={t.name}>\n {t.name}\n </DataTableCell>\n <DataTableCell className=\"text-xs text-muted-foreground max-w-[320px] truncate\" title={t.description}>\n {t.description || \"—\"}\n </DataTableCell>\n <DataTableCell className=\"text-xs font-mono text-muted-foreground max-w-[260px] truncate\" title={t.webhook_url ?? undefined}>\n {t.webhook_url ?? <span className=\"italic\">none</span>}\n </DataTableCell>\n <DataTableCell>\n <Badge variant={t.enabled ? \"default\" : \"secondary\"} className=\"text-[10px] uppercase\">\n {t.enabled ? \"on\" : \"off\"}\n </Badge>\n </DataTableCell>\n {showActions && (\n <DataTableCell className=\"text-right\">\n <div className=\"flex items-center justify-end gap-1\">\n {onEdit && (\n <Button variant=\"ghost\" size=\"icon\" className=\"h-7 w-7\" onClick={() => onEdit(t)} title=\"Edit\">\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-destructive hover:text-destructive\"\n onClick={() => onDelete(t)}\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 { Plus, Wrench } from \"lucide-react\"\nimport { toast } from \"sonner\"\n\nimport { tools } from \"@/lib/api/tools\"\nimport type { ToolDTO } from \"@/lib/schemas/tool\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { ConfirmDialog } from \"@/components/ui/confirm-dialog\"\nimport { ToolFormDialog } from \"@/components/tools/tool-form-dialog\"\nimport { ToolsTable } from \"@/components/tools/tools-table\"\n\nimport { SettingsSection } from \"./shared\"\n\ntype ToolDialogState = { open: boolean; mode: \"create\" | \"edit\"; tool?: ToolDTO | null }\n\n/** Hand-written JSON Schema function tools. Settings-only because MCP\n * is the headline path; this is an escape hatch for one-off webhook-\n * backed tools that don't justify spinning up an MCP server. */\nexport function ToolsSection() {\n const { data: list } = tools.useList()\n const [dialog, setDialog] = React.useState<ToolDialogState>({ open: false, mode: \"create\" })\n const [deleting, setDeleting] = React.useState<ToolDTO | null>(null)\n\n const deleteMutation = tools.useDelete({\n onSuccess: () => {\n toast.success(\"Tool deleted\")\n setDeleting(null)\n },\n onError: (e) => toast.error(e.message || \"Delete failed\"),\n })\n\n const items = list ?? []\n\n return (\n <SettingsSection\n icon={Wrench}\n title=\"Custom tools\"\n action={\n <Button\n size=\"sm\"\n variant=\"secondary\"\n onClick={() => setDialog({ open: true, mode: \"create\" })}\n >\n <Plus className=\"h-3.5 w-3.5 mr-1\" />\n Add tool\n </Button>\n }\n >\n <div className=\"border rounded-lg overflow-hidden\">\n <ToolsTable\n tools={items}\n onEdit={(t) => setDialog({ open: true, mode: \"edit\", tool: t })}\n onDelete={setDeleting}\n />\n </div>\n\n <ToolFormDialog\n open={dialog.open}\n onOpenChange={(open) => setDialog((s) => ({ ...s, open }))}\n mode={dialog.mode}\n tool={dialog.tool}\n />\n\n <ConfirmDialog\n open={!!deleting}\n onOpenChange={(o) => !o && setDeleting(null)}\n title=\"Delete tool?\"\n description={<>This will delete <b>{deleting?.name}</b>.</>}\n confirmLabel=\"Delete\"\n destructive\n isLoading={deleteMutation.isPending}\n onConfirm={() => deleting && deleteMutation.mutate(deleting.id)}\n />\n </SettingsSection>\n )\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '20', height: '14', x: '2', y: '3', rx: '2', key: '48i651' }],\n ['line', { x1: '8', x2: '16', y1: '21', y2: '21', key: '1svkeh' }],\n ['line', { x1: '12', x2: '12', y1: '17', y2: '21', key: 'vw1qmm' }],\n];\n\n/**\n * @component @name Monitor\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIHg9IjIiIHk9IjMiIHJ4PSIyIiAvPgogIDxsaW5lIHgxPSI4IiB4Mj0iMTYiIHkxPSIyMSIgeTI9IjIxIiAvPgogIDxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iMTciIHkyPSIyMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/monitor\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 Monitor = createLucideIcon('monitor', __iconNode);\n\nexport default Monitor;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M10 8h4', key: '1sr2af' }],\n ['path', { d: 'M12 21v-9', key: '17s77i' }],\n ['path', { d: 'M12 8V3', key: '13r4qs' }],\n ['path', { d: 'M17 16h4', key: 'h1uq16' }],\n ['path', { d: 'M19 12V3', key: 'o1uvq1' }],\n ['path', { d: 'M19 21v-5', key: 'qua636' }],\n ['path', { d: 'M3 14h4', key: 'bcjad9' }],\n ['path', { d: 'M5 10V3', key: 'cb8scm' }],\n ['path', { d: 'M5 21v-7', key: '1w1uti' }],\n];\n\n/**\n * @component @name SlidersVertical\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAgOGg0IiAvPgogIDxwYXRoIGQ9Ik0xMiAyMXYtOSIgLz4KICA8cGF0aCBkPSJNMTIgOFYzIiAvPgogIDxwYXRoIGQ9Ik0xNyAxNmg0IiAvPgogIDxwYXRoIGQ9Ik0xOSAxMlYzIiAvPgogIDxwYXRoIGQ9Ik0xOSAyMXYtNSIgLz4KICA8cGF0aCBkPSJNMyAxNGg0IiAvPgogIDxwYXRoIGQ9Ik01IDEwVjMiIC8+CiAgPHBhdGggZD0iTTUgMjF2LTciIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/sliders-vertical\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 SlidersVertical = createLucideIcon('sliders-vertical', __iconNode);\n\nexport default SlidersVertical;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '4', key: '4exip2' }],\n ['path', { d: 'M12 2v2', key: 'tus03m' }],\n ['path', { d: 'M12 20v2', key: '1lh1kg' }],\n ['path', { d: 'm4.93 4.93 1.41 1.41', key: '149t6j' }],\n ['path', { d: 'm17.66 17.66 1.41 1.41', key: 'ptbguv' }],\n ['path', { d: 'M2 12h2', key: '1t8f8n' }],\n ['path', { d: 'M20 12h2', key: '1q8mjw' }],\n ['path', { d: 'm6.34 17.66-1.41 1.41', key: '1m8zz5' }],\n ['path', { d: 'm19.07 4.93-1.41 1.41', key: '1shlcs' }],\n];\n\n/**\n * @component @name Sun\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI0IiAvPgogIDxwYXRoIGQ9Ik0xMiAydjIiIC8+CiAgPHBhdGggZD0iTTEyIDIwdjIiIC8+CiAgPHBhdGggZD0ibTQuOTMgNC45MyAxLjQxIDEuNDEiIC8+CiAgPHBhdGggZD0ibTE3LjY2IDE3LjY2IDEuNDEgMS40MSIgLz4KICA8cGF0aCBkPSJNMiAxMmgyIiAvPgogIDxwYXRoIGQ9Ik0yMCAxMmgyIiAvPgogIDxwYXRoIGQ9Im02LjM0IDE3LjY2LTEuNDEgMS40MSIgLz4KICA8cGF0aCBkPSJtMTkuMDcgNC45My0xLjQxIDEuNDEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/sun\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 Sun = createLucideIcon('sun', __iconNode);\n\nexport default Sun;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z',\n key: 'e79jfc',\n },\n ],\n ['circle', { cx: '13.5', cy: '6.5', r: '.5', fill: 'currentColor', key: '1okk4w' }],\n ['circle', { cx: '17.5', cy: '10.5', r: '.5', fill: 'currentColor', key: 'f64h9f' }],\n ['circle', { cx: '6.5', cy: '12.5', r: '.5', fill: 'currentColor', key: 'qy21gx' }],\n ['circle', { cx: '8.5', cy: '7.5', r: '.5', fill: 'currentColor', key: 'fotxhn' }],\n];\n\n/**\n * @component @name Palette\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgMjJhMSAxIDAgMCAxIDAtMjAgMTAgOSAwIDAgMSAxMCA5IDUgNSAwIDAgMS01IDVoLTIuMjVhMS43NSAxLjc1IDAgMCAwLTEuNCAyLjhsLjMuNGExLjc1IDEuNzUgMCAwIDEtMS40IDIuOHoiIC8+CiAgPGNpcmNsZSBjeD0iMTMuNSIgY3k9IjYuNSIgcj0iLjUiIGZpbGw9ImN1cnJlbnRDb2xvciIgLz4KICA8Y2lyY2xlIGN4PSIxNy41IiBjeT0iMTAuNSIgcj0iLjUiIGZpbGw9ImN1cnJlbnRDb2xvciIgLz4KICA8Y2lyY2xlIGN4PSI2LjUiIGN5PSIxMi41IiByPSIuNSIgZmlsbD0iY3VycmVudENvbG9yIiAvPgogIDxjaXJjbGUgY3g9IjguNSIgY3k9IjcuNSIgcj0iLjUiIGZpbGw9ImN1cnJlbnRDb2xvciIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/palette\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 Palette = createLucideIcon('palette', __iconNode);\n\nexport default Palette;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401',\n key: 'kfwtm',\n },\n ],\n];\n\n/**\n * @component @name Moon\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAuOTg1IDEyLjQ4NmE5IDkgMCAxIDEtOS40NzMtOS40NzJjLjQwNS0uMDIyLjYxNy40Ni40MDIuODAzYTYgNiAwIDAgMCA4LjI2OCA4LjI2OGMuMzQ0LS4yMTUuODI1LS4wMDQuODAzLjQwMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/moon\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 Moon = createLucideIcon('moon', __iconNode);\n\nexport default Moon;\n"],"names":["__iconNode","key","cy","fill","r","cx"],"mappings":"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","ignoreList":[10,11,12,13,14]}
1
+ {"version":3,"sources":["../../../../app/%28dashboard%29/settings/page.tsx","../../../../app/%28dashboard%29/settings/_sections/shared.tsx","../../../../app/%28dashboard%29/settings/_sections/appearance.tsx","../../../../app/%28dashboard%29/settings/_sections/behavior.tsx","../../../../app/%28dashboard%29/settings/_sections/chat.tsx","../../../../app/%28dashboard%29/settings/_sections/models.tsx","../../../../app/%28dashboard%29/settings/_sections/profile.tsx","../../../../app/%28dashboard%29/settings/_sections/timeouts.tsx","../../../../components/tools/tool-form-dialog.tsx","../../../../components/tools/tools-table.tsx","../../../../app/%28dashboard%29/settings/_sections/tools.tsx","../../../../node_modules/lucide-react/src/icons/monitor.ts","../../../../node_modules/lucide-react/src/icons/sliders-vertical.ts","../../../../node_modules/lucide-react/src/icons/timer.ts","../../../../node_modules/lucide-react/src/icons/sun.ts","../../../../node_modules/lucide-react/src/icons/palette.ts","../../../../node_modules/lucide-react/src/icons/moon.ts"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Bot, MessageSquare, Palette, RotateCcw, Sliders, Timer, User, Wrench } from \"lucide-react\"\nimport { toast } from \"sonner\"\n\nimport { preferences } from \"@/lib/api/preferences\"\nimport { defaultUserPreferences } from \"@/lib/schemas/preferences\"\nimport { useDeviceSettingsStore } from \"@/lib/stores/device-settings-store\"\nimport { Button } from \"@/components/ui/button\"\nimport { cn } from \"@/lib/utils\"\n\nimport { AppearanceSection } from \"./_sections/appearance\"\nimport { BehaviorSection } from \"./_sections/behavior\"\nimport { ChatSection } from \"./_sections/chat\"\nimport { ModelsSection } from \"./_sections/models\"\nimport { ProfileSection } from \"./_sections/profile\"\nimport { TimeoutsSection } from \"./_sections/timeouts\"\nimport { ToolsSection } from \"./_sections/tools\"\n\ntype SectionId = \"profile\" | \"appearance\" | \"models\" | \"chat\" | \"timeouts\" | \"behavior\" | \"tools\"\n\ninterface SectionDef {\n id: SectionId\n label: string\n icon: React.ElementType\n Component: React.ComponentType\n}\n\nconst SECTIONS: SectionDef[] = [\n { id: \"profile\", label: \"Profile\", icon: User, Component: ProfileSection },\n { id: \"appearance\", label: \"Appearance\", icon: Palette, Component: AppearanceSection },\n { id: \"models\", label: \"Models\", icon: Bot, Component: ModelsSection },\n { id: \"chat\", label: \"Chat\", icon: MessageSquare, Component: ChatSection },\n { id: \"timeouts\", label: \"Timeouts\", icon: Timer, Component: TimeoutsSection },\n { id: \"behavior\", label: \"Behavior\", icon: Sliders, Component: BehaviorSection },\n { id: \"tools\", label: \"Tools\", icon: Wrench, Component: ToolsSection },\n]\n\nconst DEFAULT_SECTION: SectionId = \"appearance\"\n\nfunction parseHash(hash: string): SectionId {\n const id = hash.replace(/^#/, \"\") as SectionId\n return SECTIONS.some((s) => s.id === id) ? id : DEFAULT_SECTION\n}\n\nfunction useHashSection(): [SectionId, (next: SectionId) => void] {\n const [section, setSection] = React.useState<SectionId>(DEFAULT_SECTION)\n\n React.useEffect(() => {\n const sync = () => setSection(parseHash(window.location.hash))\n sync()\n window.addEventListener(\"hashchange\", sync)\n return () => window.removeEventListener(\"hashchange\", sync)\n }, [])\n\n const select = React.useCallback((next: SectionId) => {\n if (typeof window === \"undefined\") return\n window.location.hash = next\n }, [])\n\n return [section, select]\n}\n\nexport default function SettingsPage() {\n const [active, selectSection] = useHashSection()\n const update = preferences.useUpdate()\n const resetDeviceSettings = useDeviceSettingsStore((s) => s.resetDeviceSettings)\n\n const resetAll = () => {\n update.mutate(defaultUserPreferences, {\n onSuccess: () => {\n resetDeviceSettings()\n toast.success(\"Settings reset\")\n },\n onError: (e) => toast.error(e.message || \"Failed to reset\"),\n })\n }\n\n const ActiveComponent =\n SECTIONS.find((s) => s.id === active)?.Component ?? ProfileSection\n const activeLabel =\n SECTIONS.find((s) => s.id === active)?.label ?? \"Settings\"\n\n return (\n <div className=\"h-full overflow-y-auto scrollbar-thin\">\n <div className=\"mx-auto max-w-5xl space-y-6 p-4 md:p-6\">\n <header className=\"flex items-center justify-between gap-2\">\n <div>\n <h1 className=\"text-lg font-semibold leading-none\">Settings</h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {activeLabel}\n </p>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={resetAll}\n disabled={update.isPending}\n >\n <RotateCcw className=\"mr-2 h-4 w-4\" />\n Reset\n </Button>\n </header>\n\n <div className=\"flex flex-col gap-4 md:flex-row md:gap-6\">\n <SectionNav active={active} onSelect={selectSection} />\n <div className=\"min-w-0 flex-1\">\n <ActiveComponent />\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nfunction SectionNav({\n active,\n onSelect,\n}: {\n active: SectionId\n onSelect: (id: SectionId) => void\n}) {\n return (\n <nav\n aria-label=\"Settings sections\"\n className={cn(\n \"shrink-0 md:w-44\",\n \"scrollbar-none -mx-4 flex gap-1 overflow-x-auto px-4 md:mx-0 md:flex-col md:gap-0.5 md:overflow-visible md:px-0\"\n )}\n >\n {SECTIONS.map((s) => {\n const Icon = s.icon\n const isActive = active === s.id\n return (\n <button\n key={s.id}\n type=\"button\"\n onClick={() => onSelect(s.id)}\n className={cn(\n \"inline-flex shrink-0 items-center gap-2 rounded-md px-3 py-2 text-sm transition-colors\",\n \"md:w-full md:justify-start\",\n isActive\n ? \"bg-muted font-medium text-foreground\"\n : \"text-muted-foreground hover:bg-muted/50 hover:text-foreground\"\n )}\n >\n <Icon className=\"h-4 w-4 shrink-0\" />\n {s.label}\n </button>\n )\n })}\n </nav>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"@/components/ui/card\"\nimport { Input } from \"@/components/ui/input\"\nimport { ChevronDown, Search } from \"lucide-react\"\nimport { ProviderIcon } from \"@/components/ProviderIcon\"\n\nexport function SettingsSection({\n icon: Icon,\n title,\n description,\n action,\n children,\n}: {\n icon: React.ElementType\n title: string\n description?: string\n action?: React.ReactNode\n children: React.ReactNode\n}) {\n return (\n <Card>\n <CardHeader className=\"pb-4\">\n <div className=\"flex items-center gap-2\">\n <div className=\"rounded-lg bg-primary/10 p-2\">\n <Icon className=\"h-4 w-4 text-primary\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <CardTitle className=\"text-base\">{title}</CardTitle>\n {description && (\n <CardDescription className=\"text-sm\">{description}</CardDescription>\n )}\n </div>\n {action}\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">{children}</CardContent>\n </Card>\n )\n}\n\nexport function SettingsField({\n label,\n description,\n children,\n stacked,\n}: {\n label: string\n description?: string\n children: React.ReactNode\n /** When true, render children below the label instead of beside it. */\n stacked?: boolean\n}) {\n if (stacked) {\n return (\n <div className=\"space-y-2\">\n <div className=\"space-y-0.5\">\n <span className=\"text-sm font-medium\">{label}</span>\n {description && (\n <p className=\"text-xs text-muted-foreground\">{description}</p>\n )}\n </div>\n <div>{children}</div>\n </div>\n )\n }\n return (\n <div className=\"flex flex-col justify-between gap-2 sm:flex-row sm:items-center sm:gap-4\">\n <div className=\"shrink-0 space-y-0.5\">\n <span className=\"text-sm font-medium\">{label}</span>\n {description && (\n <p className=\"text-xs text-muted-foreground\">{description}</p>\n )}\n </div>\n <div className=\"w-full sm:max-w-[280px]\">{children}</div>\n </div>\n )\n}\n\ninterface ModelOption {\n name: string\n provider?: string\n}\n\n/** Searchable native dropdown — preserved verbatim from the previous page. */\nexport const ModelSelect = React.memo(function ModelSelect({\n value,\n onValueChange,\n models,\n isLoading,\n placeholder,\n}: {\n value: string\n onValueChange: (v: string) => void\n models: ModelOption[]\n isLoading: boolean\n placeholder: string\n}) {\n const [open, setOpen] = React.useState(false)\n const [search, setSearch] = React.useState(\"\")\n const containerRef = React.useRef<HTMLDivElement>(null)\n\n const filtered = React.useMemo(() => {\n if (!search) return models\n const q = search.toLowerCase()\n return models.filter((m) => m.name.toLowerCase().includes(q))\n }, [models, search])\n\n React.useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false)\n }\n }\n document.addEventListener(\"mousedown\", handler)\n return () => document.removeEventListener(\"mousedown\", handler)\n }, [open])\n\n React.useEffect(() => {\n if (!open) setSearch(\"\")\n }, [open])\n\n return (\n <div ref={containerRef} className=\"relative\">\n <button\n type=\"button\"\n onClick={() => !isLoading && setOpen(!open)}\n className={cn(\n \"flex h-9 w-full items-center justify-between rounded-md border bg-transparent px-3 text-sm\",\n \"transition-colors hover:bg-muted/50\",\n isLoading && \"cursor-not-allowed opacity-50\"\n )}\n disabled={isLoading}\n >\n <span className=\"truncate\">{value || placeholder}</span>\n <ChevronDown className=\"h-4 w-4 shrink-0 opacity-50\" />\n </button>\n {open && (\n <div className=\"absolute z-50 mt-1 w-full rounded-md border bg-popover shadow-md\">\n <div className=\"border-b p-2\">\n <div className=\"relative\">\n <Search className=\"absolute left-2 top-1.5 h-3.5 w-3.5 text-muted-foreground\" />\n <Input\n placeholder=\"Search...\"\n className=\"h-7 pl-7 text-xs\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n autoFocus\n />\n </div>\n </div>\n <div className=\"scrollbar-thin max-h-[240px] overflow-y-auto p-1\">\n {filtered.length === 0 ? (\n <div className=\"p-2 text-sm text-muted-foreground\">No models</div>\n ) : (\n filtered.map((model) => (\n <button\n key={model.name}\n type=\"button\"\n onClick={() => {\n onValueChange(model.name)\n setOpen(false)\n }}\n className={cn(\n \"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-xs\",\n value === model.name ? \"bg-accent\" : \"hover:bg-muted/50\"\n )}\n >\n <ProviderIcon providerName={model.provider || \"?\"} />\n <span className=\"truncate\">{model.name}</span>\n </button>\n ))\n )}\n </div>\n </div>\n )}\n </div>\n )\n})\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Palette, Sun, Moon, Monitor, Check } from \"lucide-react\"\nimport { toast } from \"sonner\"\n\nimport { preferences } from \"@/lib/api\"\nimport {\n defaultUserPreferences,\n type UserPreferencesDTO,\n} from \"@/lib/schemas/preferences\"\nimport { getAllThemes, type ThemeDescriptor } from \"@/lib/themes\"\nimport { cn } from \"@/lib/utils\"\nimport { Slider } from \"@/components/ui/slider\"\n\nimport { SettingsField, SettingsSection } from \"./shared\"\n\nexport function AppearanceSection() {\n const { data: prefsServer } = preferences.useGet()\n const prefs = prefsServer ?? defaultUserPreferences\n const update = preferences.useUpdate()\n const themes = React.useMemo(() => getAllThemes(), [])\n\n const patch = (p: Partial<UserPreferencesDTO>) =>\n update.mutate(p, { onError: (e) => toast.error(e.message || \"Failed to save\") })\n\n return (\n <div className=\"space-y-4\">\n <SettingsSection\n icon={Palette}\n title=\"Theme\"\n description=\"Pick a visual preset for the whole app.\"\n >\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {themes.map((theme) => (\n <ThemeTile\n key={theme.id}\n theme={theme}\n active={prefs.theme_id === theme.id}\n onSelect={() => patch({ theme_id: theme.id })}\n />\n ))}\n </div>\n\n <SettingsField\n label=\"Color Scheme\"\n description=\"Light, dark, or follow the OS preference.\"\n >\n <SchemeToggle\n value={prefs.theme_scheme}\n onChange={(scheme) => patch({ theme_scheme: scheme })}\n />\n </SettingsField>\n </SettingsSection>\n\n <SettingsSection\n icon={Palette}\n title=\"Chat Rendering\"\n description=\"How streamed assistant messages animate and lay out.\"\n >\n <SettingsField\n label=\"Render Mode\"\n description=\"Instant: no cursor. Stream: live + blinking cursor. Typewriter: smooth char-by-char.\"\n stacked\n >\n <SegmentedControl\n value={prefs.chat_render_mode}\n options={[\n { value: \"instant\", label: \"Instant\" },\n { value: \"stream\", label: \"Stream\" },\n { value: \"typewriter\", label: \"Typewriter\" },\n ]}\n onChange={(v) =>\n patch({ chat_render_mode: v as UserPreferencesDTO[\"chat_render_mode\"] })\n }\n />\n </SettingsField>\n\n {prefs.chat_render_mode === \"typewriter\" && (\n <SettingsField\n label=\"Typewriter Speed\"\n description={`${prefs.typewriter_cps} characters per second.`}\n stacked\n >\n <Slider\n value={[prefs.typewriter_cps]}\n min={20}\n max={400}\n step={10}\n onValueChange={([v]) => patch({ typewriter_cps: v })}\n />\n </SettingsField>\n )}\n\n <SettingsField\n label=\"Message Layout\"\n description=\"Plain: feed style. Bubble: aligned chat bubbles. Minimal: text only.\"\n stacked\n >\n <SegmentedControl\n value={prefs.chat_bubble_style}\n options={[\n { value: \"plain\", label: \"Plain\" },\n { value: \"bubble\", label: \"Bubble\" },\n { value: \"minimal\", label: \"Minimal\" },\n ]}\n onChange={(v) =>\n patch({ chat_bubble_style: v as UserPreferencesDTO[\"chat_bubble_style\"] })\n }\n />\n </SettingsField>\n </SettingsSection>\n </div>\n )\n}\n\nfunction ThemeTile({\n theme,\n active,\n onSelect,\n}: {\n theme: ThemeDescriptor\n active: boolean\n onSelect: () => void\n}) {\n const [bg, primary, accent, muted] = theme.preview.swatches\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className={cn(\n \"group relative flex items-stretch gap-3 overflow-hidden rounded-xl border bg-card p-3 text-left transition-all\",\n \"hover:border-primary/50 hover:shadow-sm\",\n active && \"border-primary ring-2 ring-primary/30\"\n )}\n >\n <div\n className=\"relative flex h-16 w-16 shrink-0 items-center justify-center overflow-hidden rounded-lg border\"\n style={{ background: bg, color: primary }}\n >\n <span className=\"text-xl font-semibold leading-none\">{theme.preview.glyph ?? \"Aa\"}</span>\n <div className=\"absolute bottom-1 left-1 right-1 flex h-1.5 gap-0.5\">\n <div className=\"flex-1 rounded-sm\" style={{ background: primary }} />\n <div className=\"flex-1 rounded-sm\" style={{ background: accent }} />\n <div className=\"flex-1 rounded-sm\" style={{ background: muted }} />\n </div>\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium\">{theme.label}</span>\n <span\n className={cn(\n \"rounded-full border px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide\",\n theme.flair === \"cool\"\n ? \"border-primary/30 bg-primary/10 text-primary\"\n : \"border-border bg-muted text-muted-foreground\"\n )}\n >\n {theme.flair}\n </span>\n </div>\n <p className=\"mt-1 line-clamp-2 text-xs text-muted-foreground\">\n {theme.description}\n </p>\n </div>\n {active && (\n <Check className=\"absolute right-2 top-2 h-4 w-4 text-primary\" />\n )}\n </button>\n )\n}\n\nfunction SchemeToggle({\n value,\n onChange,\n}: {\n value: UserPreferencesDTO[\"theme_scheme\"]\n onChange: (v: UserPreferencesDTO[\"theme_scheme\"]) => void\n}) {\n const options = [\n { value: \"light\" as const, label: \"Light\", icon: Sun },\n { value: \"dark\" as const, label: \"Dark\", icon: Moon },\n { value: \"system\" as const, label: \"System\", icon: Monitor },\n ]\n return (\n <div className=\"inline-flex rounded-md border bg-muted/30 p-0.5\">\n {options.map((opt) => {\n const Icon = opt.icon\n const active = value === opt.value\n return (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onChange(opt.value)}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded px-3 py-1.5 text-xs transition-colors\",\n active\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\"\n )}\n >\n <Icon className=\"h-3.5 w-3.5\" />\n {opt.label}\n </button>\n )\n })}\n </div>\n )\n}\n\nfunction SegmentedControl<T extends string>({\n value,\n options,\n onChange,\n}: {\n value: T\n options: { value: T; label: string }[]\n onChange: (v: T) => void\n}) {\n return (\n <div className=\"inline-flex w-full rounded-md border bg-muted/30 p-0.5 sm:w-auto\">\n {options.map((opt) => {\n const active = value === opt.value\n return (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onChange(opt.value)}\n className={cn(\n \"flex-1 rounded px-3 py-1.5 text-xs transition-colors sm:flex-initial\",\n active\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\"\n )}\n >\n {opt.label}\n </button>\n )\n })}\n </div>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Sliders } from \"lucide-react\"\n\nimport { useDeviceSettingsStore } from \"@/lib/stores/device-settings-store\"\nimport { Switch } from \"@/components/ui/switch\"\n\nimport { SettingsField, SettingsSection } from \"./shared\"\n\nexport function BehaviorSection() {\n const sendOnEnter = useDeviceSettingsStore((s) => s.sendOnEnter)\n const showTimestamps = useDeviceSettingsStore((s) => s.showTimestamps)\n const compactMode = useDeviceSettingsStore((s) => s.compactMode)\n const updateDeviceSettings = useDeviceSettingsStore((s) => s.updateDeviceSettings)\n\n return (\n <SettingsSection\n icon={Sliders}\n title=\"Device Behavior\"\n description=\"Local-only switches — stored in this browser, never synced.\"\n >\n <SettingsField label=\"Send on Enter\" description=\"Press Enter to send messages.\">\n <Switch\n checked={sendOnEnter}\n onCheckedChange={(v) => updateDeviceSettings({ sendOnEnter: v })}\n />\n </SettingsField>\n\n <SettingsField label=\"Show Timestamps\" description=\"Display message timestamps.\">\n <Switch\n checked={showTimestamps}\n onCheckedChange={(v) => updateDeviceSettings({ showTimestamps: v })}\n />\n </SettingsField>\n\n <SettingsField label=\"Compact Mode\" description=\"Reduce spacing in chat view.\">\n <Switch\n checked={compactMode}\n onCheckedChange={(v) => updateDeviceSettings({ compactMode: v })}\n />\n </SettingsField>\n </SettingsSection>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { MessageSquare } from \"lucide-react\"\nimport { toast } from \"sonner\"\n\nimport { preferences } from \"@/lib/api\"\nimport { defaultUserPreferences } from \"@/lib/schemas/preferences\"\nimport { Input } from \"@/components/ui/input\"\nimport { Textarea } from \"@/components/ui/textarea\"\n\nimport { SettingsField, SettingsSection } from \"./shared\"\n\nexport function ChatSection() {\n const { data: prefsServer } = preferences.useGet()\n const prefs = prefsServer ?? defaultUserPreferences\n const update = preferences.useUpdate()\n\n const patch = (p: Parameters<typeof update.mutate>[0]) =>\n update.mutate(p, { onError: (e) => toast.error(e.message || \"Failed to save\") })\n\n return (\n <SettingsSection icon={MessageSquare} title=\"Chat Defaults\">\n <SettingsField label=\"System Prompt\" stacked>\n <Textarea\n value={prefs.default_system_prompt}\n onChange={(e) => patch({ default_system_prompt: e.target.value })}\n rows={3}\n className=\"resize-none\"\n />\n </SettingsField>\n\n <SettingsField label=\"History Limit\">\n <Input\n type=\"number\"\n value={prefs.default_history_limit}\n onChange={(e) => patch({ default_history_limit: Number(e.target.value) })}\n min={1}\n max={50}\n />\n </SettingsField>\n </SettingsSection>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Bot } from \"lucide-react\"\nimport { toast } from \"sonner\"\n\nimport { models, preferences } from \"@/lib/api\"\nimport { defaultUserPreferences } from \"@/lib/schemas/preferences\"\n\nimport { ModelSelect, SettingsField, SettingsSection } from \"./shared\"\n\nexport function ModelsSection() {\n const { data: prefsServer } = preferences.useGet()\n const prefs = prefsServer ?? defaultUserPreferences\n const update = preferences.useUpdate()\n const { data: modelsData, isLoading } = models.useList()\n\n const modelOptions = React.useMemo(() => {\n if (!Array.isArray(modelsData)) return []\n return modelsData.map((m) => ({ name: m.name, provider: m.provider ?? undefined }))\n }, [modelsData])\n\n const patch = (p: Parameters<typeof update.mutate>[0]) =>\n update.mutate(p, { onError: (e) => toast.error(e.message || \"Failed to save\") })\n\n return (\n <SettingsSection\n icon={Bot}\n title=\"Default Models\"\n description=\"Models used when a conversation does not override them.\"\n >\n <SettingsField label=\"Chat Model\" description=\"Default model for new conversations.\">\n <ModelSelect\n value={prefs.default_model}\n onValueChange={(v) => patch({ default_model: v })}\n models={modelOptions}\n isLoading={isLoading}\n placeholder={isLoading ? \"Loading...\" : \"Select model\"}\n />\n </SettingsField>\n\n <SettingsField label=\"Summary Model\" description=\"Model for titles and summaries.\">\n <ModelSelect\n value={prefs.default_summary_model}\n onValueChange={(v) => patch({ default_summary_model: v })}\n models={modelOptions}\n isLoading={isLoading}\n placeholder={isLoading ? \"Loading...\" : \"Select model\"}\n />\n </SettingsField>\n </SettingsSection>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { User } from \"lucide-react\"\nimport { toast } from \"sonner\"\n\nimport { preferences } from \"@/lib/api/preferences\"\nimport { defaultUserPreferences } from \"@/lib/schemas/preferences\"\nimport { Input } from \"@/components/ui/input\"\nimport { cn } from \"@/lib/utils\"\n\nimport { SettingsField, SettingsSection } from \"./shared\"\n\nconst AVATAR_OPTIONS = [\n \"👤\", \"😀\", \"😎\", \"🤖\", \"🦊\", \"🐱\", \"🐶\", \"🦁\",\n \"🐼\", \"🐨\", \"🐸\", \"🦄\", \"🌟\", \"💫\", \"🎯\", \"🚀\",\n]\n\nexport function ProfileSection() {\n const { data: prefsServer } = preferences.useGet()\n const prefs = prefsServer ?? defaultUserPreferences\n const update = preferences.useUpdate()\n\n const patch = (p: Parameters<typeof update.mutate>[0]) =>\n update.mutate(p, { onError: (e) => toast.error(e.message || \"Failed to save\") })\n\n return (\n <SettingsSection\n icon={User}\n title=\"User Profile\"\n description=\"The display name and avatar shown across the app.\"\n >\n <SettingsField\n label=\"Display Name\"\n description=\"Shown in the header, chat messages, and conversation list.\"\n >\n <Input\n value={prefs.user_name}\n onChange={(e) => patch({ user_name: e.target.value })}\n placeholder=\"Your name\"\n />\n </SettingsField>\n\n <SettingsField label=\"Avatar\" description=\"Pick an emoji avatar.\" stacked>\n <div className=\"flex flex-wrap gap-1.5\">\n {AVATAR_OPTIONS.map((emoji) => (\n <button\n key={emoji}\n type=\"button\"\n onClick={() => patch({ user_avatar: emoji })}\n className={cn(\n \"flex h-9 w-9 items-center justify-center rounded-lg border text-lg transition-all hover:bg-muted\",\n prefs.user_avatar === emoji\n ? \"border-primary bg-primary/10 ring-2 ring-primary/20\"\n : \"border-transparent\"\n )}\n >\n {emoji}\n </button>\n ))}\n </div>\n </SettingsField>\n </SettingsSection>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Timer } from \"lucide-react\"\nimport { toast } from \"sonner\"\n\nimport { preferences } from \"@/lib/api\"\nimport { defaultUserPreferences } from \"@/lib/schemas/preferences\"\nimport { Input } from \"@/components/ui/input\"\n\nimport { SettingsField, SettingsSection } from \"./shared\"\n\n/**\n * Per-user timeout overrides. These wall-clock bounds replace the\n * system defaults for the calling user only, so anyone hitting the\n * gateway with their own session (or an API key tied to their\n * account) gets the budget they configured here. MCP `connect_timeout`\n * applies to user-triggered re-checks; background validations from\n * CRUD use the system default.\n */\nexport function TimeoutsSection() {\n const { data: prefsServer } = preferences.useGet()\n const prefs = prefsServer ?? defaultUserPreferences\n const update = preferences.useUpdate()\n\n // Debounced commit so typing a 4-digit number doesn't spam the\n // PATCH endpoint. Local mirror reflects the input instantly.\n const [gatewayInput, setGatewayInput] = React.useState(String(prefs.gateway_timeout_seconds))\n const [mcpInput, setMcpInput] = React.useState(String(prefs.mcp_connect_timeout_seconds))\n React.useEffect(() => { setGatewayInput(String(prefs.gateway_timeout_seconds)) }, [prefs.gateway_timeout_seconds])\n React.useEffect(() => { setMcpInput(String(prefs.mcp_connect_timeout_seconds)) }, [prefs.mcp_connect_timeout_seconds])\n\n const commit = (\n key: \"gateway_timeout_seconds\" | \"mcp_connect_timeout_seconds\",\n raw: string,\n ) => {\n const trimmed = raw.trim()\n if (!trimmed) return\n const n = Number(trimmed)\n if (!Number.isFinite(n) || n < 1 || n > 86_400) {\n toast.error(\"Timeout must be between 1 and 86400 seconds\")\n return\n }\n const next = Math.floor(n)\n if (next === prefs[key]) return\n update.mutate(\n { [key]: next },\n { onError: (e) => toast.error(e.message || \"Failed to save\") },\n )\n }\n\n return (\n <SettingsSection\n icon={Timer}\n title=\"Timeouts\"\n description=\"Wall-clock budgets for upstream calls. Bumped from the legacy 60 s defaults — slow networks and reasoning models routinely need minutes.\"\n >\n <SettingsField\n label=\"Gateway request (seconds)\"\n description=\"Chat, image, embedding, audio, rerank, video — every API call the gateway forwards.\"\n >\n <Input\n type=\"number\"\n min={1}\n max={86_400}\n value={gatewayInput}\n onChange={(e) => setGatewayInput(e.target.value)}\n onBlur={(e) => commit(\"gateway_timeout_seconds\", e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") (e.target as HTMLInputElement).blur()\n }}\n className=\"w-32 text-right\"\n />\n </SettingsField>\n\n <SettingsField\n label=\"MCP connect (seconds)\"\n description=\"JSON-RPC initialize handshake — includes `npx`/`uvx`/`bunx` package download on cold cache. Applies to the re-check button you trigger from MCP details.\"\n >\n <Input\n type=\"number\"\n min={1}\n max={86_400}\n value={mcpInput}\n onChange={(e) => setMcpInput(e.target.value)}\n onBlur={(e) => commit(\"mcp_connect_timeout_seconds\", e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") (e.target as HTMLInputElement).blur()\n }}\n className=\"w-32 text-right\"\n />\n </SettingsField>\n </SettingsSection>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { toast } from \"sonner\"\nimport { Loader2 } from \"lucide-react\"\n\nimport { tools } from \"@/lib/api\"\nimport type { ToolCreateInput, ToolDTO } from \"@/lib/schemas/tool\"\n\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Label } from \"@/components/ui/label\"\nimport { Switch } from \"@/components/ui/switch\"\nimport { Textarea } from \"@/components/ui/textarea\"\n\ninterface Props {\n open: boolean\n onOpenChange: (open: boolean) => void\n mode: \"create\" | \"edit\"\n tool?: ToolDTO | null\n}\n\nconst DEFAULT_PARAMETERS = `{\n \"type\": \"object\",\n \"properties\": {},\n \"required\": []\n}`\n\nexport function ToolFormDialog({ open, onOpenChange, mode, tool }: Props) {\n const [name, setName] = React.useState(\"\")\n const [description, setDescription] = React.useState(\"\")\n const [parameters, setParameters] = React.useState(DEFAULT_PARAMETERS)\n const [webhookUrl, setWebhookUrl] = React.useState(\"\")\n const [enabled, setEnabled] = React.useState(true)\n const [parseError, setParseError] = React.useState<string | null>(null)\n\n React.useEffect(() => {\n if (!open) return\n if (tool) {\n setName(tool.name)\n setDescription(tool.description ?? \"\")\n setParameters(JSON.stringify(tool.parameters ?? {}, null, 2))\n setWebhookUrl(tool.webhook_url ?? \"\")\n setEnabled(tool.enabled !== false)\n } else {\n setName(\"\")\n setDescription(\"\")\n setParameters(DEFAULT_PARAMETERS)\n setWebhookUrl(\"\")\n setEnabled(true)\n }\n setParseError(null)\n }, [open, tool])\n\n const createMutation = tools.useCreate({\n onSuccess: () => {\n toast.success(\"Saved\")\n onOpenChange(false)\n },\n onError: (e) => toast.error(e.message || \"Save failed\"),\n })\n\n const updateMutation = tools.useUpdate({\n onSuccess: () => {\n toast.success(\"Saved\")\n onOpenChange(false)\n },\n onError: (e) => toast.error(e.message || \"Save failed\"),\n })\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n if (!name.trim()) return toast.error(\"Name required\")\n\n let params: Record<string, unknown> = {}\n try {\n params = parameters.trim() ? JSON.parse(parameters) : {}\n setParseError(null)\n } catch (err) {\n setParseError(err instanceof Error ? err.message : \"Invalid JSON\")\n return\n }\n\n const payload: ToolCreateInput = {\n name: name.trim(),\n description: description.trim(),\n parameters: params,\n webhook_url: webhookUrl.trim() || null,\n enabled,\n }\n\n if (mode === \"create\") createMutation.mutate(payload)\n else if (tool) updateMutation.mutate({ id: tool.id, data: payload })\n }\n\n const isLoading = createMutation.isPending || updateMutation.isPending\n const title = mode === \"create\" ? \"Add tool\" : \"Edit\"\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className=\"sm:max-w-[640px] max-h-[90vh] overflow-y-auto\"\n onOpenAutoFocus={mode === \"edit\" ? (e) => e.preventDefault() : undefined}\n >\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n </DialogHeader>\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"grid sm:grid-cols-2 gap-3\">\n <Field label=\"Name\" htmlFor=\"t-name\">\n <Input\n id=\"t-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"get_weather\"\n className=\"h-9 text-sm font-mono\"\n />\n </Field>\n <Field label=\"Webhook URL\" htmlFor=\"t-webhook\">\n <Input\n id=\"t-webhook\"\n value={webhookUrl}\n onChange={(e) => setWebhookUrl(e.target.value)}\n placeholder=\"https://…\"\n className=\"h-9 text-sm font-mono\"\n />\n </Field>\n </div>\n\n <Field label=\"Description\" htmlFor=\"t-desc\">\n <Input\n id=\"t-desc\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n className=\"h-9 text-sm\"\n />\n </Field>\n\n <Field label=\"Parameters (JSON Schema)\" htmlFor=\"t-params\">\n <Textarea\n id=\"t-params\"\n value={parameters}\n onChange={(e) => setParameters(e.target.value)}\n rows={10}\n className=\"text-xs font-mono\"\n />\n {parseError && <span className=\"text-xs text-destructive\">{parseError}</span>}\n </Field>\n\n <div className=\"flex items-center justify-between\">\n <Label htmlFor=\"t-enabled\" className=\"text-xs\">Enabled</Label>\n <Switch id=\"t-enabled\" checked={enabled} onCheckedChange={setEnabled} />\n </div>\n\n <div className=\"flex items-center justify-end gap-2 pt-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => onOpenChange(false)} disabled={isLoading}>\n Cancel\n </Button>\n <Button type=\"submit\" size=\"sm\" disabled={isLoading}>\n {isLoading && <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />}\n Save\n </Button>\n </div>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n\nfunction Field({ label, htmlFor, children }: { label: string; htmlFor?: string; children: React.ReactNode }) {\n return (\n <div className=\"grid gap-1.5 min-w-0\">\n <Label htmlFor={htmlFor} className=\"text-xs\">{label}</Label>\n {children}\n </div>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Pencil, Trash2 } from \"lucide-react\"\n\nimport type { ToolDTO } from \"@/lib/schemas/tool\"\nimport { Badge } from \"@/components/ui/badge\"\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\"\n\ninterface Props {\n tools: ToolDTO[]\n onEdit?: (t: ToolDTO) => void\n onDelete?: (t: ToolDTO) => void\n}\n\nexport function ToolsTable({ tools, onEdit, onDelete }: Props) {\n const showActions = !!onEdit || !!onDelete\n const colCount = showActions ? 5 : 4\n\n return (\n <DataTableShell>\n <DataTableHeader>\n <DataTableHeaderRow>\n <DataTableHead>Name</DataTableHead>\n <DataTableHead>Description</DataTableHead>\n <DataTableHead>Webhook</DataTableHead>\n <DataTableHead>Status</DataTableHead>\n {showActions && <DataTableHead className=\"w-[88px] text-right\">Actions</DataTableHead>}\n </DataTableHeaderRow>\n </DataTableHeader>\n <DataTableBody>\n {tools.length === 0 ? (\n <DataTableEmpty colSpan={colCount}>No tools registered yet.</DataTableEmpty>\n ) : (\n tools.map((t) => (\n <DataTableRow key={t.id}>\n <DataTableCell className=\"font-mono text-xs max-w-[200px] truncate\" title={t.name}>\n {t.name}\n </DataTableCell>\n <DataTableCell className=\"text-xs text-muted-foreground max-w-[320px] truncate\" title={t.description}>\n {t.description || \"—\"}\n </DataTableCell>\n <DataTableCell className=\"text-xs font-mono text-muted-foreground max-w-[260px] truncate\" title={t.webhook_url ?? undefined}>\n {t.webhook_url ?? <span className=\"italic\">none</span>}\n </DataTableCell>\n <DataTableCell>\n <Badge variant={t.enabled ? \"default\" : \"secondary\"} className=\"text-[10px] uppercase\">\n {t.enabled ? \"on\" : \"off\"}\n </Badge>\n </DataTableCell>\n {showActions && (\n <DataTableCell className=\"text-right\">\n <div className=\"flex items-center justify-end gap-1\">\n {onEdit && (\n <Button variant=\"ghost\" size=\"icon\" className=\"h-7 w-7\" onClick={() => onEdit(t)} title=\"Edit\">\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-destructive hover:text-destructive\"\n onClick={() => onDelete(t)}\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 { Plus, Wrench } from \"lucide-react\"\nimport { toast } from \"sonner\"\n\nimport { tools } from \"@/lib/api/tools\"\nimport type { ToolDTO } from \"@/lib/schemas/tool\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { ConfirmDialog } from \"@/components/ui/confirm-dialog\"\nimport { ToolFormDialog } from \"@/components/tools/tool-form-dialog\"\nimport { ToolsTable } from \"@/components/tools/tools-table\"\n\nimport { SettingsSection } from \"./shared\"\n\ntype ToolDialogState = { open: boolean; mode: \"create\" | \"edit\"; tool?: ToolDTO | null }\n\n/** Hand-written JSON Schema function tools. Settings-only because MCP\n * is the headline path; this is an escape hatch for one-off webhook-\n * backed tools that don't justify spinning up an MCP server. */\nexport function ToolsSection() {\n const { data: list } = tools.useList()\n const [dialog, setDialog] = React.useState<ToolDialogState>({ open: false, mode: \"create\" })\n const [deleting, setDeleting] = React.useState<ToolDTO | null>(null)\n\n const deleteMutation = tools.useDelete({\n onSuccess: () => {\n toast.success(\"Tool deleted\")\n setDeleting(null)\n },\n onError: (e) => toast.error(e.message || \"Delete failed\"),\n })\n\n const items = list ?? []\n\n return (\n <SettingsSection\n icon={Wrench}\n title=\"Custom tools\"\n action={\n <Button\n size=\"sm\"\n variant=\"secondary\"\n onClick={() => setDialog({ open: true, mode: \"create\" })}\n >\n <Plus className=\"h-3.5 w-3.5 mr-1\" />\n Add tool\n </Button>\n }\n >\n <div className=\"border rounded-lg overflow-hidden\">\n <ToolsTable\n tools={items}\n onEdit={(t) => setDialog({ open: true, mode: \"edit\", tool: t })}\n onDelete={setDeleting}\n />\n </div>\n\n <ToolFormDialog\n open={dialog.open}\n onOpenChange={(open) => setDialog((s) => ({ ...s, open }))}\n mode={dialog.mode}\n tool={dialog.tool}\n />\n\n <ConfirmDialog\n open={!!deleting}\n onOpenChange={(o) => !o && setDeleting(null)}\n title=\"Delete tool?\"\n description={<>This will delete <b>{deleting?.name}</b>.</>}\n confirmLabel=\"Delete\"\n destructive\n isLoading={deleteMutation.isPending}\n onConfirm={() => deleting && deleteMutation.mutate(deleting.id)}\n />\n </SettingsSection>\n )\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '20', height: '14', x: '2', y: '3', rx: '2', key: '48i651' }],\n ['line', { x1: '8', x2: '16', y1: '21', y2: '21', key: '1svkeh' }],\n ['line', { x1: '12', x2: '12', y1: '17', y2: '21', key: 'vw1qmm' }],\n];\n\n/**\n * @component @name Monitor\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIHg9IjIiIHk9IjMiIHJ4PSIyIiAvPgogIDxsaW5lIHgxPSI4IiB4Mj0iMTYiIHkxPSIyMSIgeTI9IjIxIiAvPgogIDxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iMTciIHkyPSIyMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/monitor\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 Monitor = createLucideIcon('monitor', __iconNode);\n\nexport default Monitor;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M10 8h4', key: '1sr2af' }],\n ['path', { d: 'M12 21v-9', key: '17s77i' }],\n ['path', { d: 'M12 8V3', key: '13r4qs' }],\n ['path', { d: 'M17 16h4', key: 'h1uq16' }],\n ['path', { d: 'M19 12V3', key: 'o1uvq1' }],\n ['path', { d: 'M19 21v-5', key: 'qua636' }],\n ['path', { d: 'M3 14h4', key: 'bcjad9' }],\n ['path', { d: 'M5 10V3', key: 'cb8scm' }],\n ['path', { d: 'M5 21v-7', key: '1w1uti' }],\n];\n\n/**\n * @component @name SlidersVertical\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAgOGg0IiAvPgogIDxwYXRoIGQ9Ik0xMiAyMXYtOSIgLz4KICA8cGF0aCBkPSJNMTIgOFYzIiAvPgogIDxwYXRoIGQ9Ik0xNyAxNmg0IiAvPgogIDxwYXRoIGQ9Ik0xOSAxMlYzIiAvPgogIDxwYXRoIGQ9Ik0xOSAyMXYtNSIgLz4KICA8cGF0aCBkPSJNMyAxNGg0IiAvPgogIDxwYXRoIGQ9Ik01IDEwVjMiIC8+CiAgPHBhdGggZD0iTTUgMjF2LTciIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/sliders-vertical\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 SlidersVertical = createLucideIcon('sliders-vertical', __iconNode);\n\nexport default SlidersVertical;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['line', { x1: '10', x2: '14', y1: '2', y2: '2', key: '14vaq8' }],\n ['line', { x1: '12', x2: '15', y1: '14', y2: '11', key: '17fdiu' }],\n ['circle', { cx: '12', cy: '14', r: '8', key: '1e1u0o' }],\n];\n\n/**\n * @component @name Timer\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8bGluZSB4MT0iMTAiIHgyPSIxNCIgeTE9IjIiIHkyPSIyIiAvPgogIDxsaW5lIHgxPSIxMiIgeDI9IjE1IiB5MT0iMTQiIHkyPSIxMSIgLz4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjE0IiByPSI4IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/timer\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 Timer = createLucideIcon('timer', __iconNode);\n\nexport default Timer;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '4', key: '4exip2' }],\n ['path', { d: 'M12 2v2', key: 'tus03m' }],\n ['path', { d: 'M12 20v2', key: '1lh1kg' }],\n ['path', { d: 'm4.93 4.93 1.41 1.41', key: '149t6j' }],\n ['path', { d: 'm17.66 17.66 1.41 1.41', key: 'ptbguv' }],\n ['path', { d: 'M2 12h2', key: '1t8f8n' }],\n ['path', { d: 'M20 12h2', key: '1q8mjw' }],\n ['path', { d: 'm6.34 17.66-1.41 1.41', key: '1m8zz5' }],\n ['path', { d: 'm19.07 4.93-1.41 1.41', key: '1shlcs' }],\n];\n\n/**\n * @component @name Sun\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI0IiAvPgogIDxwYXRoIGQ9Ik0xMiAydjIiIC8+CiAgPHBhdGggZD0iTTEyIDIwdjIiIC8+CiAgPHBhdGggZD0ibTQuOTMgNC45MyAxLjQxIDEuNDEiIC8+CiAgPHBhdGggZD0ibTE3LjY2IDE3LjY2IDEuNDEgMS40MSIgLz4KICA8cGF0aCBkPSJNMiAxMmgyIiAvPgogIDxwYXRoIGQ9Ik0yMCAxMmgyIiAvPgogIDxwYXRoIGQ9Im02LjM0IDE3LjY2LTEuNDEgMS40MSIgLz4KICA8cGF0aCBkPSJtMTkuMDcgNC45My0xLjQxIDEuNDEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/sun\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 Sun = createLucideIcon('sun', __iconNode);\n\nexport default Sun;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z',\n key: 'e79jfc',\n },\n ],\n ['circle', { cx: '13.5', cy: '6.5', r: '.5', fill: 'currentColor', key: '1okk4w' }],\n ['circle', { cx: '17.5', cy: '10.5', r: '.5', fill: 'currentColor', key: 'f64h9f' }],\n ['circle', { cx: '6.5', cy: '12.5', r: '.5', fill: 'currentColor', key: 'qy21gx' }],\n ['circle', { cx: '8.5', cy: '7.5', r: '.5', fill: 'currentColor', key: 'fotxhn' }],\n];\n\n/**\n * @component @name Palette\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgMjJhMSAxIDAgMCAxIDAtMjAgMTAgOSAwIDAgMSAxMCA5IDUgNSAwIDAgMS01IDVoLTIuMjVhMS43NSAxLjc1IDAgMCAwLTEuNCAyLjhsLjMuNGExLjc1IDEuNzUgMCAwIDEtMS40IDIuOHoiIC8+CiAgPGNpcmNsZSBjeD0iMTMuNSIgY3k9IjYuNSIgcj0iLjUiIGZpbGw9ImN1cnJlbnRDb2xvciIgLz4KICA8Y2lyY2xlIGN4PSIxNy41IiBjeT0iMTAuNSIgcj0iLjUiIGZpbGw9ImN1cnJlbnRDb2xvciIgLz4KICA8Y2lyY2xlIGN4PSI2LjUiIGN5PSIxMi41IiByPSIuNSIgZmlsbD0iY3VycmVudENvbG9yIiAvPgogIDxjaXJjbGUgY3g9IjguNSIgY3k9IjcuNSIgcj0iLjUiIGZpbGw9ImN1cnJlbnRDb2xvciIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/palette\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 Palette = createLucideIcon('palette', __iconNode);\n\nexport default Palette;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401',\n key: 'kfwtm',\n },\n ],\n];\n\n/**\n * @component @name Moon\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAuOTg1IDEyLjQ4NmE5IDkgMCAxIDEtOS40NzMtOS40NzJjLjQwNS0uMDIyLjYxNy40Ni40MDIuODAzYTYgNiAwIDAgMCA4LjI2OCA4LjI2OGMuMzQ0LS4yMTUuODI1LS4wMDQuODAzLjQwMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/moon\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 Moon = createLucideIcon('moon', __iconNode);\n\nexport default Moon;\n"],"names":["__iconNode","key","cy","fill","r","cx"],"mappings":"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","ignoreList":[11,12,13,14,15,16]}