vibedoc 1.8.0 โ†’ 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (602) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +6 -0
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +13 -13
  5. package/.next/routes-manifest.json +36 -0
  6. package/.next/server/app/(app)/activity/page.js +2 -2
  7. package/.next/server/app/(app)/activity/page.js.nft.json +1 -1
  8. package/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/(app)/board/page.js +2 -2
  10. package/.next/server/app/(app)/board/page.js.nft.json +1 -1
  11. package/.next/server/app/(app)/board/page_client-reference-manifest.js +1 -1
  12. package/.next/server/app/(app)/chat/page.js +2 -2
  13. package/.next/server/app/(app)/chat/page.js.nft.json +1 -1
  14. package/.next/server/app/(app)/chat/page_client-reference-manifest.js +1 -1
  15. package/.next/server/app/(app)/docs/page.js +2 -2
  16. package/.next/server/app/(app)/docs/page.js.nft.json +1 -1
  17. package/.next/server/app/(app)/docs/page_client-reference-manifest.js +1 -1
  18. package/.next/server/app/(app)/explorer/page.js +2 -2
  19. package/.next/server/app/(app)/explorer/page.js.nft.json +1 -1
  20. package/.next/server/app/(app)/explorer/page_client-reference-manifest.js +1 -1
  21. package/.next/server/app/(app)/manual-tests/page.js +2 -2
  22. package/.next/server/app/(app)/manual-tests/page.js.nft.json +1 -1
  23. package/.next/server/app/(app)/manual-tests/page_client-reference-manifest.js +1 -1
  24. package/.next/server/app/(app)/memory/page.js +2 -2
  25. package/.next/server/app/(app)/memory/page.js.nft.json +1 -1
  26. package/.next/server/app/(app)/memory/page_client-reference-manifest.js +1 -1
  27. package/.next/server/app/(app)/roadmap/page.js +2 -2
  28. package/.next/server/app/(app)/roadmap/page.js.nft.json +1 -1
  29. package/.next/server/app/(app)/roadmap/page_client-reference-manifest.js +1 -1
  30. package/.next/server/app/(app)/settings/page.js +2 -2
  31. package/.next/server/app/(app)/settings/page.js.nft.json +1 -1
  32. package/.next/server/app/(app)/settings/page_client-reference-manifest.js +1 -1
  33. package/.next/server/app/(app)/setup/page.js +2 -2
  34. package/.next/server/app/(app)/setup/page.js.nft.json +1 -1
  35. package/.next/server/app/(app)/setup/page_client-reference-manifest.js +1 -1
  36. package/.next/server/app/_global-error/page.js +2 -2
  37. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  38. package/.next/server/app/_global-error.html +1 -1
  39. package/.next/server/app/_global-error.rsc +1 -1
  40. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  41. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  42. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  43. package/.next/server/app/_not-found/page.js +2 -2
  44. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  45. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  46. package/.next/server/app/_not-found.html +1 -1
  47. package/.next/server/app/_not-found.rsc +2 -2
  48. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  49. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  50. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  51. package/.next/server/app/activity.html +1 -1
  52. package/.next/server/app/activity.rsc +22 -23
  53. package/.next/server/app/activity.segments/!KGFwcCk/activity/__PAGE__.segment.rsc +11 -9
  54. package/.next/server/app/activity.segments/_full.segment.rsc +22 -23
  55. package/.next/server/app/activity.segments/_tree.segment.rsc +2 -2
  56. package/.next/server/app/api/activity/route.js +2 -2
  57. package/.next/server/app/api/activity/route.js.nft.json +1 -1
  58. package/.next/server/app/api/backlinks/route.js +2 -2
  59. package/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  60. package/.next/server/app/api/chat/route.js +3 -3
  61. package/.next/server/app/api/chat/route.js.nft.json +1 -1
  62. package/.next/server/app/api/context/route.js +2 -2
  63. package/.next/server/app/api/context/route.js.nft.json +1 -1
  64. package/.next/server/app/api/conversations/route.js +3 -3
  65. package/.next/server/app/api/conversations/route.js.nft.json +1 -1
  66. package/.next/server/app/api/decisions/route.js +2 -2
  67. package/.next/server/app/api/decisions/route.js.nft.json +1 -1
  68. package/.next/server/app/api/docs/route.js +3 -3
  69. package/.next/server/app/api/docs/route.js.nft.json +1 -1
  70. package/.next/server/app/api/explorer/route.js +3 -3
  71. package/.next/server/app/api/explorer/route.js.nft.json +1 -1
  72. package/.next/server/app/api/mcp/route.js +3 -3
  73. package/.next/server/app/api/mcp/route.js.nft.json +1 -1
  74. package/.next/server/app/api/memory/entries/delete/route/app-paths-manifest.json +3 -0
  75. package/.next/server/app/api/memory/entries/delete/route/build-manifest.json +12 -0
  76. package/.next/server/app/api/memory/entries/delete/route/server-reference-manifest.json +4 -0
  77. package/.next/server/app/api/memory/entries/delete/route.js +9 -0
  78. package/.next/server/app/api/memory/entries/delete/route.js.map +5 -0
  79. package/.next/server/app/api/memory/entries/delete/route.js.nft.json +1 -0
  80. package/.next/server/app/api/memory/entries/delete/route_client-reference-manifest.js +3 -0
  81. package/.next/server/app/api/memory/entries/restore/route/app-paths-manifest.json +3 -0
  82. package/.next/server/app/api/memory/entries/restore/route/build-manifest.json +12 -0
  83. package/.next/server/app/api/memory/entries/restore/route/server-reference-manifest.json +4 -0
  84. package/.next/server/app/api/memory/entries/restore/route.js +9 -0
  85. package/.next/server/app/api/memory/entries/restore/route.js.map +5 -0
  86. package/.next/server/app/api/memory/entries/restore/route.js.nft.json +1 -0
  87. package/.next/server/app/api/memory/entries/restore/route_client-reference-manifest.js +3 -0
  88. package/.next/server/app/api/memory/entries/route/app-paths-manifest.json +3 -0
  89. package/.next/server/app/api/memory/entries/route/build-manifest.json +12 -0
  90. package/.next/server/app/api/memory/entries/route/server-reference-manifest.json +4 -0
  91. package/.next/server/app/api/memory/entries/route.js +8 -0
  92. package/.next/server/app/api/memory/entries/route.js.map +5 -0
  93. package/.next/server/app/api/memory/entries/route.js.nft.json +1 -0
  94. package/.next/server/app/api/memory/entries/route_client-reference-manifest.js +3 -0
  95. package/.next/server/app/api/memory/entries/save/route/app-paths-manifest.json +3 -0
  96. package/.next/server/app/api/memory/entries/save/route/build-manifest.json +12 -0
  97. package/.next/server/app/api/memory/entries/save/route/server-reference-manifest.json +4 -0
  98. package/.next/server/app/api/memory/entries/save/route.js +9 -0
  99. package/.next/server/app/api/memory/entries/save/route.js.map +5 -0
  100. package/.next/server/app/api/memory/entries/save/route.js.nft.json +1 -0
  101. package/.next/server/app/api/memory/entries/save/route_client-reference-manifest.js +3 -0
  102. package/.next/server/app/api/memory/graph/route/app-paths-manifest.json +3 -0
  103. package/.next/server/app/api/memory/graph/route/build-manifest.json +12 -0
  104. package/.next/server/app/api/memory/graph/route/server-reference-manifest.json +4 -0
  105. package/.next/server/app/api/memory/graph/route.js +9 -0
  106. package/.next/server/app/api/memory/graph/route.js.map +5 -0
  107. package/.next/server/app/api/memory/graph/route.js.nft.json +1 -0
  108. package/.next/server/app/api/memory/graph/route_client-reference-manifest.js +3 -0
  109. package/.next/server/app/api/memory/history/route/app-paths-manifest.json +3 -0
  110. package/.next/server/app/api/memory/history/route/build-manifest.json +12 -0
  111. package/.next/server/app/api/memory/history/route/server-reference-manifest.json +4 -0
  112. package/.next/server/app/api/memory/history/route.js +9 -0
  113. package/.next/server/app/api/memory/history/route.js.map +5 -0
  114. package/.next/server/app/api/memory/history/route.js.nft.json +1 -0
  115. package/.next/server/app/api/memory/history/route_client-reference-manifest.js +3 -0
  116. package/.next/server/app/api/memory/route.js +2 -2
  117. package/.next/server/app/api/memory/route.js.nft.json +1 -1
  118. package/.next/server/app/api/plan/apply/route.js +3 -3
  119. package/.next/server/app/api/plan/apply/route.js.nft.json +1 -1
  120. package/.next/server/app/api/projects/route.js +2 -2
  121. package/.next/server/app/api/projects/route.js.nft.json +1 -1
  122. package/.next/server/app/api/registry/route.js +2 -2
  123. package/.next/server/app/api/registry/route.js.nft.json +1 -1
  124. package/.next/server/app/api/roadmap/create/route.js +3 -3
  125. package/.next/server/app/api/roadmap/create/route.js.nft.json +1 -1
  126. package/.next/server/app/api/roadmap/delete/route.js +3 -3
  127. package/.next/server/app/api/roadmap/delete/route.js.nft.json +1 -1
  128. package/.next/server/app/api/roadmap/generate/route.js +3 -3
  129. package/.next/server/app/api/roadmap/generate/route.js.nft.json +1 -1
  130. package/.next/server/app/api/roadmap/layout/route.js +3 -3
  131. package/.next/server/app/api/roadmap/layout/route.js.nft.json +1 -1
  132. package/.next/server/app/api/roadmap/restore/route.js +3 -3
  133. package/.next/server/app/api/roadmap/restore/route.js.nft.json +1 -1
  134. package/.next/server/app/api/roadmap/route.js +2 -2
  135. package/.next/server/app/api/roadmap/route.js.nft.json +1 -1
  136. package/.next/server/app/api/roadmap/update/route.js +3 -3
  137. package/.next/server/app/api/roadmap/update/route.js.nft.json +1 -1
  138. package/.next/server/app/api/sessions/route.js +2 -2
  139. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  140. package/.next/server/app/api/settings/route.js +2 -2
  141. package/.next/server/app/api/settings/route.js.nft.json +1 -1
  142. package/.next/server/app/api/setup/generate/route.js +4 -4
  143. package/.next/server/app/api/setup/generate/route.js.nft.json +1 -1
  144. package/.next/server/app/api/setup/write/route.js +2 -2
  145. package/.next/server/app/api/setup/write/route.js.nft.json +1 -1
  146. package/.next/server/app/api/summary/route.js +2 -2
  147. package/.next/server/app/api/summary/route.js.nft.json +1 -1
  148. package/.next/server/app/api/tasks/bulk/route.js +3 -3
  149. package/.next/server/app/api/tasks/bulk/route.js.nft.json +1 -1
  150. package/.next/server/app/api/tasks/create/route.js +2 -2
  151. package/.next/server/app/api/tasks/create/route.js.nft.json +1 -1
  152. package/.next/server/app/api/tasks/delete/route.js +3 -3
  153. package/.next/server/app/api/tasks/delete/route.js.nft.json +1 -1
  154. package/.next/server/app/api/tasks/manual-tests/route.js +2 -2
  155. package/.next/server/app/api/tasks/manual-tests/route.js.nft.json +1 -1
  156. package/.next/server/app/api/tasks/restore/route.js +3 -3
  157. package/.next/server/app/api/tasks/restore/route.js.nft.json +1 -1
  158. package/.next/server/app/api/tasks/review/route.js +3 -3
  159. package/.next/server/app/api/tasks/review/route.js.nft.json +1 -1
  160. package/.next/server/app/api/tasks/route.js +2 -2
  161. package/.next/server/app/api/tasks/route.js.nft.json +1 -1
  162. package/.next/server/app/api/tasks/update/route.js +3 -3
  163. package/.next/server/app/api/tasks/update/route.js.nft.json +1 -1
  164. package/.next/server/app/api/views/route.js +3 -3
  165. package/.next/server/app/api/views/route.js.nft.json +1 -1
  166. package/.next/server/app/board.html +1 -1
  167. package/.next/server/app/board.rsc +22 -23
  168. package/.next/server/app/board.segments/!KGFwcCk/board/__PAGE__.segment.rsc +6 -6
  169. package/.next/server/app/board.segments/_full.segment.rsc +22 -23
  170. package/.next/server/app/board.segments/_tree.segment.rsc +2 -2
  171. package/.next/server/app/chat.html +1 -1
  172. package/.next/server/app/chat.rsc +22 -23
  173. package/.next/server/app/chat.segments/!KGFwcCk/chat/__PAGE__.segment.rsc +9 -11
  174. package/.next/server/app/chat.segments/_full.segment.rsc +22 -23
  175. package/.next/server/app/chat.segments/_tree.segment.rsc +2 -2
  176. package/.next/server/app/docs.html +1 -1
  177. package/.next/server/app/docs.rsc +22 -23
  178. package/.next/server/app/docs.segments/!KGFwcCk/docs/__PAGE__.segment.rsc +6 -6
  179. package/.next/server/app/docs.segments/_full.segment.rsc +22 -23
  180. package/.next/server/app/docs.segments/_tree.segment.rsc +2 -2
  181. package/.next/server/app/explorer.html +1 -1
  182. package/.next/server/app/explorer.rsc +22 -23
  183. package/.next/server/app/explorer.segments/!KGFwcCk/explorer/__PAGE__.segment.rsc +5 -5
  184. package/.next/server/app/explorer.segments/_full.segment.rsc +22 -23
  185. package/.next/server/app/explorer.segments/_tree.segment.rsc +2 -2
  186. package/.next/server/app/index.html +1 -1
  187. package/.next/server/app/index.rsc +2 -2
  188. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  189. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  190. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  191. package/.next/server/app/manual-tests.html +1 -1
  192. package/.next/server/app/manual-tests.rsc +22 -23
  193. package/.next/server/app/manual-tests.segments/!KGFwcCk/manual-tests/__PAGE__.segment.rsc +5 -5
  194. package/.next/server/app/manual-tests.segments/_full.segment.rsc +22 -23
  195. package/.next/server/app/manual-tests.segments/_tree.segment.rsc +2 -2
  196. package/.next/server/app/memory.html +1 -1
  197. package/.next/server/app/memory.rsc +23 -23
  198. package/.next/server/app/memory.segments/!KGFwcCk/memory/__PAGE__.segment.rsc +12 -10
  199. package/.next/server/app/memory.segments/_full.segment.rsc +23 -23
  200. package/.next/server/app/memory.segments/_tree.segment.rsc +3 -2
  201. package/.next/server/app/page.js +2 -2
  202. package/.next/server/app/page.js.nft.json +1 -1
  203. package/.next/server/app/page_client-reference-manifest.js +1 -1
  204. package/.next/server/app/roadmap.html +1 -1
  205. package/.next/server/app/roadmap.rsc +22 -23
  206. package/.next/server/app/roadmap.segments/!KGFwcCk/roadmap/__PAGE__.segment.rsc +6 -6
  207. package/.next/server/app/roadmap.segments/_full.segment.rsc +22 -23
  208. package/.next/server/app/roadmap.segments/_tree.segment.rsc +2 -2
  209. package/.next/server/app/settings.html +1 -1
  210. package/.next/server/app/settings.rsc +22 -23
  211. package/.next/server/app/settings.segments/!KGFwcCk/settings/__PAGE__.segment.rsc +10 -9
  212. package/.next/server/app/settings.segments/_full.segment.rsc +22 -23
  213. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  214. package/.next/server/app/setup.html +1 -1
  215. package/.next/server/app/setup.rsc +22 -23
  216. package/.next/server/app/setup.segments/!KGFwcCk/setup/__PAGE__.segment.rsc +5 -5
  217. package/.next/server/app/setup.segments/_full.segment.rsc +22 -23
  218. package/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
  219. package/.next/server/app-paths-manifest.json +6 -0
  220. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_00p3fu1._.js โ†’ 11mp_@anthropic-ai_sdk_0-_cqh8._.js} +1 -1
  221. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_01jjl08._.js โ†’ 11mp_@anthropic-ai_sdk_00o5o78._.js} +1 -1
  222. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_01amtux._.js โ†’ 11mp_@anthropic-ai_sdk_03cp17a._.js} +1 -1
  223. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_071zfm8._.js โ†’ 11mp_@anthropic-ai_sdk_07dk2er._.js} +1 -1
  224. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0_e9zpr._.js +3 -0
  225. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0_xx_qf._.js +3 -0
  226. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0aer9lc._.js +3 -0
  227. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0ax30pe._.js +3 -0
  228. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0gn7vgs._.js +3 -0
  229. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0hye94a._.js +3 -0
  230. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0ir5cgk._.js +3 -0
  231. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0je0_pa._.js +3 -0
  232. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0jfgh0o._.js +3 -0
  233. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0mha4x1._.js +3 -0
  234. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0n__boa._.js +3 -0
  235. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0sqv26_._.js +3 -0
  236. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0wnc6g-._.js +3 -0
  237. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0xh0g59._.js +3 -0
  238. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1-5wyhj._.js +3 -0
  239. package/.next/server/chunks/11mp_@anthropic-ai_sdk_13ahm3n._.js +3 -0
  240. package/.next/server/chunks/11mp_@anthropic-ai_sdk_13e6aq4._.js +3 -0
  241. package/.next/server/chunks/11mp_@anthropic-ai_sdk_14eg0ld._.js +3 -0
  242. package/.next/server/chunks/11mp_@anthropic-ai_sdk_15md1n2._.js +3 -0
  243. package/.next/server/chunks/11mp_@anthropic-ai_sdk_16av8b9._.js +3 -0
  244. package/.next/server/chunks/11mp_@anthropic-ai_sdk_16hjhv1._.js +3 -0
  245. package/.next/server/chunks/11mp_@anthropic-ai_sdk_16txvf7._.js +3 -0
  246. package/.next/server/chunks/11mp_@anthropic-ai_sdk_198yu7d._.js +3 -0
  247. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1_9tfq3._.js +3 -0
  248. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1_izr2o._.js +3 -0
  249. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1fljcyg._.js +3 -0
  250. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1lrt6ul._.js +3 -0
  251. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1nev_ee._.js +3 -0
  252. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1pgoe2i._.js +3 -0
  253. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1rgl7mu._.js +3 -0
  254. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1slq49k._.js +3 -0
  255. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1slq49k._.js.map +1 -0
  256. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1t9bdf0._.js +3 -0
  257. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1t9bdf0._.js.map +1 -0
  258. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1u6qqm2._.js +3 -0
  259. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1u6qqm2._.js.map +1 -0
  260. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1v7ygvz._.js +3 -0
  261. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1v7ygvz._.js.map +1 -0
  262. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1wls8zc._.js +3 -0
  263. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1wls8zc._.js.map +1 -0
  264. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1ywboja._.js +3 -0
  265. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1ywboja._.js.map +1 -0
  266. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_00kwqu5._.js +3 -0
  267. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_01j2nrd._.js +3 -0
  268. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_05ybj3t._.js +3 -0
  269. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0adt7jj._.js +3 -0
  270. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0bnl14w._.js +3 -0
  271. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0f557t9._.js +3 -0
  272. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0ra6giw._.js +3 -0
  273. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_107cqfx._.js +3 -0
  274. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1377sl6._.js +3 -0
  275. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1_2hcok._.js +3 -0
  276. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1g--m6y._.js +3 -0
  277. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1geopi5._.js +3 -0
  278. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1i11dte._.js +3 -0
  279. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1mj3_qk._.js +3 -0
  280. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1qgy210._.js +3 -0
  281. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1rkng9q._.js +3 -0
  282. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1vr8q8y._.js +3 -0
  283. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1x8b64g._.js +3 -0
  284. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1x8b64g._.js.map +1 -0
  285. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1zhahf7._.js +3 -0
  286. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1zhahf7._.js.map +1 -0
  287. package/.next/server/chunks/[root-of-the-server]__008focd._.js +3 -0
  288. package/.next/server/chunks/{[root-of-the-server]__1vh9g2o._.js.map โ†’ [root-of-the-server]__008focd._.js.map} +1 -1
  289. package/.next/server/chunks/[root-of-the-server]__01xmabe._.js +3 -0
  290. package/.next/server/chunks/{[root-of-the-server]__1-e3i_5._.js.map โ†’ [root-of-the-server]__01xmabe._.js.map} +1 -1
  291. package/.next/server/chunks/[root-of-the-server]__03ogp2r._.js +3 -0
  292. package/.next/server/chunks/[root-of-the-server]__03ogp2r._.js.map +1 -0
  293. package/.next/server/chunks/[root-of-the-server]__05us508._.js +3 -0
  294. package/.next/server/chunks/{[root-of-the-server]__0vcsqzd._.js.map โ†’ [root-of-the-server]__05us508._.js.map} +1 -1
  295. package/.next/server/chunks/[root-of-the-server]__08yaps5._.js +3 -0
  296. package/.next/server/chunks/{[root-of-the-server]__1ezzeji._.js.map โ†’ [root-of-the-server]__08yaps5._.js.map} +1 -1
  297. package/.next/server/chunks/{[root-of-the-server]__11s-8eg._.js โ†’ [root-of-the-server]__09oyvwa._.js} +2 -2
  298. package/.next/server/chunks/{[root-of-the-server]__1wr0m-s._.js.map โ†’ [root-of-the-server]__09oyvwa._.js.map} +1 -1
  299. package/.next/server/chunks/[root-of-the-server]__0axugex._.js +3 -0
  300. package/.next/server/chunks/{[root-of-the-server]__0-pmfg2._.js.map โ†’ [root-of-the-server]__0axugex._.js.map} +1 -1
  301. package/.next/server/chunks/[root-of-the-server]__0b2488c._.js +3 -0
  302. package/.next/server/chunks/{[root-of-the-server]__0b5pwze._.js.map โ†’ [root-of-the-server]__0b2488c._.js.map} +1 -1
  303. package/.next/server/chunks/[root-of-the-server]__0b6w_wb._.js +3 -0
  304. package/.next/server/chunks/[root-of-the-server]__0b6w_wb._.js.map +1 -0
  305. package/.next/server/chunks/{[root-of-the-server]__04tibmn._.js โ†’ [root-of-the-server]__0cbh1s-._.js} +2 -2
  306. package/.next/server/chunks/{[root-of-the-server]__02co2yq._.js.map โ†’ [root-of-the-server]__0cbh1s-._.js.map} +1 -1
  307. package/.next/server/chunks/[root-of-the-server]__0exzf-v._.js +3 -0
  308. package/.next/server/chunks/{[root-of-the-server]__1qusy4g._.js.map โ†’ [root-of-the-server]__0exzf-v._.js.map} +1 -1
  309. package/.next/server/chunks/[root-of-the-server]__0gnil0m._.js +3 -0
  310. package/.next/server/chunks/{[root-of-the-server]__18kxo4a._.js.map โ†’ [root-of-the-server]__0gnil0m._.js.map} +1 -1
  311. package/.next/server/chunks/{[root-of-the-server]__1mrmaf9._.js โ†’ [root-of-the-server]__0hfyuhq._.js} +2 -2
  312. package/.next/server/chunks/[root-of-the-server]__0hfyuhq._.js.map +1 -0
  313. package/.next/server/chunks/[root-of-the-server]__0hg1r2b._.js +3 -0
  314. package/.next/server/chunks/{[root-of-the-server]__0q3-t8a._.js.map โ†’ [root-of-the-server]__0hg1r2b._.js.map} +1 -1
  315. package/.next/server/chunks/[root-of-the-server]__0ikbk15._.js +3 -0
  316. package/.next/server/chunks/{[root-of-the-server]__19k8t87._.js.map โ†’ [root-of-the-server]__0ikbk15._.js.map} +1 -1
  317. package/.next/server/chunks/[root-of-the-server]__0jr_5eq._.js +110 -0
  318. package/.next/server/chunks/[root-of-the-server]__0jr_5eq._.js.map +1 -0
  319. package/.next/server/chunks/[root-of-the-server]__0khz7sy._.js +3 -0
  320. package/.next/server/chunks/{[root-of-the-server]__1jxu2x9._.js.map โ†’ [root-of-the-server]__0khz7sy._.js.map} +1 -1
  321. package/.next/server/chunks/[root-of-the-server]__0lf11mz._.js +3 -0
  322. package/.next/server/chunks/{[root-of-the-server]__1lj_2cv._.js.map โ†’ [root-of-the-server]__0lf11mz._.js.map} +1 -1
  323. package/.next/server/chunks/[root-of-the-server]__0m8hmg0._.js +3 -0
  324. package/.next/server/chunks/{[root-of-the-server]__1umrorf._.js.map โ†’ [root-of-the-server]__0m8hmg0._.js.map} +1 -1
  325. package/.next/server/chunks/[root-of-the-server]__0qij7wy._.js +3 -0
  326. package/.next/server/chunks/{[root-of-the-server]__1vq38ov._.js.map โ†’ [root-of-the-server]__0qij7wy._.js.map} +1 -1
  327. package/.next/server/chunks/[root-of-the-server]__0vf-0gp._.js +3 -0
  328. package/.next/server/chunks/[root-of-the-server]__0vf-0gp._.js.map +1 -0
  329. package/.next/server/chunks/[root-of-the-server]__0x8wtot._.js +3 -0
  330. package/.next/server/chunks/{[root-of-the-server]__05g5cgo._.js.map โ†’ [root-of-the-server]__0x8wtot._.js.map} +1 -1
  331. package/.next/server/chunks/[root-of-the-server]__0y5usoz._.js +3 -0
  332. package/.next/server/chunks/{[root-of-the-server]__1-ic3af._.js.map โ†’ [root-of-the-server]__0y5usoz._.js.map} +1 -1
  333. package/.next/server/chunks/[root-of-the-server]__15c5snv._.js +3 -0
  334. package/.next/server/chunks/{[root-of-the-server]__05l6129._.js.map โ†’ [root-of-the-server]__15c5snv._.js.map} +1 -1
  335. package/.next/server/chunks/[root-of-the-server]__16u25oa._.js +3 -0
  336. package/.next/server/chunks/{[root-of-the-server]__0druay_._.js.map โ†’ [root-of-the-server]__16u25oa._.js.map} +1 -1
  337. package/.next/server/chunks/[root-of-the-server]__18dt3sr._.js +3 -0
  338. package/.next/server/chunks/{[root-of-the-server]__14aeqoi._.js.map โ†’ [root-of-the-server]__18dt3sr._.js.map} +1 -1
  339. package/.next/server/chunks/[root-of-the-server]__19rxcu4._.js +110 -0
  340. package/.next/server/chunks/[root-of-the-server]__19rxcu4._.js.map +1 -0
  341. package/.next/server/chunks/[root-of-the-server]__1_qenei._.js +3 -0
  342. package/.next/server/chunks/[root-of-the-server]__1_qenei._.js.map +1 -0
  343. package/.next/server/chunks/[root-of-the-server]__1a7d63a._.js +3 -0
  344. package/.next/server/chunks/{[root-of-the-server]__11a4ptn._.js.map โ†’ [root-of-the-server]__1a7d63a._.js.map} +1 -1
  345. package/.next/server/chunks/[root-of-the-server]__1b448u7._.js +3 -0
  346. package/.next/server/chunks/{[root-of-the-server]__197vw9g._.js.map โ†’ [root-of-the-server]__1b448u7._.js.map} +1 -1
  347. package/.next/server/chunks/[root-of-the-server]__1e68zmx._.js +3 -0
  348. package/.next/server/chunks/{[root-of-the-server]__15ck1wv._.js.map โ†’ [root-of-the-server]__1e68zmx._.js.map} +1 -1
  349. package/.next/server/chunks/[root-of-the-server]__1gvv2xp._.js +3 -0
  350. package/.next/server/chunks/{[root-of-the-server]__04tibmn._.js.map โ†’ [root-of-the-server]__1gvv2xp._.js.map} +1 -1
  351. package/.next/server/chunks/[root-of-the-server]__1jel07j._.js +3 -0
  352. package/.next/server/chunks/{[root-of-the-server]__12nzy_6._.js.map โ†’ [root-of-the-server]__1jel07j._.js.map} +1 -1
  353. package/.next/server/chunks/[root-of-the-server]__1jz98vb._.js +3 -0
  354. package/.next/server/chunks/{[root-of-the-server]__0p6ja6l._.js.map โ†’ [root-of-the-server]__1jz98vb._.js.map} +1 -1
  355. package/.next/server/chunks/[root-of-the-server]__1la-6xe._.js +3 -0
  356. package/.next/server/chunks/[root-of-the-server]__1la-6xe._.js.map +1 -0
  357. package/.next/server/chunks/[root-of-the-server]__1p6-0l0._.js +3 -0
  358. package/.next/server/chunks/{[root-of-the-server]__1xb0fmp._.js.map โ†’ [root-of-the-server]__1p6-0l0._.js.map} +1 -1
  359. package/.next/server/chunks/[root-of-the-server]__1qd-ecl._.js +110 -0
  360. package/.next/server/chunks/[root-of-the-server]__1qd-ecl._.js.map +1 -0
  361. package/.next/server/chunks/[root-of-the-server]__1r_0uma._.js +3 -0
  362. package/.next/server/chunks/{[root-of-the-server]__11s-8eg._.js.map โ†’ [root-of-the-server]__1r_0uma._.js.map} +1 -1
  363. package/.next/server/chunks/[root-of-the-server]__1ssunti._.js +3 -0
  364. package/.next/server/chunks/{[root-of-the-server]__1mrmaf9._.js.map โ†’ [root-of-the-server]__1ssunti._.js.map} +1 -1
  365. package/.next/server/chunks/[root-of-the-server]__1tu85zx._.js +3 -0
  366. package/.next/server/chunks/[root-of-the-server]__1tu85zx._.js.map +1 -0
  367. package/.next/server/chunks/[root-of-the-server]__1wcd2x9._.js +3 -0
  368. package/.next/server/chunks/[root-of-the-server]__1wcd2x9._.js.map +1 -0
  369. package/.next/server/chunks/[root-of-the-server]__1xpp36t._.js +3 -0
  370. package/.next/server/chunks/[root-of-the-server]__1xpp36t._.js.map +1 -0
  371. package/.next/server/chunks/[root-of-the-server]__1z3tswg._.js +3 -0
  372. package/.next/server/chunks/{[root-of-the-server]__1n68akx._.js.map โ†’ [root-of-the-server]__1z3tswg._.js.map} +1 -1
  373. package/.next/server/chunks/_04byth9._.js +33 -23
  374. package/.next/server/chunks/_04byth9._.js.map +1 -1
  375. package/.next/server/chunks/_0safx0g._.js +10 -0
  376. package/.next/server/chunks/_0safx0g._.js.map +1 -0
  377. package/.next/server/chunks/_next-internal_server_app_api_memory_entries_delete_route_actions_1a4-ad5.js +3 -0
  378. package/.next/server/chunks/_next-internal_server_app_api_memory_entries_delete_route_actions_1a4-ad5.js.map +1 -0
  379. package/.next/server/chunks/_next-internal_server_app_api_memory_entries_restore_route_actions_07637mh.js +3 -0
  380. package/.next/server/chunks/_next-internal_server_app_api_memory_entries_restore_route_actions_07637mh.js.map +1 -0
  381. package/.next/server/chunks/_next-internal_server_app_api_memory_entries_route_actions_0bxuv92.js +3 -0
  382. package/.next/server/chunks/_next-internal_server_app_api_memory_entries_route_actions_0bxuv92.js.map +1 -0
  383. package/.next/server/chunks/_next-internal_server_app_api_memory_entries_save_route_actions_0bwga-2.js +3 -0
  384. package/.next/server/chunks/_next-internal_server_app_api_memory_entries_save_route_actions_0bwga-2.js.map +1 -0
  385. package/.next/server/chunks/_next-internal_server_app_api_memory_graph_route_actions_0pca9et.js +3 -0
  386. package/.next/server/chunks/_next-internal_server_app_api_memory_graph_route_actions_0pca9et.js.map +1 -0
  387. package/.next/server/chunks/_next-internal_server_app_api_memory_history_route_actions_0w5pu5p.js +3 -0
  388. package/.next/server/chunks/_next-internal_server_app_api_memory_history_route_actions_0w5pu5p.js.map +1 -0
  389. package/.next/server/chunks/ssr/[root-of-the-server]__0opgo3t._.js +14 -0
  390. package/.next/server/chunks/ssr/{[root-of-the-server]__0noc5ay._.js.map โ†’ [root-of-the-server]__0opgo3t._.js.map} +1 -1
  391. package/.next/server/chunks/ssr/[root-of-the-server]__1jv5ug1._.js +3 -0
  392. package/.next/server/chunks/ssr/{[root-of-the-server]__1pk-w2i._.js.map โ†’ [root-of-the-server]__1jv5ug1._.js.map} +1 -1
  393. package/.next/server/chunks/ssr/_0i75x-o._.js +3 -0
  394. package/.next/server/chunks/ssr/_0i75x-o._.js.map +1 -0
  395. package/.next/server/chunks/ssr/_15qpb4z._.js +3 -0
  396. package/.next/server/chunks/ssr/_15qpb4z._.js.map +1 -0
  397. package/.next/server/chunks/ssr/_1fg0usp._.js +3 -0
  398. package/.next/server/chunks/ssr/_1fg0usp._.js.map +1 -0
  399. package/.next/server/chunks/ssr/_1h0wfpz._.js +3 -0
  400. package/.next/server/chunks/ssr/_1h0wfpz._.js.map +1 -0
  401. package/.next/server/chunks/ssr/_1ocnpth._.js +3 -0
  402. package/.next/server/chunks/ssr/_1ocnpth._.js.map +1 -0
  403. package/.next/server/chunks/ssr/{_14emfpq._.js โ†’ _1uno162._.js} +2 -2
  404. package/.next/server/chunks/ssr/_1uno162._.js.map +1 -0
  405. package/.next/server/chunks/ssr/node_modules__pnpm_0al3nfy._.js +3 -0
  406. package/.next/server/chunks/ssr/node_modules__pnpm_0al3nfy._.js.map +1 -0
  407. package/.next/server/chunks/ssr/{_1ftruw6._.js โ†’ node_modules__pnpm_0aoa6rg._.js} +2 -2
  408. package/.next/server/chunks/ssr/node_modules__pnpm_0aoa6rg._.js.map +1 -0
  409. package/.next/server/chunks/ssr/src_app_(app)_memory_page_tsx_19jhb1c._.js +13 -0
  410. package/.next/server/chunks/ssr/src_app_(app)_memory_page_tsx_19jhb1c._.js.map +1 -0
  411. package/.next/server/chunks/ssr/src_app_(app)_settings_page_tsx_0zevtee._.js +1 -1
  412. package/.next/server/chunks/ssr/src_app_(app)_settings_page_tsx_0zevtee._.js.map +1 -1
  413. package/.next/server/chunks/ssr/src_components_0eyr_zi._.js +3 -0
  414. package/.next/server/chunks/ssr/src_components_0eyr_zi._.js.map +1 -0
  415. package/.next/server/chunks/ssr/src_components_1s861m8._.js +3 -0
  416. package/.next/server/chunks/ssr/src_components_1s861m8._.js.map +1 -0
  417. package/.next/server/middleware-build-manifest.js +3 -3
  418. package/.next/server/pages/404.html +1 -1
  419. package/.next/server/pages/500.html +1 -1
  420. package/.next/server/server-reference-manifest.js +1 -1
  421. package/.next/server/server-reference-manifest.json +1 -1
  422. package/.next/static/chunks/0b547y6rqct9z.js +1 -0
  423. package/.next/static/chunks/0e3ha56i_0j05.css +1 -0
  424. package/.next/static/chunks/0f32hudp0yir7.js +2 -0
  425. package/.next/static/chunks/0rsmz1jgro1kj.js +1 -0
  426. package/.next/static/chunks/0wnq_kh8-6wc1.js +2 -0
  427. package/.next/static/chunks/1acpfyut6j4e2.js +1 -0
  428. package/.next/static/chunks/{1xyepk9227yej.js โ†’ 1l_dys0-y5-r7.js} +6 -6
  429. package/.next/static/chunks/1rko_88i85yqb.js +21 -0
  430. package/.next/static/chunks/20mdcup14_0yi.js +11 -0
  431. package/.next/static/chunks/24u_rc2tbkhai.js +3 -0
  432. package/.next/static/chunks/2p-pkveutoh75.js +1 -0
  433. package/.next/static/chunks/{41oxcdcw-pcwt.js โ†’ 329sozud9-tvr.js} +1 -1
  434. package/.next/static/chunks/3qqvn9vv6i0gy.js +68 -0
  435. package/.next/static/chunks/{2_xpm7qhr69n8.js โ†’ 3xqcluqa32mjv.js} +2 -2
  436. package/README.md +11 -4
  437. package/package.json +1 -1
  438. package/.next/server/chunks/11mp_@anthropic-ai_sdk_07v3boe._.js +0 -3
  439. package/.next/server/chunks/11mp_@anthropic-ai_sdk_09iva72._.js +0 -3
  440. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0bom1b1._.js +0 -3
  441. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0dvji7p._.js +0 -3
  442. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0dzo8jn._.js +0 -3
  443. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0hvqsqq._.js +0 -3
  444. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0i7i-jw._.js +0 -3
  445. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0k0iop5._.js +0 -3
  446. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0l3-6aq._.js +0 -3
  447. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0oegm3y._.js +0 -3
  448. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0p5cyes._.js +0 -3
  449. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0qw8i6_._.js +0 -3
  450. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0yk-a7v._.js +0 -3
  451. package/.next/server/chunks/11mp_@anthropic-ai_sdk_11fsqvb._.js +0 -3
  452. package/.next/server/chunks/11mp_@anthropic-ai_sdk_143_7ez._.js +0 -3
  453. package/.next/server/chunks/11mp_@anthropic-ai_sdk_14a4-64._.js +0 -3
  454. package/.next/server/chunks/11mp_@anthropic-ai_sdk_17d_oma._.js +0 -3
  455. package/.next/server/chunks/11mp_@anthropic-ai_sdk_18qwuyb._.js +0 -3
  456. package/.next/server/chunks/11mp_@anthropic-ai_sdk_19au8y6._.js +0 -3
  457. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1ak_hy5._.js +0 -3
  458. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1cqa0nq._.js +0 -3
  459. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1i-x_q0._.js +0 -3
  460. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jmtliz._.js +0 -3
  461. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jouwlj._.js +0 -3
  462. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1r_q5um._.js +0 -3
  463. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1t959xd._.js +0 -3
  464. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1vkprw9._.js +0 -3
  465. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1y95ax9._.js +0 -3
  466. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1y9misr._.js +0 -3
  467. package/.next/server/chunks/11mp_@anthropic-ai_sdk_21b8wwy._.js +0 -3
  468. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_08ecfgc._.js +0 -3
  469. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_09--sd6._.js +0 -3
  470. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0e3mwc6._.js +0 -3
  471. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0go4301._.js +0 -3
  472. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0iq9dmt._.js +0 -3
  473. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0n9ijke._.js +0 -3
  474. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0szcyrx._.js +0 -3
  475. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0xy2s3x._.js +0 -3
  476. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0yaujn7._.js +0 -3
  477. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0z9ly74._.js +0 -3
  478. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1hmq3al._.js +0 -3
  479. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1tqk4bp._.js +0 -3
  480. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1x-hr6f._.js +0 -3
  481. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1zsdhg0._.js +0 -3
  482. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_20t__fe._.js +0 -3
  483. package/.next/server/chunks/[root-of-the-server]__0-pmfg2._.js +0 -3
  484. package/.next/server/chunks/[root-of-the-server]__02co2yq._.js +0 -3
  485. package/.next/server/chunks/[root-of-the-server]__05g5cgo._.js +0 -3
  486. package/.next/server/chunks/[root-of-the-server]__05l6129._.js +0 -3
  487. package/.next/server/chunks/[root-of-the-server]__0b5pwze._.js +0 -3
  488. package/.next/server/chunks/[root-of-the-server]__0druay_._.js +0 -3
  489. package/.next/server/chunks/[root-of-the-server]__0p6ja6l._.js +0 -3
  490. package/.next/server/chunks/[root-of-the-server]__0q3-t8a._.js +0 -3
  491. package/.next/server/chunks/[root-of-the-server]__0vcsqzd._.js +0 -3
  492. package/.next/server/chunks/[root-of-the-server]__1-e3i_5._.js +0 -3
  493. package/.next/server/chunks/[root-of-the-server]__1-ic3af._.js +0 -3
  494. package/.next/server/chunks/[root-of-the-server]__11a4ptn._.js +0 -3
  495. package/.next/server/chunks/[root-of-the-server]__11c8641._.js +0 -3
  496. package/.next/server/chunks/[root-of-the-server]__12nzy_6._.js +0 -3
  497. package/.next/server/chunks/[root-of-the-server]__14aeqoi._.js +0 -3
  498. package/.next/server/chunks/[root-of-the-server]__15ck1wv._.js +0 -3
  499. package/.next/server/chunks/[root-of-the-server]__1613hjb._.js +0 -99
  500. package/.next/server/chunks/[root-of-the-server]__1613hjb._.js.map +0 -1
  501. package/.next/server/chunks/[root-of-the-server]__169hmq_._.js +0 -10
  502. package/.next/server/chunks/[root-of-the-server]__169hmq_._.js.map +0 -1
  503. package/.next/server/chunks/[root-of-the-server]__18kxo4a._.js +0 -3
  504. package/.next/server/chunks/[root-of-the-server]__197vw9g._.js +0 -3
  505. package/.next/server/chunks/[root-of-the-server]__19k8t87._.js +0 -3
  506. package/.next/server/chunks/[root-of-the-server]__1ezzeji._.js +0 -3
  507. package/.next/server/chunks/[root-of-the-server]__1jxu2x9._.js +0 -3
  508. package/.next/server/chunks/[root-of-the-server]__1lj_2cv._.js +0 -3
  509. package/.next/server/chunks/[root-of-the-server]__1n68akx._.js +0 -3
  510. package/.next/server/chunks/[root-of-the-server]__1npya5q._.js +0 -3
  511. package/.next/server/chunks/[root-of-the-server]__1qusy4g._.js +0 -3
  512. package/.next/server/chunks/[root-of-the-server]__1umrorf._.js +0 -3
  513. package/.next/server/chunks/[root-of-the-server]__1vh9g2o._.js +0 -3
  514. package/.next/server/chunks/[root-of-the-server]__1vq38ov._.js +0 -3
  515. package/.next/server/chunks/[root-of-the-server]__1wr0m-s._.js +0 -3
  516. package/.next/server/chunks/[root-of-the-server]__1xb0fmp._.js +0 -3
  517. package/.next/server/chunks/ssr/[root-of-the-server]__0noc5ay._.js +0 -14
  518. package/.next/server/chunks/ssr/[root-of-the-server]__1pk-w2i._.js +0 -3
  519. package/.next/server/chunks/ssr/_09b02z-._.js +0 -3
  520. package/.next/server/chunks/ssr/_09b02z-._.js.map +0 -1
  521. package/.next/server/chunks/ssr/_0d0f1s1._.js +0 -3
  522. package/.next/server/chunks/ssr/_0d0f1s1._.js.map +0 -1
  523. package/.next/server/chunks/ssr/_0lnt_va._.js +0 -4
  524. package/.next/server/chunks/ssr/_0lnt_va._.js.map +0 -1
  525. package/.next/server/chunks/ssr/_0qlymco._.js +0 -3
  526. package/.next/server/chunks/ssr/_0qlymco._.js.map +0 -1
  527. package/.next/server/chunks/ssr/_0sg1oeq._.js +0 -3
  528. package/.next/server/chunks/ssr/_0sg1oeq._.js.map +0 -1
  529. package/.next/server/chunks/ssr/_14emfpq._.js.map +0 -1
  530. package/.next/server/chunks/ssr/_1ftruw6._.js.map +0 -1
  531. package/.next/server/chunks/ssr/_1x7ggg5._.js +0 -4
  532. package/.next/server/chunks/ssr/_1x7ggg5._.js.map +0 -1
  533. package/.next/server/chunks/ssr/node_modules__pnpm_1q89l7p._.js +0 -3
  534. package/.next/server/chunks/ssr/node_modules__pnpm_1q89l7p._.js.map +0 -1
  535. package/.next/server/chunks/ssr/src_1lkod9y._.js +0 -8
  536. package/.next/server/chunks/ssr/src_1lkod9y._.js.map +0 -1
  537. package/.next/static/chunks/0p1-hkgnm2ll2.js +0 -1
  538. package/.next/static/chunks/0pgu5q5vodev6.js +0 -1
  539. package/.next/static/chunks/0rqzvayflendx.js +0 -2
  540. package/.next/static/chunks/0vcfs7dii85tw.js +0 -21
  541. package/.next/static/chunks/150y5rwg6gwvx.css +0 -1
  542. package/.next/static/chunks/1fd43t9y42wd3.js +0 -1
  543. package/.next/static/chunks/1q50zh5z-fq2k.js +0 -2
  544. package/.next/static/chunks/2ls_yp4-qgb42.js +0 -1
  545. package/.next/static/chunks/2zz0ip2l_29c3.js +0 -3
  546. package/.next/static/chunks/3h4ehgq7i44wb.js +0 -6
  547. package/.next/static/chunks/3vf5nnd4xjo5_.js +0 -1
  548. package/.next/static/chunks/40jaenrnspnlh.js +0 -68
  549. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_00p3fu1._.js.map โ†’ 11mp_@anthropic-ai_sdk_0-_cqh8._.js.map} +0 -0
  550. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_01amtux._.js.map โ†’ 11mp_@anthropic-ai_sdk_00o5o78._.js.map} +0 -0
  551. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_01jjl08._.js.map โ†’ 11mp_@anthropic-ai_sdk_03cp17a._.js.map} +0 -0
  552. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_071zfm8._.js.map โ†’ 11mp_@anthropic-ai_sdk_07dk2er._.js.map} +0 -0
  553. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_07v3boe._.js.map โ†’ 11mp_@anthropic-ai_sdk_0_e9zpr._.js.map} +0 -0
  554. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_09iva72._.js.map โ†’ 11mp_@anthropic-ai_sdk_0_xx_qf._.js.map} +0 -0
  555. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0bom1b1._.js.map โ†’ 11mp_@anthropic-ai_sdk_0aer9lc._.js.map} +0 -0
  556. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0dvji7p._.js.map โ†’ 11mp_@anthropic-ai_sdk_0ax30pe._.js.map} +0 -0
  557. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0dzo8jn._.js.map โ†’ 11mp_@anthropic-ai_sdk_0gn7vgs._.js.map} +0 -0
  558. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0hvqsqq._.js.map โ†’ 11mp_@anthropic-ai_sdk_0hye94a._.js.map} +0 -0
  559. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0i7i-jw._.js.map โ†’ 11mp_@anthropic-ai_sdk_0ir5cgk._.js.map} +0 -0
  560. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0k0iop5._.js.map โ†’ 11mp_@anthropic-ai_sdk_0je0_pa._.js.map} +0 -0
  561. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0l3-6aq._.js.map โ†’ 11mp_@anthropic-ai_sdk_0jfgh0o._.js.map} +0 -0
  562. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0oegm3y._.js.map โ†’ 11mp_@anthropic-ai_sdk_0mha4x1._.js.map} +0 -0
  563. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0p5cyes._.js.map โ†’ 11mp_@anthropic-ai_sdk_0n__boa._.js.map} +0 -0
  564. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0qw8i6_._.js.map โ†’ 11mp_@anthropic-ai_sdk_0sqv26_._.js.map} +0 -0
  565. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0yk-a7v._.js.map โ†’ 11mp_@anthropic-ai_sdk_0wnc6g-._.js.map} +0 -0
  566. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_11fsqvb._.js.map โ†’ 11mp_@anthropic-ai_sdk_0xh0g59._.js.map} +0 -0
  567. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_143_7ez._.js.map โ†’ 11mp_@anthropic-ai_sdk_1-5wyhj._.js.map} +0 -0
  568. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_14a4-64._.js.map โ†’ 11mp_@anthropic-ai_sdk_13ahm3n._.js.map} +0 -0
  569. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_17d_oma._.js.map โ†’ 11mp_@anthropic-ai_sdk_13e6aq4._.js.map} +0 -0
  570. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_18qwuyb._.js.map โ†’ 11mp_@anthropic-ai_sdk_14eg0ld._.js.map} +0 -0
  571. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_19au8y6._.js.map โ†’ 11mp_@anthropic-ai_sdk_15md1n2._.js.map} +0 -0
  572. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1ak_hy5._.js.map โ†’ 11mp_@anthropic-ai_sdk_16av8b9._.js.map} +0 -0
  573. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1cqa0nq._.js.map โ†’ 11mp_@anthropic-ai_sdk_16hjhv1._.js.map} +0 -0
  574. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1i-x_q0._.js.map โ†’ 11mp_@anthropic-ai_sdk_16txvf7._.js.map} +0 -0
  575. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1jmtliz._.js.map โ†’ 11mp_@anthropic-ai_sdk_198yu7d._.js.map} +0 -0
  576. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1jouwlj._.js.map โ†’ 11mp_@anthropic-ai_sdk_1_9tfq3._.js.map} +0 -0
  577. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1r_q5um._.js.map โ†’ 11mp_@anthropic-ai_sdk_1_izr2o._.js.map} +0 -0
  578. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1t959xd._.js.map โ†’ 11mp_@anthropic-ai_sdk_1fljcyg._.js.map} +0 -0
  579. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1vkprw9._.js.map โ†’ 11mp_@anthropic-ai_sdk_1lrt6ul._.js.map} +0 -0
  580. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1y95ax9._.js.map โ†’ 11mp_@anthropic-ai_sdk_1nev_ee._.js.map} +0 -0
  581. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1y9misr._.js.map โ†’ 11mp_@anthropic-ai_sdk_1pgoe2i._.js.map} +0 -0
  582. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_21b8wwy._.js.map โ†’ 11mp_@anthropic-ai_sdk_1rgl7mu._.js.map} +0 -0
  583. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_08ecfgc._.js.map โ†’ 11mp_@anthropic-ai_sdk_index_mjs_00kwqu5._.js.map} +0 -0
  584. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_09--sd6._.js.map โ†’ 11mp_@anthropic-ai_sdk_index_mjs_01j2nrd._.js.map} +0 -0
  585. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0e3mwc6._.js.map โ†’ 11mp_@anthropic-ai_sdk_index_mjs_05ybj3t._.js.map} +0 -0
  586. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0go4301._.js.map โ†’ 11mp_@anthropic-ai_sdk_index_mjs_0adt7jj._.js.map} +0 -0
  587. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0iq9dmt._.js.map โ†’ 11mp_@anthropic-ai_sdk_index_mjs_0bnl14w._.js.map} +0 -0
  588. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0n9ijke._.js.map โ†’ 11mp_@anthropic-ai_sdk_index_mjs_0f557t9._.js.map} +0 -0
  589. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0szcyrx._.js.map โ†’ 11mp_@anthropic-ai_sdk_index_mjs_0ra6giw._.js.map} +0 -0
  590. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0xy2s3x._.js.map โ†’ 11mp_@anthropic-ai_sdk_index_mjs_107cqfx._.js.map} +0 -0
  591. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0yaujn7._.js.map โ†’ 11mp_@anthropic-ai_sdk_index_mjs_1377sl6._.js.map} +0 -0
  592. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0z9ly74._.js.map โ†’ 11mp_@anthropic-ai_sdk_index_mjs_1_2hcok._.js.map} +0 -0
  593. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1hmq3al._.js.map โ†’ 11mp_@anthropic-ai_sdk_index_mjs_1g--m6y._.js.map} +0 -0
  594. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1tqk4bp._.js.map โ†’ 11mp_@anthropic-ai_sdk_index_mjs_1geopi5._.js.map} +0 -0
  595. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1x-hr6f._.js.map โ†’ 11mp_@anthropic-ai_sdk_index_mjs_1i11dte._.js.map} +0 -0
  596. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1zsdhg0._.js.map โ†’ 11mp_@anthropic-ai_sdk_index_mjs_1mj3_qk._.js.map} +0 -0
  597. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_20t__fe._.js.map โ†’ 11mp_@anthropic-ai_sdk_index_mjs_1qgy210._.js.map} +0 -0
  598. /package/.next/server/chunks/{[root-of-the-server]__11c8641._.js.map โ†’ 11mp_@anthropic-ai_sdk_index_mjs_1rkng9q._.js.map} +0 -0
  599. /package/.next/server/chunks/{[root-of-the-server]__1npya5q._.js.map โ†’ 11mp_@anthropic-ai_sdk_index_mjs_1vr8q8y._.js.map} +0 -0
  600. /package/.next/static/{fGPda81_8-K4GmaNUE6KA โ†’ Q29Tn_NjyVms0d3pKn4Yx}/_buildManifest.js +0 -0
  601. /package/.next/static/{fGPda81_8-K4GmaNUE6KA โ†’ Q29Tn_NjyVms0d3pKn4Yx}/_clientMiddlewareManifest.js +0 -0
  602. /package/.next/static/{fGPda81_8-K4GmaNUE6KA โ†’ Q29Tn_NjyVms0d3pKn4Yx}/_ssgManifest.js +0 -0
@@ -0,0 +1,13 @@
1
+ module.exports=[892519,a=>{"use strict";var b=a.i(662145),c=a.i(174897),d=a.i(913975),e=a.i(544394),f=a.i(149350),g=a.i(21215),h=a.i(200382),i=a.i(72551),j=a.i(368114),k=a.i(866718),l=a.i(813722);let m=["convention","gotcha","decision","preference"],n=new Set("a an and are as at be but by can do does for from how i if in into is it its of on or our so that the their then there these this to use used using was we what when where which who why will with you your".split(" "));function o(a){return a.toLowerCase().split(/[^a-z0-9]+/).filter(a=>a.length>1&&!n.has(a)).map(a=>a.length>3&&a.endsWith("s")&&!a.endsWith("ss")?a.slice(0,-1):a)}function p(a){return Math.ceil(a.length/4)}function q({entries:a,selectedId:d,onOpen:e,onNew:f}){let[g,n]=(0,c.useState)(""),[r,s]=(0,c.useState)(null),t=(0,c.useMemo)(()=>{var b,c;let d,e,f;return b=a,e=new Map((d=(c={query:g,type:r}).type?b.filter(a=>a.type===c.type):b).map(a=>[a.id,a])),(o(f=c.query??"").length?function(a,b,c={}){let d=[...new Set(o(b))];if(!d.length)return[];let e=[];for(let b of a){if(c.type&&b.type!==c.type)continue;let a=new Set(o(b.summary)),f=new Set(o(b.body)),g=new Set([b.id.toLowerCase(),...o(b.type)]),h=0;for(let b of d)a.has(b)&&(h+=3),g.has(b)&&(h+=2),f.has(b)&&(h+=1);h>0&&e.push({id:b.id,type:b.type,summary:b.summary,tokens:p(`${b.summary}
2
+ ${b.body}`),score:h,updatedAt:b.updatedAt})}return e.sort((a,b)=>b.score-a.score||b.updatedAt.localeCompare(a.updatedAt)),e.slice(0,c.limit??10).map(({updatedAt:a,...b})=>b)}(d,f,{limit:d.length}):[...d].sort((a,b)=>b.updatedAt.localeCompare(a.updatedAt)||a.id.localeCompare(b.id,"en",{numeric:!0})).map(a=>({id:a.id,type:a.type,summary:a.summary,tokens:p(`${a.summary}
3
+ ${a.body}`),score:0}))).map(a=>e.get(a.id)).filter(a=>!!a)},[a,g,r]),u=(0,c.useMemo)(()=>{let b={};for(let c of a)b[c.type]=(b[c.type]??0)+1;return b},[a]),v=o(g).length>0,w=(a,c,d)=>(0,b.jsxs)("button",{type:"button","aria-pressed":r===a,onClick:()=>s(a),className:(0,j.cn)("h-6 rounded-[5px] border border-transparent px-2 text-xs font-medium text-muted outline-none transition-colors","hover:bg-surface2 hover:text-txt focus-visible:ring-2 focus-visible:ring-accent",r===a&&"border-border2 bg-surface2 text-txt"),children:[c," ",(0,b.jsx)("span",{className:"font-mono text-[10px] opacity-70",children:d})]},c);return(0,b.jsxs)("section",{"aria-label":"Knowledge entries",className:"flex min-w-0 flex-col gap-3",children:[(0,b.jsxs)("div",{className:"flex items-baseline justify-between",children:[(0,b.jsx)("h2",{className:"font-display text-base font-semibold tracking-tight",children:"Knowledge entries"}),(0,b.jsxs)("button",{type:"button",onClick:f,className:"inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs font-medium text-muted outline-none hover:bg-surface2 hover:text-txt focus-visible:ring-2 focus-visible:ring-accent",children:[(0,b.jsx)(h.Plus,{className:"size-3.5","aria-hidden":!0})," New entry"]})]}),(0,b.jsxs)("div",{className:"relative",children:[(0,b.jsx)(i.Search,{className:"pointer-events-none absolute left-2.5 top-1/2 size-3.5 -translate-y-1/2 text-muted","aria-hidden":!0}),(0,b.jsx)(k.Input,{id:"memory-search",type:"search",value:g,onChange:a=>n(a.target.value),placeholder:"Search entriesโ€ฆ","aria-label":"Search entries",className:"h-8 pl-8"})]}),(0,b.jsxs)("div",{role:"group","aria-label":"Filter by type",className:"flex flex-wrap gap-1",children:[w(null,"All",a.length),m.map(a=>w(a,a,u[a]??0))]}),0===a.length?(0,b.jsxs)("p",{className:"rounded-xl border border-dashed border-border p-4 text-sm text-muted",children:["No knowledge entries yet. Agents save them with ",(0,b.jsx)("code",{className:"font-mono text-xs",children:"vibedoc_save_entry"}),"."]}):0===t.length?(0,b.jsxs)("p",{className:"p-2 text-sm text-muted",children:["No entries match ",v?`"${g.trim()}"`:"this filter","."]}):(0,b.jsx)("ul",{className:"flex flex-col divide-y divide-border rounded-xl border border-border bg-surface",children:t.map(a=>(0,b.jsx)("li",{children:(0,b.jsxs)("button",{type:"button",onClick:()=>e(a.id),"aria-current":a.id===d?"true":void 0,className:(0,j.cn)("flex w-full flex-col gap-0.5 px-3 py-2 text-left outline-none transition-colors hover:bg-surface2 focus-visible:bg-surface2",a.id===d&&"bg-surface2 shadow-[inset_2px_0_0_var(--color-accent)]"),children:[(0,b.jsxs)("span",{className:"flex items-center gap-2 font-mono text-[11px] text-muted",children:[(0,b.jsx)("span",{children:a.id}),(0,b.jsx)("span",{children:"ยท"}),(0,b.jsx)("span",{children:a.type}),(0,b.jsxs)("span",{className:"ml-auto flex items-center gap-2",children:[(0,b.jsx)(l.OwnerChip,{owner:a.by,className:"font-sans"}),a.updatedAt]})]}),(0,b.jsx)("span",{className:"text-sm text-txt",children:a.summary})]})},a.id))})]})}var r=a.i(661661),s=a.i(28386),t=a.i(54165),u=a.i(699570),v=a.i(192698);function w({entry:a,rootParam:d,onSaved:e,onDelete:g,onClose:h,children:i}){let[j,n]=(0,c.useState)(null===a),[o,p]=(0,c.useState)(()=>x(a)),[q,y]=(0,c.useState)(null),[z,A]=(0,c.useState)(!1),B=()=>{a?(n(!1),y(null)):h()},C=async()=>{let b=function(a){let b;if(void 0!==a.id&&!function(a){let b=/^e(\d+)$/i.exec(a.trim());if(!b)return null;let c=Number(b[1]);return c>0?`E${String(c).padStart(3,"0")}`:null}(String(a.id)))return`Invalid id "${a.id}": expected E followed by a number, e.g. E001`;if(b=String(a.type??""),!m.includes(b))return`Invalid type "${a.type??""}": use one of ${m.join(", ")}`;let c=String(a.summary??"").trim();return c?/\n/.test(c)?"summary must be one line":c.length>120?`summary is ${c.length} characters; keep it to 120`:void 0!==a.body&&"string"!=typeof a.body?"body must be a string":null:"summary is required"}({...o,id:a?.id});if(b)return void y(b);A(!0),y(null);try{let b=await fetch(`/api/memory/entries/save${d}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({...a?{id:a.id}:{},...o})}),c=await b.json().catch(()=>({}));if(!b.ok||!c.entry)throw Error(c.error??`Save failed (${b.status})`);n(!1),e(c.entry)}catch(a){y(a instanceof Error?a.message:String(a))}finally{A(!1)}};(0,c.useEffect)(()=>{if(j||!a)return;let b=b=>{if("Backspace"!==b.key&&"Delete"!==b.key||b.metaKey||b.ctrlKey||b.altKey)return;let c=b.target;c&&(c.isContentEditable||["INPUT","TEXTAREA","SELECT"].includes(c.tagName))||(b.preventDefault(),g(a))};return window.addEventListener("keydown",b),()=>window.removeEventListener("keydown",b)},[j,a,g]);let D=(0,b.jsx)("button",{type:"button",onClick:h,"aria-label":"Close entry",className:"rounded p-1 text-muted hover:bg-surface2 hover:text-txt",children:(0,b.jsx)(t.X,{className:"size-3.5"})});return j?(0,b.jsx)("section",{"aria-label":a?`Edit ${a.id}`:"New entry",className:"rounded-xl border border-border bg-surface",children:(0,b.jsxs)("form",{onSubmit:a=>{a.preventDefault(),C()},onKeyDown:a=>{"Escape"===a.key&&(a.preventDefault(),B()),"Enter"===a.key&&(a.metaKey||a.ctrlKey)&&(a.preventDefault(),C())},className:"flex flex-col gap-3 p-5",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between font-mono text-[11px] text-muted",children:[(0,b.jsx)("span",{children:a?`${a.id} \xb7 editing`:"New entry"}),D]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1 text-xs text-muted",children:["Type",(0,b.jsx)("select",{value:o.type,onChange:a=>p({...o,type:a.target.value}),className:"h-8 rounded-md border border-border bg-bg px-2 text-sm text-txt focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent",children:m.map(a=>(0,b.jsx)("option",{value:a,children:a},a))})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1 text-xs text-muted",children:["Summary (one line)",(0,b.jsx)(k.Input,{autoFocus:!0,value:o.summary,onChange:a=>p({...o,summary:a.target.value}),maxLength:200,className:"h-8 text-txt"})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1 text-xs text-muted",children:["Details (markdown)",(0,b.jsx)("textarea",{value:o.body,onChange:a=>p({...o,body:a.target.value}),rows:8,className:"w-full resize-y rounded-md border border-border bg-bg px-3 py-2 font-mono text-xs text-txt focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent"})]}),q&&(0,b.jsx)("p",{role:"alert",className:"text-xs text-danger",children:q}),(0,b.jsxs)("div",{className:"flex items-center justify-end gap-2",children:[(0,b.jsx)("span",{className:"mr-auto text-[11px] text-muted",children:"โŒ˜โ†ต save ยท Esc cancel"}),(0,b.jsx)(u.Button,{type:"button",variant:"ghost",size:"sm",onClick:B,children:"Cancel"}),(0,b.jsx)(u.Button,{type:"submit",size:"sm",disabled:z,children:z?"Savingโ€ฆ":"Save"})]})]})}):a?(0,b.jsxs)("section",{"aria-label":a.id,className:"rounded-xl border border-border bg-surface",children:[(0,b.jsx)(v.ItemPanelHeader,{kicker:(0,b.jsxs)("span",{children:[a.id," ยท entry"]}),menu:(0,b.jsxs)("span",{className:"flex items-center gap-1",children:[(0,b.jsxs)(u.Button,{variant:"ghost",size:"sm",onClick:()=>{p(x(a)),y(null),n(!0)},className:"h-7 px-2 text-xs",children:[(0,b.jsx)(r.Pencil,{className:"size-3.5"})," Edit"]}),(0,b.jsxs)(u.Button,{variant:"ghost",size:"sm",onClick:()=>g(a),title:"Delete (โŒซ)",className:"h-7 px-2 text-xs hover:text-danger",children:[(0,b.jsx)(s.Trash2,{className:"size-3.5"})," Delete"]}),D]}),title:a.summary,properties:[{label:"Type",value:a.type},{label:"Updated",value:a.updatedAt||null},{label:"Changed by",value:a.by?(0,b.jsx)(l.OwnerChip,{owner:a.by,className:"text-xs text-txt"}):null},{label:"File",value:(0,b.jsx)("span",{className:"truncate font-mono text-[11px] text-muted",children:a.file})}]}),(0,b.jsxs)("div",{className:"p-5",children:[a.body?(0,b.jsx)(f.MarkdownRenderer,{content:a.body}):(0,b.jsx)("p",{className:"text-sm text-muted",children:"No details."}),i]})]}):null}function x(a){return a?{type:a.type,summary:a.summary,body:a.body}:{type:"convention",summary:"",body:""}}var y=a.i(508817),z=a.i(926128),A=a.i(256857);let B={name:"flag",size:24,node:[["path",{d:"M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528",key:"1jaruq"}]]};B.node;let C=(0,A.default)(B),D={name:"lightbulb",size:24,node:[["path",{d:"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5",key:"1gvzjb"}],["path",{d:"M9 18h6",key:"x1upvd"}],["path",{d:"M10 22h4",key:"ceow96"}]]};D.node;let E=(0,A.default)(D);var F=a.i(471617),G=a.i(173628),H=a.i(147758);let I=[{kind:"task",label:"Tasks"},{kind:"epic",label:"Epics"},{kind:"adr",label:"ADRs"},{kind:"doc",label:"Docs"},{kind:"entry",label:"Entries"}],J={epic:C,adr:F.Scale,doc:z.FileText,entry:E,task:y.BookOpen};function K(a){let b=(0,d.useRouter)(),{openDoc:c}=(0,e.useApp)();return d=>{"task"===d.kind?b.push(`/board?task=${d.id}`):"epic"===d.kind?b.push(`/roadmap?item=${d.id}`):"entry"===d.kind?a(d.id):c(d.path)}}function L({entryId:a,onOpenEntry:d}){let{rootParam:f,summary:g,board:h}=(0,e.useApp)(),i=K(d),[j,k]=(0,c.useState)(null);(0,c.useEffect)(()=>{let b=!0;return fetch(`/api/memory/graph${f}&entry=${encodeURIComponent(a)}`).then(a=>a.json()).then(a=>{b&&k(a.nodes?a:{nodes:[],edges:[]})}).catch(a=>{console.warn("Loading entry links failed",a),b&&k({nodes:[],edges:[]})}),()=>{b=!1}},[a,f,g]);let l=(0,c.useMemo)(()=>new Map(Object.values(h??{}).flat().map(a=>[a.id,a])),[h]),m=(0,c.useMemo)(()=>new Map((j?.nodes??[]).map(a=>[a.id,a])),[j]),n=a=>a.map(a=>m.get(a)).filter(a=>!!a),o=n((j?.edges??[]).filter(b=>b.from===a).map(a=>a.to)),p=n((j?.edges??[]).filter(b=>b.to===a).map(a=>a.from)),q=a=>{let c="task"===a.kind?l.get(a.id):void 0,d=J[a.kind];return(0,b.jsx)("li",{children:(0,b.jsxs)("button",{type:"button",onClick:()=>i(a),title:a.path,className:"flex w-full items-center gap-2 rounded-md px-2 py-1 text-left text-sm outline-none hover:bg-surface2 focus-visible:ring-2 focus-visible:ring-accent",children:[c?(0,b.jsx)(G.StatusIcon,{status:(0,H.displayStatus)(c),className:"size-3.5 shrink-0"}):(0,b.jsx)(d,{className:"size-3.5 shrink-0 text-muted","aria-hidden":!0}),"doc"!==a.kind&&(0,b.jsx)("span",{className:"shrink-0 font-mono text-[11px] text-muted",children:a.id}),(0,b.jsx)("span",{className:"min-w-0 truncate text-txt",children:a.label})]})},a.id)},r=(a,c)=>(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)("h4",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted",children:a}),I.map(({kind:a,label:d})=>{let e=c.filter(b=>b.kind===a);return e.length?(0,b.jsxs)("div",{children:[(0,b.jsx)("p",{className:"px-2 text-[11px] text-muted",children:d}),(0,b.jsx)("ul",{children:e.map(q)})]},a):null})]});return(0,b.jsxs)("section",{"aria-label":"Related",className:"mt-5 flex flex-col gap-3 border-t border-border pt-4",children:[(0,b.jsx)("h3",{className:"text-xs font-semibold text-txt",children:"Related"}),null===j?(0,b.jsx)("p",{className:"text-xs text-muted",children:"Loading linksโ€ฆ"}):o.length||p.length?(0,b.jsxs)(b.Fragment,{children:[o.length>0&&r("Links to",o),p.length>0&&r("Linked from",p)]}):(0,b.jsx)("p",{className:"text-xs text-muted",children:"No links yet. Mention a task, epic or doc in the entry to link it."})]})}var M=a.i(156298);let N={name:"git-commit-horizontal",size:24,node:[["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["line",{x1:"3",x2:"9",y1:"12",y2:"12",key:"1dyftd"}],["line",{x1:"15",x2:"21",y1:"12",y2:"12",key:"oup4p8"}]],aliases:["git-commit"]};N.node;let O=(0,A.default)(N);function P({entryId:a}){let{rootParam:d}=(0,e.useApp)(),[f,g]=(0,c.useState)(!1),[h,i]=(0,c.useState)(null),[k,l]=(0,c.useState)(null),[m,n]=(0,c.useState)(null),o=`/api/memory/history${d}&entry=${encodeURIComponent(a)}`,p=async a=>{let b=await fetch(a),c=await b.json().catch(()=>({}));if(!b.ok)throw Error(c.error??`Request failed (${b.status})`);return c},q=async()=>{let a=!f;if(g(a),a&&!h)try{i(await p(o))}catch(a){l(a instanceof Error?a.message:String(a))}},r=async a=>{try{let{text:b}=await p(`${o}&sha=${a.sha}`);n({commit:a,text:b})}catch(a){l(a instanceof Error?a.message:String(a))}};return(0,b.jsxs)("section",{"aria-label":"History",className:"mt-4 border-t border-border pt-3",children:[(0,b.jsxs)("button",{type:"button",onClick:q,"aria-expanded":f,className:"flex items-center gap-1 rounded text-xs font-semibold text-txt outline-none focus-visible:ring-2 focus-visible:ring-accent",children:[(0,b.jsx)(M.ChevronRight,{className:(0,j.cn)("size-3.5 text-muted transition-transform",f&&"rotate-90"),"aria-hidden":!0}),"History"]}),f&&(0,b.jsxs)("div",{className:"mt-2 flex flex-col gap-2",children:[k&&(0,b.jsx)("p",{role:"alert",className:"text-xs text-danger",children:k}),!h&&!k&&(0,b.jsx)("p",{className:"text-xs text-muted",children:"Loading historyโ€ฆ"}),h?.reason==="no-git"&&(0,b.jsx)("p",{className:"text-xs text-muted",children:"History needs git: this project is not a git repository."}),h&&!h.reason&&!h.history.length&&!h.uncommitted&&(0,b.jsx)("p",{className:"text-xs text-muted",children:"Not committed yet."}),h&&(h.uncommitted||h.history.length>0)&&(0,b.jsxs)("ul",{className:"flex flex-col",children:[h.uncommitted&&(0,b.jsxs)("li",{className:"flex items-center gap-2 px-2 py-1 text-xs text-muted",children:[(0,b.jsx)("span",{className:"size-1.5 rounded-full bg-accent","aria-hidden":!0})," Uncommitted changes"]}),h.history.map(a=>(0,b.jsx)("li",{children:(0,b.jsxs)("button",{type:"button",onClick:()=>r(a),"aria-current":m?.commit.sha===a.sha?"true":void 0,className:(0,j.cn)("flex w-full items-center gap-2 rounded-md px-2 py-1 text-left text-xs outline-none hover:bg-surface2 focus-visible:ring-2 focus-visible:ring-accent",m?.commit.sha===a.sha&&"bg-surface2"),children:[(0,b.jsx)(O,{className:"size-3.5 shrink-0 text-muted","aria-hidden":!0}),(0,b.jsx)("span",{className:"shrink-0 font-mono text-[11px] text-muted",children:a.date.slice(0,10)}),(0,b.jsx)("span",{className:"min-w-0 flex-1 truncate text-txt",children:a.subject}),(0,b.jsx)("span",{className:"shrink-0 text-muted",children:a.author})]})},a.sha))]}),m&&(0,b.jsxs)("div",{className:"rounded-md border border-border bg-bg",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between border-b border-border px-3 py-1.5 font-mono text-[11px] text-muted",children:[(0,b.jsxs)("span",{children:[m.commit.sha.slice(0,7)," ยท ",m.commit.date.slice(0,10)," ยท read-only"]}),(0,b.jsx)("button",{type:"button",onClick:()=>n(null),"aria-label":"Close version",className:"rounded p-0.5 hover:text-txt",children:(0,b.jsx)(t.X,{className:"size-3.5"})})]}),(0,b.jsx)("pre",{className:"max-h-72 overflow-auto whitespace-pre-wrap p-3 font-mono text-xs text-txt",children:m.text})]})]})]})}var Q=a.i(365465),R=a.i(152716);let S={epic:-2,task:-1,entry:0,adr:1,doc:2},T={"--xy-background-color":"var(--color-bg)"};function U(a){let b=new MutationObserver(a);return b.observe(document.documentElement,{attributes:!0,attributeFilter:["class"]}),()=>b.disconnect()}let V={mem:(0,c.memo)(function({data:a}){let{node:c,status:d,unlinked:e,dim:f,active:g}=a,h=J[c.kind];return(0,b.jsxs)("div",{title:c.path,style:{width:196},className:(0,j.cn)("flex items-center gap-2 rounded-md border bg-surface px-2.5 py-1.5 text-xs transition-opacity","entry"===c.kind?"border-border2":"border-border",g&&"border-accent ring-1 ring-accent",e&&"border-dashed opacity-60",f&&"opacity-25"),children:[["l","r"].map(a=>(0,b.jsxs)("span",{children:[(0,b.jsx)(Q.Handle,{id:a,type:"source",position:"l"===a?R.Position.Left:R.Position.Right,isConnectable:!1,className:"opacity-0"}),(0,b.jsx)(Q.Handle,{id:`${a}-t`,type:"target",position:"l"===a?R.Position.Left:R.Position.Right,isConnectable:!1,className:"opacity-0"})]},a)),d?(0,b.jsx)(G.StatusIcon,{status:d,className:"size-3.5 shrink-0"}):(0,b.jsx)(h,{className:(0,j.cn)("size-3.5 shrink-0","entry"===c.kind?"text-accent":"text-muted"),"aria-hidden":!0}),"doc"!==c.kind&&(0,b.jsx)("span",{className:"shrink-0 font-mono text-[10px] text-muted",children:c.id}),(0,b.jsx)("span",{className:(0,j.cn)("min-w-0 truncate","entry"===c.kind?"text-txt":"text-muted"),children:c.label})]})})};function W({entries:a,selectedId:d,onOpenEntry:f}){let{rootParam:g,summary:h,board:i}=(0,e.useApp)(),j=K(f),[k,l]=(0,c.useState)(null),m=(0,c.useSyncExternalStore)(U,()=>document.documentElement.classList.contains("dark"),()=>!0);(0,c.useEffect)(()=>{let a=!0;return fetch(`/api/memory/graph${g}`).then(a=>a.json()).then(b=>{a&&l(b.nodes?b:{nodes:[],edges:[]})}).catch(b=>{console.warn("Loading the memory graph failed",b),a&&l({nodes:[],edges:[]})}),()=>{a=!1}},[g,h]);let{nodes:n,edges:o}=(0,c.useMemo)(()=>{if(!k)return{nodes:[],edges:[]};let b=function(a,b={}){let c={},d=a=>Number(a.replace(/\D/g,""))||0;a.nodes.filter(a=>"entry"===a.kind).sort((a,c)=>(b[a.id]??"").localeCompare(b[c.id]??"")||d(a.id)-d(c.id)).forEach((a,b)=>{c[a.id]={x:0,y:48*b}});let e=new Map;for(let{from:b,to:d}of a.edges)for(let[a,f]of[[b,d],[d,b]])c[f]&&!c[a]&&e.set(a,[...e.get(a)??[],c[f].y]);for(let b of["epic","task","adr","doc"]){let d=a.nodes.filter(a=>a.kind===b).map(a=>{let b=e.get(a.id)??[0];return{id:a.id,want:b.reduce((a,b)=>a+b,0)/b.length}}).sort((a,b)=>a.want-b.want||a.id.localeCompare(b.id,"en",{numeric:!0})),f=-1/0;for(let{id:a,want:e}of d){let d=Math.max(e,f);c[a]={x:240*S[b],y:d},f=d+48}}return c}(k,Object.fromEntries(a.map(a=>[a.id,a.type]))),c=new Map(Object.values(i??{}).flat().map(a=>[a.id,a])),e=new Set(k.edges.flatMap(a=>[a.from,a.to])),f=d&&b[d]?new Set([d,...k.edges.filter(a=>a.from===d||a.to===d).flatMap(a=>[a.from,a.to])]):null;return{nodes:k.nodes.map(a=>{let g="task"===a.kind?c.get(a.id):void 0;return{id:a.id,type:"mem",position:b[a.id]??{x:0,y:0},data:{node:a,status:g?(0,H.displayStatus)(g):void 0,unlinked:"entry"===a.kind&&!e.has(a.id),dim:!!f&&!f.has(a.id),active:a.id===d},draggable:!1}}),edges:k.edges.map(a=>{let c=b[a.from]?.x??0,e=b[a.to]?.x??0,g=e<c,h=!!f&&(a.from===d||a.to===d);return{id:`${a.from}->${a.to}`,source:a.from,target:a.to,sourceHandle:g?"l":"r",targetHandle:g||e===c?"r-t":"l-t",style:{stroke:h?"var(--color-accent)":"var(--color-border2)",strokeWidth:h?1.75:1,opacity:f&&!h?.15:1}}})}},[k,a,i,d]);return k?k.nodes.length?(0,b.jsx)("div",{"aria-label":"Memory graph",className:"h-[70vh] min-h-[420px] overflow-hidden rounded-xl border border-border",children:(0,b.jsxs)(Q.ReactFlow,{nodes:n,edges:o,nodeTypes:V,onNodeClick:(a,b)=>j(b.data.node),nodesConnectable:!1,nodesDraggable:!1,deleteKeyCode:null,colorMode:m?"dark":"light",onlyRenderVisibleElements:n.length>150,fitView:!0,fitViewOptions:{padding:.1,minZoom:.8,maxZoom:1},minZoom:.1,style:T,children:[(0,b.jsx)(Q.Background,{variant:Q.BackgroundVariant.Dots,gap:20,size:1}),(0,b.jsx)(Q.Controls,{showInteractive:!1})]})}):(0,b.jsx)("p",{className:"rounded-xl border border-dashed border-border p-4 text-sm text-muted",children:"No entries to draw yet."}):(0,b.jsx)("p",{className:"text-sm text-muted",children:"Loading graphโ€ฆ"})}function X({memory:a,entries:c,rootParam:d,selectedId:e,creating:h,onOpen:i,onNew:k,onClose:l,onSaved:m,onDelete:n,view:o,onView:p}){let r=e?c?.find(a=>a.id===e):void 0;return(0,b.jsxs)("div",{className:(0,j.cn)("grid items-start gap-6 p-6","graph"===o?"lg:grid-cols-[minmax(0,1fr)_minmax(0,30rem)]":"lg:grid-cols-[minmax(280px,380px)_minmax(0,42rem)]"),children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-4 lg:col-span-2",children:[(0,b.jsx)("h1",{className:"font-display text-xl font-semibold tracking-tight",children:"Memory"}),(0,b.jsx)("div",{role:"group","aria-label":"Entries view",className:"flex rounded-md border border-border p-0.5",children:["list","graph"].map(a=>(0,b.jsx)("button",{type:"button","aria-pressed":o===a,onClick:()=>p(a),className:(0,j.cn)("h-6 rounded-[5px] border border-transparent px-2.5 text-xs font-medium capitalize text-muted outline-none transition-colors","hover:bg-surface2 hover:text-txt focus-visible:ring-2 focus-visible:ring-accent",o===a&&"border-border2 bg-surface2 text-txt"),children:a},a))})]}),c&&"graph"===o?(0,b.jsx)(W,{entries:c,selectedId:e,onOpenEntry:i}):c?(0,b.jsx)(q,{entries:c,selectedId:e,onOpen:i,onNew:k}):(0,b.jsx)("p",{className:"text-sm text-muted",children:"Loading entriesโ€ฆ"}),h||r?(0,b.jsx)("div",{className:"min-w-0 lg:sticky lg:top-6",children:(0,b.jsx)(w,{entry:h?null:r??null,rootParam:d,onSaved:m,onDelete:n,onClose:l,children:r&&!h&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(L,{entryId:r.id,onOpenEntry:i}),(0,b.jsx)(P,{entryId:r.id})]})},h?"new":r?.id)}):e&&c?(0,b.jsxs)("div",{role:"alert",className:"min-w-0 rounded-xl border border-dashed border-border p-5 text-sm text-muted",children:["Entry ",e," not found."," ",(0,b.jsx)("button",{type:"button",onClick:l,className:"text-txt underline underline-offset-2",children:"Show the handoff"})]}):(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsxs)("div",{className:"flex items-baseline justify-between mb-3",children:[(0,b.jsx)("h2",{className:"font-display text-base font-semibold tracking-tight",children:"Session handoff"}),(0,b.jsx)("span",{className:"text-xs font-mono text-muted",children:"memory/MEMORY.md"})]}),a?.exists?(0,b.jsx)("div",{className:"bg-surface border border-border rounded-xl p-5",children:(0,b.jsx)(f.MarkdownRenderer,{content:a.content})}):(0,b.jsx)(g.EmptyState,{icon:"๐Ÿง ",message:"No MEMORY.md yet.",subMessage:"AI will create one at the end of the first session.",bordered:!0}),(0,b.jsxs)("div",{className:"mt-4 p-4 bg-surface2 border border-border rounded-xl",children:[(0,b.jsx)("p",{className:"text-xs font-mono text-muted mb-2",children:"Add to your CLAUDE.md system prompt:"}),(0,b.jsx)("pre",{className:"text-xs font-mono text-accent/80 whitespace-pre-wrap leading-relaxed",children:`At session start:
4
+ 1. Call vibedoc_read_memory
5
+ 2. Call vibedoc_get_status
6
+
7
+ When you learn a fact that should still hold next week:
8
+ - Call vibedoc_save_entry (convention, gotcha, decision, preference)
9
+
10
+ At session end:
11
+ - Call vibedoc_update_memory with full handoff`})]})]})]})}var Y=a.i(269769);function Z(){let{summary:a,rootParam:f}=(0,e.useApp)(),g=(0,d.useRouter)(),h=(0,d.useSearchParams)(),i=h.get("entry"),j="graph"===h.get("view")?"graph":"list",[k,l]=(0,c.useState)(null),[m,n]=(0,c.useState)(!1),o=(0,c.useCallback)(()=>{let a=!0;return fetch(`/api/memory/entries${f}`).then(a=>a.json()).then(b=>{a&&l(b.entries??[])}).catch(b=>{console.warn("Loading memory entries failed",b),a&&l([])}),()=>{a=!1}},[f]);(0,c.useEffect)(()=>o(),[o,a]);let p=(0,c.useCallback)((a,b)=>{let c=new URLSearchParams;"graph"===b&&c.set("view","graph"),a&&c.set("entry",a),g.replace(c.size?`/memory?${c}`:"/memory",{scroll:!1})},[g]),q=(0,c.useCallback)(a=>{n(!1),p(a,j)},[p,j]),r=(0,c.useCallback)(async a=>{let b=async(a,b)=>{let c=await fetch(`${a}${f}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(b)}),d=await c.json().catch(()=>({}));if(!c.ok)throw Error(d.error??`Request failed (${c.status})`);return d};try{let{file:c,raw:d}=await b("/api/memory/entries/delete",{id:a.id});l(b=>(b??[]).filter(b=>b.id!==a.id)),q(null),(0,Y.undoToast)(`Deleted ${a.id}`,async()=>{await b("/api/memory/entries/restore",{file:c,raw:d}),o(),q(a.id)})}catch(a){(0,Y.toast)(`Delete failed: ${a instanceof Error?a.message:String(a)}`)}},[f,q,o]);return(0,b.jsx)(X,{memory:a?.memory??null,entries:k,rootParam:f,selectedId:m?null:i,creating:m,onOpen:q,onNew:()=>n(!0),onClose:()=>q(null),onDelete:r,view:j,onView:a=>p(i,a),onSaved:a=>{l(b=>[...(b??[]).filter(b=>b.id!==a.id),a]),q(a.id)}})}a.s(["default",0,function(){return(0,b.jsx)(c.Suspense,{children:(0,b.jsx)(Z,{})})}],892519)}];
12
+
13
+ //# sourceMappingURL=src_app_%28app%29_memory_page_tsx_19jhb1c._.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/app/%28app%29/memory/page.tsx","../../../../src/components/memory/EntryList.tsx","../../../../src/components/memory/EntryDetail.tsx","../../../../src/components/memory/MemoryTab.tsx","../../../../src/components/memory/EntryRelated.tsx","../../../../src/components/memory/EntryHistory.tsx","../../../../src/components/memory/MemoryGraph.tsx","../../../../src/lib/entries.ts","../../../../src/lib/recall.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/git-commit-horizontal.ts","../../../../src/lib/memory-graph.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/lightbulb.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/flag.ts"],"sourcesContent":["\"use client\"\n\nimport { Suspense, useCallback, useEffect, useState } from \"react\"\nimport { useRouter, useSearchParams } from \"next/navigation\"\nimport { useApp } from \"@/context/AppContext\"\nimport { MemoryTab } from \"@/components/memory/MemoryTab\"\nimport { toast, undoToast } from \"@/components/ui/toast\"\nimport type { Entry } from \"@/lib/entries\"\n\nexport default function MemoryPage() {\n return (\n <Suspense>\n <MemoryPageInner />\n </Suspense>\n )\n}\n\nfunction MemoryPageInner() {\n const { summary, rootParam } = useApp()\n const router = useRouter()\n // ?entry=E012 is the open entry and ?view=graph the Graph view, so a link or a reload keeps both\n const params = useSearchParams()\n const selectedId = params.get(\"entry\")\n const view = params.get(\"view\") === \"graph\" ? \"graph\" : \"list\"\n const [entries, setEntries] = useState<Entry[] | null>(null)\n const [creating, setCreating] = useState(false)\n\n const load = useCallback(() => {\n let live = true\n fetch(`/api/memory/entries${rootParam}`)\n .then((r) => r.json())\n .then((d: { entries?: Entry[] }) => { if (live) setEntries(d.entries ?? []) })\n .catch((e) => {\n console.warn(\"Loading memory entries failed\", e)\n if (live) setEntries([])\n })\n return () => { live = false }\n }, [rootParam])\n\n // AppContext replaces `summary` on every memory_updated SSE event, so refetch the entries with it\n useEffect(() => load(), [load, summary])\n\n const go = useCallback((entry: string | null, v: \"list\" | \"graph\") => {\n const q = new URLSearchParams()\n if (v === \"graph\") q.set(\"view\", \"graph\")\n if (entry) q.set(\"entry\", entry)\n router.replace(q.size ? `/memory?${q}` : \"/memory\", { scroll: false })\n }, [router])\n const select = useCallback((id: string | null) => {\n setCreating(false)\n go(id, view)\n }, [go, view])\n\n // No confirm: delete now, offer Undo (restores the same file), like tasks and docs\n const remove = useCallback(async (entry: Entry) => {\n const post = async (url: string, body: object) => {\n const res = await fetch(`${url}${rootParam}`, { method: \"POST\", headers: { \"content-type\": \"application/json\" }, body: JSON.stringify(body) })\n const data = await res.json().catch(() => ({}))\n if (!res.ok) throw new Error(data.error ?? `Request failed (${res.status})`)\n return data\n }\n try {\n const { file, raw } = await post(\"/api/memory/entries/delete\", { id: entry.id })\n setEntries((list) => (list ?? []).filter((e) => e.id !== entry.id))\n select(null)\n undoToast(`Deleted ${entry.id}`, async () => {\n await post(\"/api/memory/entries/restore\", { file, raw })\n load()\n select(entry.id)\n })\n } catch (e) {\n toast(`Delete failed: ${e instanceof Error ? e.message : String(e)}`)\n }\n }, [rootParam, select, load])\n\n return (\n <MemoryTab\n memory={summary?.memory ?? null}\n entries={entries}\n rootParam={rootParam}\n selectedId={creating ? null : selectedId}\n creating={creating}\n onOpen={select}\n onNew={() => setCreating(true)}\n onClose={() => select(null)}\n onDelete={remove}\n view={view}\n onView={(v) => go(selectedId, v)}\n onSaved={(entry) => {\n // show the saved text now; the SSE refetch confirms it\n setEntries((list) => [...(list ?? []).filter((e) => e.id !== entry.id), entry])\n select(entry.id)\n }}\n />\n )\n}\n","\"use client\"\n\nimport { useMemo, useState } from \"react\"\nimport { Plus, Search } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport { Input } from \"@/components/ui/input\"\nimport { OwnerChip } from \"@/components/shared/OwnerChip\"\nimport { ENTRY_TYPES, type Entry, type EntryType } from \"@/lib/entries\"\nimport { filterEntries, tokenize } from \"@/lib/recall\"\n\n/** Knowledge entries (R046) with search (ranked like vibedoc_recall) and a type filter. */\nexport function EntryList({ entries, selectedId, onOpen, onNew }: {\n entries: Entry[]\n selectedId?: string | null\n onOpen: (id: string) => void\n onNew: () => void\n}) {\n const [query, setQuery] = useState(\"\")\n const [type, setType] = useState<EntryType | null>(null)\n const shown = useMemo(() => filterEntries(entries, { query, type }), [entries, query, type])\n const counts = useMemo(() => {\n const c: Record<string, number> = {}\n for (const e of entries) c[e.type] = (c[e.type] ?? 0) + 1\n return c\n }, [entries])\n const searching = tokenize(query).length > 0\n\n const chip = (value: EntryType | null, label: string, count: number) => (\n <button\n key={label}\n type=\"button\"\n aria-pressed={type === value}\n onClick={() => setType(value)}\n className={cn(\n \"h-6 rounded-[5px] border border-transparent px-2 text-xs font-medium text-muted outline-none transition-colors\",\n \"hover:bg-surface2 hover:text-txt focus-visible:ring-2 focus-visible:ring-accent\",\n type === value && \"border-border2 bg-surface2 text-txt\",\n )}\n >\n {label} <span className=\"font-mono text-[10px] opacity-70\">{count}</span>\n </button>\n )\n\n return (\n <section aria-label=\"Knowledge entries\" className=\"flex min-w-0 flex-col gap-3\">\n <div className=\"flex items-baseline justify-between\">\n <h2 className=\"font-display text-base font-semibold tracking-tight\">Knowledge entries</h2>\n <button\n type=\"button\"\n onClick={onNew}\n className=\"inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs font-medium text-muted outline-none hover:bg-surface2 hover:text-txt focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <Plus className=\"size-3.5\" aria-hidden /> New entry\n </button>\n </div>\n\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 size-3.5 -translate-y-1/2 text-muted\" aria-hidden />\n <Input\n id=\"memory-search\"\n type=\"search\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search entriesโ€ฆ\"\n aria-label=\"Search entries\"\n className=\"h-8 pl-8\"\n />\n </div>\n\n <div role=\"group\" aria-label=\"Filter by type\" className=\"flex flex-wrap gap-1\">\n {chip(null, \"All\", entries.length)}\n {ENTRY_TYPES.map((t) => chip(t, t, counts[t] ?? 0))}\n </div>\n\n {entries.length === 0 ? (\n <p className=\"rounded-xl border border-dashed border-border p-4 text-sm text-muted\">\n No knowledge entries yet. Agents save them with <code className=\"font-mono text-xs\">vibedoc_save_entry</code>.\n </p>\n ) : shown.length === 0 ? (\n <p className=\"p-2 text-sm text-muted\">\n No entries match {searching ? `\"${query.trim()}\"` : \"this filter\"}.\n </p>\n ) : (\n <ul className=\"flex flex-col divide-y divide-border rounded-xl border border-border bg-surface\">\n {shown.map((e) => (\n <li key={e.id}>\n <button\n type=\"button\"\n onClick={() => onOpen(e.id)}\n aria-current={e.id === selectedId ? \"true\" : undefined}\n className={cn(\n \"flex w-full flex-col gap-0.5 px-3 py-2 text-left outline-none transition-colors hover:bg-surface2 focus-visible:bg-surface2\",\n e.id === selectedId && \"bg-surface2 shadow-[inset_2px_0_0_var(--color-accent)]\",\n )}\n >\n <span className=\"flex items-center gap-2 font-mono text-[11px] text-muted\">\n <span>{e.id}</span>\n <span>ยท</span>\n <span>{e.type}</span>\n <span className=\"ml-auto flex items-center gap-2\">\n <OwnerChip owner={e.by} className=\"font-sans\" />\n {e.updatedAt}\n </span>\n </span>\n <span className=\"text-sm text-txt\">{e.summary}</span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </section>\n )\n}\n","\"use client\"\n\nimport { useEffect, useState, type ReactNode } from \"react\"\nimport { Pencil, Trash2, X } from \"lucide-react\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { ItemPanelHeader } from \"@/components/shared/ItemPanelHeader\"\nimport { OwnerChip } from \"@/components/shared/OwnerChip\"\nimport { MarkdownRenderer } from \"@/components/docs/MarkdownRenderer\"\nimport { ENTRY_TYPES, validateEntryInput, type Entry, type EntryType } from \"@/lib/entries\"\n\ntype Draft = { type: EntryType; summary: string; body: string }\n\n/**\n * One knowledge entry: read view with Edit, or the edit form. `entry` null = a new entry (form only).\n * R053 adds its panels (Related, History) under the body via `children`.\n */\nexport function EntryDetail({ entry, rootParam, onSaved, onDelete, onClose, children }: {\n entry: Entry | null\n rootParam: string\n onSaved: (entry: Entry) => void\n onDelete: (entry: Entry) => void\n onClose: () => void\n children?: ReactNode\n}) {\n const [editing, setEditing] = useState(entry === null)\n const [draft, setDraft] = useState<Draft>(() => toDraft(entry))\n const [error, setError] = useState<string | null>(null)\n const [saving, setSaving] = useState(false)\n\n const startEdit = () => { setDraft(toDraft(entry)); setError(null); setEditing(true) }\n const cancel = () => { if (entry) { setEditing(false); setError(null) } else onClose() }\n\n const save = async () => {\n // same rules as the server, so a bad summary never costs a request\n const invalid = validateEntryInput({ ...draft, id: entry?.id })\n if (invalid) { setError(invalid); return }\n setSaving(true)\n setError(null)\n try {\n const res = await fetch(`/api/memory/entries/save${rootParam}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ ...(entry ? { id: entry.id } : {}), ...draft }),\n })\n const data = (await res.json().catch(() => ({}))) as { entry?: Entry; error?: string }\n if (!res.ok || !data.entry) throw new Error(data.error ?? `Save failed (${res.status})`)\n setEditing(false)\n onSaved(data.entry)\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e))\n } finally {\n setSaving(false)\n }\n }\n\n // โŒซ / Delete deletes the open entry, unless the user is typing somewhere\n useEffect(() => {\n if (editing || !entry) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Backspace\" && e.key !== \"Delete\") return\n if (e.metaKey || e.ctrlKey || e.altKey) return\n const t = e.target as HTMLElement | null\n if (t && (t.isContentEditable || [\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(t.tagName))) return\n e.preventDefault()\n onDelete(entry)\n }\n window.addEventListener(\"keydown\", onKey)\n return () => window.removeEventListener(\"keydown\", onKey)\n }, [editing, entry, onDelete])\n\n const closeButton = (\n <button type=\"button\" onClick={onClose} aria-label=\"Close entry\" className=\"rounded p-1 text-muted hover:bg-surface2 hover:text-txt\">\n <X className=\"size-3.5\" />\n </button>\n )\n\n if (editing) {\n return (\n <section aria-label={entry ? `Edit ${entry.id}` : \"New entry\"} className=\"rounded-xl border border-border bg-surface\">\n <form\n onSubmit={(e) => { e.preventDefault(); void save() }}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") { e.preventDefault(); cancel() }\n if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey)) { e.preventDefault(); void save() }\n }}\n className=\"flex flex-col gap-3 p-5\"\n >\n <div className=\"flex items-center justify-between font-mono text-[11px] text-muted\">\n <span>{entry ? `${entry.id} ยท editing` : \"New entry\"}</span>\n {closeButton}\n </div>\n <label className=\"flex flex-col gap-1 text-xs text-muted\">\n Type\n <select\n value={draft.type}\n onChange={(e) => setDraft({ ...draft, type: e.target.value as EntryType })}\n className=\"h-8 rounded-md border border-border bg-bg px-2 text-sm text-txt focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent\"\n >\n {ENTRY_TYPES.map((t) => <option key={t} value={t}>{t}</option>)}\n </select>\n </label>\n <label className=\"flex flex-col gap-1 text-xs text-muted\">\n Summary (one line)\n <Input\n autoFocus\n value={draft.summary}\n onChange={(e) => setDraft({ ...draft, summary: e.target.value })}\n maxLength={200}\n className=\"h-8 text-txt\"\n />\n </label>\n <label className=\"flex flex-col gap-1 text-xs text-muted\">\n Details (markdown)\n <textarea\n value={draft.body}\n onChange={(e) => setDraft({ ...draft, body: e.target.value })}\n rows={8}\n className=\"w-full resize-y rounded-md border border-border bg-bg px-3 py-2 font-mono text-xs text-txt focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent\"\n />\n </label>\n {error && <p role=\"alert\" className=\"text-xs text-danger\">{error}</p>}\n <div className=\"flex items-center justify-end gap-2\">\n <span className=\"mr-auto text-[11px] text-muted\">โŒ˜โ†ต save ยท Esc cancel</span>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={cancel}>Cancel</Button>\n <Button type=\"submit\" size=\"sm\" disabled={saving}>{saving ? \"Savingโ€ฆ\" : \"Save\"}</Button>\n </div>\n </form>\n </section>\n )\n }\n\n if (!entry) return null\n return (\n <section aria-label={entry.id} className=\"rounded-xl border border-border bg-surface\">\n <ItemPanelHeader\n kicker={<span>{entry.id} ยท entry</span>}\n menu={\n <span className=\"flex items-center gap-1\">\n <Button variant=\"ghost\" size=\"sm\" onClick={startEdit} className=\"h-7 px-2 text-xs\">\n <Pencil className=\"size-3.5\" /> Edit\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => onDelete(entry)} title=\"Delete (โŒซ)\" className=\"h-7 px-2 text-xs hover:text-danger\">\n <Trash2 className=\"size-3.5\" /> Delete\n </Button>\n {closeButton}\n </span>\n }\n title={entry.summary}\n properties={[\n { label: \"Type\", value: entry.type },\n { label: \"Updated\", value: entry.updatedAt || null },\n { label: \"Changed by\", value: entry.by ? <OwnerChip owner={entry.by} className=\"text-xs text-txt\" /> : null },\n { label: \"File\", value: <span className=\"truncate font-mono text-[11px] text-muted\">{entry.file}</span> },\n ]}\n />\n <div className=\"p-5\">\n {entry.body ? <MarkdownRenderer content={entry.body} /> : <p className=\"text-sm text-muted\">No details.</p>}\n {children}\n </div>\n </section>\n )\n}\n\nfunction toDraft(entry: Entry | null): Draft {\n return entry ? { type: entry.type, summary: entry.summary, body: entry.body } : { type: \"convention\", summary: \"\", body: \"\" }\n}\n","import { MarkdownRenderer } from \"@/components/docs/MarkdownRenderer\"\r\nimport { EmptyState } from \"@/components/shared/EmptyState\"\r\nimport type { Entry } from \"@/lib/entries\"\r\nimport { EntryList } from \"./EntryList\"\r\nimport { EntryDetail } from \"./EntryDetail\"\r\nimport { EntryRelated } from \"./EntryRelated\"\r\nimport { EntryHistory } from \"./EntryHistory\"\r\nimport { MemoryGraph } from \"./MemoryGraph\"\r\nimport { cn } from \"@/lib/utils\"\r\n\r\ninterface MemoryTabProps {\r\n memory: { content: string; exists: boolean } | null\r\n /** null while loading */\r\n entries: Entry[] | null\r\n rootParam: string\r\n /** The open entry id (from ?entry=), or null */\r\n selectedId: string | null\r\n /** The New entry form is open */\r\n creating: boolean\r\n onOpen: (id: string) => void\r\n onNew: () => void\r\n onClose: () => void\r\n onSaved: (entry: Entry) => void\r\n onDelete: (entry: Entry) => void\r\n view: \"list\" | \"graph\"\r\n onView: (view: \"list\" | \"graph\") => void\r\n}\r\n\r\nexport function MemoryTab({ memory, entries, rootParam, selectedId, creating, onOpen, onNew, onClose, onSaved, onDelete, view, onView }: MemoryTabProps) {\r\n const selected = selectedId ? entries?.find((e) => e.id === selectedId) : undefined\r\n return (\r\n <div className={cn(\r\n \"grid items-start gap-6 p-6\",\r\n view === \"graph\" ? \"lg:grid-cols-[minmax(0,1fr)_minmax(0,30rem)]\" : \"lg:grid-cols-[minmax(280px,380px)_minmax(0,42rem)]\",\r\n )}>\r\n <div className=\"flex items-center justify-between gap-4 lg:col-span-2\">\r\n <h1 className=\"font-display text-xl font-semibold tracking-tight\">Memory</h1>\r\n <div role=\"group\" aria-label=\"Entries view\" className=\"flex rounded-md border border-border p-0.5\">\r\n {([\"list\", \"graph\"] as const).map((v) => (\r\n <button\r\n key={v}\r\n type=\"button\"\r\n aria-pressed={view === v}\r\n onClick={() => onView(v)}\r\n className={cn(\r\n \"h-6 rounded-[5px] border border-transparent px-2.5 text-xs font-medium capitalize text-muted outline-none transition-colors\",\r\n \"hover:bg-surface2 hover:text-txt focus-visible:ring-2 focus-visible:ring-accent\",\r\n view === v && \"border-border2 bg-surface2 text-txt\",\r\n )}\r\n >\r\n {v}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n {entries && view === \"graph\" ? (\r\n <MemoryGraph entries={entries} selectedId={selectedId} onOpenEntry={onOpen} />\r\n ) : entries ? (\r\n <EntryList entries={entries} selectedId={selectedId} onOpen={onOpen} onNew={onNew} />\r\n ) : (\r\n <p className=\"text-sm text-muted\">Loading entriesโ€ฆ</p>\r\n )}\r\n {creating || selected ? (\r\n <div className=\"min-w-0 lg:sticky lg:top-6\">\r\n <EntryDetail key={creating ? \"new\" : selected?.id} entry={creating ? null : selected ?? null} rootParam={rootParam} onSaved={onSaved} onDelete={onDelete} onClose={onClose}>\r\n {selected && !creating && (\r\n <>\r\n <EntryRelated entryId={selected.id} onOpenEntry={onOpen} />\r\n <EntryHistory entryId={selected.id} />\r\n </>\r\n )}\r\n </EntryDetail>\r\n </div>\r\n ) : selectedId && entries ? (\r\n <div role=\"alert\" className=\"min-w-0 rounded-xl border border-dashed border-border p-5 text-sm text-muted\">\r\n Entry {selectedId} not found.{\" \"}\r\n <button type=\"button\" onClick={onClose} className=\"text-txt underline underline-offset-2\">Show the handoff</button>\r\n </div>\r\n ) : (\r\n <div className=\"min-w-0\">\r\n <div className=\"flex items-baseline justify-between mb-3\">\r\n <h2 className=\"font-display text-base font-semibold tracking-tight\">Session handoff</h2>\r\n <span className=\"text-xs font-mono text-muted\">memory/MEMORY.md</span>\r\n </div>\r\n\r\n {memory?.exists ? (\r\n <div className=\"bg-surface border border-border rounded-xl p-5\">\r\n <MarkdownRenderer content={memory.content} />\r\n </div>\r\n ) : (\r\n <EmptyState\r\n icon=\"๐Ÿง \"\r\n message=\"No MEMORY.md yet.\"\r\n subMessage=\"AI will create one at the end of the first session.\"\r\n bordered\r\n />\r\n )}\r\n\r\n <div className=\"mt-4 p-4 bg-surface2 border border-border rounded-xl\">\r\n <p className=\"text-xs font-mono text-muted mb-2\">\r\n Add to your CLAUDE.md system prompt:\r\n </p>\r\n <pre className=\"text-xs font-mono text-accent/80 whitespace-pre-wrap leading-relaxed\">{`At session start:\r\n1. Call vibedoc_read_memory\r\n2. Call vibedoc_get_status\r\n\r\nWhen you learn a fact that should still hold next week:\r\n- Call vibedoc_save_entry (convention, gotcha, decision, preference)\r\n\r\nAt session end:\r\n- Call vibedoc_update_memory with full handoff`}</pre>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n","\"use client\"\n\nimport { useEffect, useMemo, useState } from \"react\"\nimport { useRouter } from \"next/navigation\"\nimport { BookOpen, FileText, Flag, Lightbulb, Scale } from \"lucide-react\"\nimport { useApp } from \"@/context/AppContext\"\nimport { StatusIcon } from \"@/components/shared/StatusIcon\"\nimport { displayStatus } from \"@/lib/statuses\"\nimport type { GraphNode, MemoryGraph, NodeKind } from \"@/lib/memory-graph\"\n\nconst GROUPS: { kind: NodeKind; label: string }[] = [\n { kind: \"task\", label: \"Tasks\" },\n { kind: \"epic\", label: \"Epics\" },\n { kind: \"adr\", label: \"ADRs\" },\n { kind: \"doc\", label: \"Docs\" },\n { kind: \"entry\", label: \"Entries\" },\n]\nexport const KIND_ICON = { epic: Flag, adr: Scale, doc: FileText, entry: Lightbulb, task: BookOpen } as const\n\n/** Open a graph node where it lives: a task on /board, an epic on /roadmap, a doc or ADR in Docs, an entry here. */\nexport function useOpenNode(onOpenEntry: (id: string) => void) {\n const router = useRouter()\n const { openDoc } = useApp()\n return (n: GraphNode) => {\n if (n.kind === \"task\") router.push(`/board?task=${n.id}`)\n else if (n.kind === \"epic\") router.push(`/roadmap?item=${n.id}`)\n else if (n.kind === \"entry\") onOpenEntry(n.id)\n else void openDoc(n.path)\n }\n}\n\n/**\n * What an entry links to and what links back (R053), from GET /api/memory/graph?entry=.\n * Links are inferred from text, so the way to change them is to edit the entry.\n */\nexport function EntryRelated({ entryId, onOpenEntry }: { entryId: string; onOpenEntry: (id: string) => void }) {\n const { rootParam, summary, board } = useApp()\n const open = useOpenNode(onOpenEntry)\n const [graph, setGraph] = useState<MemoryGraph | null>(null)\n\n // refetch when the entry changes and on every memory_updated SSE event (AppContext replaces `summary`)\n useEffect(() => {\n let live = true\n fetch(`/api/memory/graph${rootParam}&entry=${encodeURIComponent(entryId)}`)\n .then((r) => r.json())\n .then((g: MemoryGraph) => { if (live) setGraph(g.nodes ? g : { nodes: [], edges: [] }) })\n .catch((e) => {\n console.warn(\"Loading entry links failed\", e)\n if (live) setGraph({ nodes: [], edges: [] })\n })\n return () => { live = false }\n }, [entryId, rootParam, summary])\n\n const tasks = useMemo(() => new Map(Object.values(board ?? {}).flat().map((t) => [t.id, t])), [board])\n const byId = useMemo(() => new Map((graph?.nodes ?? []).map((n) => [n.id, n])), [graph])\n const pick = (ids: string[]) => ids.map((id) => byId.get(id)).filter((n): n is GraphNode => !!n)\n const linksTo = pick((graph?.edges ?? []).filter((e) => e.from === entryId).map((e) => e.to))\n const linkedFrom = pick((graph?.edges ?? []).filter((e) => e.to === entryId).map((e) => e.from))\n\n const row = (n: GraphNode) => {\n const task = n.kind === \"task\" ? tasks.get(n.id) : undefined\n const Icon = KIND_ICON[n.kind]\n return (\n <li key={n.id}>\n <button\n type=\"button\"\n onClick={() => open(n)}\n title={n.path}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1 text-left text-sm outline-none hover:bg-surface2 focus-visible:ring-2 focus-visible:ring-accent\"\n >\n {task ? <StatusIcon status={displayStatus(task)} className=\"size-3.5 shrink-0\" /> : <Icon className=\"size-3.5 shrink-0 text-muted\" aria-hidden />}\n {n.kind !== \"doc\" && <span className=\"shrink-0 font-mono text-[11px] text-muted\">{n.id}</span>}\n <span className=\"min-w-0 truncate text-txt\">{n.label}</span>\n </button>\n </li>\n )\n }\n\n const section = (title: string, nodes: GraphNode[]) => (\n <div className=\"flex flex-col gap-1.5\">\n <h4 className=\"text-[11px] font-semibold uppercase tracking-wider text-muted\">{title}</h4>\n {GROUPS.map(({ kind, label }) => {\n const group = nodes.filter((n) => n.kind === kind)\n if (!group.length) return null\n return (\n <div key={kind}>\n <p className=\"px-2 text-[11px] text-muted\">{label}</p>\n <ul>{group.map(row)}</ul>\n </div>\n )\n })}\n </div>\n )\n\n return (\n <section aria-label=\"Related\" className=\"mt-5 flex flex-col gap-3 border-t border-border pt-4\">\n <h3 className=\"text-xs font-semibold text-txt\">Related</h3>\n {graph === null ? (\n <p className=\"text-xs text-muted\">Loading linksโ€ฆ</p>\n ) : !linksTo.length && !linkedFrom.length ? (\n <p className=\"text-xs text-muted\">No links yet. Mention a task, epic or doc in the entry to link it.</p>\n ) : (\n <>\n {linksTo.length > 0 && section(\"Links to\", linksTo)}\n {linkedFrom.length > 0 && section(\"Linked from\", linkedFrom)}\n </>\n )}\n </section>\n )\n}\n","\"use client\"\n\nimport { useState } from \"react\"\nimport { ChevronRight, GitCommitHorizontal, X } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport { useApp } from \"@/context/AppContext\"\nimport type { FileCommit, FileHistory } from \"@/lib/core\"\n\n/**\n * How an entry changed over time (R053): the commits that touched its file, from git.\n * Collapsed by default; nothing is fetched until it is opened. A row shows that version read-only.\n */\nexport function EntryHistory({ entryId }: { entryId: string }) {\n const { rootParam } = useApp()\n const [open, setOpen] = useState(false)\n const [data, setData] = useState<FileHistory | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [version, setVersion] = useState<{ commit: FileCommit; text: string } | null>(null)\n const base = `/api/memory/history${rootParam}&entry=${encodeURIComponent(entryId)}`\n\n const get = async <T,>(url: string): Promise<T> => {\n const res = await fetch(url)\n const body = await res.json().catch(() => ({}))\n if (!res.ok) throw new Error(body.error ?? `Request failed (${res.status})`)\n return body as T\n }\n\n const toggle = async () => {\n const next = !open\n setOpen(next)\n if (!next || data) return\n try {\n setData(await get<FileHistory>(base))\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e))\n }\n }\n\n const show = async (commit: FileCommit) => {\n try {\n const { text } = await get<{ text: string }>(`${base}&sha=${commit.sha}`)\n setVersion({ commit, text })\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e))\n }\n }\n\n return (\n <section aria-label=\"History\" className=\"mt-4 border-t border-border pt-3\">\n <button\n type=\"button\"\n onClick={toggle}\n aria-expanded={open}\n className=\"flex items-center gap-1 rounded text-xs font-semibold text-txt outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <ChevronRight className={cn(\"size-3.5 text-muted transition-transform\", open && \"rotate-90\")} aria-hidden />\n History\n </button>\n\n {open && (\n <div className=\"mt-2 flex flex-col gap-2\">\n {error && <p role=\"alert\" className=\"text-xs text-danger\">{error}</p>}\n {!data && !error && <p className=\"text-xs text-muted\">Loading historyโ€ฆ</p>}\n {data?.reason === \"no-git\" && <p className=\"text-xs text-muted\">History needs git: this project is not a git repository.</p>}\n {data && !data.reason && !data.history.length && !data.uncommitted && (\n <p className=\"text-xs text-muted\">Not committed yet.</p>\n )}\n {data && (data.uncommitted || data.history.length > 0) && (\n <ul className=\"flex flex-col\">\n {data.uncommitted && (\n <li className=\"flex items-center gap-2 px-2 py-1 text-xs text-muted\">\n <span className=\"size-1.5 rounded-full bg-accent\" aria-hidden /> Uncommitted changes\n </li>\n )}\n {data.history.map((c) => (\n <li key={c.sha}>\n <button\n type=\"button\"\n onClick={() => show(c)}\n aria-current={version?.commit.sha === c.sha ? \"true\" : undefined}\n className={cn(\n \"flex w-full items-center gap-2 rounded-md px-2 py-1 text-left text-xs outline-none hover:bg-surface2 focus-visible:ring-2 focus-visible:ring-accent\",\n version?.commit.sha === c.sha && \"bg-surface2\",\n )}\n >\n <GitCommitHorizontal className=\"size-3.5 shrink-0 text-muted\" aria-hidden />\n <span className=\"shrink-0 font-mono text-[11px] text-muted\">{c.date.slice(0, 10)}</span>\n <span className=\"min-w-0 flex-1 truncate text-txt\">{c.subject}</span>\n <span className=\"shrink-0 text-muted\">{c.author}</span>\n </button>\n </li>\n ))}\n </ul>\n )}\n {version && (\n <div className=\"rounded-md border border-border bg-bg\">\n <div className=\"flex items-center justify-between border-b border-border px-3 py-1.5 font-mono text-[11px] text-muted\">\n <span>{version.commit.sha.slice(0, 7)} ยท {version.commit.date.slice(0, 10)} ยท read-only</span>\n <button type=\"button\" onClick={() => setVersion(null)} aria-label=\"Close version\" className=\"rounded p-0.5 hover:text-txt\">\n <X className=\"size-3.5\" />\n </button>\n </div>\n <pre className=\"max-h-72 overflow-auto whitespace-pre-wrap p-3 font-mono text-xs text-txt\">{version.text}</pre>\n </div>\n )}\n </div>\n )}\n </section>\n )\n}\n","\"use client\"\n\nimport { memo, useEffect, useMemo, useState, useSyncExternalStore } from \"react\"\nimport { Background, BackgroundVariant, Controls, Handle, Position, ReactFlow, type Edge, type Node, type NodeProps } from \"@xyflow/react\"\nimport \"@xyflow/react/dist/style.css\"\nimport { cn } from \"@/lib/utils\"\nimport { useApp } from \"@/context/AppContext\"\nimport { StatusIcon } from \"@/components/shared/StatusIcon\"\nimport { displayStatus } from \"@/lib/statuses\"\nimport type { Entry } from \"@/lib/entries\"\nimport { GRAPH_COL_W, graphLayout, type GraphNode, type MemoryGraph as Graph } from \"@/lib/memory-graph\"\nimport { KIND_ICON, useOpenNode } from \"./EntryRelated\"\n\ntype MemNodeData = { node: GraphNode; status?: string; unlinked: boolean; dim: boolean; active: boolean }\ntype MemNode = Node<MemNodeData, \"mem\">\n\nconst NODE_W = GRAPH_COL_W - 44\nconst FLOW_STYLE = { \"--xy-background-color\": \"var(--color-bg)\" } as React.CSSProperties\n// ponytail: above this many nodes only the ones on screen render; measured smooth at 240 entries either way\nconst VIRTUALIZE_OVER = 150\n// fitting a wide graph shrinks the text past reading; below this zoom, centre it and let the user pan\nconst FIT_MIN_ZOOM = 0.8\n\nfunction subscribeTheme(cb: () => void) {\n const mo = new MutationObserver(cb)\n mo.observe(document.documentElement, { attributes: true, attributeFilter: [\"class\"] })\n return () => mo.disconnect()\n}\n\n/** One node: kind icon (or task status), id, label. Handles left and right; edges pick a side by column. */\nconst MemNodeView = memo(function MemNodeView({ data }: NodeProps<MemNode>) {\n const { node, status, unlinked, dim, active } = data\n const Icon = KIND_ICON[node.kind]\n return (\n <div\n title={node.path}\n style={{ width: NODE_W }}\n className={cn(\n \"flex items-center gap-2 rounded-md border bg-surface px-2.5 py-1.5 text-xs transition-opacity\",\n node.kind === \"entry\" ? \"border-border2\" : \"border-border\",\n active && \"border-accent ring-1 ring-accent\",\n unlinked && \"border-dashed opacity-60\",\n dim && \"opacity-25\",\n )}\n >\n {[\"l\", \"r\"].map((side) => (\n <span key={side}>\n <Handle id={side} type=\"source\" position={side === \"l\" ? Position.Left : Position.Right} isConnectable={false} className=\"opacity-0\" />\n <Handle id={`${side}-t`} type=\"target\" position={side === \"l\" ? Position.Left : Position.Right} isConnectable={false} className=\"opacity-0\" />\n </span>\n ))}\n {status ? <StatusIcon status={status} className=\"size-3.5 shrink-0\" /> : <Icon className={cn(\"size-3.5 shrink-0\", node.kind === \"entry\" ? \"text-accent\" : \"text-muted\")} aria-hidden />}\n {node.kind !== \"doc\" && <span className=\"shrink-0 font-mono text-[10px] text-muted\">{node.id}</span>}\n <span className={cn(\"min-w-0 truncate\", node.kind === \"entry\" ? \"text-txt\" : \"text-muted\")}>{node.label}</span>\n </div>\n )\n})\nconst nodeTypes = { mem: MemNodeView }\n\n/**\n * Entries and the tasks, epics, ADRs and docs they link to (R053). Deterministic layout from graphLayout();\n * selecting an entry highlights it and its neighbours. Refetches on every memory_updated SSE event.\n */\nexport function MemoryGraph({ entries, selectedId, onOpenEntry }: { entries: Entry[]; selectedId: string | null; onOpenEntry: (id: string) => void }) {\n const { rootParam, summary, board } = useApp()\n const open = useOpenNode(onOpenEntry)\n const [graph, setGraph] = useState<Graph | null>(null)\n const isDark = useSyncExternalStore(subscribeTheme, () => document.documentElement.classList.contains(\"dark\"), () => true)\n\n useEffect(() => {\n let live = true\n fetch(`/api/memory/graph${rootParam}`)\n .then((r) => r.json())\n .then((g: Graph) => { if (live) setGraph(g.nodes ? g : { nodes: [], edges: [] }) })\n .catch((e) => {\n console.warn(\"Loading the memory graph failed\", e)\n if (live) setGraph({ nodes: [], edges: [] })\n })\n return () => { live = false }\n }, [rootParam, summary])\n\n const { nodes, edges } = useMemo(() => {\n if (!graph) return { nodes: [] as MemNode[], edges: [] as Edge[] }\n const types = Object.fromEntries(entries.map((e) => [e.id, e.type]))\n const pos = graphLayout(graph, types)\n const tasks = new Map(Object.values(board ?? {}).flat().map((t) => [t.id, t]))\n const linked = new Set(graph.edges.flatMap((e) => [e.from, e.to]))\n const focus = selectedId && pos[selectedId]\n ? new Set([selectedId, ...graph.edges.filter((e) => e.from === selectedId || e.to === selectedId).flatMap((e) => [e.from, e.to])])\n : null\n const nodes: MemNode[] = graph.nodes.map((n) => {\n const task = n.kind === \"task\" ? tasks.get(n.id) : undefined\n return {\n id: n.id,\n type: \"mem\",\n position: pos[n.id] ?? { x: 0, y: 0 },\n data: {\n node: n,\n status: task ? displayStatus(task) : undefined,\n unlinked: n.kind === \"entry\" && !linked.has(n.id),\n dim: !!focus && !focus.has(n.id),\n active: n.id === selectedId,\n },\n draggable: false,\n }\n })\n const edges: Edge[] = graph.edges.map((e) => {\n const fx = pos[e.from]?.x ?? 0, tx = pos[e.to]?.x ?? 0\n const leftward = tx < fx\n const hot = !!focus && (e.from === selectedId || e.to === selectedId)\n return {\n id: `${e.from}->${e.to}`,\n source: e.from,\n target: e.to,\n // same column (entry โ†’ entry) loops out and back on the right\n sourceHandle: leftward ? \"l\" : \"r\",\n targetHandle: leftward ? \"r-t\" : tx === fx ? \"r-t\" : \"l-t\",\n style: { stroke: hot ? \"var(--color-accent)\" : \"var(--color-border2)\", strokeWidth: hot ? 1.75 : 1, opacity: focus && !hot ? 0.15 : 1 },\n }\n })\n return { nodes, edges }\n }, [graph, entries, board, selectedId])\n\n if (!graph) return <p className=\"text-sm text-muted\">Loading graphโ€ฆ</p>\n if (!graph.nodes.length) return <p className=\"rounded-xl border border-dashed border-border p-4 text-sm text-muted\">No entries to draw yet.</p>\n\n return (\n <div aria-label=\"Memory graph\" className=\"h-[70vh] min-h-[420px] overflow-hidden rounded-xl border border-border\">\n <ReactFlow<MemNode>\n nodes={nodes}\n edges={edges}\n nodeTypes={nodeTypes}\n onNodeClick={(_, n) => open(n.data.node)}\n nodesConnectable={false}\n nodesDraggable={false}\n deleteKeyCode={null}\n colorMode={isDark ? \"dark\" : \"light\"}\n onlyRenderVisibleElements={nodes.length > VIRTUALIZE_OVER}\n fitView\n fitViewOptions={{ padding: 0.1, minZoom: FIT_MIN_ZOOM, maxZoom: 1 }}\n minZoom={0.1}\n style={FLOW_STYLE}\n >\n <Background variant={BackgroundVariant.Dots} gap={20} size={1} />\n <Controls showInteractive={false} />\n </ReactFlow>\n </div>\n )\n}\n","// Pure knowledge-entry parsing and formatting (R046, no fs). Self-check: node src/lib/entries.check.mts\n// One long-lived fact per file: memory/entries/E001-<slug>.md\n\nexport const ENTRY_TYPES = ['convention', 'gotcha', 'decision', 'preference'] as const\nexport type EntryType = typeof ENTRY_TYPES[number]\n\n/**\n * updatedAt = the `**Updated:**` date (YYYY-MM-DD); by = `**By:**` who saved it last (\"human\" | \"ai:<agent>\",\n * null in files from before R047); file = path relative to root.\n */\nexport type Entry = { id: string; type: EntryType; summary: string; body: string; updatedAt: string; by: string | null; file: string }\nexport type EntryInput = { id?: string; type: string; summary: string; body?: string }\n\nexport const SUMMARY_MAX = 120\n\nconst isEntryType = (s: string): s is EntryType => (ENTRY_TYPES as readonly string[]).includes(s)\n\n/** \"e1\" / \"E01\" / \"E001\" โ†’ \"E001\"; anything else โ†’ null. */\nexport function normalizeEntryId(s: string): string | null {\n const m = /^e(\\d+)$/i.exec(s.trim())\n if (!m) return null\n const n = Number(m[1])\n return n > 0 ? `E${String(n).padStart(3, '0')}` : null\n}\n\n/** One past the highest id: [] โ†’ \"E001\"; [\"E001\",\"E007\"] โ†’ \"E008\". */\nexport function nextEntryId(ids: string[]): string {\n const max = Math.max(0, ...ids.map(id => Number(normalizeEntryId(id)?.slice(1) ?? 0)))\n return `E${String(max + 1).padStart(3, '0')}`\n}\n\nexport function entrySlug(summary: string): string {\n return summary.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '').slice(0, 40).replace(/-$/, '')\n}\n\n/** null when the `# E001: summary` H1 or a known `**Type:**` is missing. */\nexport function parseEntry(raw: string, file: string): Entry | null {\n const lines = raw.replace(/\\r\\n/g, '\\n').split('\\n')\n const h1 = /^#\\s+(E\\d+):\\s*(.+?)\\s*$/i.exec(lines[0] ?? '')\n const id = h1 && normalizeEntryId(h1[1])\n if (!h1 || !id) return null\n // Contiguous **Key:** Value block under the H1, like task files\n const meta: Record<string, string> = {}\n let i = 1\n for (; i < lines.length; i++) {\n const m = /^\\*\\*(\\w+):\\*\\*\\s*(.*)$/.exec(lines[i])\n if (!m) break\n meta[m[1].toLowerCase()] = m[2].trim()\n }\n const type = meta.type ?? ''\n if (!isEntryType(type)) return null\n return { id, type, summary: h1[2], body: lines.slice(i).join('\\n').trim(), updatedAt: meta.updated ?? '', by: meta.by || null, file }\n}\n\nexport function formatEntry(e: Omit<Entry, 'file'>): string {\n const head = `# ${e.id}: ${e.summary}\\n**Type:** ${e.type}\\n**Updated:** ${e.updatedAt}\\n${e.by ? `**By:** ${e.by}\\n` : ''}`\n return e.body.trim() ? `${head}\\n${e.body.trim()}\\n` : head\n}\n\n/** Error message, or null when valid. Does not check whether an id exists. */\nexport function validateEntryInput(i: EntryInput): string | null {\n if (i.id !== undefined && !normalizeEntryId(String(i.id))) return `Invalid id \"${i.id}\": expected E followed by a number, e.g. E001`\n if (!isEntryType(String(i.type ?? ''))) return `Invalid type \"${i.type ?? ''}\": use one of ${ENTRY_TYPES.join(', ')}`\n const summary = String(i.summary ?? '').trim()\n if (!summary) return 'summary is required'\n if (/\\n/.test(summary)) return 'summary must be one line'\n if (summary.length > SUMMARY_MAX) return `summary is ${summary.length} characters; keep it to ${SUMMARY_MAX}`\n if (i.body !== undefined && typeof i.body !== 'string') return 'body must be a string'\n return null\n}\n","// Pure keyword recall over knowledge entries (R048, no fs). Self-check: node src/lib/recall.check.mts\n// Index first, bodies on request: agents get compact lines here and fetch bodies with vibedoc_get_entries.\n\nexport type RecallEntry = { id: string; type: string; summary: string; body: string; updatedAt: string }\nexport type RecallHit = { id: string; type: string; summary: string; tokens: number; score: number }\n\nconst STOPWORDS = new Set(('a an and are as at be but by can do does for from how i if in into is it its of on or ' +\n 'our so that the their then there these this to use used using was we what when where which who why will with you your').split(' '))\n\n/** Lowercase, split on non-alphanumerics, drop stopwords and 1-char tokens, naive plural strip (\"events\" โ†’ \"event\"). */\nexport function tokenize(s: string): string[] {\n return s.toLowerCase().split(/[^a-z0-9]+/)\n .filter(t => t.length > 1 && !STOPWORDS.has(t))\n // ponytail: plural strip only, no real stemmer; add one if recall misses obvious matches\n .map(t => (t.length > 3 && t.endsWith('s') && !t.endsWith('ss') ? t.slice(0, -1) : t))\n}\n\nexport function estimateTokens(s: string): number {\n return Math.ceil(s.length / 4)\n}\n\n/** Per query token: +3 in summary, +2 matches id or type, +1 in body. Score 0 dropped; ties โ†’ newest first. */\nexport function rankEntries(entries: RecallEntry[], query: string, opts: { type?: string; limit?: number } = {}): RecallHit[] {\n const q = [...new Set(tokenize(query))]\n if (!q.length) return []\n const hits: (RecallHit & { updatedAt: string })[] = []\n for (const e of entries) {\n if (opts.type && e.type !== opts.type) continue\n const summary = new Set(tokenize(e.summary))\n const body = new Set(tokenize(e.body))\n const idType = new Set([e.id.toLowerCase(), ...tokenize(e.type)])\n let score = 0\n for (const t of q) {\n if (summary.has(t)) score += 3\n if (idType.has(t)) score += 2\n if (body.has(t)) score += 1\n }\n if (score > 0) {\n hits.push({ id: e.id, type: e.type, summary: e.summary, tokens: estimateTokens(`${e.summary}\\n${e.body}`), score, updatedAt: e.updatedAt })\n }\n }\n hits.sort((a, b) => b.score - a.score || b.updatedAt.localeCompare(a.updatedAt))\n return hits.slice(0, opts.limit ?? 10).map(({ updatedAt: _, ...h }) => h)\n}\n\n/** \"E012 ยท convention ยท Only core.ts touches fs (~120 tok)\" */\nexport function formatCompactLine(h: RecallHit): string {\n return `${h.id} ยท ${h.type} ยท ${h.summary} (~${h.tokens} tok)`\n}\n\n/** Every entry as a compact hit, newest first: the session-start index order. */\nexport function indexHits(entries: RecallEntry[]): RecallHit[] {\n return [...entries].sort((a, b) => b.updatedAt.localeCompare(a.updatedAt) || a.id.localeCompare(b.id, 'en', { numeric: true }))\n .map(e => ({ id: e.id, type: e.type, summary: e.summary, tokens: estimateTokens(`${e.summary}\\n${e.body}`), score: 0 }))\n}\n\nexport const DEFAULT_SESSION_BUDGET = 2000\nconst INDEX_HINT = 'Save new facts with vibedoc_save_entry; fetch bodies with vibedoc_get_entries.'\n\n/**\n * Session start = the whole handoff + as many index lines (in the order given) as fit `budget` tokens,\n * then \"+N more\" when some were left out. Header, footer and hint count toward the budget. The handoff is never cut.\n */\nexport function fitToBudget(handoff: string, index: RecallHit[], budget: number):\n { text: string; shown: number; omitted: number; tokens: number } {\n const render = (n: number, warning?: string) => [\n handoff.trimEnd(), '',\n ...(warning ? [warning] : []),\n `## Knowledge entries (${index.length})`,\n ...index.slice(0, n).map(formatCompactLine),\n ...(n < index.length ? [`+${index.length - n} more entries โ€” use vibedoc_recall { query }`] : []),\n INDEX_HINT,\n ].join('\\n')\n const fits = (n: number) => estimateTokens(render(n)) <= budget\n let text: string\n let shown = 0\n if (!fits(0)) {\n text = render(0, `โš ๏ธ The handoff alone is ~${estimateTokens(handoff)} tokens, over the ${budget}-token session budget: trim memory/MEMORY.md.`)\n } else {\n // ponytail: re-renders per line (O(nยฒ) chars); fine for hundreds of entries\n while (shown < index.length && fits(shown + 1)) shown++\n text = render(shown)\n }\n return { text, shown, omitted: index.length - shown, tokens: estimateTokens(text) }\n}\n\nexport const RELATED_MIN_SCORE = 3\nconst GOAL_CHARS = 500\n\n/** Recall query for a task: its title, the first 500 chars of its Goal, and the Phase epic title (id dropped). */\nexport function taskQuery(task: { title: string; phase?: string; raw?: string }): string {\n const goal = /^## Goal[ \\t]*\\n([\\s\\S]*?)(?=^## |(?![\\s\\S]))/m.exec(task.raw ?? '')?.[1].trim() ?? ''\n const epic = (task.phase ?? '').replace(/^R\\d+\\s*[โ€”โ€“-]\\s*/, '')\n return [task.title, goal.slice(0, GOAL_CHARS), epic].filter(Boolean).join(' ')\n}\n\n/** Only strong matches (at least one summary hit) โ†’ \"## Related memory\" block; '' when none qualify. */\nexport function formatRelated(hits: RecallHit[], limit = 3): string {\n const strong = hits.filter(h => h.score >= RELATED_MIN_SCORE).slice(0, limit)\n if (!strong.length) return ''\n return `## Related memory\\n${strong.map(formatCompactLine).join('\\n')}\\nFetch with vibedoc_get_entries`\n}\n\n/**\n * The Memory tab list (R047). No searchable words โ†’ the entries of `type`, newest first (session-start order).\n * Otherwise ranked like vibedoc_recall, so the UI and agents agree on the first hit. Returns the full entries.\n */\nexport function filterEntries<T extends RecallEntry>(entries: T[], opts: { query?: string; type?: string | null }): T[] {\n const pool = opts.type ? entries.filter(e => e.type === opts.type) : entries\n const byId = new Map(pool.map(e => [e.id, e]))\n const query = opts.query ?? ''\n const hits = tokenize(query).length ? rankEntries(pool, query, { limit: pool.length }) : indexHits(pool)\n return hits.map(h => byId.get(h.id)).filter((e): e is T => !!e)\n}\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'git-commit-horizontal',\n size: 24,\n node: [\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n ['line', { x1: '3', x2: '9', y1: '12', y2: '12', key: '1dyftd' }],\n ['line', { x1: '15', x2: '21', y1: '12', y2: '12', key: 'oup4p8' }],\n ],\n aliases: ['git-commit'],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name GitCommitHorizontal\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIzIiAvPgogIDxsaW5lIHgxPSIzIiB4Mj0iOSIgeTE9IjEyIiB5Mj0iMTIiIC8+CiAgPGxpbmUgeDE9IjE1IiB4Mj0iMjEiIHkxPSIxMiIgeTI9IjEyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/git-commit-horizontal\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst GitCommitHorizontal = createLucideIcon(__iconData);\n\nexport default GitCommitHorizontal;\n","// Pure memory link graph (R053, no fs): links are inferred from text, never stored. Self-check: node src/lib/memory-graph.check.mts\n// Outgoing edges come from entry text; incoming edges from task, roadmap and doc files that mention an entry id.\n\nexport type NodeKind = 'entry' | 'task' | 'epic' | 'adr' | 'doc'\nexport type GraphNode = { id: string; kind: NodeKind; label: string; path: string }\nexport type GraphEdge = { from: string; to: string } // from mentions to\nexport type MemoryGraph = { nodes: GraphNode[]; edges: GraphEdge[] }\n/** A node plus the text scanned for its refs. */\nexport type GraphItem = GraphNode & { text: string }\n\n// Upper case only, whole tokens: \"XT0651\", \"e2e\" and \"T0651a\" don't match\nconst ID_RE = /(?<![A-Za-z0-9_-])(E\\d+|T\\d{3,}|R\\d{3,}|ADR-\\d+)(?![A-Za-z0-9_])/g\nconst BACKTICK_MD_RE = /`([^`\\s]+\\.md)`/g\nconst LINK_MD_RE = /\\]\\(\\s*<?([^)\\s>#]+\\.md)(?:#[^)\\s]*)?>?\\s*\\)/g\n\nconst pad3 = (n: string) => String(Number(n)).padStart(3, '0')\n\n/** \"E1\" โ†’ \"E001\", \"ADR-4\" โ†’ \"ADR-004\"; task and roadmap ids are already padded. */\nfunction normalizeId(id: string): string {\n if (id.startsWith('ADR-')) return `ADR-${pad3(id.slice(4))}`\n if (id.startsWith('E')) return `E${pad3(id.slice(1))}`\n return id\n}\n\nconst normalizePath = (p: string) => p.replace(/\\\\/g, '/').replace(/^\\.?\\//, '')\n\n/** Item ids (E/T/R/ADR) and `*.md` paths (in backticks or as link targets) mentioned in `text`, deduplicated. */\nexport function extractRefs(text: string): { ids: string[]; paths: string[] } {\n const ids = new Set<string>()\n for (const m of text.matchAll(ID_RE)) {\n if (/^E0+$/.test(m[1])) continue // E0 is not an entry id\n ids.add(normalizeId(m[1]))\n }\n const paths = new Set<string>()\n for (const re of [BACKTICK_MD_RE, LINK_MD_RE]) {\n for (const m of text.matchAll(re)) {\n if (/^[a-z]+:\\/\\//i.test(m[1])) continue // external URL\n paths.add(normalizePath(m[1]))\n }\n }\n return { ids: [...ids], paths: [...paths] }\n}\n\n/** Classify a non-entry markdown file by path. Label = its H1 without the \"ID: \" prefix, else the file name. */\nexport function fileNode(relPath: string, raw: string): GraphNode {\n const p = normalizePath(relPath)\n const name = p.split('/').pop() ?? p\n const h1 = /^#\\s+(.+?)\\s*$/m.exec(raw)?.[1] ?? ''\n const label = (id: string) => h1.replace(new RegExp(`^${id}\\\\s*[:โ€”โ€“-]\\\\s*`), '') || name.replace(/\\.md$/, '')\n let m: RegExpExecArray | null\n if ((m = /^plans\\/tasks\\/(T\\d{3,})[^/]*\\.md$/.exec(p))) return { id: m[1], kind: 'task', label: label(m[1]), path: p }\n if ((m = /^plans\\/roadmap\\/(R\\d{3,})[^/]*\\.md$/.exec(p))) return { id: m[1], kind: 'epic', label: label(m[1]), path: p }\n if ((m = /(?:^|\\/)(ADR-\\d+)[^/]*\\.md$/.exec(p))) {\n const id = normalizeId(m[1])\n return { id, kind: 'adr', label: label(m[1]), path: p }\n }\n return { id: p, kind: 'doc', label: h1 || name.replace(/\\.md$/, ''), path: p }\n}\n\n/**\n * Resolve refs into a graph. Unresolved refs, self-links and duplicate edges are dropped.\n * Nodes = every entry + every other item that touches an entry.\n */\nexport function buildGraph(entries: GraphItem[], others: GraphItem[]): MemoryGraph {\n const all = [...entries, ...others]\n const byId = new Map(all.map(n => [n.id, n]))\n const byPath = new Map(all.map(n => [n.path, n]))\n const entryIds = new Set(entries.map(e => e.id))\n const edges = new Map<string, GraphEdge>()\n const add = (from: string, to: string) => { if (from !== to) edges.set(`${from}\\u0000${to}`, { from, to }) }\n\n for (const e of entries) {\n const { ids, paths } = extractRefs(e.text)\n for (const id of ids) if (byId.has(id)) add(e.id, id)\n for (const p of paths) { const n = byPath.get(p); if (n) add(e.id, n.id) }\n }\n // incoming: other files that mention an entry id (not the whole doc-to-doc graph)\n for (const o of others) {\n for (const id of extractRefs(o.text).ids) if (entryIds.has(id)) add(o.id, id)\n }\n\n const touched = new Set(entryIds)\n for (const e of edges.values()) { touched.add(e.from); touched.add(e.to) }\n const nodes = all.filter(n => touched.has(n.id)).map(({ text: _, ...n }) => n)\n return { nodes, edges: [...edges.values()] }\n}\n\n/** One entry, its direct neighbours and the edges between it and them. Unknown id โ†’ empty graph. */\nexport function neighbourhood(graph: MemoryGraph, id: string): MemoryGraph {\n if (!graph.nodes.some(n => n.id === id)) return { nodes: [], edges: [] }\n const edges = graph.edges.filter(e => e.from === id || e.to === id)\n const keep = new Set([id, ...edges.flatMap(e => [e.from, e.to])])\n return { nodes: graph.nodes.filter(n => keep.has(n.id)), edges }\n}\n\n/**\n * \"Links: โ€ฆ\" / \"Linked from: โ€ฆ\" lines for one entry (vibedoc_get_entries). A line with nothing is left out;\n * each is capped at `cap` items plus \"+N more\", so a hub entry stays short.\n */\nexport function formatEntryLinks(graph: MemoryGraph, id: string, cap = 10): string[] {\n const line = (label: string, ids: string[]) => {\n if (!ids.length) return []\n const more = ids.length > cap ? `, +${ids.length - cap} more` : ''\n return [`${label}: ${ids.slice(0, cap).join(', ')}${more}`]\n }\n return [\n ...line('Links', graph.edges.filter(e => e.from === id).map(e => e.to)),\n ...line('Linked from', graph.edges.filter(e => e.to === id).map(e => e.from)),\n ]\n}\n\nexport const GRAPH_COL_W = 240\nexport const GRAPH_ROW_H = 48\n/** Column per kind: epics and tasks left of the entries, ADRs and docs right of them. */\nconst GRAPH_COL: Record<NodeKind, number> = { epic: -2, task: -1, entry: 0, adr: 1, doc: 2 }\n\n/**\n * Deterministic positions for the graph view (no layout library, no saved positions): entries stacked in the\n * centre column (sorted by type, then id), every other node in its kind's column at the average y of the\n * entries it links with, pushed down to keep one row of space. Same graph โ†’ same positions on every load.\n */\nexport function graphLayout(graph: MemoryGraph, entryType: Record<string, string> = {}): Record<string, { x: number; y: number }> {\n const pos: Record<string, { x: number; y: number }> = {}\n const num = (id: string) => Number(id.replace(/\\D/g, '')) || 0\n const entries = graph.nodes.filter(n => n.kind === 'entry')\n .sort((a, b) => (entryType[a.id] ?? '').localeCompare(entryType[b.id] ?? '') || num(a.id) - num(b.id))\n entries.forEach((e, i) => { pos[e.id] = { x: 0, y: i * GRAPH_ROW_H } })\n\n const neighbourYs = new Map<string, number[]>()\n for (const { from, to } of graph.edges) {\n for (const [other, entry] of [[from, to], [to, from]]) {\n if (pos[entry] && !pos[other]) neighbourYs.set(other, [...(neighbourYs.get(other) ?? []), pos[entry].y])\n }\n }\n for (const kind of ['epic', 'task', 'adr', 'doc'] as const) {\n const col = graph.nodes.filter(n => n.kind === kind).map(n => {\n const ys = neighbourYs.get(n.id) ?? [0]\n return { id: n.id, want: ys.reduce((a, b) => a + b, 0) / ys.length }\n }).sort((a, b) => a.want - b.want || a.id.localeCompare(b.id, 'en', { numeric: true }))\n let next = -Infinity\n for (const { id, want } of col) {\n const y = Math.max(want, next)\n pos[id] = { x: GRAPH_COL[kind] * GRAPH_COL_W, y }\n next = y + GRAPH_ROW_H\n }\n }\n return pos\n}\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'lightbulb',\n size: 24,\n node: [\n [\n 'path',\n {\n d: 'M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5',\n key: '1gvzjb',\n },\n ],\n ['path', { d: 'M9 18h6', key: 'x1upvd' }],\n ['path', { d: 'M10 22h4', key: 'ceow96' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Lightbulb\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgMTRjLjItMSAuNy0xLjcgMS41LTIuNSAxLS45IDEuNS0yLjIgMS41LTMuNUE2IDYgMCAwIDAgNiA4YzAgMSAuMiAyLjIgMS41IDMuNS43LjcgMS4zIDEuNSAxLjUgMi41IiAvPgogIDxwYXRoIGQ9Ik05IDE4aDYiIC8+CiAgPHBhdGggZD0iTTEwIDIyaDQiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/lightbulb\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Lightbulb = createLucideIcon(__iconData);\n\nexport default Lightbulb;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'flag',\n size: 24,\n node: [\n [\n 'path',\n {\n d: 'M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528',\n key: '1jaruq',\n },\n ],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Flag\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNCAyMlY0YTEgMSAwIDAgMSAuNC0uOEE2IDYgMCAwIDEgOCAyYzMgMCA1IDIgNy4zMzMgMnEyIDAgMy4wNjctLjhBMSAxIDAgMCAxIDIwIDR2MTBhMSAxIDAgMCAxLS40LjhBNiA2IDAgMCAxIDE2IDE2Yy0zIDAtNS0yLTgtMmE2IDYgMCAwIDAtNCAxLjUyOCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/flag\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Flag = createLucideIcon(__iconData);\n\nexport default Flag;\n"],"names":["ENTRY_TYPES","s","SUMMARY_MAX","n","isEntryType","includes","normalizeEntryId","Number","m","exec","trim","nextEntryId","String","padStart","replace","id","ids","max","Math","map","slice","h1","entrySlug","summary","toLowerCase","file","meta","parseEntry","raw","lines","split","i","length","type","e","formatEntry","by","body","join","head","updatedAt","updated","undefined","validateEntryInput","test"],"mappings":"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","ignoreList":[9,11,12]}
@@ -18,6 +18,6 @@ module.exports=[381249,a=>{"use strict";var b=a.i(662145),c=a.i(174897),d=a.i(54
18
18
  "url": "{{ENDPOINT}}"
19
19
  }
20
20
  }
21
- }`,path:".windsurf/mcp.json"}};function O({settings:a,onSave:d}){let[e,f]=(0,c.useState)(!1),[g,h]=(0,c.useState)(null),[i,j]=(0,c.useState)(null),k=(0,z.resolveMcpEndpoint)(a.mcp.endpoint,(0,M.useOrigin)()),m=async()=>{f(!0),h(null);try{(await fetch(k,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"tools/list"})})).ok?h("success"):h("error")}catch{h("error")}f(!1)},n=async a=>{let b=N[a].config.replace("{{ENDPOINT}}",k);await navigator.clipboard.writeText(b),j(a),setTimeout(()=>j(null),2e3)};return(0,b.jsxs)("div",{className:"space-y-8",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-xl font-semibold text-txt mb-1",children:"MCP Connection"}),(0,b.jsx)("p",{className:"text-sm text-muted",children:"Configure the Model Context Protocol server for AI agents."})]}),(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsx)("label",{className:"block text-sm font-medium text-txt",children:"MCP Endpoint"}),(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsx)(L.Input,{value:k,onChange:b=>{var c;return c=b.target.value,void d({...a,mcp:{...a.mcp,endpoint:c}})},className:"bg-surface2 font-mono text-sm"}),(0,b.jsxs)("button",{onClick:m,disabled:e,className:"px-4 py-2 bg-accent text-accent-fg rounded-lg text-sm font-medium hover:bg-accent/90 transition-colors disabled:opacity-50 flex items-center gap-2",children:[e?(0,b.jsx)(K.Loader2,{className:"w-4 h-4 animate-spin"}):(0,b.jsx)(l.Plug,{className:"w-4 h-4"}),"Test"]})]}),g&&(0,b.jsx)("div",{className:(0,r.cn)("flex items-center gap-2 text-sm","success"===g?"text-green-400":"text-red-400"),children:"success"===g?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(y.Check,{className:"w-4 h-4"}),"Connection successful"]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(I.X,{className:"w-4 h-4"}),"Connection failed"]})})]}),(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsx)("label",{className:"block text-sm font-medium text-txt",children:"Agent Configuration"}),(0,b.jsx)("p",{className:"text-xs text-muted",children:"Copy the configuration for your coding agent:"}),(0,b.jsx)("div",{className:"space-y-2",children:Object.entries(N).map(([a,c])=>(0,b.jsxs)("div",{className:"flex items-center justify-between p-3 border border-border rounded-lg",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"text-sm font-medium text-txt",children:c.name}),(0,b.jsx)("div",{className:"text-xs text-muted font-mono",children:c.path})]}),(0,b.jsx)("button",{onClick:()=>n(a),className:(0,r.cn)("flex items-center gap-2 px-3 py-1.5 rounded-lg text-sm transition-colors",i===a?"bg-green-500/20 text-green-400":"bg-surface2 text-muted hover:text-txt"),children:i===a?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(y.Check,{className:"w-3.5 h-3.5"}),"Copied"]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(J.Copy,{className:"w-3.5 h-3.5"}),"Copy"]})})]},a))})]})]})}var P=a.i(200382),Q=a.i(661661),R=a.i(28386);let S=["vibedoc_read_doc","vibedoc_write_doc","vibedoc_search_docs","vibedoc_list_docs","vibedoc_get_status","vibedoc_list_tasks","vibedoc_update_task","vibedoc_read_memory","vibedoc_update_memory"],T=["๐Ÿ”ง","๐Ÿ“","๐Ÿงช","๐Ÿ”","๐Ÿ“Š","๐Ÿ”’","โšก","๐ŸŽฏ","๐Ÿ’ก","๐Ÿš€"];function U({skills:a,onSave:d}){let[e,f]=(0,c.useState)(null),[g,h]=(0,c.useState)(null),[i,j]=(0,c.useState)(!1),k=()=>{f(null),h(null),j(!1)},l=()=>{g&&g.name.trim()&&(i?d([...a,g]):d(a.map(a=>a.id===g.id?g:a)),k())},n=a=>{if(!g)return;let b=g.tools.includes(a)?g.tools.filter(b=>b!==a):[...g.tools,a];h({...g,tools:b})};return(0,b.jsxs)("div",{className:"space-y-6",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-xl font-semibold text-txt mb-1",children:"Skills"}),(0,b.jsx)("p",{className:"text-sm text-muted",children:"Reusable capabilities for AI agents."})]}),(0,b.jsxs)("button",{onClick:()=>{let a={id:`skill-${Date.now()}`,name:"",description:"",trigger:"/",prompt:"",tools:[],icon:"โšก"};f(a.id),h(a),j(!0)},className:"flex items-center gap-2 px-3 py-2 bg-accent text-accent-fg rounded-lg text-sm font-medium hover:bg-accent/90 transition-colors",children:[(0,b.jsx)(P.Plus,{className:"w-4 h-4"}),"Add Skill"]})]}),(0,b.jsxs)("div",{className:"space-y-3",children:[a.map(c=>(0,b.jsx)("div",{children:e===c.id&&g?(0,b.jsxs)("div",{className:"border border-accent rounded-lg p-4 space-y-4 bg-accent/5",children:[(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[(0,b.jsx)("select",{value:g.icon||"โšก",onChange:a=>h({...g,icon:a.target.value}),className:"w-12 h-10 text-center text-xl bg-surface2 border border-border rounded-lg",children:T.map(a=>(0,b.jsx)("option",{value:a,children:a},a))}),(0,b.jsx)(L.Input,{value:g.name,onChange:a=>h({...g,name:a.target.value}),placeholder:"Skill name",className:"bg-surface2"})]}),(0,b.jsx)(L.Input,{value:g.description,onChange:a=>h({...g,description:a.target.value}),placeholder:"Description",className:"bg-surface2"}),(0,b.jsx)("div",{className:"flex gap-3",children:(0,b.jsxs)("div",{className:"flex-1",children:[(0,b.jsx)("label",{className:"text-xs text-muted mb-1 block",children:"Trigger"}),(0,b.jsx)(L.Input,{value:g.trigger,onChange:a=>h({...g,trigger:a.target.value}),placeholder:"/command",className:"bg-surface2 font-mono"})]})}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"text-xs text-muted mb-1 block",children:"System Prompt"}),(0,b.jsx)("textarea",{value:g.prompt,onChange:a=>h({...g,prompt:a.target.value}),placeholder:"Instructions for the AI when this skill is activated...",rows:4,className:"w-full px-3 py-2 bg-surface2 border border-border rounded-lg text-sm resize-none"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"text-xs text-muted mb-2 block",children:"Available Tools"}),(0,b.jsx)("div",{className:"flex flex-wrap gap-2",children:S.map(a=>(0,b.jsx)("button",{onClick:()=>n(a),className:(0,r.cn)("px-2 py-1 rounded-sm text-xs font-mono transition-colors",g.tools.includes(a)?"bg-accent/20 text-accent":"bg-surface2 text-muted hover:text-txt"),children:a.replace("vibedoc_","")},a))})]}),(0,b.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,b.jsx)("button",{onClick:k,className:"px-3 py-1.5 text-sm text-muted hover:text-txt transition-colors",children:"Cancel"}),(0,b.jsxs)("button",{onClick:l,disabled:!g.name.trim(),className:"flex items-center gap-2 px-3 py-1.5 bg-accent text-accent-fg rounded-lg text-sm font-medium hover:bg-accent/90 transition-colors disabled:opacity-50",children:[(0,b.jsx)(y.Check,{className:"w-4 h-4"}),"Save"]})]})]}):(0,b.jsxs)("div",{className:"flex items-start gap-3 p-4 border border-border rounded-lg hover:border-accent/30 transition-colors group",children:[(0,b.jsx)("div",{className:"w-10 h-10 rounded-lg bg-surface2 flex items-center justify-center text-xl shrink-0",children:c.icon||"โšก"}),(0,b.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("span",{className:"font-medium text-txt",children:c.name}),(0,b.jsx)("code",{className:"text-xs bg-surface2 px-1.5 py-0.5 rounded-sm text-accent",children:c.trigger})]}),(0,b.jsx)("p",{className:"text-sm text-muted mt-0.5",children:c.description}),c.tools.length>0&&(0,b.jsx)("div",{className:"flex flex-wrap gap-1 mt-2",children:c.tools.map(a=>(0,b.jsx)("span",{className:"text-xs bg-surface2 px-1.5 py-0.5 rounded-sm text-muted",children:a.replace("vibedoc_","")},a))})]}),(0,b.jsxs)("div",{className:"flex gap-1 opacity-0 group-hover:opacity-100 transition-opacity",children:[(0,b.jsx)("button",{onClick:()=>{f(c.id),h({...c}),j(!1)},className:"p-1.5 rounded-sm hover:bg-surface2 text-muted hover:text-txt transition-colors",children:(0,b.jsx)(Q.Pencil,{className:"w-4 h-4"})}),(0,b.jsx)("button",{onClick:()=>{var b;return b=c.id,void(confirm("Delete this skill?")&&d(a.filter(a=>a.id!==b)))},className:"p-1.5 rounded-sm hover:bg-red-500/10 text-muted hover:text-red-400 transition-colors",children:(0,b.jsx)(R.Trash2,{className:"w-4 h-4"})})]})]})},c.id)),i&&g&&(0,b.jsxs)("div",{className:"border border-accent rounded-lg p-4 space-y-4 bg-accent/5",children:[(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[(0,b.jsx)("select",{value:g.icon||"โšก",onChange:a=>h({...g,icon:a.target.value}),className:"w-12 h-10 text-center text-xl bg-surface2 border border-border rounded-lg",children:T.map(a=>(0,b.jsx)("option",{value:a,children:a},a))}),(0,b.jsx)(L.Input,{value:g.name,onChange:a=>h({...g,name:a.target.value}),placeholder:"Skill name",className:"bg-surface2"})]}),(0,b.jsx)(L.Input,{value:g.description,onChange:a=>h({...g,description:a.target.value}),placeholder:"Description",className:"bg-surface2"}),(0,b.jsx)("div",{className:"flex gap-3",children:(0,b.jsxs)("div",{className:"flex-1",children:[(0,b.jsx)("label",{className:"text-xs text-muted mb-1 block",children:"Trigger"}),(0,b.jsx)(L.Input,{value:g.trigger,onChange:a=>h({...g,trigger:a.target.value}),placeholder:"/command",className:"bg-surface2 font-mono"})]})}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"text-xs text-muted mb-1 block",children:"System Prompt"}),(0,b.jsx)("textarea",{value:g.prompt,onChange:a=>h({...g,prompt:a.target.value}),placeholder:"Instructions for the AI when this skill is activated...",rows:4,className:"w-full px-3 py-2 bg-surface2 border border-border rounded-lg text-sm resize-none"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"text-xs text-muted mb-2 block",children:"Available Tools"}),(0,b.jsx)("div",{className:"flex flex-wrap gap-2",children:S.map(a=>(0,b.jsx)("button",{onClick:()=>n(a),className:(0,r.cn)("px-2 py-1 rounded-sm text-xs font-mono transition-colors",g.tools.includes(a)?"bg-accent/20 text-accent":"bg-surface2 text-muted hover:text-txt"),children:a.replace("vibedoc_","")},a))})]}),(0,b.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,b.jsx)("button",{onClick:k,className:"px-3 py-1.5 text-sm text-muted hover:text-txt transition-colors",children:"Cancel"}),(0,b.jsxs)("button",{onClick:l,disabled:!g.name.trim(),className:"flex items-center gap-2 px-3 py-1.5 bg-accent text-accent-fg rounded-lg text-sm font-medium hover:bg-accent/90 transition-colors disabled:opacity-50",children:[(0,b.jsx)(y.Check,{className:"w-4 h-4"}),"Save"]})]})]}),0===a.length&&!i&&(0,b.jsxs)("div",{className:"text-center py-8 text-muted",children:[(0,b.jsx)(m.Zap,{className:"w-10 h-10 mx-auto mb-3 opacity-30"}),(0,b.jsx)("p",{className:"text-sm",children:"No skills configured"}),(0,b.jsx)("p",{className:"text-xs mt-1",children:"Add a skill to give your agents capabilities"})]})]})]})}let V=["๐Ÿค–","๐Ÿ“š","๐Ÿ”’","๐Ÿงช","๐Ÿ“","๐Ÿ”ง","๐Ÿ’ก","๐ŸŽฏ","๐Ÿš€","โšก"];function W({agents:a,skills:d,onSave:e}){let[f,g]=(0,c.useState)(null),[h,i]=(0,c.useState)(null),[j,k]=(0,c.useState)(!1),l=()=>{g(null),i(null),k(!1)},m=()=>{h&&h.name.trim()&&(j?e([...a,h]):e(a.map(a=>a.id===h.id?h:a)),l())},o=a=>(0,b.jsxs)("div",{className:"border border-accent rounded-lg p-4 space-y-4 bg-accent/5",children:[(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[(0,b.jsx)("select",{value:a.icon,onChange:b=>i({...a,icon:b.target.value}),className:"w-12 h-10 text-center text-xl bg-surface2 border border-border rounded-lg",children:V.map(a=>(0,b.jsx)("option",{value:a,children:a},a))}),(0,b.jsx)(L.Input,{value:a.name,onChange:b=>i({...a,name:b.target.value}),placeholder:"Agent name",className:"bg-surface2"})]}),(0,b.jsx)(L.Input,{value:a.description,onChange:b=>i({...a,description:b.target.value}),placeholder:"Description",className:"bg-surface2"}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"text-xs text-muted mb-2 block",children:"Assigned Skills"}),(0,b.jsxs)("div",{className:"flex flex-wrap gap-2",children:[d.map(c=>(0,b.jsxs)("button",{onClick:()=>(a=>{if(!h)return;let b=h.skills.includes(a)?h.skills.filter(b=>b!==a):[...h.skills,a];i({...h,skills:b})})(c.id),className:(0,r.cn)("flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg text-sm transition-colors",a.skills.includes(c.id)?"bg-accent/20 text-accent":"bg-surface2 text-muted hover:text-txt"),children:[(0,b.jsx)("span",{children:c.icon||"โšก"}),c.name]},c.id)),0===d.length&&(0,b.jsx)("span",{className:"text-xs text-muted",children:"No skills available. Create skills first."})]})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"text-xs text-muted mb-1 block",children:"Custom System Prompt"}),(0,b.jsx)("textarea",{value:a.prompt,onChange:b=>i({...a,prompt:b.target.value}),placeholder:"Additional instructions for this agent...",rows:3,className:"w-full px-3 py-2 bg-surface2 border border-border rounded-lg text-sm resize-none"})]}),(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("button",{onClick:()=>i({...a,active:!a.active}),className:(0,r.cn)("w-11 h-6 rounded-full transition-colors relative",a.active?"bg-accent":"bg-border"),children:(0,b.jsx)("span",{className:(0,r.cn)("absolute top-1 w-4 h-4 rounded-full bg-white transition-transform",a.active?"left-6":"left-1")})}),(0,b.jsx)("span",{className:"text-sm text-muted",children:a.active?"Active":"Inactive"})]}),(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsx)("button",{onClick:l,className:"px-3 py-1.5 text-sm text-muted hover:text-txt transition-colors",children:"Cancel"}),(0,b.jsxs)("button",{onClick:m,disabled:!a.name.trim(),className:"flex items-center gap-2 px-3 py-1.5 bg-accent text-accent-fg rounded-lg text-sm font-medium hover:bg-accent/90 transition-colors disabled:opacity-50",children:[(0,b.jsx)(y.Check,{className:"w-4 h-4"}),"Save"]})]})]})]});return(0,b.jsxs)("div",{className:"space-y-6",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-xl font-semibold text-txt mb-1",children:"Agents"}),(0,b.jsx)("p",{className:"text-sm text-muted",children:"AI agent profiles with assigned skills."})]}),(0,b.jsxs)("button",{onClick:()=>{let a={id:`agent-${Date.now()}`,name:"",icon:"๐Ÿค–",description:"",skills:[],prompt:"",active:!0};g(a.id),i(a),k(!0)},className:"flex items-center gap-2 px-3 py-2 bg-accent text-accent-fg rounded-lg text-sm font-medium hover:bg-accent/90 transition-colors",children:[(0,b.jsx)(P.Plus,{className:"w-4 h-4"}),"Add Agent"]})]}),(0,b.jsxs)("div",{className:"space-y-3",children:[a.map(c=>(0,b.jsx)("div",{children:f===c.id&&h?o(h):(0,b.jsxs)("div",{className:(0,r.cn)("flex items-start gap-3 p-4 border rounded-lg transition-colors group",c.active?"border-border hover:border-accent/30":"border-border/50 opacity-60"),children:[(0,b.jsx)("div",{className:"w-10 h-10 rounded-lg bg-surface2 flex items-center justify-center text-xl shrink-0",children:c.icon}),(0,b.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("span",{className:"font-medium text-txt",children:c.name}),!c.active&&(0,b.jsx)("span",{className:"text-xs bg-surface2 px-1.5 py-0.5 rounded-sm text-muted",children:"Inactive"})]}),(0,b.jsx)("p",{className:"text-sm text-muted mt-0.5",children:c.description}),c.skills.length>0&&(0,b.jsx)("div",{className:"flex flex-wrap gap-1 mt-2",children:c.skills.map(a=>{let c=d.find(b=>b.id===a);return c?(0,b.jsxs)("span",{className:"flex items-center gap-1 text-xs bg-surface2 px-1.5 py-0.5 rounded-sm text-muted",children:[c.icon," ",c.name]},a):null})})]}),(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("button",{onClick:()=>{var b;return b=c.id,void e(a.map(a=>a.id===b?{...a,active:!a.active}:a))},className:(0,r.cn)("w-9 h-5 rounded-full transition-colors relative",c.active?"bg-accent":"bg-border"),children:(0,b.jsx)("span",{className:(0,r.cn)("absolute top-0.5 w-4 h-4 rounded-full bg-white transition-transform",c.active?"left-4":"left-0.5")})}),(0,b.jsxs)("div",{className:"flex gap-1 opacity-0 group-hover:opacity-100 transition-opacity",children:[(0,b.jsx)("button",{onClick:()=>{g(c.id),i({...c}),k(!1)},className:"p-1.5 rounded-sm hover:bg-surface2 text-muted hover:text-txt transition-colors",children:(0,b.jsx)(Q.Pencil,{className:"w-4 h-4"})}),(0,b.jsx)("button",{onClick:()=>{var b;return b=c.id,void(confirm("Delete this agent?")&&e(a.filter(a=>a.id!==b)))},className:"p-1.5 rounded-sm hover:bg-red-500/10 text-muted hover:text-red-400 transition-colors",children:(0,b.jsx)(R.Trash2,{className:"w-4 h-4"})})]})]})]})},c.id)),j&&h&&o(h),0===a.length&&!j&&(0,b.jsxs)("div",{className:"text-center py-8 text-muted",children:[(0,b.jsx)(n.Bot,{className:"w-10 h-10 mx-auto mb-3 opacity-30"}),(0,b.jsx)("p",{className:"text-sm",children:"No agents configured"}),(0,b.jsx)("p",{className:"text-xs mt-1",children:"Add an agent to define AI personas with skills"})]})]})]})}var X=a.i(725543),Y=a.i(498053),Z=a.i(269769),$=a.i(173628),_=a.i(147758);let aa="rounded-md border border-border bg-bg px-2 py-1.5 text-sm text-txt focus:outline-hidden focus:ring-1 focus:ring-accent disabled:opacity-50",ab={todo:"waiting to start","in-progress":"being worked on",review:"waits for a human",blocked:"stuck",paused:"stopped on purpose",done:"finished",cancelled:"dropped"};function ac({settings:a,onSave:e}){let{board:f,rootParam:g,refresh:h}=(0,d.useApp)(),i=(0,_.statusDefs)(a.statuses),[j,k]=(0,c.useState)(""),[l,m]=(0,c.useState)("review"),[n,o]=(0,c.useState)("blue"),[p,q]=(0,c.useState)(null),[s,t]=(0,c.useState)("todo"),u=b=>e({...a,statuses:b}),v=(a,b)=>u(i.map(c=>c.id===a?{...c,...b}:c)),w=(a,b)=>{let c=[...i],[d]=c.splice(a,1);c.splice(a+b,0,d),u(c)},x=a=>Object.values(f??{}).flat().filter(b=>b.customStatus===a),y=j.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40),z=j.trim()?y?i.some(a=>a.id===y)?"Already exists":(0,_.invalidStatusId)(y):"Use letters or digits":null;async function A(a){let b=x(a).map(a=>a.id);if(b.length){let a=await fetch(`/api/tasks/bulk${g}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({ids:b,action:{status:s}})});if(!a.ok)return(0,Z.toast)((await a.json().catch(()=>null))?.error??"Could not move the tasks")}await u(i.filter(b=>b.id!==a)),q(null),h()}return(0,b.jsxs)("div",{className:"space-y-8",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"mb-1 text-xl font-semibold text-txt",children:"Statuses"}),(0,b.jsx)("p",{className:"text-sm text-muted",children:"Board columns, in order. A custom status works like the built-in category it maps to: agents, the work queue and progress read the category. Task files store the status id, so renaming never touches them."})]}),(0,b.jsx)("ul",{className:"flex flex-col gap-2",children:i.map((a,c)=>{let d=_.BUILTIN_STATUSES.includes(a.id),e=$.STATUS_META[a.category].icon,f=d?0:x(a.id).length;return(0,b.jsxs)("li",{className:"rounded-lg border border-border bg-surface p-2.5",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(e,{className:(0,r.cn)("size-4 shrink-0",$.STATUS_COLOR_CLASS[a.color].text),"aria-hidden":!0}),(0,b.jsx)(L.Input,{"aria-label":`Label for ${a.id}`,defaultValue:a.label,onBlur:b=>{let c=b.target.value.trim();c&&c!==a.label&&v(a.id,{label:c})},onKeyDown:a=>{"Enter"===a.key&&a.currentTarget.blur()},className:"h-8 w-40 border-border bg-bg text-txt"},`${a.id}:${a.label}`),(0,b.jsx)("span",{className:"font-mono text-[11px] text-muted",children:a.id}),(0,b.jsx)("select",{"aria-label":`Color for ${a.id}`,value:a.color,onChange:b=>v(a.id,{color:b.target.value}),className:aa,children:_.STATUS_COLORS.map(a=>(0,b.jsx)("option",{value:a,children:a},a))}),(0,b.jsx)("select",{"aria-label":`Category for ${a.id}`,value:a.category,disabled:d,title:d?"Built-in statuses keep their category":ab[a.category],onChange:b=>v(a.id,{category:b.target.value}),className:aa,children:_.BUILTIN_STATUSES.map(a=>(0,b.jsxs)("option",{value:a,children:["works like ",a]},a))}),(0,b.jsx)("span",{className:"flex-1"}),(0,b.jsx)("button",{type:"button","aria-label":`Move ${a.id} up`,disabled:0===c,onClick:()=>w(c,-1),className:"grid size-7 place-items-center rounded-md text-muted hover:bg-surface2 hover:text-txt disabled:opacity-30",children:(0,b.jsx)(Y.ArrowUp,{className:"size-3.5"})}),(0,b.jsx)("button",{type:"button","aria-label":`Move ${a.id} down`,disabled:c===i.length-1,onClick:()=>w(c,1),className:"grid size-7 place-items-center rounded-md text-muted hover:bg-surface2 hover:text-txt disabled:opacity-30",children:(0,b.jsx)(X.ArrowDown,{className:"size-3.5"})}),!d&&(0,b.jsx)("button",{type:"button","aria-label":`Delete ${a.id}`,onClick:()=>{q(a.id),t(a.category)},className:"grid size-7 place-items-center rounded-md text-muted hover:bg-surface2 hover:text-danger",children:(0,b.jsx)(R.Trash2,{className:"size-3.5"})})]}),p===a.id&&(0,b.jsxs)("div",{className:"mt-2 flex flex-wrap items-center gap-2 border-t border-border pt-2 text-xs text-muted",children:[f>0?(0,b.jsxs)(b.Fragment,{children:["Move its ",f," task",1===f?"":"s"," to"]}):(0,b.jsx)(b.Fragment,{children:"No tasks use it."}),f>0&&(0,b.jsx)("select",{"aria-label":"Move its tasks to",value:s,onChange:a=>t(a.target.value),className:aa,children:i.filter(b=>b.id!==a.id).map(a=>(0,b.jsx)("option",{value:a.id,children:a.label},a.id))}),(0,b.jsxs)("button",{type:"button",onClick:()=>A(a.id),className:"rounded-md border border-danger/40 px-2 py-1 text-danger hover:bg-danger/10",children:["Delete ",a.label]}),(0,b.jsx)("button",{type:"button",onClick:()=>q(null),className:"px-1 hover:text-txt",children:"Cancel"})]})]},a.id)})}),(0,b.jsxs)("form",{onSubmit:a=>{a.preventDefault(),j.trim()&&!z&&(u([...i,{id:y,label:j.trim(),color:n,category:l}]),k(""))},className:"space-y-2 rounded-lg border border-dashed border-border2 p-3",children:[(0,b.jsx)("p",{className:"text-sm font-medium text-txt",children:"Add a status"}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,b.jsx)(L.Input,{"aria-label":"New status label",value:j,onChange:a=>k(a.target.value),placeholder:"QA",className:"h-8 w-40 border-border bg-bg text-txt"}),(0,b.jsx)("select",{"aria-label":"New status category",value:l,onChange:a=>m(a.target.value),className:aa,children:_.BUILTIN_STATUSES.map(a=>(0,b.jsxs)("option",{value:a,children:["works like ",a," (",ab[a],")"]},a))}),(0,b.jsx)("select",{"aria-label":"New status color",value:n,onChange:a=>o(a.target.value),className:aa,children:_.STATUS_COLORS.map(a=>(0,b.jsx)("option",{value:a,children:a},a))}),(0,b.jsxs)("button",{type:"submit",disabled:!j.trim()||!!z,className:"inline-flex h-8 items-center gap-1.5 rounded-md bg-accent px-3 text-xs font-medium text-accent-fg hover:bg-accent/90 disabled:opacity-40",children:[(0,b.jsx)(P.Plus,{className:"size-3.5"})," Add"]})]}),j.trim()&&(0,b.jsx)("p",{className:(0,r.cn)("font-mono text-[11px]",z?"text-danger":"text-muted"),children:z??`id: ${y}`})]})]})}var ad=a.i(443108),ae=a.i(210436);let af=[{id:"appearance",label:"Appearance",icon:g},{id:"editor",label:"Editor",icon:i},{id:"project",label:"Project",icon:k},{id:"statuses",label:"Statuses",icon:q},{id:"mcp",label:"MCP",icon:l.Plug},{id:"skills",label:"Skills",icon:m.Zap},{id:"agents",label:"Agents",icon:n.Bot}];a.s(["default",0,function(){let{rootParam:a,setEditorSettings:e,setAutoRefreshSeconds:f}=(0,d.useApp)(),[g,h]=(0,c.useState)("appearance"),[i,j]=(0,c.useState)(z.DEFAULT_SETTINGS),[k,l]=(0,c.useState)(z.DEFAULT_SKILLS),[m,n]=(0,c.useState)(z.DEFAULT_AGENTS),[p,q]=(0,c.useState)(!0),[s,t]=(0,c.useState)(!1),u=(0,c.useCallback)(async()=>{try{let b=await fetch(`/api/settings${a}&type=all`),c=await b.json();j({...z.DEFAULT_SETTINGS,...c.settings}),l(c.skills||z.DEFAULT_SKILLS),n(c.agents||z.DEFAULT_AGENTS)}catch{}q(!1)},[a]);(0,c.useEffect)(()=>{u()},[u]);let v=async b=>{t(!0),j(b);try{await fetch(`/api/settings${a}&type=settings`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(b)}),(0,ae.applyTheme)(b.theme),(0,ae.applyAccent)(b.accentColor),(0,ae.applyFontSize)(b.fontSize),(0,ae.applyFonts)(b),e(b.editor),f(b.project?.autoRefresh??0),(0,ad.setStatusDefs)((0,_.statusDefs)(b.statuses))}catch{}t(!1)},w=async b=>{t(!0),l(b);try{await fetch(`/api/settings${a}&type=skills`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(b)})}catch{}t(!1)},x=async b=>{t(!0),n(b);try{await fetch(`/api/settings${a}&type=agents`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(b)})}catch{}t(!1)};return p?(0,b.jsx)("div",{className:"flex items-center justify-center h-full",children:(0,b.jsx)("div",{className:"text-muted",children:"Loading settings..."})}):(0,b.jsxs)("div",{className:"flex h-full",children:[(0,b.jsxs)("aside",{className:"w-56 border-r border-border bg-sidebar shrink-0",children:[(0,b.jsx)("div",{className:"p-4 border-b border-border",children:(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(o.Settings,{className:"w-5 h-5 text-accent"}),(0,b.jsx)("h1",{className:"font-semibold text-txt",children:"Settings"})]})}),(0,b.jsx)("nav",{className:"p-2",children:af.map(a=>{let c=a.icon;return(0,b.jsxs)("button",{onClick:()=>h(a.id),className:(0,r.cn)("w-full flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors",g===a.id?"bg-accent/10 text-accent font-medium":"text-muted hover:text-txt hover:bg-surface2"),children:[(0,b.jsx)(c,{className:"w-4 h-4"}),a.label]},a.id)})})]}),(0,b.jsx)("div",{className:"flex-1 overflow-y-auto",children:(0,b.jsxs)("div",{className:"max-w-2xl mx-auto p-6",children:[s&&(0,b.jsx)("div",{className:"fixed top-4 right-4 bg-accent text-accent-fg px-3 py-1.5 rounded-lg text-sm shadow-lg",children:"Saving..."}),"appearance"===g&&(0,b.jsx)(C,{settings:i,onSave:v}),"editor"===g&&(0,b.jsx)(F,{settings:i,onSave:v}),"project"===g&&(0,b.jsx)(H,{settings:i,onSave:v}),"statuses"===g&&(0,b.jsx)(ac,{settings:i,onSave:v}),"mcp"===g&&(0,b.jsx)(O,{settings:i,onSave:v}),"skills"===g&&(0,b.jsx)(U,{skills:k,onSave:w}),"agents"===g&&(0,b.jsx)(W,{agents:m,skills:k,onSave:x})]})})]})}],381249)}];
21
+ }`,path:".windsurf/mcp.json"}};function O({settings:a,onSave:d}){let[e,f]=(0,c.useState)(!1),[g,h]=(0,c.useState)(null),[i,j]=(0,c.useState)(null),k=(0,z.resolveMcpEndpoint)(a.mcp.endpoint,(0,M.useOrigin)()),m=async()=>{f(!0),h(null);try{(await fetch(k,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"tools/list"})})).ok?h("success"):h("error")}catch{h("error")}f(!1)},n=async a=>{let b=N[a].config.replace("{{ENDPOINT}}",k);await navigator.clipboard.writeText(b),j(a),setTimeout(()=>j(null),2e3)};return(0,b.jsxs)("div",{className:"space-y-8",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-xl font-semibold text-txt mb-1",children:"MCP Connection"}),(0,b.jsx)("p",{className:"text-sm text-muted",children:"Configure the Model Context Protocol server for AI agents."})]}),(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsx)("label",{className:"block text-sm font-medium text-txt",children:"MCP Endpoint"}),(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsx)(L.Input,{value:k,onChange:b=>{var c;return c=b.target.value,void d({...a,mcp:{...a.mcp,endpoint:c}})},className:"bg-surface2 font-mono text-sm"}),(0,b.jsxs)("button",{onClick:m,disabled:e,className:"px-4 py-2 bg-accent text-accent-fg rounded-lg text-sm font-medium hover:bg-accent/90 transition-colors disabled:opacity-50 flex items-center gap-2",children:[e?(0,b.jsx)(K.Loader2,{className:"w-4 h-4 animate-spin"}):(0,b.jsx)(l.Plug,{className:"w-4 h-4"}),"Test"]})]}),g&&(0,b.jsx)("div",{className:(0,r.cn)("flex items-center gap-2 text-sm","success"===g?"text-green-400":"text-red-400"),children:"success"===g?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(y.Check,{className:"w-4 h-4"}),"Connection successful"]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(I.X,{className:"w-4 h-4"}),"Connection failed"]})})]}),(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsx)("label",{className:"block text-sm font-medium text-txt",children:"Agent Configuration"}),(0,b.jsx)("p",{className:"text-xs text-muted",children:"Copy the configuration for your coding agent:"}),(0,b.jsx)("div",{className:"space-y-2",children:Object.entries(N).map(([a,c])=>(0,b.jsxs)("div",{className:"flex items-center justify-between p-3 border border-border rounded-lg",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"text-sm font-medium text-txt",children:c.name}),(0,b.jsx)("div",{className:"text-xs text-muted font-mono",children:c.path})]}),(0,b.jsx)("button",{onClick:()=>n(a),className:(0,r.cn)("flex items-center gap-2 px-3 py-1.5 rounded-lg text-sm transition-colors",i===a?"bg-green-500/20 text-green-400":"bg-surface2 text-muted hover:text-txt"),children:i===a?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(y.Check,{className:"w-3.5 h-3.5"}),"Copied"]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(J.Copy,{className:"w-3.5 h-3.5"}),"Copy"]})})]},a))})]})]})}var P=a.i(200382),Q=a.i(661661),R=a.i(28386);let S=["vibedoc_read_doc","vibedoc_write_doc","vibedoc_search_docs","vibedoc_list_docs","vibedoc_get_status","vibedoc_list_tasks","vibedoc_update_task","vibedoc_read_memory","vibedoc_update_memory","vibedoc_save_entry","vibedoc_delete_entry"],T=["๐Ÿ”ง","๐Ÿ“","๐Ÿงช","๐Ÿ”","๐Ÿ“Š","๐Ÿ”’","โšก","๐ŸŽฏ","๐Ÿ’ก","๐Ÿš€"];function U({skills:a,onSave:d}){let[e,f]=(0,c.useState)(null),[g,h]=(0,c.useState)(null),[i,j]=(0,c.useState)(!1),k=()=>{f(null),h(null),j(!1)},l=()=>{g&&g.name.trim()&&(i?d([...a,g]):d(a.map(a=>a.id===g.id?g:a)),k())},n=a=>{if(!g)return;let b=g.tools.includes(a)?g.tools.filter(b=>b!==a):[...g.tools,a];h({...g,tools:b})};return(0,b.jsxs)("div",{className:"space-y-6",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-xl font-semibold text-txt mb-1",children:"Skills"}),(0,b.jsx)("p",{className:"text-sm text-muted",children:"Reusable capabilities for AI agents."})]}),(0,b.jsxs)("button",{onClick:()=>{let a={id:`skill-${Date.now()}`,name:"",description:"",trigger:"/",prompt:"",tools:[],icon:"โšก"};f(a.id),h(a),j(!0)},className:"flex items-center gap-2 px-3 py-2 bg-accent text-accent-fg rounded-lg text-sm font-medium hover:bg-accent/90 transition-colors",children:[(0,b.jsx)(P.Plus,{className:"w-4 h-4"}),"Add Skill"]})]}),(0,b.jsxs)("div",{className:"space-y-3",children:[a.map(c=>(0,b.jsx)("div",{children:e===c.id&&g?(0,b.jsxs)("div",{className:"border border-accent rounded-lg p-4 space-y-4 bg-accent/5",children:[(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[(0,b.jsx)("select",{value:g.icon||"โšก",onChange:a=>h({...g,icon:a.target.value}),className:"w-12 h-10 text-center text-xl bg-surface2 border border-border rounded-lg",children:T.map(a=>(0,b.jsx)("option",{value:a,children:a},a))}),(0,b.jsx)(L.Input,{value:g.name,onChange:a=>h({...g,name:a.target.value}),placeholder:"Skill name",className:"bg-surface2"})]}),(0,b.jsx)(L.Input,{value:g.description,onChange:a=>h({...g,description:a.target.value}),placeholder:"Description",className:"bg-surface2"}),(0,b.jsx)("div",{className:"flex gap-3",children:(0,b.jsxs)("div",{className:"flex-1",children:[(0,b.jsx)("label",{className:"text-xs text-muted mb-1 block",children:"Trigger"}),(0,b.jsx)(L.Input,{value:g.trigger,onChange:a=>h({...g,trigger:a.target.value}),placeholder:"/command",className:"bg-surface2 font-mono"})]})}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"text-xs text-muted mb-1 block",children:"System Prompt"}),(0,b.jsx)("textarea",{value:g.prompt,onChange:a=>h({...g,prompt:a.target.value}),placeholder:"Instructions for the AI when this skill is activated...",rows:4,className:"w-full px-3 py-2 bg-surface2 border border-border rounded-lg text-sm resize-none"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"text-xs text-muted mb-2 block",children:"Available Tools"}),(0,b.jsx)("div",{className:"flex flex-wrap gap-2",children:S.map(a=>(0,b.jsx)("button",{onClick:()=>n(a),className:(0,r.cn)("px-2 py-1 rounded-sm text-xs font-mono transition-colors",g.tools.includes(a)?"bg-accent/20 text-accent":"bg-surface2 text-muted hover:text-txt"),children:a.replace("vibedoc_","")},a))})]}),(0,b.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,b.jsx)("button",{onClick:k,className:"px-3 py-1.5 text-sm text-muted hover:text-txt transition-colors",children:"Cancel"}),(0,b.jsxs)("button",{onClick:l,disabled:!g.name.trim(),className:"flex items-center gap-2 px-3 py-1.5 bg-accent text-accent-fg rounded-lg text-sm font-medium hover:bg-accent/90 transition-colors disabled:opacity-50",children:[(0,b.jsx)(y.Check,{className:"w-4 h-4"}),"Save"]})]})]}):(0,b.jsxs)("div",{className:"flex items-start gap-3 p-4 border border-border rounded-lg hover:border-accent/30 transition-colors group",children:[(0,b.jsx)("div",{className:"w-10 h-10 rounded-lg bg-surface2 flex items-center justify-center text-xl shrink-0",children:c.icon||"โšก"}),(0,b.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("span",{className:"font-medium text-txt",children:c.name}),(0,b.jsx)("code",{className:"text-xs bg-surface2 px-1.5 py-0.5 rounded-sm text-accent",children:c.trigger})]}),(0,b.jsx)("p",{className:"text-sm text-muted mt-0.5",children:c.description}),c.tools.length>0&&(0,b.jsx)("div",{className:"flex flex-wrap gap-1 mt-2",children:c.tools.map(a=>(0,b.jsx)("span",{className:"text-xs bg-surface2 px-1.5 py-0.5 rounded-sm text-muted",children:a.replace("vibedoc_","")},a))})]}),(0,b.jsxs)("div",{className:"flex gap-1 opacity-0 group-hover:opacity-100 transition-opacity",children:[(0,b.jsx)("button",{onClick:()=>{f(c.id),h({...c}),j(!1)},className:"p-1.5 rounded-sm hover:bg-surface2 text-muted hover:text-txt transition-colors",children:(0,b.jsx)(Q.Pencil,{className:"w-4 h-4"})}),(0,b.jsx)("button",{onClick:()=>{var b;return b=c.id,void(confirm("Delete this skill?")&&d(a.filter(a=>a.id!==b)))},className:"p-1.5 rounded-sm hover:bg-red-500/10 text-muted hover:text-red-400 transition-colors",children:(0,b.jsx)(R.Trash2,{className:"w-4 h-4"})})]})]})},c.id)),i&&g&&(0,b.jsxs)("div",{className:"border border-accent rounded-lg p-4 space-y-4 bg-accent/5",children:[(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[(0,b.jsx)("select",{value:g.icon||"โšก",onChange:a=>h({...g,icon:a.target.value}),className:"w-12 h-10 text-center text-xl bg-surface2 border border-border rounded-lg",children:T.map(a=>(0,b.jsx)("option",{value:a,children:a},a))}),(0,b.jsx)(L.Input,{value:g.name,onChange:a=>h({...g,name:a.target.value}),placeholder:"Skill name",className:"bg-surface2"})]}),(0,b.jsx)(L.Input,{value:g.description,onChange:a=>h({...g,description:a.target.value}),placeholder:"Description",className:"bg-surface2"}),(0,b.jsx)("div",{className:"flex gap-3",children:(0,b.jsxs)("div",{className:"flex-1",children:[(0,b.jsx)("label",{className:"text-xs text-muted mb-1 block",children:"Trigger"}),(0,b.jsx)(L.Input,{value:g.trigger,onChange:a=>h({...g,trigger:a.target.value}),placeholder:"/command",className:"bg-surface2 font-mono"})]})}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"text-xs text-muted mb-1 block",children:"System Prompt"}),(0,b.jsx)("textarea",{value:g.prompt,onChange:a=>h({...g,prompt:a.target.value}),placeholder:"Instructions for the AI when this skill is activated...",rows:4,className:"w-full px-3 py-2 bg-surface2 border border-border rounded-lg text-sm resize-none"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"text-xs text-muted mb-2 block",children:"Available Tools"}),(0,b.jsx)("div",{className:"flex flex-wrap gap-2",children:S.map(a=>(0,b.jsx)("button",{onClick:()=>n(a),className:(0,r.cn)("px-2 py-1 rounded-sm text-xs font-mono transition-colors",g.tools.includes(a)?"bg-accent/20 text-accent":"bg-surface2 text-muted hover:text-txt"),children:a.replace("vibedoc_","")},a))})]}),(0,b.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,b.jsx)("button",{onClick:k,className:"px-3 py-1.5 text-sm text-muted hover:text-txt transition-colors",children:"Cancel"}),(0,b.jsxs)("button",{onClick:l,disabled:!g.name.trim(),className:"flex items-center gap-2 px-3 py-1.5 bg-accent text-accent-fg rounded-lg text-sm font-medium hover:bg-accent/90 transition-colors disabled:opacity-50",children:[(0,b.jsx)(y.Check,{className:"w-4 h-4"}),"Save"]})]})]}),0===a.length&&!i&&(0,b.jsxs)("div",{className:"text-center py-8 text-muted",children:[(0,b.jsx)(m.Zap,{className:"w-10 h-10 mx-auto mb-3 opacity-30"}),(0,b.jsx)("p",{className:"text-sm",children:"No skills configured"}),(0,b.jsx)("p",{className:"text-xs mt-1",children:"Add a skill to give your agents capabilities"})]})]})]})}let V=["๐Ÿค–","๐Ÿ“š","๐Ÿ”’","๐Ÿงช","๐Ÿ“","๐Ÿ”ง","๐Ÿ’ก","๐ŸŽฏ","๐Ÿš€","โšก"];function W({agents:a,skills:d,onSave:e}){let[f,g]=(0,c.useState)(null),[h,i]=(0,c.useState)(null),[j,k]=(0,c.useState)(!1),l=()=>{g(null),i(null),k(!1)},m=()=>{h&&h.name.trim()&&(j?e([...a,h]):e(a.map(a=>a.id===h.id?h:a)),l())},o=a=>(0,b.jsxs)("div",{className:"border border-accent rounded-lg p-4 space-y-4 bg-accent/5",children:[(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[(0,b.jsx)("select",{value:a.icon,onChange:b=>i({...a,icon:b.target.value}),className:"w-12 h-10 text-center text-xl bg-surface2 border border-border rounded-lg",children:V.map(a=>(0,b.jsx)("option",{value:a,children:a},a))}),(0,b.jsx)(L.Input,{value:a.name,onChange:b=>i({...a,name:b.target.value}),placeholder:"Agent name",className:"bg-surface2"})]}),(0,b.jsx)(L.Input,{value:a.description,onChange:b=>i({...a,description:b.target.value}),placeholder:"Description",className:"bg-surface2"}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"text-xs text-muted mb-2 block",children:"Assigned Skills"}),(0,b.jsxs)("div",{className:"flex flex-wrap gap-2",children:[d.map(c=>(0,b.jsxs)("button",{onClick:()=>(a=>{if(!h)return;let b=h.skills.includes(a)?h.skills.filter(b=>b!==a):[...h.skills,a];i({...h,skills:b})})(c.id),className:(0,r.cn)("flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg text-sm transition-colors",a.skills.includes(c.id)?"bg-accent/20 text-accent":"bg-surface2 text-muted hover:text-txt"),children:[(0,b.jsx)("span",{children:c.icon||"โšก"}),c.name]},c.id)),0===d.length&&(0,b.jsx)("span",{className:"text-xs text-muted",children:"No skills available. Create skills first."})]})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"text-xs text-muted mb-1 block",children:"Custom System Prompt"}),(0,b.jsx)("textarea",{value:a.prompt,onChange:b=>i({...a,prompt:b.target.value}),placeholder:"Additional instructions for this agent...",rows:3,className:"w-full px-3 py-2 bg-surface2 border border-border rounded-lg text-sm resize-none"})]}),(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("button",{onClick:()=>i({...a,active:!a.active}),className:(0,r.cn)("w-11 h-6 rounded-full transition-colors relative",a.active?"bg-accent":"bg-border"),children:(0,b.jsx)("span",{className:(0,r.cn)("absolute top-1 w-4 h-4 rounded-full bg-white transition-transform",a.active?"left-6":"left-1")})}),(0,b.jsx)("span",{className:"text-sm text-muted",children:a.active?"Active":"Inactive"})]}),(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsx)("button",{onClick:l,className:"px-3 py-1.5 text-sm text-muted hover:text-txt transition-colors",children:"Cancel"}),(0,b.jsxs)("button",{onClick:m,disabled:!a.name.trim(),className:"flex items-center gap-2 px-3 py-1.5 bg-accent text-accent-fg rounded-lg text-sm font-medium hover:bg-accent/90 transition-colors disabled:opacity-50",children:[(0,b.jsx)(y.Check,{className:"w-4 h-4"}),"Save"]})]})]})]});return(0,b.jsxs)("div",{className:"space-y-6",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-xl font-semibold text-txt mb-1",children:"Agents"}),(0,b.jsx)("p",{className:"text-sm text-muted",children:"AI agent profiles with assigned skills."})]}),(0,b.jsxs)("button",{onClick:()=>{let a={id:`agent-${Date.now()}`,name:"",icon:"๐Ÿค–",description:"",skills:[],prompt:"",active:!0};g(a.id),i(a),k(!0)},className:"flex items-center gap-2 px-3 py-2 bg-accent text-accent-fg rounded-lg text-sm font-medium hover:bg-accent/90 transition-colors",children:[(0,b.jsx)(P.Plus,{className:"w-4 h-4"}),"Add Agent"]})]}),(0,b.jsxs)("div",{className:"space-y-3",children:[a.map(c=>(0,b.jsx)("div",{children:f===c.id&&h?o(h):(0,b.jsxs)("div",{className:(0,r.cn)("flex items-start gap-3 p-4 border rounded-lg transition-colors group",c.active?"border-border hover:border-accent/30":"border-border/50 opacity-60"),children:[(0,b.jsx)("div",{className:"w-10 h-10 rounded-lg bg-surface2 flex items-center justify-center text-xl shrink-0",children:c.icon}),(0,b.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("span",{className:"font-medium text-txt",children:c.name}),!c.active&&(0,b.jsx)("span",{className:"text-xs bg-surface2 px-1.5 py-0.5 rounded-sm text-muted",children:"Inactive"})]}),(0,b.jsx)("p",{className:"text-sm text-muted mt-0.5",children:c.description}),c.skills.length>0&&(0,b.jsx)("div",{className:"flex flex-wrap gap-1 mt-2",children:c.skills.map(a=>{let c=d.find(b=>b.id===a);return c?(0,b.jsxs)("span",{className:"flex items-center gap-1 text-xs bg-surface2 px-1.5 py-0.5 rounded-sm text-muted",children:[c.icon," ",c.name]},a):null})})]}),(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("button",{onClick:()=>{var b;return b=c.id,void e(a.map(a=>a.id===b?{...a,active:!a.active}:a))},className:(0,r.cn)("w-9 h-5 rounded-full transition-colors relative",c.active?"bg-accent":"bg-border"),children:(0,b.jsx)("span",{className:(0,r.cn)("absolute top-0.5 w-4 h-4 rounded-full bg-white transition-transform",c.active?"left-4":"left-0.5")})}),(0,b.jsxs)("div",{className:"flex gap-1 opacity-0 group-hover:opacity-100 transition-opacity",children:[(0,b.jsx)("button",{onClick:()=>{g(c.id),i({...c}),k(!1)},className:"p-1.5 rounded-sm hover:bg-surface2 text-muted hover:text-txt transition-colors",children:(0,b.jsx)(Q.Pencil,{className:"w-4 h-4"})}),(0,b.jsx)("button",{onClick:()=>{var b;return b=c.id,void(confirm("Delete this agent?")&&e(a.filter(a=>a.id!==b)))},className:"p-1.5 rounded-sm hover:bg-red-500/10 text-muted hover:text-red-400 transition-colors",children:(0,b.jsx)(R.Trash2,{className:"w-4 h-4"})})]})]})]})},c.id)),j&&h&&o(h),0===a.length&&!j&&(0,b.jsxs)("div",{className:"text-center py-8 text-muted",children:[(0,b.jsx)(n.Bot,{className:"w-10 h-10 mx-auto mb-3 opacity-30"}),(0,b.jsx)("p",{className:"text-sm",children:"No agents configured"}),(0,b.jsx)("p",{className:"text-xs mt-1",children:"Add an agent to define AI personas with skills"})]})]})]})}var X=a.i(725543),Y=a.i(498053),Z=a.i(269769),$=a.i(173628),_=a.i(147758);let aa="rounded-md border border-border bg-bg px-2 py-1.5 text-sm text-txt focus:outline-hidden focus:ring-1 focus:ring-accent disabled:opacity-50",ab={todo:"waiting to start","in-progress":"being worked on",review:"waits for a human",blocked:"stuck",paused:"stopped on purpose",done:"finished",cancelled:"dropped"};function ac({settings:a,onSave:e}){let{board:f,rootParam:g,refresh:h}=(0,d.useApp)(),i=(0,_.statusDefs)(a.statuses),[j,k]=(0,c.useState)(""),[l,m]=(0,c.useState)("review"),[n,o]=(0,c.useState)("blue"),[p,q]=(0,c.useState)(null),[s,t]=(0,c.useState)("todo"),u=b=>e({...a,statuses:b}),v=(a,b)=>u(i.map(c=>c.id===a?{...c,...b}:c)),w=(a,b)=>{let c=[...i],[d]=c.splice(a,1);c.splice(a+b,0,d),u(c)},x=a=>Object.values(f??{}).flat().filter(b=>b.customStatus===a),y=j.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40),z=j.trim()?y?i.some(a=>a.id===y)?"Already exists":(0,_.invalidStatusId)(y):"Use letters or digits":null;async function A(a){let b=x(a).map(a=>a.id);if(b.length){let a=await fetch(`/api/tasks/bulk${g}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({ids:b,action:{status:s}})});if(!a.ok)return(0,Z.toast)((await a.json().catch(()=>null))?.error??"Could not move the tasks")}await u(i.filter(b=>b.id!==a)),q(null),h()}return(0,b.jsxs)("div",{className:"space-y-8",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"mb-1 text-xl font-semibold text-txt",children:"Statuses"}),(0,b.jsx)("p",{className:"text-sm text-muted",children:"Board columns, in order. A custom status works like the built-in category it maps to: agents, the work queue and progress read the category. Task files store the status id, so renaming never touches them."})]}),(0,b.jsx)("ul",{className:"flex flex-col gap-2",children:i.map((a,c)=>{let d=_.BUILTIN_STATUSES.includes(a.id),e=$.STATUS_META[a.category].icon,f=d?0:x(a.id).length;return(0,b.jsxs)("li",{className:"rounded-lg border border-border bg-surface p-2.5",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(e,{className:(0,r.cn)("size-4 shrink-0",$.STATUS_COLOR_CLASS[a.color].text),"aria-hidden":!0}),(0,b.jsx)(L.Input,{"aria-label":`Label for ${a.id}`,defaultValue:a.label,onBlur:b=>{let c=b.target.value.trim();c&&c!==a.label&&v(a.id,{label:c})},onKeyDown:a=>{"Enter"===a.key&&a.currentTarget.blur()},className:"h-8 w-40 border-border bg-bg text-txt"},`${a.id}:${a.label}`),(0,b.jsx)("span",{className:"font-mono text-[11px] text-muted",children:a.id}),(0,b.jsx)("select",{"aria-label":`Color for ${a.id}`,value:a.color,onChange:b=>v(a.id,{color:b.target.value}),className:aa,children:_.STATUS_COLORS.map(a=>(0,b.jsx)("option",{value:a,children:a},a))}),(0,b.jsx)("select",{"aria-label":`Category for ${a.id}`,value:a.category,disabled:d,title:d?"Built-in statuses keep their category":ab[a.category],onChange:b=>v(a.id,{category:b.target.value}),className:aa,children:_.BUILTIN_STATUSES.map(a=>(0,b.jsxs)("option",{value:a,children:["works like ",a]},a))}),(0,b.jsx)("span",{className:"flex-1"}),(0,b.jsx)("button",{type:"button","aria-label":`Move ${a.id} up`,disabled:0===c,onClick:()=>w(c,-1),className:"grid size-7 place-items-center rounded-md text-muted hover:bg-surface2 hover:text-txt disabled:opacity-30",children:(0,b.jsx)(Y.ArrowUp,{className:"size-3.5"})}),(0,b.jsx)("button",{type:"button","aria-label":`Move ${a.id} down`,disabled:c===i.length-1,onClick:()=>w(c,1),className:"grid size-7 place-items-center rounded-md text-muted hover:bg-surface2 hover:text-txt disabled:opacity-30",children:(0,b.jsx)(X.ArrowDown,{className:"size-3.5"})}),!d&&(0,b.jsx)("button",{type:"button","aria-label":`Delete ${a.id}`,onClick:()=>{q(a.id),t(a.category)},className:"grid size-7 place-items-center rounded-md text-muted hover:bg-surface2 hover:text-danger",children:(0,b.jsx)(R.Trash2,{className:"size-3.5"})})]}),p===a.id&&(0,b.jsxs)("div",{className:"mt-2 flex flex-wrap items-center gap-2 border-t border-border pt-2 text-xs text-muted",children:[f>0?(0,b.jsxs)(b.Fragment,{children:["Move its ",f," task",1===f?"":"s"," to"]}):(0,b.jsx)(b.Fragment,{children:"No tasks use it."}),f>0&&(0,b.jsx)("select",{"aria-label":"Move its tasks to",value:s,onChange:a=>t(a.target.value),className:aa,children:i.filter(b=>b.id!==a.id).map(a=>(0,b.jsx)("option",{value:a.id,children:a.label},a.id))}),(0,b.jsxs)("button",{type:"button",onClick:()=>A(a.id),className:"rounded-md border border-danger/40 px-2 py-1 text-danger hover:bg-danger/10",children:["Delete ",a.label]}),(0,b.jsx)("button",{type:"button",onClick:()=>q(null),className:"px-1 hover:text-txt",children:"Cancel"})]})]},a.id)})}),(0,b.jsxs)("form",{onSubmit:a=>{a.preventDefault(),j.trim()&&!z&&(u([...i,{id:y,label:j.trim(),color:n,category:l}]),k(""))},className:"space-y-2 rounded-lg border border-dashed border-border2 p-3",children:[(0,b.jsx)("p",{className:"text-sm font-medium text-txt",children:"Add a status"}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,b.jsx)(L.Input,{"aria-label":"New status label",value:j,onChange:a=>k(a.target.value),placeholder:"QA",className:"h-8 w-40 border-border bg-bg text-txt"}),(0,b.jsx)("select",{"aria-label":"New status category",value:l,onChange:a=>m(a.target.value),className:aa,children:_.BUILTIN_STATUSES.map(a=>(0,b.jsxs)("option",{value:a,children:["works like ",a," (",ab[a],")"]},a))}),(0,b.jsx)("select",{"aria-label":"New status color",value:n,onChange:a=>o(a.target.value),className:aa,children:_.STATUS_COLORS.map(a=>(0,b.jsx)("option",{value:a,children:a},a))}),(0,b.jsxs)("button",{type:"submit",disabled:!j.trim()||!!z,className:"inline-flex h-8 items-center gap-1.5 rounded-md bg-accent px-3 text-xs font-medium text-accent-fg hover:bg-accent/90 disabled:opacity-40",children:[(0,b.jsx)(P.Plus,{className:"size-3.5"})," Add"]})]}),j.trim()&&(0,b.jsx)("p",{className:(0,r.cn)("font-mono text-[11px]",z?"text-danger":"text-muted"),children:z??`id: ${y}`})]})]})}var ad=a.i(443108),ae=a.i(210436);let af=[{id:"appearance",label:"Appearance",icon:g},{id:"editor",label:"Editor",icon:i},{id:"project",label:"Project",icon:k},{id:"statuses",label:"Statuses",icon:q},{id:"mcp",label:"MCP",icon:l.Plug},{id:"skills",label:"Skills",icon:m.Zap},{id:"agents",label:"Agents",icon:n.Bot}];a.s(["default",0,function(){let{rootParam:a,setEditorSettings:e,setAutoRefreshSeconds:f}=(0,d.useApp)(),[g,h]=(0,c.useState)("appearance"),[i,j]=(0,c.useState)(z.DEFAULT_SETTINGS),[k,l]=(0,c.useState)(z.DEFAULT_SKILLS),[m,n]=(0,c.useState)(z.DEFAULT_AGENTS),[p,q]=(0,c.useState)(!0),[s,t]=(0,c.useState)(!1),u=(0,c.useCallback)(async()=>{try{let b=await fetch(`/api/settings${a}&type=all`),c=await b.json();j({...z.DEFAULT_SETTINGS,...c.settings}),l(c.skills||z.DEFAULT_SKILLS),n(c.agents||z.DEFAULT_AGENTS)}catch{}q(!1)},[a]);(0,c.useEffect)(()=>{u()},[u]);let v=async b=>{t(!0),j(b);try{await fetch(`/api/settings${a}&type=settings`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(b)}),(0,ae.applyTheme)(b.theme),(0,ae.applyAccent)(b.accentColor),(0,ae.applyFontSize)(b.fontSize),(0,ae.applyFonts)(b),e(b.editor),f(b.project?.autoRefresh??0),(0,ad.setStatusDefs)((0,_.statusDefs)(b.statuses))}catch{}t(!1)},w=async b=>{t(!0),l(b);try{await fetch(`/api/settings${a}&type=skills`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(b)})}catch{}t(!1)},x=async b=>{t(!0),n(b);try{await fetch(`/api/settings${a}&type=agents`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(b)})}catch{}t(!1)};return p?(0,b.jsx)("div",{className:"flex items-center justify-center h-full",children:(0,b.jsx)("div",{className:"text-muted",children:"Loading settings..."})}):(0,b.jsxs)("div",{className:"flex h-full",children:[(0,b.jsxs)("aside",{className:"w-56 border-r border-border bg-sidebar shrink-0",children:[(0,b.jsx)("div",{className:"p-4 border-b border-border",children:(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(o.Settings,{className:"w-5 h-5 text-accent"}),(0,b.jsx)("h1",{className:"font-semibold text-txt",children:"Settings"})]})}),(0,b.jsx)("nav",{className:"p-2",children:af.map(a=>{let c=a.icon;return(0,b.jsxs)("button",{onClick:()=>h(a.id),className:(0,r.cn)("w-full flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors",g===a.id?"bg-accent/10 text-accent font-medium":"text-muted hover:text-txt hover:bg-surface2"),children:[(0,b.jsx)(c,{className:"w-4 h-4"}),a.label]},a.id)})})]}),(0,b.jsx)("div",{className:"flex-1 overflow-y-auto",children:(0,b.jsxs)("div",{className:"max-w-2xl mx-auto p-6",children:[s&&(0,b.jsx)("div",{className:"fixed top-4 right-4 bg-accent text-accent-fg px-3 py-1.5 rounded-lg text-sm shadow-lg",children:"Saving..."}),"appearance"===g&&(0,b.jsx)(C,{settings:i,onSave:v}),"editor"===g&&(0,b.jsx)(F,{settings:i,onSave:v}),"project"===g&&(0,b.jsx)(H,{settings:i,onSave:v}),"statuses"===g&&(0,b.jsx)(ac,{settings:i,onSave:v}),"mcp"===g&&(0,b.jsx)(O,{settings:i,onSave:v}),"skills"===g&&(0,b.jsx)(U,{skills:k,onSave:w}),"agents"===g&&(0,b.jsx)(W,{agents:m,skills:k,onSave:x})]})})]})}],381249)}];
22
22
 
23
23
  //# sourceMappingURL=src_app_%28app%29_settings_page_tsx_0zevtee._.js.map