vibepulse 0.2.2 → 0.3.1-beta

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 (424) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +1 -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 +8 -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 +2 -2
  32. package/.next/server/app/api/node/events/route.js.nft.json +1 -1
  33. package/.next/server/app/api/node/sessions/[id]/delete/route.js +2 -2
  34. package/.next/server/app/api/node/sessions/[id]/delete/route.js.nft.json +1 -1
  35. package/.next/server/app/api/node/sessions/[id]/open-editor/route.js +2 -2
  36. package/.next/server/app/api/node/sessions/[id]/open-editor/route.js.nft.json +1 -1
  37. package/.next/server/app/api/node/sessions/route.js +6 -4
  38. package/.next/server/app/api/node/sessions/route.js.nft.json +1 -1
  39. package/.next/server/app/api/nodes/route.js +2 -2
  40. package/.next/server/app/api/nodes/route.js.nft.json +1 -1
  41. package/.next/server/app/api/opencode-config/route.js +2 -2
  42. package/.next/server/app/api/opencode-config/route.js.nft.json +1 -1
  43. package/.next/server/app/api/opencode-config/status/route.js +2 -2
  44. package/.next/server/app/api/opencode-config/status/route.js.nft.json +1 -1
  45. package/.next/server/app/api/opencode-events/route.js +3 -3
  46. package/.next/server/app/api/opencode-events/route.js.nft.json +1 -1
  47. package/.next/server/app/api/profiles/[id]/apply/route.js +2 -2
  48. package/.next/server/app/api/profiles/[id]/apply/route.js.nft.json +1 -1
  49. package/.next/server/app/api/profiles/[id]/export/route.js +2 -2
  50. package/.next/server/app/api/profiles/[id]/export/route.js.nft.json +1 -1
  51. package/.next/server/app/api/profiles/[id]/route.js +2 -2
  52. package/.next/server/app/api/profiles/[id]/route.js.nft.json +1 -1
  53. package/.next/server/app/api/profiles/import/route.js +2 -2
  54. package/.next/server/app/api/profiles/import/route.js.nft.json +1 -1
  55. package/.next/server/app/api/profiles/route.js +2 -2
  56. package/.next/server/app/api/profiles/route.js.nft.json +1 -1
  57. package/.next/server/app/api/sessions/[id]/archive/route.js +3 -2
  58. package/.next/server/app/api/sessions/[id]/archive/route.js.nft.json +1 -1
  59. package/.next/server/app/api/sessions/[id]/delete/route.js +4 -3
  60. package/.next/server/app/api/sessions/[id]/delete/route.js.nft.json +1 -1
  61. package/.next/server/app/api/sessions/[id]/open-editor/route.js +2 -2
  62. package/.next/server/app/api/sessions/[id]/open-editor/route.js.nft.json +1 -1
  63. package/.next/server/app/api/sessions/[id]/restore/route/app-paths-manifest.json +3 -0
  64. package/.next/server/app/api/sessions/[id]/restore/route/build-manifest.json +11 -0
  65. package/.next/server/app/api/sessions/[id]/restore/route/server-reference-manifest.json +4 -0
  66. package/.next/server/app/api/sessions/[id]/restore/route.js +8 -0
  67. package/.next/server/app/api/sessions/[id]/restore/route.js.map +5 -0
  68. package/.next/server/app/api/sessions/[id]/restore/route.js.nft.json +1 -0
  69. package/.next/server/app/api/sessions/[id]/restore/route_client-reference-manifest.js +2 -0
  70. package/.next/server/app/api/sessions/[id]/route.js +2 -2
  71. package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  72. package/.next/server/app/api/sessions/route.js +5 -3
  73. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  74. package/.next/server/app/index.html +1 -1
  75. package/.next/server/app/index.rsc +3 -3
  76. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  77. package/.next/server/app/index.segments/_full.segment.rsc +3 -3
  78. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  79. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  80. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  81. package/.next/server/app/page_client-reference-manifest.js +1 -1
  82. package/.next/server/app-paths-manifest.json +1 -0
  83. package/.next/server/chunks/[root-of-the-server]__005eb0c5._.js +3 -0
  84. package/.next/server/chunks/[root-of-the-server]__005eb0c5._.js.map +1 -0
  85. package/.next/server/chunks/[root-of-the-server]__09e90d57._.js +3 -0
  86. package/.next/server/chunks/[root-of-the-server]__09e90d57._.js.map +1 -0
  87. package/.next/server/chunks/[root-of-the-server]__18dd0ce9._.js +3 -0
  88. package/.next/server/chunks/[root-of-the-server]__18dd0ce9._.js.map +1 -0
  89. package/.next/server/chunks/[root-of-the-server]__19468536._.js +3 -0
  90. package/.next/server/chunks/[root-of-the-server]__19468536._.js.map +1 -0
  91. package/.next/server/chunks/[root-of-the-server]__1b87ec42._.js +1 -1
  92. package/.next/server/chunks/[root-of-the-server]__1b87ec42._.js.map +1 -1
  93. package/.next/server/chunks/[root-of-the-server]__2b912935._.js +3 -0
  94. package/.next/server/chunks/[root-of-the-server]__2b912935._.js.map +1 -0
  95. package/.next/server/chunks/[root-of-the-server]__303d3bac._.js +3 -0
  96. package/.next/server/chunks/[root-of-the-server]__303d3bac._.js.map +1 -0
  97. package/.next/server/chunks/[root-of-the-server]__3fac2b91._.js +5 -0
  98. package/.next/server/chunks/[root-of-the-server]__3fac2b91._.js.map +1 -0
  99. package/.next/server/chunks/[root-of-the-server]__43440b8d._.js +3 -0
  100. package/.next/server/chunks/[root-of-the-server]__43440b8d._.js.map +1 -0
  101. package/.next/server/chunks/[root-of-the-server]__438f8bbe._.js +3 -0
  102. package/.next/server/chunks/[root-of-the-server]__438f8bbe._.js.map +1 -0
  103. package/.next/server/chunks/[root-of-the-server]__4a0bfb55._.js +3 -0
  104. package/.next/server/chunks/[root-of-the-server]__4a0bfb55._.js.map +1 -0
  105. package/.next/server/chunks/[root-of-the-server]__534c3949._.js +3 -0
  106. package/.next/server/chunks/[root-of-the-server]__534c3949._.js.map +1 -0
  107. package/.next/server/chunks/[root-of-the-server]__59160266._.js +1 -1
  108. package/.next/server/chunks/[root-of-the-server]__59160266._.js.map +1 -1
  109. package/.next/server/chunks/[root-of-the-server]__6f812da0._.js +3 -0
  110. package/.next/server/chunks/[root-of-the-server]__6f812da0._.js.map +1 -0
  111. package/.next/server/chunks/[root-of-the-server]__71aac504._.js +3 -0
  112. package/.next/server/chunks/[root-of-the-server]__71aac504._.js.map +1 -0
  113. package/.next/server/chunks/[root-of-the-server]__907a8bf2._.js +3 -0
  114. package/.next/server/chunks/[root-of-the-server]__907a8bf2._.js.map +1 -0
  115. package/.next/server/chunks/[root-of-the-server]__92089220._.js +3 -0
  116. package/.next/server/chunks/[root-of-the-server]__92089220._.js.map +1 -0
  117. package/.next/server/chunks/[root-of-the-server]__9b7bc2d0._.js +3 -0
  118. package/.next/server/chunks/[root-of-the-server]__9b7bc2d0._.js.map +1 -0
  119. package/.next/server/chunks/[root-of-the-server]__b2640944._.js +3 -0
  120. package/.next/server/chunks/[root-of-the-server]__b2640944._.js.map +1 -0
  121. package/.next/server/chunks/[root-of-the-server]__c2267cf1._.js +3 -0
  122. package/.next/server/chunks/[root-of-the-server]__c2267cf1._.js.map +1 -0
  123. package/.next/server/chunks/[root-of-the-server]__d7f7e6dd._.js +3 -0
  124. package/.next/server/chunks/{[root-of-the-server]__6924c09d._.js.map → [root-of-the-server]__d7f7e6dd._.js.map} +1 -1
  125. package/.next/server/chunks/[root-of-the-server]__d8e61048._.js +1 -1
  126. package/.next/server/chunks/[root-of-the-server]__d8e61048._.js.map +1 -1
  127. package/.next/server/chunks/[root-of-the-server]__f6d0d488._.js +3 -0
  128. package/.next/server/chunks/{[root-of-the-server]__192ed2f4._.js.map → [root-of-the-server]__f6d0d488._.js.map} +1 -1
  129. package/.next/server/chunks/[root-of-the-server]__fa559e1e._.js +3 -0
  130. package/.next/server/chunks/[root-of-the-server]__fa559e1e._.js.map +1 -0
  131. package/.next/server/chunks/_next-internal_server_app_api_sessions_[id]_restore_route_actions_af7d6b6c.js +3 -0
  132. package/.next/server/chunks/_next-internal_server_app_api_sessions_[id]_restore_route_actions_af7d6b6c.js.map +1 -0
  133. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_7e181e75.js +1 -1
  134. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_7e181e75.js.map +1 -1
  135. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_aca45402.js +1 -1
  136. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_aca45402.js.map +1 -1
  137. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_b054aff3.js +1 -1
  138. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_b054aff3.js.map +1 -1
  139. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_fa835ac3.js +2 -2
  140. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_fa835ac3.js.map +1 -1
  141. package/.next/server/chunks/src_lib_opencodeConfig_ts_8e209941._.js +3 -0
  142. package/.next/server/chunks/src_lib_opencodeConfig_ts_8e209941._.js.map +1 -0
  143. package/.next/server/chunks/src_lib_session-providers_claudeCode_ts_0f9590ed._.js +3 -0
  144. package/.next/server/chunks/src_lib_session-providers_claudeCode_ts_0f9590ed._.js.map +1 -0
  145. package/.next/server/chunks/ssr/{[root-of-the-server]__631e12d0._.js → [root-of-the-server]__c91a8380._.js} +2 -2
  146. package/.next/server/chunks/ssr/{[root-of-the-server]__631e12d0._.js.map → [root-of-the-server]__c91a8380._.js.map} +1 -1
  147. package/.next/server/chunks/ssr/src_app_page_tsx_a7111f3e._.js +3 -3
  148. package/.next/server/chunks/ssr/src_app_page_tsx_a7111f3e._.js.map +1 -1
  149. package/.next/server/pages/404.html +1 -1
  150. package/.next/server/pages/500.html +2 -2
  151. package/.next/server/server-reference-manifest.js +1 -1
  152. package/.next/server/server-reference-manifest.json +1 -1
  153. package/.next/standalone/.next/BUILD_ID +1 -1
  154. package/.next/standalone/.next/app-path-routes-manifest.json +1 -0
  155. package/.next/standalone/.next/build-manifest.json +2 -2
  156. package/.next/standalone/.next/prerender-manifest.json +3 -3
  157. package/.next/standalone/.next/routes-manifest.json +8 -0
  158. package/.next/standalone/.next/server/app/_global-error/page.js +1 -1
  159. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  160. package/.next/standalone/.next/server/app/_global-error.html +2 -2
  161. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  162. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  163. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  164. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  165. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  166. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  167. package/.next/standalone/.next/server/app/_not-found/page.js +1 -1
  168. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  169. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  170. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  171. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  172. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  173. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  174. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  175. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  176. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  177. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  178. package/.next/standalone/.next/server/app/api/node/events/route.js +2 -2
  179. package/.next/standalone/.next/server/app/api/node/events/route.js.nft.json +1 -1
  180. package/.next/standalone/.next/server/app/api/node/sessions/[id]/delete/route.js +2 -2
  181. package/.next/standalone/.next/server/app/api/node/sessions/[id]/delete/route.js.nft.json +1 -1
  182. package/.next/standalone/.next/server/app/api/node/sessions/[id]/open-editor/route.js +2 -2
  183. package/.next/standalone/.next/server/app/api/node/sessions/[id]/open-editor/route.js.nft.json +1 -1
  184. package/.next/standalone/.next/server/app/api/node/sessions/route.js +6 -4
  185. package/.next/standalone/.next/server/app/api/node/sessions/route.js.nft.json +1 -1
  186. package/.next/standalone/.next/server/app/api/nodes/route.js +2 -2
  187. package/.next/standalone/.next/server/app/api/nodes/route.js.nft.json +1 -1
  188. package/.next/standalone/.next/server/app/api/opencode-config/route.js +2 -2
  189. package/.next/standalone/.next/server/app/api/opencode-config/route.js.nft.json +1 -1
  190. package/.next/standalone/.next/server/app/api/opencode-config/status/route.js +2 -2
  191. package/.next/standalone/.next/server/app/api/opencode-config/status/route.js.nft.json +1 -1
  192. package/.next/standalone/.next/server/app/api/opencode-events/route.js +3 -3
  193. package/.next/standalone/.next/server/app/api/opencode-events/route.js.nft.json +1 -1
  194. package/.next/standalone/.next/server/app/api/profiles/[id]/apply/route.js +2 -2
  195. package/.next/standalone/.next/server/app/api/profiles/[id]/apply/route.js.nft.json +1 -1
  196. package/.next/standalone/.next/server/app/api/profiles/[id]/export/route.js +2 -2
  197. package/.next/standalone/.next/server/app/api/profiles/[id]/export/route.js.nft.json +1 -1
  198. package/.next/standalone/.next/server/app/api/profiles/[id]/route.js +2 -2
  199. package/.next/standalone/.next/server/app/api/profiles/[id]/route.js.nft.json +1 -1
  200. package/.next/standalone/.next/server/app/api/profiles/import/route.js +2 -2
  201. package/.next/standalone/.next/server/app/api/profiles/import/route.js.nft.json +1 -1
  202. package/.next/standalone/.next/server/app/api/profiles/route.js +2 -2
  203. package/.next/standalone/.next/server/app/api/profiles/route.js.nft.json +1 -1
  204. package/.next/standalone/.next/server/app/api/sessions/[id]/archive/route.js +3 -2
  205. package/.next/standalone/.next/server/app/api/sessions/[id]/archive/route.js.nft.json +1 -1
  206. package/.next/standalone/.next/server/app/api/sessions/[id]/delete/route.js +4 -3
  207. package/.next/standalone/.next/server/app/api/sessions/[id]/delete/route.js.nft.json +1 -1
  208. package/.next/standalone/.next/server/app/api/sessions/[id]/open-editor/route.js +2 -2
  209. package/.next/standalone/.next/server/app/api/sessions/[id]/open-editor/route.js.nft.json +1 -1
  210. package/.next/standalone/.next/server/app/api/sessions/[id]/restore/route/app-paths-manifest.json +3 -0
  211. package/.next/standalone/.next/server/app/api/sessions/[id]/restore/route/build-manifest.json +11 -0
  212. package/.next/standalone/.next/server/app/api/sessions/[id]/restore/route/server-reference-manifest.json +4 -0
  213. package/.next/standalone/.next/server/app/api/sessions/[id]/restore/route.js +8 -0
  214. package/.next/standalone/.next/server/app/api/sessions/[id]/restore/route.js.map +5 -0
  215. package/.next/standalone/.next/server/app/api/sessions/[id]/restore/route.js.nft.json +1 -0
  216. package/.next/standalone/.next/server/app/api/sessions/[id]/restore/route_client-reference-manifest.js +2 -0
  217. package/.next/standalone/.next/server/app/api/sessions/[id]/route.js +2 -2
  218. package/.next/standalone/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  219. package/.next/standalone/.next/server/app/api/sessions/route.js +5 -3
  220. package/.next/standalone/.next/server/app/api/sessions/route.js.nft.json +1 -1
  221. package/.next/standalone/.next/server/app/index.html +1 -1
  222. package/.next/standalone/.next/server/app/index.rsc +3 -3
  223. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  224. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
  225. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  226. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  227. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  228. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  229. package/.next/standalone/.next/server/app-paths-manifest.json +1 -0
  230. package/.next/standalone/.next/server/chunks/[root-of-the-server]__005eb0c5._.js +3 -0
  231. package/.next/standalone/.next/server/chunks/[root-of-the-server]__09e90d57._.js +3 -0
  232. package/.next/standalone/.next/server/chunks/[root-of-the-server]__18dd0ce9._.js +3 -0
  233. package/.next/standalone/.next/server/chunks/[root-of-the-server]__19468536._.js +3 -0
  234. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1b87ec42._.js +1 -1
  235. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2b912935._.js +3 -0
  236. package/.next/standalone/.next/server/chunks/[root-of-the-server]__303d3bac._.js +3 -0
  237. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3fac2b91._.js +5 -0
  238. package/.next/standalone/.next/server/chunks/[root-of-the-server]__43440b8d._.js +3 -0
  239. package/.next/standalone/.next/server/chunks/[root-of-the-server]__438f8bbe._.js +3 -0
  240. package/.next/standalone/.next/server/chunks/[root-of-the-server]__4a0bfb55._.js +3 -0
  241. package/.next/standalone/.next/server/chunks/[root-of-the-server]__534c3949._.js +3 -0
  242. package/.next/standalone/.next/server/chunks/[root-of-the-server]__59160266._.js +1 -1
  243. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6f812da0._.js +3 -0
  244. package/.next/standalone/.next/server/chunks/[root-of-the-server]__71aac504._.js +3 -0
  245. package/.next/standalone/.next/server/chunks/[root-of-the-server]__907a8bf2._.js +3 -0
  246. package/.next/standalone/.next/server/chunks/[root-of-the-server]__92089220._.js +3 -0
  247. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9b7bc2d0._.js +3 -0
  248. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b2640944._.js +3 -0
  249. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c2267cf1._.js +3 -0
  250. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d7f7e6dd._.js +3 -0
  251. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d8e61048._.js +1 -1
  252. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f6d0d488._.js +3 -0
  253. package/.next/standalone/.next/server/chunks/[root-of-the-server]__fa559e1e._.js +3 -0
  254. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_sessions_[id]_restore_route_actions_af7d6b6c.js +3 -0
  255. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_7e181e75.js +1 -1
  256. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_aca45402.js +1 -1
  257. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_b054aff3.js +1 -1
  258. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_fa835ac3.js +2 -2
  259. package/.next/standalone/.next/server/chunks/src_lib_opencodeConfig_ts_8e209941._.js +3 -0
  260. package/.next/standalone/.next/server/chunks/src_lib_session-providers_claudeCode_ts_0f9590ed._.js +3 -0
  261. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__631e12d0._.js → [root-of-the-server]__c91a8380._.js} +2 -2
  262. package/.next/standalone/.next/server/chunks/ssr/src_app_page_tsx_a7111f3e._.js +3 -3
  263. package/.next/standalone/.next/server/pages/404.html +1 -1
  264. package/.next/standalone/.next/server/pages/500.html +2 -2
  265. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  266. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  267. package/.next/standalone/.next/static/chunks/9e790b67c80f853c.js +13 -0
  268. package/.next/standalone/.next/static/chunks/c3dc8cd80979c971.css +3 -0
  269. package/.next/standalone/AGENTS.md +4 -0
  270. package/.next/standalone/README.md +54 -5
  271. package/.next/standalone/check-hsql.mjs +1 -1
  272. package/.next/standalone/docs/session-status-detection.md +36 -0
  273. package/.next/standalone/docs/superpowers/specs/2026-04-09-claude-capability-alignment-design.md +39 -0
  274. package/.next/standalone/eslint.config.mjs +1 -0
  275. package/.next/standalone/package-lock.json +74 -13
  276. package/.next/standalone/package.json +2 -2
  277. package/.next/standalone/src/app/api/node/events/route.ts +3 -3
  278. package/.next/standalone/src/app/api/node/sessions/[id]/archive/route.test.ts +60 -1
  279. package/.next/standalone/src/app/api/node/sessions/[id]/archive/route.ts +77 -22
  280. package/.next/standalone/src/app/api/node/sessions/[id]/delete/route.ts +6 -5
  281. package/.next/standalone/src/app/api/node/sessions/[id]/open-editor/route.ts +6 -5
  282. package/.next/standalone/src/app/api/node/sessions/route.test.ts +282 -0
  283. package/.next/standalone/src/app/api/node/sessions/route.ts +156 -30
  284. package/.next/standalone/src/app/api/opencode-config/route.test.ts +613 -0
  285. package/.next/standalone/src/app/api/opencode-config/route.ts +336 -185
  286. package/.next/standalone/src/app/api/opencode-events/route.test.ts +77 -1
  287. package/.next/standalone/src/app/api/opencode-events/route.ts +3 -3
  288. package/.next/standalone/src/app/api/opencode-models/route.test.ts +19 -0
  289. package/.next/standalone/src/app/api/opencode-models/route.ts +4 -1
  290. package/.next/standalone/src/app/api/profiles/[id]/apply/route.test.ts +227 -0
  291. package/.next/standalone/src/app/api/profiles/[id]/apply/route.ts +13 -9
  292. package/.next/standalone/src/app/api/sessions/[id]/archive/route.test.ts +126 -0
  293. package/.next/standalone/src/app/api/sessions/[id]/archive/route.ts +47 -12
  294. package/.next/standalone/src/app/api/sessions/[id]/delete/route.test.ts +140 -0
  295. package/.next/standalone/src/app/api/sessions/[id]/delete/route.ts +51 -16
  296. package/.next/standalone/src/app/api/sessions/[id]/open-editor/route.test.ts +74 -0
  297. package/.next/standalone/src/app/api/sessions/[id]/open-editor/route.ts +22 -2
  298. package/.next/standalone/src/app/api/sessions/[id]/restore/route.test.ts +186 -0
  299. package/.next/standalone/src/app/api/sessions/[id]/restore/route.ts +184 -0
  300. package/.next/standalone/src/app/api/sessions/[id]/route.ts +3 -3
  301. package/.next/standalone/src/app/api/sessions/route.test.ts +1955 -100
  302. package/.next/standalone/src/app/api/sessions/route.ts +361 -986
  303. package/.next/standalone/src/components/KanbanBoard.test.tsx +307 -1
  304. package/.next/standalone/src/components/KanbanBoard.tsx +106 -19
  305. package/.next/standalone/src/components/ProjectCard.test.tsx +420 -6
  306. package/.next/standalone/src/components/ProjectCard.tsx +238 -86
  307. package/.next/standalone/src/components/SessionCard.test.tsx +259 -8
  308. package/.next/standalone/src/components/SessionCard.tsx +182 -76
  309. package/.next/standalone/src/components/opencode-config/AgentConfigForm.test.tsx +141 -1
  310. package/.next/standalone/src/components/opencode-config/AgentConfigForm.tsx +99 -7
  311. package/.next/standalone/src/components/opencode-config/GeneralSettingsForm.test.tsx +11 -0
  312. package/.next/standalone/src/components/opencode-config/GeneralSettingsForm.tsx +41 -2
  313. package/.next/standalone/src/components/opencode-config/categories/CategoriesManager.tsx +3 -1
  314. package/.next/standalone/src/components/opencode-config/categories/CategoryConfigForm.test.tsx +106 -8
  315. package/.next/standalone/src/components/opencode-config/categories/CategoryConfigForm.tsx +82 -5
  316. package/.next/standalone/src/hooks/useHostSources.test.ts +0 -41
  317. package/.next/standalone/src/hooks/useOpencodeSync.test.ts +321 -1
  318. package/.next/standalone/src/hooks/useOpencodeSync.ts +16 -12
  319. package/.next/standalone/src/lib/claudeSessionOverrides.test.ts +75 -0
  320. package/.next/standalone/src/lib/claudeSessionOverrides.ts +169 -0
  321. package/.next/standalone/src/lib/fixtures/opencode-config/oh-my-openagent.v4.jsonc +70 -0
  322. package/.next/standalone/src/lib/fixtures/opencode-config/oh-my-openagent.v4.secret-like.jsonc +21 -0
  323. package/.next/standalone/src/lib/fixtures/opencode-config/oh-my-opencode.v3.jsonc +17 -0
  324. package/.next/standalone/src/lib/opencodeConfig.test.ts +430 -3
  325. package/.next/standalone/src/lib/opencodeConfig.ts +157 -4
  326. package/.next/standalone/src/lib/opencodeDiscovery.test.ts +241 -0
  327. package/.next/standalone/src/lib/opencodeDiscovery.ts +164 -9
  328. package/.next/standalone/src/lib/profiles/share.test.ts +92 -0
  329. package/.next/standalone/src/lib/profiles/share.ts +1 -0
  330. package/.next/standalone/src/lib/profiles/storage.test.ts +77 -1
  331. package/.next/standalone/src/lib/profiles/storage.ts +10 -9
  332. package/.next/standalone/src/lib/session-providers/claudeCode.test.ts +2288 -0
  333. package/.next/standalone/src/lib/session-providers/claudeCode.ts +1083 -0
  334. package/.next/standalone/src/lib/session-providers/localAggregator.test.ts +322 -0
  335. package/.next/standalone/src/lib/session-providers/localAggregator.ts +302 -0
  336. package/.next/standalone/src/lib/session-providers/opencodeProvider.test.ts +170 -0
  337. package/.next/standalone/src/lib/session-providers/opencodeProvider.ts +721 -0
  338. package/.next/standalone/src/lib/session-providers/opencodeSdkCompat.ts +92 -0
  339. package/.next/standalone/src/lib/session-providers/providerIds.test.ts +337 -0
  340. package/.next/standalone/src/lib/session-providers/providerIds.ts +176 -0
  341. package/.next/standalone/src/lib/session-providers/types.ts +131 -0
  342. package/.next/standalone/src/lib/transform.test.ts +253 -0
  343. package/.next/standalone/src/lib/transform.ts +96 -37
  344. package/.next/standalone/src/types/index.ts +23 -17
  345. package/.next/standalone/src/types/opencodeConfig.ts +55 -0
  346. package/.next/static/chunks/9e790b67c80f853c.js +13 -0
  347. package/.next/static/chunks/c3dc8cd80979c971.css +3 -0
  348. package/.next/trace +1 -1
  349. package/.next/trace-build +1 -1
  350. package/.next/types/routes.d.ts +2 -1
  351. package/.next/types/validator.ts +9 -0
  352. package/README.md +54 -5
  353. package/package.json +2 -2
  354. package/.next/server/chunks/[root-of-the-server]__1211da38._.js +0 -3
  355. package/.next/server/chunks/[root-of-the-server]__1211da38._.js.map +0 -1
  356. package/.next/server/chunks/[root-of-the-server]__192ed2f4._.js +0 -3
  357. package/.next/server/chunks/[root-of-the-server]__2b526e7a._.js +0 -3
  358. package/.next/server/chunks/[root-of-the-server]__2b526e7a._.js.map +0 -1
  359. package/.next/server/chunks/[root-of-the-server]__2f981540._.js +0 -3
  360. package/.next/server/chunks/[root-of-the-server]__2f981540._.js.map +0 -1
  361. package/.next/server/chunks/[root-of-the-server]__3745b314._.js +0 -3
  362. package/.next/server/chunks/[root-of-the-server]__3745b314._.js.map +0 -1
  363. package/.next/server/chunks/[root-of-the-server]__56690af0._.js +0 -3
  364. package/.next/server/chunks/[root-of-the-server]__56690af0._.js.map +0 -1
  365. package/.next/server/chunks/[root-of-the-server]__56f5f249._.js +0 -3
  366. package/.next/server/chunks/[root-of-the-server]__56f5f249._.js.map +0 -1
  367. package/.next/server/chunks/[root-of-the-server]__59175de4._.js +0 -3
  368. package/.next/server/chunks/[root-of-the-server]__59175de4._.js.map +0 -1
  369. package/.next/server/chunks/[root-of-the-server]__64fffc02._.js +0 -3
  370. package/.next/server/chunks/[root-of-the-server]__64fffc02._.js.map +0 -1
  371. package/.next/server/chunks/[root-of-the-server]__6924c09d._.js +0 -3
  372. package/.next/server/chunks/[root-of-the-server]__6c428a24._.js +0 -3
  373. package/.next/server/chunks/[root-of-the-server]__6c428a24._.js.map +0 -1
  374. package/.next/server/chunks/[root-of-the-server]__73a00b88._.js +0 -3
  375. package/.next/server/chunks/[root-of-the-server]__73a00b88._.js.map +0 -1
  376. package/.next/server/chunks/[root-of-the-server]__7e757f50._.js +0 -3
  377. package/.next/server/chunks/[root-of-the-server]__7e757f50._.js.map +0 -1
  378. package/.next/server/chunks/[root-of-the-server]__89c5eeab._.js +0 -3
  379. package/.next/server/chunks/[root-of-the-server]__89c5eeab._.js.map +0 -1
  380. package/.next/server/chunks/[root-of-the-server]__8da6c5a8._.js +0 -3
  381. package/.next/server/chunks/[root-of-the-server]__8da6c5a8._.js.map +0 -1
  382. package/.next/server/chunks/[root-of-the-server]__b796d06c._.js +0 -3
  383. package/.next/server/chunks/[root-of-the-server]__b796d06c._.js.map +0 -1
  384. package/.next/server/chunks/[root-of-the-server]__c2ce5c0f._.js +0 -3
  385. package/.next/server/chunks/[root-of-the-server]__c2ce5c0f._.js.map +0 -1
  386. package/.next/server/chunks/[root-of-the-server]__db285678._.js +0 -3
  387. package/.next/server/chunks/[root-of-the-server]__db285678._.js.map +0 -1
  388. package/.next/server/chunks/[root-of-the-server]__e00a9200._.js +0 -5
  389. package/.next/server/chunks/[root-of-the-server]__e00a9200._.js.map +0 -1
  390. package/.next/server/chunks/[root-of-the-server]__e5df5e5f._.js +0 -3
  391. package/.next/server/chunks/[root-of-the-server]__e5df5e5f._.js.map +0 -1
  392. package/.next/server/chunks/[root-of-the-server]__edbc8d9e._.js +0 -3
  393. package/.next/server/chunks/[root-of-the-server]__edbc8d9e._.js.map +0 -1
  394. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1211da38._.js +0 -3
  395. package/.next/standalone/.next/server/chunks/[root-of-the-server]__192ed2f4._.js +0 -3
  396. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2b526e7a._.js +0 -3
  397. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2f981540._.js +0 -3
  398. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3745b314._.js +0 -3
  399. package/.next/standalone/.next/server/chunks/[root-of-the-server]__56690af0._.js +0 -3
  400. package/.next/standalone/.next/server/chunks/[root-of-the-server]__56f5f249._.js +0 -3
  401. package/.next/standalone/.next/server/chunks/[root-of-the-server]__59175de4._.js +0 -3
  402. package/.next/standalone/.next/server/chunks/[root-of-the-server]__64fffc02._.js +0 -3
  403. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6924c09d._.js +0 -3
  404. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6c428a24._.js +0 -3
  405. package/.next/standalone/.next/server/chunks/[root-of-the-server]__73a00b88._.js +0 -3
  406. package/.next/standalone/.next/server/chunks/[root-of-the-server]__7e757f50._.js +0 -3
  407. package/.next/standalone/.next/server/chunks/[root-of-the-server]__89c5eeab._.js +0 -3
  408. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8da6c5a8._.js +0 -3
  409. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b796d06c._.js +0 -3
  410. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c2ce5c0f._.js +0 -3
  411. package/.next/standalone/.next/server/chunks/[root-of-the-server]__db285678._.js +0 -3
  412. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e00a9200._.js +0 -5
  413. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e5df5e5f._.js +0 -3
  414. package/.next/standalone/.next/server/chunks/[root-of-the-server]__edbc8d9e._.js +0 -3
  415. package/.next/standalone/.next/static/chunks/65d5354ba0add961.js +0 -13
  416. package/.next/standalone/.next/static/chunks/f42202943f6742e5.css +0 -3
  417. package/.next/static/chunks/65d5354ba0add961.js +0 -13
  418. package/.next/static/chunks/f42202943f6742e5.css +0 -3
  419. /package/.next/standalone/.next/static/{5kq9DtuBFVxu4jsgmL5Q- → 0WaQ6UjiNBgvh531pJVh0}/_buildManifest.js +0 -0
  420. /package/.next/standalone/.next/static/{5kq9DtuBFVxu4jsgmL5Q- → 0WaQ6UjiNBgvh531pJVh0}/_clientMiddlewareManifest.json +0 -0
  421. /package/.next/standalone/.next/static/{5kq9DtuBFVxu4jsgmL5Q- → 0WaQ6UjiNBgvh531pJVh0}/_ssgManifest.js +0 -0
  422. /package/.next/static/{5kq9DtuBFVxu4jsgmL5Q- → 0WaQ6UjiNBgvh531pJVh0}/_buildManifest.js +0 -0
  423. /package/.next/static/{5kq9DtuBFVxu4jsgmL5Q- → 0WaQ6UjiNBgvh531pJVh0}/_clientMiddlewareManifest.json +0 -0
  424. /package/.next/static/{5kq9DtuBFVxu4jsgmL5Q- → 0WaQ6UjiNBgvh531pJVh0}/_ssgManifest.js +0 -0
@@ -0,0 +1,70 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/code-yeongyu/oh-my-openagent/master/assets/oh-my-openagent.schema.json",
3
+ "team_mode": {
4
+ "enabled": true,
5
+ "workspace": "team-alpha",
6
+ "future_policy": {
7
+ "approval": "required"
8
+ }
9
+ },
10
+ "agents": {
11
+ "sisyphus": {
12
+ "model": "anthropic/claude-opus-4-6",
13
+ "variant": "max",
14
+ "reasoningEffort": "max",
15
+ "temperature": 0.2,
16
+ "top_p": 0.9,
17
+ "maxTokens": 64000,
18
+ "thinking": {
19
+ "type": "enabled",
20
+ "budget_tokens": 12000
21
+ },
22
+ "fallback_models": [
23
+ "openai/gpt-5.4",
24
+ {
25
+ "model": "google/gemini-3.1-pro",
26
+ "variant": "high",
27
+ "reasoningEffort": "max",
28
+ "temperature": 0.1,
29
+ "top_p": 0.95,
30
+ "maxTokens": 32000,
31
+ "thinking": {
32
+ "enabled": true,
33
+ "budget": 8000
34
+ },
35
+ "futureFallbackField": "preserve-me"
36
+ }
37
+ ],
38
+ "future_agent_knob": {
39
+ "mode": "experimental"
40
+ }
41
+ }
42
+ },
43
+ "categories": {
44
+ "ultrabrain": {
45
+ "model": "openai/gpt-5.4",
46
+ "variant": "xhigh",
47
+ "reasoningEffort": "max",
48
+ "maxTokens": 48000,
49
+ "thinking": {
50
+ "enabled": true
51
+ },
52
+ "fallback_models": [
53
+ "anthropic/claude-opus-4-6",
54
+ {
55
+ "model": "google/gemini-3.1-pro",
56
+ "variant": "max",
57
+ "reasoningEffort": "max",
58
+ "maxTokens": 32000,
59
+ "thinking": {
60
+ "enabled": true
61
+ }
62
+ }
63
+ ],
64
+ "future_category_knob": "keep-me"
65
+ }
66
+ },
67
+ "future_top_level": {
68
+ "enabled": true
69
+ }
70
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/code-yeongyu/oh-my-openagent/master/assets/oh-my-openagent.schema.json",
3
+ "agents": {
4
+ "dangerous-example": {
5
+ "model": "openai/gpt-5.4",
6
+ "apiKey": "sk-test-do-not-use",
7
+ "nested": {
8
+ "access_token": "example-token"
9
+ },
10
+ "fallback_models": [
11
+ {
12
+ "model": "anthropic/claude-opus-4-6",
13
+ "password": "example-password"
14
+ }
15
+ ]
16
+ }
17
+ },
18
+ "future_secret_payload": {
19
+ "client_secret": "example-secret"
20
+ }
21
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/code-yeongyu/oh-my-openagent/v3.15.2/assets/oh-my-opencode.schema.json",
3
+ "agents": {
4
+ "sisyphus": {
5
+ "model": "anthropic/claude-sonnet-4-5",
6
+ "variant": "high",
7
+ "temperature": 0.2,
8
+ "top_p": 0.9
9
+ }
10
+ },
11
+ "categories": {
12
+ "quick": {
13
+ "model": "openai/gpt-5-mini",
14
+ "variant": "medium"
15
+ }
16
+ }
17
+ }
@@ -1,12 +1,69 @@
1
1
  import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
- import { OH_MY_OPENAGENT_CONFIG_SCHEMA, normalizeVibePulseConfig, readConfig, writeConfig } from './opencodeConfig';
3
- import { writeFile, unlink, mkdir, mkdtemp, rm } from 'fs/promises';
2
+ import {
3
+ findProjectConfigPath,
4
+ migrateLegacyConfig,
5
+ OH_MY_OPENAGENT_CONFIG_SCHEMA,
6
+ readEffectiveConfig,
7
+ normalizeVibePulseConfig,
8
+ readConfig,
9
+ writeConfig,
10
+ } from './opencodeConfig';
11
+ import { readFile, writeFile, unlink, mkdir, mkdtemp, rm } from 'fs/promises';
4
12
  import { existsSync } from 'fs';
5
- import { join } from 'path';
13
+ import { dirname, join } from 'path';
6
14
  import { tmpdir } from 'os';
15
+ import type { CategoryConfig, OhMyOpenAgentConfig, ProfileConfig } from '@/types/opencodeConfig';
7
16
 
8
17
  const TEST_CONFIG_DIR = join(tmpdir(), 'vibepulse-test-' + Date.now());
9
18
  const TEST_CONFIG_PATH = join(TEST_CONFIG_DIR, 'oh-my-openagent.jsonc');
19
+ const FIXTURE_DIR = join(process.cwd(), 'src', 'lib', 'fixtures', 'opencode-config');
20
+ const LEGACY_V3_FIXTURE_PATH = join(FIXTURE_DIR, 'oh-my-opencode.v3.jsonc');
21
+ const CANONICAL_V4_FIXTURE_PATH = join(FIXTURE_DIR, 'oh-my-openagent.v4.jsonc');
22
+ const SECRET_LIKE_V4_FIXTURE_PATH = join(FIXTURE_DIR, 'oh-my-openagent.v4.secret-like.jsonc');
23
+
24
+ const typedV4Config: OhMyOpenAgentConfig = {
25
+ team_mode: {
26
+ enabled: true,
27
+ futureTeamModeField: 'preserved',
28
+ },
29
+ agents: {
30
+ sisyphus: {
31
+ model: 'anthropic/claude-opus-4-6',
32
+ variant: 'max',
33
+ reasoningEffort: 'max',
34
+ maxTokens: 64000,
35
+ thinking: { enabled: true, budget_tokens: 12000 },
36
+ fallback_models: [
37
+ 'openai/gpt-5.4',
38
+ {
39
+ model: 'google/gemini-3.1-pro',
40
+ variant: 'high',
41
+ reasoningEffort: 'max',
42
+ temperature: 0.1,
43
+ top_p: 0.95,
44
+ maxTokens: 32000,
45
+ thinking: { enabled: true },
46
+ futureFallbackField: 'preserved',
47
+ },
48
+ ],
49
+ },
50
+ },
51
+ };
52
+
53
+ const categoryWithFutureFields: CategoryConfig = {
54
+ model: 'openai/gpt-5.4',
55
+ reasoningEffort: 'max',
56
+ fallback_models: [{ model: 'anthropic/claude-opus-4-6', reasoningEffort: 'max' }],
57
+ futureCategoryField: true,
58
+ };
59
+
60
+ const profileWithFutureFields: ProfileConfig = {
61
+ agents: typedV4Config.agents ?? {},
62
+ categories: {
63
+ ultrabrain: categoryWithFutureFields,
64
+ },
65
+ futureProfileField: { enabled: true },
66
+ };
10
67
 
11
68
  function isRecord(value: unknown): value is Record<string, unknown> {
12
69
  return typeof value === 'object' && value !== null;
@@ -145,5 +202,375 @@ describe('opencodeConfig', () => {
145
202
  await rm(testHomeDir, { recursive: true, force: true });
146
203
  }
147
204
  });
205
+
206
+ it('detects and reads the canonical default config when only the canonical file exists', async () => {
207
+ vi.resetModules();
208
+ const testHomeDir = await mkdtemp(join(tmpdir(), 'vibepulse-home-'));
209
+ const originalHome = process.env.HOME;
210
+
211
+ process.env.HOME = testHomeDir;
212
+
213
+ try {
214
+ const {
215
+ CONFIG_PATH: defaultConfigPath,
216
+ LEGACY_CONFIG_PATH: legacyConfigPath,
217
+ detectConfig: detectDefaultConfig,
218
+ detectLegacyConfig: detectDefaultLegacyConfig,
219
+ readConfig: readDefaultConfig,
220
+ } = await import('./opencodeConfig');
221
+
222
+ await mkdir(join(testHomeDir, '.config', 'opencode'), { recursive: true });
223
+ await writeFile(defaultConfigPath, '{"agents":{"sisyphus":{"model":"canonical"}}}');
224
+
225
+ expect(detectDefaultConfig()).toBe(true);
226
+ expect(detectDefaultLegacyConfig()).toBe(false);
227
+ expect(legacyConfigPath).toContain('oh-my-opencode.jsonc');
228
+
229
+ const config = await readDefaultConfig();
230
+
231
+ expect(config.agents?.sisyphus).toEqual({ model: 'canonical' });
232
+ } finally {
233
+ process.env.HOME = originalHome;
234
+ await rm(testHomeDir, { recursive: true, force: true });
235
+ }
236
+ });
237
+
238
+ it('prefers canonical config when canonical and legacy files both exist', async () => {
239
+ vi.resetModules();
240
+ const testHomeDir = await mkdtemp(join(tmpdir(), 'vibepulse-home-'));
241
+ const originalHome = process.env.HOME;
242
+
243
+ process.env.HOME = testHomeDir;
244
+
245
+ try {
246
+ const {
247
+ CONFIG_PATH: defaultConfigPath,
248
+ LEGACY_CONFIG_PATH: legacyConfigPath,
249
+ detectLegacyConfig: detectDefaultLegacyConfig,
250
+ readConfig: readDefaultConfig,
251
+ } = await import('./opencodeConfig');
252
+
253
+ await mkdir(join(testHomeDir, '.config', 'opencode'), { recursive: true });
254
+ await writeFile(defaultConfigPath, '{"agents":{"sisyphus":{"model":"canonical"}}}');
255
+ await writeFile(legacyConfigPath, '{"agents":{"sisyphus":{"model":"legacy"}}}');
256
+
257
+ expect(detectDefaultLegacyConfig()).toBe(true);
258
+
259
+ const config = await readDefaultConfig();
260
+
261
+ expect(config.agents?.sisyphus).toEqual({ model: 'canonical' });
262
+ } finally {
263
+ process.env.HOME = originalHome;
264
+ await rm(testHomeDir, { recursive: true, force: true });
265
+ }
266
+ });
267
+
268
+ it('finds the nearest ancestor project config', async () => {
269
+ const projectRoot = await mkdtemp(join(tmpdir(), 'vibepulse-project-'));
270
+ const nestedDir = join(projectRoot, 'packages', 'app', 'src');
271
+ const rootProjectConfig = join(projectRoot, '.opencode', 'oh-my-openagent.jsonc');
272
+ const nearestProjectConfig = join(projectRoot, 'packages', 'app', '.opencode', 'oh-my-openagent.json');
273
+
274
+ try {
275
+ await mkdir(dirname(rootProjectConfig), { recursive: true });
276
+ await mkdir(dirname(nearestProjectConfig), { recursive: true });
277
+ await mkdir(nestedDir, { recursive: true });
278
+ await writeFile(rootProjectConfig, '{"project":{"name":"root"}}');
279
+ await writeFile(nearestProjectConfig, '{"project":{"name":"nearest"}}');
280
+
281
+ expect(findProjectConfigPath(nestedDir)).toBe(nearestProjectConfig);
282
+ } finally {
283
+ await rm(projectRoot, { recursive: true, force: true });
284
+ }
285
+ });
286
+
287
+ it('finds a nearest legacy jsonc project config while reading effective config', async () => {
288
+ const testDir = await mkdtemp(join(tmpdir(), 'vibepulse-effective-'));
289
+ const userConfigPath = join(testDir, 'user.jsonc');
290
+ const nestedDir = join(testDir, 'workspace', 'src');
291
+ const projectConfigPath = join(testDir, 'workspace', '.opencode', 'oh-my-opencode.jsonc');
292
+
293
+ try {
294
+ await mkdir(nestedDir, { recursive: true });
295
+ await mkdir(dirname(projectConfigPath), { recursive: true });
296
+ await writeFile(userConfigPath, '{"agents":{"sisyphus":{"model":"user"}}}');
297
+ await writeFile(projectConfigPath, '{"agents":{"sisyphus":{"variant":"legacy-jsonc"}}}');
298
+
299
+ expect(findProjectConfigPath(nestedDir)).toBe(projectConfigPath);
300
+
301
+ const config = await readEffectiveConfig({ userConfigPath, projectStartDir: nestedDir });
302
+
303
+ expect(config.agents?.sisyphus).toEqual({ model: 'user', variant: 'legacy-jsonc' });
304
+ } finally {
305
+ await rm(testDir, { recursive: true, force: true });
306
+ }
307
+ });
308
+
309
+ it('finds a nearest legacy json project config while reading effective config', async () => {
310
+ const testDir = await mkdtemp(join(tmpdir(), 'vibepulse-effective-'));
311
+ const userConfigPath = join(testDir, 'user.jsonc');
312
+ const nestedDir = join(testDir, 'workspace', 'src');
313
+ const projectConfigPath = join(testDir, 'workspace', '.opencode', 'oh-my-opencode.json');
314
+
315
+ try {
316
+ await mkdir(nestedDir, { recursive: true });
317
+ await mkdir(dirname(projectConfigPath), { recursive: true });
318
+ await writeFile(userConfigPath, '{"agents":{"sisyphus":{"model":"user"}}}');
319
+ await writeFile(projectConfigPath, '{"agents":{"sisyphus":{"variant":"legacy-json"}}}');
320
+
321
+ expect(findProjectConfigPath(nestedDir)).toBe(projectConfigPath);
322
+
323
+ const config = await readEffectiveConfig({ userConfigPath, projectStartDir: nestedDir });
324
+
325
+ expect(config.agents?.sisyphus).toEqual({ model: 'user', variant: 'legacy-json' });
326
+ } finally {
327
+ await rm(testDir, { recursive: true, force: true });
328
+ }
329
+ });
330
+
331
+ it('prefers canonical project config over legacy project config in the same directory', async () => {
332
+ const projectRoot = await mkdtemp(join(tmpdir(), 'vibepulse-project-'));
333
+ const nestedDir = join(projectRoot, 'src');
334
+ const canonicalProjectConfig = join(projectRoot, '.opencode', 'oh-my-openagent.jsonc');
335
+ const legacyProjectConfig = join(projectRoot, '.opencode', 'oh-my-opencode.jsonc');
336
+
337
+ try {
338
+ await mkdir(nestedDir, { recursive: true });
339
+ await mkdir(dirname(canonicalProjectConfig), { recursive: true });
340
+ await writeFile(canonicalProjectConfig, '{"project":{"name":"canonical"}}');
341
+ await writeFile(legacyProjectConfig, '{"project":{"name":"legacy"}}');
342
+
343
+ expect(findProjectConfigPath(nestedDir)).toBe(canonicalProjectConfig);
344
+ } finally {
345
+ await rm(projectRoot, { recursive: true, force: true });
346
+ }
347
+ });
348
+
349
+ it('ignores a corrupt project file when reading effective config', async () => {
350
+ const testDir = await mkdtemp(join(tmpdir(), 'vibepulse-effective-'));
351
+ const userConfigPath = join(testDir, 'user.jsonc');
352
+ const projectConfigPath = join(testDir, 'project', '.opencode', 'oh-my-openagent.jsonc');
353
+
354
+ try {
355
+ await mkdir(dirname(projectConfigPath), { recursive: true });
356
+ await writeFile(userConfigPath, '{"agents":{"sisyphus":{"model":"user"}}}');
357
+ await writeFile(projectConfigPath, 'not valid {{{ json');
358
+
359
+ const config = await readEffectiveConfig({ userConfigPath, projectConfigPath });
360
+
361
+ expect(config.agents?.sisyphus).toEqual({ model: 'user' });
362
+ } finally {
363
+ await rm(testDir, { recursive: true, force: true });
364
+ }
365
+ });
366
+
367
+ it('uses project config when the user file is missing while reading effective config', async () => {
368
+ const testDir = await mkdtemp(join(tmpdir(), 'vibepulse-effective-'));
369
+ const missingUserConfigPath = join(testDir, 'missing-user.jsonc');
370
+ const projectConfigPath = join(testDir, '.opencode', 'oh-my-openagent.jsonc');
371
+
372
+ try {
373
+ await mkdir(dirname(projectConfigPath), { recursive: true });
374
+ await writeFile(projectConfigPath, '{"agents":{"sisyphus":{"model":"project"}}}');
375
+
376
+ const config = await readEffectiveConfig({ userConfigPath: missingUserConfigPath, projectConfigPath });
377
+
378
+ expect(config.agents?.sisyphus).toEqual({ model: 'project' });
379
+ } finally {
380
+ await rm(testDir, { recursive: true, force: true });
381
+ }
382
+ });
383
+
384
+ it('effective config deep-merges user base and project overlay with arrays replaced', async () => {
385
+ const testDir = await mkdtemp(join(tmpdir(), 'vibepulse-effective-'));
386
+ const userConfigPath = join(testDir, 'user.jsonc');
387
+ const projectConfigPath = join(testDir, 'workspace', '.opencode', 'oh-my-openagent.jsonc');
388
+
389
+ try {
390
+ await mkdir(dirname(projectConfigPath), { recursive: true });
391
+ await writeFile(userConfigPath, JSON.stringify({
392
+ agents: {
393
+ sisyphus: {
394
+ model: 'user-model',
395
+ temperature: 0.2,
396
+ fallback_models: ['user-fallback'],
397
+ nested: { keep: true, replace: 'user' },
398
+ },
399
+ prometheus: { model: 'user-prometheus' },
400
+ },
401
+ future_top_level: { keep: true },
402
+ }));
403
+ await writeFile(projectConfigPath, JSON.stringify({
404
+ agents: {
405
+ sisyphus: {
406
+ variant: 'max',
407
+ fallback_models: ['project-fallback'],
408
+ nested: { replace: 'project' },
409
+ },
410
+ },
411
+ }));
412
+
413
+ const config = await readEffectiveConfig({ userConfigPath, projectConfigPath });
414
+
415
+ expect(config.agents?.sisyphus).toEqual({
416
+ model: 'user-model',
417
+ temperature: 0.2,
418
+ variant: 'max',
419
+ fallback_models: ['project-fallback'],
420
+ nested: { keep: true, replace: 'project' },
421
+ });
422
+ expect(config.agents?.prometheus).toEqual({ model: 'user-prometheus' });
423
+ expect(config.future_top_level).toEqual({ keep: true });
424
+ } finally {
425
+ await rm(testDir, { recursive: true, force: true });
426
+ }
427
+ });
428
+
429
+ it('migrates legacy config explicitly with a timestamped backup', async () => {
430
+ const testDir = await mkdtemp(join(tmpdir(), 'vibepulse-migrate-'));
431
+ const legacyPath = join(testDir, 'oh-my-opencode.jsonc');
432
+ const canonicalPath = join(testDir, 'oh-my-openagent.jsonc');
433
+
434
+ try {
435
+ await writeFile(legacyPath, '{"agents":{"sisyphus":{"model":"legacy"}}}');
436
+
437
+ const result = await migrateLegacyConfig({
438
+ legacyPath,
439
+ canonicalPath,
440
+ now: () => new Date('2026-05-11T12:00:00.000Z'),
441
+ });
442
+
443
+ expect(result).toEqual({
444
+ migrated: true,
445
+ legacyPath,
446
+ canonicalPath,
447
+ backupPath: join(testDir, 'oh-my-opencode.jsonc.backup-2026-05-11T12-00-00-000Z'),
448
+ });
449
+ expect(await readConfig(canonicalPath)).toEqual({ agents: { sisyphus: { model: 'legacy' } } });
450
+ expect(await readFile(result.backupPath!, 'utf-8')).toBe('{"agents":{"sisyphus":{"model":"legacy"}}}');
451
+ } finally {
452
+ await rm(testDir, { recursive: true, force: true });
453
+ }
454
+ });
455
+
456
+ it('migration rollback keeps legacy and backup when canonical write fails', async () => {
457
+ const testDir = await mkdtemp(join(tmpdir(), 'vibepulse-migrate-'));
458
+ const legacyPath = join(testDir, 'oh-my-opencode.jsonc');
459
+ const canonicalPath = join(testDir, 'oh-my-openagent.jsonc');
460
+ const backupPath = join(testDir, 'legacy.backup');
461
+
462
+ await writeFile(legacyPath, '{"agents":{"sisyphus":{"model":"legacy"}}}');
463
+
464
+ try {
465
+ await expect(migrateLegacyConfig({
466
+ legacyPath,
467
+ canonicalPath,
468
+ backupPath,
469
+ writeCanonicalConfig: async () => {
470
+ await writeFile(canonicalPath, 'partial canonical');
471
+ throw new Error('canonical write failed');
472
+ },
473
+ })).rejects.toThrow('canonical write failed');
474
+
475
+ expect(await readFile(legacyPath, 'utf-8')).toBe('{"agents":{"sisyphus":{"model":"legacy"}}}');
476
+ expect(await readFile(backupPath, 'utf-8')).toBe('{"agents":{"sisyphus":{"model":"legacy"}}}');
477
+ expect(existsSync(canonicalPath)).toBe(false);
478
+ } finally {
479
+ await rm(testDir, { recursive: true, force: true });
480
+ }
481
+ });
482
+
483
+ it('rejects malformed legacy config without creating canonical config', async () => {
484
+ const testDir = await mkdtemp(join(tmpdir(), 'vibepulse-migrate-'));
485
+ const legacyPath = join(testDir, 'oh-my-opencode.jsonc');
486
+ const canonicalPath = join(testDir, 'oh-my-openagent.jsonc');
487
+ const backupPath = join(testDir, 'legacy.backup');
488
+ const malformedLegacyConfig = '{"agents":{"sisyphus":{"model":"legacy"}}';
489
+
490
+ await writeFile(legacyPath, malformedLegacyConfig);
491
+
492
+ try {
493
+ await expect(migrateLegacyConfig({
494
+ legacyPath,
495
+ canonicalPath,
496
+ backupPath,
497
+ })).rejects.toThrow('Failed to read legacy config');
498
+
499
+ expect(await readFile(legacyPath, 'utf-8')).toBe(malformedLegacyConfig);
500
+ expect(await readFile(backupPath, 'utf-8')).toBe(malformedLegacyConfig);
501
+ expect(existsSync(canonicalPath)).toBe(false);
502
+ } finally {
503
+ await rm(testDir, { recursive: true, force: true });
504
+ }
505
+ });
506
+
507
+ it('reads the legacy v3 basename fixture', async () => {
508
+ const config = await readConfig(LEGACY_V3_FIXTURE_PATH);
509
+
510
+ expect(config.$schema).toContain('oh-my-opencode.schema.json');
511
+ expect(config.agents?.sisyphus).toEqual({
512
+ model: 'anthropic/claude-sonnet-4-5',
513
+ variant: 'high',
514
+ temperature: 0.2,
515
+ top_p: 0.9,
516
+ });
517
+ });
518
+
519
+ it('preserves canonical v4 team mode, fallback model objects, and future fields', async () => {
520
+ const config = await readConfig(CANONICAL_V4_FIXTURE_PATH);
521
+
522
+ expect(config.$schema).toBe('https://raw.githubusercontent.com/code-yeongyu/oh-my-openagent/master/assets/oh-my-openagent.schema.json');
523
+ expect(config.team_mode).toEqual({
524
+ enabled: true,
525
+ workspace: 'team-alpha',
526
+ future_policy: { approval: 'required' },
527
+ });
528
+ expect(config.agents?.sisyphus?.reasoningEffort).toBe('max');
529
+ expect(config.agents?.sisyphus?.maxTokens).toBe(64000);
530
+ expect(config.agents?.sisyphus?.thinking).toEqual({ type: 'enabled', budget_tokens: 12000 });
531
+ expect(config.agents?.sisyphus?.fallback_models).toEqual([
532
+ 'openai/gpt-5.4',
533
+ expect.objectContaining({
534
+ model: 'google/gemini-3.1-pro',
535
+ variant: 'high',
536
+ reasoningEffort: 'max',
537
+ maxTokens: 32000,
538
+ futureFallbackField: 'preserve-me',
539
+ }),
540
+ ]);
541
+ expect(config.categories?.ultrabrain?.fallback_models).toEqual([
542
+ 'anthropic/claude-opus-4-6',
543
+ expect.objectContaining({ reasoningEffort: 'max', thinking: { enabled: true } }),
544
+ ]);
545
+ expect(config.categories?.ultrabrain?.future_category_knob).toBe('keep-me');
546
+ expect(config.future_top_level).toEqual({ enabled: true });
547
+
548
+ await writeConfig(config, TEST_CONFIG_PATH);
549
+ const echoed = await readConfig(TEST_CONFIG_PATH);
550
+
551
+ expect(echoed.team_mode).toEqual(config.team_mode);
552
+ expect(echoed.agents?.sisyphus?.fallback_models).toEqual(config.agents?.sisyphus?.fallback_models);
553
+ expect(echoed.categories?.ultrabrain?.future_category_knob).toBe('keep-me');
554
+ expect(echoed.future_top_level).toEqual({ enabled: true });
555
+ });
556
+
557
+ it('keeps secret-like v4 fixture payloads available for later rejection tests', async () => {
558
+ const config = await readConfig(SECRET_LIKE_V4_FIXTURE_PATH);
559
+
560
+ expect(config.agents?.['dangerous-example']?.apiKey).toBe('sk-test-do-not-use');
561
+ expect(config.agents?.['dangerous-example']?.fallback_models).toEqual([
562
+ expect.objectContaining({ password: 'example-password' }),
563
+ ]);
564
+ expect(config.future_secret_payload).toEqual({ client_secret: 'example-secret' });
565
+ });
566
+
567
+ it('type-checks rich v4 fallback models and future profile/category fields', () => {
568
+ expect(typedV4Config.agents?.sisyphus?.fallback_models).toEqual([
569
+ 'openai/gpt-5.4',
570
+ expect.objectContaining({ reasoningEffort: 'max', maxTokens: 32000 }),
571
+ ]);
572
+ expect(profileWithFutureFields.categories?.ultrabrain.futureCategoryField).toBe(true);
573
+ expect(profileWithFutureFields.futureProfileField).toEqual({ enabled: true });
574
+ });
148
575
  });
149
576
  });