vibepulse 0.2.0 → 0.2.1

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 (420) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +4 -0
  3. package/.next/build-manifest.json +2 -2
  4. package/.next/cache/.previewinfo +1 -1
  5. package/.next/cache/.rscinfo +1 -1
  6. package/.next/cache/.tsbuildinfo +1 -1
  7. package/.next/cache/config.json +3 -3
  8. package/.next/fallback-build-manifest.json +2 -2
  9. package/.next/prerender-manifest.json +3 -3
  10. package/.next/routes-manifest.json +32 -0
  11. package/.next/server/app/_global-error/page.js +1 -1
  12. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  13. package/.next/server/app/_global-error.html +2 -2
  14. package/.next/server/app/_global-error.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  16. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  17. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  18. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  19. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  20. package/.next/server/app/_not-found/page.js +1 -1
  21. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  22. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  23. package/.next/server/app/_not-found.html +1 -1
  24. package/.next/server/app/_not-found.rsc +2 -2
  25. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  26. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  27. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  28. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  29. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  30. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  31. package/.next/server/app/api/node/events/route.js +1 -1
  32. package/.next/server/app/api/node/events/route.js.nft.json +1 -1
  33. package/.next/server/app/api/node/health/route.js +1 -1
  34. package/.next/server/app/api/node/health/route.js.nft.json +1 -1
  35. package/.next/server/app/api/node/sessions/[id]/archive/route/app-paths-manifest.json +3 -0
  36. package/.next/server/app/api/node/sessions/[id]/archive/route/build-manifest.json +11 -0
  37. package/.next/server/app/api/node/sessions/[id]/archive/route/server-reference-manifest.json +4 -0
  38. package/.next/server/app/api/node/sessions/[id]/archive/route.js +6 -0
  39. package/.next/server/app/api/node/sessions/[id]/archive/route.js.map +5 -0
  40. package/.next/server/app/api/node/sessions/[id]/archive/route.js.nft.json +1 -0
  41. package/.next/server/app/api/node/sessions/[id]/archive/route_client-reference-manifest.js +2 -0
  42. package/.next/server/app/api/node/sessions/[id]/delete/route/app-paths-manifest.json +3 -0
  43. package/.next/server/app/api/node/sessions/[id]/delete/route/build-manifest.json +11 -0
  44. package/.next/server/app/api/node/sessions/[id]/delete/route/server-reference-manifest.json +4 -0
  45. package/.next/server/app/api/node/sessions/[id]/delete/route.js +7 -0
  46. package/.next/server/app/api/node/sessions/[id]/delete/route.js.map +5 -0
  47. package/.next/server/app/api/node/sessions/[id]/delete/route.js.nft.json +1 -0
  48. package/.next/server/app/api/node/sessions/[id]/delete/route_client-reference-manifest.js +2 -0
  49. package/.next/server/app/api/node/sessions/[id]/open-editor/route/app-paths-manifest.json +3 -0
  50. package/.next/server/app/api/node/sessions/[id]/open-editor/route/build-manifest.json +11 -0
  51. package/.next/server/app/api/node/sessions/[id]/open-editor/route/server-reference-manifest.json +4 -0
  52. package/.next/server/app/api/node/sessions/[id]/open-editor/route.js +7 -0
  53. package/.next/server/app/api/node/sessions/[id]/open-editor/route.js.map +5 -0
  54. package/.next/server/app/api/node/sessions/[id]/open-editor/route.js.nft.json +1 -0
  55. package/.next/server/app/api/node/sessions/[id]/open-editor/route_client-reference-manifest.js +2 -0
  56. package/.next/server/app/api/node/sessions/route.js +1 -1
  57. package/.next/server/app/api/node/sessions/route.js.nft.json +1 -1
  58. package/.next/server/app/api/opencode-events/route.js +1 -1
  59. package/.next/server/app/api/opencode-events/route.js.nft.json +1 -1
  60. package/.next/server/app/api/sessions/[id]/archive/route.js +2 -1
  61. package/.next/server/app/api/sessions/[id]/archive/route.js.nft.json +1 -1
  62. package/.next/server/app/api/sessions/[id]/delete/route.js +3 -2
  63. package/.next/server/app/api/sessions/[id]/delete/route.js.nft.json +1 -1
  64. package/.next/server/app/api/sessions/[id]/open-editor/route/app-paths-manifest.json +3 -0
  65. package/.next/server/app/api/sessions/[id]/open-editor/route/build-manifest.json +11 -0
  66. package/.next/server/app/api/sessions/[id]/open-editor/route/server-reference-manifest.json +4 -0
  67. package/.next/server/app/api/sessions/[id]/open-editor/route.js +7 -0
  68. package/.next/server/app/api/sessions/[id]/open-editor/route.js.map +5 -0
  69. package/.next/server/app/api/sessions/[id]/open-editor/route.js.nft.json +1 -0
  70. package/.next/server/app/api/sessions/[id]/open-editor/route_client-reference-manifest.js +2 -0
  71. package/.next/server/app/api/sessions/route.js +1 -1
  72. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  73. package/.next/server/app/index.html +1 -1
  74. package/.next/server/app/index.rsc +3 -3
  75. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  76. package/.next/server/app/index.segments/_full.segment.rsc +3 -3
  77. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  78. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  79. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  80. package/.next/server/app/page.js +1 -1
  81. package/.next/server/app/page.js.nft.json +1 -1
  82. package/.next/server/app/page_client-reference-manifest.js +1 -1
  83. package/.next/server/app-paths-manifest.json +4 -0
  84. package/.next/server/chunks/[root-of-the-server]__1211da38._.js +3 -0
  85. package/.next/server/chunks/[root-of-the-server]__1211da38._.js.map +1 -0
  86. package/.next/{standalone/.next/server/chunks/[root-of-the-server]__b698889b._.js → server/chunks/[root-of-the-server]__1b87ec42._.js} +2 -2
  87. package/.next/server/chunks/[root-of-the-server]__1b87ec42._.js.map +1 -0
  88. package/.next/server/chunks/[root-of-the-server]__2b526e7a._.js +3 -0
  89. package/.next/server/chunks/[root-of-the-server]__2b526e7a._.js.map +1 -0
  90. package/.next/server/chunks/[root-of-the-server]__2f981540._.js +3 -0
  91. package/.next/server/chunks/[root-of-the-server]__2f981540._.js.map +1 -0
  92. package/.next/server/chunks/[root-of-the-server]__3745b314._.js +3 -0
  93. package/.next/server/chunks/[root-of-the-server]__3745b314._.js.map +1 -0
  94. package/.next/server/chunks/[root-of-the-server]__56690af0._.js +1 -1
  95. package/.next/server/chunks/[root-of-the-server]__56690af0._.js.map +1 -1
  96. package/.next/server/chunks/[root-of-the-server]__56f5f249._.js +1 -1
  97. package/.next/server/chunks/[root-of-the-server]__56f5f249._.js.map +1 -1
  98. package/.next/server/chunks/[root-of-the-server]__59175de4._.js +1 -1
  99. package/.next/server/chunks/[root-of-the-server]__59175de4._.js.map +1 -1
  100. package/.next/server/chunks/[root-of-the-server]__64fffc02._.js +1 -1
  101. package/.next/server/chunks/[root-of-the-server]__64fffc02._.js.map +1 -1
  102. package/.next/server/chunks/[root-of-the-server]__6c428a24._.js +3 -0
  103. package/.next/server/chunks/[root-of-the-server]__6c428a24._.js.map +1 -0
  104. package/.next/server/chunks/[root-of-the-server]__73a00b88._.js +3 -0
  105. package/.next/server/chunks/[root-of-the-server]__73a00b88._.js.map +1 -0
  106. package/.next/server/chunks/[root-of-the-server]__89c5eeab._.js +1 -1
  107. package/.next/server/chunks/[root-of-the-server]__89c5eeab._.js.map +1 -1
  108. package/.next/server/chunks/[root-of-the-server]__8da6c5a8._.js +1 -1
  109. package/.next/server/chunks/[root-of-the-server]__8da6c5a8._.js.map +1 -1
  110. package/.next/server/chunks/[root-of-the-server]__b796d06c._.js +1 -1
  111. package/.next/server/chunks/[root-of-the-server]__b796d06c._.js.map +1 -1
  112. package/.next/server/chunks/[root-of-the-server]__c2ce5c0f._.js +1 -1
  113. package/.next/server/chunks/[root-of-the-server]__c2ce5c0f._.js.map +1 -1
  114. package/.next/server/chunks/[root-of-the-server]__d8e61048._.js +3 -0
  115. package/.next/server/chunks/[root-of-the-server]__d8e61048._.js.map +1 -0
  116. package/.next/server/chunks/[root-of-the-server]__db285678._.js +3 -0
  117. package/.next/server/chunks/[root-of-the-server]__db285678._.js.map +1 -0
  118. package/.next/{standalone/.next/server/chunks/[root-of-the-server]__16a9eb0a._.js → server/chunks/[root-of-the-server]__e00a9200._.js} +2 -2
  119. package/.next/server/chunks/{[root-of-the-server]__16a9eb0a._.js.map → [root-of-the-server]__e00a9200._.js.map} +1 -1
  120. package/.next/server/chunks/[root-of-the-server]__e5df5e5f._.js +3 -0
  121. package/.next/server/chunks/[root-of-the-server]__e5df5e5f._.js.map +1 -0
  122. package/.next/server/chunks/_next-internal_server_app_api_node_sessions_[id]_archive_route_actions_237255a5.js +3 -0
  123. package/.next/server/chunks/_next-internal_server_app_api_node_sessions_[id]_archive_route_actions_237255a5.js.map +1 -0
  124. package/.next/server/chunks/_next-internal_server_app_api_node_sessions_[id]_delete_route_actions_e5d426f6.js +3 -0
  125. package/.next/server/chunks/_next-internal_server_app_api_node_sessions_[id]_delete_route_actions_e5d426f6.js.map +1 -0
  126. package/.next/server/chunks/_next-internal_server_app_api_sessions_[id]_open-editor_route_actions_eaebf476.js +3 -0
  127. package/.next/server/chunks/_next-internal_server_app_api_sessions_[id]_open-editor_route_actions_eaebf476.js.map +1 -0
  128. package/.next/server/chunks/ce889_server_app_api_node_sessions_[id]_open-editor_route_actions_791cdf5b.js +3 -0
  129. package/.next/server/chunks/ce889_server_app_api_node_sessions_[id]_open-editor_route_actions_791cdf5b.js.map +1 -0
  130. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_7e181e75.js +1 -1
  131. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_7e181e75.js.map +1 -1
  132. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_b054aff3.js +1 -1
  133. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_b054aff3.js.map +1 -1
  134. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_fa835ac3.js +2 -2
  135. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_fa835ac3.js.map +1 -1
  136. package/.next/server/chunks/ssr/{[root-of-the-server]__efc52f08._.js → [root-of-the-server]__631e12d0._.js} +2 -2
  137. package/.next/server/chunks/ssr/[root-of-the-server]__a8cd3911._.js +3 -0
  138. package/.next/server/chunks/ssr/src_app_page_tsx_a7111f3e._.js +3 -3
  139. package/.next/server/chunks/ssr/src_app_page_tsx_a7111f3e._.js.map +1 -1
  140. package/.next/server/pages/404.html +1 -1
  141. package/.next/server/pages/500.html +2 -2
  142. package/.next/server/server-reference-manifest.js +1 -1
  143. package/.next/server/server-reference-manifest.json +1 -1
  144. package/.next/standalone/.next/BUILD_ID +1 -1
  145. package/.next/standalone/.next/app-path-routes-manifest.json +4 -0
  146. package/.next/standalone/.next/build-manifest.json +2 -2
  147. package/.next/standalone/.next/prerender-manifest.json +3 -3
  148. package/.next/standalone/.next/routes-manifest.json +32 -0
  149. package/.next/standalone/.next/server/app/_global-error/page.js +1 -1
  150. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  151. package/.next/standalone/.next/server/app/_global-error.html +2 -2
  152. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  153. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  154. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  155. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  156. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  157. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  158. package/.next/standalone/.next/server/app/_not-found/page.js +1 -1
  159. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  160. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  161. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  162. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  163. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  164. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  165. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  166. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  167. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  168. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  169. package/.next/standalone/.next/server/app/api/node/events/route.js +1 -1
  170. package/.next/standalone/.next/server/app/api/node/events/route.js.nft.json +1 -1
  171. package/.next/standalone/.next/server/app/api/node/health/route.js +1 -1
  172. package/.next/standalone/.next/server/app/api/node/health/route.js.nft.json +1 -1
  173. package/.next/standalone/.next/server/app/api/node/sessions/[id]/archive/route/app-paths-manifest.json +3 -0
  174. package/.next/standalone/.next/server/app/api/node/sessions/[id]/archive/route/build-manifest.json +11 -0
  175. package/.next/standalone/.next/server/app/api/node/sessions/[id]/archive/route/server-reference-manifest.json +4 -0
  176. package/.next/standalone/.next/server/app/api/node/sessions/[id]/archive/route.js +6 -0
  177. package/.next/standalone/.next/server/app/api/node/sessions/[id]/archive/route.js.map +5 -0
  178. package/.next/standalone/.next/server/app/api/node/sessions/[id]/archive/route.js.nft.json +1 -0
  179. package/.next/standalone/.next/server/app/api/node/sessions/[id]/archive/route_client-reference-manifest.js +2 -0
  180. package/.next/standalone/.next/server/app/api/node/sessions/[id]/delete/route/app-paths-manifest.json +3 -0
  181. package/.next/standalone/.next/server/app/api/node/sessions/[id]/delete/route/build-manifest.json +11 -0
  182. package/.next/standalone/.next/server/app/api/node/sessions/[id]/delete/route/server-reference-manifest.json +4 -0
  183. package/.next/standalone/.next/server/app/api/node/sessions/[id]/delete/route.js +7 -0
  184. package/.next/standalone/.next/server/app/api/node/sessions/[id]/delete/route.js.map +5 -0
  185. package/.next/standalone/.next/server/app/api/node/sessions/[id]/delete/route.js.nft.json +1 -0
  186. package/.next/standalone/.next/server/app/api/node/sessions/[id]/delete/route_client-reference-manifest.js +2 -0
  187. package/.next/standalone/.next/server/app/api/node/sessions/[id]/open-editor/route/app-paths-manifest.json +3 -0
  188. package/.next/standalone/.next/server/app/api/node/sessions/[id]/open-editor/route/build-manifest.json +11 -0
  189. package/.next/standalone/.next/server/app/api/node/sessions/[id]/open-editor/route/server-reference-manifest.json +4 -0
  190. package/.next/standalone/.next/server/app/api/node/sessions/[id]/open-editor/route.js +7 -0
  191. package/.next/standalone/.next/server/app/api/node/sessions/[id]/open-editor/route.js.map +5 -0
  192. package/.next/standalone/.next/server/app/api/node/sessions/[id]/open-editor/route.js.nft.json +1 -0
  193. package/.next/standalone/.next/server/app/api/node/sessions/[id]/open-editor/route_client-reference-manifest.js +2 -0
  194. package/.next/standalone/.next/server/app/api/node/sessions/route.js +1 -1
  195. package/.next/standalone/.next/server/app/api/node/sessions/route.js.nft.json +1 -1
  196. package/.next/standalone/.next/server/app/api/opencode-events/route.js +1 -1
  197. package/.next/standalone/.next/server/app/api/opencode-events/route.js.nft.json +1 -1
  198. package/.next/standalone/.next/server/app/api/sessions/[id]/archive/route.js +2 -1
  199. package/.next/standalone/.next/server/app/api/sessions/[id]/archive/route.js.nft.json +1 -1
  200. package/.next/standalone/.next/server/app/api/sessions/[id]/delete/route.js +3 -2
  201. package/.next/standalone/.next/server/app/api/sessions/[id]/delete/route.js.nft.json +1 -1
  202. package/.next/standalone/.next/server/app/api/sessions/[id]/open-editor/route/app-paths-manifest.json +3 -0
  203. package/.next/standalone/.next/server/app/api/sessions/[id]/open-editor/route/build-manifest.json +11 -0
  204. package/.next/standalone/.next/server/app/api/sessions/[id]/open-editor/route/server-reference-manifest.json +4 -0
  205. package/.next/standalone/.next/server/app/api/sessions/[id]/open-editor/route.js +7 -0
  206. package/.next/standalone/.next/server/app/api/sessions/[id]/open-editor/route.js.map +5 -0
  207. package/.next/standalone/.next/server/app/api/sessions/[id]/open-editor/route.js.nft.json +1 -0
  208. package/.next/standalone/.next/server/app/api/sessions/[id]/open-editor/route_client-reference-manifest.js +2 -0
  209. package/.next/standalone/.next/server/app/api/sessions/route.js +1 -1
  210. package/.next/standalone/.next/server/app/api/sessions/route.js.nft.json +1 -1
  211. package/.next/standalone/.next/server/app/index.html +1 -1
  212. package/.next/standalone/.next/server/app/index.rsc +3 -3
  213. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  214. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
  215. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  216. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  217. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  218. package/.next/standalone/.next/server/app/page.js +1 -1
  219. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  220. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  221. package/.next/standalone/.next/server/app-paths-manifest.json +4 -0
  222. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1211da38._.js +3 -0
  223. package/.next/{server/chunks/[root-of-the-server]__b698889b._.js → standalone/.next/server/chunks/[root-of-the-server]__1b87ec42._.js} +2 -2
  224. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2b526e7a._.js +3 -0
  225. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2f981540._.js +3 -0
  226. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3745b314._.js +3 -0
  227. package/.next/standalone/.next/server/chunks/[root-of-the-server]__56690af0._.js +1 -1
  228. package/.next/standalone/.next/server/chunks/[root-of-the-server]__56f5f249._.js +1 -1
  229. package/.next/standalone/.next/server/chunks/[root-of-the-server]__59175de4._.js +1 -1
  230. package/.next/standalone/.next/server/chunks/[root-of-the-server]__64fffc02._.js +1 -1
  231. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6c428a24._.js +3 -0
  232. package/.next/standalone/.next/server/chunks/[root-of-the-server]__73a00b88._.js +3 -0
  233. package/.next/standalone/.next/server/chunks/[root-of-the-server]__89c5eeab._.js +1 -1
  234. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8da6c5a8._.js +1 -1
  235. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b796d06c._.js +1 -1
  236. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c2ce5c0f._.js +1 -1
  237. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d8e61048._.js +3 -0
  238. package/.next/standalone/.next/server/chunks/[root-of-the-server]__db285678._.js +3 -0
  239. package/.next/{server/chunks/[root-of-the-server]__16a9eb0a._.js → standalone/.next/server/chunks/[root-of-the-server]__e00a9200._.js} +2 -2
  240. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e5df5e5f._.js +3 -0
  241. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_node_sessions_[id]_archive_route_actions_237255a5.js +3 -0
  242. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_node_sessions_[id]_delete_route_actions_e5d426f6.js +3 -0
  243. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_sessions_[id]_open-editor_route_actions_eaebf476.js +3 -0
  244. package/.next/standalone/.next/server/chunks/ce889_server_app_api_node_sessions_[id]_open-editor_route_actions_791cdf5b.js +3 -0
  245. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_7e181e75.js +1 -1
  246. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_b054aff3.js +1 -1
  247. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_fa835ac3.js +2 -2
  248. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__efc52f08._.js → [root-of-the-server]__631e12d0._.js} +2 -2
  249. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__a8cd3911._.js +3 -0
  250. package/.next/standalone/.next/server/chunks/ssr/src_app_page_tsx_a7111f3e._.js +3 -3
  251. package/.next/standalone/.next/server/pages/404.html +1 -1
  252. package/.next/standalone/.next/server/pages/500.html +2 -2
  253. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  254. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  255. package/.next/standalone/.next/static/chunks/7ac19aaef01f4a03.js +13 -0
  256. package/.next/standalone/.next/static/chunks/f42202943f6742e5.css +3 -0
  257. package/.next/standalone/AGENTS.md +85 -0
  258. package/.next/standalone/README.md +76 -0
  259. package/.next/standalone/__mocks__/child_process.ts +4 -0
  260. package/.next/standalone/bin/dev-runtime.js +58 -0
  261. package/.next/standalone/bin/vibepulse.js +87 -0
  262. package/.next/standalone/check-hsql.mjs +71 -0
  263. package/.next/standalone/docs/session-status-detection.md +258 -0
  264. package/.next/standalone/eslint.config.mjs +31 -0
  265. package/.next/standalone/next.config.ts +8 -0
  266. package/.next/standalone/package-lock.json +10312 -0
  267. package/.next/standalone/package.json +1 -1
  268. package/.next/standalone/postcss.config.mjs +7 -0
  269. package/.next/standalone/src/AGENTS.md +41 -0
  270. package/.next/standalone/src/app/api/AGENTS.md +40 -0
  271. package/.next/standalone/src/app/api/node/events/route.test.ts +196 -0
  272. package/.next/standalone/src/app/api/node/events/route.ts +259 -0
  273. package/.next/standalone/src/app/api/node/health/route.test.ts +190 -0
  274. package/.next/standalone/src/app/api/node/health/route.ts +48 -0
  275. package/.next/standalone/src/app/api/node/sessions/[id]/archive/route.test.ts +128 -0
  276. package/.next/standalone/src/app/api/node/sessions/[id]/archive/route.ts +97 -0
  277. package/.next/standalone/src/app/api/node/sessions/[id]/delete/route.test.ts +113 -0
  278. package/.next/standalone/src/app/api/node/sessions/[id]/delete/route.ts +81 -0
  279. package/.next/standalone/src/app/api/node/sessions/[id]/open-editor/route.test.ts +206 -0
  280. package/.next/standalone/src/app/api/node/sessions/[id]/open-editor/route.ts +123 -0
  281. package/.next/standalone/src/app/api/node/sessions/route.test.ts +408 -0
  282. package/.next/standalone/src/app/api/node/sessions/route.ts +1094 -0
  283. package/.next/standalone/src/app/api/nodes/route.test.ts +237 -0
  284. package/.next/standalone/src/app/api/nodes/route.ts +176 -0
  285. package/.next/standalone/src/app/api/opencode-config/route.test.ts +86 -0
  286. package/.next/standalone/src/app/api/opencode-config/route.ts +376 -0
  287. package/.next/standalone/src/app/api/opencode-config/status/route.ts +31 -0
  288. package/.next/standalone/src/app/api/opencode-events/route.test.ts +624 -0
  289. package/.next/standalone/src/app/api/opencode-events/route.ts +508 -0
  290. package/.next/standalone/src/app/api/opencode-models/route.test.ts +167 -0
  291. package/.next/standalone/src/app/api/opencode-models/route.ts +76 -0
  292. package/.next/standalone/src/app/api/profiles/[id]/apply/route.ts +49 -0
  293. package/.next/standalone/src/app/api/profiles/[id]/export/route.ts +31 -0
  294. package/.next/standalone/src/app/api/profiles/[id]/route.ts +160 -0
  295. package/.next/standalone/src/app/api/profiles/import/route.test.js +107 -0
  296. package/.next/standalone/src/app/api/profiles/import/route.ts +65 -0
  297. package/.next/standalone/src/app/api/profiles/route.ts +107 -0
  298. package/.next/standalone/src/app/api/sessions/[id]/archive/route.test.ts +136 -0
  299. package/.next/standalone/src/app/api/sessions/[id]/archive/route.ts +170 -0
  300. package/.next/standalone/src/app/api/sessions/[id]/delete/route.test.ts +113 -0
  301. package/.next/standalone/src/app/api/sessions/[id]/delete/route.ts +137 -0
  302. package/.next/standalone/src/app/api/sessions/[id]/open-editor/route.test.ts +218 -0
  303. package/.next/standalone/src/app/api/sessions/[id]/open-editor/route.ts +85 -0
  304. package/.next/standalone/src/app/api/sessions/[id]/route.test.ts +531 -0
  305. package/.next/standalone/src/app/api/sessions/[id]/route.ts +75 -0
  306. package/.next/standalone/src/app/api/sessions/route.test.ts +1298 -0
  307. package/.next/standalone/src/app/api/sessions/route.ts +1695 -0
  308. package/.next/standalone/src/app/favicon.ico +0 -0
  309. package/.next/standalone/src/app/globals.css +66 -0
  310. package/.next/standalone/src/app/layout.tsx +37 -0
  311. package/.next/standalone/src/app/page.test.tsx +134 -0
  312. package/.next/standalone/src/app/page.tsx +358 -0
  313. package/.next/standalone/src/components/AGENTS.md +42 -0
  314. package/.next/standalone/src/components/ErrorBoundary.tsx +72 -0
  315. package/.next/standalone/src/components/KanbanBoard.test.tsx +704 -0
  316. package/.next/standalone/src/components/KanbanBoard.tsx +852 -0
  317. package/.next/standalone/src/components/LoadingState.tsx +37 -0
  318. package/.next/standalone/src/components/ProjectCard.test.tsx +773 -0
  319. package/.next/standalone/src/components/ProjectCard.tsx +595 -0
  320. package/.next/standalone/src/components/QueryProvider.tsx +25 -0
  321. package/.next/standalone/src/components/SessionCard.test.tsx +566 -0
  322. package/.next/standalone/src/components/SessionCard.tsx +434 -0
  323. package/.next/standalone/src/components/SessionList.tsx +60 -0
  324. package/.next/standalone/src/components/host-config/HostManagerDialog.test.tsx +252 -0
  325. package/.next/standalone/src/components/host-config/HostManagerDialog.tsx +476 -0
  326. package/.next/standalone/src/components/opencode-config/AgentConfigForm.test.tsx +72 -0
  327. package/.next/standalone/src/components/opencode-config/AgentConfigForm.tsx +483 -0
  328. package/.next/standalone/src/components/opencode-config/AgentModelSelector.tsx +284 -0
  329. package/.next/standalone/src/components/opencode-config/AgentsConfigPanel.tsx +162 -0
  330. package/.next/standalone/src/components/opencode-config/ConfigButton.tsx +43 -0
  331. package/.next/standalone/src/components/opencode-config/ConfigPanel.tsx +91 -0
  332. package/.next/standalone/src/components/opencode-config/FullscreenConfigPanel.tsx +435 -0
  333. package/.next/standalone/src/components/opencode-config/GeneralSettingsForm.test.tsx +91 -0
  334. package/.next/standalone/src/components/opencode-config/GeneralSettingsForm.tsx +288 -0
  335. package/.next/standalone/src/components/opencode-config/categories/CategoriesList.tsx +382 -0
  336. package/.next/standalone/src/components/opencode-config/categories/CategoriesManager.test.tsx +111 -0
  337. package/.next/standalone/src/components/opencode-config/categories/CategoriesManager.tsx +174 -0
  338. package/.next/standalone/src/components/opencode-config/categories/CategoryConfigForm.tsx +453 -0
  339. package/.next/standalone/src/components/opencode-config/profiles/ProfileCard.tsx +140 -0
  340. package/.next/standalone/src/components/opencode-config/profiles/ProfileEditor.tsx +446 -0
  341. package/.next/standalone/src/components/opencode-config/profiles/ProfileList.tsx +446 -0
  342. package/.next/standalone/src/components/opencode-config/profiles/ProfileManager.test.tsx +225 -0
  343. package/.next/standalone/src/components/opencode-config/profiles/ProfileManager.tsx +405 -0
  344. package/.next/standalone/src/components/ui/Tabs.tsx +59 -0
  345. package/.next/standalone/src/hooks/useHostSources.test.ts +509 -0
  346. package/.next/standalone/src/hooks/useHostSources.ts +299 -0
  347. package/.next/standalone/src/hooks/useOpencodeSync.test.ts +387 -0
  348. package/.next/standalone/src/hooks/useOpencodeSync.ts +571 -0
  349. package/.next/standalone/src/index.ts +2 -0
  350. package/.next/standalone/src/lib/editorLauncher.server.ts +36 -0
  351. package/.next/standalone/src/lib/editorLauncher.test.ts +35 -0
  352. package/.next/standalone/src/lib/editorLauncher.ts +25 -0
  353. package/.next/standalone/src/lib/hostAccent.test.ts +58 -0
  354. package/.next/standalone/src/lib/hostAccent.ts +46 -0
  355. package/.next/standalone/src/lib/hostIdentity.test.ts +187 -0
  356. package/.next/standalone/src/lib/hostIdentity.ts +122 -0
  357. package/.next/standalone/src/lib/hostSourcesStorage.test.ts +141 -0
  358. package/.next/standalone/src/lib/hostSourcesStorage.ts +72 -0
  359. package/.next/standalone/src/lib/nodeProtocol.test.ts +159 -0
  360. package/.next/standalone/src/lib/nodeProtocol.ts +142 -0
  361. package/.next/standalone/src/lib/nodeRegistry.test.ts +173 -0
  362. package/.next/standalone/src/lib/nodeRegistry.ts +398 -0
  363. package/.next/standalone/src/lib/notificationSound.ts +292 -0
  364. package/.next/standalone/src/lib/opencodeConfig.test.ts +100 -0
  365. package/.next/standalone/src/lib/opencodeConfig.ts +76 -0
  366. package/.next/standalone/src/lib/opencodeDiscovery.ts +275 -0
  367. package/.next/standalone/src/lib/profiles/share.test.ts +91 -0
  368. package/.next/standalone/src/lib/profiles/share.ts +93 -0
  369. package/.next/standalone/src/lib/profiles/storage.test.ts +108 -0
  370. package/.next/standalone/src/lib/profiles/storage.ts +370 -0
  371. package/.next/standalone/src/lib/runtimeMode.test.ts +29 -0
  372. package/.next/standalone/src/lib/runtimeMode.ts +29 -0
  373. package/.next/standalone/src/lib/sessionActionErrors.ts +37 -0
  374. package/.next/standalone/src/lib/sessionArchiveOverrides.test.ts +43 -0
  375. package/.next/standalone/src/lib/sessionArchiveOverrides.ts +116 -0
  376. package/.next/standalone/src/lib/transform.test.ts +121 -0
  377. package/.next/standalone/src/lib/transform.ts +193 -0
  378. package/.next/standalone/src/test/setup.ts +8 -0
  379. package/.next/standalone/src/types/index.ts +152 -0
  380. package/.next/standalone/src/types/opencodeConfig.ts +149 -0
  381. package/.next/standalone/tsconfig.json +34 -0
  382. package/.next/standalone/tsconfig.lib.json +17 -0
  383. package/.next/standalone/vitest.config.ts +16 -0
  384. package/.next/static/chunks/7ac19aaef01f4a03.js +13 -0
  385. package/.next/static/chunks/f42202943f6742e5.css +3 -0
  386. package/.next/trace +1 -1
  387. package/.next/trace-build +1 -1
  388. package/.next/types/routes.d.ts +5 -1
  389. package/.next/types/validator.ts +36 -0
  390. package/package.json +1 -1
  391. package/.next/server/chunks/[root-of-the-server]__0b017945._.js +0 -3
  392. package/.next/server/chunks/[root-of-the-server]__0b017945._.js.map +0 -1
  393. package/.next/server/chunks/[root-of-the-server]__1e118bd3._.js +0 -3
  394. package/.next/server/chunks/[root-of-the-server]__1e118bd3._.js.map +0 -1
  395. package/.next/server/chunks/[root-of-the-server]__6979e732._.js +0 -3
  396. package/.next/server/chunks/[root-of-the-server]__6979e732._.js.map +0 -1
  397. package/.next/server/chunks/[root-of-the-server]__a7b4d79d._.js +0 -3
  398. package/.next/server/chunks/[root-of-the-server]__a7b4d79d._.js.map +0 -1
  399. package/.next/server/chunks/[root-of-the-server]__b698889b._.js.map +0 -1
  400. package/.next/server/chunks/[root-of-the-server]__ddc251b7._.js +0 -3
  401. package/.next/server/chunks/[root-of-the-server]__ddc251b7._.js.map +0 -1
  402. package/.next/server/chunks/ssr/[root-of-the-server]__b0788643._.js +0 -3
  403. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0b017945._.js +0 -3
  404. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1e118bd3._.js +0 -3
  405. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6979e732._.js +0 -3
  406. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a7b4d79d._.js +0 -3
  407. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ddc251b7._.js +0 -3
  408. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__b0788643._.js +0 -3
  409. package/.next/standalone/.next/static/chunks/9f8c22002e7395e8.js +0 -13
  410. package/.next/standalone/.next/static/chunks/f1b55db60e7ed6f3.css +0 -3
  411. package/.next/static/chunks/9f8c22002e7395e8.js +0 -13
  412. package/.next/static/chunks/f1b55db60e7ed6f3.css +0 -3
  413. /package/.next/server/chunks/ssr/{[root-of-the-server]__efc52f08._.js.map → [root-of-the-server]__631e12d0._.js.map} +0 -0
  414. /package/.next/server/chunks/ssr/{[root-of-the-server]__b0788643._.js.map → [root-of-the-server]__a8cd3911._.js.map} +0 -0
  415. /package/.next/standalone/.next/static/{L_tmqf71LaeMzApO4SiU- → Fw2R3y-fHX4B2SWxNy_4X}/_buildManifest.js +0 -0
  416. /package/.next/standalone/.next/static/{L_tmqf71LaeMzApO4SiU- → Fw2R3y-fHX4B2SWxNy_4X}/_clientMiddlewareManifest.json +0 -0
  417. /package/.next/standalone/.next/static/{L_tmqf71LaeMzApO4SiU- → Fw2R3y-fHX4B2SWxNy_4X}/_ssgManifest.js +0 -0
  418. /package/.next/static/{L_tmqf71LaeMzApO4SiU- → Fw2R3y-fHX4B2SWxNy_4X}/_buildManifest.js +0 -0
  419. /package/.next/static/{L_tmqf71LaeMzApO4SiU- → Fw2R3y-fHX4B2SWxNy_4X}/_clientMiddlewareManifest.json +0 -0
  420. /package/.next/static/{L_tmqf71LaeMzApO4SiU- → Fw2R3y-fHX4B2SWxNy_4X}/_ssgManifest.js +0 -0
@@ -0,0 +1,284 @@
1
+ 'use client';
2
+
3
+ import * as React from 'react';
4
+ import * as SelectPrimitive from '@radix-ui/react-select';
5
+ import { useQuery } from '@tanstack/react-query';
6
+ import { Check, ChevronDown, Search, AlertCircle, RefreshCw } from 'lucide-react';
7
+ import { clsx, type ClassValue } from 'clsx';
8
+ import { twMerge } from 'tailwind-merge';
9
+
10
+ function cn(...inputs: ClassValue[]) {
11
+ return twMerge(clsx(inputs));
12
+ }
13
+
14
+ interface OpencodeModelsResponse {
15
+ models: string[];
16
+ source: string;
17
+ error?: string;
18
+ }
19
+
20
+ interface AgentModelSelectorProps {
21
+ value?: string;
22
+ onValueChange?: (value: string) => void;
23
+ placeholder?: string;
24
+ disabled?: boolean;
25
+ }
26
+
27
+ const SelectTrigger = React.forwardRef<
28
+ React.ComponentRef<typeof SelectPrimitive.Trigger>,
29
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>
30
+ >(({ className, children, ...props }, ref) => (
31
+ <SelectPrimitive.Trigger
32
+ ref={ref}
33
+ className={cn(
34
+ 'flex h-10 w-full items-center justify-between rounded-lg border border-zinc-200 bg-white px-3 py-2 text-sm',
35
+ 'ring-offset-white placeholder:text-zinc-500 focus:outline-none focus:ring-2 focus:ring-zinc-950 focus:ring-offset-2',
36
+ 'disabled:cursor-not-allowed disabled:opacity-50 dark:border-zinc-800 dark:bg-zinc-950 dark:ring-offset-zinc-950',
37
+ 'dark:placeholder:text-zinc-400 dark:focus:ring-zinc-300',
38
+ className
39
+ )}
40
+ {...props}
41
+ >
42
+ {children}
43
+ <SelectPrimitive.Icon asChild>
44
+ <ChevronDown className="h-4 w-4 opacity-50" />
45
+ </SelectPrimitive.Icon>
46
+ </SelectPrimitive.Trigger>
47
+ ));
48
+ SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
49
+
50
+ const SelectContent = React.forwardRef<
51
+ React.ComponentRef<typeof SelectPrimitive.Content>,
52
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>
53
+ >(({ className, children, position = 'popper', ...props }, ref) => (
54
+ <SelectPrimitive.Portal>
55
+ <SelectPrimitive.Content
56
+ ref={ref}
57
+ className={cn(
58
+ 'relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-lg border border-zinc-200 bg-white text-zinc-950 shadow-md',
59
+ 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',
60
+ 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2',
61
+ 'data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
62
+ 'dark:border-zinc-800 dark:bg-zinc-950 dark:text-zinc-50',
63
+ position === 'popper' &&
64
+ 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',
65
+ className
66
+ )}
67
+ position={position}
68
+ {...props}
69
+ >
70
+ <SelectPrimitive.Viewport
71
+ className={cn(
72
+ 'p-1',
73
+ position === 'popper' &&
74
+ 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]'
75
+ )}
76
+ >
77
+ {children}
78
+ </SelectPrimitive.Viewport>
79
+ </SelectPrimitive.Content>
80
+ </SelectPrimitive.Portal>
81
+ ));
82
+ SelectContent.displayName = SelectPrimitive.Content.displayName;
83
+
84
+ const SelectItem = React.forwardRef<
85
+ React.ComponentRef<typeof SelectPrimitive.Item>,
86
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>
87
+ >(({ className, children, ...props }, ref) => (
88
+ <SelectPrimitive.Item
89
+ ref={ref}
90
+ className={cn(
91
+ 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none',
92
+ 'focus:bg-zinc-100 focus:text-zinc-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
93
+ 'dark:focus:bg-zinc-800 dark:focus:text-zinc-50',
94
+ className
95
+ )}
96
+ {...props}
97
+ >
98
+ <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
99
+ <SelectPrimitive.ItemIndicator>
100
+ <Check className="h-4 w-4" />
101
+ </SelectPrimitive.ItemIndicator>
102
+ </span>
103
+ <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
104
+ </SelectPrimitive.Item>
105
+ ));
106
+ SelectItem.displayName = SelectPrimitive.Item.displayName;
107
+
108
+ const SelectValue = SelectPrimitive.Value;
109
+
110
+ function parseModelName(model: string): { provider: string; model: string } {
111
+ if (!model) return { provider: 'unknown', model: '' };
112
+
113
+ const slashIndex = model.indexOf('/');
114
+ if (slashIndex !== -1) {
115
+ return {
116
+ provider: model.substring(0, slashIndex),
117
+ model: model.substring(slashIndex + 1)
118
+ };
119
+ }
120
+ return { provider: 'unknown', model };
121
+ }
122
+
123
+ export function AgentModelSelector({
124
+ value,
125
+ onValueChange,
126
+ placeholder = 'Select a model...',
127
+ disabled = false,
128
+ }: AgentModelSelectorProps) {
129
+ const [searchQuery, setSearchQuery] = React.useState('');
130
+
131
+ const { data, isLoading, isError, error, refetch } = useQuery<OpencodeModelsResponse>({
132
+ queryKey: ['opencode-models'],
133
+ queryFn: async () => {
134
+ const res = await fetch('/api/opencode-models');
135
+ const data = await res.json();
136
+ if (!res.ok || data.error) {
137
+ throw new Error(data.error || 'Failed to fetch models');
138
+ }
139
+ return data;
140
+ },
141
+ retry: false,
142
+ });
143
+
144
+ // Ensure the currently selected model is in the list (for echo display)
145
+ const allModels = React.useMemo(() => {
146
+ const models = data?.models ?? [];
147
+ const modelSet = new Set(models);
148
+ if (value && !modelSet.has(value)) {
149
+ modelSet.add(value);
150
+ }
151
+ return Array.from(modelSet).sort();
152
+ }, [data?.models, value]);
153
+
154
+ const filteredModels = React.useMemo(() => {
155
+ if (!searchQuery.trim()) return allModels;
156
+ const query = searchQuery.toLowerCase();
157
+ return allModels.filter((model) => model.toLowerCase().includes(query));
158
+ }, [allModels, searchQuery]);
159
+
160
+ const groupedModels = React.useMemo(() => {
161
+ const groups: Record<string, string[]> = {};
162
+ filteredModels.forEach((model) => {
163
+ const { provider } = parseModelName(model);
164
+ if (!groups[provider]) {
165
+ groups[provider] = [];
166
+ }
167
+ groups[provider].push(model);
168
+ });
169
+ return groups;
170
+ }, [filteredModels]);
171
+
172
+ const providers = Object.keys(groupedModels).sort();
173
+
174
+ const handleOpenChange = React.useCallback((open: boolean) => {
175
+ if (!open) {
176
+ setSearchQuery('');
177
+ }
178
+ }, []);
179
+
180
+ const selectedModel = value ? parseModelName(value) : null;
181
+
182
+ return (
183
+ <SelectPrimitive.Root
184
+ value={value}
185
+ onValueChange={onValueChange}
186
+ disabled={disabled || isLoading}
187
+ onOpenChange={handleOpenChange}
188
+ >
189
+ <SelectTrigger>
190
+ <SelectValue placeholder={placeholder}>
191
+ {selectedModel && (
192
+ <span className="flex items-center gap-2">
193
+ <span className="text-xs font-medium text-zinc-500 dark:text-zinc-400">
194
+ {selectedModel.provider}
195
+ </span>
196
+ <span className="text-zinc-500 dark:text-zinc-400">/</span>
197
+ <span className="text-zinc-900 dark:text-zinc-100">
198
+ {selectedModel.model}
199
+ </span>
200
+ </span>
201
+ )}
202
+ </SelectValue>
203
+ </SelectTrigger>
204
+ <SelectContent>
205
+ <div className="sticky top-0 z-10 border-b border-zinc-200 bg-white px-2 pb-2 pt-1 dark:border-zinc-800 dark:bg-zinc-950">
206
+ <div className="relative">
207
+ <Search className="absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2 text-zinc-400" />
208
+ <input
209
+ type="text"
210
+ value={searchQuery}
211
+ onChange={(e) => setSearchQuery(e.target.value)}
212
+ placeholder="Search models..."
213
+ className={cn(
214
+ 'h-9 w-full rounded-md border border-zinc-200 bg-transparent pl-8 pr-3 text-sm',
215
+ 'outline-none placeholder:text-zinc-500 focus:border-zinc-400 focus:ring-0',
216
+ 'dark:border-zinc-800 dark:placeholder:text-zinc-400'
217
+ )}
218
+ onKeyDown={(e) => e.stopPropagation()}
219
+ />
220
+ </div>
221
+ </div>
222
+
223
+ <div className="max-h-64 overflow-auto">
224
+ {isLoading ? (
225
+ <div className="px-2 py-4 text-center text-sm text-zinc-500">
226
+ Loading models...
227
+ </div>
228
+ ) : isError ? (
229
+ <div className="px-4 py-6 text-center">
230
+ <div className="flex flex-col items-center gap-3">
231
+ <div className="w-10 h-10 rounded-full bg-red-100 dark:bg-red-900/30 flex items-center justify-center">
232
+ <AlertCircle className="h-5 w-5 text-red-600 dark:text-red-400" />
233
+ </div>
234
+ <div className="space-y-1">
235
+ <p className="text-sm font-medium text-zinc-900 dark:text-zinc-100">
236
+ Failed to load models
237
+ </p>
238
+ <p className="text-xs text-zinc-500 dark:text-zinc-400 max-w-[200px]">
239
+ {error instanceof Error ? error.message : 'Please check your OpenCode installation'}
240
+ </p>
241
+ </div>
242
+ <button
243
+ type="button"
244
+ onClick={(e) => {
245
+ e.stopPropagation();
246
+ refetch();
247
+ }}
248
+ className="inline-flex items-center gap-1.5 px-3 py-1.5 rounded-md text-xs font-medium bg-zinc-100 text-zinc-700 hover:bg-zinc-200 dark:bg-zinc-800 dark:text-zinc-300 dark:hover:bg-zinc-700 transition-colors"
249
+ >
250
+ <RefreshCw className="h-3.5 w-3.5" />
251
+ Retry
252
+ </button>
253
+ </div>
254
+ </div>
255
+ ) : filteredModels.length === 0 ? (
256
+ <div className="px-2 py-4 text-center text-sm text-zinc-500">
257
+ No models found
258
+ </div>
259
+ ) : (
260
+ providers.map((provider) => (
261
+ <div key={provider}>
262
+ <div className="px-2 py-1.5 text-xs font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-400">
263
+ {provider}
264
+ </div>
265
+ {groupedModels[provider].map((model) => {
266
+ const { model: modelName } = parseModelName(model);
267
+ return (
268
+ <SelectItem key={model} value={model}>
269
+ <span className="flex items-center gap-2">
270
+ <span className="text-zinc-900 dark:text-zinc-100">
271
+ {modelName}
272
+ </span>
273
+ </span>
274
+ </SelectItem>
275
+ );
276
+ })}
277
+ </div>
278
+ ))
279
+ )}
280
+ </div>
281
+ </SelectContent>
282
+ </SelectPrimitive.Root>
283
+ );
284
+ }
@@ -0,0 +1,162 @@
1
+ 'use client';
2
+
3
+ import * as React from 'react';
4
+ import { useQuery } from '@tanstack/react-query';
5
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from '../ui/Tabs';
6
+ import { AgentConfigForm } from './AgentConfigForm';
7
+ import { Loader2 } from 'lucide-react';
8
+
9
+ interface AgentConfig {
10
+ model?: string;
11
+ temperature?: number;
12
+ top_p?: number;
13
+ }
14
+
15
+ interface OpencodeConfigResponse {
16
+ agents: Record<string, AgentConfig>;
17
+ }
18
+
19
+ interface AgentDefinition {
20
+ key: string;
21
+ name: string;
22
+ description: string;
23
+ }
24
+
25
+ const PREDEFINED_AGENTS: AgentDefinition[] = [
26
+ {
27
+ key: 'default',
28
+ name: 'Default',
29
+ description: 'Base configuration for agents without specific model settings',
30
+ },
31
+ {
32
+ key: 'sisyphus',
33
+ name: 'Sisyphus',
34
+ description: 'Task execution agent - focused on completing specific tasks',
35
+ },
36
+ {
37
+ key: 'hephaestus',
38
+ name: 'Hephaestus',
39
+ description: 'Build and automation agent - handles CI/CD and deployment',
40
+ },
41
+ {
42
+ key: 'prometheus',
43
+ name: 'Prometheus',
44
+ description: 'Planning agent - creates and manages project plans',
45
+ },
46
+ {
47
+ key: 'oracle',
48
+ name: 'Oracle',
49
+ description: 'Knowledge and research agent - provides insights and answers',
50
+ },
51
+ {
52
+ key: 'metis',
53
+ name: 'Metis',
54
+ description: 'Strategy and consultation agent - advises on best practices',
55
+ },
56
+ {
57
+ key: 'momus',
58
+ name: 'Momus',
59
+ description: 'Review and critique agent - evaluates code and decisions',
60
+ },
61
+ {
62
+ key: 'atlas',
63
+ name: 'Atlas',
64
+ description: 'Execution-focused agent for task completion',
65
+ },
66
+ {
67
+ key: 'librarian',
68
+ name: 'Librarian',
69
+ description: 'Documentation and code exploration agent',
70
+ },
71
+ {
72
+ key: 'explore',
73
+ name: 'Explore',
74
+ description: 'Code navigation and discovery agent',
75
+ },
76
+ ];
77
+
78
+ interface AgentsConfigPanelProps {
79
+ onSaveSuccess?: () => void;
80
+ }
81
+
82
+ export function AgentsConfigPanel({ onSaveSuccess }: AgentsConfigPanelProps) {
83
+ const [activeTab, setActiveTab] = React.useState('default');
84
+
85
+ const { data: config, isLoading } = useQuery<OpencodeConfigResponse>({
86
+ queryKey: ['opencode-config'],
87
+ queryFn: async () => {
88
+ const res = await fetch('/api/opencode-config');
89
+ if (!res.ok) {
90
+ throw new Error('Failed to fetch config');
91
+ }
92
+ return res.json();
93
+ },
94
+ });
95
+
96
+ const configuredAgents = React.useMemo(() => {
97
+ const agents = config?.agents || {};
98
+ return PREDEFINED_AGENTS.map((agent) => ({
99
+ ...agent,
100
+ isConfigured: agent.key in agents,
101
+ }));
102
+ }, [config]);
103
+
104
+ if (isLoading) {
105
+ return (
106
+ <div className="flex items-center justify-center py-12">
107
+ <Loader2 className="h-6 w-6 animate-spin text-zinc-400" />
108
+ <span className="ml-2 text-sm text-zinc-500 dark:text-zinc-400">
109
+ Loading agent configurations...
110
+ </span>
111
+ </div>
112
+ );
113
+ }
114
+
115
+ return (
116
+ <div className="space-y-6">
117
+ <Tabs value={activeTab} onValueChange={setActiveTab} className="w-full">
118
+ <TabsList className="flex flex-wrap h-auto gap-1 p-1.5">
119
+ {configuredAgents.map((agent) => (
120
+ <TabsTrigger
121
+ key={agent.key}
122
+ value={agent.key}
123
+ className="text-xs px-3 py-1.5 data-[state=active]:bg-white data-[state=active]:text-zinc-900 dark:data-[state=active]:bg-zinc-900 dark:data-[state=active]:text-zinc-50"
124
+ >
125
+ <span className="flex items-center gap-1.5">
126
+ {agent.name}
127
+ {agent.isConfigured && (
128
+ <span className="w-1.5 h-1.5 rounded-full bg-emerald-500" />
129
+ )}
130
+ </span>
131
+ </TabsTrigger>
132
+ ))}
133
+ </TabsList>
134
+
135
+ {PREDEFINED_AGENTS.map((agent) => (
136
+ <TabsContent
137
+ key={agent.key}
138
+ value={agent.key}
139
+ className="mt-4 focus-visible:outline-none"
140
+ >
141
+ <div className="space-y-4">
142
+ <div className="pb-4 border-b border-zinc-200 dark:border-zinc-700">
143
+ <h3 className="text-base font-semibold text-zinc-900 dark:text-zinc-100">
144
+ {agent.name}
145
+ </h3>
146
+ <p className="mt-1 text-sm text-zinc-500 dark:text-zinc-400">
147
+ {agent.description}
148
+ </p>
149
+ </div>
150
+ <AgentConfigForm
151
+ agentName={agent.key}
152
+ onSaveSuccess={onSaveSuccess}
153
+ />
154
+ </div>
155
+ </TabsContent>
156
+ ))}
157
+ </Tabs>
158
+ </div>
159
+ );
160
+ }
161
+
162
+ export default AgentsConfigPanel;
@@ -0,0 +1,43 @@
1
+ 'use client';
2
+
3
+ import { useQuery } from '@tanstack/react-query';
4
+ import { Settings } from 'lucide-react';
5
+
6
+ interface OpencodeConfigStatus {
7
+ hasConfig: boolean;
8
+ hasPlugin: boolean;
9
+ path?: string;
10
+ }
11
+
12
+ interface ConfigButtonProps {
13
+ onClick: () => void;
14
+ }
15
+
16
+ export function ConfigButton({ onClick }: ConfigButtonProps) {
17
+ const { data: status } = useQuery<OpencodeConfigStatus>({
18
+ queryKey: ['opencode-config', 'status'],
19
+ queryFn: async () => {
20
+ const res = await fetch('/api/opencode-config/status');
21
+ if (!res.ok) {
22
+ throw new Error('Failed to fetch config status');
23
+ }
24
+ return res.json();
25
+ },
26
+ });
27
+
28
+ if (!status?.hasPlugin) {
29
+ return null;
30
+ }
31
+
32
+ return (
33
+ <button
34
+ type="button"
35
+ onClick={onClick}
36
+ className="inline-flex items-center justify-center w-9 h-9 rounded-lg text-gray-500 hover:text-gray-700 hover:bg-gray-100 dark:text-gray-400 dark:hover:text-gray-200 dark:hover:bg-zinc-800 transition-colors duration-200"
37
+ aria-label="OpenCode Settings"
38
+ title="OpenCode Settings"
39
+ >
40
+ <Settings className="w-5 h-5" />
41
+ </button>
42
+ );
43
+ }
@@ -0,0 +1,91 @@
1
+ 'use client';
2
+
3
+ import * as Dialog from '@radix-ui/react-dialog';
4
+ import { X } from 'lucide-react';
5
+ import { AgentsConfigPanel } from './AgentsConfigPanel';
6
+
7
+ interface ConfigPanelProps {
8
+ open: boolean;
9
+ onOpenChange: (open: boolean) => void;
10
+ title?: string;
11
+ description?: string;
12
+ }
13
+
14
+ export function ConfigPanel({
15
+ open,
16
+ onOpenChange,
17
+ title = 'Configuration',
18
+ description,
19
+ }: ConfigPanelProps) {
20
+ return (
21
+ <Dialog.Root open={open} onOpenChange={onOpenChange}>
22
+ <Dialog.Portal>
23
+ <Dialog.Overlay
24
+ className="fixed inset-0 z-50 bg-black/40 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0"
25
+ />
26
+
27
+ <Dialog.Content
28
+ className="fixed z-50 gap-4 bg-white dark:bg-zinc-800 p-0 shadow-2xl outline-none
29
+ inset-x-0 bottom-0 rounded-t-xl border-t border-gray-200 dark:border-zinc-700
30
+ h-[85vh] flex flex-col
31
+ sm:inset-auto sm:left-1/2 sm:top-1/2 sm:-translate-x-1/2 sm:-translate-y-1/2
32
+ sm:w-full sm:max-w-lg sm:h-auto sm:max-h-[85vh] sm:rounded-xl sm:border"
33
+ >
34
+ <div className="flex items-center justify-between px-5 py-4 border-b border-gray-100 dark:border-zinc-700/50 flex-shrink-0">
35
+ <div className="flex flex-col gap-0.5">
36
+ <Dialog.Title className="text-base font-semibold text-gray-900 dark:text-gray-100">
37
+ {title}
38
+ </Dialog.Title>
39
+ {description && (
40
+ <Dialog.Description className="text-sm text-gray-500 dark:text-gray-400">
41
+ {description}
42
+ </Dialog.Description>
43
+ )}
44
+ </div>
45
+ <Dialog.Close asChild>
46
+ <button
47
+ type="button"
48
+ className="w-7 h-7 flex items-center justify-center rounded-md text-gray-400
49
+ hover:text-gray-600 hover:bg-gray-100
50
+ dark:text-gray-500 dark:hover:text-gray-300 dark:hover:bg-zinc-700
51
+ transition-colors"
52
+ aria-label="Close panel"
53
+ >
54
+ <X className="w-4 h-4" />
55
+ </button>
56
+ </Dialog.Close>
57
+ </div>
58
+
59
+ <div className="flex-1 overflow-y-auto p-5 scrollbar-thin">
60
+ <AgentsConfigPanel />
61
+ </div>
62
+
63
+ <div className="flex items-center justify-end gap-2 px-5 py-4 border-t border-gray-100 dark:border-zinc-700/50 bg-gray-50/50 dark:bg-zinc-800/50 flex-shrink-0">
64
+ <Dialog.Close asChild>
65
+ <button
66
+ type="button"
67
+ className="px-3 py-1.5 text-xs font-medium rounded-md text-gray-600
68
+ hover:bg-gray-200 hover:text-gray-800
69
+ dark:text-gray-400 dark:hover:bg-zinc-700 dark:hover:text-gray-200
70
+ transition-colors"
71
+ >
72
+ Cancel
73
+ </button>
74
+ </Dialog.Close>
75
+ <button
76
+ type="button"
77
+ className="px-3 py-1.5 text-xs font-medium rounded-md bg-blue-600 text-white
78
+ hover:bg-blue-700 shadow-sm
79
+ dark:bg-blue-600 dark:hover:bg-blue-500
80
+ transition-colors"
81
+ >
82
+ Save Changes
83
+ </button>
84
+ </div>
85
+ </Dialog.Content>
86
+ </Dialog.Portal>
87
+ </Dialog.Root>
88
+ );
89
+ }
90
+
91
+ export default ConfigPanel;