vibedoc 1.11.0 → 1.12.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 (523) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +2 -0
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +14 -14
  5. package/.next/routes-manifest.json +12 -0
  6. package/.next/server/app/(app)/activity/page.js.nft.json +1 -1
  7. package/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/(app)/board/page.js.nft.json +1 -1
  9. package/.next/server/app/(app)/board/page_client-reference-manifest.js +1 -1
  10. package/.next/server/app/(app)/chat/page.js.nft.json +1 -1
  11. package/.next/server/app/(app)/chat/page_client-reference-manifest.js +1 -1
  12. package/.next/server/app/(app)/docs/page.js.nft.json +1 -1
  13. package/.next/server/app/(app)/docs/page_client-reference-manifest.js +1 -1
  14. package/.next/server/app/(app)/explorer/page.js.nft.json +1 -1
  15. package/.next/server/app/(app)/explorer/page_client-reference-manifest.js +1 -1
  16. package/.next/server/app/(app)/graph/page.js.nft.json +1 -1
  17. package/.next/server/app/(app)/graph/page_client-reference-manifest.js +1 -1
  18. package/.next/server/app/(app)/manual-tests/page.js.nft.json +1 -1
  19. package/.next/server/app/(app)/manual-tests/page_client-reference-manifest.js +1 -1
  20. package/.next/server/app/(app)/memory/page.js.nft.json +1 -1
  21. package/.next/server/app/(app)/memory/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/(app)/roadmap/page.js.nft.json +1 -1
  23. package/.next/server/app/(app)/roadmap/page_client-reference-manifest.js +1 -1
  24. package/.next/server/app/(app)/settings/page.js.nft.json +1 -1
  25. package/.next/server/app/(app)/settings/page_client-reference-manifest.js +1 -1
  26. package/.next/server/app/(app)/setup/page.js.nft.json +1 -1
  27. package/.next/server/app/(app)/setup/page_client-reference-manifest.js +1 -1
  28. package/.next/server/app/_global-error.html +1 -1
  29. package/.next/server/app/_global-error.rsc +1 -1
  30. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  31. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  32. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  33. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  34. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  35. package/.next/server/app/_not-found.html +1 -1
  36. package/.next/server/app/_not-found.rsc +2 -2
  37. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  38. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  39. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  40. package/.next/server/app/activity.html +1 -1
  41. package/.next/server/app/activity.rsc +6 -6
  42. package/.next/server/app/activity.segments/!KGFwcCk/activity/__PAGE__.segment.rsc +5 -5
  43. package/.next/server/app/activity.segments/_full.segment.rsc +6 -6
  44. package/.next/server/app/activity.segments/_tree.segment.rsc +2 -2
  45. package/.next/server/app/api/activity/route.js +1 -1
  46. package/.next/server/app/api/activity/route.js.nft.json +1 -1
  47. package/.next/server/app/api/chat/route.js +1 -1
  48. package/.next/server/app/api/chat/route.js.nft.json +1 -1
  49. package/.next/server/app/api/context/route.js +1 -1
  50. package/.next/server/app/api/context/route.js.nft.json +1 -1
  51. package/.next/server/app/api/conversations/route.js +1 -1
  52. package/.next/server/app/api/conversations/route.js.nft.json +1 -1
  53. package/.next/server/app/api/decisions/route.js +1 -1
  54. package/.next/server/app/api/decisions/route.js.nft.json +1 -1
  55. package/.next/server/app/api/docs/graph/route.js +1 -1
  56. package/.next/server/app/api/docs/graph/route.js.nft.json +1 -1
  57. package/.next/server/app/api/docs/links/route.js +1 -1
  58. package/.next/server/app/api/docs/links/route.js.nft.json +1 -1
  59. package/.next/server/app/api/docs/route.js +1 -1
  60. package/.next/server/app/api/docs/route.js.nft.json +1 -1
  61. package/.next/server/app/api/explorer/route.js +1 -1
  62. package/.next/server/app/api/explorer/route.js.nft.json +1 -1
  63. package/.next/server/app/api/mcp/route.js +1 -1
  64. package/.next/server/app/api/mcp/route.js.nft.json +1 -1
  65. package/.next/server/app/api/memory/entries/delete/route.js +1 -1
  66. package/.next/server/app/api/memory/entries/delete/route.js.nft.json +1 -1
  67. package/.next/server/app/api/memory/entries/merge/route.js +1 -1
  68. package/.next/server/app/api/memory/entries/merge/route.js.nft.json +1 -1
  69. package/.next/server/app/api/memory/entries/merge/undo/route.js +1 -1
  70. package/.next/server/app/api/memory/entries/merge/undo/route.js.nft.json +1 -1
  71. package/.next/server/app/api/memory/entries/restore/route.js +1 -1
  72. package/.next/server/app/api/memory/entries/restore/route.js.nft.json +1 -1
  73. package/.next/server/app/api/memory/entries/route.js +1 -1
  74. package/.next/server/app/api/memory/entries/route.js.nft.json +1 -1
  75. package/.next/server/app/api/memory/entries/save/route.js +1 -1
  76. package/.next/server/app/api/memory/entries/save/route.js.nft.json +1 -1
  77. package/.next/server/app/api/memory/graph/route.js +1 -1
  78. package/.next/server/app/api/memory/graph/route.js.nft.json +1 -1
  79. package/.next/server/app/api/memory/health/dismiss/route.js +1 -1
  80. package/.next/server/app/api/memory/health/dismiss/route.js.nft.json +1 -1
  81. package/.next/server/app/api/memory/health/route.js +1 -1
  82. package/.next/server/app/api/memory/health/route.js.nft.json +1 -1
  83. package/.next/server/app/api/memory/history/route.js +1 -1
  84. package/.next/server/app/api/memory/history/route.js.nft.json +1 -1
  85. package/.next/server/app/api/memory/restore/route/app-paths-manifest.json +3 -0
  86. package/.next/server/app/api/memory/restore/route/build-manifest.json +12 -0
  87. package/.next/server/app/api/memory/restore/route/server-reference-manifest.json +4 -0
  88. package/.next/server/app/api/memory/restore/route.js +9 -0
  89. package/.next/server/app/api/memory/restore/route.js.map +5 -0
  90. package/.next/server/app/api/memory/restore/route.js.nft.json +1 -0
  91. package/.next/server/app/api/memory/restore/route_client-reference-manifest.js +3 -0
  92. package/.next/server/app/api/memory/route.js +1 -1
  93. package/.next/server/app/api/memory/route.js.nft.json +1 -1
  94. package/.next/server/app/api/memory/versions/route/app-paths-manifest.json +3 -0
  95. package/.next/server/app/api/memory/versions/route/build-manifest.json +12 -0
  96. package/.next/server/app/api/memory/versions/route/server-reference-manifest.json +4 -0
  97. package/.next/server/app/api/memory/versions/route.js +8 -0
  98. package/.next/server/app/api/memory/versions/route.js.map +5 -0
  99. package/.next/server/app/api/memory/versions/route.js.nft.json +1 -0
  100. package/.next/server/app/api/memory/versions/route_client-reference-manifest.js +3 -0
  101. package/.next/server/app/api/plan/apply/route.js +1 -1
  102. package/.next/server/app/api/plan/apply/route.js.nft.json +1 -1
  103. package/.next/server/app/api/projects/route.js +1 -1
  104. package/.next/server/app/api/projects/route.js.nft.json +1 -1
  105. package/.next/server/app/api/registry/route.js +1 -1
  106. package/.next/server/app/api/registry/route.js.nft.json +1 -1
  107. package/.next/server/app/api/roadmap/create/route.js +1 -1
  108. package/.next/server/app/api/roadmap/create/route.js.nft.json +1 -1
  109. package/.next/server/app/api/roadmap/delete/route.js +1 -1
  110. package/.next/server/app/api/roadmap/delete/route.js.nft.json +1 -1
  111. package/.next/server/app/api/roadmap/generate/route.js +1 -1
  112. package/.next/server/app/api/roadmap/generate/route.js.nft.json +1 -1
  113. package/.next/server/app/api/roadmap/layout/route.js +1 -1
  114. package/.next/server/app/api/roadmap/layout/route.js.nft.json +1 -1
  115. package/.next/server/app/api/roadmap/restore/route.js +1 -1
  116. package/.next/server/app/api/roadmap/restore/route.js.nft.json +1 -1
  117. package/.next/server/app/api/roadmap/route.js +1 -1
  118. package/.next/server/app/api/roadmap/route.js.nft.json +1 -1
  119. package/.next/server/app/api/roadmap/update/route.js +1 -1
  120. package/.next/server/app/api/roadmap/update/route.js.nft.json +1 -1
  121. package/.next/server/app/api/sessions/route.js +1 -1
  122. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  123. package/.next/server/app/api/settings/route.js +1 -1
  124. package/.next/server/app/api/settings/route.js.nft.json +1 -1
  125. package/.next/server/app/api/setup/generate/route.js +1 -1
  126. package/.next/server/app/api/setup/generate/route.js.nft.json +1 -1
  127. package/.next/server/app/api/setup/write/route.js +1 -1
  128. package/.next/server/app/api/setup/write/route.js.nft.json +1 -1
  129. package/.next/server/app/api/summary/route.js +1 -1
  130. package/.next/server/app/api/summary/route.js.nft.json +1 -1
  131. package/.next/server/app/api/tasks/bulk/route.js +1 -1
  132. package/.next/server/app/api/tasks/bulk/route.js.nft.json +1 -1
  133. package/.next/server/app/api/tasks/create/route.js +1 -1
  134. package/.next/server/app/api/tasks/create/route.js.nft.json +1 -1
  135. package/.next/server/app/api/tasks/delete/route.js +1 -1
  136. package/.next/server/app/api/tasks/delete/route.js.nft.json +1 -1
  137. package/.next/server/app/api/tasks/manual-tests/route.js +1 -1
  138. package/.next/server/app/api/tasks/manual-tests/route.js.nft.json +1 -1
  139. package/.next/server/app/api/tasks/restore/route.js +1 -1
  140. package/.next/server/app/api/tasks/restore/route.js.nft.json +1 -1
  141. package/.next/server/app/api/tasks/review/route.js +1 -1
  142. package/.next/server/app/api/tasks/review/route.js.nft.json +1 -1
  143. package/.next/server/app/api/tasks/route.js +1 -1
  144. package/.next/server/app/api/tasks/route.js.nft.json +1 -1
  145. package/.next/server/app/api/tasks/update/route.js +1 -1
  146. package/.next/server/app/api/tasks/update/route.js.nft.json +1 -1
  147. package/.next/server/app/api/views/route.js +1 -1
  148. package/.next/server/app/api/views/route.js.nft.json +1 -1
  149. package/.next/server/app/board.html +1 -1
  150. package/.next/server/app/board.rsc +7 -7
  151. package/.next/server/app/board.segments/!KGFwcCk/board/__PAGE__.segment.rsc +5 -5
  152. package/.next/server/app/board.segments/_full.segment.rsc +7 -7
  153. package/.next/server/app/board.segments/_tree.segment.rsc +2 -2
  154. package/.next/server/app/chat.html +1 -1
  155. package/.next/server/app/chat.rsc +6 -6
  156. package/.next/server/app/chat.segments/!KGFwcCk/chat/__PAGE__.segment.rsc +6 -6
  157. package/.next/server/app/chat.segments/_full.segment.rsc +6 -6
  158. package/.next/server/app/chat.segments/_tree.segment.rsc +2 -2
  159. package/.next/server/app/docs.html +1 -1
  160. package/.next/server/app/docs.rsc +7 -7
  161. package/.next/server/app/docs.segments/!KGFwcCk/docs/__PAGE__.segment.rsc +5 -5
  162. package/.next/server/app/docs.segments/_full.segment.rsc +7 -7
  163. package/.next/server/app/docs.segments/_tree.segment.rsc +2 -2
  164. package/.next/server/app/explorer.html +1 -1
  165. package/.next/server/app/explorer.rsc +6 -6
  166. package/.next/server/app/explorer.segments/!KGFwcCk/explorer/__PAGE__.segment.rsc +9 -11
  167. package/.next/server/app/explorer.segments/_full.segment.rsc +6 -6
  168. package/.next/server/app/explorer.segments/_tree.segment.rsc +2 -2
  169. package/.next/server/app/graph.html +1 -1
  170. package/.next/server/app/graph.rsc +6 -6
  171. package/.next/server/app/graph.segments/!KGFwcCk/graph/__PAGE__.segment.rsc +5 -5
  172. package/.next/server/app/graph.segments/_full.segment.rsc +6 -6
  173. package/.next/server/app/graph.segments/_tree.segment.rsc +2 -2
  174. package/.next/server/app/index.html +1 -1
  175. package/.next/server/app/index.rsc +2 -2
  176. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  177. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  178. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  179. package/.next/server/app/manual-tests.html +1 -1
  180. package/.next/server/app/manual-tests.rsc +6 -6
  181. package/.next/server/app/manual-tests.segments/!KGFwcCk/manual-tests/__PAGE__.segment.rsc +9 -11
  182. package/.next/server/app/manual-tests.segments/_full.segment.rsc +6 -6
  183. package/.next/server/app/manual-tests.segments/_tree.segment.rsc +2 -2
  184. package/.next/server/app/memory.html +1 -1
  185. package/.next/server/app/memory.rsc +7 -7
  186. package/.next/server/app/memory.segments/!KGFwcCk/memory/__PAGE__.segment.rsc +5 -5
  187. package/.next/server/app/memory.segments/_full.segment.rsc +7 -7
  188. package/.next/server/app/memory.segments/_tree.segment.rsc +2 -2
  189. package/.next/server/app/page.js.nft.json +1 -1
  190. package/.next/server/app/page_client-reference-manifest.js +1 -1
  191. package/.next/server/app/roadmap.html +1 -1
  192. package/.next/server/app/roadmap.rsc +6 -6
  193. package/.next/server/app/roadmap.segments/!KGFwcCk/roadmap/__PAGE__.segment.rsc +5 -5
  194. package/.next/server/app/roadmap.segments/_full.segment.rsc +6 -6
  195. package/.next/server/app/roadmap.segments/_tree.segment.rsc +2 -2
  196. package/.next/server/app/settings.html +1 -1
  197. package/.next/server/app/settings.rsc +6 -6
  198. package/.next/server/app/settings.segments/!KGFwcCk/settings/__PAGE__.segment.rsc +11 -9
  199. package/.next/server/app/settings.segments/_full.segment.rsc +6 -6
  200. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  201. package/.next/server/app/setup.html +1 -1
  202. package/.next/server/app/setup.rsc +6 -6
  203. package/.next/server/app/setup.segments/!KGFwcCk/setup/__PAGE__.segment.rsc +9 -11
  204. package/.next/server/app/setup.segments/_full.segment.rsc +6 -6
  205. package/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
  206. package/.next/server/app-paths-manifest.json +2 -0
  207. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0-r4g2t._.js → 11mp_@anthropic-ai_sdk_013qeb4._.js} +1 -1
  208. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_02lx_j3._.js → 11mp_@anthropic-ai_sdk_05ck8py._.js} +1 -1
  209. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_01gyja3._.js → 11mp_@anthropic-ai_sdk_05w8m72._.js} +1 -1
  210. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_05iv23g._.js → 11mp_@anthropic-ai_sdk_086oevc._.js} +1 -1
  211. package/.next/server/chunks/11mp_@anthropic-ai_sdk_08rl0hf._.js +3 -0
  212. package/.next/server/chunks/11mp_@anthropic-ai_sdk_09ujrsu._.js +3 -0
  213. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0c3_7p7._.js +3 -0
  214. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0cto43x._.js +3 -0
  215. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0fgisb_._.js +3 -0
  216. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0fy8wd3._.js +3 -0
  217. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0fyvizf._.js +3 -0
  218. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0hg0i2g._.js +3 -0
  219. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0i0sz05._.js +3 -0
  220. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0l0j9c6._.js +3 -0
  221. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0lcm61d._.js +3 -0
  222. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0qtva5j._.js +3 -0
  223. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0r4fkdu._.js +3 -0
  224. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0wbae0t._.js +3 -0
  225. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0wxyz1t._.js +3 -0
  226. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0y2cods._.js +3 -0
  227. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0zu0fj1._.js +3 -0
  228. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0zxpgt0._.js +3 -0
  229. package/.next/server/chunks/11mp_@anthropic-ai_sdk_10_cxcd._.js +3 -0
  230. package/.next/server/chunks/11mp_@anthropic-ai_sdk_10gb7d1._.js +3 -0
  231. package/.next/server/chunks/11mp_@anthropic-ai_sdk_12q70bs._.js +3 -0
  232. package/.next/server/chunks/11mp_@anthropic-ai_sdk_149ltk3._.js +3 -0
  233. package/.next/server/chunks/11mp_@anthropic-ai_sdk_165_uiw._.js +3 -0
  234. package/.next/server/chunks/11mp_@anthropic-ai_sdk_19w4zh6._.js +3 -0
  235. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1adck-s._.js +3 -0
  236. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1c2dwoi._.js +3 -0
  237. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1d9lw_2._.js +3 -0
  238. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1db6a7p._.js +3 -0
  239. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1h2f90s._.js +3 -0
  240. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1k5_i1z._.js +3 -0
  241. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1p3mv6i._.js +3 -0
  242. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1qoom5s._.js +3 -0
  243. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1qsbcbe._.js +3 -0
  244. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1rk0x59._.js +3 -0
  245. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1sd98mi._.js +3 -0
  246. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1sumqg8._.js +3 -0
  247. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1t-rt4q._.js +3 -0
  248. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1tr-k4y._.js +3 -0
  249. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1xk3c39._.js +3 -0
  250. package/.next/server/chunks/11mp_@anthropic-ai_sdk_206l10_._.js +3 -0
  251. package/.next/server/chunks/11mp_@anthropic-ai_sdk_20giys9._.js +3 -0
  252. package/.next/server/chunks/11mp_@anthropic-ai_sdk_20xrvvy._.js +3 -0
  253. package/.next/server/chunks/11mp_@anthropic-ai_sdk_20xrvvy._.js.map +1 -0
  254. package/.next/server/chunks/11mp_@anthropic-ai_sdk_215tg00._.js +3 -0
  255. package/.next/server/chunks/11mp_@anthropic-ai_sdk_215tg00._.js.map +1 -0
  256. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_018s_10._.js +3 -0
  257. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_08d6i7w._.js +3 -0
  258. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_09_fd9g._.js +3 -0
  259. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0eopml6._.js +3 -0
  260. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0f5epel._.js +3 -0
  261. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0okfnhu._.js +3 -0
  262. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0s8-ha8._.js +3 -0
  263. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0ujs27r._.js +3 -0
  264. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0uo7rs8._.js +3 -0
  265. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0vyq_2d._.js +3 -0
  266. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0w3js74._.js +3 -0
  267. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0xa4-uq._.js +3 -0
  268. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_113y3so._.js +3 -0
  269. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_12qcr96._.js +3 -0
  270. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_13ixdy8._.js +3 -0
  271. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1708vst._.js +3 -0
  272. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1_rdguq._.js +3 -0
  273. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1bgpe23._.js +3 -0
  274. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1f-tphn._.js +3 -0
  275. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1h1pqdh._.js +3 -0
  276. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1hfj_1d._.js +3 -0
  277. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1ih2qzz._.js +3 -0
  278. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1jatyl1._.js +3 -0
  279. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1v1zbha._.js +3 -0
  280. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1vyqs5z._.js +3 -0
  281. package/.next/server/chunks/{[root-of-the-server]__0xldguc._.js → [root-of-the-server]__00usbi3._.js} +2 -2
  282. package/.next/server/chunks/{[root-of-the-server]__0i1yba1._.js → [root-of-the-server]__04cwur0._.js} +2 -2
  283. package/.next/server/chunks/{[root-of-the-server]__1yh-4vk._.js → [root-of-the-server]__04ri_ci._.js} +2 -2
  284. package/.next/server/chunks/{[root-of-the-server]__06ndlro._.js → [root-of-the-server]__05-be3n._.js} +2 -2
  285. package/.next/server/chunks/{[root-of-the-server]__08v3p50._.js → [root-of-the-server]__0756_60._.js} +2 -2
  286. package/.next/server/chunks/{[root-of-the-server]__0pz59qo._.js → [root-of-the-server]__089ay-q._.js} +2 -2
  287. package/.next/server/chunks/{[root-of-the-server]__0cxmrop._.js → [root-of-the-server]__0d4t4q6._.js} +2 -2
  288. package/.next/server/chunks/{[root-of-the-server]__1ef-hw_._.js → [root-of-the-server]__0dgwykw._.js} +2 -2
  289. package/.next/server/chunks/[root-of-the-server]__0fn-a8c._.js +22 -43
  290. package/.next/server/chunks/[root-of-the-server]__0fn-a8c._.js.map +1 -1
  291. package/.next/server/chunks/{[root-of-the-server]__0zy73pu._.js → [root-of-the-server]__0n0myt9._.js} +2 -2
  292. package/.next/server/chunks/[root-of-the-server]__0n0myt9._.js.map +1 -0
  293. package/.next/server/chunks/[root-of-the-server]__0pe1qih._.js +3 -0
  294. package/.next/server/chunks/[root-of-the-server]__0pe1qih._.js.map +1 -0
  295. package/.next/server/chunks/[root-of-the-server]__0pvi3ku._.js +22 -43
  296. package/.next/server/chunks/[root-of-the-server]__0pvi3ku._.js.map +1 -1
  297. package/.next/server/chunks/{[root-of-the-server]__1qcy2l0._.js → [root-of-the-server]__0s-j6z-._.js} +2 -2
  298. package/.next/server/chunks/{[root-of-the-server]__1zhd93r._.js → [root-of-the-server]__0yaxn8g._.js} +2 -2
  299. package/.next/server/chunks/{[root-of-the-server]__0rh8yfn._.js → [root-of-the-server]__162_l0k._.js} +2 -2
  300. package/.next/server/chunks/{[root-of-the-server]__0hk-9ll._.js → [root-of-the-server]__16smlkg._.js} +2 -2
  301. package/.next/server/chunks/{[root-of-the-server]__11rp-qx._.js → [root-of-the-server]__19yo85m._.js} +2 -2
  302. package/.next/server/chunks/[root-of-the-server]__1lxrobr._.js +3 -0
  303. package/.next/server/chunks/[root-of-the-server]__1lxrobr._.js.map +1 -0
  304. package/.next/server/chunks/{[root-of-the-server]__1sn6-7a._.js → [root-of-the-server]__1mnzsbh._.js} +2 -2
  305. package/.next/server/chunks/{[root-of-the-server]__11nbc9e._.js → [root-of-the-server]__1ntu_6r._.js} +2 -2
  306. package/.next/server/chunks/[root-of-the-server]__1p4ws5z._.js +3 -0
  307. package/.next/server/chunks/[root-of-the-server]__1p4ws5z._.js.map +1 -0
  308. package/.next/server/chunks/{[root-of-the-server]__1wbho9e._.js → [root-of-the-server]__1s0t8r3._.js} +2 -2
  309. package/.next/server/chunks/{[root-of-the-server]__1r67yrn._.js → [root-of-the-server]__1sd3l-d._.js} +2 -2
  310. package/.next/server/chunks/[root-of-the-server]__1vnine1._.js +22 -43
  311. package/.next/server/chunks/[root-of-the-server]__1vnine1._.js.map +1 -1
  312. package/.next/server/chunks/{[root-of-the-server]__0rikmqn._.js → [root-of-the-server]__1vzxnjb._.js} +2 -2
  313. package/.next/server/chunks/{[root-of-the-server]__0wc_gnr._.js → [root-of-the-server]__1zeys20._.js} +2 -2
  314. package/.next/server/chunks/_04byth9._.js +4 -4
  315. package/.next/server/chunks/_04byth9._.js.map +1 -1
  316. package/.next/server/chunks/_next-internal_server_app_api_memory_restore_route_actions_0679kmo.js +3 -0
  317. package/.next/server/chunks/_next-internal_server_app_api_memory_restore_route_actions_0679kmo.js.map +1 -0
  318. package/.next/server/chunks/_next-internal_server_app_api_memory_versions_route_actions_13mix75.js +3 -0
  319. package/.next/server/chunks/_next-internal_server_app_api_memory_versions_route_actions_13mix75.js.map +1 -0
  320. package/.next/server/chunks/ssr/{_0me5_6x._.js → _0-_04ia._.js} +1 -1
  321. package/.next/server/chunks/ssr/{_190c11r._.js → _0cv0ugs._.js} +1 -1
  322. package/.next/server/chunks/ssr/_0ghj-vx._.js +1 -1
  323. package/.next/server/chunks/ssr/_0ghj-vx._.js.map +1 -1
  324. package/.next/server/chunks/ssr/_0o8t6j-._.js +3 -0
  325. package/.next/server/chunks/ssr/_0o8t6j-._.js.map +1 -0
  326. package/.next/server/chunks/ssr/_128p7pz._.js +3 -0
  327. package/.next/server/chunks/ssr/_128p7pz._.js.map +1 -0
  328. package/.next/server/chunks/ssr/{_1feybpz._.js → _1hm7p_8._.js} +1 -1
  329. package/.next/server/chunks/ssr/{_1cz8dnu._.js → _1s-2jub._.js} +1 -1
  330. package/.next/server/chunks/ssr/src_app_(app)_memory_page_tsx_19jhb1c._.js +2 -2
  331. package/.next/server/chunks/ssr/src_app_(app)_memory_page_tsx_19jhb1c._.js.map +1 -1
  332. package/.next/server/chunks/ssr/src_components_chat_ChatView_tsx_0h5j-e2._.js +1 -1
  333. package/.next/server/chunks/ssr/src_components_chat_ChatView_tsx_0h5j-e2._.js.map +1 -1
  334. package/.next/server/middleware-build-manifest.js +3 -3
  335. package/.next/server/pages/404.html +1 -1
  336. package/.next/server/pages/500.html +1 -1
  337. package/.next/server/server-reference-manifest.js +1 -1
  338. package/.next/server/server-reference-manifest.json +1 -1
  339. package/.next/static/chunks/05qw7-fs1exlt.js +1 -0
  340. package/.next/static/chunks/0eax07u1ta6tp.css +1 -0
  341. package/.next/static/chunks/0lfd3aomz4wv4.js +1 -0
  342. package/.next/static/chunks/{3rtr962aa09nh.js → 0po8atank1p02.js} +2 -2
  343. package/.next/static/chunks/11ou9nrpdg4qo.js +3 -0
  344. package/.next/static/chunks/1g7st54huk4if.js +1 -0
  345. package/.next/static/chunks/40diykjra8f9n.js +2107 -0
  346. package/README.md +4 -2
  347. package/package.json +1 -1
  348. package/.next/server/chunks/11mp_@anthropic-ai_sdk_05oneea._.js +0 -3
  349. package/.next/server/chunks/11mp_@anthropic-ai_sdk_07fgg-l._.js +0 -3
  350. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0_5gzfy._.js +0 -3
  351. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0_jynr-._.js +0 -3
  352. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0aykesf._.js +0 -3
  353. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0br_1fc._.js +0 -3
  354. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0cd5lu7._.js +0 -3
  355. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0ckxhy7._.js +0 -3
  356. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0e5qkuv._.js +0 -3
  357. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0el8pm6._.js +0 -3
  358. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0i4w8fv._.js +0 -3
  359. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0i7ckik._.js +0 -3
  360. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0l1p4c6._.js +0 -3
  361. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0m-xqs_._.js +0 -3
  362. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0nltdmf._.js +0 -3
  363. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0qxmzg8._.js +0 -3
  364. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0spr_aj._.js +0 -3
  365. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0th0pyh._.js +0 -3
  366. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0x21fif._.js +0 -3
  367. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1-7bj56._.js +0 -3
  368. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1-efoj1._.js +0 -3
  369. package/.next/server/chunks/11mp_@anthropic-ai_sdk_13vu693._.js +0 -3
  370. package/.next/server/chunks/11mp_@anthropic-ai_sdk_13w62gi._.js +0 -3
  371. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1887ce1._.js +0 -3
  372. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1_jq3yb._.js +0 -3
  373. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1agvp6h._.js +0 -3
  374. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1b1-3vt._.js +0 -3
  375. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1ekldtb._.js +0 -3
  376. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1ezcndt._.js +0 -3
  377. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1gr-orf._.js +0 -3
  378. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1hf-884._.js +0 -3
  379. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1ndwnmb._.js +0 -3
  380. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1rdesfd._.js +0 -3
  381. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1s8h60-._.js +0 -3
  382. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1tgk9wk._.js +0 -3
  383. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1uugb45._.js +0 -3
  384. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1vcxmui._.js +0 -3
  385. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1x63qpm._.js +0 -3
  386. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1y5oj_h._.js +0 -3
  387. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1z0q4jj._.js +0 -3
  388. package/.next/server/chunks/11mp_@anthropic-ai_sdk_20j6dn7._.js +0 -3
  389. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_00nr0dy._.js +0 -3
  390. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_06kgcr0._.js +0 -3
  391. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_07kod-g._.js +0 -3
  392. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0_va-1q._.js +0 -3
  393. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0dr79hc._.js +0 -3
  394. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0ew4_uw._.js +0 -3
  395. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0iy714m._.js +0 -3
  396. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0n6aq49._.js +0 -3
  397. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0ncvuil._.js +0 -3
  398. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0vilstf._.js +0 -3
  399. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0ybdfbv._.js +0 -3
  400. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0z31-c0._.js +0 -3
  401. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0zu51ny._.js +0 -3
  402. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_13-fsm5._.js +0 -3
  403. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_13lk7wf._.js +0 -3
  404. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1ao3e3l._.js +0 -3
  405. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1ck6z1z._.js +0 -3
  406. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1dm3so9._.js +0 -3
  407. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1jxtz_6._.js +0 -3
  408. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1pdl5qg._.js +0 -3
  409. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1tzpss1._.js +0 -3
  410. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1x_0sf4._.js +0 -3
  411. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1x_fy5x._.js +0 -3
  412. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1xx8_-m._.js +0 -3
  413. package/.next/server/chunks/[root-of-the-server]__0usdydm._.js +0 -3
  414. package/.next/server/chunks/[root-of-the-server]__0usdydm._.js.map +0 -1
  415. package/.next/server/chunks/ssr/_0pg63il._.js +0 -3
  416. package/.next/server/chunks/ssr/_0pg63il._.js.map +0 -1
  417. package/.next/server/chunks/ssr/_16b4hkt._.js +0 -3
  418. package/.next/server/chunks/ssr/_16b4hkt._.js.map +0 -1
  419. package/.next/server/chunks/ssr/_1t8it2w._.js +0 -3
  420. package/.next/server/chunks/ssr/_1t8it2w._.js.map +0 -1
  421. package/.next/static/chunks/036fex6o238at.css +0 -1
  422. package/.next/static/chunks/1c5ibgojv8jdi.js +0 -3
  423. package/.next/static/chunks/1pmgcotwq-_yh.js +0 -1
  424. package/.next/static/chunks/1xxzt2y2ttqql.js +0 -2107
  425. package/.next/static/chunks/263i_dcdizuvd.js +0 -1
  426. package/.next/static/chunks/2mf5us3y9wd9g.js +0 -1
  427. package/.next/static/chunks/42c9smmpcu4re.js +0 -1
  428. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_20j6dn7._.js.map → 11mp_@anthropic-ai_sdk_013qeb4._.js.map} +0 -0
  429. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1z0q4jj._.js.map → 11mp_@anthropic-ai_sdk_05ck8py._.js.map} +0 -0
  430. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1y5oj_h._.js.map → 11mp_@anthropic-ai_sdk_05w8m72._.js.map} +0 -0
  431. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1x63qpm._.js.map → 11mp_@anthropic-ai_sdk_086oevc._.js.map} +0 -0
  432. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1vcxmui._.js.map → 11mp_@anthropic-ai_sdk_08rl0hf._.js.map} +0 -0
  433. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1uugb45._.js.map → 11mp_@anthropic-ai_sdk_09ujrsu._.js.map} +0 -0
  434. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1tgk9wk._.js.map → 11mp_@anthropic-ai_sdk_0c3_7p7._.js.map} +0 -0
  435. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1s8h60-._.js.map → 11mp_@anthropic-ai_sdk_0cto43x._.js.map} +0 -0
  436. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1rdesfd._.js.map → 11mp_@anthropic-ai_sdk_0fgisb_._.js.map} +0 -0
  437. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1ndwnmb._.js.map → 11mp_@anthropic-ai_sdk_0fy8wd3._.js.map} +0 -0
  438. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1hf-884._.js.map → 11mp_@anthropic-ai_sdk_0fyvizf._.js.map} +0 -0
  439. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1gr-orf._.js.map → 11mp_@anthropic-ai_sdk_0hg0i2g._.js.map} +0 -0
  440. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1ezcndt._.js.map → 11mp_@anthropic-ai_sdk_0i0sz05._.js.map} +0 -0
  441. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1ekldtb._.js.map → 11mp_@anthropic-ai_sdk_0l0j9c6._.js.map} +0 -0
  442. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1b1-3vt._.js.map → 11mp_@anthropic-ai_sdk_0lcm61d._.js.map} +0 -0
  443. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1agvp6h._.js.map → 11mp_@anthropic-ai_sdk_0qtva5j._.js.map} +0 -0
  444. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1_jq3yb._.js.map → 11mp_@anthropic-ai_sdk_0r4fkdu._.js.map} +0 -0
  445. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1887ce1._.js.map → 11mp_@anthropic-ai_sdk_0wbae0t._.js.map} +0 -0
  446. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_13w62gi._.js.map → 11mp_@anthropic-ai_sdk_0wxyz1t._.js.map} +0 -0
  447. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_13vu693._.js.map → 11mp_@anthropic-ai_sdk_0y2cods._.js.map} +0 -0
  448. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1-efoj1._.js.map → 11mp_@anthropic-ai_sdk_0zu0fj1._.js.map} +0 -0
  449. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1-7bj56._.js.map → 11mp_@anthropic-ai_sdk_0zxpgt0._.js.map} +0 -0
  450. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0x21fif._.js.map → 11mp_@anthropic-ai_sdk_10_cxcd._.js.map} +0 -0
  451. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0th0pyh._.js.map → 11mp_@anthropic-ai_sdk_10gb7d1._.js.map} +0 -0
  452. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0spr_aj._.js.map → 11mp_@anthropic-ai_sdk_12q70bs._.js.map} +0 -0
  453. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0qxmzg8._.js.map → 11mp_@anthropic-ai_sdk_149ltk3._.js.map} +0 -0
  454. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0nltdmf._.js.map → 11mp_@anthropic-ai_sdk_165_uiw._.js.map} +0 -0
  455. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0m-xqs_._.js.map → 11mp_@anthropic-ai_sdk_19w4zh6._.js.map} +0 -0
  456. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0l1p4c6._.js.map → 11mp_@anthropic-ai_sdk_1adck-s._.js.map} +0 -0
  457. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0i7ckik._.js.map → 11mp_@anthropic-ai_sdk_1c2dwoi._.js.map} +0 -0
  458. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0i4w8fv._.js.map → 11mp_@anthropic-ai_sdk_1d9lw_2._.js.map} +0 -0
  459. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0el8pm6._.js.map → 11mp_@anthropic-ai_sdk_1db6a7p._.js.map} +0 -0
  460. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0e5qkuv._.js.map → 11mp_@anthropic-ai_sdk_1h2f90s._.js.map} +0 -0
  461. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0ckxhy7._.js.map → 11mp_@anthropic-ai_sdk_1k5_i1z._.js.map} +0 -0
  462. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0cd5lu7._.js.map → 11mp_@anthropic-ai_sdk_1p3mv6i._.js.map} +0 -0
  463. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0br_1fc._.js.map → 11mp_@anthropic-ai_sdk_1qoom5s._.js.map} +0 -0
  464. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0aykesf._.js.map → 11mp_@anthropic-ai_sdk_1qsbcbe._.js.map} +0 -0
  465. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0_jynr-._.js.map → 11mp_@anthropic-ai_sdk_1rk0x59._.js.map} +0 -0
  466. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0_5gzfy._.js.map → 11mp_@anthropic-ai_sdk_1sd98mi._.js.map} +0 -0
  467. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_07fgg-l._.js.map → 11mp_@anthropic-ai_sdk_1sumqg8._.js.map} +0 -0
  468. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_05oneea._.js.map → 11mp_@anthropic-ai_sdk_1t-rt4q._.js.map} +0 -0
  469. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_05iv23g._.js.map → 11mp_@anthropic-ai_sdk_1tr-k4y._.js.map} +0 -0
  470. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_02lx_j3._.js.map → 11mp_@anthropic-ai_sdk_1xk3c39._.js.map} +0 -0
  471. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_01gyja3._.js.map → 11mp_@anthropic-ai_sdk_206l10_._.js.map} +0 -0
  472. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0-r4g2t._.js.map → 11mp_@anthropic-ai_sdk_20giys9._.js.map} +0 -0
  473. /package/.next/server/chunks/{[root-of-the-server]__0zy73pu._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_018s_10._.js.map} +0 -0
  474. /package/.next/server/chunks/{[root-of-the-server]__06ndlro._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_08d6i7w._.js.map} +0 -0
  475. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1xx8_-m._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_09_fd9g._.js.map} +0 -0
  476. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1x_fy5x._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0eopml6._.js.map} +0 -0
  477. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1x_0sf4._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0f5epel._.js.map} +0 -0
  478. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1tzpss1._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0okfnhu._.js.map} +0 -0
  479. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1pdl5qg._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0s8-ha8._.js.map} +0 -0
  480. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1jxtz_6._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0ujs27r._.js.map} +0 -0
  481. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1dm3so9._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0uo7rs8._.js.map} +0 -0
  482. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1ck6z1z._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0vyq_2d._.js.map} +0 -0
  483. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1ao3e3l._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0w3js74._.js.map} +0 -0
  484. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_13lk7wf._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0xa4-uq._.js.map} +0 -0
  485. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_13-fsm5._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_113y3so._.js.map} +0 -0
  486. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0zu51ny._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_12qcr96._.js.map} +0 -0
  487. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0z31-c0._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_13ixdy8._.js.map} +0 -0
  488. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0ybdfbv._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1708vst._.js.map} +0 -0
  489. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0vilstf._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1_rdguq._.js.map} +0 -0
  490. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0ncvuil._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1bgpe23._.js.map} +0 -0
  491. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0n6aq49._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1f-tphn._.js.map} +0 -0
  492. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0iy714m._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1h1pqdh._.js.map} +0 -0
  493. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0ew4_uw._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1hfj_1d._.js.map} +0 -0
  494. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0dr79hc._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1ih2qzz._.js.map} +0 -0
  495. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0_va-1q._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1jatyl1._.js.map} +0 -0
  496. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_07kod-g._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1v1zbha._.js.map} +0 -0
  497. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_06kgcr0._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1vyqs5z._.js.map} +0 -0
  498. /package/.next/server/chunks/{[root-of-the-server]__0xldguc._.js.map → [root-of-the-server]__00usbi3._.js.map} +0 -0
  499. /package/.next/server/chunks/{[root-of-the-server]__0i1yba1._.js.map → [root-of-the-server]__04cwur0._.js.map} +0 -0
  500. /package/.next/server/chunks/{[root-of-the-server]__1yh-4vk._.js.map → [root-of-the-server]__04ri_ci._.js.map} +0 -0
  501. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_00nr0dy._.js.map → [root-of-the-server]__05-be3n._.js.map} +0 -0
  502. /package/.next/server/chunks/{[root-of-the-server]__0wc_gnr._.js.map → [root-of-the-server]__0756_60._.js.map} +0 -0
  503. /package/.next/server/chunks/{[root-of-the-server]__0pz59qo._.js.map → [root-of-the-server]__089ay-q._.js.map} +0 -0
  504. /package/.next/server/chunks/{[root-of-the-server]__0cxmrop._.js.map → [root-of-the-server]__0d4t4q6._.js.map} +0 -0
  505. /package/.next/server/chunks/{[root-of-the-server]__1ef-hw_._.js.map → [root-of-the-server]__0dgwykw._.js.map} +0 -0
  506. /package/.next/server/chunks/{[root-of-the-server]__1qcy2l0._.js.map → [root-of-the-server]__0s-j6z-._.js.map} +0 -0
  507. /package/.next/server/chunks/{[root-of-the-server]__1zhd93r._.js.map → [root-of-the-server]__0yaxn8g._.js.map} +0 -0
  508. /package/.next/server/chunks/{[root-of-the-server]__0rh8yfn._.js.map → [root-of-the-server]__162_l0k._.js.map} +0 -0
  509. /package/.next/server/chunks/{[root-of-the-server]__0hk-9ll._.js.map → [root-of-the-server]__16smlkg._.js.map} +0 -0
  510. /package/.next/server/chunks/{[root-of-the-server]__11rp-qx._.js.map → [root-of-the-server]__19yo85m._.js.map} +0 -0
  511. /package/.next/server/chunks/{[root-of-the-server]__1sn6-7a._.js.map → [root-of-the-server]__1mnzsbh._.js.map} +0 -0
  512. /package/.next/server/chunks/{[root-of-the-server]__11nbc9e._.js.map → [root-of-the-server]__1ntu_6r._.js.map} +0 -0
  513. /package/.next/server/chunks/{[root-of-the-server]__1wbho9e._.js.map → [root-of-the-server]__1s0t8r3._.js.map} +0 -0
  514. /package/.next/server/chunks/{[root-of-the-server]__1r67yrn._.js.map → [root-of-the-server]__1sd3l-d._.js.map} +0 -0
  515. /package/.next/server/chunks/{[root-of-the-server]__0rikmqn._.js.map → [root-of-the-server]__1vzxnjb._.js.map} +0 -0
  516. /package/.next/server/chunks/{[root-of-the-server]__08v3p50._.js.map → [root-of-the-server]__1zeys20._.js.map} +0 -0
  517. /package/.next/server/chunks/ssr/{_0me5_6x._.js.map → _0-_04ia._.js.map} +0 -0
  518. /package/.next/server/chunks/ssr/{_190c11r._.js.map → _0cv0ugs._.js.map} +0 -0
  519. /package/.next/server/chunks/ssr/{_1feybpz._.js.map → _1hm7p_8._.js.map} +0 -0
  520. /package/.next/server/chunks/ssr/{_1cz8dnu._.js.map → _1s-2jub._.js.map} +0 -0
  521. /package/.next/static/{5hNes2Kijr5IvUPPw-ez9 → P1gxTEpKVh-OOtIXC432U}/_buildManifest.js +0 -0
  522. /package/.next/static/{5hNes2Kijr5IvUPPw-ez9 → P1gxTEpKVh-OOtIXC432U}/_clientMiddlewareManifest.js +0 -0
  523. /package/.next/static/{5hNes2Kijr5IvUPPw-ez9 → P1gxTEpKVh-OOtIXC432U}/_ssgManifest.js +0 -0
@@ -0,0 +1,3 @@
1
+ module.exports=[956068,(e,o,d)=>{}];
2
+
3
+ //# sourceMappingURL=_next-internal_server_app_api_memory_restore_route_actions_0679kmo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ module.exports=[900738,(e,o,d)=>{}];
2
+
3
+ //# sourceMappingURL=_next-internal_server_app_api_memory_versions_route_actions_13mix75.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":""}
@@ -1,3 +1,3 @@
1
1
  module.exports=[658978,a=>{"use strict";var b=a.i(256857);let c={name:"calendar",size:24,node:[["path",{d:"M8 2v3",key:"1ioesn"}],["path",{d:"M16 2v3",key:"otl347"}],["rect",{x:"3",y:"3",width:"18",height:"18",rx:"2",key:"h1oib"}],["path",{d:"M3 9h18",key:"1pudct"}]]};c.node;let d=(0,b.default)(c);a.s(["Calendar",0,d],658978)},388637,a=>{"use strict";var b=a.i(256857);let c={name:"circle-dashed",size:24,node:[["path",{d:"M10.1 2.182a10 10 0 0 1 3.8 0",key:"5ilxe3"}],["path",{d:"M13.9 21.818a10 10 0 0 1-3.8 0",key:"11zvb9"}],["path",{d:"M17.609 3.721a10 10 0 0 1 2.69 2.7",key:"1iw5b2"}],["path",{d:"M2.182 13.9a10 10 0 0 1 0-3.8",key:"c0bmvh"}],["path",{d:"M20.279 17.609a10 10 0 0 1-2.7 2.69",key:"1ruxm7"}],["path",{d:"M21.818 10.1a10 10 0 0 1 0 3.8",key:"qkgqxc"}],["path",{d:"M3.721 6.391a10 10 0 0 1 2.7-2.69",key:"1mcia2"}],["path",{d:"M6.391 20.279a10 10 0 0 1-2.69-2.7",key:"1fvljs"}]]};c.node;let d=(0,b.default)(c);a.s(["CircleDashed",0,d],388637)},763747,787714,891397,a=>{"use strict";var b=a.i(256857);let c={name:"ellipsis",size:24,node:[["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}],["circle",{cx:"19",cy:"12",r:"1",key:"1wjl8i"}],["circle",{cx:"5",cy:"12",r:"1",key:"1pcz8c"}]],aliases:["more-horizontal"]};c.node;let d=(0,b.default)(c);a.s(["MoreHorizontal",0,d],763747);var e=a.i(662145),f=a.i(368114),g=a.i(404687),h=a.i(174897),i=a.i(425404),j=a.i(335732);let k=a=>a.stopPropagation(),l="inline-flex min-w-0 items-center gap-1 rounded-sm px-1 -mx-1 text-left outline-hidden hover:bg-surface2 focus-visible:ring-2 focus-visible:ring-accent/60";function m({label:a,value:b,options:c,onChange:d,children:g,className:h}){return(0,e.jsxs)(j.DropdownMenu,{children:[(0,e.jsx)(j.DropdownMenuTrigger,{asChild:!0,children:(0,e.jsx)("button",{type:"button","aria-label":a,draggable:!1,onClick:k,onKeyDown:k,onPointerDown:k,className:(0,f.cn)(l,h),children:g})}),(0,e.jsx)(j.DropdownMenuContent,{align:"start",className:"max-h-72 w-48 overflow-y-auto",onClick:k,onKeyDown:k,children:c.map(a=>(0,e.jsxs)(j.DropdownMenuItem,{onSelect:()=>{a.value!==b&&d(a.value)},children:[a.node??a.label,a.value===b&&(0,e.jsx)(i.Check,{className:"ml-auto size-3.5 text-muted","aria-hidden":!0})]},a.value))})]})}a.s(["InlineDate",0,function({label:a,value:b,onChange:c,children:d,className:g}){let[i,j]=(0,h.useState)(!1),[m,n]=(0,h.useState)(b??""),o=()=>{j(!1),(m||null)!==b&&c(m||null)};return i?(0,e.jsx)("input",{type:"date",autoFocus:!0,"aria-label":a,value:m,onChange:a=>n(a.target.value),onClick:k,onPointerDown:k,onKeyDown:a=>{k(a),"Enter"===a.key&&(a.preventDefault(),o()),"Escape"===a.key&&(a.preventDefault(),j(!1))},onBlur:o,className:"h-6 rounded-sm border border-accent/60 bg-bg px-1 font-mono text-[11px] text-txt scheme-light outline-hidden dark:scheme-dark"}):(0,e.jsx)("button",{type:"button","aria-label":a,draggable:!1,onClick:a=>{k(a),n(b??""),j(!0)},onKeyDown:k,className:(0,f.cn)(l,g),children:d})},"InlineSelect",0,m,"InlineText",0,function({label:a,value:b,onChange:c,children:d,className:g,placeholder:i,startEditing:j=!1,onCancel:m}){let[n,o]=(0,h.useState)(j),[p,q]=(0,h.useState)(b??""),r=()=>{o(!1);let a=p.trim()||null;a!==b?c(a):a||m?.()};return n?(0,e.jsx)("input",{autoFocus:!0,"aria-label":a,value:p,placeholder:i,onChange:a=>q(a.target.value),onClick:k,onPointerDown:k,onKeyDown:a=>{k(a),"Enter"===a.key&&(a.preventDefault(),r()),"Escape"===a.key&&(a.preventDefault(),o(!1),m?.())},onBlur:r,className:"h-7 w-full min-w-0 rounded-sm border border-accent/60 bg-bg px-1.5 text-[13px] text-txt outline-hidden placeholder:text-muted"}):(0,e.jsx)("button",{type:"button","aria-label":a,draggable:!1,onClick:a=>{k(a),q(b??""),o(!0)},onKeyDown:k,className:(0,f.cn)(l,g),children:d})}],787714);let n={P0:"bg-danger/12 text-danger",P1:"bg-amber/12 text-amber",P2:"bg-surface2 text-txt",P3:"bg-surface2 text-muted"};function o({priority:a,className:b}){return(0,e.jsx)("span",{className:(0,f.cn)("inline-flex h-4 shrink-0 items-center rounded-sm px-1 font-mono text-[10px] font-medium leading-none",n[a],b),children:a})}let p=[...g.PRIORITIES.map(a=>({value:a,label:a,node:(0,e.jsx)(o,{priority:a})})),{value:"",label:"No priority",node:(0,e.jsx)("span",{className:"text-muted",children:"No priority"})}];a.s(["PriorityBadge",0,o,"PriorityField",0,function({label:a,value:b,onChange:c,empty:d}){return(0,e.jsx)(m,{label:a,value:b??"",options:p,onChange:a=>c(a||null),children:b?(0,e.jsx)(o,{priority:b}):d??(0,e.jsx)("span",{className:"text-muted",children:"—"})})}],891397)},340753,a=>{"use strict";var b=a.i(256857);let c={name:"list-checks",size:24,node:[["path",{d:"M13 5h8",key:"a7qcls"}],["path",{d:"M13 12h8",key:"h98zly"}],["path",{d:"M13 19h8",key:"c3s6r1"}],["path",{d:"m3 17 2 2 4-4",key:"1jhpwq"}],["path",{d:"m3 7 2 2 4-4",key:"1obspn"}]]};c.node;let d=(0,b.default)(c);a.s(["ListChecks",0,d],340753)},441852,a=>{"use strict";var b=a.i(256857);let c={name:"message-square",size:24,node:[["path",{d:"M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z",key:"18887p"}]]};c.node;let d=(0,b.default)(c);a.s(["MessageSquare",0,d],441852)},711366,a=>{"use strict";var b=a.i(256857);let c={name:"minus",size:24,node:[["path",{d:"M5 12h14",key:"1ays0h"}]]};c.node;let d=(0,b.default)(c);a.s(["Minus",0,d],711366)},661661,a=>{"use strict";var b=a.i(256857);let c={name:"pencil",size:24,node:[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]};c.node;let d=(0,b.default)(c);a.s(["Pencil",0,d],661661)},227246,a=>{"use strict";var b=a.i(256857);let c={name:"refresh-cw",size:24,node:[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]};c.node;let d=(0,b.default)(c);a.s(["RefreshCw",0,d],227246)},340933,a=>{"use strict";var b=a.i(256857);let c={name:"triangle-alert",size:24,node:[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]],aliases:["alert-triangle"]};c.node;let d=(0,b.default)(c);a.s(["AlertTriangle",0,d],340933)},578520,a=>{"use strict";var b=a.i(662145),c=a.i(892678),d=a.i(256857);let e={name:"file-pen",size:24,node:[["path",{d:"M12.659 22H18a2 2 0 0 0 2-2V8a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 14 2H6a2 2 0 0 0-2 2v9.34",key:"o6klzx"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M10.378 12.622a1 1 0 0 1 3 3.003L8.36 20.637a2 2 0 0 1-.854.506l-2.867.837a.5.5 0 0 1-.62-.62l.836-2.869a2 2 0 0 1 .506-.853z",key:"zhnas1"}]],aliases:["file-edit"]};e.node;let f=(0,d.default)(e);var g=a.i(228705);let h={name:"file-search",size:24,node:[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["circle",{cx:"11.5",cy:"14.5",r:"2.5",key:"1bq0ko"}],["path",{d:"M13.3 16.3 15 18",key:"2quom7"}]]};h.node;let i=(0,d.default)(h);var j=a.i(926128);let k={name:"file-x",size:24,node:[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"m14.5 12.5-5 5",key:"b62r18"}],["path",{d:"m9.5 12.5 5 5",key:"1rk7el"}]]};k.node;let l=(0,d.default)(k);var m=a.i(340753),n=a.i(899593),o=a.i(909898),p=a.i(227246),q=a.i(471617),r=a.i(842717),s=a.i(173628);let t={task_updated:m.ListChecks,decision_logged:q.Scale,memory_updated:r.Brain,doc_read:i,doc_created:g.FilePlus,doc_updated:j.FileText,doc_deleted:l,doc_renamed:f,session_start:o.Plug,registry_rebuilt:p.RefreshCw,roadmap_updated:n.Map},u=a=>new Date(a).toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",hourCycle:"h23"});a.s(["ActivityEventRow",0,function({event:a,showActor:d=!1}){let e=t[a.type]??j.FileText;return(0,b.jsxs)("div",{className:"grid grid-cols-[2.75rem_1.5rem_minmax(0,1fr)] items-start py-1.5",children:[(0,b.jsx)("time",{dateTime:a.timestamp,title:new Date(a.timestamp).toLocaleString(),className:"pt-px text-right font-mono text-[11px] leading-5 text-muted tabular-nums",children:u(a.timestamp)}),(0,b.jsx)("span",{className:"flex justify-center pt-[3px]",children:"task_updated"===a.type&&a.taskStatus?(0,b.jsx)(s.StatusIcon,{status:a.taskStatus}):(0,b.jsx)(e,{className:"size-3.5 text-muted","aria-hidden":!0})}),(0,b.jsxs)("div",{className:"flex min-w-0 flex-col gap-0.5 sm:flex-row sm:items-baseline sm:gap-2",children:[(0,b.jsx)("span",{className:"min-w-0 text-sm leading-5 text-txt sm:shrink-0 sm:max-w-[60%] sm:truncate",children:a.title}),a.detail&&(0,b.jsx)("span",{className:"min-w-0 truncate text-xs leading-5 text-muted",children:a.detail}),d&&"human"===a.actor&&(0,b.jsxs)("span",{className:"flex shrink-0 items-center gap-1 font-mono text-[10px] text-muted sm:ml-auto",children:[(0,b.jsx)(c.User,{className:"size-3","aria-hidden":!0}),"you"]})]})]})},"clock",0,u,"timeAgo",0,function(a){let b=(Date.now()-new Date(a).getTime())/1e3;return b<60?"just now":b<3600?`${Math.floor(b/60)}m ago`:b<86400?`${Math.floor(b/3600)}h ago`:`${Math.floor(b/86400)}d ago`}],578520)},815122,a=>{"use strict";var b=a.i(662145),c=a.i(795667),d=a.i(108280),e=a.i(368114),f=a.i(685698),g=a.i(598984);let h={running:"Agent working","needs-answer":"Agent needs you",review:"Plan to review"};a.s(["AgentDot",0,function({attach:a}){let c=(0,f.useItemAgent)(a);return c?(0,b.jsx)(g.StatusMarker,{status:c.status,label:h[c.status]}):null},"AgentMark",0,function({attach:a,className:g}){let i=(0,f.useItemAgent)(a),{show:j}=(0,f.useChats)();if(!i)return null;let k=h[i.status];return(0,b.jsxs)("button",{type:"button",onClick:a=>{a.stopPropagation(),j(i.chatId)},title:`${k} \xb7 open chat`,"aria-label":`${k}, open chat`,className:(0,e.cn)("nodrag inline-flex shrink-0 items-center gap-1 rounded-full border px-1.5 py-px font-mono text-[10px] leading-4 animate-fade-in transition-colors duration-(--duration-fast)","running"===i.status&&"border-accent/50 text-accent hover:bg-accent/10","needs-answer"===i.status&&"border-amber/50 text-amber hover:bg-amber/10","review"===i.status&&"border-accent/50 bg-accent/10 text-accent hover:bg-accent/20",g),children:["running"===i.status?(0,b.jsx)(d.Loader2,{className:"size-3 animate-spin","aria-hidden":!0}):(0,b.jsx)(c.Bot,{className:"size-3","aria-hidden":!0}),k]})}])},192698,a=>{"use strict";var b=a.i(662145),c=a.i(368114);function d({properties:a,className:e,children:f}){let g=a.filter(a=>null!==a.value&&void 0!==a.value&&!1!==a.value);return 0!==g.length||f?(0,b.jsxs)("dl",{className:(0,c.cn)("grid grid-cols-[minmax(6.5rem,8.5rem)_minmax(0,1fr)] items-center gap-x-2 text-[13px]",e),children:[g.map(a=>(0,b.jsxs)("div",{className:"contents",children:[(0,b.jsxs)("dt",{className:"flex min-h-8 min-w-0 items-center gap-2 text-muted",children:[a.icon&&(0,b.jsx)(a.icon,{className:"size-3.5 shrink-0","aria-hidden":!0}),(0,b.jsx)("span",{className:"min-w-0 truncate",children:a.label})]}),(0,b.jsx)("dd",{className:"flex min-h-8 min-w-0 items-center gap-2 text-txt",children:a.value})]},a.id??String(a.label))),f&&(0,b.jsx)("div",{className:"col-span-2 flex min-h-8 items-center",children:f})]}):null}a.s(["ItemPanelHeader",0,function({kicker:a,title:e,menu:f,properties:g,className:h,children:i}){return(0,b.jsxs)("header",{"data-item-header":!0,className:(0,c.cn)("flex shrink-0 flex-col gap-2 border-b border-border px-5 pb-4 pt-4",h),children:[(0,b.jsxs)("div",{className:"flex min-h-7 items-center gap-2 pr-8 font-mono text-[11px] text-muted",children:[(0,b.jsx)("div",{className:"flex min-w-0 flex-1 items-center gap-1",children:a}),f]}),(0,b.jsx)("div",{className:"text-base font-semibold leading-snug text-txt",children:e}),(0,b.jsx)(d,{properties:g,className:"-my-0.5"}),i]})},"PropertyRows",0,d])}];
2
2
 
3
- //# sourceMappingURL=_0me5_6x._.js.map
3
+ //# sourceMappingURL=_0-_04ia._.js.map
@@ -1,3 +1,3 @@
1
1
  module.exports=[658978,a=>{"use strict";var b=a.i(256857);let c={name:"calendar",size:24,node:[["path",{d:"M8 2v3",key:"1ioesn"}],["path",{d:"M16 2v3",key:"otl347"}],["rect",{x:"3",y:"3",width:"18",height:"18",rx:"2",key:"h1oib"}],["path",{d:"M3 9h18",key:"1pudct"}]]};c.node;let d=(0,b.default)(c);a.s(["Calendar",0,d],658978)},388637,a=>{"use strict";var b=a.i(256857);let c={name:"circle-dashed",size:24,node:[["path",{d:"M10.1 2.182a10 10 0 0 1 3.8 0",key:"5ilxe3"}],["path",{d:"M13.9 21.818a10 10 0 0 1-3.8 0",key:"11zvb9"}],["path",{d:"M17.609 3.721a10 10 0 0 1 2.69 2.7",key:"1iw5b2"}],["path",{d:"M2.182 13.9a10 10 0 0 1 0-3.8",key:"c0bmvh"}],["path",{d:"M20.279 17.609a10 10 0 0 1-2.7 2.69",key:"1ruxm7"}],["path",{d:"M21.818 10.1a10 10 0 0 1 0 3.8",key:"qkgqxc"}],["path",{d:"M3.721 6.391a10 10 0 0 1 2.7-2.69",key:"1mcia2"}],["path",{d:"M6.391 20.279a10 10 0 0 1-2.69-2.7",key:"1fvljs"}]]};c.node;let d=(0,b.default)(c);a.s(["CircleDashed",0,d],388637)},763747,787714,891397,a=>{"use strict";var b=a.i(256857);let c={name:"ellipsis",size:24,node:[["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}],["circle",{cx:"19",cy:"12",r:"1",key:"1wjl8i"}],["circle",{cx:"5",cy:"12",r:"1",key:"1pcz8c"}]],aliases:["more-horizontal"]};c.node;let d=(0,b.default)(c);a.s(["MoreHorizontal",0,d],763747);var e=a.i(662145),f=a.i(368114),g=a.i(404687),h=a.i(174897),i=a.i(425404),j=a.i(335732);let k=a=>a.stopPropagation(),l="inline-flex min-w-0 items-center gap-1 rounded-sm px-1 -mx-1 text-left outline-hidden hover:bg-surface2 focus-visible:ring-2 focus-visible:ring-accent/60";function m({label:a,value:b,options:c,onChange:d,children:g,className:h}){return(0,e.jsxs)(j.DropdownMenu,{children:[(0,e.jsx)(j.DropdownMenuTrigger,{asChild:!0,children:(0,e.jsx)("button",{type:"button","aria-label":a,draggable:!1,onClick:k,onKeyDown:k,onPointerDown:k,className:(0,f.cn)(l,h),children:g})}),(0,e.jsx)(j.DropdownMenuContent,{align:"start",className:"max-h-72 w-48 overflow-y-auto",onClick:k,onKeyDown:k,children:c.map(a=>(0,e.jsxs)(j.DropdownMenuItem,{onSelect:()=>{a.value!==b&&d(a.value)},children:[a.node??a.label,a.value===b&&(0,e.jsx)(i.Check,{className:"ml-auto size-3.5 text-muted","aria-hidden":!0})]},a.value))})]})}a.s(["InlineDate",0,function({label:a,value:b,onChange:c,children:d,className:g}){let[i,j]=(0,h.useState)(!1),[m,n]=(0,h.useState)(b??""),o=()=>{j(!1),(m||null)!==b&&c(m||null)};return i?(0,e.jsx)("input",{type:"date",autoFocus:!0,"aria-label":a,value:m,onChange:a=>n(a.target.value),onClick:k,onPointerDown:k,onKeyDown:a=>{k(a),"Enter"===a.key&&(a.preventDefault(),o()),"Escape"===a.key&&(a.preventDefault(),j(!1))},onBlur:o,className:"h-6 rounded-sm border border-accent/60 bg-bg px-1 font-mono text-[11px] text-txt scheme-light outline-hidden dark:scheme-dark"}):(0,e.jsx)("button",{type:"button","aria-label":a,draggable:!1,onClick:a=>{k(a),n(b??""),j(!0)},onKeyDown:k,className:(0,f.cn)(l,g),children:d})},"InlineSelect",0,m,"InlineText",0,function({label:a,value:b,onChange:c,children:d,className:g,placeholder:i,startEditing:j=!1,onCancel:m}){let[n,o]=(0,h.useState)(j),[p,q]=(0,h.useState)(b??""),r=()=>{o(!1);let a=p.trim()||null;a!==b?c(a):a||m?.()};return n?(0,e.jsx)("input",{autoFocus:!0,"aria-label":a,value:p,placeholder:i,onChange:a=>q(a.target.value),onClick:k,onPointerDown:k,onKeyDown:a=>{k(a),"Enter"===a.key&&(a.preventDefault(),r()),"Escape"===a.key&&(a.preventDefault(),o(!1),m?.())},onBlur:r,className:"h-7 w-full min-w-0 rounded-sm border border-accent/60 bg-bg px-1.5 text-[13px] text-txt outline-hidden placeholder:text-muted"}):(0,e.jsx)("button",{type:"button","aria-label":a,draggable:!1,onClick:a=>{k(a),q(b??""),o(!0)},onKeyDown:k,className:(0,f.cn)(l,g),children:d})}],787714);let n={P0:"bg-danger/12 text-danger",P1:"bg-amber/12 text-amber",P2:"bg-surface2 text-txt",P3:"bg-surface2 text-muted"};function o({priority:a,className:b}){return(0,e.jsx)("span",{className:(0,f.cn)("inline-flex h-4 shrink-0 items-center rounded-sm px-1 font-mono text-[10px] font-medium leading-none",n[a],b),children:a})}let p=[...g.PRIORITIES.map(a=>({value:a,label:a,node:(0,e.jsx)(o,{priority:a})})),{value:"",label:"No priority",node:(0,e.jsx)("span",{className:"text-muted",children:"No priority"})}];a.s(["PriorityBadge",0,o,"PriorityField",0,function({label:a,value:b,onChange:c,empty:d}){return(0,e.jsx)(m,{label:a,value:b??"",options:p,onChange:a=>c(a||null),children:b?(0,e.jsx)(o,{priority:b}):d??(0,e.jsx)("span",{className:"text-muted",children:"—"})})}],891397)},717143,a=>{"use strict";var b=a.i(256857);let c={name:"folder-input",size:24,node:[["path",{d:"M2 9V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-1",key:"fm4g5t"}],["path",{d:"M2 13h10",key:"pgb2dq"}],["path",{d:"m9 16 3-3-3-3",key:"6m91ic"}]]};c.node;let d=(0,b.default)(c);a.s(["FolderInput",0,d],717143)},340753,a=>{"use strict";var b=a.i(256857);let c={name:"list-checks",size:24,node:[["path",{d:"M13 5h8",key:"a7qcls"}],["path",{d:"M13 12h8",key:"h98zly"}],["path",{d:"M13 19h8",key:"c3s6r1"}],["path",{d:"m3 17 2 2 4-4",key:"1jhpwq"}],["path",{d:"m3 7 2 2 4-4",key:"1obspn"}]]};c.node;let d=(0,b.default)(c);a.s(["ListChecks",0,d],340753)},553415,a=>{"use strict";var b=a.i(256857);let c={name:"list-tree",size:24,node:[["path",{d:"M8 5h13",key:"1pao27"}],["path",{d:"M13 12h8",key:"h98zly"}],["path",{d:"M13 19h8",key:"c3s6r1"}],["path",{d:"M3 10a2 2 0 0 0 2 2h3",key:"1npucw"}],["path",{d:"M3 5v12a2 2 0 0 0 2 2h3",key:"x1gjn2"}]]};c.node;let d=(0,b.default)(c);a.s(["ListTree",0,d],553415)},441852,a=>{"use strict";var b=a.i(256857);let c={name:"message-square",size:24,node:[["path",{d:"M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z",key:"18887p"}]]};c.node;let d=(0,b.default)(c);a.s(["MessageSquare",0,d],441852)},661661,a=>{"use strict";var b=a.i(256857);let c={name:"pencil",size:24,node:[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]};c.node;let d=(0,b.default)(c);a.s(["Pencil",0,d],661661)},551729,a=>{"use strict";var b=a.i(256857);let c={name:"sparkles",size:24,node:[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z",key:"1s2grr"}],["path",{d:"M20 2v4",key:"1rf3ol"}],["path",{d:"M22 4h-4",key:"gwowj6"}],["circle",{cx:"4",cy:"20",r:"2",key:"6kqj1y"}]],aliases:["stars"]};c.node;let d=(0,b.default)(c);a.s(["Sparkles",0,d],551729)},340933,a=>{"use strict";var b=a.i(256857);let c={name:"triangle-alert",size:24,node:[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]],aliases:["alert-triangle"]};c.node;let d=(0,b.default)(c);a.s(["AlertTriangle",0,d],340933)},815122,a=>{"use strict";var b=a.i(662145),c=a.i(795667),d=a.i(108280),e=a.i(368114),f=a.i(685698),g=a.i(598984);let h={running:"Agent working","needs-answer":"Agent needs you",review:"Plan to review"};a.s(["AgentDot",0,function({attach:a}){let c=(0,f.useItemAgent)(a);return c?(0,b.jsx)(g.StatusMarker,{status:c.status,label:h[c.status]}):null},"AgentMark",0,function({attach:a,className:g}){let i=(0,f.useItemAgent)(a),{show:j}=(0,f.useChats)();if(!i)return null;let k=h[i.status];return(0,b.jsxs)("button",{type:"button",onClick:a=>{a.stopPropagation(),j(i.chatId)},title:`${k} \xb7 open chat`,"aria-label":`${k}, open chat`,className:(0,e.cn)("nodrag inline-flex shrink-0 items-center gap-1 rounded-full border px-1.5 py-px font-mono text-[10px] leading-4 animate-fade-in transition-colors duration-(--duration-fast)","running"===i.status&&"border-accent/50 text-accent hover:bg-accent/10","needs-answer"===i.status&&"border-amber/50 text-amber hover:bg-amber/10","review"===i.status&&"border-accent/50 bg-accent/10 text-accent hover:bg-accent/20",g),children:["running"===i.status?(0,b.jsx)(d.Loader2,{className:"size-3 animate-spin","aria-hidden":!0}):(0,b.jsx)(c.Bot,{className:"size-3","aria-hidden":!0}),k]})}])},21215,a=>{"use strict";var b=a.i(662145),c=a.i(368114);a.s(["EmptyState",0,function({icon:a,message:d,subMessage:e,bordered:f}){return(0,b.jsxs)("div",{className:(0,c.cn)("text-center py-16 text-muted text-sm",f&&"border border-dashed border-border rounded-xl"),children:[(0,b.jsx)("p",{className:"text-3xl mb-3",children:a}),(0,b.jsx)("p",{children:d}),e&&(0,b.jsx)("p",{className:"text-xs mt-1",children:e})]})}])},192698,a=>{"use strict";var b=a.i(662145),c=a.i(368114);function d({properties:a,className:e,children:f}){let g=a.filter(a=>null!==a.value&&void 0!==a.value&&!1!==a.value);return 0!==g.length||f?(0,b.jsxs)("dl",{className:(0,c.cn)("grid grid-cols-[minmax(6.5rem,8.5rem)_minmax(0,1fr)] items-center gap-x-2 text-[13px]",e),children:[g.map(a=>(0,b.jsxs)("div",{className:"contents",children:[(0,b.jsxs)("dt",{className:"flex min-h-8 min-w-0 items-center gap-2 text-muted",children:[a.icon&&(0,b.jsx)(a.icon,{className:"size-3.5 shrink-0","aria-hidden":!0}),(0,b.jsx)("span",{className:"min-w-0 truncate",children:a.label})]}),(0,b.jsx)("dd",{className:"flex min-h-8 min-w-0 items-center gap-2 text-txt",children:a.value})]},a.id??String(a.label))),f&&(0,b.jsx)("div",{className:"col-span-2 flex min-h-8 items-center",children:f})]}):null}a.s(["ItemPanelHeader",0,function({kicker:a,title:e,menu:f,properties:g,className:h,children:i}){return(0,b.jsxs)("header",{"data-item-header":!0,className:(0,c.cn)("flex shrink-0 flex-col gap-2 border-b border-border px-5 pb-4 pt-4",h),children:[(0,b.jsxs)("div",{className:"flex min-h-7 items-center gap-2 pr-8 font-mono text-[11px] text-muted",children:[(0,b.jsx)("div",{className:"flex min-w-0 flex-1 items-center gap-1",children:a}),f]}),(0,b.jsx)("div",{className:"text-base font-semibold leading-snug text-txt",children:e}),(0,b.jsx)(d,{properties:g,className:"-my-0.5"}),i]})},"PropertyRows",0,d])}];
2
2
 
3
- //# sourceMappingURL=_190c11r._.js.map
3
+ //# sourceMappingURL=_0cv0ugs._.js.map
@@ -1,3 +1,3 @@
1
- module.exports=[508817,a=>{"use strict";var b=a.i(256857);let c={name:"book-open",size:24,node:[["path",{d:"M12 5v16",key:"1f6ucr"}],["path",{d:"M20.001 19A2 2 0 0022 17V5a2 2 0 00-1.999-2L16 3.002A5 5 0 0012 5a5 5 0 00-4-2H4a2 2 0 00-2 2v12a2 2 0 001.999 2H8a5 5 0 014 2 5 5 0 014-2z",key:"1fyvmf"}]]};c.node;let d=(0,b.default)(c);a.s(["BookOpen",0,d],508817)},717371,a=>{"use strict";var b=a.i(256857);let c={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"}]]};c.node;let d=(0,b.default)(c);a.s(["Flag",0,d],717371)},759658,a=>{"use strict";var b=a.i(256857);let c={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"}]]};c.node;let d=(0,b.default)(c);a.s(["Lightbulb",0,d],759658)},471617,a=>{"use strict";var b=a.i(256857);let c={name:"scale",size:24,node:[["path",{d:"M12 3v18",key:"108xh3"}],["path",{d:"m19 8 3 8a5 5 0 0 1-6 0zV7",key:"zcdpyk"}],["path",{d:"M3 7h1a17 17 0 0 0 8-2 17 17 0 0 0 8 2h1",key:"1yorad"}],["path",{d:"m5 8 3 8a5 5 0 0 1-6 0zV7",key:"eua70x"}],["path",{d:"M7 21h10",key:"1b0cd5"}]]};c.node;let d=(0,b.default)(c);a.s(["Scale",0,d],471617)},853244,a=>{"use strict";var b=a.i(256857);let c={name:"unlink",size:24,node:[["path",{d:"m18.84 12.25 1.72-1.71h-.02a5.004 5.004 0 0 0-.12-7.07 5.006 5.006 0 0 0-6.95 0l-1.72 1.71",key:"yqzxt4"}],["path",{d:"m5.17 11.75-1.71 1.71a5.004 5.004 0 0 0 .12 7.07 5.006 5.006 0 0 0 6.95 0l1.71-1.71",key:"4qinb0"}],["line",{x1:"8",x2:"8",y1:"2",y2:"5",key:"1041cp"}],["line",{x1:"2",x2:"5",y1:"8",y2:"8",key:"14m1p5"}],["line",{x1:"16",x2:"16",y1:"19",y2:"22",key:"rzdirn"}],["line",{x1:"19",x2:"22",y1:"16",y2:"16",key:"ox905f"}]]};c.node;let d=(0,b.default)(c);a.s(["Unlink",0,d],853244)},892678,a=>{"use strict";var b=a.i(256857);let c={name:"user",size:24,node:[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]]};c.node;let d=(0,b.default)(c);a.s(["User",0,d],892678)},731050,760093,a=>{"use strict";var b=a.i(662145),c=a.i(174897),d=a.i(913975),e=a.i(508817),f=a.i(926128),g=a.i(717371),h=a.i(759658),i=a.i(471617),j=a.i(544394),k=a.i(173628),l=a.i(147758);let m=[{kind:"task",label:"Tasks"},{kind:"epic",label:"Epics"},{kind:"adr",label:"ADRs"},{kind:"doc",label:"Docs"},{kind:"entry",label:"Entries"}],n={epic:g.Flag,adr:i.Scale,doc:f.FileText,entry:h.Lightbulb,task:e.BookOpen};function o(a){let b=(0,d.useRouter)(),{openDoc:c}=(0,j.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)}}a.s(["EntryRelated",0,function({entryId:a,onOpenEntry:d}){let{rootParam:e,summary:f,board:g}=(0,j.useApp)(),h=o(d),[i,p]=(0,c.useState)(null);(0,c.useEffect)(()=>{let b=!0;return fetch(`/api/memory/graph${e}&entry=${encodeURIComponent(a)}`).then(a=>a.json()).then(a=>{b&&p(a.nodes?a:{nodes:[],edges:[]})}).catch(a=>{console.warn("Loading entry links failed",a),b&&p({nodes:[],edges:[]})}),()=>{b=!1}},[a,e,f]);let q=(0,c.useMemo)(()=>new Map(Object.values(g??{}).flat().map(a=>[a.id,a])),[g]),r=(0,c.useMemo)(()=>new Map((i?.nodes??[]).map(a=>[a.id,a])),[i]),s=a=>a.map(a=>r.get(a)).filter(a=>!!a),t=s((i?.edges??[]).filter(b=>b.from===a).map(a=>a.to)),u=s((i?.edges??[]).filter(b=>b.to===a).map(a=>a.from)),v=a=>{let c="task"===a.kind?q.get(a.id):void 0,d=c?(0,l.displayStatus)(c):"epic"===a.kind?a.status:void 0,e=n[a.kind];return(0,b.jsx)("li",{children:(0,b.jsxs)("button",{type:"button",onClick:()=>h(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:[d?(0,b.jsx)(k.StatusIcon,{status:d,className:"size-3.5 shrink-0"}):(0,b.jsx)(e,{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)},w=(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}),m.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(v)})]},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===i?(0,b.jsx)("p",{className:"text-xs text-muted",children:"Loading links…"}):t.length||u.length?(0,b.jsxs)(b.Fragment,{children:[t.length>0&&w("Links to",t),u.length>0&&w("Linked from",u)]}):(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."})]})},"GROUPS",0,m,"KIND_ICON",0,n,"useOpenNode",0,o],731050);let p=new Set(["doc_updated","doc_created","doc_deleted","doc_renamed","task_created","task_updated","roadmap_updated","memory_updated","decision_logged"]),q=new Set;function r(a){return q.add(a),()=>{q.delete(a)}}function s(){return(0,c.useSyncExternalStore)(r,()=>0,()=>0)}let t=new Map;function u(a){let b=t.get(a);if(!b){let c=b=fetch(a).then(async a=>{let b=await a.json().catch(()=>null);if(!a.ok)throw Error(b?.error??`${a.status} ${a.statusText}`);return b});c.catch(()=>{t.get(a)===c&&t.delete(a)}),t.set(a,c)}return b}a.s(["LINK_EVENTS",0,p,"fetchLinkJson",0,u,"useDocLinks",0,function(a){let{rootParam:b}=(0,j.useApp)(),[d,e]=(0,c.useState)(null),f=s();return(0,c.useEffect)(()=>{if(!a)return;let c=!0;return u(`/api/docs/links${b}&path=${encodeURIComponent(a)}`).then(b=>{c&&e({path:a,links:{out:b.out??[],in:b.in??[],broken:b.broken??[],stale:b.stale??[],targets:b.targets??{}}})}).catch(b=>{console.warn("Loading doc links failed",b),c&&e({path:a,links:{out:[],in:[],broken:[],stale:[],targets:{}}})}),()=>{c=!1}},[a,b,f]),a&&d?.path===a?d.links:null},"useLinkGeneration",0,s],760093)},813722,853775,a=>{"use strict";var b=a.i(662145),c=a.i(795667),d=a.i(892678),e=a.i(368114);function f(a){return"human"===a?"human":a?.startsWith("ai:")?"ai":"none"}function g(a){return"human"===a?"Human":a?.startsWith("ai:")?a.slice(3):"No owner"}a.s(["ownerKind",0,f,"ownerLabel",0,g],853775),a.s(["OwnerChip",0,function({owner:a,className:h}){let i=f(a);if("none"===i)return null;let j="ai"===i?c.Bot:d.User;return(0,b.jsxs)("span",{title:`Owner: ${g(a)}`,className:(0,e.cn)("inline-flex items-center gap-1 text-[11px] text-muted",h),children:[(0,b.jsx)(j,{className:(0,e.cn)("size-3.5 shrink-0","ai"===i&&"text-accent"),"aria-hidden":!0}),g(a)]})}],813722)},692938,a=>{"use strict";let b=new Set(["a","b","c","x","y","z","path","name","slug","title","foo","bar","wikilinks","example"]),c=a=>String(Number(a)).padStart(3,"0");function d(a){return a.startsWith("ADR-")?`ADR-${c(a.slice(4))}`:a.startsWith("E")?`E${c(a.slice(1))}`:a}function e(a,b){let c,e=function(a){let b=[];for(let c of a.replace(/\\/g,"/").split("/"))if(c&&"."!==c)if(".."===c){if(!b.length)return null;b.pop()}else b.push(c);return b.join("/")}(a)??a,f=(e.split("/").pop()??e).replace(/\.md$/i,""),g=(/^#\s+(.+?)\s*$/m.exec(b)?.[1]??"").replace(/!?\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/\[\[([^\]|]+)(?:\|([^\]]+))?\]\]/g,(a,b,c)=>c??b).replace(/(\*\*|\*|~~|`)(\S(?:.*?\S)?)\1/g,"$2").replace(/(^|\W)(__|_)(\S(?:.*?\S)?)\2(?=\W|$)/g,"$1$3").replace(/<[^>]+>/g,"").trim(),h=/[^.][.!]$/.test(g)?"":g,i=a=>h.replace(RegExp(`^${a}\\s*[:—–-]\\s*`),"")||f;return(c=/^plans\/tasks\/(T\d{3,})[^/]*\.md$/.exec(e))?{id:c[1],kind:"task",label:i(c[1]),path:e}:(c=/^plans\/roadmap\/(R\d{3,})[^/]*\.md$/.exec(e))?{id:c[1],kind:"epic",label:i(c[1]),path:e}:(c=/^memory\/entries\/(E\d+)[^/]*\.md$/.exec(e))?{id:d(c[1]),kind:"entry",label:i(c[1]),path:e}:(c=/(?:^|\/)(ADR-\d+)[^/]*\.md$/.exec(e))?{id:d(c[1]),kind:"adr",label:i(c[1]),path:e}:{id:e,kind:"doc",label:h||f,path:e}}new WeakMap;let f=["doc","adr"],g=/^(?:Entry )?(E\d+|T\d{3,}|R\d{3,}|ADR-\d+)\b/,h=new Set(["doc_updated","doc_created"]);a.s(["GRAPH_DEFAULT_KINDS",0,f,"docNode",0,e,"graphHref",0,function(a){let b=new URLSearchParams({node:a,focus:"1"}),c=e(a,"").kind;return f.includes(c)||b.set("kinds",[...f,c].join(",")),`/graph?${b}`},"isExampleTarget",0,function(a){let c=(a.split("/").pop()??"").replace(/\.md$/i,"").replace(/^(?:ADR-\d+|[TRE]\d+)-/,"");return b.has(c.toLowerCase())},"touchedPaths",0,function(a,b,c){let d=new Map;for(let a of b)d.set(a.id,a.path),d.set(a.path,a.path);let e=new Set;for(let b of a){if(!(Date.parse(b.timestamp)>=c))continue;let a=[b.taskId,g.exec(b.title)?.[1]];for(let c of(h.has(b.type)&&a.push(b.detail),"doc_renamed"===b.type&&a.push(b.title.split(" → ")[1]),"memory_updated"!==b.type||b.title.startsWith("Entry ")||a.push("memory/MEMORY.md"),a)){let a=c?d.get(c.trim()):void 0;a&&e.add(a)}}return e}])}];
1
+ module.exports=[508817,a=>{"use strict";var b=a.i(256857);let c={name:"book-open",size:24,node:[["path",{d:"M12 5v16",key:"1f6ucr"}],["path",{d:"M20.001 19A2 2 0 0022 17V5a2 2 0 00-1.999-2L16 3.002A5 5 0 0012 5a5 5 0 00-4-2H4a2 2 0 00-2 2v12a2 2 0 001.999 2H8a5 5 0 014 2 5 5 0 014-2z",key:"1fyvmf"}]]};c.node;let d=(0,b.default)(c);a.s(["BookOpen",0,d],508817)},717371,a=>{"use strict";var b=a.i(256857);let c={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"}]]};c.node;let d=(0,b.default)(c);a.s(["Flag",0,d],717371)},759658,a=>{"use strict";var b=a.i(256857);let c={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"}]]};c.node;let d=(0,b.default)(c);a.s(["Lightbulb",0,d],759658)},471617,a=>{"use strict";var b=a.i(256857);let c={name:"scale",size:24,node:[["path",{d:"M12 3v18",key:"108xh3"}],["path",{d:"m19 8 3 8a5 5 0 0 1-6 0zV7",key:"zcdpyk"}],["path",{d:"M3 7h1a17 17 0 0 0 8-2 17 17 0 0 0 8 2h1",key:"1yorad"}],["path",{d:"m5 8 3 8a5 5 0 0 1-6 0zV7",key:"eua70x"}],["path",{d:"M7 21h10",key:"1b0cd5"}]]};c.node;let d=(0,b.default)(c);a.s(["Scale",0,d],471617)},853244,a=>{"use strict";var b=a.i(256857);let c={name:"unlink",size:24,node:[["path",{d:"m18.84 12.25 1.72-1.71h-.02a5.004 5.004 0 0 0-.12-7.07 5.006 5.006 0 0 0-6.95 0l-1.72 1.71",key:"yqzxt4"}],["path",{d:"m5.17 11.75-1.71 1.71a5.004 5.004 0 0 0 .12 7.07 5.006 5.006 0 0 0 6.95 0l1.71-1.71",key:"4qinb0"}],["line",{x1:"8",x2:"8",y1:"2",y2:"5",key:"1041cp"}],["line",{x1:"2",x2:"5",y1:"8",y2:"8",key:"14m1p5"}],["line",{x1:"16",x2:"16",y1:"19",y2:"22",key:"rzdirn"}],["line",{x1:"19",x2:"22",y1:"16",y2:"16",key:"ox905f"}]]};c.node;let d=(0,b.default)(c);a.s(["Unlink",0,d],853244)},892678,a=>{"use strict";var b=a.i(256857);let c={name:"user",size:24,node:[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]]};c.node;let d=(0,b.default)(c);a.s(["User",0,d],892678)},731050,760093,a=>{"use strict";var b=a.i(662145),c=a.i(174897),d=a.i(913975),e=a.i(508817),f=a.i(926128),g=a.i(717371),h=a.i(759658),i=a.i(471617),j=a.i(544394),k=a.i(173628),l=a.i(147758);let m=[{kind:"task",label:"Tasks"},{kind:"epic",label:"Epics"},{kind:"adr",label:"ADRs"},{kind:"doc",label:"Docs"},{kind:"entry",label:"Entries"}],n={epic:g.Flag,adr:i.Scale,doc:f.FileText,entry:h.Lightbulb,task:e.BookOpen};function o(a){let b=(0,d.useRouter)(),{openDoc:c}=(0,j.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)}}a.s(["EntryRelated",0,function({entryId:a,onOpenEntry:d}){let{rootParam:e,summary:f,board:g}=(0,j.useApp)(),h=o(d),[i,p]=(0,c.useState)(null);(0,c.useEffect)(()=>{let b=!0;return fetch(`/api/memory/graph${e}&entry=${encodeURIComponent(a)}`).then(a=>a.json()).then(a=>{b&&p(a.nodes?a:{nodes:[],edges:[]})}).catch(a=>{console.warn("Loading entry links failed",a),b&&p({nodes:[],edges:[]})}),()=>{b=!1}},[a,e,f]);let q=(0,c.useMemo)(()=>new Map(Object.values(g??{}).flat().map(a=>[a.id,a])),[g]),r=(0,c.useMemo)(()=>new Map((i?.nodes??[]).map(a=>[a.id,a])),[i]),s=a=>a.map(a=>r.get(a)).filter(a=>!!a),t=s((i?.edges??[]).filter(b=>b.from===a).map(a=>a.to)),u=s((i?.edges??[]).filter(b=>b.to===a).map(a=>a.from)),v=a=>{let c="task"===a.kind?q.get(a.id):void 0,d=c?(0,l.displayStatus)(c):"epic"===a.kind?a.status:void 0,e=n[a.kind];return(0,b.jsx)("li",{children:(0,b.jsxs)("button",{type:"button",onClick:()=>h(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:[d?(0,b.jsx)(k.StatusIcon,{status:d,className:"size-3.5 shrink-0"}):(0,b.jsx)(e,{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)},w=(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}),m.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(v)})]},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===i?(0,b.jsx)("p",{className:"text-xs text-muted",children:"Loading links…"}):t.length||u.length?(0,b.jsxs)(b.Fragment,{children:[t.length>0&&w("Links to",t),u.length>0&&w("Linked from",u)]}):(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."})]})},"GROUPS",0,m,"KIND_ICON",0,n,"useOpenNode",0,o],731050);let p=new Set(["doc_updated","doc_created","doc_deleted","doc_renamed","task_created","task_updated","roadmap_updated","memory_updated","decision_logged"]),q=new Set;function r(a){return q.add(a),()=>{q.delete(a)}}function s(){return(0,c.useSyncExternalStore)(r,()=>0,()=>0)}let t=new Map;function u(a){let b=t.get(a);if(!b){let c=b=fetch(a).then(async a=>{let b=await a.json().catch(()=>null);if(!a.ok)throw Error(b?.error??`${a.status} ${a.statusText}`);return b});c.catch(()=>{t.get(a)===c&&t.delete(a)}),t.set(a,c)}return b}a.s(["LINK_EVENTS",0,p,"fetchLinkJson",0,u,"useDocLinks",0,function(a){let{rootParam:b}=(0,j.useApp)(),[d,e]=(0,c.useState)(null),f=s();return(0,c.useEffect)(()=>{if(!a)return;let c=!0;return u(`/api/docs/links${b}&path=${encodeURIComponent(a)}`).then(b=>{c&&e({path:a,links:{out:b.out??[],in:b.in??[],broken:b.broken??[],stale:b.stale??[],targets:b.targets??{}}})}).catch(b=>{console.warn("Loading doc links failed",b),c&&e({path:a,links:{out:[],in:[],broken:[],stale:[],targets:{}}})}),()=>{c=!1}},[a,b,f]),a&&d?.path===a?d.links:null},"useLinkGeneration",0,s],760093)},813722,853775,a=>{"use strict";var b=a.i(662145),c=a.i(795667),d=a.i(892678),e=a.i(368114);function f(a){return"human"===a?"human":a?.startsWith("ai:")?"ai":"none"}function g(a){return"human"===a?"Human":a?.startsWith("ai:")?a.slice(3):"No owner"}a.s(["ownerKind",0,f,"ownerLabel",0,g,"parseOwner",0,function(a){let b=(a??"").trim().toLowerCase();if("human"===b)return"human";let c=b.match(/^ai(?::\s*([a-z0-9._-]+))?$/);return c?`ai:${c[1]??"agent"}`:null}],853775),a.s(["OwnerChip",0,function({owner:a,className:h}){let i=f(a);if("none"===i)return null;let j="ai"===i?c.Bot:d.User;return(0,b.jsxs)("span",{title:`Owner: ${g(a)}`,className:(0,e.cn)("inline-flex items-center gap-1 text-[11px] text-muted",h),children:[(0,b.jsx)(j,{className:(0,e.cn)("size-3.5 shrink-0","ai"===i&&"text-accent"),"aria-hidden":!0}),g(a)]})}],813722)},692938,a=>{"use strict";let b=new Set(["a","b","c","x","y","z","path","name","slug","title","foo","bar","wikilinks","example"]),c=a=>String(Number(a)).padStart(3,"0");function d(a){return a.startsWith("ADR-")?`ADR-${c(a.slice(4))}`:a.startsWith("E")?`E${c(a.slice(1))}`:a}function e(a,b){let c,e=function(a){let b=[];for(let c of a.replace(/\\/g,"/").split("/"))if(c&&"."!==c)if(".."===c){if(!b.length)return null;b.pop()}else b.push(c);return b.join("/")}(a)??a,f=(e.split("/").pop()??e).replace(/\.md$/i,""),g=(/^#\s+(.+?)\s*$/m.exec(b)?.[1]??"").replace(/!?\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/\[\[([^\]|]+)(?:\|([^\]]+))?\]\]/g,(a,b,c)=>c??b).replace(/(\*\*|\*|~~|`)(\S(?:.*?\S)?)\1/g,"$2").replace(/(^|\W)(__|_)(\S(?:.*?\S)?)\2(?=\W|$)/g,"$1$3").replace(/<[^>]+>/g,"").trim(),h=/[^.][.!]$/.test(g)?"":g,i=a=>h.replace(RegExp(`^${a}\\s*[:—–-]\\s*`),"")||f;return(c=/^plans\/tasks\/(T\d{3,})[^/]*\.md$/.exec(e))?{id:c[1],kind:"task",label:i(c[1]),path:e}:(c=/^plans\/roadmap\/(R\d{3,})[^/]*\.md$/.exec(e))?{id:c[1],kind:"epic",label:i(c[1]),path:e}:(c=/^memory\/entries\/(E\d+)[^/]*\.md$/.exec(e))?{id:d(c[1]),kind:"entry",label:i(c[1]),path:e}:(c=/(?:^|\/)(ADR-\d+)[^/]*\.md$/.exec(e))?{id:d(c[1]),kind:"adr",label:i(c[1]),path:e}:{id:e,kind:"doc",label:h||f,path:e}}new WeakMap;let f=["doc","adr"],g=/^(?:Entry )?(E\d+|T\d{3,}|R\d{3,}|ADR-\d+)\b/,h=new Set(["doc_updated","doc_created"]);a.s(["GRAPH_DEFAULT_KINDS",0,f,"docNode",0,e,"graphHref",0,function(a){let b=new URLSearchParams({node:a,focus:"1"}),c=e(a,"").kind;return f.includes(c)||b.set("kinds",[...f,c].join(",")),`/graph?${b}`},"isExampleTarget",0,function(a){let c=(a.split("/").pop()??"").replace(/\.md$/i,"").replace(/^(?:ADR-\d+|[TRE]\d+)-/,"");return b.has(c.toLowerCase())},"touchedPaths",0,function(a,b,c){let d=new Map;for(let a of b)d.set(a.id,a.path),d.set(a.path,a.path);let e=new Set;for(let b of a){if(!(Date.parse(b.timestamp)>=c))continue;let a=[b.taskId,g.exec(b.title)?.[1]];for(let c of(h.has(b.type)&&a.push(b.detail),"doc_renamed"===b.type&&a.push(b.title.split(" → ")[1]),"memory_updated"!==b.type||b.title.startsWith("Entry ")||a.push("memory/MEMORY.md"),a)){let a=c?d.get(c.trim()):void 0;a&&e.add(a)}}return e}])}];
2
2
 
3
3
  //# sourceMappingURL=_0ghj-vx._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/book-open.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/flag.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/scale.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/unlink.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/user.ts","../../../../src/components/memory/EntryRelated.tsx","../../../../src/components/docs/useDocLinks.ts","../../../../src/components/shared/OwnerChip.tsx","../../../../src/lib/owner.ts","../../../../src/lib/doc-links.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'book-open',\n size: 24,\n node: [\n ['path', { d: 'M12 5v16', key: '1f6ucr' }],\n [\n 'path',\n {\n d: 'M20.001 19A2 2 0 0022 17V5a2 2 0 00-1.999-2L16 3.002A5 5 0 0012 5a5 5 0 00-4-2H4a2 2 0 00-2 2v12a2 2 0 001.999 2H8a5 5 0 014 2 5 5 0 014-2z',\n key: '1fyvmf',\n },\n ],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name BookOpen\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgNXYxNiIgLz4KICA8cGF0aCBkPSJNMjAuMDAxIDE5QTIgMiAwIDAwMjIgMTdWNWEyIDIgMCAwMC0xLjk5OS0yTDE2IDMuMDAyQTUgNSAwIDAwMTIgNWE1IDUgMCAwMC00LTJINGEyIDIgMCAwMC0yIDJ2MTJhMiAyIDAgMDAxLjk5OSAySDhhNSA1IDAgMDE0IDIgNSA1IDAgMDE0LTJ6IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/book-open\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 BookOpen = createLucideIcon(__iconData);\n\nexport default BookOpen;\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","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: 'scale',\n size: 24,\n node: [\n ['path', { d: 'M12 3v18', key: '108xh3' }],\n ['path', { d: 'm19 8 3 8a5 5 0 0 1-6 0zV7', key: 'zcdpyk' }],\n ['path', { d: 'M3 7h1a17 17 0 0 0 8-2 17 17 0 0 0 8 2h1', key: '1yorad' }],\n ['path', { d: 'm5 8 3 8a5 5 0 0 1-6 0zV7', key: 'eua70x' }],\n ['path', { d: 'M7 21h10', key: '1b0cd5' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Scale\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgM3YxOCIgLz4KICA8cGF0aCBkPSJtMTkgOCAzIDhhNSA1IDAgMCAxLTYgMHpWNyIgLz4KICA8cGF0aCBkPSJNMyA3aDFhMTcgMTcgMCAwIDAgOC0yIDE3IDE3IDAgMCAwIDggMmgxIiAvPgogIDxwYXRoIGQ9Im01IDggMyA4YTUgNSAwIDAgMS02IDB6VjciIC8+CiAgPHBhdGggZD0iTTcgMjFoMTAiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/scale\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 Scale = createLucideIcon(__iconData);\n\nexport default Scale;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'unlink',\n size: 24,\n node: [\n [\n 'path',\n {\n d: 'm18.84 12.25 1.72-1.71h-.02a5.004 5.004 0 0 0-.12-7.07 5.006 5.006 0 0 0-6.95 0l-1.72 1.71',\n key: 'yqzxt4',\n },\n ],\n [\n 'path',\n {\n d: 'm5.17 11.75-1.71 1.71a5.004 5.004 0 0 0 .12 7.07 5.006 5.006 0 0 0 6.95 0l1.71-1.71',\n key: '4qinb0',\n },\n ],\n ['line', { x1: '8', x2: '8', y1: '2', y2: '5', key: '1041cp' }],\n ['line', { x1: '2', x2: '5', y1: '8', y2: '8', key: '14m1p5' }],\n ['line', { x1: '16', x2: '16', y1: '19', y2: '22', key: 'rzdirn' }],\n ['line', { x1: '19', x2: '22', y1: '16', y2: '16', key: 'ox905f' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Unlink\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTguODQgMTIuMjUgMS43Mi0xLjcxaC0uMDJhNS4wMDQgNS4wMDQgMCAwIDAtLjEyLTcuMDcgNS4wMDYgNS4wMDYgMCAwIDAtNi45NSAwbC0xLjcyIDEuNzEiIC8+CiAgPHBhdGggZD0ibTUuMTcgMTEuNzUtMS43MSAxLjcxYTUuMDA0IDUuMDA0IDAgMCAwIC4xMiA3LjA3IDUuMDA2IDUuMDA2IDAgMCAwIDYuOTUgMGwxLjcxLTEuNzEiIC8+CiAgPGxpbmUgeDE9IjgiIHgyPSI4IiB5MT0iMiIgeTI9IjUiIC8+CiAgPGxpbmUgeDE9IjIiIHgyPSI1IiB5MT0iOCIgeTI9IjgiIC8+CiAgPGxpbmUgeDE9IjE2IiB4Mj0iMTYiIHkxPSIxOSIgeTI9IjIyIiAvPgogIDxsaW5lIHgxPSIxOSIgeDI9IjIyIiB5MT0iMTYiIHkyPSIxNiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/unlink\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 Unlink = createLucideIcon(__iconData);\n\nexport default Unlink;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'user',\n size: 24,\n node: [\n ['path', { d: 'M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2', key: '975kel' }],\n ['circle', { cx: '12', cy: '7', r: '4', key: '17ys0d' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name User\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTkgMjF2LTJhNCA0IDAgMCAwLTQtNEg5YTQgNCAwIDAgMC00IDR2MiIgLz4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjciIHI9IjQiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/user\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 User = createLucideIcon(__iconData);\n\nexport default User;\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\nexport const 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 // tasks from the live board, epics from the node (their roadmap status): one StatusIcon for both, as in Linked docs\n const row = (n: GraphNode & { status?: string }) => {\n const task = n.kind === \"task\" ? tasks.get(n.id) : undefined\n const status = task ? displayStatus(task) : n.kind === \"epic\" ? n.status : 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 {status ? <StatusIcon status={status} 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 { useEffect, useState, useSyncExternalStore } from \"react\"\nimport { useApp } from \"@/context/AppContext\"\nimport type { LinkRow, TargetRow } from \"@/lib/doc-links\"\n\nexport type DocLinksData = { out: LinkRow[]; in: LinkRow[]; broken: LinkRow[]; stale: LinkRow[]; targets: Record<string, TargetRow> }\n\n/** Events that can change which files exist or what they link to. */\nexport const LINK_EVENTS = new Set([\"doc_updated\", \"doc_created\", \"doc_deleted\", \"doc_renamed\", \"task_created\", \"task_updated\", \"roadmap_updated\", \"memory_updated\", \"decision_logged\"])\n\n// A burst of LINK_EVENTS (an agent moving five tasks) becomes one generation bump, so one refetch per URL\nconst DEBOUNCE_MS = 250\nlet generation = 0\nlet timer: ReturnType<typeof setTimeout> | undefined\nconst subscribers = new Set<() => void>()\nfunction onSse(e: Event) {\n if (!LINK_EVENTS.has((e as CustomEvent<{ type: string }>).detail?.type)) return\n clearTimeout(timer)\n timer = setTimeout(() => {\n generation++\n cache.clear()\n subscribers.forEach((f) => f())\n }, DEBOUNCE_MS)\n}\n// Registered once for the page's life, never removed: the cache must be cleared even while no link view is mounted\n// (a change made while the user is on /board must not be served from a stale promise on the way back).\nif (typeof window !== \"undefined\") window.addEventListener(\"vibedoc:sse\", onSse)\nfunction subscribe(cb: () => void) {\n subscribers.add(cb)\n return () => { subscribers.delete(cb) }\n}\n\n/** Bumps ~250ms after the last file-changing SSE event; use it as an effect dep to refetch link data. */\nexport function useLinkGeneration(): number {\n return useSyncExternalStore(subscribe, () => generation, () => 0)\n}\n\n// One request per URL per generation, shared by every caller (DocViewer + the preview's link handling, strict\n// mode's double effect). A failure is evicted so Retry asks again.\nconst cache = new Map<string, Promise<unknown>>()\nexport function fetchLinkJson<T>(url: string): Promise<T> {\n let p = cache.get(url)\n if (!p) {\n p = fetch(url).then(async (r) => {\n const body = await r.json().catch(() => null)\n if (!r.ok) throw new Error(body?.error ?? `${r.status} ${r.statusText}`)\n return body\n })\n const mine = p\n mine.catch(() => { if (cache.get(url) === mine) cache.delete(url) })\n cache.set(url, mine)\n }\n return p as Promise<T>\n}\n\n/**\n * Resolved links of one .md file (R056), from GET /api/docs/links; null while loading, empty for an unknown file.\n * Refetched on file-changing SSE events. The browser never resolves paths: a clicked link is matched to this data\n * by its raw target string as written in the file (`../b/y.md` without `#h`, `[[DOMAIN_MAP]]` → `DOMAIN_MAP`),\n * looked up in `targets` first, then `broken`.\n */\nexport function useDocLinks(path: string | undefined): DocLinksData | null {\n const { rootParam } = useApp()\n const [data, setData] = useState<{ path: string; links: DocLinksData } | null>(null)\n const gen = useLinkGeneration()\n\n useEffect(() => {\n if (!path) return\n let live = true\n fetchLinkJson<Partial<DocLinksData>>(`/api/docs/links${rootParam}&path=${encodeURIComponent(path)}`)\n .then((d) => {\n if (live) setData({ path, links: { out: d.out ?? [], in: d.in ?? [], broken: d.broken ?? [], stale: d.stale ?? [], targets: d.targets ?? {} } })\n })\n .catch((e) => {\n console.warn(\"Loading doc links failed\", e)\n if (live) setData({ path, links: { out: [], in: [], broken: [], stale: [], targets: {} } })\n })\n return () => { live = false }\n }, [path, rootParam, gen])\n\n // another file's links never show while this one loads\n return path && data?.path === path ? data.links : null\n}\n","import { Bot, User } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport { ownerKind, ownerLabel } from \"@/lib/owner\"\n\n/** Who is in charge: a person icon for \"human\", a bot + agent name for \"ai:<agent>\". Nothing when unset. */\nexport function OwnerChip({ owner, className }: { owner: string | null; className?: string }) {\n const kind = ownerKind(owner)\n if (kind === \"none\") return null\n const Icon = kind === \"ai\" ? Bot : User\n return (\n <span title={`Owner: ${ownerLabel(owner)}`} className={cn(\"inline-flex items-center gap-1 text-[11px] text-muted\", className)}>\n <Icon className={cn(\"size-3.5 shrink-0\", kind === \"ai\" && \"text-accent\")} aria-hidden />\n {ownerLabel(owner)}\n </span>\n )\n}\n","// Who is in charge of a task / epic (R055): `**Owner:** human` or `**Owner:** ai:<agent>`.\n// Pure (no React, no fs). Self-check: `node src/lib/owner.check.mts`.\n\nexport type OwnerKind = \"human\" | \"ai\" | \"none\"\n\nconst KNOWN_AGENTS = [\"claude\", \"cursor\", \"codex\", \"copilot\", \"gemini\", \"windsurf\", \"cline\", \"opencode\"]\n\n/** \"human\" | \"ai:<agent>\" (lowercase), or null for empty / \"—\" / anything else. A bare \"ai\" becomes \"ai:agent\". */\nexport function parseOwner(raw: string | null | undefined): string | null {\n const v = (raw ?? \"\").trim().toLowerCase()\n if (v === \"human\") return \"human\"\n const m = v.match(/^ai(?::\\s*([a-z0-9._-]+))?$/)\n return m ? `ai:${m[1] ?? \"agent\"}` : null\n}\n\nexport function ownerKind(owner: string | null): OwnerKind {\n return owner === \"human\" ? \"human\" : owner?.startsWith(\"ai:\") ? \"ai\" : \"none\"\n}\n\n/** \"Human\", \"claude\", \"No owner\". */\nexport function ownerLabel(owner: string | null): string {\n return owner === \"human\" ? \"Human\" : owner?.startsWith(\"ai:\") ? owner.slice(3) : \"No owner\"\n}\n\n/** Agent name from an MCP client's User-Agent (\"claude-code/2.1\" → \"claude\"); \"agent\" when unknown. */\nexport function agentFromUserAgent(ua: string | null | undefined): string {\n const s = (ua ?? \"\").toLowerCase()\n return KNOWN_AGENTS.find((a) => s.includes(a)) ?? \"agent\"\n}\n","// Pure doc link graph (R056, no fs): resolved links between every .md file, derived from text, never stored.\n// Self-check: node src/lib/doc-links.check.mts. Regexes and labels are copied from memory-graph.ts (pure libs\n// never import values from each other), but here relative `./` and `../` targets are resolved.\n\nexport type DocNodeKind = 'doc' | 'adr' | 'task' | 'epic' | 'entry'\n/** `status` / `owner` are set on task and epic nodes by GET /api/docs/graph, never by docNode(). */\nexport type DocNode = { id: string; kind: DocNodeKind; label: string; path: string; status?: string; owner?: string | null }\nexport type LinkKind = 'md' | 'wiki' | 'code' | 'id'\n/** `context`: the sentence around the link (or the heading above it), set only when the link text is just the target. */\nexport type DocLink = { target: string; kind: LinkKind; line: number; text: string; context?: string }\n/** One file as the graph needs it: its node and its raw (unresolved) links. core.ts caches this per file. */\nexport type DocItem = { node: DocNode; links: DocLink[] }\nexport type DocEdge = { from: string; to: string; line: number; text: string; context?: string }\nexport type BrokenLink = { from: string; target: string; line: number; text: string; kind: LinkKind }\n/** Raw link target as written in a file → the file it resolves to (self-links included). Keyed by source path. */\nexport type ResolvedTargets = Record<string, Record<string, string>>\n/** `broken`: md / wiki links that point nowhere. `stale`: backticked paths (`code`) to a file that doesn't exist. */\nexport type DocGraph = { nodes: DocNode[]; edges: DocEdge[]; broken: BrokenLink[]; stale: BrokenLink[]; targets: ResolvedTargets }\n/** `status`: a linked task's or epic's status, set by GET /api/docs/links (as on graph nodes), never by docLinks(). */\nexport type LinkRow = { path: string; kind: string; label: string; line: number; text: string; context?: string; status?: 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 ID_ONLY_RE = /^(E\\d+|T\\d{3,}|R\\d{3,}|ADR-\\d+)$/\nconst BACKTICK_MD_RE = /`([^`\\s]+\\.md)`/g\nconst LINK_MD_RE = /\\[([^\\]]*)\\]\\(\\s*<?([^)\\s>#]+\\.md)(?:#[^)\\s]*)?>?(?:\\s+\"[^\"]*\"|\\s+'[^']*')?\\s*\\)/g\nconst FENCE_RE = /^\\s*(`{3,}|~{3,})/\nconst INLINE_CODE_RE = /(`+)[^`]*?\\1/g\n\n/** Targets are keyed decoded (`my%20doc.md` → `my doc.md`), as the client looks them up after marked encodes. */\nconst decode = (t: string) => { try { return decodeURI(t) } catch { return t } }\n/** A source line as plain prose: list / heading / checkbox markers, link syntax, code ticks and emphasis removed. */\nconst plainLine = (l: string) => l\n .replace(/^\\s*(?:#{1,6}|>|[-*+]|\\d+\\.)\\s+(?:\\[[ xX]\\]\\s+)?/, '')\n .replace(/\\[\\[([^\\]|#]+)(?:#[^\\]|]*)?(?:\\|([^\\]]+))?\\]\\]/g, (_, a, b) => b ?? a)\n .replace(/\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1')\n .replace(/`|\\*\\*|__/g, '')\n .trim()\n\n/** The sentence of `line` that holds `text`, minus a leading `text:`; the heading above when the line is only the link. */\nfunction linkContext(line: string, text: string, heading: string): string {\n const sentence = plainLine(line).split(/(?<=[.!?])\\s+/).find(s => s.includes(text)) ?? ''\n const rest = (sentence.startsWith(text) ? sentence.slice(text.length).replace(/^[\\s:,;–—-]+/, '') : sentence).trim()\n return (/[A-Za-z]{3}/.test(rest.replace(text, '')) ? rest : heading).slice(0, 200)\n}\n\n/**\n * A target written as a template, never a file: `<slug>`, `{id}`, globs, `…` / `...`, and `T00N` / `NNN` / `XXX` /\n * `YYYY` tokens (`plans/tasks/T<NNN>-<slug>.md`, `docs/meetings/YYYY-MM-DD.md`). Skipped at extraction.\n */\nconst PLACEHOLDER_RE = /[<>{}*?…]|\\.\\.\\.|(?:^|[^A-Za-z0-9])(?:[A-Z]?0+N|N{2,}|X{3,}|YYYY)(?![A-Za-z0-9])/\n/**\n * Names that teach link syntax in specs (`[text](path.md)`, `[[name]]`, `[[wikilinks]]`, `docs/a/x.md`): the whole\n * file name is one of these, or the rest after an item id (`T001-x.md`, `ADR-001-title.md`). Only ever drops a miss,\n * so a real `x.md` still links. Never a `-` part of a longer name: `user-name.md` and `plan-b.md` are real misses.\n * `missing` is deliberately not here: e2e fixtures use it for a real broken link.\n */\nconst EXAMPLE_NAMES = new Set(['a', 'b', 'c', 'x', 'y', 'z', 'path', 'name', 'slug', 'title', 'foo', 'bar', 'wikilinks', 'example'])\nexport function isExampleTarget(target: string): boolean {\n const name = (target.split('/').pop() ?? '').replace(/\\.md$/i, '').replace(/^(?:ADR-\\d+|[TRE]\\d+)-/, '')\n return EXAMPLE_NAMES.has(name.toLowerCase())\n}\n\nconst WIKI_RE = /\\[\\[([^\\]|#]+)(?:#[^\\]|]*)?(?:\\|([^\\]]+))?\\]\\]/g\nconst EXTERNAL_RE = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i\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\n/** Posix-normalize: backslashes, `.` and `..` segments, leading `./` or `/`. Escaping above the root → null. */\nfunction normalizePath(p: string): string | null {\n const out: string[] = []\n for (const seg of p.replace(/\\\\/g, '/').split('/')) {\n if (!seg || seg === '.') continue\n if (seg === '..') { if (!out.length) return null; out.pop() } else out.push(seg)\n }\n return out.join('/')\n}\n\nconst dirOf = (p: string) => p.includes('/') ? p.slice(0, p.lastIndexOf('/')) : ''\nconst baseName = (p: string) => (p.split('/').pop() ?? p).replace(/\\.md$/i, '')\n\n/** The item id a file stands for (T093, R056, E001, ADR-004), from its path; null for a plain doc. */\nfunction idOfPath(p: string): string | null {\n const m = /^plans\\/tasks\\/(T\\d{3,})[^/]*\\.md$/.exec(p) ?? /^plans\\/roadmap\\/(R\\d{3,})[^/]*\\.md$/.exec(p)\n ?? /^memory\\/entries\\/(E\\d+)[^/]*\\.md$/.exec(p) ?? /(?:^|\\/)(ADR-\\d+)[^/]*\\.md$/.exec(p)\n return m ? normalizeId(m[1]) : null\n}\n\n/** Inline markdown → plain text for a label: images and links keep their text, emphasis / code marks go. */\nfunction plainText(md: string): string {\n return md\n .replace(/!?\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1')\n .replace(/\\[\\[([^\\]|]+)(?:\\|([^\\]]+))?\\]\\]/g, (_, t: string, alias?: string) => alias ?? t)\n .replace(/(\\*\\*|\\*|~~|`)(\\S(?:.*?\\S)?)\\1/g, '$2')\n .replace(/(^|\\W)(__|_)(\\S(?:.*?\\S)?)\\2(?=\\W|$)/g, '$1$3') // _em_, never snake_case\n .replace(/<[^>]+>/g, '')\n .trim()\n}\n\n/**\n * Classify a markdown file by path. Label = its H1 without the \"ID: \" prefix, else the file name. An H1 that reads as\n * a sentence (ends in . or !, like AGENTS.md's \"See CLAUDE.md — this file mirrors it…\") is prose, not a title.\n */\nexport function docNode(relPath: string, raw: string): DocNode {\n const p = normalizePath(relPath) ?? relPath\n const name = baseName(p)\n const heading = plainText(/^#\\s+(.+?)\\s*$/m.exec(raw)?.[1] ?? '')\n const h1 = /[^.][.!]$/.test(heading) ? '' : heading\n const label = (id: string) => h1.replace(new RegExp(`^${id}\\\\s*[:—–-]\\\\s*`), '') || name\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 = /^memory\\/entries\\/(E\\d+)[^/]*\\.md$/.exec(p))) return { id: normalizeId(m[1]), kind: 'entry', label: label(m[1]), path: p }\n if ((m = /(?:^|\\/)(ADR-\\d+)[^/]*\\.md$/.exec(p))) return { id: normalizeId(m[1]), kind: 'adr', label: label(m[1]), path: p }\n return { id: p, kind: 'doc', label: h1 || name, path: p }\n}\n\n/**\n * Links in `raw`, in order, with 1-based line numbers. Lines inside ``` / ~~~ fences and external URLs are skipped;\n * md and wiki links inside inline code spans too. Indented code blocks are not detected (nested lists look alike).\n */\nexport function extractLinks(raw: string, _fromPath?: string): DocLink[] {\n const links: DocLink[] = []\n let fence = '' // the opening marker while inside a fence\n let heading = ''\n raw.replace(/\\r\\n/g, '\\n').split('\\n').forEach((l, i) => {\n const f = FENCE_RE.exec(l)?.[1]\n if (f && (!fence || (f[0] === fence[0] && f.length >= fence.length))) { fence = fence ? '' : f; return }\n if (fence) return\n const line = i + 1\n const from = links.length\n const prose = l.replace(INLINE_CODE_RE, m => ' '.repeat(m.length))\n for (const m of prose.matchAll(LINK_MD_RE)) {\n // text from the original line (same offsets): [`code`](x.md) keeps its label\n const text = l.slice(m.index + 1, m.index + 1 + m[1].length)\n if (!EXTERNAL_RE.test(m[2]) && !PLACEHOLDER_RE.test(m[2])) links.push({ target: decode(m[2]), kind: 'md', line, text: text || m[2] })\n }\n for (const m of prose.matchAll(WIKI_RE)) {\n const target = decode(m[1].trim())\n if (target && !EXTERNAL_RE.test(target) && !PLACEHOLDER_RE.test(target)) links.push({ target, kind: 'wiki', line, text: (m[2] ?? target).trim() })\n }\n for (const m of l.matchAll(BACKTICK_MD_RE)) {\n // a glob (`memory/entries/E*.md`) or a template (`E001-<slug>.md`) names a pattern, not a file\n if (!EXTERNAL_RE.test(m[1]) && !PLACEHOLDER_RE.test(m[1])) links.push({ target: decode(m[1]), kind: 'code', line, text: m[1] })\n }\n for (const m of l.matchAll(ID_RE)) {\n if (/^E0+$/.test(m[1])) continue // E0 is not an entry id\n links.push({ target: normalizeId(m[1]), kind: 'id', line, text: m[1] })\n }\n // a bare link (text = target) says nothing by itself: carry the sentence it sits in\n for (const k of links.slice(from)) if (k.text === k.target) {\n const context = linkContext(l, k.text, heading)\n if (context) k.context = context\n }\n if (/^#{1,6}\\s/.test(l)) heading = plainLine(l)\n })\n return links\n}\n\ntype PathIndex = { set: Set<string>; byBase: Map<string, string[]>; byId: Map<string, string> }\nconst indexCache = new WeakMap<readonly string[], PathIndex>()\n\nfunction indexOf(allPaths: readonly string[]): PathIndex {\n let idx = indexCache.get(allPaths)\n if (idx) return idx\n idx = { set: new Set(allPaths), byBase: new Map(), byId: new Map() }\n for (const p of allPaths) {\n const b = baseName(p).toLowerCase()\n idx.byBase.set(b, [...(idx.byBase.get(b) ?? []), p])\n const id = idOfPath(p)\n if (id && !idx.byId.has(id)) idx.byId.set(id, p)\n }\n indexCache.set(allPaths, idx)\n return idx\n}\n\n/** Files named exactly `t` (case-insensitive, `.md` added when missing), anywhere in the repo. */\nfunction bareHits(t: string, idx: PathIndex): string[] {\n const file = (/\\.md$/i.test(t) ? t : `${t}.md`).toLowerCase()\n return (idx.byBase.get(baseName(file)) ?? []).filter(p => (p.split('/').pop() ?? '').toLowerCase() === file)\n}\n\n/**\n * The file a link points at, or null (broken). Paths: relative to the source folder, then root-relative.\n * An explicit `./` or `../` never falls back to the root. Wikilinks: by basename without `.md`, same folder first,\n * then the shortest path; [[T093]] / [[E1]] go to the item's file first. Ids: the item's file.\n * `target` is taken as written, already decoded (extractLinks decodes).\n * `kind` is inferred when left out: an id token → id, no `.md` → wiki, else a path.\n * Paths: a leading `@` (Claude include, `@docs/HLD.md`) is dropped. A backticked bare name (`MEMORY.md`) that is in\n * neither folder resolves when exactly one file in the repo has that name; an md link never does.\n */\nexport function resolveLink(target: string, fromPath: string, allPaths: readonly string[], kind?: LinkKind): string | null {\n const idx = indexOf(allPaths)\n const k = kind ?? (ID_ONLY_RE.test(target) ? 'id' : /\\.md$/i.test(target) ? 'md' : 'wiki')\n if (k === 'id') return idx.byId.get(normalizeId(target)) ?? null\n\n if (k === 'wiki' && ID_ONLY_RE.test(target)) {\n const byId = idx.byId.get(normalizeId(target))\n if (byId) return byId\n }\n const t = k === 'wiki' ? target : target.replace(/^@(?=[^/@])/, '')\n const explicitRel = /^\\.\\.?\\//.test(t)\n const from = normalizePath(fromPath) ?? fromPath\n const tryPath = (p: string) => {\n const cands = [p, /\\.md$/i.test(p) ? null : `${p}.md`].filter((c): c is string => !!c)\n for (const c of cands) {\n const rel = t.startsWith('/') ? null : normalizePath(`${dirOf(from)}/${c}`)\n if (rel !== null && idx.set.has(rel)) return rel\n if (explicitRel) continue\n const abs = normalizePath(c)\n if (abs !== null && idx.set.has(abs)) return abs\n }\n return null\n }\n if (k !== 'wiki') {\n // a link must work as written (it does on GitHub too); a backticked mention only has to name the file\n const hits = k !== 'code' || t.includes('/') ? [] : bareHits(t, idx)\n return tryPath(t) ?? (hits.length === 1 ? hits[0] : null)\n }\n\n // wikilink: an exact path first ([[docs/HLD]]), then by basename\n const exact = t.includes('/') ? tryPath(t) : null\n if (exact) return exact\n const name = baseName(t).toLowerCase()\n const suffix = t.includes('/') ? `/${t.replace(/\\.md$/i, '').toLowerCase()}.md` : null\n const hits = (idx.byBase.get(name) ?? []).filter(p => !suffix || `/${p.toLowerCase()}`.endsWith(suffix))\n if (!hits.length) return null\n const dir = dirOf(from)\n return hits.find(p => dirOf(p) === dir)\n ?? [...hits].sort((a, b) => a.split('/').length - b.split('/').length || a.length - b.length || a.localeCompare(b))[0]\n}\n\n/**\n * Resolve every item's links. One edge per from→to pair (first line wins), self-links dropped. Misses: md / wiki\n * links → broken, backticked paths → stale (a mention of a moved or planned file, not a link).\n * Not misses: a target that exists among `otherPaths` (files outside the graph, e.g. `.claude/**`; no node, no edge),\n * a backticked bare name several files share (it exists, just not one file), and a syntax example (`isExampleTarget`).\n */\nexport function buildDocGraph(items: DocItem[], otherPaths: readonly string[] = []): DocGraph {\n const allPaths = items.map(i => i.node.path)\n const known = [...allPaths, ...otherPaths]\n const exists = (l: DocLink, from: string) => resolveLink(l.target, from, known, l.kind) !== null\n || (l.kind === 'code' && !l.target.includes('/') && bareHits(l.target, indexOf(known)).length > 0)\n const edges = new Map<string, DocEdge>()\n const broken = new Map<string, BrokenLink>()\n const stale = new Map<string, BrokenLink>()\n const targets: ResolvedTargets = {}\n for (const { node, links } of items) {\n for (const l of links) {\n const to = resolveLink(l.target, node.path, allPaths, l.kind)\n if (to !== null) (targets[node.path] ??= {})[l.target] ??= to\n if (to === node.path) continue\n if (to === null) {\n // an id with no file (T999, a typo) is just text, not a broken link\n if (l.kind === 'id' || isExampleTarget(l.target) || exists(l, node.path)) continue\n const key = `${node.path}\\u0000${l.target}`\n const misses = l.kind === 'code' ? stale : broken\n if (!misses.has(key)) misses.set(key, { from: node.path, target: l.target, line: l.line, text: l.text, kind: l.kind })\n continue\n }\n const key = `${node.path}\\u0000${to}`\n if (!edges.has(key)) edges.set(key, { from: node.path, to, line: l.line, text: l.text, ...(l.context && { context: l.context }) })\n }\n }\n return { nodes: items.map(i => i.node), edges: [...edges.values()], broken: [...broken.values()], stale: [...stale.values()], targets }\n}\n\n/** The kinds /graph shows when its URL names none. */\nexport const GRAPH_DEFAULT_KINDS: readonly DocNodeKind[] = ['doc', 'adr']\n\n/** /graph selected on one file with Focus 1 (\"Show in graph\"); a task, epic or entry also turns its kind on. */\nexport function graphHref(path: string): string {\n const p = new URLSearchParams({ node: path, focus: '1' })\n const kind = docNode(path, '').kind\n if (!GRAPH_DEFAULT_KINDS.includes(kind)) p.set('kinds', [...GRAPH_DEFAULT_KINDS, kind].join(','))\n return `/graph?${p}`\n}\n\nexport type TargetRow = { path: string; kind: DocNodeKind; id: string; label: string }\n\n/**\n * Links out of, into, broken and stale paths in one file; null when the path is not in the graph.\n * `targets` maps each raw target written in the file (`../b/y.md`, `DOMAIN_MAP`, `T093`) to its node, so a client\n * can open a clicked link without resolving paths itself. A target in both `targets` and `broken` resolved.\n */\nexport function docLinks(graph: DocGraph, path: string): { out: LinkRow[]; in: LinkRow[]; broken: LinkRow[]; stale: LinkRow[]; targets: Record<string, TargetRow> } | null {\n const p = normalizePath(path) ?? path\n const byPath = new Map(graph.nodes.map(n => [n.path, n]))\n if (!byPath.has(p)) return null\n const row = (other: string, e: DocEdge): LinkRow => {\n const n = byPath.get(other)\n return { path: other, kind: n?.kind ?? 'doc', label: n?.label ?? baseName(other), line: e.line, text: e.text, ...(e.context && { context: e.context }) }\n }\n const miss = (b: BrokenLink): LinkRow => ({ path: b.target, kind: b.kind, label: b.target, line: b.line, text: b.text })\n return {\n out: graph.edges.filter(e => e.from === p).map(e => row(e.to, e)),\n in: graph.edges.filter(e => e.to === p).map(e => row(e.from, e)),\n broken: graph.broken.filter(b => b.from === p).map(miss),\n stale: graph.stale.filter(b => b.from === p).map(miss),\n targets: Object.fromEntries(Object.entries(graph.targets[p] ?? {}).map(([t, to]) => {\n const n = byPath.get(to)\n return [t, { path: to, kind: n?.kind ?? 'doc', id: n?.id ?? to, label: n?.label ?? baseName(to) }]\n })),\n }\n}\n\n/**\n * Footer for vibedoc_read_doc (T096): the files a doc links to and is linked from, each named so an agent can\n * pass it straight to a tool (tasks, epics, entries, ADRs by id; docs by path). Empty string when no links.\n */\nexport function formatRelatedFiles(links: { out: LinkRow[]; in: LinkRow[]; broken: LinkRow[]; stale?: LinkRow[] } | null, cap = 10): string {\n if (!links) return ''\n const name = (r: LinkRow) => idOfPath(r.path) ?? r.path\n const line = (label: string, items: string[]) => {\n if (!items.length) return []\n const more = items.length > cap ? ` (+${items.length - cap} more)` : ''\n return [`${label}: ${items.slice(0, cap).join(' · ')}${more}`]\n }\n const body = [\n ...line('Links to', links.out.map(name)),\n ...line('Linked from', links.in.map(r => `${name(r)} (L${r.line})`)),\n ...line('Broken', links.broken.map(r => `${r.path} (L${r.line})`)),\n ...line('Stale paths', (links.stale ?? []).map(r => `${r.path} (L${r.line})`)),\n ]\n if (!body.length) return ''\n return ['## Related files', ...body, 'Read with vibedoc_read_doc, or several at once with vibedoc_get_context { paths }.'].join('\\n')\n}\n\n/** The parts of an activity event (core's ActivityEvent) that say which file it touched. */\nexport type TouchEvent = { timestamp: string; type: string; title: string; detail?: string; taskId?: string }\nconst TOUCH_ID_RE = /^(?:Entry )?(E\\d+|T\\d{3,}|R\\d{3,}|ADR-\\d+)\\b/\nconst DOC_EVENTS = new Set(['doc_updated', 'doc_created'])\n\n/**\n * Paths of the files an agent or a human changed since `since` (ms), from the activity log (T110 \"Recent\"): task\n * moves and edits (taskId), epics / entries / ADRs (the id leading the title), doc edits and creates (detail = path),\n * a rename's new path and the session handoff (memory/MEMORY.md). Events for files that no longer exist drop out.\n */\nexport function touchedPaths(events: readonly TouchEvent[], nodes: readonly DocNode[], since: number): Set<string> {\n const byKey = new Map<string, string>()\n for (const n of nodes) { byKey.set(n.id, n.path); byKey.set(n.path, n.path) }\n const out = new Set<string>()\n for (const e of events) {\n if (!(Date.parse(e.timestamp) >= since)) continue\n const keys = [e.taskId, TOUCH_ID_RE.exec(e.title)?.[1]]\n if (DOC_EVENTS.has(e.type)) keys.push(e.detail)\n if (e.type === 'doc_renamed') keys.push(e.title.split(' → ')[1])\n if (e.type === 'memory_updated' && !e.title.startsWith('Entry ')) keys.push('memory/MEMORY.md')\n for (const k of keys) {\n const p = k ? byKey.get(k.trim()) : undefined\n if (p) out.add(p)\n }\n }\n return out\n}\n"],"names":["GROUPS","kind","label","KIND_ICON","epic","adr","doc","entry","task","useOpenNode","onOpenEntry","router","openDoc","n","push","id","path","EntryRelated","entryId","rootParam","summary","board","open","graph","setGraph","live","fetch","encodeURIComponent","then","r","json","g","nodes","edges","catch","e","console","warn","tasks","Map","Object","values","flat","map","t","byId","pick","ids","get","filter","linksTo","from","to","linkedFrom","row","undefined","status","Icon","type","onClick","title","className","section","group","length","KNOWN_AGENTS","parseOwner","raw","v","trim","toLowerCase","m","match","ownerKind","owner","startsWith","ownerLabel","slice","agentFromUserAgent","ua","s","find","a","includes","ID_RE","ID_ONLY_RE","BACKTICK_MD_RE","LINK_MD_RE","FENCE_RE","INLINE_CODE_RE","decode","decodeURI","plainLine","l","replace","_","b","linkContext","line","text","heading","sentence","split","rest","test","PLACEHOLDER_RE","EXAMPLE_NAMES","Set","isExampleTarget","target","name","pop","has","WIKI_RE","EXTERNAL_RE","pad3","String","Number","padStart","normalizeId","normalizePath","p","out","seg","join","dirOf","lastIndexOf","baseName","idOfPath","exec","plainText","md","alias","docNode","relPath","h1","RegExp","extractLinks","_fromPath","links","fence","forEach","i","f","prose","repeat","matchAll","index","k","context","indexCache","WeakMap","indexOf","allPaths","idx","set","byBase","bareHits","file","resolveLink","fromPath","explicitRel","tryPath","cands","c","rel","abs","hits","exact","suffix","endsWith","dir","sort","localeCompare","buildDocGraph","items","otherPaths","node","known","exists","broken","stale","targets","key","misses","GRAPH_DEFAULT_KINDS","graphHref","URLSearchParams","focus","docLinks","byPath","other","miss","in","fromEntries","entries","formatRelatedFiles","cap","more","body","TOUCH_ID_RE","DOC_EVENTS","touchedPaths","events","since","byKey","Date","parse","timestamp","keys","taskId","detail","add"],"mappings":"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","ignoreList":[0,1,2,3,4,5]}
1
+ {"version":3,"sources":["../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/book-open.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/flag.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/scale.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/unlink.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/user.ts","../../../../src/components/memory/EntryRelated.tsx","../../../../src/components/docs/useDocLinks.ts","../../../../src/components/shared/OwnerChip.tsx","../../../../src/lib/owner.ts","../../../../src/lib/doc-links.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'book-open',\n size: 24,\n node: [\n ['path', { d: 'M12 5v16', key: '1f6ucr' }],\n [\n 'path',\n {\n d: 'M20.001 19A2 2 0 0022 17V5a2 2 0 00-1.999-2L16 3.002A5 5 0 0012 5a5 5 0 00-4-2H4a2 2 0 00-2 2v12a2 2 0 001.999 2H8a5 5 0 014 2 5 5 0 014-2z',\n key: '1fyvmf',\n },\n ],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name BookOpen\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgNXYxNiIgLz4KICA8cGF0aCBkPSJNMjAuMDAxIDE5QTIgMiAwIDAwMjIgMTdWNWEyIDIgMCAwMC0xLjk5OS0yTDE2IDMuMDAyQTUgNSAwIDAwMTIgNWE1IDUgMCAwMC00LTJINGEyIDIgMCAwMC0yIDJ2MTJhMiAyIDAgMDAxLjk5OSAySDhhNSA1IDAgMDE0IDIgNSA1IDAgMDE0LTJ6IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/book-open\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 BookOpen = createLucideIcon(__iconData);\n\nexport default BookOpen;\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","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: 'scale',\n size: 24,\n node: [\n ['path', { d: 'M12 3v18', key: '108xh3' }],\n ['path', { d: 'm19 8 3 8a5 5 0 0 1-6 0zV7', key: 'zcdpyk' }],\n ['path', { d: 'M3 7h1a17 17 0 0 0 8-2 17 17 0 0 0 8 2h1', key: '1yorad' }],\n ['path', { d: 'm5 8 3 8a5 5 0 0 1-6 0zV7', key: 'eua70x' }],\n ['path', { d: 'M7 21h10', key: '1b0cd5' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Scale\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgM3YxOCIgLz4KICA8cGF0aCBkPSJtMTkgOCAzIDhhNSA1IDAgMCAxLTYgMHpWNyIgLz4KICA8cGF0aCBkPSJNMyA3aDFhMTcgMTcgMCAwIDAgOC0yIDE3IDE3IDAgMCAwIDggMmgxIiAvPgogIDxwYXRoIGQ9Im01IDggMyA4YTUgNSAwIDAgMS02IDB6VjciIC8+CiAgPHBhdGggZD0iTTcgMjFoMTAiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/scale\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 Scale = createLucideIcon(__iconData);\n\nexport default Scale;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'unlink',\n size: 24,\n node: [\n [\n 'path',\n {\n d: 'm18.84 12.25 1.72-1.71h-.02a5.004 5.004 0 0 0-.12-7.07 5.006 5.006 0 0 0-6.95 0l-1.72 1.71',\n key: 'yqzxt4',\n },\n ],\n [\n 'path',\n {\n d: 'm5.17 11.75-1.71 1.71a5.004 5.004 0 0 0 .12 7.07 5.006 5.006 0 0 0 6.95 0l1.71-1.71',\n key: '4qinb0',\n },\n ],\n ['line', { x1: '8', x2: '8', y1: '2', y2: '5', key: '1041cp' }],\n ['line', { x1: '2', x2: '5', y1: '8', y2: '8', key: '14m1p5' }],\n ['line', { x1: '16', x2: '16', y1: '19', y2: '22', key: 'rzdirn' }],\n ['line', { x1: '19', x2: '22', y1: '16', y2: '16', key: 'ox905f' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Unlink\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTguODQgMTIuMjUgMS43Mi0xLjcxaC0uMDJhNS4wMDQgNS4wMDQgMCAwIDAtLjEyLTcuMDcgNS4wMDYgNS4wMDYgMCAwIDAtNi45NSAwbC0xLjcyIDEuNzEiIC8+CiAgPHBhdGggZD0ibTUuMTcgMTEuNzUtMS43MSAxLjcxYTUuMDA0IDUuMDA0IDAgMCAwIC4xMiA3LjA3IDUuMDA2IDUuMDA2IDAgMCAwIDYuOTUgMGwxLjcxLTEuNzEiIC8+CiAgPGxpbmUgeDE9IjgiIHgyPSI4IiB5MT0iMiIgeTI9IjUiIC8+CiAgPGxpbmUgeDE9IjIiIHgyPSI1IiB5MT0iOCIgeTI9IjgiIC8+CiAgPGxpbmUgeDE9IjE2IiB4Mj0iMTYiIHkxPSIxOSIgeTI9IjIyIiAvPgogIDxsaW5lIHgxPSIxOSIgeDI9IjIyIiB5MT0iMTYiIHkyPSIxNiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/unlink\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 Unlink = createLucideIcon(__iconData);\n\nexport default Unlink;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'user',\n size: 24,\n node: [\n ['path', { d: 'M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2', key: '975kel' }],\n ['circle', { cx: '12', cy: '7', r: '4', key: '17ys0d' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name User\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTkgMjF2LTJhNCA0IDAgMCAwLTQtNEg5YTQgNCAwIDAgMC00IDR2MiIgLz4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjciIHI9IjQiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/user\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 User = createLucideIcon(__iconData);\n\nexport default User;\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\nexport const 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 // tasks from the live board, epics from the node (their roadmap status): one StatusIcon for both, as in Linked docs\n const row = (n: GraphNode & { status?: string }) => {\n const task = n.kind === \"task\" ? tasks.get(n.id) : undefined\n const status = task ? displayStatus(task) : n.kind === \"epic\" ? n.status : 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 {status ? <StatusIcon status={status} 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 { useEffect, useState, useSyncExternalStore } from \"react\"\nimport { useApp } from \"@/context/AppContext\"\nimport type { LinkRow, TargetRow } from \"@/lib/doc-links\"\n\nexport type DocLinksData = { out: LinkRow[]; in: LinkRow[]; broken: LinkRow[]; stale: LinkRow[]; targets: Record<string, TargetRow> }\n\n/** Events that can change which files exist or what they link to. */\nexport const LINK_EVENTS = new Set([\"doc_updated\", \"doc_created\", \"doc_deleted\", \"doc_renamed\", \"task_created\", \"task_updated\", \"roadmap_updated\", \"memory_updated\", \"decision_logged\"])\n\n// A burst of LINK_EVENTS (an agent moving five tasks) becomes one generation bump, so one refetch per URL\nconst DEBOUNCE_MS = 250\nlet generation = 0\nlet timer: ReturnType<typeof setTimeout> | undefined\nconst subscribers = new Set<() => void>()\nfunction onSse(e: Event) {\n if (!LINK_EVENTS.has((e as CustomEvent<{ type: string }>).detail?.type)) return\n clearTimeout(timer)\n timer = setTimeout(() => {\n generation++\n cache.clear()\n subscribers.forEach((f) => f())\n }, DEBOUNCE_MS)\n}\n// Registered once for the page's life, never removed: the cache must be cleared even while no link view is mounted\n// (a change made while the user is on /board must not be served from a stale promise on the way back).\nif (typeof window !== \"undefined\") window.addEventListener(\"vibedoc:sse\", onSse)\nfunction subscribe(cb: () => void) {\n subscribers.add(cb)\n return () => { subscribers.delete(cb) }\n}\n\n/** Bumps ~250ms after the last file-changing SSE event; use it as an effect dep to refetch link data. */\nexport function useLinkGeneration(): number {\n return useSyncExternalStore(subscribe, () => generation, () => 0)\n}\n\n// One request per URL per generation, shared by every caller (DocViewer + the preview's link handling, strict\n// mode's double effect). A failure is evicted so Retry asks again.\nconst cache = new Map<string, Promise<unknown>>()\nexport function fetchLinkJson<T>(url: string): Promise<T> {\n let p = cache.get(url)\n if (!p) {\n p = fetch(url).then(async (r) => {\n const body = await r.json().catch(() => null)\n if (!r.ok) throw new Error(body?.error ?? `${r.status} ${r.statusText}`)\n return body\n })\n const mine = p\n mine.catch(() => { if (cache.get(url) === mine) cache.delete(url) })\n cache.set(url, mine)\n }\n return p as Promise<T>\n}\n\n/**\n * Resolved links of one .md file (R056), from GET /api/docs/links; null while loading, empty for an unknown file.\n * Refetched on file-changing SSE events. The browser never resolves paths: a clicked link is matched to this data\n * by its raw target string as written in the file (`../b/y.md` without `#h`, `[[DOMAIN_MAP]]` → `DOMAIN_MAP`),\n * looked up in `targets` first, then `broken`.\n */\nexport function useDocLinks(path: string | undefined): DocLinksData | null {\n const { rootParam } = useApp()\n const [data, setData] = useState<{ path: string; links: DocLinksData } | null>(null)\n const gen = useLinkGeneration()\n\n useEffect(() => {\n if (!path) return\n let live = true\n fetchLinkJson<Partial<DocLinksData>>(`/api/docs/links${rootParam}&path=${encodeURIComponent(path)}`)\n .then((d) => {\n if (live) setData({ path, links: { out: d.out ?? [], in: d.in ?? [], broken: d.broken ?? [], stale: d.stale ?? [], targets: d.targets ?? {} } })\n })\n .catch((e) => {\n console.warn(\"Loading doc links failed\", e)\n if (live) setData({ path, links: { out: [], in: [], broken: [], stale: [], targets: {} } })\n })\n return () => { live = false }\n }, [path, rootParam, gen])\n\n // another file's links never show while this one loads\n return path && data?.path === path ? data.links : null\n}\n","import { Bot, User } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport { ownerKind, ownerLabel } from \"@/lib/owner\"\n\n/** Who is in charge: a person icon for \"human\", a bot + agent name for \"ai:<agent>\". Nothing when unset. */\nexport function OwnerChip({ owner, className }: { owner: string | null; className?: string }) {\n const kind = ownerKind(owner)\n if (kind === \"none\") return null\n const Icon = kind === \"ai\" ? Bot : User\n return (\n <span title={`Owner: ${ownerLabel(owner)}`} className={cn(\"inline-flex items-center gap-1 text-[11px] text-muted\", className)}>\n <Icon className={cn(\"size-3.5 shrink-0\", kind === \"ai\" && \"text-accent\")} aria-hidden />\n {ownerLabel(owner)}\n </span>\n )\n}\n","// Who is in charge of a task / epic (R055): `**Owner:** human` or `**Owner:** ai:<agent>`.\n// Pure (no React, no fs). Self-check: `node src/lib/owner.check.mts`.\n\nexport type OwnerKind = \"human\" | \"ai\" | \"none\"\n\nconst KNOWN_AGENTS = [\"claude\", \"cursor\", \"codex\", \"copilot\", \"gemini\", \"windsurf\", \"cline\", \"opencode\"]\n\n/** \"human\" | \"ai:<agent>\" (lowercase), or null for empty / \"—\" / anything else. A bare \"ai\" becomes \"ai:agent\". */\nexport function parseOwner(raw: string | null | undefined): string | null {\n const v = (raw ?? \"\").trim().toLowerCase()\n if (v === \"human\") return \"human\"\n const m = v.match(/^ai(?::\\s*([a-z0-9._-]+))?$/)\n return m ? `ai:${m[1] ?? \"agent\"}` : null\n}\n\nexport function ownerKind(owner: string | null): OwnerKind {\n return owner === \"human\" ? \"human\" : owner?.startsWith(\"ai:\") ? \"ai\" : \"none\"\n}\n\n/** \"Human\", \"claude\", \"No owner\". */\nexport function ownerLabel(owner: string | null): string {\n return owner === \"human\" ? \"Human\" : owner?.startsWith(\"ai:\") ? owner.slice(3) : \"No owner\"\n}\n\n/** Agent name from an MCP client's User-Agent (\"claude-code/2.1\" → \"claude\"); \"agent\" when unknown. */\nexport function agentFromUserAgent(ua: string | null | undefined): string {\n const s = (ua ?? \"\").toLowerCase()\n return KNOWN_AGENTS.find((a) => s.includes(a)) ?? \"agent\"\n}\n","// Pure doc link graph (R056, no fs): resolved links between every .md file, derived from text, never stored.\n// Self-check: node src/lib/doc-links.check.mts. Regexes and labels are copied from memory-graph.ts (pure libs\n// never import values from each other), but here relative `./` and `../` targets are resolved.\n\nexport type DocNodeKind = 'doc' | 'adr' | 'task' | 'epic' | 'entry'\n/** `status` / `owner` are set on task and epic nodes by GET /api/docs/graph, never by docNode(). */\nexport type DocNode = { id: string; kind: DocNodeKind; label: string; path: string; status?: string; owner?: string | null }\nexport type LinkKind = 'md' | 'wiki' | 'code' | 'id'\n/** `context`: the sentence around the link (or the heading above it), set only when the link text is just the target. */\nexport type DocLink = { target: string; kind: LinkKind; line: number; text: string; context?: string }\n/** One file as the graph needs it: its node and its raw (unresolved) links. core.ts caches this per file. */\nexport type DocItem = { node: DocNode; links: DocLink[] }\nexport type DocEdge = { from: string; to: string; line: number; text: string; context?: string }\nexport type BrokenLink = { from: string; target: string; line: number; text: string; kind: LinkKind }\n/** Raw link target as written in a file → the file it resolves to (self-links included). Keyed by source path. */\nexport type ResolvedTargets = Record<string, Record<string, string>>\n/** `broken`: md / wiki links that point nowhere. `stale`: backticked paths (`code`) to a file that doesn't exist. */\nexport type DocGraph = { nodes: DocNode[]; edges: DocEdge[]; broken: BrokenLink[]; stale: BrokenLink[]; targets: ResolvedTargets }\n/** `status`: a linked task's or epic's status, set by GET /api/docs/links (as on graph nodes), never by docLinks(). */\nexport type LinkRow = { path: string; kind: string; label: string; line: number; text: string; context?: string; status?: 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 ID_ONLY_RE = /^(E\\d+|T\\d{3,}|R\\d{3,}|ADR-\\d+)$/\nconst BACKTICK_MD_RE = /`([^`\\s]+\\.md)`/g\nconst LINK_MD_RE = /\\[([^\\]]*)\\]\\(\\s*<?([^)\\s>#]+\\.md)(?:#[^)\\s]*)?>?(?:\\s+\"[^\"]*\"|\\s+'[^']*')?\\s*\\)/g\nconst FENCE_RE = /^\\s*(`{3,}|~{3,})/\nconst INLINE_CODE_RE = /(`+)[^`]*?\\1/g\n\n/** Targets are keyed decoded (`my%20doc.md` → `my doc.md`), as the client looks them up after marked encodes. */\nconst decode = (t: string) => { try { return decodeURI(t) } catch { return t } }\n/** A source line as plain prose: list / heading / checkbox markers, link syntax, code ticks and emphasis removed. */\nconst plainLine = (l: string) => l\n .replace(/^\\s*(?:#{1,6}|>|[-*+]|\\d+\\.)\\s+(?:\\[[ xX]\\]\\s+)?/, '')\n .replace(/\\[\\[([^\\]|#]+)(?:#[^\\]|]*)?(?:\\|([^\\]]+))?\\]\\]/g, (_, a, b) => b ?? a)\n .replace(/\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1')\n .replace(/`|\\*\\*|__/g, '')\n .trim()\n\n/** The sentence of `line` that holds `text`, minus a leading `text:`; the heading above when the line is only the link. */\nfunction linkContext(line: string, text: string, heading: string): string {\n const sentence = plainLine(line).split(/(?<=[.!?])\\s+/).find(s => s.includes(text)) ?? ''\n const rest = (sentence.startsWith(text) ? sentence.slice(text.length).replace(/^[\\s:,;–—-]+/, '') : sentence).trim()\n return (/[A-Za-z]{3}/.test(rest.replace(text, '')) ? rest : heading).slice(0, 200)\n}\n\n/**\n * A target written as a template, never a file: `<slug>`, `{id}`, globs, `…` / `...`, and `T00N` / `NNN` / `XXX` /\n * `YYYY` tokens (`plans/tasks/T<NNN>-<slug>.md`, `docs/meetings/YYYY-MM-DD.md`). Skipped at extraction.\n */\nconst PLACEHOLDER_RE = /[<>{}*?…]|\\.\\.\\.|(?:^|[^A-Za-z0-9])(?:[A-Z]?0+N|N{2,}|X{3,}|YYYY)(?![A-Za-z0-9])/\n/**\n * Names that teach link syntax in specs (`[text](path.md)`, `[[name]]`, `[[wikilinks]]`, `docs/a/x.md`): the whole\n * file name is one of these, or the rest after an item id (`T001-x.md`, `ADR-001-title.md`). Only ever drops a miss,\n * so a real `x.md` still links. Never a `-` part of a longer name: `user-name.md` and `plan-b.md` are real misses.\n * `missing` is deliberately not here: e2e fixtures use it for a real broken link.\n */\nconst EXAMPLE_NAMES = new Set(['a', 'b', 'c', 'x', 'y', 'z', 'path', 'name', 'slug', 'title', 'foo', 'bar', 'wikilinks', 'example'])\nexport function isExampleTarget(target: string): boolean {\n const name = (target.split('/').pop() ?? '').replace(/\\.md$/i, '').replace(/^(?:ADR-\\d+|[TRE]\\d+)-/, '')\n return EXAMPLE_NAMES.has(name.toLowerCase())\n}\n\nconst WIKI_RE = /\\[\\[([^\\]|#]+)(?:#[^\\]|]*)?(?:\\|([^\\]]+))?\\]\\]/g\nconst EXTERNAL_RE = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i\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\n/** Posix-normalize: backslashes, `.` and `..` segments, leading `./` or `/`. Escaping above the root → null. */\nfunction normalizePath(p: string): string | null {\n const out: string[] = []\n for (const seg of p.replace(/\\\\/g, '/').split('/')) {\n if (!seg || seg === '.') continue\n if (seg === '..') { if (!out.length) return null; out.pop() } else out.push(seg)\n }\n return out.join('/')\n}\n\nconst dirOf = (p: string) => p.includes('/') ? p.slice(0, p.lastIndexOf('/')) : ''\nconst baseName = (p: string) => (p.split('/').pop() ?? p).replace(/\\.md$/i, '')\n\n/** The item id a file stands for (T093, R056, E001, ADR-004), from its path; null for a plain doc. */\nfunction idOfPath(p: string): string | null {\n const m = /^plans\\/tasks\\/(T\\d{3,})[^/]*\\.md$/.exec(p) ?? /^plans\\/roadmap\\/(R\\d{3,})[^/]*\\.md$/.exec(p)\n ?? /^memory\\/entries\\/(E\\d+)[^/]*\\.md$/.exec(p) ?? /(?:^|\\/)(ADR-\\d+)[^/]*\\.md$/.exec(p)\n return m ? normalizeId(m[1]) : null\n}\n\n/** Inline markdown → plain text for a label: images and links keep their text, emphasis / code marks go. */\nfunction plainText(md: string): string {\n return md\n .replace(/!?\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1')\n .replace(/\\[\\[([^\\]|]+)(?:\\|([^\\]]+))?\\]\\]/g, (_, t: string, alias?: string) => alias ?? t)\n .replace(/(\\*\\*|\\*|~~|`)(\\S(?:.*?\\S)?)\\1/g, '$2')\n .replace(/(^|\\W)(__|_)(\\S(?:.*?\\S)?)\\2(?=\\W|$)/g, '$1$3') // _em_, never snake_case\n .replace(/<[^>]+>/g, '')\n .trim()\n}\n\n/**\n * Classify a markdown file by path. Label = its H1 without the \"ID: \" prefix, else the file name. An H1 that reads as\n * a sentence (ends in . or !, like AGENTS.md's \"See CLAUDE.md — this file mirrors it…\") is prose, not a title.\n */\nexport function docNode(relPath: string, raw: string): DocNode {\n const p = normalizePath(relPath) ?? relPath\n const name = baseName(p)\n const heading = plainText(/^#\\s+(.+?)\\s*$/m.exec(raw)?.[1] ?? '')\n const h1 = /[^.][.!]$/.test(heading) ? '' : heading\n const label = (id: string) => h1.replace(new RegExp(`^${id}\\\\s*[:—–-]\\\\s*`), '') || name\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 = /^memory\\/entries\\/(E\\d+)[^/]*\\.md$/.exec(p))) return { id: normalizeId(m[1]), kind: 'entry', label: label(m[1]), path: p }\n if ((m = /(?:^|\\/)(ADR-\\d+)[^/]*\\.md$/.exec(p))) return { id: normalizeId(m[1]), kind: 'adr', label: label(m[1]), path: p }\n return { id: p, kind: 'doc', label: h1 || name, path: p }\n}\n\n/**\n * Links in `raw`, in order, with 1-based line numbers. Lines inside ``` / ~~~ fences and external URLs are skipped;\n * md and wiki links inside inline code spans too. Indented code blocks are not detected (nested lists look alike).\n */\nexport function extractLinks(raw: string, _fromPath?: string): DocLink[] {\n const links: DocLink[] = []\n let fence = '' // the opening marker while inside a fence\n let heading = ''\n raw.replace(/\\r\\n/g, '\\n').split('\\n').forEach((l, i) => {\n const f = FENCE_RE.exec(l)?.[1]\n if (f && (!fence || (f[0] === fence[0] && f.length >= fence.length))) { fence = fence ? '' : f; return }\n if (fence) return\n const line = i + 1\n const from = links.length\n const prose = l.replace(INLINE_CODE_RE, m => ' '.repeat(m.length))\n for (const m of prose.matchAll(LINK_MD_RE)) {\n // text from the original line (same offsets): [`code`](x.md) keeps its label\n const text = l.slice(m.index + 1, m.index + 1 + m[1].length)\n if (!EXTERNAL_RE.test(m[2]) && !PLACEHOLDER_RE.test(m[2])) links.push({ target: decode(m[2]), kind: 'md', line, text: text || m[2] })\n }\n for (const m of prose.matchAll(WIKI_RE)) {\n const target = decode(m[1].trim())\n if (target && !EXTERNAL_RE.test(target) && !PLACEHOLDER_RE.test(target)) links.push({ target, kind: 'wiki', line, text: (m[2] ?? target).trim() })\n }\n for (const m of l.matchAll(BACKTICK_MD_RE)) {\n // a glob (`memory/entries/E*.md`) or a template (`E001-<slug>.md`) names a pattern, not a file\n if (!EXTERNAL_RE.test(m[1]) && !PLACEHOLDER_RE.test(m[1])) links.push({ target: decode(m[1]), kind: 'code', line, text: m[1] })\n }\n for (const m of l.matchAll(ID_RE)) {\n if (/^E0+$/.test(m[1])) continue // E0 is not an entry id\n links.push({ target: normalizeId(m[1]), kind: 'id', line, text: m[1] })\n }\n // a bare link (text = target) says nothing by itself: carry the sentence it sits in\n for (const k of links.slice(from)) if (k.text === k.target) {\n const context = linkContext(l, k.text, heading)\n if (context) k.context = context\n }\n if (/^#{1,6}\\s/.test(l)) heading = plainLine(l)\n })\n return links\n}\n\ntype PathIndex = { set: Set<string>; byBase: Map<string, string[]>; byId: Map<string, string> }\nconst indexCache = new WeakMap<readonly string[], PathIndex>()\n\nfunction indexOf(allPaths: readonly string[]): PathIndex {\n let idx = indexCache.get(allPaths)\n if (idx) return idx\n idx = { set: new Set(allPaths), byBase: new Map(), byId: new Map() }\n for (const p of allPaths) {\n const b = baseName(p).toLowerCase()\n idx.byBase.set(b, [...(idx.byBase.get(b) ?? []), p])\n const id = idOfPath(p)\n if (id && !idx.byId.has(id)) idx.byId.set(id, p)\n }\n indexCache.set(allPaths, idx)\n return idx\n}\n\n/** Files named exactly `t` (case-insensitive, `.md` added when missing), anywhere in the repo. */\nfunction bareHits(t: string, idx: PathIndex): string[] {\n const file = (/\\.md$/i.test(t) ? t : `${t}.md`).toLowerCase()\n return (idx.byBase.get(baseName(file)) ?? []).filter(p => (p.split('/').pop() ?? '').toLowerCase() === file)\n}\n\n/**\n * The file a link points at, or null (broken). Paths: relative to the source folder, then root-relative.\n * An explicit `./` or `../` never falls back to the root. Wikilinks: by basename without `.md`, same folder first,\n * then the shortest path; [[T093]] / [[E1]] go to the item's file first. Ids: the item's file.\n * `target` is taken as written, already decoded (extractLinks decodes).\n * `kind` is inferred when left out: an id token → id, no `.md` → wiki, else a path.\n * Paths: a leading `@` (Claude include, `@docs/HLD.md`) is dropped. A backticked bare name (`MEMORY.md`) that is in\n * neither folder resolves when exactly one file in the repo has that name; an md link never does.\n */\nexport function resolveLink(target: string, fromPath: string, allPaths: readonly string[], kind?: LinkKind): string | null {\n const idx = indexOf(allPaths)\n const k = kind ?? (ID_ONLY_RE.test(target) ? 'id' : /\\.md$/i.test(target) ? 'md' : 'wiki')\n if (k === 'id') return idx.byId.get(normalizeId(target)) ?? null\n\n if (k === 'wiki' && ID_ONLY_RE.test(target)) {\n const byId = idx.byId.get(normalizeId(target))\n if (byId) return byId\n }\n const t = k === 'wiki' ? target : target.replace(/^@(?=[^/@])/, '')\n const explicitRel = /^\\.\\.?\\//.test(t)\n const from = normalizePath(fromPath) ?? fromPath\n const tryPath = (p: string) => {\n const cands = [p, /\\.md$/i.test(p) ? null : `${p}.md`].filter((c): c is string => !!c)\n for (const c of cands) {\n const rel = t.startsWith('/') ? null : normalizePath(`${dirOf(from)}/${c}`)\n if (rel !== null && idx.set.has(rel)) return rel\n if (explicitRel) continue\n const abs = normalizePath(c)\n if (abs !== null && idx.set.has(abs)) return abs\n }\n return null\n }\n if (k !== 'wiki') {\n // a link must work as written (it does on GitHub too); a backticked mention only has to name the file\n const hits = k !== 'code' || t.includes('/') ? [] : bareHits(t, idx)\n return tryPath(t) ?? (hits.length === 1 ? hits[0] : null)\n }\n\n // wikilink: an exact path first ([[docs/HLD]]), then by basename\n const exact = t.includes('/') ? tryPath(t) : null\n if (exact) return exact\n const name = baseName(t).toLowerCase()\n const suffix = t.includes('/') ? `/${t.replace(/\\.md$/i, '').toLowerCase()}.md` : null\n const hits = (idx.byBase.get(name) ?? []).filter(p => !suffix || `/${p.toLowerCase()}`.endsWith(suffix))\n if (!hits.length) return null\n const dir = dirOf(from)\n return hits.find(p => dirOf(p) === dir)\n ?? [...hits].sort((a, b) => a.split('/').length - b.split('/').length || a.length - b.length || a.localeCompare(b))[0]\n}\n\n/**\n * Resolve every item's links. One edge per from→to pair (first line wins), self-links dropped. Misses: md / wiki\n * links → broken, backticked paths → stale (a mention of a moved or planned file, not a link).\n * Not misses: a target that exists among `otherPaths` (files outside the graph, e.g. `.claude/**`; no node, no edge),\n * a backticked bare name several files share (it exists, just not one file), and a syntax example (`isExampleTarget`).\n */\nexport function buildDocGraph(items: DocItem[], otherPaths: readonly string[] = []): DocGraph {\n const allPaths = items.map(i => i.node.path)\n const known = [...allPaths, ...otherPaths]\n const exists = (l: DocLink, from: string) => resolveLink(l.target, from, known, l.kind) !== null\n || (l.kind === 'code' && !l.target.includes('/') && bareHits(l.target, indexOf(known)).length > 0)\n const edges = new Map<string, DocEdge>()\n const broken = new Map<string, BrokenLink>()\n const stale = new Map<string, BrokenLink>()\n const targets: ResolvedTargets = {}\n for (const { node, links } of items) {\n for (const l of links) {\n const to = resolveLink(l.target, node.path, allPaths, l.kind)\n if (to !== null) (targets[node.path] ??= {})[l.target] ??= to\n if (to === node.path) continue\n if (to === null) {\n // an id with no file (T999, a typo) is just text, not a broken link\n if (l.kind === 'id' || isExampleTarget(l.target) || exists(l, node.path)) continue\n const key = `${node.path}\\u0000${l.target}`\n const misses = l.kind === 'code' ? stale : broken\n if (!misses.has(key)) misses.set(key, { from: node.path, target: l.target, line: l.line, text: l.text, kind: l.kind })\n continue\n }\n const key = `${node.path}\\u0000${to}`\n if (!edges.has(key)) edges.set(key, { from: node.path, to, line: l.line, text: l.text, ...(l.context && { context: l.context }) })\n }\n }\n return { nodes: items.map(i => i.node), edges: [...edges.values()], broken: [...broken.values()], stale: [...stale.values()], targets }\n}\n\n/** The kinds /graph shows when its URL names none. */\nexport const GRAPH_DEFAULT_KINDS: readonly DocNodeKind[] = ['doc', 'adr']\n\n/** /graph selected on one file with Focus 1 (\"Show in graph\"); a task, epic or entry also turns its kind on. */\nexport function graphHref(path: string): string {\n const p = new URLSearchParams({ node: path, focus: '1' })\n const kind = docNode(path, '').kind\n if (!GRAPH_DEFAULT_KINDS.includes(kind)) p.set('kinds', [...GRAPH_DEFAULT_KINDS, kind].join(','))\n return `/graph?${p}`\n}\n\nexport type TargetRow = { path: string; kind: DocNodeKind; id: string; label: string }\n\n/**\n * Links out of, into, broken and stale paths in one file; null when the path is not in the graph.\n * `targets` maps each raw target written in the file (`../b/y.md`, `DOMAIN_MAP`, `T093`) to its node, so a client\n * can open a clicked link without resolving paths itself. A target in both `targets` and `broken` resolved.\n */\nexport function docLinks(graph: DocGraph, path: string): { out: LinkRow[]; in: LinkRow[]; broken: LinkRow[]; stale: LinkRow[]; targets: Record<string, TargetRow> } | null {\n const p = normalizePath(path) ?? path\n const byPath = new Map(graph.nodes.map(n => [n.path, n]))\n if (!byPath.has(p)) return null\n const row = (other: string, e: DocEdge): LinkRow => {\n const n = byPath.get(other)\n return { path: other, kind: n?.kind ?? 'doc', label: n?.label ?? baseName(other), line: e.line, text: e.text, ...(e.context && { context: e.context }) }\n }\n const miss = (b: BrokenLink): LinkRow => ({ path: b.target, kind: b.kind, label: b.target, line: b.line, text: b.text })\n return {\n out: graph.edges.filter(e => e.from === p).map(e => row(e.to, e)),\n in: graph.edges.filter(e => e.to === p).map(e => row(e.from, e)),\n broken: graph.broken.filter(b => b.from === p).map(miss),\n stale: graph.stale.filter(b => b.from === p).map(miss),\n targets: Object.fromEntries(Object.entries(graph.targets[p] ?? {}).map(([t, to]) => {\n const n = byPath.get(to)\n return [t, { path: to, kind: n?.kind ?? 'doc', id: n?.id ?? to, label: n?.label ?? baseName(to) }]\n })),\n }\n}\n\n/**\n * Footer for vibedoc_read_doc (T096): the files a doc links to and is linked from, each named so an agent can\n * pass it straight to a tool (tasks, epics, entries, ADRs by id; docs by path). Empty string when no links.\n */\nexport function formatRelatedFiles(links: { out: LinkRow[]; in: LinkRow[]; broken: LinkRow[]; stale?: LinkRow[] } | null, cap = 10): string {\n if (!links) return ''\n const name = (r: LinkRow) => idOfPath(r.path) ?? r.path\n const line = (label: string, items: string[]) => {\n if (!items.length) return []\n const more = items.length > cap ? ` (+${items.length - cap} more)` : ''\n return [`${label}: ${items.slice(0, cap).join(' · ')}${more}`]\n }\n const body = [\n ...line('Links to', links.out.map(name)),\n ...line('Linked from', links.in.map(r => `${name(r)} (L${r.line})`)),\n ...line('Broken', links.broken.map(r => `${r.path} (L${r.line})`)),\n ...line('Stale paths', (links.stale ?? []).map(r => `${r.path} (L${r.line})`)),\n ]\n if (!body.length) return ''\n return ['## Related files', ...body, 'Read with vibedoc_read_doc, or several at once with vibedoc_get_context { paths }.'].join('\\n')\n}\n\n/** The parts of an activity event (core's ActivityEvent) that say which file it touched. */\nexport type TouchEvent = { timestamp: string; type: string; title: string; detail?: string; taskId?: string }\nconst TOUCH_ID_RE = /^(?:Entry )?(E\\d+|T\\d{3,}|R\\d{3,}|ADR-\\d+)\\b/\nconst DOC_EVENTS = new Set(['doc_updated', 'doc_created'])\n\n/**\n * Paths of the files an agent or a human changed since `since` (ms), from the activity log (T110 \"Recent\"): task\n * moves and edits (taskId), epics / entries / ADRs (the id leading the title), doc edits and creates (detail = path),\n * a rename's new path and the session handoff (memory/MEMORY.md). Events for files that no longer exist drop out.\n */\nexport function touchedPaths(events: readonly TouchEvent[], nodes: readonly DocNode[], since: number): Set<string> {\n const byKey = new Map<string, string>()\n for (const n of nodes) { byKey.set(n.id, n.path); byKey.set(n.path, n.path) }\n const out = new Set<string>()\n for (const e of events) {\n if (!(Date.parse(e.timestamp) >= since)) continue\n const keys = [e.taskId, TOUCH_ID_RE.exec(e.title)?.[1]]\n if (DOC_EVENTS.has(e.type)) keys.push(e.detail)\n if (e.type === 'doc_renamed') keys.push(e.title.split(' → ')[1])\n if (e.type === 'memory_updated' && !e.title.startsWith('Entry ')) keys.push('memory/MEMORY.md')\n for (const k of keys) {\n const p = k ? byKey.get(k.trim()) : undefined\n if (p) out.add(p)\n }\n }\n return out\n}\n"],"names":["GROUPS","kind","label","KIND_ICON","epic","adr","doc","entry","task","useOpenNode","onOpenEntry","router","openDoc","n","push","id","path","EntryRelated","entryId","rootParam","summary","board","open","graph","setGraph","live","fetch","encodeURIComponent","then","r","json","g","nodes","edges","catch","e","console","warn","tasks","Map","Object","values","flat","map","t","byId","pick","ids","get","filter","linksTo","from","to","linkedFrom","row","undefined","status","Icon","type","onClick","title","className","section","group","length","KNOWN_AGENTS","parseOwner","raw","v","trim","toLowerCase","m","match","ownerKind","owner","startsWith","ownerLabel","slice","agentFromUserAgent","ua","s","find","a","includes","ID_RE","ID_ONLY_RE","BACKTICK_MD_RE","LINK_MD_RE","FENCE_RE","INLINE_CODE_RE","decode","decodeURI","plainLine","l","replace","_","b","linkContext","line","text","heading","sentence","split","rest","test","PLACEHOLDER_RE","EXAMPLE_NAMES","Set","isExampleTarget","target","name","pop","has","WIKI_RE","EXTERNAL_RE","pad3","String","Number","padStart","normalizeId","normalizePath","p","out","seg","join","dirOf","lastIndexOf","baseName","idOfPath","exec","plainText","md","alias","docNode","relPath","h1","RegExp","extractLinks","_fromPath","links","fence","forEach","i","f","prose","repeat","matchAll","index","k","context","indexCache","WeakMap","indexOf","allPaths","idx","set","byBase","bareHits","file","resolveLink","fromPath","explicitRel","tryPath","cands","c","rel","abs","hits","exact","suffix","endsWith","dir","sort","localeCompare","buildDocGraph","items","otherPaths","node","known","exists","broken","stale","targets","key","misses","GRAPH_DEFAULT_KINDS","graphHref","URLSearchParams","focus","docLinks","byPath","other","miss","in","fromEntries","entries","formatRelatedFiles","cap","more","body","TOUCH_ID_RE","DOC_EVENTS","touchedPaths","events","since","byKey","Date","parse","timestamp","keys","taskId","detail","add"],"mappings":"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","ignoreList":[0,1,2,3,4,5]}
@@ -0,0 +1,3 @@
1
+ module.exports=[89032,a=>{"use strict";var b=a.i(256857);let c={name:"info",size:24,node:[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]};c.node;let d=(0,b.default)(c);a.s(["Info",0,d],89032)},340753,a=>{"use strict";var b=a.i(256857);let c={name:"list-checks",size:24,node:[["path",{d:"M13 5h8",key:"a7qcls"}],["path",{d:"M13 12h8",key:"h98zly"}],["path",{d:"M13 19h8",key:"c3s6r1"}],["path",{d:"m3 17 2 2 4-4",key:"1jhpwq"}],["path",{d:"m3 7 2 2 4-4",key:"1obspn"}]]};c.node;let d=(0,b.default)(c);a.s(["ListChecks",0,d],340753)},661661,a=>{"use strict";var b=a.i(256857);let c={name:"pencil",size:24,node:[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]};c.node;let d=(0,b.default)(c);a.s(["Pencil",0,d],661661)},227246,a=>{"use strict";var b=a.i(256857);let c={name:"refresh-cw",size:24,node:[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]};c.node;let d=(0,b.default)(c);a.s(["RefreshCw",0,d],227246)},340933,a=>{"use strict";var b=a.i(256857);let c={name:"triangle-alert",size:24,node:[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]],aliases:["alert-triangle"]};c.node;let d=(0,b.default)(c);a.s(["AlertTriangle",0,d],340933)},578520,a=>{"use strict";var b=a.i(662145),c=a.i(892678),d=a.i(256857);let e={name:"file-pen",size:24,node:[["path",{d:"M12.659 22H18a2 2 0 0 0 2-2V8a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 14 2H6a2 2 0 0 0-2 2v9.34",key:"o6klzx"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M10.378 12.622a1 1 0 0 1 3 3.003L8.36 20.637a2 2 0 0 1-.854.506l-2.867.837a.5.5 0 0 1-.62-.62l.836-2.869a2 2 0 0 1 .506-.853z",key:"zhnas1"}]],aliases:["file-edit"]};e.node;let f=(0,d.default)(e);var g=a.i(228705);let h={name:"file-search",size:24,node:[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["circle",{cx:"11.5",cy:"14.5",r:"2.5",key:"1bq0ko"}],["path",{d:"M13.3 16.3 15 18",key:"2quom7"}]]};h.node;let i=(0,d.default)(h);var j=a.i(926128);let k={name:"file-x",size:24,node:[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"m14.5 12.5-5 5",key:"b62r18"}],["path",{d:"m9.5 12.5 5 5",key:"1rk7el"}]]};k.node;let l=(0,d.default)(k);var m=a.i(340753),n=a.i(899593),o=a.i(909898),p=a.i(227246),q=a.i(471617),r=a.i(842717),s=a.i(173628);let t={task_updated:m.ListChecks,decision_logged:q.Scale,memory_updated:r.Brain,doc_read:i,doc_created:g.FilePlus,doc_updated:j.FileText,doc_deleted:l,doc_renamed:f,session_start:o.Plug,registry_rebuilt:p.RefreshCw,roadmap_updated:n.Map},u=a=>new Date(a).toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",hourCycle:"h23"});a.s(["ActivityEventRow",0,function({event:a,showActor:d=!1}){let e=t[a.type]??j.FileText;return(0,b.jsxs)("div",{className:"grid grid-cols-[2.75rem_1.5rem_minmax(0,1fr)] items-start py-1.5",children:[(0,b.jsx)("time",{dateTime:a.timestamp,title:new Date(a.timestamp).toLocaleString(),className:"pt-px text-right font-mono text-[11px] leading-5 text-muted tabular-nums",children:u(a.timestamp)}),(0,b.jsx)("span",{className:"flex justify-center pt-[3px]",children:"task_updated"===a.type&&a.taskStatus?(0,b.jsx)(s.StatusIcon,{status:a.taskStatus}):(0,b.jsx)(e,{className:"size-3.5 text-muted","aria-hidden":!0})}),(0,b.jsxs)("div",{className:"flex min-w-0 flex-col gap-0.5 sm:flex-row sm:items-baseline sm:gap-2",children:[(0,b.jsx)("span",{className:"min-w-0 text-sm leading-5 text-txt sm:shrink-0 sm:max-w-[60%] sm:truncate",children:a.title}),a.detail&&(0,b.jsx)("span",{className:"min-w-0 truncate text-xs leading-5 text-muted",children:a.detail}),d&&"human"===a.actor&&(0,b.jsxs)("span",{className:"flex shrink-0 items-center gap-1 font-mono text-[10px] text-muted sm:ml-auto",children:[(0,b.jsx)(c.User,{className:"size-3","aria-hidden":!0}),"you"]})]})]})},"clock",0,u,"timeAgo",0,function(a){let b=(Date.now()-new Date(a).getTime())/1e3;return b<60?"just now":b<3600?`${Math.floor(b/60)}m ago`:b<86400?`${Math.floor(b/3600)}h ago`:`${Math.floor(b/86400)}d ago`}],578520)},21215,a=>{"use strict";var b=a.i(662145),c=a.i(368114);a.s(["EmptyState",0,function({icon:a,message:d,subMessage:e,bordered:f}){return(0,b.jsxs)("div",{className:(0,c.cn)("text-center py-16 text-muted text-sm",f&&"border border-dashed border-border rounded-xl"),children:[(0,b.jsx)("p",{className:"text-3xl mb-3",children:a}),(0,b.jsx)("p",{children:d}),e&&(0,b.jsx)("p",{className:"text-xs mt-1",children:e})]})}])},192698,a=>{"use strict";var b=a.i(662145),c=a.i(368114);function d({properties:a,className:e,children:f}){let g=a.filter(a=>null!==a.value&&void 0!==a.value&&!1!==a.value);return 0!==g.length||f?(0,b.jsxs)("dl",{className:(0,c.cn)("grid grid-cols-[minmax(6.5rem,8.5rem)_minmax(0,1fr)] items-center gap-x-2 text-[13px]",e),children:[g.map(a=>(0,b.jsxs)("div",{className:"contents",children:[(0,b.jsxs)("dt",{className:"flex min-h-8 min-w-0 items-center gap-2 text-muted",children:[a.icon&&(0,b.jsx)(a.icon,{className:"size-3.5 shrink-0","aria-hidden":!0}),(0,b.jsx)("span",{className:"min-w-0 truncate",children:a.label})]}),(0,b.jsx)("dd",{className:"flex min-h-8 min-w-0 items-center gap-2 text-txt",children:a.value})]},a.id??String(a.label))),f&&(0,b.jsx)("div",{className:"col-span-2 flex min-h-8 items-center",children:f})]}):null}a.s(["ItemPanelHeader",0,function({kicker:a,title:e,menu:f,properties:g,className:h,children:i}){return(0,b.jsxs)("header",{"data-item-header":!0,className:(0,c.cn)("flex shrink-0 flex-col gap-2 border-b border-border px-5 pb-4 pt-4",h),children:[(0,b.jsxs)("div",{className:"flex min-h-7 items-center gap-2 pr-8 font-mono text-[11px] text-muted",children:[(0,b.jsx)("div",{className:"flex min-w-0 flex-1 items-center gap-1",children:a}),f]}),(0,b.jsx)("div",{className:"text-base font-semibold leading-snug text-txt",children:e}),(0,b.jsx)(d,{properties:g,className:"-my-0.5"}),i]})},"PropertyRows",0,d])}];
2
+
3
+ //# sourceMappingURL=_0o8t6j-._.js.map