trybeacon 0.1.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 (994) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-path-routes-manifest.json +59 -0
  3. package/.next/build/56416d4ae4ce586f.js +6 -0
  4. package/.next/build/56416d4ae4ce586f.js.map +5 -0
  5. package/.next/build/chunks/[root-of-the-server]__0oj80bi._.js +206 -0
  6. package/.next/build/chunks/[root-of-the-server]__0oj80bi._.js.map +8 -0
  7. package/.next/build/chunks/[root-of-the-server]__1f933tp._.js +500 -0
  8. package/.next/build/chunks/[root-of-the-server]__1f933tp._.js.map +11 -0
  9. package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_0b7xl6g._.js +13 -0
  10. package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_0b7xl6g._.js.map +5 -0
  11. package/.next/build/chunks/[turbopack]_runtime.js +890 -0
  12. package/.next/build/chunks/[turbopack]_runtime.js.map +11 -0
  13. package/.next/build/chunks/node_modules_20v-8wl._.js +6824 -0
  14. package/.next/build/chunks/node_modules_20v-8wl._.js.map +47 -0
  15. package/.next/build/package.json +1 -0
  16. package/.next/build-manifest.json +21 -0
  17. package/.next/diagnostics/build-diagnostics.json +6 -0
  18. package/.next/diagnostics/framework.json +1 -0
  19. package/.next/diagnostics/route-bundle-stats.json +100 -0
  20. package/.next/export-marker.json +6 -0
  21. package/.next/fallback-build-manifest.json +13 -0
  22. package/.next/images-manifest.json +68 -0
  23. package/.next/next-minimal-server.js.nft.json +1 -0
  24. package/.next/next-server.js.nft.json +1 -0
  25. package/.next/package.json +1 -0
  26. package/.next/prerender-manifest.json +167 -0
  27. package/.next/required-server-files.js +338 -0
  28. package/.next/required-server-files.json +338 -0
  29. package/.next/routes-manifest.json +402 -0
  30. package/.next/server/app/_global-error/page/app-paths-manifest.json +3 -0
  31. package/.next/server/app/_global-error/page/build-manifest.json +17 -0
  32. package/.next/server/app/_global-error/page/next-font-manifest.json +6 -0
  33. package/.next/server/app/_global-error/page/react-loadable-manifest.json +1 -0
  34. package/.next/server/app/_global-error/page/server-reference-manifest.json +4 -0
  35. package/.next/server/app/_global-error/page.js +10 -0
  36. package/.next/server/app/_global-error/page.js.map +5 -0
  37. package/.next/server/app/_global-error/page.js.nft.json +1 -0
  38. package/.next/server/app/_global-error/page_client-reference-manifest.js +3 -0
  39. package/.next/server/app/_global-error.html +1 -0
  40. package/.next/server/app/_global-error.meta +15 -0
  41. package/.next/server/app/_global-error.rsc +14 -0
  42. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +5 -0
  43. package/.next/server/app/_global-error.segments/_full.segment.rsc +14 -0
  44. package/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
  45. package/.next/server/app/_global-error.segments/_index.segment.rsc +5 -0
  46. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  47. package/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
  48. package/.next/server/app/_not-found/page/build-manifest.json +17 -0
  49. package/.next/server/app/_not-found/page/next-font-manifest.json +11 -0
  50. package/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -0
  51. package/.next/server/app/_not-found/page/server-reference-manifest.json +4 -0
  52. package/.next/server/app/_not-found/page.js +15 -0
  53. package/.next/server/app/_not-found/page.js.map +5 -0
  54. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  55. package/.next/server/app/_not-found/page_client-reference-manifest.js +3 -0
  56. package/.next/server/app/_not-found.html +1 -0
  57. package/.next/server/app/_not-found.meta +16 -0
  58. package/.next/server/app/_not-found.rsc +24 -0
  59. package/.next/server/app/_not-found.segments/_full.segment.rsc +24 -0
  60. package/.next/server/app/_not-found.segments/_head.segment.rsc +6 -0
  61. package/.next/server/app/_not-found.segments/_index.segment.rsc +13 -0
  62. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -0
  63. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +5 -0
  64. package/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -0
  65. package/.next/server/app/api/code-graph/position/route/app-paths-manifest.json +3 -0
  66. package/.next/server/app/api/code-graph/position/route/build-manifest.json +9 -0
  67. package/.next/server/app/api/code-graph/position/route/server-reference-manifest.json +4 -0
  68. package/.next/server/app/api/code-graph/position/route.js +12 -0
  69. package/.next/server/app/api/code-graph/position/route.js.map +5 -0
  70. package/.next/server/app/api/code-graph/position/route.js.nft.json +1 -0
  71. package/.next/server/app/api/code-graph/position/route_client-reference-manifest.js +3 -0
  72. package/.next/server/app/api/code-graph/route/app-paths-manifest.json +3 -0
  73. package/.next/server/app/api/code-graph/route/build-manifest.json +9 -0
  74. package/.next/server/app/api/code-graph/route/server-reference-manifest.json +4 -0
  75. package/.next/server/app/api/code-graph/route.js +12 -0
  76. package/.next/server/app/api/code-graph/route.js.map +5 -0
  77. package/.next/server/app/api/code-graph/route.js.nft.json +1 -0
  78. package/.next/server/app/api/code-graph/route_client-reference-manifest.js +3 -0
  79. package/.next/server/app/api/context/embed-backfill/route/app-paths-manifest.json +3 -0
  80. package/.next/server/app/api/context/embed-backfill/route/build-manifest.json +9 -0
  81. package/.next/server/app/api/context/embed-backfill/route/server-reference-manifest.json +4 -0
  82. package/.next/server/app/api/context/embed-backfill/route.js +11 -0
  83. package/.next/server/app/api/context/embed-backfill/route.js.map +5 -0
  84. package/.next/server/app/api/context/embed-backfill/route.js.nft.json +1 -0
  85. package/.next/server/app/api/context/embed-backfill/route_client-reference-manifest.js +3 -0
  86. package/.next/server/app/api/context/feature/route/app-paths-manifest.json +3 -0
  87. package/.next/server/app/api/context/feature/route/build-manifest.json +9 -0
  88. package/.next/server/app/api/context/feature/route/server-reference-manifest.json +4 -0
  89. package/.next/server/app/api/context/feature/route.js +15 -0
  90. package/.next/server/app/api/context/feature/route.js.map +5 -0
  91. package/.next/server/app/api/context/feature/route.js.nft.json +1 -0
  92. package/.next/server/app/api/context/feature/route_client-reference-manifest.js +3 -0
  93. package/.next/server/app/api/context/file/route/app-paths-manifest.json +3 -0
  94. package/.next/server/app/api/context/file/route/build-manifest.json +9 -0
  95. package/.next/server/app/api/context/file/route/server-reference-manifest.json +4 -0
  96. package/.next/server/app/api/context/file/route.js +13 -0
  97. package/.next/server/app/api/context/file/route.js.map +5 -0
  98. package/.next/server/app/api/context/file/route.js.nft.json +1 -0
  99. package/.next/server/app/api/context/file/route_client-reference-manifest.js +3 -0
  100. package/.next/server/app/api/context/route/app-paths-manifest.json +3 -0
  101. package/.next/server/app/api/context/route/build-manifest.json +9 -0
  102. package/.next/server/app/api/context/route/server-reference-manifest.json +4 -0
  103. package/.next/server/app/api/context/route.js +11 -0
  104. package/.next/server/app/api/context/route.js.map +5 -0
  105. package/.next/server/app/api/context/route.js.nft.json +1 -0
  106. package/.next/server/app/api/context/route_client-reference-manifest.js +3 -0
  107. package/.next/server/app/api/db/backfill-access/route/app-paths-manifest.json +3 -0
  108. package/.next/server/app/api/db/backfill-access/route/build-manifest.json +9 -0
  109. package/.next/server/app/api/db/backfill-access/route/server-reference-manifest.json +4 -0
  110. package/.next/server/app/api/db/backfill-access/route.js +13 -0
  111. package/.next/server/app/api/db/backfill-access/route.js.map +5 -0
  112. package/.next/server/app/api/db/backfill-access/route.js.nft.json +1 -0
  113. package/.next/server/app/api/db/backfill-access/route_client-reference-manifest.js +3 -0
  114. package/.next/server/app/api/db/position/route/app-paths-manifest.json +3 -0
  115. package/.next/server/app/api/db/position/route/build-manifest.json +9 -0
  116. package/.next/server/app/api/db/position/route/server-reference-manifest.json +4 -0
  117. package/.next/server/app/api/db/position/route.js +15 -0
  118. package/.next/server/app/api/db/position/route.js.map +5 -0
  119. package/.next/server/app/api/db/position/route.js.nft.json +1 -0
  120. package/.next/server/app/api/db/position/route_client-reference-manifest.js +3 -0
  121. package/.next/server/app/api/db/reconcile-endpoints/route/app-paths-manifest.json +3 -0
  122. package/.next/server/app/api/db/reconcile-endpoints/route/build-manifest.json +9 -0
  123. package/.next/server/app/api/db/reconcile-endpoints/route/server-reference-manifest.json +4 -0
  124. package/.next/server/app/api/db/reconcile-endpoints/route.js +12 -0
  125. package/.next/server/app/api/db/reconcile-endpoints/route.js.map +5 -0
  126. package/.next/server/app/api/db/reconcile-endpoints/route.js.nft.json +1 -0
  127. package/.next/server/app/api/db/reconcile-endpoints/route_client-reference-manifest.js +3 -0
  128. package/.next/server/app/api/db/relations/[id]/route/app-paths-manifest.json +3 -0
  129. package/.next/server/app/api/db/relations/[id]/route/build-manifest.json +9 -0
  130. package/.next/server/app/api/db/relations/[id]/route/server-reference-manifest.json +4 -0
  131. package/.next/server/app/api/db/relations/[id]/route.js +12 -0
  132. package/.next/server/app/api/db/relations/[id]/route.js.map +5 -0
  133. package/.next/server/app/api/db/relations/[id]/route.js.nft.json +1 -0
  134. package/.next/server/app/api/db/relations/[id]/route_client-reference-manifest.js +3 -0
  135. package/.next/server/app/api/db/tables/[id]/route/app-paths-manifest.json +3 -0
  136. package/.next/server/app/api/db/tables/[id]/route/build-manifest.json +9 -0
  137. package/.next/server/app/api/db/tables/[id]/route/server-reference-manifest.json +4 -0
  138. package/.next/server/app/api/db/tables/[id]/route.js +12 -0
  139. package/.next/server/app/api/db/tables/[id]/route.js.map +5 -0
  140. package/.next/server/app/api/db/tables/[id]/route.js.nft.json +1 -0
  141. package/.next/server/app/api/db/tables/[id]/route_client-reference-manifest.js +3 -0
  142. package/.next/server/app/api/draft/approve/route/app-paths-manifest.json +3 -0
  143. package/.next/server/app/api/draft/approve/route/build-manifest.json +9 -0
  144. package/.next/server/app/api/draft/approve/route/server-reference-manifest.json +4 -0
  145. package/.next/server/app/api/draft/approve/route.js +16 -0
  146. package/.next/server/app/api/draft/approve/route.js.map +5 -0
  147. package/.next/server/app/api/draft/approve/route.js.nft.json +1 -0
  148. package/.next/server/app/api/draft/approve/route_client-reference-manifest.js +3 -0
  149. package/.next/server/app/api/draft/route/app-paths-manifest.json +3 -0
  150. package/.next/server/app/api/draft/route/build-manifest.json +9 -0
  151. package/.next/server/app/api/draft/route/server-reference-manifest.json +4 -0
  152. package/.next/server/app/api/draft/route.js +16 -0
  153. package/.next/server/app/api/draft/route.js.map +5 -0
  154. package/.next/server/app/api/draft/route.js.nft.json +1 -0
  155. package/.next/server/app/api/draft/route_client-reference-manifest.js +3 -0
  156. package/.next/server/app/api/draft/status/route/app-paths-manifest.json +3 -0
  157. package/.next/server/app/api/draft/status/route/build-manifest.json +9 -0
  158. package/.next/server/app/api/draft/status/route/server-reference-manifest.json +4 -0
  159. package/.next/server/app/api/draft/status/route.js +13 -0
  160. package/.next/server/app/api/draft/status/route.js.map +5 -0
  161. package/.next/server/app/api/draft/status/route.js.nft.json +1 -0
  162. package/.next/server/app/api/draft/status/route_client-reference-manifest.js +3 -0
  163. package/.next/server/app/api/edges/[id]/route/app-paths-manifest.json +3 -0
  164. package/.next/server/app/api/edges/[id]/route/build-manifest.json +9 -0
  165. package/.next/server/app/api/edges/[id]/route/server-reference-manifest.json +4 -0
  166. package/.next/server/app/api/edges/[id]/route.js +11 -0
  167. package/.next/server/app/api/edges/[id]/route.js.map +5 -0
  168. package/.next/server/app/api/edges/[id]/route.js.nft.json +1 -0
  169. package/.next/server/app/api/edges/[id]/route_client-reference-manifest.js +3 -0
  170. package/.next/server/app/api/edges/route/app-paths-manifest.json +3 -0
  171. package/.next/server/app/api/edges/route/build-manifest.json +9 -0
  172. package/.next/server/app/api/edges/route/server-reference-manifest.json +4 -0
  173. package/.next/server/app/api/edges/route.js +15 -0
  174. package/.next/server/app/api/edges/route.js.map +5 -0
  175. package/.next/server/app/api/edges/route.js.nft.json +1 -0
  176. package/.next/server/app/api/edges/route_client-reference-manifest.js +3 -0
  177. package/.next/server/app/api/endpoints/[id]/route/app-paths-manifest.json +3 -0
  178. package/.next/server/app/api/endpoints/[id]/route/build-manifest.json +9 -0
  179. package/.next/server/app/api/endpoints/[id]/route/server-reference-manifest.json +4 -0
  180. package/.next/server/app/api/endpoints/[id]/route.js +12 -0
  181. package/.next/server/app/api/endpoints/[id]/route.js.map +5 -0
  182. package/.next/server/app/api/endpoints/[id]/route.js.nft.json +1 -0
  183. package/.next/server/app/api/endpoints/[id]/route_client-reference-manifest.js +3 -0
  184. package/.next/server/app/api/entities/route/app-paths-manifest.json +3 -0
  185. package/.next/server/app/api/entities/route/build-manifest.json +9 -0
  186. package/.next/server/app/api/entities/route/server-reference-manifest.json +4 -0
  187. package/.next/server/app/api/entities/route.js +11 -0
  188. package/.next/server/app/api/entities/route.js.map +5 -0
  189. package/.next/server/app/api/entities/route.js.nft.json +1 -0
  190. package/.next/server/app/api/entities/route_client-reference-manifest.js +3 -0
  191. package/.next/server/app/api/ingest/route/app-paths-manifest.json +3 -0
  192. package/.next/server/app/api/ingest/route/build-manifest.json +9 -0
  193. package/.next/server/app/api/ingest/route/server-reference-manifest.json +4 -0
  194. package/.next/server/app/api/ingest/route.js +12 -0
  195. package/.next/server/app/api/ingest/route.js.map +5 -0
  196. package/.next/server/app/api/ingest/route.js.nft.json +1 -0
  197. package/.next/server/app/api/ingest/route_client-reference-manifest.js +3 -0
  198. package/.next/server/app/api/init/route/app-paths-manifest.json +3 -0
  199. package/.next/server/app/api/init/route/build-manifest.json +9 -0
  200. package/.next/server/app/api/init/route/server-reference-manifest.json +4 -0
  201. package/.next/server/app/api/init/route.js +15 -0
  202. package/.next/server/app/api/init/route.js.map +5 -0
  203. package/.next/server/app/api/init/route.js.nft.json +1 -0
  204. package/.next/server/app/api/init/route_client-reference-manifest.js +3 -0
  205. package/.next/server/app/api/map/describe/route/app-paths-manifest.json +3 -0
  206. package/.next/server/app/api/map/describe/route/build-manifest.json +9 -0
  207. package/.next/server/app/api/map/describe/route/server-reference-manifest.json +4 -0
  208. package/.next/server/app/api/map/describe/route.js +15 -0
  209. package/.next/server/app/api/map/describe/route.js.map +5 -0
  210. package/.next/server/app/api/map/describe/route.js.nft.json +1 -0
  211. package/.next/server/app/api/map/describe/route_client-reference-manifest.js +3 -0
  212. package/.next/server/app/api/map/files/route/app-paths-manifest.json +3 -0
  213. package/.next/server/app/api/map/files/route/build-manifest.json +9 -0
  214. package/.next/server/app/api/map/files/route/server-reference-manifest.json +4 -0
  215. package/.next/server/app/api/map/files/route.js +15 -0
  216. package/.next/server/app/api/map/files/route.js.map +5 -0
  217. package/.next/server/app/api/map/files/route.js.nft.json +1 -0
  218. package/.next/server/app/api/map/files/route_client-reference-manifest.js +3 -0
  219. package/.next/server/app/api/map/finish/route/app-paths-manifest.json +3 -0
  220. package/.next/server/app/api/map/finish/route/build-manifest.json +9 -0
  221. package/.next/server/app/api/map/finish/route/server-reference-manifest.json +4 -0
  222. package/.next/server/app/api/map/finish/route.js +15 -0
  223. package/.next/server/app/api/map/finish/route.js.map +5 -0
  224. package/.next/server/app/api/map/finish/route.js.nft.json +1 -0
  225. package/.next/server/app/api/map/finish/route_client-reference-manifest.js +3 -0
  226. package/.next/server/app/api/map/route/app-paths-manifest.json +3 -0
  227. package/.next/server/app/api/map/route/build-manifest.json +9 -0
  228. package/.next/server/app/api/map/route/server-reference-manifest.json +4 -0
  229. package/.next/server/app/api/map/route.js +15 -0
  230. package/.next/server/app/api/map/route.js.map +5 -0
  231. package/.next/server/app/api/map/route.js.nft.json +1 -0
  232. package/.next/server/app/api/map/route_client-reference-manifest.js +3 -0
  233. package/.next/server/app/api/map/start/route/app-paths-manifest.json +3 -0
  234. package/.next/server/app/api/map/start/route/build-manifest.json +9 -0
  235. package/.next/server/app/api/map/start/route/server-reference-manifest.json +4 -0
  236. package/.next/server/app/api/map/start/route.js +15 -0
  237. package/.next/server/app/api/map/start/route.js.map +5 -0
  238. package/.next/server/app/api/map/start/route.js.nft.json +1 -0
  239. package/.next/server/app/api/map/start/route_client-reference-manifest.js +3 -0
  240. package/.next/server/app/api/map/touch-active/route/app-paths-manifest.json +3 -0
  241. package/.next/server/app/api/map/touch-active/route/build-manifest.json +9 -0
  242. package/.next/server/app/api/map/touch-active/route/server-reference-manifest.json +4 -0
  243. package/.next/server/app/api/map/touch-active/route.js +15 -0
  244. package/.next/server/app/api/map/touch-active/route.js.map +5 -0
  245. package/.next/server/app/api/map/touch-active/route.js.nft.json +1 -0
  246. package/.next/server/app/api/map/touch-active/route_client-reference-manifest.js +3 -0
  247. package/.next/server/app/api/nodes/[id]/position/route/app-paths-manifest.json +3 -0
  248. package/.next/server/app/api/nodes/[id]/position/route/build-manifest.json +9 -0
  249. package/.next/server/app/api/nodes/[id]/position/route/server-reference-manifest.json +4 -0
  250. package/.next/server/app/api/nodes/[id]/position/route.js +15 -0
  251. package/.next/server/app/api/nodes/[id]/position/route.js.map +5 -0
  252. package/.next/server/app/api/nodes/[id]/position/route.js.nft.json +1 -0
  253. package/.next/server/app/api/nodes/[id]/position/route_client-reference-manifest.js +3 -0
  254. package/.next/server/app/api/nodes/[id]/route/app-paths-manifest.json +3 -0
  255. package/.next/server/app/api/nodes/[id]/route/build-manifest.json +9 -0
  256. package/.next/server/app/api/nodes/[id]/route/server-reference-manifest.json +4 -0
  257. package/.next/server/app/api/nodes/[id]/route.js +15 -0
  258. package/.next/server/app/api/nodes/[id]/route.js.map +5 -0
  259. package/.next/server/app/api/nodes/[id]/route.js.nft.json +1 -0
  260. package/.next/server/app/api/nodes/[id]/route_client-reference-manifest.js +3 -0
  261. package/.next/server/app/api/nodes/positions/route/app-paths-manifest.json +3 -0
  262. package/.next/server/app/api/nodes/positions/route/build-manifest.json +9 -0
  263. package/.next/server/app/api/nodes/positions/route/server-reference-manifest.json +4 -0
  264. package/.next/server/app/api/nodes/positions/route.js +15 -0
  265. package/.next/server/app/api/nodes/positions/route.js.map +5 -0
  266. package/.next/server/app/api/nodes/positions/route.js.nft.json +1 -0
  267. package/.next/server/app/api/nodes/positions/route_client-reference-manifest.js +3 -0
  268. package/.next/server/app/api/nodes/route/app-paths-manifest.json +3 -0
  269. package/.next/server/app/api/nodes/route/build-manifest.json +9 -0
  270. package/.next/server/app/api/nodes/route/server-reference-manifest.json +4 -0
  271. package/.next/server/app/api/nodes/route.js +15 -0
  272. package/.next/server/app/api/nodes/route.js.map +5 -0
  273. package/.next/server/app/api/nodes/route.js.nft.json +1 -0
  274. package/.next/server/app/api/nodes/route_client-reference-manifest.js +3 -0
  275. package/.next/server/app/api/nodes/subtasks/route/app-paths-manifest.json +3 -0
  276. package/.next/server/app/api/nodes/subtasks/route/build-manifest.json +9 -0
  277. package/.next/server/app/api/nodes/subtasks/route/server-reference-manifest.json +4 -0
  278. package/.next/server/app/api/nodes/subtasks/route.js +15 -0
  279. package/.next/server/app/api/nodes/subtasks/route.js.map +5 -0
  280. package/.next/server/app/api/nodes/subtasks/route.js.nft.json +1 -0
  281. package/.next/server/app/api/nodes/subtasks/route_client-reference-manifest.js +3 -0
  282. package/.next/server/app/api/notes/[id]/route/app-paths-manifest.json +3 -0
  283. package/.next/server/app/api/notes/[id]/route/build-manifest.json +9 -0
  284. package/.next/server/app/api/notes/[id]/route/server-reference-manifest.json +4 -0
  285. package/.next/server/app/api/notes/[id]/route.js +12 -0
  286. package/.next/server/app/api/notes/[id]/route.js.map +5 -0
  287. package/.next/server/app/api/notes/[id]/route.js.nft.json +1 -0
  288. package/.next/server/app/api/notes/[id]/route_client-reference-manifest.js +3 -0
  289. package/.next/server/app/api/notes/route/app-paths-manifest.json +3 -0
  290. package/.next/server/app/api/notes/route/build-manifest.json +9 -0
  291. package/.next/server/app/api/notes/route/server-reference-manifest.json +4 -0
  292. package/.next/server/app/api/notes/route.js +12 -0
  293. package/.next/server/app/api/notes/route.js.map +5 -0
  294. package/.next/server/app/api/notes/route.js.nft.json +1 -0
  295. package/.next/server/app/api/notes/route_client-reference-manifest.js +3 -0
  296. package/.next/server/app/api/open/route/app-paths-manifest.json +3 -0
  297. package/.next/server/app/api/open/route/build-manifest.json +9 -0
  298. package/.next/server/app/api/open/route/server-reference-manifest.json +4 -0
  299. package/.next/server/app/api/open/route.js +11 -0
  300. package/.next/server/app/api/open/route.js.map +5 -0
  301. package/.next/server/app/api/open/route.js.nft.json +1 -0
  302. package/.next/server/app/api/open/route_client-reference-manifest.js +3 -0
  303. package/.next/server/app/api/plan/annotations/route/app-paths-manifest.json +3 -0
  304. package/.next/server/app/api/plan/annotations/route/build-manifest.json +9 -0
  305. package/.next/server/app/api/plan/annotations/route/server-reference-manifest.json +4 -0
  306. package/.next/server/app/api/plan/annotations/route.js +15 -0
  307. package/.next/server/app/api/plan/annotations/route.js.map +5 -0
  308. package/.next/server/app/api/plan/annotations/route.js.nft.json +1 -0
  309. package/.next/server/app/api/plan/annotations/route_client-reference-manifest.js +3 -0
  310. package/.next/server/app/api/plan/approve/route/app-paths-manifest.json +3 -0
  311. package/.next/server/app/api/plan/approve/route/build-manifest.json +9 -0
  312. package/.next/server/app/api/plan/approve/route/server-reference-manifest.json +4 -0
  313. package/.next/server/app/api/plan/approve/route.js +16 -0
  314. package/.next/server/app/api/plan/approve/route.js.map +5 -0
  315. package/.next/server/app/api/plan/approve/route.js.nft.json +1 -0
  316. package/.next/server/app/api/plan/approve/route_client-reference-manifest.js +3 -0
  317. package/.next/server/app/api/plan/history/route/app-paths-manifest.json +3 -0
  318. package/.next/server/app/api/plan/history/route/build-manifest.json +9 -0
  319. package/.next/server/app/api/plan/history/route/server-reference-manifest.json +4 -0
  320. package/.next/server/app/api/plan/history/route.js +11 -0
  321. package/.next/server/app/api/plan/history/route.js.map +5 -0
  322. package/.next/server/app/api/plan/history/route.js.nft.json +1 -0
  323. package/.next/server/app/api/plan/history/route_client-reference-manifest.js +3 -0
  324. package/.next/server/app/api/plan/markdown/route/app-paths-manifest.json +3 -0
  325. package/.next/server/app/api/plan/markdown/route/build-manifest.json +9 -0
  326. package/.next/server/app/api/plan/markdown/route/server-reference-manifest.json +4 -0
  327. package/.next/server/app/api/plan/markdown/route.js +16 -0
  328. package/.next/server/app/api/plan/markdown/route.js.map +5 -0
  329. package/.next/server/app/api/plan/markdown/route.js.nft.json +1 -0
  330. package/.next/server/app/api/plan/markdown/route_client-reference-manifest.js +3 -0
  331. package/.next/server/app/api/plan/presence/route/app-paths-manifest.json +3 -0
  332. package/.next/server/app/api/plan/presence/route/build-manifest.json +9 -0
  333. package/.next/server/app/api/plan/presence/route/server-reference-manifest.json +4 -0
  334. package/.next/server/app/api/plan/presence/route.js +11 -0
  335. package/.next/server/app/api/plan/presence/route.js.map +5 -0
  336. package/.next/server/app/api/plan/presence/route.js.nft.json +1 -0
  337. package/.next/server/app/api/plan/presence/route_client-reference-manifest.js +3 -0
  338. package/.next/server/app/api/plan/route/app-paths-manifest.json +3 -0
  339. package/.next/server/app/api/plan/route/build-manifest.json +9 -0
  340. package/.next/server/app/api/plan/route/server-reference-manifest.json +4 -0
  341. package/.next/server/app/api/plan/route.js +16 -0
  342. package/.next/server/app/api/plan/route.js.map +5 -0
  343. package/.next/server/app/api/plan/route.js.nft.json +1 -0
  344. package/.next/server/app/api/plan/route_client-reference-manifest.js +3 -0
  345. package/.next/server/app/api/plan/verdict/route/app-paths-manifest.json +3 -0
  346. package/.next/server/app/api/plan/verdict/route/build-manifest.json +9 -0
  347. package/.next/server/app/api/plan/verdict/route/server-reference-manifest.json +4 -0
  348. package/.next/server/app/api/plan/verdict/route.js +16 -0
  349. package/.next/server/app/api/plan/verdict/route.js.map +5 -0
  350. package/.next/server/app/api/plan/verdict/route.js.nft.json +1 -0
  351. package/.next/server/app/api/plan/verdict/route_client-reference-manifest.js +3 -0
  352. package/.next/server/app/api/preferences/route/app-paths-manifest.json +3 -0
  353. package/.next/server/app/api/preferences/route/build-manifest.json +9 -0
  354. package/.next/server/app/api/preferences/route/server-reference-manifest.json +4 -0
  355. package/.next/server/app/api/preferences/route.js +7 -0
  356. package/.next/server/app/api/preferences/route.js.map +5 -0
  357. package/.next/server/app/api/preferences/route.js.nft.json +1 -0
  358. package/.next/server/app/api/preferences/route_client-reference-manifest.js +3 -0
  359. package/.next/server/app/api/reset/route/app-paths-manifest.json +3 -0
  360. package/.next/server/app/api/reset/route/build-manifest.json +9 -0
  361. package/.next/server/app/api/reset/route/server-reference-manifest.json +4 -0
  362. package/.next/server/app/api/reset/route.js +13 -0
  363. package/.next/server/app/api/reset/route.js.map +5 -0
  364. package/.next/server/app/api/reset/route.js.nft.json +1 -0
  365. package/.next/server/app/api/reset/route_client-reference-manifest.js +3 -0
  366. package/.next/server/app/api/settings/route/app-paths-manifest.json +3 -0
  367. package/.next/server/app/api/settings/route/build-manifest.json +9 -0
  368. package/.next/server/app/api/settings/route/server-reference-manifest.json +4 -0
  369. package/.next/server/app/api/settings/route.js +11 -0
  370. package/.next/server/app/api/settings/route.js.map +5 -0
  371. package/.next/server/app/api/settings/route.js.nft.json +1 -0
  372. package/.next/server/app/api/settings/route_client-reference-manifest.js +3 -0
  373. package/.next/server/app/api/stream/route/app-paths-manifest.json +3 -0
  374. package/.next/server/app/api/stream/route/build-manifest.json +9 -0
  375. package/.next/server/app/api/stream/route/server-reference-manifest.json +4 -0
  376. package/.next/server/app/api/stream/route.js +12 -0
  377. package/.next/server/app/api/stream/route.js.map +5 -0
  378. package/.next/server/app/api/stream/route.js.nft.json +1 -0
  379. package/.next/server/app/api/stream/route_client-reference-manifest.js +3 -0
  380. package/.next/server/app/api/version/route/app-paths-manifest.json +3 -0
  381. package/.next/server/app/api/version/route/build-manifest.json +9 -0
  382. package/.next/server/app/api/version/route/server-reference-manifest.json +4 -0
  383. package/.next/server/app/api/version/route.js +12 -0
  384. package/.next/server/app/api/version/route.js.map +5 -0
  385. package/.next/server/app/api/version/route.js.nft.json +1 -0
  386. package/.next/server/app/api/version/route_client-reference-manifest.js +3 -0
  387. package/.next/server/app/api/workspace/activate/route/app-paths-manifest.json +3 -0
  388. package/.next/server/app/api/workspace/activate/route/build-manifest.json +9 -0
  389. package/.next/server/app/api/workspace/activate/route/server-reference-manifest.json +4 -0
  390. package/.next/server/app/api/workspace/activate/route.js +14 -0
  391. package/.next/server/app/api/workspace/activate/route.js.map +5 -0
  392. package/.next/server/app/api/workspace/activate/route.js.nft.json +1 -0
  393. package/.next/server/app/api/workspace/activate/route_client-reference-manifest.js +3 -0
  394. package/.next/server/app/api/workspace/route/app-paths-manifest.json +3 -0
  395. package/.next/server/app/api/workspace/route/build-manifest.json +9 -0
  396. package/.next/server/app/api/workspace/route/server-reference-manifest.json +4 -0
  397. package/.next/server/app/api/workspace/route.js +11 -0
  398. package/.next/server/app/api/workspace/route.js.map +5 -0
  399. package/.next/server/app/api/workspace/route.js.nft.json +1 -0
  400. package/.next/server/app/api/workspace/route_client-reference-manifest.js +3 -0
  401. package/.next/server/app/apple-icon.png/route/app-paths-manifest.json +3 -0
  402. package/.next/server/app/apple-icon.png/route/build-manifest.json +9 -0
  403. package/.next/server/app/apple-icon.png/route.js +8 -0
  404. package/.next/server/app/apple-icon.png/route.js.map +5 -0
  405. package/.next/server/app/apple-icon.png/route.js.nft.json +1 -0
  406. package/.next/server/app/apple-icon.png.body +0 -0
  407. package/.next/server/app/apple-icon.png.meta +1 -0
  408. package/.next/server/app/help/page/app-paths-manifest.json +3 -0
  409. package/.next/server/app/help/page/build-manifest.json +17 -0
  410. package/.next/server/app/help/page/next-font-manifest.json +11 -0
  411. package/.next/server/app/help/page/react-loadable-manifest.json +1 -0
  412. package/.next/server/app/help/page/server-reference-manifest.json +4 -0
  413. package/.next/server/app/help/page.js +16 -0
  414. package/.next/server/app/help/page.js.map +5 -0
  415. package/.next/server/app/help/page.js.nft.json +1 -0
  416. package/.next/server/app/help/page_client-reference-manifest.js +3 -0
  417. package/.next/server/app/help.html +1 -0
  418. package/.next/server/app/help.meta +15 -0
  419. package/.next/server/app/help.rsc +36 -0
  420. package/.next/server/app/help.segments/_full.segment.rsc +36 -0
  421. package/.next/server/app/help.segments/_head.segment.rsc +6 -0
  422. package/.next/server/app/help.segments/_index.segment.rsc +13 -0
  423. package/.next/server/app/help.segments/_tree.segment.rsc +5 -0
  424. package/.next/server/app/help.segments/help/__PAGE__.segment.rsc +17 -0
  425. package/.next/server/app/help.segments/help.segment.rsc +5 -0
  426. package/.next/server/app/icon.svg/route/app-paths-manifest.json +3 -0
  427. package/.next/server/app/icon.svg/route/build-manifest.json +9 -0
  428. package/.next/server/app/icon.svg/route.js +7 -0
  429. package/.next/server/app/icon.svg/route.js.map +5 -0
  430. package/.next/server/app/icon.svg/route.js.nft.json +1 -0
  431. package/.next/server/app/icon.svg.body +4 -0
  432. package/.next/server/app/icon.svg.meta +1 -0
  433. package/.next/server/app/index.html +1 -0
  434. package/.next/server/app/index.meta +14 -0
  435. package/.next/server/app/index.rsc +26 -0
  436. package/.next/server/app/index.segments/__PAGE__.segment.rsc +7 -0
  437. package/.next/server/app/index.segments/_full.segment.rsc +26 -0
  438. package/.next/server/app/index.segments/_head.segment.rsc +6 -0
  439. package/.next/server/app/index.segments/_index.segment.rsc +13 -0
  440. package/.next/server/app/index.segments/_tree.segment.rsc +6 -0
  441. package/.next/server/app/map/page/app-paths-manifest.json +3 -0
  442. package/.next/server/app/map/page/build-manifest.json +17 -0
  443. package/.next/server/app/map/page/next-font-manifest.json +11 -0
  444. package/.next/server/app/map/page/react-loadable-manifest.json +1 -0
  445. package/.next/server/app/map/page/server-reference-manifest.json +89 -0
  446. package/.next/server/app/map/page.js +25 -0
  447. package/.next/server/app/map/page.js.map +5 -0
  448. package/.next/server/app/map/page.js.nft.json +1 -0
  449. package/.next/server/app/map/page_client-reference-manifest.js +3 -0
  450. package/.next/server/app/page/app-paths-manifest.json +3 -0
  451. package/.next/server/app/page/build-manifest.json +17 -0
  452. package/.next/server/app/page/next-font-manifest.json +11 -0
  453. package/.next/server/app/page/react-loadable-manifest.json +1 -0
  454. package/.next/server/app/page/server-reference-manifest.json +4 -0
  455. package/.next/server/app/page.js +16 -0
  456. package/.next/server/app/page.js.map +5 -0
  457. package/.next/server/app/page.js.nft.json +1 -0
  458. package/.next/server/app/page_client-reference-manifest.js +3 -0
  459. package/.next/server/app/plan/page/app-paths-manifest.json +3 -0
  460. package/.next/server/app/plan/page/build-manifest.json +17 -0
  461. package/.next/server/app/plan/page/next-font-manifest.json +11 -0
  462. package/.next/server/app/plan/page/react-loadable-manifest.json +1 -0
  463. package/.next/server/app/plan/page/server-reference-manifest.json +89 -0
  464. package/.next/server/app/plan/page.js +26 -0
  465. package/.next/server/app/plan/page.js.map +5 -0
  466. package/.next/server/app/plan/page.js.nft.json +1 -0
  467. package/.next/server/app/plan/page_client-reference-manifest.js +3 -0
  468. package/.next/server/app/settings/page/app-paths-manifest.json +3 -0
  469. package/.next/server/app/settings/page/build-manifest.json +17 -0
  470. package/.next/server/app/settings/page/next-font-manifest.json +11 -0
  471. package/.next/server/app/settings/page/react-loadable-manifest.json +1 -0
  472. package/.next/server/app/settings/page/server-reference-manifest.json +4 -0
  473. package/.next/server/app/settings/page.js +17 -0
  474. package/.next/server/app/settings/page.js.map +5 -0
  475. package/.next/server/app/settings/page.js.nft.json +1 -0
  476. package/.next/server/app/settings/page_client-reference-manifest.js +3 -0
  477. package/.next/server/app-paths-manifest.json +59 -0
  478. package/.next/server/chunks/[externals]_@huggingface_transformers_05bd-zz._.js +3 -0
  479. package/.next/server/chunks/[externals]_@huggingface_transformers_05bd-zz._.js.map +1 -0
  480. package/.next/server/chunks/[externals]__1m_jh08._.js +3 -0
  481. package/.next/server/chunks/[externals]__1m_jh08._.js.map +1 -0
  482. package/.next/server/chunks/[externals]_next_dist_1081pat._.js +3 -0
  483. package/.next/server/chunks/[externals]_next_dist_1081pat._.js.map +1 -0
  484. package/.next/server/chunks/[root-of-the-server]__0--8e0y._.js +3 -0
  485. package/.next/server/chunks/[root-of-the-server]__0--8e0y._.js.map +1 -0
  486. package/.next/server/chunks/[root-of-the-server]__0-68r22._.js +3 -0
  487. package/.next/server/chunks/[root-of-the-server]__0-68r22._.js.map +1 -0
  488. package/.next/server/chunks/[root-of-the-server]__008acf8._.js +3 -0
  489. package/.next/server/chunks/[root-of-the-server]__008acf8._.js.map +1 -0
  490. package/.next/server/chunks/[root-of-the-server]__00rostp._.js +3 -0
  491. package/.next/server/chunks/[root-of-the-server]__00rostp._.js.map +1 -0
  492. package/.next/server/chunks/[root-of-the-server]__04deymo._.js +3 -0
  493. package/.next/server/chunks/[root-of-the-server]__04deymo._.js.map +1 -0
  494. package/.next/server/chunks/[root-of-the-server]__05_ckr9._.js +3 -0
  495. package/.next/server/chunks/[root-of-the-server]__05_ckr9._.js.map +1 -0
  496. package/.next/server/chunks/[root-of-the-server]__08b769e._.js +3 -0
  497. package/.next/server/chunks/[root-of-the-server]__08b769e._.js.map +1 -0
  498. package/.next/server/chunks/[root-of-the-server]__0935gge._.js +3 -0
  499. package/.next/server/chunks/[root-of-the-server]__0935gge._.js.map +1 -0
  500. package/.next/server/chunks/[root-of-the-server]__0b04f4n._.js +3 -0
  501. package/.next/server/chunks/[root-of-the-server]__0b04f4n._.js.map +1 -0
  502. package/.next/server/chunks/[root-of-the-server]__0bule95._.js +11 -0
  503. package/.next/server/chunks/[root-of-the-server]__0bule95._.js.map +1 -0
  504. package/.next/server/chunks/[root-of-the-server]__0dgnobj._.js +3 -0
  505. package/.next/server/chunks/[root-of-the-server]__0dgnobj._.js.map +1 -0
  506. package/.next/server/chunks/[root-of-the-server]__0fnoun8._.js +3 -0
  507. package/.next/server/chunks/[root-of-the-server]__0fnoun8._.js.map +1 -0
  508. package/.next/server/chunks/[root-of-the-server]__0gcvcx_._.js +3 -0
  509. package/.next/server/chunks/[root-of-the-server]__0gcvcx_._.js.map +1 -0
  510. package/.next/server/chunks/[root-of-the-server]__0gnu9c5._.js +11 -0
  511. package/.next/server/chunks/[root-of-the-server]__0gnu9c5._.js.map +1 -0
  512. package/.next/server/chunks/[root-of-the-server]__0imrhoi._.js +3 -0
  513. package/.next/server/chunks/[root-of-the-server]__0imrhoi._.js.map +1 -0
  514. package/.next/server/chunks/[root-of-the-server]__0iq9oau._.js +3 -0
  515. package/.next/server/chunks/[root-of-the-server]__0iq9oau._.js.map +1 -0
  516. package/.next/server/chunks/[root-of-the-server]__0k_e0ex._.js +3 -0
  517. package/.next/server/chunks/[root-of-the-server]__0k_e0ex._.js.map +1 -0
  518. package/.next/server/chunks/[root-of-the-server]__0kj4pte._.js +3 -0
  519. package/.next/server/chunks/[root-of-the-server]__0kj4pte._.js.map +1 -0
  520. package/.next/server/chunks/[root-of-the-server]__0muvnnv._.js +11 -0
  521. package/.next/server/chunks/[root-of-the-server]__0muvnnv._.js.map +1 -0
  522. package/.next/server/chunks/[root-of-the-server]__0olqs85._.js +3 -0
  523. package/.next/server/chunks/[root-of-the-server]__0olqs85._.js.map +1 -0
  524. package/.next/server/chunks/[root-of-the-server]__0r4ba8s._.js +3 -0
  525. package/.next/server/chunks/[root-of-the-server]__0r4ba8s._.js.map +1 -0
  526. package/.next/server/chunks/[root-of-the-server]__0sb_5m8._.js +20 -0
  527. package/.next/server/chunks/[root-of-the-server]__0sb_5m8._.js.map +1 -0
  528. package/.next/server/chunks/[root-of-the-server]__0y6kb2t._.js +3 -0
  529. package/.next/server/chunks/[root-of-the-server]__0y6kb2t._.js.map +1 -0
  530. package/.next/server/chunks/[root-of-the-server]__0zfwiuh._.js +11 -0
  531. package/.next/server/chunks/[root-of-the-server]__0zfwiuh._.js.map +1 -0
  532. package/.next/server/chunks/[root-of-the-server]__11037f1._.js +3 -0
  533. package/.next/server/chunks/[root-of-the-server]__11037f1._.js.map +1 -0
  534. package/.next/server/chunks/[root-of-the-server]__1197yfd._.js +3 -0
  535. package/.next/server/chunks/[root-of-the-server]__1197yfd._.js.map +1 -0
  536. package/.next/server/chunks/[root-of-the-server]__138pbmp._.js +3 -0
  537. package/.next/server/chunks/[root-of-the-server]__138pbmp._.js.map +1 -0
  538. package/.next/server/chunks/[root-of-the-server]__166th-t._.js +3 -0
  539. package/.next/server/chunks/[root-of-the-server]__166th-t._.js.map +1 -0
  540. package/.next/server/chunks/[root-of-the-server]__190_wb7._.js +3 -0
  541. package/.next/server/chunks/[root-of-the-server]__190_wb7._.js.map +1 -0
  542. package/.next/server/chunks/[root-of-the-server]__190zu98._.js +3 -0
  543. package/.next/server/chunks/[root-of-the-server]__190zu98._.js.map +1 -0
  544. package/.next/server/chunks/[root-of-the-server]__1_7ntsu._.js +3 -0
  545. package/.next/server/chunks/[root-of-the-server]__1_7ntsu._.js.map +1 -0
  546. package/.next/server/chunks/[root-of-the-server]__1bwqb44._.js +3 -0
  547. package/.next/server/chunks/[root-of-the-server]__1bwqb44._.js.map +1 -0
  548. package/.next/server/chunks/[root-of-the-server]__1d6w22k._.js +3 -0
  549. package/.next/server/chunks/[root-of-the-server]__1d6w22k._.js.map +1 -0
  550. package/.next/server/chunks/[root-of-the-server]__1d9wmd_._.js +3 -0
  551. package/.next/server/chunks/[root-of-the-server]__1d9wmd_._.js.map +1 -0
  552. package/.next/server/chunks/[root-of-the-server]__1j25n4-._.js +5 -0
  553. package/.next/server/chunks/[root-of-the-server]__1j25n4-._.js.map +1 -0
  554. package/.next/server/chunks/[root-of-the-server]__1jtw_i1._.js +3 -0
  555. package/.next/server/chunks/[root-of-the-server]__1jtw_i1._.js.map +1 -0
  556. package/.next/server/chunks/[root-of-the-server]__1lv6sqm._.js +3 -0
  557. package/.next/server/chunks/[root-of-the-server]__1lv6sqm._.js.map +1 -0
  558. package/.next/server/chunks/[root-of-the-server]__1m2v05v._.js +3 -0
  559. package/.next/server/chunks/[root-of-the-server]__1m2v05v._.js.map +1 -0
  560. package/.next/server/chunks/[root-of-the-server]__1n-kcwj._.js +3 -0
  561. package/.next/server/chunks/[root-of-the-server]__1n-kcwj._.js.map +1 -0
  562. package/.next/server/chunks/[root-of-the-server]__1nn9crd._.js +3 -0
  563. package/.next/server/chunks/[root-of-the-server]__1nn9crd._.js.map +1 -0
  564. package/.next/server/chunks/[root-of-the-server]__1rimo-u._.js +3 -0
  565. package/.next/server/chunks/[root-of-the-server]__1rimo-u._.js.map +1 -0
  566. package/.next/server/chunks/[root-of-the-server]__1sb7b9b._.js +9 -0
  567. package/.next/server/chunks/[root-of-the-server]__1sb7b9b._.js.map +1 -0
  568. package/.next/server/chunks/[root-of-the-server]__1t2egm-._.js +9 -0
  569. package/.next/server/chunks/[root-of-the-server]__1t2egm-._.js.map +1 -0
  570. package/.next/server/chunks/[root-of-the-server]__1t3s3-y._.js +3 -0
  571. package/.next/server/chunks/[root-of-the-server]__1t3s3-y._.js.map +1 -0
  572. package/.next/server/chunks/[root-of-the-server]__1tab6-_._.js +3 -0
  573. package/.next/server/chunks/[root-of-the-server]__1tab6-_._.js.map +1 -0
  574. package/.next/server/chunks/[root-of-the-server]__1v3_x0a._.js +3 -0
  575. package/.next/server/chunks/[root-of-the-server]__1v3_x0a._.js.map +1 -0
  576. package/.next/server/chunks/[root-of-the-server]__1vq6_bb._.js +3 -0
  577. package/.next/server/chunks/[root-of-the-server]__1vq6_bb._.js.map +1 -0
  578. package/.next/server/chunks/[root-of-the-server]__1xfg6n4._.js +3 -0
  579. package/.next/server/chunks/[root-of-the-server]__1xfg6n4._.js.map +1 -0
  580. package/.next/server/chunks/[root-of-the-server]__1y_g68p._.js +3 -0
  581. package/.next/server/chunks/[root-of-the-server]__1y_g68p._.js.map +1 -0
  582. package/.next/server/chunks/[turbopack]_runtime.js +903 -0
  583. package/.next/server/chunks/[turbopack]_runtime.js.map +11 -0
  584. package/.next/server/chunks/_0-k8r4o._.js +3 -0
  585. package/.next/server/chunks/_0-k8r4o._.js.map +1 -0
  586. package/.next/server/chunks/_00drqg3._.js +3 -0
  587. package/.next/server/chunks/_00drqg3._.js.map +1 -0
  588. package/.next/server/chunks/_04_hx58._.js +3 -0
  589. package/.next/server/chunks/_04_hx58._.js.map +1 -0
  590. package/.next/server/chunks/_0bj_zep._.js +3 -0
  591. package/.next/server/chunks/_0bj_zep._.js.map +1 -0
  592. package/.next/server/chunks/_0d9p87n._.js +3 -0
  593. package/.next/server/chunks/_0d9p87n._.js.map +1 -0
  594. package/.next/server/chunks/_0uzzk4s._.js +3 -0
  595. package/.next/server/chunks/_0uzzk4s._.js.map +1 -0
  596. package/.next/server/chunks/_0x--pb9._.js +3 -0
  597. package/.next/server/chunks/_0x--pb9._.js.map +1 -0
  598. package/.next/server/chunks/_1-006gs._.js +11 -0
  599. package/.next/server/chunks/_1-006gs._.js.map +1 -0
  600. package/.next/server/chunks/_1gmut2r._.js +3 -0
  601. package/.next/server/chunks/_1gmut2r._.js.map +1 -0
  602. package/.next/server/chunks/_1h7jba5._.js +3 -0
  603. package/.next/server/chunks/_1h7jba5._.js.map +1 -0
  604. package/.next/server/chunks/_1p13_nj._.js +3 -0
  605. package/.next/server/chunks/_1p13_nj._.js.map +1 -0
  606. package/.next/server/chunks/_1v92m46._.js +11 -0
  607. package/.next/server/chunks/_1v92m46._.js.map +1 -0
  608. package/.next/server/chunks/_next-internal_server_app_api_code-graph_position_route_actions_0ddmfq8.js +3 -0
  609. package/.next/server/chunks/_next-internal_server_app_api_code-graph_position_route_actions_0ddmfq8.js.map +1 -0
  610. package/.next/server/chunks/_next-internal_server_app_api_code-graph_route_actions_107oiy1.js +3 -0
  611. package/.next/server/chunks/_next-internal_server_app_api_code-graph_route_actions_107oiy1.js.map +1 -0
  612. package/.next/server/chunks/_next-internal_server_app_api_context_embed-backfill_route_actions_0fddf11.js +3 -0
  613. package/.next/server/chunks/_next-internal_server_app_api_context_embed-backfill_route_actions_0fddf11.js.map +1 -0
  614. package/.next/server/chunks/_next-internal_server_app_api_context_feature_route_actions_0g4_r0t.js +3 -0
  615. package/.next/server/chunks/_next-internal_server_app_api_context_feature_route_actions_0g4_r0t.js.map +1 -0
  616. package/.next/server/chunks/_next-internal_server_app_api_context_file_route_actions_1v15k33.js +3 -0
  617. package/.next/server/chunks/_next-internal_server_app_api_context_file_route_actions_1v15k33.js.map +1 -0
  618. package/.next/server/chunks/_next-internal_server_app_api_context_route_actions_066vuc0.js +3 -0
  619. package/.next/server/chunks/_next-internal_server_app_api_context_route_actions_066vuc0.js.map +1 -0
  620. package/.next/server/chunks/_next-internal_server_app_api_db_backfill-access_route_actions_0krkam5.js +3 -0
  621. package/.next/server/chunks/_next-internal_server_app_api_db_backfill-access_route_actions_0krkam5.js.map +1 -0
  622. package/.next/server/chunks/_next-internal_server_app_api_db_position_route_actions_0y81s5h.js +3 -0
  623. package/.next/server/chunks/_next-internal_server_app_api_db_position_route_actions_0y81s5h.js.map +1 -0
  624. package/.next/server/chunks/_next-internal_server_app_api_db_reconcile-endpoints_route_actions_11wjo3_.js +3 -0
  625. package/.next/server/chunks/_next-internal_server_app_api_db_reconcile-endpoints_route_actions_11wjo3_.js.map +1 -0
  626. package/.next/server/chunks/_next-internal_server_app_api_db_relations_[id]_route_actions_0ok7b-c.js +3 -0
  627. package/.next/server/chunks/_next-internal_server_app_api_db_relations_[id]_route_actions_0ok7b-c.js.map +1 -0
  628. package/.next/server/chunks/_next-internal_server_app_api_db_tables_[id]_route_actions_17b6_8p.js +3 -0
  629. package/.next/server/chunks/_next-internal_server_app_api_db_tables_[id]_route_actions_17b6_8p.js.map +1 -0
  630. package/.next/server/chunks/_next-internal_server_app_api_draft_approve_route_actions_12l1gql.js +3 -0
  631. package/.next/server/chunks/_next-internal_server_app_api_draft_approve_route_actions_12l1gql.js.map +1 -0
  632. package/.next/server/chunks/_next-internal_server_app_api_draft_route_actions_1y2euqt.js +3 -0
  633. package/.next/server/chunks/_next-internal_server_app_api_draft_route_actions_1y2euqt.js.map +1 -0
  634. package/.next/server/chunks/_next-internal_server_app_api_draft_status_route_actions_0imc7yr.js +3 -0
  635. package/.next/server/chunks/_next-internal_server_app_api_draft_status_route_actions_0imc7yr.js.map +1 -0
  636. package/.next/server/chunks/_next-internal_server_app_api_edges_[id]_route_actions_1rx28dy.js +3 -0
  637. package/.next/server/chunks/_next-internal_server_app_api_edges_[id]_route_actions_1rx28dy.js.map +1 -0
  638. package/.next/server/chunks/_next-internal_server_app_api_edges_route_actions_1i6-f0p.js +3 -0
  639. package/.next/server/chunks/_next-internal_server_app_api_edges_route_actions_1i6-f0p.js.map +1 -0
  640. package/.next/server/chunks/_next-internal_server_app_api_endpoints_[id]_route_actions_1hynl36.js +3 -0
  641. package/.next/server/chunks/_next-internal_server_app_api_endpoints_[id]_route_actions_1hynl36.js.map +1 -0
  642. package/.next/server/chunks/_next-internal_server_app_api_entities_route_actions_1jx0-vm.js +3 -0
  643. package/.next/server/chunks/_next-internal_server_app_api_entities_route_actions_1jx0-vm.js.map +1 -0
  644. package/.next/server/chunks/_next-internal_server_app_api_ingest_route_actions_1oz_9xc.js +3 -0
  645. package/.next/server/chunks/_next-internal_server_app_api_ingest_route_actions_1oz_9xc.js.map +1 -0
  646. package/.next/server/chunks/_next-internal_server_app_api_init_route_actions_00i08o0.js +3 -0
  647. package/.next/server/chunks/_next-internal_server_app_api_init_route_actions_00i08o0.js.map +1 -0
  648. package/.next/server/chunks/_next-internal_server_app_api_map_describe_route_actions_04m22-e.js +3 -0
  649. package/.next/server/chunks/_next-internal_server_app_api_map_describe_route_actions_04m22-e.js.map +1 -0
  650. package/.next/server/chunks/_next-internal_server_app_api_map_files_route_actions_1gsvfd9.js +3 -0
  651. package/.next/server/chunks/_next-internal_server_app_api_map_files_route_actions_1gsvfd9.js.map +1 -0
  652. package/.next/server/chunks/_next-internal_server_app_api_map_finish_route_actions_130bs5b.js +3 -0
  653. package/.next/server/chunks/_next-internal_server_app_api_map_finish_route_actions_130bs5b.js.map +1 -0
  654. package/.next/server/chunks/_next-internal_server_app_api_map_route_actions_1ylt-yg.js +3 -0
  655. package/.next/server/chunks/_next-internal_server_app_api_map_route_actions_1ylt-yg.js.map +1 -0
  656. package/.next/server/chunks/_next-internal_server_app_api_map_start_route_actions_1n4zdon.js +3 -0
  657. package/.next/server/chunks/_next-internal_server_app_api_map_start_route_actions_1n4zdon.js.map +1 -0
  658. package/.next/server/chunks/_next-internal_server_app_api_map_touch-active_route_actions_0wvoq-h.js +3 -0
  659. package/.next/server/chunks/_next-internal_server_app_api_map_touch-active_route_actions_0wvoq-h.js.map +1 -0
  660. package/.next/server/chunks/_next-internal_server_app_api_nodes_[id]_position_route_actions_0_695u2.js +3 -0
  661. package/.next/server/chunks/_next-internal_server_app_api_nodes_[id]_position_route_actions_0_695u2.js.map +1 -0
  662. package/.next/server/chunks/_next-internal_server_app_api_nodes_[id]_route_actions_017e_f3.js +3 -0
  663. package/.next/server/chunks/_next-internal_server_app_api_nodes_[id]_route_actions_017e_f3.js.map +1 -0
  664. package/.next/server/chunks/_next-internal_server_app_api_nodes_positions_route_actions_1pz3o9o.js +3 -0
  665. package/.next/server/chunks/_next-internal_server_app_api_nodes_positions_route_actions_1pz3o9o.js.map +1 -0
  666. package/.next/server/chunks/_next-internal_server_app_api_nodes_route_actions_0iuxxdu.js +3 -0
  667. package/.next/server/chunks/_next-internal_server_app_api_nodes_route_actions_0iuxxdu.js.map +1 -0
  668. package/.next/server/chunks/_next-internal_server_app_api_nodes_subtasks_route_actions_0uw715o.js +3 -0
  669. package/.next/server/chunks/_next-internal_server_app_api_nodes_subtasks_route_actions_0uw715o.js.map +1 -0
  670. package/.next/server/chunks/_next-internal_server_app_api_notes_[id]_route_actions_1kpl381.js +3 -0
  671. package/.next/server/chunks/_next-internal_server_app_api_notes_[id]_route_actions_1kpl381.js.map +1 -0
  672. package/.next/server/chunks/_next-internal_server_app_api_notes_route_actions_0mm_p_3.js +3 -0
  673. package/.next/server/chunks/_next-internal_server_app_api_notes_route_actions_0mm_p_3.js.map +1 -0
  674. package/.next/server/chunks/_next-internal_server_app_api_open_route_actions_1x77eq1.js +3 -0
  675. package/.next/server/chunks/_next-internal_server_app_api_open_route_actions_1x77eq1.js.map +1 -0
  676. package/.next/server/chunks/_next-internal_server_app_api_plan_annotations_route_actions_11aui44.js +3 -0
  677. package/.next/server/chunks/_next-internal_server_app_api_plan_annotations_route_actions_11aui44.js.map +1 -0
  678. package/.next/server/chunks/_next-internal_server_app_api_plan_approve_route_actions_06jkmnf.js +3 -0
  679. package/.next/server/chunks/_next-internal_server_app_api_plan_approve_route_actions_06jkmnf.js.map +1 -0
  680. package/.next/server/chunks/_next-internal_server_app_api_plan_history_route_actions_17hqx0m.js +3 -0
  681. package/.next/server/chunks/_next-internal_server_app_api_plan_history_route_actions_17hqx0m.js.map +1 -0
  682. package/.next/server/chunks/_next-internal_server_app_api_plan_markdown_route_actions_1qb1-9r.js +3 -0
  683. package/.next/server/chunks/_next-internal_server_app_api_plan_markdown_route_actions_1qb1-9r.js.map +1 -0
  684. package/.next/server/chunks/_next-internal_server_app_api_plan_presence_route_actions_1r91k5c.js +3 -0
  685. package/.next/server/chunks/_next-internal_server_app_api_plan_presence_route_actions_1r91k5c.js.map +1 -0
  686. package/.next/server/chunks/_next-internal_server_app_api_plan_route_actions_1_nzr8r.js +3 -0
  687. package/.next/server/chunks/_next-internal_server_app_api_plan_route_actions_1_nzr8r.js.map +1 -0
  688. package/.next/server/chunks/_next-internal_server_app_api_plan_verdict_route_actions_10xm0j8.js +3 -0
  689. package/.next/server/chunks/_next-internal_server_app_api_plan_verdict_route_actions_10xm0j8.js.map +1 -0
  690. package/.next/server/chunks/_next-internal_server_app_api_preferences_route_actions_14__a0r.js +3 -0
  691. package/.next/server/chunks/_next-internal_server_app_api_preferences_route_actions_14__a0r.js.map +1 -0
  692. package/.next/server/chunks/_next-internal_server_app_api_reset_route_actions_1tcp2ms.js +3 -0
  693. package/.next/server/chunks/_next-internal_server_app_api_reset_route_actions_1tcp2ms.js.map +1 -0
  694. package/.next/server/chunks/_next-internal_server_app_api_settings_route_actions_1bpm9ac.js +3 -0
  695. package/.next/server/chunks/_next-internal_server_app_api_settings_route_actions_1bpm9ac.js.map +1 -0
  696. package/.next/server/chunks/_next-internal_server_app_api_stream_route_actions_0oy6g75.js +3 -0
  697. package/.next/server/chunks/_next-internal_server_app_api_stream_route_actions_0oy6g75.js.map +1 -0
  698. package/.next/server/chunks/_next-internal_server_app_api_version_route_actions_0kbx30h.js +3 -0
  699. package/.next/server/chunks/_next-internal_server_app_api_version_route_actions_0kbx30h.js.map +1 -0
  700. package/.next/server/chunks/_next-internal_server_app_api_workspace_activate_route_actions_1hv2y82.js +3 -0
  701. package/.next/server/chunks/_next-internal_server_app_api_workspace_activate_route_actions_1hv2y82.js.map +1 -0
  702. package/.next/server/chunks/_next-internal_server_app_api_workspace_route_actions_19-xkal.js +3 -0
  703. package/.next/server/chunks/_next-internal_server_app_api_workspace_route_actions_19-xkal.js.map +1 -0
  704. package/.next/server/chunks/_next-internal_server_app_apple-icon_png_route_actions_0jcl8au.js +3 -0
  705. package/.next/server/chunks/_next-internal_server_app_apple-icon_png_route_actions_0jcl8au.js.map +1 -0
  706. package/.next/server/chunks/_next-internal_server_app_icon_svg_route_actions_1r2h_ub.js +3 -0
  707. package/.next/server/chunks/_next-internal_server_app_icon_svg_route_actions_1r2h_ub.js.map +1 -0
  708. package/.next/server/chunks/instrumentation_ts_1oq3o45._.js +3 -0
  709. package/.next/server/chunks/instrumentation_ts_1oq3o45._.js.map +1 -0
  710. package/.next/server/chunks/lib_04zrdtl._.js +3 -0
  711. package/.next/server/chunks/lib_04zrdtl._.js.map +1 -0
  712. package/.next/server/chunks/lib_0rad2y6._.js +3 -0
  713. package/.next/server/chunks/lib_0rad2y6._.js.map +1 -0
  714. package/.next/server/chunks/lib_10tibe8._.js +7 -0
  715. package/.next/server/chunks/lib_10tibe8._.js.map +1 -0
  716. package/.next/server/chunks/lib_1upr0dj._.js +3 -0
  717. package/.next/server/chunks/lib_1upr0dj._.js.map +1 -0
  718. package/.next/server/chunks/lib_1wz-3od._.js +3 -0
  719. package/.next/server/chunks/lib_1wz-3od._.js.map +1 -0
  720. package/.next/server/chunks/lib_1xzwro7._.js +3 -0
  721. package/.next/server/chunks/lib_1xzwro7._.js.map +1 -0
  722. package/.next/server/chunks/lib_db_ts_0h_yn5m._.js +3 -0
  723. package/.next/server/chunks/lib_db_ts_0h_yn5m._.js.map +1 -0
  724. package/.next/server/chunks/lib_drizzle_provision_ts_1po9dyo._.js +3 -0
  725. package/.next/server/chunks/lib_drizzle_provision_ts_1po9dyo._.js.map +1 -0
  726. package/.next/server/chunks/lib_drizzle_schema_ts_0ixydnz._.js +3 -0
  727. package/.next/server/chunks/lib_drizzle_schema_ts_0ixydnz._.js.map +1 -0
  728. package/.next/server/chunks/lib_roadmap-force-layout_ts_0e5r3g2._.js +3 -0
  729. package/.next/server/chunks/lib_roadmap-force-layout_ts_0e5r3g2._.js.map +1 -0
  730. package/.next/server/chunks/node_modules_drizzle-orm_05n3ooz._.js +3 -0
  731. package/.next/server/chunks/node_modules_drizzle-orm_05n3ooz._.js.map +1 -0
  732. package/.next/server/chunks/node_modules_drizzle-orm_0cht0an._.js +3 -0
  733. package/.next/server/chunks/node_modules_drizzle-orm_0cht0an._.js.map +1 -0
  734. package/.next/server/chunks/node_modules_drizzle-orm_0ma7f2e._.js +4 -0
  735. package/.next/server/chunks/node_modules_drizzle-orm_0ma7f2e._.js.map +1 -0
  736. package/.next/server/chunks/node_modules_drizzle-orm_0q0hg2u._.js +4 -0
  737. package/.next/server/chunks/node_modules_drizzle-orm_0q0hg2u._.js.map +1 -0
  738. package/.next/server/chunks/node_modules_drizzle-orm_0rs3wbv._.js +3 -0
  739. package/.next/server/chunks/node_modules_drizzle-orm_0rs3wbv._.js.map +1 -0
  740. package/.next/server/chunks/node_modules_drizzle-orm_index_1qnscv7.js +3 -0
  741. package/.next/server/chunks/node_modules_drizzle-orm_index_1qnscv7.js.map +1 -0
  742. package/.next/server/chunks/node_modules_drizzle-orm_libsql_0yabams._.js +15 -0
  743. package/.next/server/chunks/node_modules_drizzle-orm_libsql_0yabams._.js.map +1 -0
  744. package/.next/server/chunks/node_modules_next_08s853w._.js +13 -0
  745. package/.next/server/chunks/node_modules_next_08s853w._.js.map +1 -0
  746. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0qz67ql.js +3 -0
  747. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0qz67ql.js.map +1 -0
  748. package/.next/server/chunks/node_modules_zod_v4_classic_external_1-pw2v2.js +64 -0
  749. package/.next/server/chunks/node_modules_zod_v4_classic_external_1-pw2v2.js.map +1 -0
  750. package/.next/server/chunks/ssr/[externals]_@huggingface_transformers_05bd-zz._.js +3 -0
  751. package/.next/server/chunks/ssr/[externals]_@huggingface_transformers_05bd-zz._.js.map +1 -0
  752. package/.next/server/chunks/ssr/[root-of-the-server]__00vz2sw._.js +3 -0
  753. package/.next/server/chunks/ssr/[root-of-the-server]__00vz2sw._.js.map +1 -0
  754. package/.next/server/chunks/ssr/[root-of-the-server]__07b655z._.js +3 -0
  755. package/.next/server/chunks/ssr/[root-of-the-server]__07b655z._.js.map +1 -0
  756. package/.next/server/chunks/ssr/[root-of-the-server]__0dr0a32._.js +3 -0
  757. package/.next/server/chunks/ssr/[root-of-the-server]__0dr0a32._.js.map +1 -0
  758. package/.next/server/chunks/ssr/[root-of-the-server]__0jx25ik._.js +3 -0
  759. package/.next/server/chunks/ssr/[root-of-the-server]__0jx25ik._.js.map +1 -0
  760. package/.next/server/chunks/ssr/[root-of-the-server]__0nqskgw._.js +19 -0
  761. package/.next/server/chunks/ssr/[root-of-the-server]__0nqskgw._.js.map +1 -0
  762. package/.next/server/chunks/ssr/[root-of-the-server]__0pkeb0m._.js +9 -0
  763. package/.next/server/chunks/ssr/[root-of-the-server]__0pkeb0m._.js.map +1 -0
  764. package/.next/server/chunks/ssr/[root-of-the-server]__0s74gvr._.js +3 -0
  765. package/.next/server/chunks/ssr/[root-of-the-server]__0s74gvr._.js.map +1 -0
  766. package/.next/server/chunks/ssr/[root-of-the-server]__0v7a-e-._.js +3 -0
  767. package/.next/server/chunks/ssr/[root-of-the-server]__0v7a-e-._.js.map +1 -0
  768. package/.next/server/chunks/ssr/[root-of-the-server]__0x4-71n._.js +3 -0
  769. package/.next/server/chunks/ssr/[root-of-the-server]__0x4-71n._.js.map +1 -0
  770. package/.next/server/chunks/ssr/[root-of-the-server]__0xqf488._.js +3 -0
  771. package/.next/server/chunks/ssr/[root-of-the-server]__0xqf488._.js.map +1 -0
  772. package/.next/server/chunks/ssr/[root-of-the-server]__0y_88xg._.js +33 -0
  773. package/.next/server/chunks/ssr/[root-of-the-server]__0y_88xg._.js.map +1 -0
  774. package/.next/server/chunks/ssr/[root-of-the-server]__1-yyv5l._.js +3 -0
  775. package/.next/server/chunks/ssr/[root-of-the-server]__1-yyv5l._.js.map +1 -0
  776. package/.next/server/chunks/ssr/[root-of-the-server]__1366qju._.js +3 -0
  777. package/.next/server/chunks/ssr/[root-of-the-server]__1366qju._.js.map +1 -0
  778. package/.next/server/chunks/ssr/[root-of-the-server]__1_ustu7._.js +3 -0
  779. package/.next/server/chunks/ssr/[root-of-the-server]__1_ustu7._.js.map +1 -0
  780. package/.next/server/chunks/ssr/[root-of-the-server]__1dky4g0._.js +33 -0
  781. package/.next/server/chunks/ssr/[root-of-the-server]__1dky4g0._.js.map +1 -0
  782. package/.next/server/chunks/ssr/[turbopack]_runtime.js +903 -0
  783. package/.next/server/chunks/ssr/[turbopack]_runtime.js.map +11 -0
  784. package/.next/server/chunks/ssr/_0eabx1f._.js +3 -0
  785. package/.next/server/chunks/ssr/_0eabx1f._.js.map +1 -0
  786. package/.next/server/chunks/ssr/_0ni84yi._.js +3 -0
  787. package/.next/server/chunks/ssr/_0ni84yi._.js.map +1 -0
  788. package/.next/server/chunks/ssr/_0pgw716._.js +67 -0
  789. package/.next/server/chunks/ssr/_0pgw716._.js.map +1 -0
  790. package/.next/server/chunks/ssr/_0r84jcg._.js +6 -0
  791. package/.next/server/chunks/ssr/_0r84jcg._.js.map +1 -0
  792. package/.next/server/chunks/ssr/_15if8ma._.js +3 -0
  793. package/.next/server/chunks/ssr/_15if8ma._.js.map +1 -0
  794. package/.next/server/chunks/ssr/_176djsq._.js +4 -0
  795. package/.next/server/chunks/ssr/_176djsq._.js.map +1 -0
  796. package/.next/server/chunks/ssr/_179xsho._.js +3 -0
  797. package/.next/server/chunks/ssr/_179xsho._.js.map +1 -0
  798. package/.next/server/chunks/ssr/_1_n8arv._.js +3 -0
  799. package/.next/server/chunks/ssr/_1_n8arv._.js.map +1 -0
  800. package/.next/server/chunks/ssr/_1suxp_q._.js +3 -0
  801. package/.next/server/chunks/ssr/_1suxp_q._.js.map +1 -0
  802. package/.next/server/chunks/ssr/_1vt70iy._.js +18 -0
  803. package/.next/server/chunks/ssr/_1vt70iy._.js.map +1 -0
  804. package/.next/server/chunks/ssr/_1w2komx._.js +3 -0
  805. package/.next/server/chunks/ssr/_1w2komx._.js.map +1 -0
  806. package/.next/server/chunks/ssr/_1w73gpg._.js +4 -0
  807. package/.next/server/chunks/ssr/_1w73gpg._.js.map +1 -0
  808. package/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0zi5s8-.js +3 -0
  809. package/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0zi5s8-.js.map +1 -0
  810. package/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0pt47yr.js +3 -0
  811. package/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0pt47yr.js.map +1 -0
  812. package/.next/server/chunks/ssr/_next-internal_server_app_help_page_actions_04daq_g.js +3 -0
  813. package/.next/server/chunks/ssr/_next-internal_server_app_help_page_actions_04daq_g.js.map +1 -0
  814. package/.next/server/chunks/ssr/_next-internal_server_app_page_actions_0hhsz1j.js +3 -0
  815. package/.next/server/chunks/ssr/_next-internal_server_app_page_actions_0hhsz1j.js.map +1 -0
  816. package/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_11x4dq5.js +3 -0
  817. package/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_11x4dq5.js.map +1 -0
  818. package/.next/server/chunks/ssr/components_1wolv70._.js +157 -0
  819. package/.next/server/chunks/ssr/components_1wolv70._.js.map +1 -0
  820. package/.next/server/chunks/ssr/components_graph_files-map-client_tsx_10bha9z._.js +3 -0
  821. package/.next/server/chunks/ssr/components_graph_files-map-client_tsx_10bha9z._.js.map +1 -0
  822. package/.next/server/chunks/ssr/components_landing_landing_tsx_1_9k5z7._.js +3 -0
  823. package/.next/server/chunks/ssr/components_landing_landing_tsx_1_9k5z7._.js.map +1 -0
  824. package/.next/server/chunks/ssr/components_plan_plan-workspace_tsx_0t1topu._.js +3 -0
  825. package/.next/server/chunks/ssr/components_plan_plan-workspace_tsx_0t1topu._.js.map +1 -0
  826. package/.next/server/chunks/ssr/lib_13g58ln._.js +3 -0
  827. package/.next/server/chunks/ssr/lib_13g58ln._.js.map +1 -0
  828. package/.next/server/chunks/ssr/lib_db_ts_0bo045t._.js +3 -0
  829. package/.next/server/chunks/ssr/lib_db_ts_0bo045t._.js.map +1 -0
  830. package/.next/server/chunks/ssr/lib_drizzle_schema_ts_0oz5uob._.js +3 -0
  831. package/.next/server/chunks/ssr/lib_drizzle_schema_ts_0oz5uob._.js.map +1 -0
  832. package/.next/server/chunks/ssr/node_modules_0h91jdk._.js +33 -0
  833. package/.next/server/chunks/ssr/node_modules_0h91jdk._.js.map +1 -0
  834. package/.next/server/chunks/ssr/node_modules_0vtauab._.js +3 -0
  835. package/.next/server/chunks/ssr/node_modules_0vtauab._.js.map +1 -0
  836. package/.next/server/chunks/ssr/node_modules_drizzle-orm_0txo559._.js +4 -0
  837. package/.next/server/chunks/ssr/node_modules_drizzle-orm_0txo559._.js.map +1 -0
  838. package/.next/server/chunks/ssr/node_modules_drizzle-orm_1d7zgzr._.js +4 -0
  839. package/.next/server/chunks/ssr/node_modules_drizzle-orm_1d7zgzr._.js.map +1 -0
  840. package/.next/server/chunks/ssr/node_modules_drizzle-orm_1zqkwdy._.js +3 -0
  841. package/.next/server/chunks/ssr/node_modules_drizzle-orm_1zqkwdy._.js.map +1 -0
  842. package/.next/server/chunks/ssr/node_modules_drizzle-orm_202ujxv._.js +3 -0
  843. package/.next/server/chunks/ssr/node_modules_drizzle-orm_202ujxv._.js.map +1 -0
  844. package/.next/server/chunks/ssr/node_modules_drizzle-orm_index_0ji3_g8.js +3 -0
  845. package/.next/server/chunks/ssr/node_modules_drizzle-orm_index_0ji3_g8.js.map +1 -0
  846. package/.next/server/chunks/ssr/node_modules_drizzle-orm_libsql_06opikx._.js +15 -0
  847. package/.next/server/chunks/ssr/node_modules_drizzle-orm_libsql_06opikx._.js.map +1 -0
  848. package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_shield-check_mjs_1cccgdy._.js +3 -0
  849. package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_shield-check_mjs_1cccgdy._.js.map +1 -0
  850. package/.next/server/chunks/ssr/node_modules_next_dist_0890nbp._.js +3 -0
  851. package/.next/server/chunks/ssr/node_modules_next_dist_0890nbp._.js.map +1 -0
  852. package/.next/server/chunks/ssr/node_modules_next_dist_0airgni._.js +3 -0
  853. package/.next/server/chunks/ssr/node_modules_next_dist_0airgni._.js.map +1 -0
  854. package/.next/server/chunks/ssr/node_modules_next_dist_0alesp5._.js +3 -0
  855. package/.next/server/chunks/ssr/node_modules_next_dist_0alesp5._.js.map +1 -0
  856. package/.next/server/chunks/ssr/node_modules_next_dist_0uboya6._.js +6 -0
  857. package/.next/server/chunks/ssr/node_modules_next_dist_0uboya6._.js.map +1 -0
  858. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0wpq8j3._.js +3 -0
  859. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0wpq8j3._.js.map +1 -0
  860. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0symwr9.js +3 -0
  861. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0symwr9.js.map +1 -0
  862. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0-o-goa.js +3 -0
  863. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0-o-goa.js.map +1 -0
  864. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0l_sp0x.js +3 -0
  865. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0l_sp0x.js.map +1 -0
  866. package/.next/server/chunks/ssr/node_modules_next_dist_compiled_@opentelemetry_api_index_1oy1nwh.js +3 -0
  867. package/.next/server/chunks/ssr/node_modules_next_dist_compiled_@opentelemetry_api_index_1oy1nwh.js.map +1 -0
  868. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0d7qbqa.js +4 -0
  869. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0d7qbqa.js.map +1 -0
  870. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0s87tpk.js +4 -0
  871. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0s87tpk.js.map +1 -0
  872. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_114qdo2.js +4 -0
  873. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_114qdo2.js.map +1 -0
  874. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_19--w_z.js +4 -0
  875. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_19--w_z.js.map +1 -0
  876. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_19_kztz.js +4 -0
  877. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_19_kztz.js.map +1 -0
  878. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_19qzf81.js +4 -0
  879. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_19qzf81.js.map +1 -0
  880. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1wge0av.js +4 -0
  881. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1wge0av.js.map +1 -0
  882. package/.next/server/edge/chunks/_0o_tvsk._.js +3 -0
  883. package/.next/server/edge/chunks/_0o_tvsk._.js.map +1 -0
  884. package/.next/server/edge/chunks/node_modules_next_dist_esm_build_templates_edge-wrapper_1ipl-lx.js.map +1 -0
  885. package/.next/server/edge/chunks/turbopack-node_modules_next_dist_esm_build_templates_edge-wrapper_1ipl-lx.js +3 -0
  886. package/.next/server/functions-config-manifest.json +14 -0
  887. package/.next/server/instrumentation/middleware-manifest.json +12 -0
  888. package/.next/server/instrumentation.js +4 -0
  889. package/.next/server/instrumentation.js.map +5 -0
  890. package/.next/server/instrumentation.js.nft.json +1 -0
  891. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  892. package/.next/server/middleware/middleware-manifest.json +6 -0
  893. package/.next/server/middleware-build-manifest.js +21 -0
  894. package/.next/server/middleware-manifest.json +6 -0
  895. package/.next/server/middleware.js +5 -0
  896. package/.next/server/middleware.js.map +5 -0
  897. package/.next/server/middleware.js.nft.json +1 -0
  898. package/.next/server/next-font-manifest.js +1 -0
  899. package/.next/server/next-font-manifest.json +31 -0
  900. package/.next/server/pages/404.html +1 -0
  901. package/.next/server/pages/500.html +1 -0
  902. package/.next/server/pages-manifest.json +4 -0
  903. package/.next/server/prefetch-hints.json +1 -0
  904. package/.next/server/server-reference-manifest.js +1 -0
  905. package/.next/server/server-reference-manifest.json +132 -0
  906. package/.next/static/_wmO3ZSrpuwty88NNlnrH/_buildManifest.js +11 -0
  907. package/.next/static/_wmO3ZSrpuwty88NNlnrH/_clientMiddlewareManifest.js +6 -0
  908. package/.next/static/_wmO3ZSrpuwty88NNlnrH/_ssgManifest.js +1 -0
  909. package/.next/static/chunks/01dkdyukbdpqq.js +31 -0
  910. package/.next/static/chunks/05-c3ty_6dwfk.js +1 -0
  911. package/.next/static/chunks/07u_h6i539_wj.js +2 -0
  912. package/.next/static/chunks/09wlenlnsbkl7.js +2 -0
  913. package/.next/static/chunks/0_9p121-4am0a.js +1 -0
  914. package/.next/static/chunks/0cz1d0mv5g_q7.js +1 -0
  915. package/.next/static/chunks/19cl65vz3pos0.js +1 -0
  916. package/.next/static/chunks/19hoowcssv0w1.css +1 -0
  917. package/.next/static/chunks/1bk_i_akra521.css +2 -0
  918. package/.next/static/chunks/1pp98vred9isg.js +1 -0
  919. package/.next/static/chunks/2-t6-hz_de2nr.js +155 -0
  920. package/.next/static/chunks/203o948823s96.css +1 -0
  921. package/.next/static/chunks/245vq4i7_x7tm.js +1 -0
  922. package/.next/static/chunks/27jktro2p5rq9.js +4 -0
  923. package/.next/static/chunks/2hpdskhtooxl4.js +1 -0
  924. package/.next/static/chunks/368etk_9oovhj.js +1 -0
  925. package/.next/static/chunks/3n7dm2ojtyzwn.js +1 -0
  926. package/.next/static/chunks/3oc95d6bep78a.css +1 -0
  927. package/.next/static/chunks/3qp8f4catg9zw.js +2 -0
  928. package/.next/static/chunks/3ywpldblg905c.js +1 -0
  929. package/.next/static/chunks/4397avi9yar6d.js +1 -0
  930. package/.next/static/chunks/44_nvrzzjs0pv.js +1 -0
  931. package/.next/static/chunks/turbopack-0rldyqi2kcq2j.js +1 -0
  932. package/.next/static/media/4fa387ec64143e14-s.2tuy5pz7dlieh.woff2 +0 -0
  933. package/.next/static/media/53b9e256198e5412-s.390ncx5urfkfu.woff2 +0 -0
  934. package/.next/static/media/5ce348bf30bf5439-s.31988l_ccedte.woff2 +0 -0
  935. package/.next/static/media/6306c77e7c8268e4-s.2dbetqa9o8jxf.woff2 +0 -0
  936. package/.next/static/media/7178b3e590c64307-s.21jp631_3pja2.woff2 +0 -0
  937. package/.next/static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2 +0 -0
  938. package/.next/static/media/7d817b4c03b0c5f1-s.1uyisp29ctx0d.woff2 +0 -0
  939. package/.next/static/media/8a480f0b521d4e75-s.1qq4vpdcun5oj.woff2 +0 -0
  940. package/.next/static/media/apple-icon.0qbqv4vpdxdo0.png +0 -0
  941. package/.next/static/media/bbc41e54d2fcbd21-s.1rgnod-3esatf.woff2 +0 -0
  942. package/.next/static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2 +0 -0
  943. package/.next/static/media/fef07dbb0973bf53-s.3p2_lha1f2xer.woff2 +0 -0
  944. package/.next/static/media/icon.23_qbw6oy1xqy.svg +4 -0
  945. package/.next/trace +2 -0
  946. package/.next/trace-build +1 -0
  947. package/.next/turbopack +0 -0
  948. package/.next/types/cache-life.d.ts +145 -0
  949. package/.next/types/routes.d.ts +124 -0
  950. package/.next/types/validator.ts +538 -0
  951. package/README.md +94 -0
  952. package/dist/bin/beacon.js +10 -0
  953. package/dist/bin/doctor.js +227 -0
  954. package/dist/bin/hook.js +225 -0
  955. package/dist/bin/mcp.js +247 -0
  956. package/dist/bin/plan.js +228 -0
  957. package/dist/bin/prompt.js +4 -0
  958. package/dist/bin/stop-hook.js +5 -0
  959. package/dist/bin/uninstall.js +228 -0
  960. package/dist/lib/assets.js +192 -0
  961. package/dist/lib/global-install.js +224 -0
  962. package/dist/lib/workspaces.js +2 -0
  963. package/drizzle/0000_bitter_network.sql +230 -0
  964. package/drizzle/meta/0000_snapshot.json +1589 -0
  965. package/drizzle/meta/_journal.json +13 -0
  966. package/next.config.ts +15 -0
  967. package/package.json +90 -0
  968. package/public/brand/beacon-apple.svg +30 -0
  969. package/public/brand/beacon-glyph-128.png +0 -0
  970. package/public/brand/beacon-glyph-512.png +0 -0
  971. package/public/brand/beacon-glyph-mono-128.png +0 -0
  972. package/public/brand/beacon-glyph-mono-512.png +0 -0
  973. package/public/brand/beacon-glyph-mono.svg +4 -0
  974. package/public/brand/beacon-glyph.svg +21 -0
  975. package/public/brand/beacon-icon-1024.png +0 -0
  976. package/public/brand/beacon-icon-192.png +0 -0
  977. package/public/brand/beacon-icon-256.png +0 -0
  978. package/public/brand/beacon-icon-32.png +0 -0
  979. package/public/brand/beacon-icon-512.png +0 -0
  980. package/public/brand/beacon-icon-64.png +0 -0
  981. package/public/brand/beacon-icon-light-192.png +0 -0
  982. package/public/brand/beacon-icon-light-512.png +0 -0
  983. package/public/brand/beacon-icon-light.svg +31 -0
  984. package/public/brand/beacon-icon.svg +33 -0
  985. package/public/brand/beacon-wordmark-1200.png +0 -0
  986. package/public/brand/beacon-wordmark.svg +38 -0
  987. package/public/brand/favicon-16.png +0 -0
  988. package/public/brand/favicon-32.png +0 -0
  989. package/public/file.svg +1 -0
  990. package/public/globe.svg +1 -0
  991. package/public/install.sh +55 -0
  992. package/public/next.svg +1 -0
  993. package/public/vercel.svg +1 -0
  994. package/public/window.svg +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../lib/node-placement.ts","../../../lib/roadmap-layout-state.ts","../../../lib/schemas.ts","../../../lib/mutations.ts","../../../lib/map-ops.ts"],"sourcesContent":["// Collision-free placement for newly-created roadmap nodes. All the creation paths used to drop\n// nodes at fixed offsets (parent.x + i*240, i*300, …) with no awareness of what's already on the\n// board, so a new feature/sub-task could land on top of an existing card. This nudges a new node\n// straight DOWN until it's clear, PRESERVING every existing position (no global re-layout that\n// would undo the user's manual drags). Pure — unit-tested, shared by lib/map-ops + lib/feature-design.\n\nexport interface Pos {\n x: number;\n y: number;\n}\n\n// Minimum separation (px) below which two cards count as overlapping. Kept SMALLER than the grid\n// steps the layouts use (≥240 horizontal) so a normal row isn't flagged — only a card that\n// genuinely landed on/near another one.\nconst MIN_W = 200;\nconst MIN_H = 150;\n\nfunction overlaps(a: Pos, b: Pos): boolean {\n return Math.abs(a.x - b.x) < MIN_W && Math.abs(a.y - b.y) < MIN_H;\n}\n\n/** Place a new node at `desired`, nudging it down (preserving x) until it clears every existing\n * node. Existing positions are never moved. */\nexport function placeWithoutOverlap(existing: Pos[], desired: Pos): Pos {\n const pos = { x: desired.x, y: desired.y };\n for (let i = 0; i < 100 && existing.some((e) => overlaps(pos, e)); i++) {\n pos.y += MIN_H;\n }\n return pos;\n}\n","import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { dataDir } from \"@/lib/project\";\nimport { writeJsonAtomic } from \"@/lib/atomic-write\";\n\n// Per-workspace marker recording the STRUCTURE the roadmap was last auto-laid-out for. The\n// organic force layout only re-runs when this signature changes (a feature/edge added or removed),\n// so a plain page refresh, a manual card drag, or a Group-by arrangement is NOT clobbered — only a\n// genuine structural change re-tidies the board. Stored as one tiny JSON file in the workspace\n// data dir (same pattern as touched-files / draft store), so no DB schema change is needed.\n\n// Bump when the layout ALGORITHM changes (e.g. force params) so every board re-lays-out once even\n// though its node/edge set is unchanged.\nconst LAYOUT_ALGO_VERSION = \"force-2\";\n\n// Pure: a stable signature of the roadmap's structure (node set + dependency edges). Sorted so it\n// is order-independent; positions/status/titles are deliberately excluded — only the graph shape\n// matters for layout. Prefixed with the algo version so a layout change invalidates old sigs.\nexport function roadmapStructureSignature(\n nodeIds: string[],\n edges: { fromId: string; toId: string }[],\n): string {\n const ns = [...nodeIds].sort().join(\",\");\n const es = edges.map((e) => `${e.fromId}>${e.toId}`).sort().join(\",\");\n return `${LAYOUT_ALGO_VERSION}|${nodeIds.length}|${ns}|${es}`;\n}\n\nfunction sigPath(): string {\n return join(dataDir(), \"roadmap-layout-sig.json\");\n}\n\nexport function readRoadmapLayoutSig(): string | null {\n try {\n const raw = JSON.parse(readFileSync(sigPath(), \"utf8\")) as { sig?: string };\n return raw.sig ?? null;\n } catch {\n return null;\n }\n}\n\nexport function writeRoadmapLayoutSig(sig: string): void {\n writeJsonAtomic(sigPath(), { sig });\n}\n","import { z } from \"zod\";\n\nexport const VIEW = z.enum([\"ROADMAP\", \"ARCHITECTURE\"]);\n\nexport const NODE_STATUS = z.enum([\n // roadmap\n \"PENDING\",\n \"IN_PROGRESS\",\n \"DONE\",\n \"BLOCKED\",\n \"CANCELLED\",\n \"DEPRIORITIZED\",\n // architecture disposition\n \"KEEP\",\n \"REBUILD\",\n \"REPLACE\",\n \"DROP\",\n]);\n\nexport const EDGE_KIND = z.enum([\"DEPENDS\", \"CONTAINS\", \"RELATES\", \"REPLACES\"]);\n\nexport const createNodeSchema = z.object({\n view: VIEW,\n title: z.string().trim().min(1).max(200),\n cluster: z.string().trim().max(64).nullish(),\n role: z.string().trim().max(500).nullish(),\n plain: z.string().trim().max(2000).nullish(),\n parentId: z.string().nullish(),\n status: NODE_STATUS.optional(),\n priority: z.number().int().min(0).max(3).optional(),\n x: z.number().optional(),\n y: z.number().optional(),\n sourceRef: z.string().trim().max(300).nullish(),\n});\nexport type CreateNodeInput = z.input<typeof createNodeSchema>;\n\nexport const updateNodeSchema = z.object({\n title: z.string().trim().min(1).max(200).optional(),\n role: z.string().trim().max(500).nullish(),\n plain: z.string().trim().max(2000).nullish(),\n cluster: z.string().trim().max(64).nullish(),\n status: NODE_STATUS.optional(),\n priority: z.number().int().min(0).max(3).optional(),\n sourceRef: z.string().trim().max(300).nullish(),\n});\nexport type UpdateNodeInput = z.input<typeof updateNodeSchema>;\n\nexport const positionSchema = z.object({\n x: z.number(),\n y: z.number(),\n});\n\nexport const createEdgeSchema = z.object({\n fromId: z.string().min(1),\n toId: z.string().min(1),\n kind: z.enum([\"DEPENDS\", \"RELATES\", \"REPLACES\"]).optional(),\n label: z.string().trim().max(80).nullish(),\n // Which handle on each card the user dragged from / to (e.g. \"sr\", \"tl\").\n sourceHandle: z.string().trim().max(16).nullish(),\n targetHandle: z.string().trim().max(16).nullish(),\n});\nexport type CreateEdgeInput = z.input<typeof createEdgeSchema>;\n","import { and, eq } from \"drizzle-orm\";\nimport { db } from \"@/lib/db-drizzle\";\nimport { node, edge, dbTable, endpoint } from \"@/lib/drizzle/schema\";\nimport { reembedNode } from \"@/lib/embeddings\";\nimport { propagateStatusUp } from \"@/lib/map-ops\";\nimport {\n NODE_STATUS,\n createEdgeSchema,\n createNodeSchema,\n positionSchema,\n updateNodeSchema,\n type CreateEdgeInput,\n type CreateNodeInput,\n type UpdateNodeInput,\n} from \"@/lib/schemas\";\n\n// Pure data mutations (validation + db). Kept free of Next imports so they can be\n// unit-tested directly; the `app/actions/*` wrappers add cache revalidation.\n\n// Semantic-search fields — when any of these change, the row's embedding needs\n// to refresh. Status / position / priority don't affect the vector, so frequent\n// drag-and-status mutations skip the (~50ms) embed.\nconst SEMANTIC_FIELDS = new Set([\"title\", \"role\", \"plain\", \"cluster\"]);\n\nexport async function createNode(input: CreateNodeInput) {\n const data = createNodeSchema.parse(input);\n const defaultStatus = data.view === \"ARCHITECTURE\" ? \"REBUILD\" : \"PENDING\";\n const [created] = await db\n .insert(node)\n .values({\n view: data.view,\n title: data.title,\n cluster: data.cluster ?? null,\n role: data.role ?? null,\n plain: data.plain ?? null,\n parentId: data.parentId ?? null,\n status: data.status ?? defaultStatus,\n priority: data.priority ?? 2,\n x: data.x ?? 0,\n y: data.y ?? 0,\n sourceRef: data.sourceRef ?? null,\n })\n .returning();\n await reembedNode(created.id);\n return created;\n}\n\n// A roadmap dependency edge (or RELATES/REPLACES) created by dragging between two node\n// handles. Idempotent on the unique [fromId,toId,kind] — duplicate drags return the existing\n// edge instead of erroring, since drag gestures are easy to repeat by accident.\nexport async function createEdge(input: CreateEdgeInput) {\n const data = createEdgeSchema.parse(input);\n if (data.fromId === data.toId) throw new Error(\"Self-edge not allowed\");\n const kind = data.kind ?? \"DEPENDS\";\n const existing = await db.query.edge.findFirst({\n where: (e, { and: a, eq: eqf }) =>\n a(eqf(e.fromId, data.fromId), eqf(e.toId, data.toId), eqf(e.kind, kind)),\n });\n if (existing) return existing;\n const [created] = await db\n .insert(edge)\n .values({\n fromId: data.fromId,\n toId: data.toId,\n kind,\n label: data.label ?? null,\n sourceHandle: data.sourceHandle ?? null,\n targetHandle: data.targetHandle ?? null,\n })\n .returning();\n return created;\n}\n\nexport async function updateNode(id: string, input: UpdateNodeInput) {\n const data = updateNodeSchema.parse(input);\n const [updated] = await db.update(node).set(data).where(eq(node.id, id)).returning();\n // Re-embed only when a semantic field actually changed — drag/status updates\n // happen constantly and don't change the vector.\n const semanticChanged = Object.keys(data).some((k) => SEMANTIC_FIELDS.has(k));\n if (semanticChanged) await reembedNode(id);\n // Status changes need to bubble up to parent.\n if (data.status !== undefined) await propagateStatusUp(id);\n return updated;\n}\n\nexport async function setNodeStatus(id: string, status: string) {\n const parsed = NODE_STATUS.parse(status);\n const [updated] = await db.update(node).set({ status: parsed }).where(eq(node.id, id)).returning();\n await propagateStatusUp(id);\n return updated;\n}\n\n/** Soft \"park\": mark deprioritized and drop to the lowest priority. Reversible. */\nexport async function deprioritizeNode(id: string) {\n const [updated] = await db\n .update(node)\n .set({ status: \"DEPRIORITIZED\", priority: 3 })\n .where(eq(node.id, id))\n .returning();\n await propagateStatusUp(id);\n return updated;\n}\n\n/** Soft cancel: keep the node for history, rendered struck-through. Not a delete. */\nexport async function cancelNode(id: string) {\n const [updated] = await db\n .update(node)\n .set({ status: \"CANCELLED\" })\n .where(eq(node.id, id))\n .returning();\n await propagateStatusUp(id);\n return updated;\n}\n\nexport async function deleteNode(id: string) {\n const [deleted] = await db.delete(node).where(eq(node.id, id)).returning();\n return deleted;\n}\n\nexport async function updateNodePosition(id: string, x: number, y: number) {\n const pos = positionSchema.parse({ x, y });\n const [updated] = await db.update(node).set(pos).where(eq(node.id, id)).returning();\n return updated;\n}\n\n// Persist many node positions in one round-trip — used by the roadmap \"Arrange\" action,\n// which repositions every feature at once. Mirrors the code-graph batch-position route.\nexport async function updateNodePositions(rows: { id: string; x: number; y: number }[]) {\n await Promise.all(\n rows.map((r) => {\n const pos = positionSchema.parse({ x: r.x, y: r.y });\n return db.update(node).set(pos).where(eq(node.id, r.id));\n }),\n );\n return rows.length;\n}\n\n// ── Database-design map positions ───────────────────────────────────────────\n\nexport async function updateDbTablePosition(id: string, x: number, y: number) {\n const pos = positionSchema.parse({ x, y });\n const [updated] = await db.update(dbTable).set(pos).where(eq(dbTable.id, id)).returning();\n return updated;\n}\n\nexport async function updateEndpointPosition(id: string, x: number, y: number) {\n const pos = positionSchema.parse({ x, y });\n const [updated] = await db.update(endpoint).set(pos).where(eq(endpoint.id, id)).returning();\n return updated;\n}\n","import { z } from \"zod\";\nimport { and, count, eq, inArray } from \"drizzle-orm\";\nimport { db } from \"@/lib/db-drizzle\";\nimport { node, nodeFile, edge, appSetting } from \"@/lib/drizzle/schema\";\nimport { bumpVersion } from \"@/lib/ingest\";\nimport { reembedNode } from \"@/lib/embeddings\";\nimport { matchFeature, type Scored } from \"@/lib/match\";\nimport { validateFeatureCreation, validateFront } from \"@/lib/feature-rules\";\nimport { placeWithoutOverlap } from \"@/lib/node-placement\";\nimport { forceLayoutRoadmap } from \"@/lib/roadmap-force-layout\";\nimport {\n readRoadmapLayoutSig,\n roadmapStructureSignature,\n writeRoadmapLayoutSig,\n} from \"@/lib/roadmap-layout-state\";\nimport { createNode } from \"@/lib/mutations\";\nimport { repoRoot } from \"@/lib/project\";\nimport { setAppSettings } from \"@/lib/settings\";\n\nasync function setCurrent(id: string) {\n await setAppSettings({ currentFeatureId: id });\n}\n\n// Map write operations used by the HTTP API + the MCP server. Lets a Claude Code\n// session see the roadmap and register what it's working on: flag an existing\n// feature as \"being worked on\", or add a new one under the right front (or a new front).\n\nexport interface MapView {\n fronts: Array<{\n id: string;\n title: string;\n status: string;\n tasks: Array<{ id: string; title: string; status: string; workingOn: boolean }>;\n }>;\n}\n\nexport async function listMap(): Promise<MapView> {\n const nodes = await db.query.node.findMany({\n where: (t, { eq }) => eq(t.view, \"ROADMAP\"),\n orderBy: (t, { asc }) => asc(t.createdAt),\n });\n const fronts = nodes.filter((n) => !n.parentId);\n return {\n fronts: fronts.map((f) => ({\n id: f.id,\n title: f.title,\n status: f.status,\n tasks: nodes\n .filter((n) => n.parentId === f.id)\n .map((t) => ({\n id: t.id,\n title: t.title,\n status: t.status,\n workingOn: t.status === \"IN_PROGRESS\",\n })),\n })),\n };\n}\n\nexport type StartResult =\n | { action: \"flagged\"; id: string; title: string; via: \"id\" | \"match\"; score?: number }\n | { action: \"created\"; id: string; title: string; front: string | null }\n | { action: \"ambiguous\"; candidates: Scored[] }\n | { action: \"rejected\"; message: string };\n\nasync function setStatus(id: string, status: string) {\n await db.update(node).set({ status }).where(eq(node.id, id));\n await propagateStatusUp(id);\n await bumpVersion();\n}\n\n// ── Parent-derived status propagation ───────────────────────────────────────\n// When a roadmap child's status changes, walk up the parent chain so each\n// ancestor reflects its children's reality. Status doesn't auto-update from\n// progress because the canvas needs the explicit field to colour/sort by.\n//\n// Status classes for the derivation:\n// complete — DONE, CANCELLED, DEPRIORITIZED (off the board, count as \"settled\")\n// active — IN_PROGRESS, BLOCKED\n// pending — PENDING (default)\n//\n// Rules (only applied to ROADMAP nodes):\n// • all children complete → parent DONE\n// • any child active → parent IN_PROGRESS\n// • else → parent PENDING\n//\n// Sticky parent states (CANCELLED, DEPRIORITIZED) are user decisions and win —\n// nothing children do will override them. Unmark them to re-enable derivation.\n\nconst COMPLETE_STATUSES = new Set([\"DONE\", \"CANCELLED\", \"DEPRIORITIZED\"]);\nconst ACTIVE_STATUSES = new Set([\"IN_PROGRESS\", \"BLOCKED\"]);\nconst STICKY_PARENT_STATUSES = new Set([\"CANCELLED\", \"DEPRIORITIZED\"]);\n\nfunction deriveParentStatus(childStatuses: string[]): string {\n if (!childStatuses.length) return \"PENDING\";\n if (childStatuses.every((s) => COMPLETE_STATUSES.has(s))) return \"DONE\";\n if (childStatuses.some((s) => ACTIVE_STATUSES.has(s))) return \"IN_PROGRESS\";\n return \"PENDING\";\n}\n\n/**\n * Recompute the parent of `nodeId` (and onwards up) from its children's\n * statuses. No-op for top-level nodes, ARCHITECTURE-view nodes, or when the\n * parent has a sticky user-set status. Safe to call after any roadmap-node\n * status write; idempotent.\n */\nexport async function propagateStatusUp(nodeId: string): Promise<void> {\n const self = await db.query.node.findFirst({\n where: (t, { eq }) => eq(t.id, nodeId),\n columns: { parentId: true, view: true },\n });\n if (!self?.parentId || self.view !== \"ROADMAP\") return;\n\n const parent = await db.query.node.findFirst({\n where: (t, { eq }) => eq(t.id, self.parentId!),\n columns: { id: true, status: true, view: true },\n });\n if (!parent || parent.view !== \"ROADMAP\") return;\n if (STICKY_PARENT_STATUSES.has(parent.status)) return;\n\n const siblings = await db.query.node.findMany({\n where: (t, { eq }) => eq(t.parentId, parent.id),\n columns: { status: true },\n });\n const derived = deriveParentStatus(siblings.map((s) => s.status));\n if (parent.status === derived) return;\n\n await db.update(node).set({ status: derived }).where(eq(node.id, parent.id));\n await propagateStatusUp(parent.id);\n}\n\n/**\n * A session starts working on a feature. Resolution order:\n * 1. explicit `id` (from beacon_map) → flag it (100% reliable)\n * 2. confident, unambiguous fuzzy match → flag it\n * 3. plausible-but-ambiguous matches → return candidates to disambiguate\n * 4. no match → create it under `front` (creating that front if needed)\n */\n// Lay the committed roadmap board out as an ORGANIC 2D graph (d3-force): independent features\n// spread across the width, dependency-linked features pull into tight clusters with short edges.\n// Called on every /map load and after a feature is created, so an existing board self-heals.\n//\n// Re-runs ONLY when the graph STRUCTURE changes (a feature/edge added or removed), tracked by a\n// per-workspace signature file. A plain refresh, a manual card drag, or a Group-by arrangement\n// leaves the signature untouched and is therefore preserved — the layout never fights the user.\n// DRAFT nodes are excluded (a plan under review owns its own layout in lib/feature-design). Does\n// NOT bump the sync version.\nexport async function healRoadmapLayout(): Promise<void> {\n const all = await db.query.node.findMany({\n where: (t, { eq }) => eq(t.view, \"ROADMAP\"),\n columns: { id: true, parentId: true, source: true, x: true, y: true },\n });\n const nodes = all.filter((n) => n.source !== \"DRAFT\");\n if (nodes.length < 2) return;\n const ids = nodes.map((n) => n.id);\n const edges = await db.query.edge.findMany({\n where: (t, { and, eq }) =>\n and(eq(t.kind, \"DEPENDS\"), inArray(t.fromId, ids), inArray(t.toId, ids)),\n columns: { fromId: true, toId: true },\n });\n\n const sig = roadmapStructureSignature(ids, edges);\n if (readRoadmapLayoutSig() === sig) return; // structure unchanged → keep the current arrangement\n\n const pos = forceLayoutRoadmap(\n nodes.map((n) => ({ id: n.id, parentId: n.parentId })),\n edges,\n );\n const updates: Promise<unknown>[] = [];\n for (const n of nodes) {\n const p = pos.get(n.id);\n if (!p) continue;\n if (Math.round(p.x) === Math.round(n.x) && Math.round(p.y) === Math.round(n.y)) continue;\n updates.push(db.update(node).set({ x: p.x, y: p.y }).where(eq(node.id, n.id)));\n }\n await Promise.all(updates);\n writeRoadmapLayoutSig(sig);\n}\n\nexport async function startFeature(input: {\n title: string;\n id?: string | null;\n front?: string | null;\n detail?: string | null;\n cluster?: string | null;\n}): Promise<StartResult> {\n const title = input.title.trim();\n if (!title) throw new Error(\"title required\");\n\n const nodes = await db.query.node.findMany({ where: (t, { eq }) => eq(t.view, \"ROADMAP\") });\n\n if (input.id) {\n const n = nodes.find((x) => x.id === input.id);\n if (n) {\n await setStatus(n.id, \"IN_PROGRESS\");\n await setCurrent(n.id);\n return { action: \"flagged\", id: n.id, title: n.title, via: \"id\" };\n }\n }\n\n const { best, candidates } = matchFeature(\n title,\n nodes.map((n) => ({ id: n.id, title: n.title })),\n );\n if (best) {\n await setStatus(best.id, \"IN_PROGRESS\");\n await setCurrent(best.id);\n return { action: \"flagged\", id: best.id, title: best.title, via: \"match\", score: best.score };\n }\n if (candidates.length) return { action: \"ambiguous\", candidates };\n\n // No match → create. Guard the loose path the same way propose_plan is guarded: a `front`\n // must reference a REAL existing parent feature (not a domain tag — that footgun is how a bogus\n // \"CRAWL\" front got created), and a brand-new top-level feature must carry a category. A task\n // nested under a front inherits the front's category. Shares lib/feature-rules with the plan path.\n const fronts = nodes.filter((n) => !n.parentId);\n const frontInput = input.front?.trim() || \"\";\n\n const frontErr = frontInput\n ? validateFront(frontInput, fronts.map((n) => ({ id: n.id, title: n.title })))\n : null;\n if (frontErr) return { action: \"rejected\", message: frontErr };\n\n let parentId: string | null = null;\n let frontTitle: string | null = null;\n let inheritedCluster: string | null = null;\n if (frontInput) {\n const f = matchFeature(frontInput, fronts.map((n) => ({ id: n.id, title: n.title }))).best!;\n parentId = f.id;\n frontTitle = f.title;\n inheritedCluster = nodes.find((n) => n.id === f.id)?.cluster ?? null;\n }\n\n const cluster = (input.cluster?.trim() || inheritedCluster) ?? null;\n const createErr = validateFeatureCreation({\n title,\n category: cluster,\n existing: nodes.map((n) => ({ id: n.id, title: n.title, cluster: n.cluster, status: n.status })),\n });\n if (createErr) return { action: \"rejected\", message: createErr };\n\n const siblings = parentId\n ? nodes.filter((n) => n.parentId === parentId).length\n : fronts.length;\n const pos = placeWithoutOverlap(\n nodes.map((n) => ({ x: n.x, y: n.y })),\n {\n x: parentId ? (fronts.find((f) => f.id === parentId)?.x ?? 0) : siblings * 300,\n y: parentId ? 160 + siblings * 110 : 0,\n },\n );\n const [task] = await db\n .insert(node)\n .values({\n view: \"ROADMAP\",\n title,\n plain: input.detail ?? null,\n cluster,\n status: \"IN_PROGRESS\",\n source: \"SESSION\",\n parentId,\n x: pos.x,\n y: pos.y,\n })\n .returning();\n await reembedNode(task.id);\n await propagateStatusUp(task.id);\n // A new feature changes the graph structure → re-tidy the board organically so the new card is\n // placed sensibly instead of in a blind row.\n await healRoadmapLayout();\n await bumpVersion();\n await setCurrent(task.id);\n return { action: \"created\", id: task.id, title, front: frontTitle };\n}\n\nexport async function finishFeature(input: {\n title?: string;\n id?: string;\n}): Promise<{ ok: boolean; id?: string; candidates?: Scored[] }> {\n const nodes = await db.query.node.findMany({ where: (t, { eq }) => eq(t.view, \"ROADMAP\") });\n\n if (input.id) {\n const n = nodes.find((x) => x.id === input.id);\n if (n) {\n await setStatus(n.id, \"DONE\");\n return { ok: true, id: n.id };\n }\n }\n if (!input.title) return { ok: false };\n\n const { best, candidates } = matchFeature(\n input.title,\n nodes.map((n) => ({ id: n.id, title: n.title })),\n );\n if (best) {\n await setStatus(best.id, \"DONE\");\n return { ok: true, id: best.id };\n }\n return { ok: false, candidates: candidates.length ? candidates : undefined };\n}\n\n// Make a reported path repo-relative (paths come from a session's cwd).\nfunction normalizePath(p: string): string {\n let s = p.trim();\n const root = repoRoot();\n if (s.startsWith(root)) s = s.slice(root.length);\n return s.replace(/^[./]+/, \"\").trim();\n}\n\n// ── Architecture components (curated) ───────────────────────────────────────\n// Deliberate upsert of REAL architectural components — the curated replacement for the old\n// per-file auto-derivation. Upserts by title (case-insensitive): existing nodes keep their\n// position; new ones land in their domain's column, stacked below any existing siblings.\n// New nodes are source=\"MANUAL\" so a future /beacon-init (which only replaces source=\"INIT\")\n// never clobbers them. This NEVER creates one-node-per-file — the caller passes real subsystems.\n\nconst ARCH_STATUSES = new Set([\"KEEP\", \"REBUILD\", \"REPLACE\", \"DROP\"]);\nconst archComponentSchema = z.object({\n title: z.string().trim().min(1),\n domain: z.string().trim().min(1),\n role: z.string().nullish(),\n plain: z.string().nullish(),\n status: z.string().nullish(),\n files: z.array(z.string()).optional(),\n depends: z.array(z.string()).optional(),\n});\nexport type ArchComponentInput = z.input<typeof archComponentSchema>;\n\nexport async function upsertArchitectureComponents(input: unknown[]): Promise<number> {\n const parsed = z.array(archComponentSchema).parse(input);\n // De-dup by title (last wins) so a repeated title in one call updates rather than duplicates.\n const byKey = new Map<string, z.infer<typeof archComponentSchema>>();\n for (const c of parsed) byKey.set(c.title.toLowerCase(), c);\n const components = Array.from(byKey.values());\n if (!components.length) return 0;\n\n const existing = await db.query.node.findMany({\n where: (t, { eq }) => eq(t.view, \"ARCHITECTURE\"),\n });\n const nodeByTitle = new Map(existing.map((n) => [n.title.toLowerCase(), n]));\n const idByTitle = new Map<string, string>(existing.map((n) => [n.title.toLowerCase(), n.id]));\n\n // Column x + next free y per domain, seeded from existing nodes so new components stack below\n // their domain siblings rather than overlapping them. New domains get a fresh column.\n const xByDomain = new Map<string, number>();\n const maxYByDomain = new Map<string, number>();\n for (const n of existing) {\n const d = (n.cluster ?? \"\").trim() || \"—\";\n if (!xByDomain.has(d)) xByDomain.set(d, n.x);\n maxYByDomain.set(d, Math.max(maxYByDomain.get(d) ?? -150, n.y));\n }\n let nextCol = existing.length ? Math.max(...existing.map((n) => n.x)) + 320 : 0;\n\n for (const c of components) {\n const key = c.title.toLowerCase();\n const status = c.status && ARCH_STATUSES.has(c.status) ? c.status : \"KEEP\";\n const prior = nodeByTitle.get(key);\n if (prior) {\n await db\n .update(node)\n .set({ cluster: c.domain, role: c.role ?? prior.role, plain: c.plain ?? prior.plain, status })\n .where(eq(node.id, prior.id));\n if (c.files?.length) {\n await db.delete(nodeFile).where(eq(nodeFile.nodeId, prior.id));\n await db\n .insert(nodeFile)\n .values(Array.from(new Set(c.files)).map((path) => ({ nodeId: prior.id, path })));\n }\n await reembedNode(prior.id);\n } else {\n const d = c.domain.trim() || \"—\";\n let x = xByDomain.get(d);\n if (x === undefined) {\n x = nextCol;\n nextCol += 320;\n xByDomain.set(d, x);\n }\n const y = (maxYByDomain.get(d) ?? -150) + 150;\n maxYByDomain.set(d, y);\n const [created] = await db\n .insert(node)\n .values({\n view: \"ARCHITECTURE\",\n source: \"MANUAL\",\n cluster: c.domain,\n title: c.title,\n role: c.role ?? null,\n plain: c.plain ?? null,\n status,\n x,\n y,\n })\n .returning();\n if (c.files?.length) {\n await db\n .insert(nodeFile)\n .values(Array.from(new Set(c.files)).map((path) => ({ nodeId: created.id, path })));\n }\n idByTitle.set(key, created.id);\n await reembedNode(created.id);\n }\n }\n\n // DEPENDS edges (mirror lib/init.ts persistArchitecture), de-duplicated.\n for (const c of components) {\n const fromId = idByTitle.get(c.title.toLowerCase());\n if (!fromId) continue;\n for (const dep of c.depends ?? []) {\n const toId = idByTitle.get(dep.trim().toLowerCase());\n if (!toId || toId === fromId) continue;\n const dup = await db.query.edge.findFirst({\n where: (t, { and, eq }) =>\n and(eq(t.fromId, fromId), eq(t.toId, toId), eq(t.kind, \"DEPENDS\")),\n });\n if (!dup)\n await db\n .insert(edge)\n .values({ fromId, toId, kind: \"DEPENDS\" })\n .catch(() => {});\n }\n }\n\n return components.length;\n}\n\n/** Mark a feature as shipped: replace its description with what the system actually does\n * (markdown), record the files it spans (kept on the FEATURE for the context bundle), and flip\n * its status to DONE in one call. Optionally upserts REAL architecture components when the\n * feature changed a subsystem. Subsumes the older touchFiles + finishFeature flow so the\n * terminal session only needs ONE tool call at the end. */\nexport async function describeFeature(input: {\n id?: string;\n title?: string;\n description: string;\n files?: string[];\n architecture?: unknown[];\n}): Promise<{ ok: boolean; id?: string; candidates?: Scored[] }> {\n const nodes = await db.query.node.findMany({ where: (t, { eq }) => eq(t.view, \"ROADMAP\") });\n let target = input.id ? nodes.find((n) => n.id === input.id) : undefined;\n if (!target && input.title) {\n const { best, candidates } = matchFeature(\n input.title,\n nodes.map((n) => ({ id: n.id, title: n.title })),\n );\n if (best) target = nodes.find((n) => n.id === best.id);\n else if (candidates.length) return { ok: false, candidates };\n }\n if (!target) return { ok: false };\n await db\n .update(node)\n .set({ plain: input.description, status: \"DONE\" })\n .where(eq(node.id, target.id));\n await reembedNode(target.id);\n await propagateStatusUp(target.id);\n\n // Record files (idempotent — only adds new ones).\n if (input.files?.length) {\n const paths = Array.from(new Set(input.files.map(normalizePath).filter(Boolean)));\n for (const path of paths) {\n await db\n .insert(nodeFile)\n .values({ nodeId: target.id, path })\n .onConflictDoNothing({ target: [nodeFile.nodeId, nodeFile.path] });\n }\n }\n\n // The feature is done — drop the session's \"current feature\" pointer if it\n // pointed here, so edits stop auto-attaching and the loop closes cleanly (and a\n // future Stop-style nudge couldn't fire on already-registered work).\n await db\n .update(appSetting)\n .set({ currentFeatureId: null })\n .where(eq(appSetting.currentFeatureId, target.id));\n\n // Deliberate architecture updates (only when the feature changed a real subsystem). This is\n // the curated replacement for the old per-file auto-derivation — never one-node-per-file.\n if (input.architecture?.length) {\n await upsertArchitectureComponents(input.architecture);\n }\n\n await bumpVersion();\n return { ok: true, id: target.id };\n}\n\n/** Record the files a feature spans (reported by a session as it works). */\nexport async function touchFiles(input: {\n id?: string;\n title?: string;\n files: string[];\n}): Promise<{ ok: boolean; id?: string; count?: number; candidates?: Scored[] }> {\n const files = Array.from(new Set((input.files ?? []).map(normalizePath).filter(Boolean)));\n const nodes = await db.query.node.findMany({ where: (t, { eq }) => eq(t.view, \"ROADMAP\") });\n\n let target = input.id ? nodes.find((n) => n.id === input.id) : undefined;\n if (!target && input.title) {\n const { best, candidates } = matchFeature(\n input.title,\n nodes.map((n) => ({ id: n.id, title: n.title })),\n );\n if (best) target = nodes.find((n) => n.id === best.id);\n else if (candidates.length) return { ok: false, candidates };\n }\n if (!target) return { ok: false };\n\n for (const path of files) {\n await db\n .insert(nodeFile)\n .values({ nodeId: target.id, path })\n .onConflictDoNothing({ target: [nodeFile.nodeId, nodeFile.path] });\n }\n await bumpVersion();\n const fileCount = (\n await db.select({ n: count() }).from(nodeFile).where(eq(nodeFile.nodeId, target.id))\n )[0].n;\n return { ok: true, id: target.id, count: fileCount };\n}\n\n// ── Bulk sub-task creation under a parent ───────────────────────────────────\n// Lets a terminal session add N sub-tasks under a feature in one call (used by the\n// `beacon_add_subtasks` MCP tool). Parent is resolved by id (preferred) or by\n// fuzzy-title match. Children inherit the parent's view + cluster; positioning lands\n// them in a row directly below the parent so they don't pile on top of existing nodes.\n\nexport interface AddSubtaskItem {\n title: string;\n plain?: string | null;\n}\n\nexport type AddSubtasksResult =\n | {\n ok: true;\n parent: { id: string; title: string };\n created: Array<{ id: string; title: string }>;\n }\n | { ok: false; reason: \"no_items\" }\n | { ok: false; reason: \"parent_not_found\" }\n | { ok: false; reason: \"ambiguous\"; candidates: Scored[] }\n | { ok: false; reason: \"duplicate\"; message: string };\n\nexport async function addSubtasksUnder(input: {\n parentId?: string | null;\n parentTitle?: string | null;\n items: AddSubtaskItem[];\n}): Promise<AddSubtasksResult> {\n const items = input.items.filter((i) => i.title.trim());\n if (!items.length) return { ok: false, reason: \"no_items\" };\n\n type ParentNode = Awaited<ReturnType<typeof db.query.node.findFirst>>;\n let parent: ParentNode = undefined;\n if (input.parentId) {\n parent = await db.query.node.findFirst({ where: (t, { eq }) => eq(t.id, input.parentId!) });\n } else if (input.parentTitle && input.parentTitle.trim()) {\n const candidates = await db.query.node.findMany({\n where: (t, { isNull }) => isNull(t.parentId),\n columns: { id: true, title: true, cluster: true, status: true },\n });\n const { best, candidates: alt } = matchFeature(\n input.parentTitle.trim(),\n candidates.map((c) => ({\n id: c.id,\n title: c.title,\n cluster: c.cluster,\n status: c.status,\n })),\n );\n if (best) parent = await db.query.node.findFirst({ where: (t, { eq }) => eq(t.id, best.id) });\n else if (alt.length) return { ok: false, reason: \"ambiguous\", candidates: alt };\n }\n if (!parent) return { ok: false, reason: \"parent_not_found\" };\n const parentNode = parent;\n\n // Don't recreate a sub-task that already lives under this parent — hard-block so the agent\n // doesn't pile up near-identical children when it re-runs.\n const siblings = await db.query.node.findMany({\n where: (t, { eq }) => eq(t.parentId, parentNode.id),\n columns: { id: true, title: true },\n });\n const dups = items.filter((it) => matchFeature(it.title.trim(), siblings).best);\n if (dups.length) {\n return {\n ok: false,\n reason: \"duplicate\",\n message:\n `⛔ These sub-tasks already exist under \"${parentNode.title}\": ` +\n `${dups.map((d) => `\"${d.title.trim()}\"`).join(\", \")}. ` +\n \"Drop the duplicates — only add genuinely new sub-tasks.\",\n };\n }\n\n // Obstacles = every node already on this view; children land in a row below the parent but get\n // nudged clear of anything already there (and of earlier children in this same batch).\n const obstacles = (\n await db.query.node.findMany({\n where: (t, { eq }) => eq(t.view, parentNode.view),\n columns: { x: true, y: true },\n })\n ).map((n) => ({ x: n.x, y: n.y }));\n const created: Array<{ id: string; title: string }> = [];\n for (let i = 0; i < items.length; i++) {\n const it = items[i];\n const pos = placeWithoutOverlap(obstacles, { x: parentNode.x + i * 240, y: parentNode.y + 200 });\n obstacles.push(pos);\n const n = await createNode({\n view: parentNode.view as \"ROADMAP\" | \"ARCHITECTURE\",\n title: it.title.trim(),\n plain: it.plain ?? null,\n cluster: parentNode.cluster ?? null,\n parentId: parentNode.id,\n x: pos.x,\n y: pos.y,\n });\n created.push({ id: n.id, title: n.title });\n }\n\n // A fresh PENDING child under a previously DONE parent should bubble the parent\n // back to PENDING. Walking up from any one child reaches every ancestor.\n if (created.length) await propagateStatusUp(created[0].id);\n await bumpVersion();\n return { ok: true, parent: { id: parentNode.id, title: parentNode.title }, created };\n}\n"],"names":["MIN_W","MIN_H","overlaps","a","b","Math","abs","x","y","placeWithoutOverlap","existing","desired","pos","i","some","e","LAYOUT_ALGO_VERSION","roadmapStructureSignature","nodeIds","edges","ns","sort","join","es","map","fromId","toId","length","sigPath","readRoadmapLayoutSig","raw","JSON","parse","sig","writeRoadmapLayoutSig","VIEW","enum","NODE_STATUS","EDGE_KIND","createNodeSchema","object","view","title","string","trim","min","max","cluster","nullish","role","plain","parentId","status","optional","priority","number","int","sourceRef","updateNodeSchema","positionSchema","createEdgeSchema","kind","label","sourceHandle","targetHandle","SEMANTIC_FIELDS","Set","createNode","input","data","defaultStatus","created","insert","values","returning","id","createEdge","Error","query","edge","findFirst","where","and","eq","eqf","updateNode","updated","update","set","semanticChanged","Object","keys","k","has","undefined","setNodeStatus","parsed","deprioritizeNode","cancelNode","deleteNode","deleted","delete","updateNodePosition","updateNodePositions","rows","Promise","all","r","updateDbTablePosition","updateEndpointPosition","setCurrent","currentFeatureId","listMap","nodes","node","findMany","t","orderBy","asc","createdAt","fronts","filter","n","f","tasks","workingOn","setStatus","propagateStatusUp","COMPLETE_STATUSES","ACTIVE_STATUSES","STICKY_PARENT_STATUSES","deriveParentStatus","childStatuses","every","s","nodeId","self","columns","parent","siblings","derived","healRoadmapLayout","source","ids","updates","p","get","round","push","startFeature","find","action","via","best","candidates","score","frontInput","front","frontErr","message","frontTitle","inheritedCluster","createErr","category","task","detail","finishFeature","ok","normalizePath","root","startsWith","slice","replace","ARCH_STATUSES","archComponentSchema","domain","files","array","depends","upsertArchitectureComponents","byKey","Map","c","toLowerCase","components","Array","from","nodeByTitle","idByTitle","xByDomain","maxYByDomain","d","nextCol","key","prior","path","dep","dup","catch","describeFeature","target","description","paths","Boolean","onConflictDoNothing","architecture","touchFiles","fileCount","select","count","addSubtasksUnder","items","reason","parentTitle","isNull","alt","parentNode","dups","it","obstacles"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ module.exports=[86213,e=>{"use strict";e.s(["placeWithoutOverlap",0,function(e,t){let i={x:t.x,y:t.y};for(let t=0;t<100&&e.some(e=>200>Math.abs(i.x-e.x)&&150>Math.abs(i.y-e.y));t++)i.y+=150;return i}])},2210,e=>{"use strict";var t=e.i(2157),i=e.i(50227),a=e.i(38752),n=e.i(94930);function r(){return(0,i.join)((0,a.dataDir)(),"roadmap-layout-sig.json")}e.s(["readRoadmapLayoutSig",0,function(){try{return JSON.parse((0,t.readFileSync)(r(),"utf8")).sig??null}catch{return null}},"roadmapStructureSignature",0,function(e,t){let i=[...e].sort().join(","),a=t.map(e=>`${e.fromId}>${e.toId}`).sort().join(",");return`force-2|${e.length}|${i}|${a}`},"writeRoadmapLayoutSig",0,function(e){(0,n.writeJsonAtomic)(r(),{sig:e})}])},46260,e=>e.a(async(t,i)=>{try{e.s(["addSubtasksUnder",()=>z,"describeFeature",()=>A,"finishFeature",()=>N,"listMap",()=>E,"propagateStatusUp",()=>S,"startFeature",()=>D,"touchFiles",()=>P]);var a=e.i(69719),n=e.i(60338),r=e.i(75225),d=e.i(91426),l=e.i(34700),o=e.i(6659),s=e.i(58708),u=e.i(91153),c=e.i(32665),m=e.i(86213),p=e.i(22609),f=e.i(2210),w=e.i(85336),h=e.i(38752),y=e.i(53828),g=t([d,o,w,y]);async function b(e){await (0,y.setAppSettings)({currentFeatureId:e})}async function E(){let e=await d.db.query.node.findMany({where:(e,{eq:t})=>t(e.view,"ROADMAP"),orderBy:(e,{asc:t})=>t(e.createdAt)});return{fronts:e.filter(e=>!e.parentId).map(t=>({id:t.id,title:t.title,status:t.status,tasks:e.filter(e=>e.parentId===t.id).map(e=>({id:e.id,title:e.title,status:e.status,workingOn:"IN_PROGRESS"===e.status}))}))}}async function I(e,t){await d.db.update(l.node).set({status:t}).where((0,r.eq)(l.node.id,e)),await S(e),await (0,o.bumpVersion)()}[d,o,w,y]=g.then?(await g)():g;let O=new Set(["DONE","CANCELLED","DEPRIORITIZED"]),M=new Set(["IN_PROGRESS","BLOCKED"]),F=new Set(["CANCELLED","DEPRIORITIZED"]);async function S(e){var t;let i=await d.db.query.node.findFirst({where:(t,{eq:i})=>i(t.id,e),columns:{parentId:!0,view:!0}});if(!i?.parentId||"ROADMAP"!==i.view)return;let a=await d.db.query.node.findFirst({where:(e,{eq:t})=>t(e.id,i.parentId),columns:{id:!0,status:!0,view:!0}});if(!a||"ROADMAP"!==a.view||F.has(a.status))return;let n=(t=(await d.db.query.node.findMany({where:(e,{eq:t})=>t(e.parentId,a.id),columns:{status:!0}})).map(e=>e.status)).length?t.every(e=>O.has(e))?"DONE":t.some(e=>M.has(e))?"IN_PROGRESS":"PENDING":"PENDING";a.status!==n&&(await d.db.update(l.node).set({status:n}).where((0,r.eq)(l.node.id,a.id)),await S(a.id))}async function R(){let e=(await d.db.query.node.findMany({where:(e,{eq:t})=>t(e.view,"ROADMAP"),columns:{id:!0,parentId:!0,source:!0,x:!0,y:!0}})).filter(e=>"DRAFT"!==e.source);if(e.length<2)return;let t=e.map(e=>e.id),i=await d.db.query.edge.findMany({where:(e,{and:i,eq:a})=>i(a(e.kind,"DEPENDS"),(0,r.inArray)(e.fromId,t),(0,r.inArray)(e.toId,t)),columns:{fromId:!0,toId:!0}}),a=(0,f.roadmapStructureSignature)(t,i);if((0,f.readRoadmapLayoutSig)()===a)return;let n=(0,p.forceLayoutRoadmap)(e.map(e=>({id:e.id,parentId:e.parentId})),i),o=[];for(let t of e){let e=n.get(t.id);e&&(Math.round(e.x)!==Math.round(t.x)||Math.round(e.y)!==Math.round(t.y))&&o.push(d.db.update(l.node).set({x:e.x,y:e.y}).where((0,r.eq)(l.node.id,t.id)))}await Promise.all(o),(0,f.writeRoadmapLayoutSig)(a)}async function D(e){let t=e.title.trim();if(!t)throw Error("title required");let i=await d.db.query.node.findMany({where:(e,{eq:t})=>t(e.view,"ROADMAP")});if(e.id){let t=i.find(t=>t.id===e.id);if(t)return await I(t.id,"IN_PROGRESS"),await b(t.id),{action:"flagged",id:t.id,title:t.title,via:"id"}}let{best:a,candidates:n}=(0,u.matchFeature)(t,i.map(e=>({id:e.id,title:e.title})));if(a)return await I(a.id,"IN_PROGRESS"),await b(a.id),{action:"flagged",id:a.id,title:a.title,via:"match",score:a.score};if(n.length)return{action:"ambiguous",candidates:n};let r=i.filter(e=>!e.parentId),p=e.front?.trim()||"",f=p?(0,c.validateFront)(p,r.map(e=>({id:e.id,title:e.title}))):null;if(f)return{action:"rejected",message:f};let w=null,h=null,y=null;if(p){let e=(0,u.matchFeature)(p,r.map(e=>({id:e.id,title:e.title}))).best;w=e.id,h=e.title,y=i.find(t=>t.id===e.id)?.cluster??null}let g=(e.cluster?.trim()||y)??null,E=(0,c.validateFeatureCreation)({title:t,category:g,existing:i.map(e=>({id:e.id,title:e.title,cluster:e.cluster,status:e.status}))});if(E)return{action:"rejected",message:E};let D=w?i.filter(e=>e.parentId===w).length:r.length,N=(0,m.placeWithoutOverlap)(i.map(e=>({x:e.x,y:e.y})),{x:w?r.find(e=>e.id===w)?.x??0:300*D,y:w?160+110*D:0}),[x]=await d.db.insert(l.node).values({view:"ROADMAP",title:t,plain:e.detail??null,cluster:g,status:"IN_PROGRESS",source:"SESSION",parentId:w,x:N.x,y:N.y}).returning();return await (0,s.reembedNode)(x.id),await S(x.id),await R(),await (0,o.bumpVersion)(),await b(x.id),{action:"created",id:x.id,title:t,front:h}}async function N(e){let t=await d.db.query.node.findMany({where:(e,{eq:t})=>t(e.view,"ROADMAP")});if(e.id){let i=t.find(t=>t.id===e.id);if(i)return await I(i.id,"DONE"),{ok:!0,id:i.id}}if(!e.title)return{ok:!1};let{best:i,candidates:a}=(0,u.matchFeature)(e.title,t.map(e=>({id:e.id,title:e.title})));return i?(await I(i.id,"DONE"),{ok:!0,id:i.id}):{ok:!1,candidates:a.length?a:void 0}}function x(e){let t=e.trim(),i=(0,h.repoRoot)();return t.startsWith(i)&&(t=t.slice(i.length)),t.replace(/^[./]+/,"").trim()}let q=new Set(["KEEP","REBUILD","REPLACE","DROP"]),C=a.z.object({title:a.z.string().trim().min(1),domain:a.z.string().trim().min(1),role:a.z.string().nullish(),plain:a.z.string().nullish(),status:a.z.string().nullish(),files:a.z.array(a.z.string()).optional(),depends:a.z.array(a.z.string()).optional()});async function v(e){let t=a.z.array(C).parse(e),i=new Map;for(let e of t)i.set(e.title.toLowerCase(),e);let n=Array.from(i.values());if(!n.length)return 0;let o=await d.db.query.node.findMany({where:(e,{eq:t})=>t(e.view,"ARCHITECTURE")}),u=new Map(o.map(e=>[e.title.toLowerCase(),e])),c=new Map(o.map(e=>[e.title.toLowerCase(),e.id])),m=new Map,p=new Map;for(let e of o){let t=(e.cluster??"").trim()||"—";m.has(t)||m.set(t,e.x),p.set(t,Math.max(p.get(t)??-150,e.y))}let f=o.length?Math.max(...o.map(e=>e.x))+320:0;for(let e of n){let t=e.title.toLowerCase(),i=e.status&&q.has(e.status)?e.status:"KEEP",a=u.get(t);if(a)await d.db.update(l.node).set({cluster:e.domain,role:e.role??a.role,plain:e.plain??a.plain,status:i}).where((0,r.eq)(l.node.id,a.id)),e.files?.length&&(await d.db.delete(l.nodeFile).where((0,r.eq)(l.nodeFile.nodeId,a.id)),await d.db.insert(l.nodeFile).values(Array.from(new Set(e.files)).map(e=>({nodeId:a.id,path:e})))),await (0,s.reembedNode)(a.id);else{let a=e.domain.trim()||"—",n=m.get(a);void 0===n&&(n=f,f+=320,m.set(a,n));let r=(p.get(a)??-150)+150;p.set(a,r);let[o]=await d.db.insert(l.node).values({view:"ARCHITECTURE",source:"MANUAL",cluster:e.domain,title:e.title,role:e.role??null,plain:e.plain??null,status:i,x:n,y:r}).returning();e.files?.length&&await d.db.insert(l.nodeFile).values(Array.from(new Set(e.files)).map(e=>({nodeId:o.id,path:e}))),c.set(t,o.id),await (0,s.reembedNode)(o.id)}}for(let e of n){let t=c.get(e.title.toLowerCase());if(t)for(let i of e.depends??[]){let e=c.get(i.trim().toLowerCase());e&&e!==t&&(await d.db.query.edge.findFirst({where:(i,{and:a,eq:n})=>a(n(i.fromId,t),n(i.toId,e),n(i.kind,"DEPENDS"))})||await d.db.insert(l.edge).values({fromId:t,toId:e,kind:"DEPENDS"}).catch(()=>{}))}}return n.length}async function A(e){let t=await d.db.query.node.findMany({where:(e,{eq:t})=>t(e.view,"ROADMAP")}),i=e.id?t.find(t=>t.id===e.id):void 0;if(!i&&e.title){let{best:a,candidates:n}=(0,u.matchFeature)(e.title,t.map(e=>({id:e.id,title:e.title})));if(a)i=t.find(e=>e.id===a.id);else if(n.length)return{ok:!1,candidates:n}}if(!i)return{ok:!1};if(await d.db.update(l.node).set({plain:e.description,status:"DONE"}).where((0,r.eq)(l.node.id,i.id)),await (0,s.reembedNode)(i.id),await S(i.id),e.files?.length)for(let t of Array.from(new Set(e.files.map(x).filter(Boolean))))await d.db.insert(l.nodeFile).values({nodeId:i.id,path:t}).onConflictDoNothing({target:[l.nodeFile.nodeId,l.nodeFile.path]});return await d.db.update(l.appSetting).set({currentFeatureId:null}).where((0,r.eq)(l.appSetting.currentFeatureId,i.id)),e.architecture?.length&&await v(e.architecture),await (0,o.bumpVersion)(),{ok:!0,id:i.id}}async function P(e){let t=Array.from(new Set((e.files??[]).map(x).filter(Boolean))),i=await d.db.query.node.findMany({where:(e,{eq:t})=>t(e.view,"ROADMAP")}),a=e.id?i.find(t=>t.id===e.id):void 0;if(!a&&e.title){let{best:t,candidates:n}=(0,u.matchFeature)(e.title,i.map(e=>({id:e.id,title:e.title})));if(t)a=i.find(e=>e.id===t.id);else if(n.length)return{ok:!1,candidates:n}}if(!a)return{ok:!1};for(let e of t)await d.db.insert(l.nodeFile).values({nodeId:a.id,path:e}).onConflictDoNothing({target:[l.nodeFile.nodeId,l.nodeFile.path]});await (0,o.bumpVersion)();let s=(await d.db.select({n:(0,n.count)()}).from(l.nodeFile).where((0,r.eq)(l.nodeFile.nodeId,a.id)))[0].n;return{ok:!0,id:a.id,count:s}}async function z(e){let t,i=e.items.filter(e=>e.title.trim());if(!i.length)return{ok:!1,reason:"no_items"};if(e.parentId)t=await d.db.query.node.findFirst({where:(t,{eq:i})=>i(t.id,e.parentId)});else if(e.parentTitle&&e.parentTitle.trim()){let i=await d.db.query.node.findMany({where:(e,{isNull:t})=>t(e.parentId),columns:{id:!0,title:!0,cluster:!0,status:!0}}),{best:a,candidates:n}=(0,u.matchFeature)(e.parentTitle.trim(),i.map(e=>({id:e.id,title:e.title,cluster:e.cluster,status:e.status})));if(a)t=await d.db.query.node.findFirst({where:(e,{eq:t})=>t(e.id,a.id)});else if(n.length)return{ok:!1,reason:"ambiguous",candidates:n}}if(!t)return{ok:!1,reason:"parent_not_found"};let a=t,n=await d.db.query.node.findMany({where:(e,{eq:t})=>t(e.parentId,a.id),columns:{id:!0,title:!0}}),r=i.filter(e=>(0,u.matchFeature)(e.title.trim(),n).best);if(r.length)return{ok:!1,reason:"duplicate",message:`⛔ These sub-tasks already exist under "${a.title}": ${r.map(e=>`"${e.title.trim()}"`).join(", ")}. Drop the duplicates — only add genuinely new sub-tasks.`};let l=(await d.db.query.node.findMany({where:(e,{eq:t})=>t(e.view,a.view),columns:{x:!0,y:!0}})).map(e=>({x:e.x,y:e.y})),s=[];for(let e=0;e<i.length;e++){let t=i[e],n=(0,m.placeWithoutOverlap)(l,{x:a.x+240*e,y:a.y+200});l.push(n);let r=await (0,w.createNode)({view:a.view,title:t.title.trim(),plain:t.plain??null,cluster:a.cluster??null,parentId:a.id,x:n.x,y:n.y});s.push({id:r.id,title:r.title})}return s.length&&await S(s[0].id),await (0,o.bumpVersion)(),{ok:!0,parent:{id:a.id,title:a.title},created:s}}i()}catch(e){i(e)}},!1),18383,e=>{"use strict";var t=e.i(69719);let i=t.z.enum(["ROADMAP","ARCHITECTURE"]),a=t.z.enum(["PENDING","IN_PROGRESS","DONE","BLOCKED","CANCELLED","DEPRIORITIZED","KEEP","REBUILD","REPLACE","DROP"]);t.z.enum(["DEPENDS","CONTAINS","RELATES","REPLACES"]);let n=t.z.object({view:i,title:t.z.string().trim().min(1).max(200),cluster:t.z.string().trim().max(64).nullish(),role:t.z.string().trim().max(500).nullish(),plain:t.z.string().trim().max(2e3).nullish(),parentId:t.z.string().nullish(),status:a.optional(),priority:t.z.number().int().min(0).max(3).optional(),x:t.z.number().optional(),y:t.z.number().optional(),sourceRef:t.z.string().trim().max(300).nullish()}),r=t.z.object({title:t.z.string().trim().min(1).max(200).optional(),role:t.z.string().trim().max(500).nullish(),plain:t.z.string().trim().max(2e3).nullish(),cluster:t.z.string().trim().max(64).nullish(),status:a.optional(),priority:t.z.number().int().min(0).max(3).optional(),sourceRef:t.z.string().trim().max(300).nullish()}),d=t.z.object({x:t.z.number(),y:t.z.number()}),l=t.z.object({fromId:t.z.string().min(1),toId:t.z.string().min(1),kind:t.z.enum(["DEPENDS","RELATES","REPLACES"]).optional(),label:t.z.string().trim().max(80).nullish(),sourceHandle:t.z.string().trim().max(16).nullish(),targetHandle:t.z.string().trim().max(16).nullish()});e.s(["createEdgeSchema",0,l,"createNodeSchema",0,n,"positionSchema",0,d,"updateNodeSchema",0,r])},85336,e=>e.a(async(t,i)=>{try{e.s(["createEdge",()=>c,"createNode",()=>u,"deleteNode",()=>p,"updateDbTablePosition",()=>h,"updateEndpointPosition",()=>y,"updateNode",()=>m,"updateNodePosition",()=>f,"updateNodePositions",()=>w]);var a=e.i(75225),n=e.i(91426),r=e.i(34700),d=e.i(58708),l=e.i(46260),o=e.i(18383),s=t([n,l]);[n,l]=s.then?(await s)():s;let g=new Set(["title","role","plain","cluster"]);async function u(e){let t=o.createNodeSchema.parse(e),i="ARCHITECTURE"===t.view?"REBUILD":"PENDING",[a]=await n.db.insert(r.node).values({view:t.view,title:t.title,cluster:t.cluster??null,role:t.role??null,plain:t.plain??null,parentId:t.parentId??null,status:t.status??i,priority:t.priority??2,x:t.x??0,y:t.y??0,sourceRef:t.sourceRef??null}).returning();return await (0,d.reembedNode)(a.id),a}async function c(e){let t=o.createEdgeSchema.parse(e);if(t.fromId===t.toId)throw Error("Self-edge not allowed");let i=t.kind??"DEPENDS",a=await n.db.query.edge.findFirst({where:(e,{and:a,eq:n})=>a(n(e.fromId,t.fromId),n(e.toId,t.toId),n(e.kind,i))});if(a)return a;let[d]=await n.db.insert(r.edge).values({fromId:t.fromId,toId:t.toId,kind:i,label:t.label??null,sourceHandle:t.sourceHandle??null,targetHandle:t.targetHandle??null}).returning();return d}async function m(e,t){let i=o.updateNodeSchema.parse(t),[s]=await n.db.update(r.node).set(i).where((0,a.eq)(r.node.id,e)).returning();return Object.keys(i).some(e=>g.has(e))&&await (0,d.reembedNode)(e),void 0!==i.status&&await (0,l.propagateStatusUp)(e),s}async function p(e){let[t]=await n.db.delete(r.node).where((0,a.eq)(r.node.id,e)).returning();return t}async function f(e,t,i){let d=o.positionSchema.parse({x:t,y:i}),[l]=await n.db.update(r.node).set(d).where((0,a.eq)(r.node.id,e)).returning();return l}async function w(e){return await Promise.all(e.map(e=>{let t=o.positionSchema.parse({x:e.x,y:e.y});return n.db.update(r.node).set(t).where((0,a.eq)(r.node.id,e.id))})),e.length}async function h(e,t,i){let d=o.positionSchema.parse({x:t,y:i}),[l]=await n.db.update(r.dbTable).set(d).where((0,a.eq)(r.dbTable.id,e)).returning();return l}async function y(e,t,i){let d=o.positionSchema.parse({x:t,y:i}),[l]=await n.db.update(r.endpoint).set(d).where((0,a.eq)(r.endpoint.id,e)).returning();return l}i()}catch(e){i(e)}},!1)];
2
+
3
+ //# sourceMappingURL=lib_0rad2y6._.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../lib/node-placement.ts","../../../lib/roadmap-layout-state.ts","../../../lib/map-ops.ts","../../../lib/schemas.ts","../../../lib/mutations.ts"],"sourcesContent":["// Collision-free placement for newly-created roadmap nodes. All the creation paths used to drop\n// nodes at fixed offsets (parent.x + i*240, i*300, …) with no awareness of what's already on the\n// board, so a new feature/sub-task could land on top of an existing card. This nudges a new node\n// straight DOWN until it's clear, PRESERVING every existing position (no global re-layout that\n// would undo the user's manual drags). Pure — unit-tested, shared by lib/map-ops + lib/feature-design.\n\nexport interface Pos {\n x: number;\n y: number;\n}\n\n// Minimum separation (px) below which two cards count as overlapping. Kept SMALLER than the grid\n// steps the layouts use (≥240 horizontal) so a normal row isn't flagged — only a card that\n// genuinely landed on/near another one.\nconst MIN_W = 200;\nconst MIN_H = 150;\n\nfunction overlaps(a: Pos, b: Pos): boolean {\n return Math.abs(a.x - b.x) < MIN_W && Math.abs(a.y - b.y) < MIN_H;\n}\n\n/** Place a new node at `desired`, nudging it down (preserving x) until it clears every existing\n * node. Existing positions are never moved. */\nexport function placeWithoutOverlap(existing: Pos[], desired: Pos): Pos {\n const pos = { x: desired.x, y: desired.y };\n for (let i = 0; i < 100 && existing.some((e) => overlaps(pos, e)); i++) {\n pos.y += MIN_H;\n }\n return pos;\n}\n","import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { dataDir } from \"@/lib/project\";\nimport { writeJsonAtomic } from \"@/lib/atomic-write\";\n\n// Per-workspace marker recording the STRUCTURE the roadmap was last auto-laid-out for. The\n// organic force layout only re-runs when this signature changes (a feature/edge added or removed),\n// so a plain page refresh, a manual card drag, or a Group-by arrangement is NOT clobbered — only a\n// genuine structural change re-tidies the board. Stored as one tiny JSON file in the workspace\n// data dir (same pattern as touched-files / draft store), so no DB schema change is needed.\n\n// Bump when the layout ALGORITHM changes (e.g. force params) so every board re-lays-out once even\n// though its node/edge set is unchanged.\nconst LAYOUT_ALGO_VERSION = \"force-2\";\n\n// Pure: a stable signature of the roadmap's structure (node set + dependency edges). Sorted so it\n// is order-independent; positions/status/titles are deliberately excluded — only the graph shape\n// matters for layout. Prefixed with the algo version so a layout change invalidates old sigs.\nexport function roadmapStructureSignature(\n nodeIds: string[],\n edges: { fromId: string; toId: string }[],\n): string {\n const ns = [...nodeIds].sort().join(\",\");\n const es = edges.map((e) => `${e.fromId}>${e.toId}`).sort().join(\",\");\n return `${LAYOUT_ALGO_VERSION}|${nodeIds.length}|${ns}|${es}`;\n}\n\nfunction sigPath(): string {\n return join(dataDir(), \"roadmap-layout-sig.json\");\n}\n\nexport function readRoadmapLayoutSig(): string | null {\n try {\n const raw = JSON.parse(readFileSync(sigPath(), \"utf8\")) as { sig?: string };\n return raw.sig ?? null;\n } catch {\n return null;\n }\n}\n\nexport function writeRoadmapLayoutSig(sig: string): void {\n writeJsonAtomic(sigPath(), { sig });\n}\n","import { z } from \"zod\";\nimport { and, count, eq, inArray } from \"drizzle-orm\";\nimport { db } from \"@/lib/db-drizzle\";\nimport { node, nodeFile, edge, appSetting } from \"@/lib/drizzle/schema\";\nimport { bumpVersion } from \"@/lib/ingest\";\nimport { reembedNode } from \"@/lib/embeddings\";\nimport { matchFeature, type Scored } from \"@/lib/match\";\nimport { validateFeatureCreation, validateFront } from \"@/lib/feature-rules\";\nimport { placeWithoutOverlap } from \"@/lib/node-placement\";\nimport { forceLayoutRoadmap } from \"@/lib/roadmap-force-layout\";\nimport {\n readRoadmapLayoutSig,\n roadmapStructureSignature,\n writeRoadmapLayoutSig,\n} from \"@/lib/roadmap-layout-state\";\nimport { createNode } from \"@/lib/mutations\";\nimport { repoRoot } from \"@/lib/project\";\nimport { setAppSettings } from \"@/lib/settings\";\n\nasync function setCurrent(id: string) {\n await setAppSettings({ currentFeatureId: id });\n}\n\n// Map write operations used by the HTTP API + the MCP server. Lets a Claude Code\n// session see the roadmap and register what it's working on: flag an existing\n// feature as \"being worked on\", or add a new one under the right front (or a new front).\n\nexport interface MapView {\n fronts: Array<{\n id: string;\n title: string;\n status: string;\n tasks: Array<{ id: string; title: string; status: string; workingOn: boolean }>;\n }>;\n}\n\nexport async function listMap(): Promise<MapView> {\n const nodes = await db.query.node.findMany({\n where: (t, { eq }) => eq(t.view, \"ROADMAP\"),\n orderBy: (t, { asc }) => asc(t.createdAt),\n });\n const fronts = nodes.filter((n) => !n.parentId);\n return {\n fronts: fronts.map((f) => ({\n id: f.id,\n title: f.title,\n status: f.status,\n tasks: nodes\n .filter((n) => n.parentId === f.id)\n .map((t) => ({\n id: t.id,\n title: t.title,\n status: t.status,\n workingOn: t.status === \"IN_PROGRESS\",\n })),\n })),\n };\n}\n\nexport type StartResult =\n | { action: \"flagged\"; id: string; title: string; via: \"id\" | \"match\"; score?: number }\n | { action: \"created\"; id: string; title: string; front: string | null }\n | { action: \"ambiguous\"; candidates: Scored[] }\n | { action: \"rejected\"; message: string };\n\nasync function setStatus(id: string, status: string) {\n await db.update(node).set({ status }).where(eq(node.id, id));\n await propagateStatusUp(id);\n await bumpVersion();\n}\n\n// ── Parent-derived status propagation ───────────────────────────────────────\n// When a roadmap child's status changes, walk up the parent chain so each\n// ancestor reflects its children's reality. Status doesn't auto-update from\n// progress because the canvas needs the explicit field to colour/sort by.\n//\n// Status classes for the derivation:\n// complete — DONE, CANCELLED, DEPRIORITIZED (off the board, count as \"settled\")\n// active — IN_PROGRESS, BLOCKED\n// pending — PENDING (default)\n//\n// Rules (only applied to ROADMAP nodes):\n// • all children complete → parent DONE\n// • any child active → parent IN_PROGRESS\n// • else → parent PENDING\n//\n// Sticky parent states (CANCELLED, DEPRIORITIZED) are user decisions and win —\n// nothing children do will override them. Unmark them to re-enable derivation.\n\nconst COMPLETE_STATUSES = new Set([\"DONE\", \"CANCELLED\", \"DEPRIORITIZED\"]);\nconst ACTIVE_STATUSES = new Set([\"IN_PROGRESS\", \"BLOCKED\"]);\nconst STICKY_PARENT_STATUSES = new Set([\"CANCELLED\", \"DEPRIORITIZED\"]);\n\nfunction deriveParentStatus(childStatuses: string[]): string {\n if (!childStatuses.length) return \"PENDING\";\n if (childStatuses.every((s) => COMPLETE_STATUSES.has(s))) return \"DONE\";\n if (childStatuses.some((s) => ACTIVE_STATUSES.has(s))) return \"IN_PROGRESS\";\n return \"PENDING\";\n}\n\n/**\n * Recompute the parent of `nodeId` (and onwards up) from its children's\n * statuses. No-op for top-level nodes, ARCHITECTURE-view nodes, or when the\n * parent has a sticky user-set status. Safe to call after any roadmap-node\n * status write; idempotent.\n */\nexport async function propagateStatusUp(nodeId: string): Promise<void> {\n const self = await db.query.node.findFirst({\n where: (t, { eq }) => eq(t.id, nodeId),\n columns: { parentId: true, view: true },\n });\n if (!self?.parentId || self.view !== \"ROADMAP\") return;\n\n const parent = await db.query.node.findFirst({\n where: (t, { eq }) => eq(t.id, self.parentId!),\n columns: { id: true, status: true, view: true },\n });\n if (!parent || parent.view !== \"ROADMAP\") return;\n if (STICKY_PARENT_STATUSES.has(parent.status)) return;\n\n const siblings = await db.query.node.findMany({\n where: (t, { eq }) => eq(t.parentId, parent.id),\n columns: { status: true },\n });\n const derived = deriveParentStatus(siblings.map((s) => s.status));\n if (parent.status === derived) return;\n\n await db.update(node).set({ status: derived }).where(eq(node.id, parent.id));\n await propagateStatusUp(parent.id);\n}\n\n/**\n * A session starts working on a feature. Resolution order:\n * 1. explicit `id` (from beacon_map) → flag it (100% reliable)\n * 2. confident, unambiguous fuzzy match → flag it\n * 3. plausible-but-ambiguous matches → return candidates to disambiguate\n * 4. no match → create it under `front` (creating that front if needed)\n */\n// Lay the committed roadmap board out as an ORGANIC 2D graph (d3-force): independent features\n// spread across the width, dependency-linked features pull into tight clusters with short edges.\n// Called on every /map load and after a feature is created, so an existing board self-heals.\n//\n// Re-runs ONLY when the graph STRUCTURE changes (a feature/edge added or removed), tracked by a\n// per-workspace signature file. A plain refresh, a manual card drag, or a Group-by arrangement\n// leaves the signature untouched and is therefore preserved — the layout never fights the user.\n// DRAFT nodes are excluded (a plan under review owns its own layout in lib/feature-design). Does\n// NOT bump the sync version.\nexport async function healRoadmapLayout(): Promise<void> {\n const all = await db.query.node.findMany({\n where: (t, { eq }) => eq(t.view, \"ROADMAP\"),\n columns: { id: true, parentId: true, source: true, x: true, y: true },\n });\n const nodes = all.filter((n) => n.source !== \"DRAFT\");\n if (nodes.length < 2) return;\n const ids = nodes.map((n) => n.id);\n const edges = await db.query.edge.findMany({\n where: (t, { and, eq }) =>\n and(eq(t.kind, \"DEPENDS\"), inArray(t.fromId, ids), inArray(t.toId, ids)),\n columns: { fromId: true, toId: true },\n });\n\n const sig = roadmapStructureSignature(ids, edges);\n if (readRoadmapLayoutSig() === sig) return; // structure unchanged → keep the current arrangement\n\n const pos = forceLayoutRoadmap(\n nodes.map((n) => ({ id: n.id, parentId: n.parentId })),\n edges,\n );\n const updates: Promise<unknown>[] = [];\n for (const n of nodes) {\n const p = pos.get(n.id);\n if (!p) continue;\n if (Math.round(p.x) === Math.round(n.x) && Math.round(p.y) === Math.round(n.y)) continue;\n updates.push(db.update(node).set({ x: p.x, y: p.y }).where(eq(node.id, n.id)));\n }\n await Promise.all(updates);\n writeRoadmapLayoutSig(sig);\n}\n\nexport async function startFeature(input: {\n title: string;\n id?: string | null;\n front?: string | null;\n detail?: string | null;\n cluster?: string | null;\n}): Promise<StartResult> {\n const title = input.title.trim();\n if (!title) throw new Error(\"title required\");\n\n const nodes = await db.query.node.findMany({ where: (t, { eq }) => eq(t.view, \"ROADMAP\") });\n\n if (input.id) {\n const n = nodes.find((x) => x.id === input.id);\n if (n) {\n await setStatus(n.id, \"IN_PROGRESS\");\n await setCurrent(n.id);\n return { action: \"flagged\", id: n.id, title: n.title, via: \"id\" };\n }\n }\n\n const { best, candidates } = matchFeature(\n title,\n nodes.map((n) => ({ id: n.id, title: n.title })),\n );\n if (best) {\n await setStatus(best.id, \"IN_PROGRESS\");\n await setCurrent(best.id);\n return { action: \"flagged\", id: best.id, title: best.title, via: \"match\", score: best.score };\n }\n if (candidates.length) return { action: \"ambiguous\", candidates };\n\n // No match → create. Guard the loose path the same way propose_plan is guarded: a `front`\n // must reference a REAL existing parent feature (not a domain tag — that footgun is how a bogus\n // \"CRAWL\" front got created), and a brand-new top-level feature must carry a category. A task\n // nested under a front inherits the front's category. Shares lib/feature-rules with the plan path.\n const fronts = nodes.filter((n) => !n.parentId);\n const frontInput = input.front?.trim() || \"\";\n\n const frontErr = frontInput\n ? validateFront(frontInput, fronts.map((n) => ({ id: n.id, title: n.title })))\n : null;\n if (frontErr) return { action: \"rejected\", message: frontErr };\n\n let parentId: string | null = null;\n let frontTitle: string | null = null;\n let inheritedCluster: string | null = null;\n if (frontInput) {\n const f = matchFeature(frontInput, fronts.map((n) => ({ id: n.id, title: n.title }))).best!;\n parentId = f.id;\n frontTitle = f.title;\n inheritedCluster = nodes.find((n) => n.id === f.id)?.cluster ?? null;\n }\n\n const cluster = (input.cluster?.trim() || inheritedCluster) ?? null;\n const createErr = validateFeatureCreation({\n title,\n category: cluster,\n existing: nodes.map((n) => ({ id: n.id, title: n.title, cluster: n.cluster, status: n.status })),\n });\n if (createErr) return { action: \"rejected\", message: createErr };\n\n const siblings = parentId\n ? nodes.filter((n) => n.parentId === parentId).length\n : fronts.length;\n const pos = placeWithoutOverlap(\n nodes.map((n) => ({ x: n.x, y: n.y })),\n {\n x: parentId ? (fronts.find((f) => f.id === parentId)?.x ?? 0) : siblings * 300,\n y: parentId ? 160 + siblings * 110 : 0,\n },\n );\n const [task] = await db\n .insert(node)\n .values({\n view: \"ROADMAP\",\n title,\n plain: input.detail ?? null,\n cluster,\n status: \"IN_PROGRESS\",\n source: \"SESSION\",\n parentId,\n x: pos.x,\n y: pos.y,\n })\n .returning();\n await reembedNode(task.id);\n await propagateStatusUp(task.id);\n // A new feature changes the graph structure → re-tidy the board organically so the new card is\n // placed sensibly instead of in a blind row.\n await healRoadmapLayout();\n await bumpVersion();\n await setCurrent(task.id);\n return { action: \"created\", id: task.id, title, front: frontTitle };\n}\n\nexport async function finishFeature(input: {\n title?: string;\n id?: string;\n}): Promise<{ ok: boolean; id?: string; candidates?: Scored[] }> {\n const nodes = await db.query.node.findMany({ where: (t, { eq }) => eq(t.view, \"ROADMAP\") });\n\n if (input.id) {\n const n = nodes.find((x) => x.id === input.id);\n if (n) {\n await setStatus(n.id, \"DONE\");\n return { ok: true, id: n.id };\n }\n }\n if (!input.title) return { ok: false };\n\n const { best, candidates } = matchFeature(\n input.title,\n nodes.map((n) => ({ id: n.id, title: n.title })),\n );\n if (best) {\n await setStatus(best.id, \"DONE\");\n return { ok: true, id: best.id };\n }\n return { ok: false, candidates: candidates.length ? candidates : undefined };\n}\n\n// Make a reported path repo-relative (paths come from a session's cwd).\nfunction normalizePath(p: string): string {\n let s = p.trim();\n const root = repoRoot();\n if (s.startsWith(root)) s = s.slice(root.length);\n return s.replace(/^[./]+/, \"\").trim();\n}\n\n// ── Architecture components (curated) ───────────────────────────────────────\n// Deliberate upsert of REAL architectural components — the curated replacement for the old\n// per-file auto-derivation. Upserts by title (case-insensitive): existing nodes keep their\n// position; new ones land in their domain's column, stacked below any existing siblings.\n// New nodes are source=\"MANUAL\" so a future /beacon-init (which only replaces source=\"INIT\")\n// never clobbers them. This NEVER creates one-node-per-file — the caller passes real subsystems.\n\nconst ARCH_STATUSES = new Set([\"KEEP\", \"REBUILD\", \"REPLACE\", \"DROP\"]);\nconst archComponentSchema = z.object({\n title: z.string().trim().min(1),\n domain: z.string().trim().min(1),\n role: z.string().nullish(),\n plain: z.string().nullish(),\n status: z.string().nullish(),\n files: z.array(z.string()).optional(),\n depends: z.array(z.string()).optional(),\n});\nexport type ArchComponentInput = z.input<typeof archComponentSchema>;\n\nexport async function upsertArchitectureComponents(input: unknown[]): Promise<number> {\n const parsed = z.array(archComponentSchema).parse(input);\n // De-dup by title (last wins) so a repeated title in one call updates rather than duplicates.\n const byKey = new Map<string, z.infer<typeof archComponentSchema>>();\n for (const c of parsed) byKey.set(c.title.toLowerCase(), c);\n const components = Array.from(byKey.values());\n if (!components.length) return 0;\n\n const existing = await db.query.node.findMany({\n where: (t, { eq }) => eq(t.view, \"ARCHITECTURE\"),\n });\n const nodeByTitle = new Map(existing.map((n) => [n.title.toLowerCase(), n]));\n const idByTitle = new Map<string, string>(existing.map((n) => [n.title.toLowerCase(), n.id]));\n\n // Column x + next free y per domain, seeded from existing nodes so new components stack below\n // their domain siblings rather than overlapping them. New domains get a fresh column.\n const xByDomain = new Map<string, number>();\n const maxYByDomain = new Map<string, number>();\n for (const n of existing) {\n const d = (n.cluster ?? \"\").trim() || \"—\";\n if (!xByDomain.has(d)) xByDomain.set(d, n.x);\n maxYByDomain.set(d, Math.max(maxYByDomain.get(d) ?? -150, n.y));\n }\n let nextCol = existing.length ? Math.max(...existing.map((n) => n.x)) + 320 : 0;\n\n for (const c of components) {\n const key = c.title.toLowerCase();\n const status = c.status && ARCH_STATUSES.has(c.status) ? c.status : \"KEEP\";\n const prior = nodeByTitle.get(key);\n if (prior) {\n await db\n .update(node)\n .set({ cluster: c.domain, role: c.role ?? prior.role, plain: c.plain ?? prior.plain, status })\n .where(eq(node.id, prior.id));\n if (c.files?.length) {\n await db.delete(nodeFile).where(eq(nodeFile.nodeId, prior.id));\n await db\n .insert(nodeFile)\n .values(Array.from(new Set(c.files)).map((path) => ({ nodeId: prior.id, path })));\n }\n await reembedNode(prior.id);\n } else {\n const d = c.domain.trim() || \"—\";\n let x = xByDomain.get(d);\n if (x === undefined) {\n x = nextCol;\n nextCol += 320;\n xByDomain.set(d, x);\n }\n const y = (maxYByDomain.get(d) ?? -150) + 150;\n maxYByDomain.set(d, y);\n const [created] = await db\n .insert(node)\n .values({\n view: \"ARCHITECTURE\",\n source: \"MANUAL\",\n cluster: c.domain,\n title: c.title,\n role: c.role ?? null,\n plain: c.plain ?? null,\n status,\n x,\n y,\n })\n .returning();\n if (c.files?.length) {\n await db\n .insert(nodeFile)\n .values(Array.from(new Set(c.files)).map((path) => ({ nodeId: created.id, path })));\n }\n idByTitle.set(key, created.id);\n await reembedNode(created.id);\n }\n }\n\n // DEPENDS edges (mirror lib/init.ts persistArchitecture), de-duplicated.\n for (const c of components) {\n const fromId = idByTitle.get(c.title.toLowerCase());\n if (!fromId) continue;\n for (const dep of c.depends ?? []) {\n const toId = idByTitle.get(dep.trim().toLowerCase());\n if (!toId || toId === fromId) continue;\n const dup = await db.query.edge.findFirst({\n where: (t, { and, eq }) =>\n and(eq(t.fromId, fromId), eq(t.toId, toId), eq(t.kind, \"DEPENDS\")),\n });\n if (!dup)\n await db\n .insert(edge)\n .values({ fromId, toId, kind: \"DEPENDS\" })\n .catch(() => {});\n }\n }\n\n return components.length;\n}\n\n/** Mark a feature as shipped: replace its description with what the system actually does\n * (markdown), record the files it spans (kept on the FEATURE for the context bundle), and flip\n * its status to DONE in one call. Optionally upserts REAL architecture components when the\n * feature changed a subsystem. Subsumes the older touchFiles + finishFeature flow so the\n * terminal session only needs ONE tool call at the end. */\nexport async function describeFeature(input: {\n id?: string;\n title?: string;\n description: string;\n files?: string[];\n architecture?: unknown[];\n}): Promise<{ ok: boolean; id?: string; candidates?: Scored[] }> {\n const nodes = await db.query.node.findMany({ where: (t, { eq }) => eq(t.view, \"ROADMAP\") });\n let target = input.id ? nodes.find((n) => n.id === input.id) : undefined;\n if (!target && input.title) {\n const { best, candidates } = matchFeature(\n input.title,\n nodes.map((n) => ({ id: n.id, title: n.title })),\n );\n if (best) target = nodes.find((n) => n.id === best.id);\n else if (candidates.length) return { ok: false, candidates };\n }\n if (!target) return { ok: false };\n await db\n .update(node)\n .set({ plain: input.description, status: \"DONE\" })\n .where(eq(node.id, target.id));\n await reembedNode(target.id);\n await propagateStatusUp(target.id);\n\n // Record files (idempotent — only adds new ones).\n if (input.files?.length) {\n const paths = Array.from(new Set(input.files.map(normalizePath).filter(Boolean)));\n for (const path of paths) {\n await db\n .insert(nodeFile)\n .values({ nodeId: target.id, path })\n .onConflictDoNothing({ target: [nodeFile.nodeId, nodeFile.path] });\n }\n }\n\n // The feature is done — drop the session's \"current feature\" pointer if it\n // pointed here, so edits stop auto-attaching and the loop closes cleanly (and a\n // future Stop-style nudge couldn't fire on already-registered work).\n await db\n .update(appSetting)\n .set({ currentFeatureId: null })\n .where(eq(appSetting.currentFeatureId, target.id));\n\n // Deliberate architecture updates (only when the feature changed a real subsystem). This is\n // the curated replacement for the old per-file auto-derivation — never one-node-per-file.\n if (input.architecture?.length) {\n await upsertArchitectureComponents(input.architecture);\n }\n\n await bumpVersion();\n return { ok: true, id: target.id };\n}\n\n/** Record the files a feature spans (reported by a session as it works). */\nexport async function touchFiles(input: {\n id?: string;\n title?: string;\n files: string[];\n}): Promise<{ ok: boolean; id?: string; count?: number; candidates?: Scored[] }> {\n const files = Array.from(new Set((input.files ?? []).map(normalizePath).filter(Boolean)));\n const nodes = await db.query.node.findMany({ where: (t, { eq }) => eq(t.view, \"ROADMAP\") });\n\n let target = input.id ? nodes.find((n) => n.id === input.id) : undefined;\n if (!target && input.title) {\n const { best, candidates } = matchFeature(\n input.title,\n nodes.map((n) => ({ id: n.id, title: n.title })),\n );\n if (best) target = nodes.find((n) => n.id === best.id);\n else if (candidates.length) return { ok: false, candidates };\n }\n if (!target) return { ok: false };\n\n for (const path of files) {\n await db\n .insert(nodeFile)\n .values({ nodeId: target.id, path })\n .onConflictDoNothing({ target: [nodeFile.nodeId, nodeFile.path] });\n }\n await bumpVersion();\n const fileCount = (\n await db.select({ n: count() }).from(nodeFile).where(eq(nodeFile.nodeId, target.id))\n )[0].n;\n return { ok: true, id: target.id, count: fileCount };\n}\n\n// ── Bulk sub-task creation under a parent ───────────────────────────────────\n// Lets a terminal session add N sub-tasks under a feature in one call (used by the\n// `beacon_add_subtasks` MCP tool). Parent is resolved by id (preferred) or by\n// fuzzy-title match. Children inherit the parent's view + cluster; positioning lands\n// them in a row directly below the parent so they don't pile on top of existing nodes.\n\nexport interface AddSubtaskItem {\n title: string;\n plain?: string | null;\n}\n\nexport type AddSubtasksResult =\n | {\n ok: true;\n parent: { id: string; title: string };\n created: Array<{ id: string; title: string }>;\n }\n | { ok: false; reason: \"no_items\" }\n | { ok: false; reason: \"parent_not_found\" }\n | { ok: false; reason: \"ambiguous\"; candidates: Scored[] }\n | { ok: false; reason: \"duplicate\"; message: string };\n\nexport async function addSubtasksUnder(input: {\n parentId?: string | null;\n parentTitle?: string | null;\n items: AddSubtaskItem[];\n}): Promise<AddSubtasksResult> {\n const items = input.items.filter((i) => i.title.trim());\n if (!items.length) return { ok: false, reason: \"no_items\" };\n\n type ParentNode = Awaited<ReturnType<typeof db.query.node.findFirst>>;\n let parent: ParentNode = undefined;\n if (input.parentId) {\n parent = await db.query.node.findFirst({ where: (t, { eq }) => eq(t.id, input.parentId!) });\n } else if (input.parentTitle && input.parentTitle.trim()) {\n const candidates = await db.query.node.findMany({\n where: (t, { isNull }) => isNull(t.parentId),\n columns: { id: true, title: true, cluster: true, status: true },\n });\n const { best, candidates: alt } = matchFeature(\n input.parentTitle.trim(),\n candidates.map((c) => ({\n id: c.id,\n title: c.title,\n cluster: c.cluster,\n status: c.status,\n })),\n );\n if (best) parent = await db.query.node.findFirst({ where: (t, { eq }) => eq(t.id, best.id) });\n else if (alt.length) return { ok: false, reason: \"ambiguous\", candidates: alt };\n }\n if (!parent) return { ok: false, reason: \"parent_not_found\" };\n const parentNode = parent;\n\n // Don't recreate a sub-task that already lives under this parent — hard-block so the agent\n // doesn't pile up near-identical children when it re-runs.\n const siblings = await db.query.node.findMany({\n where: (t, { eq }) => eq(t.parentId, parentNode.id),\n columns: { id: true, title: true },\n });\n const dups = items.filter((it) => matchFeature(it.title.trim(), siblings).best);\n if (dups.length) {\n return {\n ok: false,\n reason: \"duplicate\",\n message:\n `⛔ These sub-tasks already exist under \"${parentNode.title}\": ` +\n `${dups.map((d) => `\"${d.title.trim()}\"`).join(\", \")}. ` +\n \"Drop the duplicates — only add genuinely new sub-tasks.\",\n };\n }\n\n // Obstacles = every node already on this view; children land in a row below the parent but get\n // nudged clear of anything already there (and of earlier children in this same batch).\n const obstacles = (\n await db.query.node.findMany({\n where: (t, { eq }) => eq(t.view, parentNode.view),\n columns: { x: true, y: true },\n })\n ).map((n) => ({ x: n.x, y: n.y }));\n const created: Array<{ id: string; title: string }> = [];\n for (let i = 0; i < items.length; i++) {\n const it = items[i];\n const pos = placeWithoutOverlap(obstacles, { x: parentNode.x + i * 240, y: parentNode.y + 200 });\n obstacles.push(pos);\n const n = await createNode({\n view: parentNode.view as \"ROADMAP\" | \"ARCHITECTURE\",\n title: it.title.trim(),\n plain: it.plain ?? null,\n cluster: parentNode.cluster ?? null,\n parentId: parentNode.id,\n x: pos.x,\n y: pos.y,\n });\n created.push({ id: n.id, title: n.title });\n }\n\n // A fresh PENDING child under a previously DONE parent should bubble the parent\n // back to PENDING. Walking up from any one child reaches every ancestor.\n if (created.length) await propagateStatusUp(created[0].id);\n await bumpVersion();\n return { ok: true, parent: { id: parentNode.id, title: parentNode.title }, created };\n}\n","import { z } from \"zod\";\n\nexport const VIEW = z.enum([\"ROADMAP\", \"ARCHITECTURE\"]);\n\nexport const NODE_STATUS = z.enum([\n // roadmap\n \"PENDING\",\n \"IN_PROGRESS\",\n \"DONE\",\n \"BLOCKED\",\n \"CANCELLED\",\n \"DEPRIORITIZED\",\n // architecture disposition\n \"KEEP\",\n \"REBUILD\",\n \"REPLACE\",\n \"DROP\",\n]);\n\nexport const EDGE_KIND = z.enum([\"DEPENDS\", \"CONTAINS\", \"RELATES\", \"REPLACES\"]);\n\nexport const createNodeSchema = z.object({\n view: VIEW,\n title: z.string().trim().min(1).max(200),\n cluster: z.string().trim().max(64).nullish(),\n role: z.string().trim().max(500).nullish(),\n plain: z.string().trim().max(2000).nullish(),\n parentId: z.string().nullish(),\n status: NODE_STATUS.optional(),\n priority: z.number().int().min(0).max(3).optional(),\n x: z.number().optional(),\n y: z.number().optional(),\n sourceRef: z.string().trim().max(300).nullish(),\n});\nexport type CreateNodeInput = z.input<typeof createNodeSchema>;\n\nexport const updateNodeSchema = z.object({\n title: z.string().trim().min(1).max(200).optional(),\n role: z.string().trim().max(500).nullish(),\n plain: z.string().trim().max(2000).nullish(),\n cluster: z.string().trim().max(64).nullish(),\n status: NODE_STATUS.optional(),\n priority: z.number().int().min(0).max(3).optional(),\n sourceRef: z.string().trim().max(300).nullish(),\n});\nexport type UpdateNodeInput = z.input<typeof updateNodeSchema>;\n\nexport const positionSchema = z.object({\n x: z.number(),\n y: z.number(),\n});\n\nexport const createEdgeSchema = z.object({\n fromId: z.string().min(1),\n toId: z.string().min(1),\n kind: z.enum([\"DEPENDS\", \"RELATES\", \"REPLACES\"]).optional(),\n label: z.string().trim().max(80).nullish(),\n // Which handle on each card the user dragged from / to (e.g. \"sr\", \"tl\").\n sourceHandle: z.string().trim().max(16).nullish(),\n targetHandle: z.string().trim().max(16).nullish(),\n});\nexport type CreateEdgeInput = z.input<typeof createEdgeSchema>;\n","import { and, eq } from \"drizzle-orm\";\nimport { db } from \"@/lib/db-drizzle\";\nimport { node, edge, dbTable, endpoint } from \"@/lib/drizzle/schema\";\nimport { reembedNode } from \"@/lib/embeddings\";\nimport { propagateStatusUp } from \"@/lib/map-ops\";\nimport {\n NODE_STATUS,\n createEdgeSchema,\n createNodeSchema,\n positionSchema,\n updateNodeSchema,\n type CreateEdgeInput,\n type CreateNodeInput,\n type UpdateNodeInput,\n} from \"@/lib/schemas\";\n\n// Pure data mutations (validation + db). Kept free of Next imports so they can be\n// unit-tested directly; the `app/actions/*` wrappers add cache revalidation.\n\n// Semantic-search fields — when any of these change, the row's embedding needs\n// to refresh. Status / position / priority don't affect the vector, so frequent\n// drag-and-status mutations skip the (~50ms) embed.\nconst SEMANTIC_FIELDS = new Set([\"title\", \"role\", \"plain\", \"cluster\"]);\n\nexport async function createNode(input: CreateNodeInput) {\n const data = createNodeSchema.parse(input);\n const defaultStatus = data.view === \"ARCHITECTURE\" ? \"REBUILD\" : \"PENDING\";\n const [created] = await db\n .insert(node)\n .values({\n view: data.view,\n title: data.title,\n cluster: data.cluster ?? null,\n role: data.role ?? null,\n plain: data.plain ?? null,\n parentId: data.parentId ?? null,\n status: data.status ?? defaultStatus,\n priority: data.priority ?? 2,\n x: data.x ?? 0,\n y: data.y ?? 0,\n sourceRef: data.sourceRef ?? null,\n })\n .returning();\n await reembedNode(created.id);\n return created;\n}\n\n// A roadmap dependency edge (or RELATES/REPLACES) created by dragging between two node\n// handles. Idempotent on the unique [fromId,toId,kind] — duplicate drags return the existing\n// edge instead of erroring, since drag gestures are easy to repeat by accident.\nexport async function createEdge(input: CreateEdgeInput) {\n const data = createEdgeSchema.parse(input);\n if (data.fromId === data.toId) throw new Error(\"Self-edge not allowed\");\n const kind = data.kind ?? \"DEPENDS\";\n const existing = await db.query.edge.findFirst({\n where: (e, { and: a, eq: eqf }) =>\n a(eqf(e.fromId, data.fromId), eqf(e.toId, data.toId), eqf(e.kind, kind)),\n });\n if (existing) return existing;\n const [created] = await db\n .insert(edge)\n .values({\n fromId: data.fromId,\n toId: data.toId,\n kind,\n label: data.label ?? null,\n sourceHandle: data.sourceHandle ?? null,\n targetHandle: data.targetHandle ?? null,\n })\n .returning();\n return created;\n}\n\nexport async function updateNode(id: string, input: UpdateNodeInput) {\n const data = updateNodeSchema.parse(input);\n const [updated] = await db.update(node).set(data).where(eq(node.id, id)).returning();\n // Re-embed only when a semantic field actually changed — drag/status updates\n // happen constantly and don't change the vector.\n const semanticChanged = Object.keys(data).some((k) => SEMANTIC_FIELDS.has(k));\n if (semanticChanged) await reembedNode(id);\n // Status changes need to bubble up to parent.\n if (data.status !== undefined) await propagateStatusUp(id);\n return updated;\n}\n\nexport async function setNodeStatus(id: string, status: string) {\n const parsed = NODE_STATUS.parse(status);\n const [updated] = await db.update(node).set({ status: parsed }).where(eq(node.id, id)).returning();\n await propagateStatusUp(id);\n return updated;\n}\n\n/** Soft \"park\": mark deprioritized and drop to the lowest priority. Reversible. */\nexport async function deprioritizeNode(id: string) {\n const [updated] = await db\n .update(node)\n .set({ status: \"DEPRIORITIZED\", priority: 3 })\n .where(eq(node.id, id))\n .returning();\n await propagateStatusUp(id);\n return updated;\n}\n\n/** Soft cancel: keep the node for history, rendered struck-through. Not a delete. */\nexport async function cancelNode(id: string) {\n const [updated] = await db\n .update(node)\n .set({ status: \"CANCELLED\" })\n .where(eq(node.id, id))\n .returning();\n await propagateStatusUp(id);\n return updated;\n}\n\nexport async function deleteNode(id: string) {\n const [deleted] = await db.delete(node).where(eq(node.id, id)).returning();\n return deleted;\n}\n\nexport async function updateNodePosition(id: string, x: number, y: number) {\n const pos = positionSchema.parse({ x, y });\n const [updated] = await db.update(node).set(pos).where(eq(node.id, id)).returning();\n return updated;\n}\n\n// Persist many node positions in one round-trip — used by the roadmap \"Arrange\" action,\n// which repositions every feature at once. Mirrors the code-graph batch-position route.\nexport async function updateNodePositions(rows: { id: string; x: number; y: number }[]) {\n await Promise.all(\n rows.map((r) => {\n const pos = positionSchema.parse({ x: r.x, y: r.y });\n return db.update(node).set(pos).where(eq(node.id, r.id));\n }),\n );\n return rows.length;\n}\n\n// ── Database-design map positions ───────────────────────────────────────────\n\nexport async function updateDbTablePosition(id: string, x: number, y: number) {\n const pos = positionSchema.parse({ x, y });\n const [updated] = await db.update(dbTable).set(pos).where(eq(dbTable.id, id)).returning();\n return updated;\n}\n\nexport async function updateEndpointPosition(id: string, x: number, y: number) {\n const pos = positionSchema.parse({ x, y });\n const [updated] = await db.update(endpoint).set(pos).where(eq(endpoint.id, id)).returning();\n return updated;\n}\n"],"names":["MIN_W","MIN_H","overlaps","a","b","Math","abs","x","y","placeWithoutOverlap","existing","desired","pos","i","some","e","LAYOUT_ALGO_VERSION","roadmapStructureSignature","nodeIds","edges","ns","sort","join","es","map","fromId","toId","length","sigPath","readRoadmapLayoutSig","raw","JSON","parse","sig","writeRoadmapLayoutSig","setCurrent","id","currentFeatureId","listMap","nodes","query","node","findMany","where","t","eq","view","orderBy","asc","createdAt","fronts","filter","n","parentId","f","title","status","tasks","workingOn","setStatus","update","set","propagateStatusUp","COMPLETE_STATUSES","Set","ACTIVE_STATUSES","STICKY_PARENT_STATUSES","deriveParentStatus","childStatuses","every","s","has","nodeId","self","findFirst","columns","parent","siblings","derived","healRoadmapLayout","all","source","ids","edge","and","kind","updates","p","get","round","push","Promise","startFeature","input","trim","Error","find","action","via","best","candidates","score","frontInput","front","frontErr","message","frontTitle","inheritedCluster","cluster","createErr","category","task","insert","values","plain","detail","returning","finishFeature","ok","undefined","normalizePath","root","startsWith","slice","replace","ARCH_STATUSES","archComponentSchema","object","string","min","domain","role","nullish","files","array","optional","depends","upsertArchitectureComponents","parsed","byKey","Map","c","toLowerCase","components","Array","from","nodeByTitle","idByTitle","xByDomain","maxYByDomain","d","max","nextCol","key","prior","delete","path","created","dep","dup","catch","describeFeature","target","description","paths","Boolean","onConflictDoNothing","architecture","touchFiles","fileCount","select","count","addSubtasksUnder","items","reason","parentTitle","isNull","alt","parentNode","dups","it","obstacles","VIEW","enum","NODE_STATUS","EDGE_KIND","createNodeSchema","priority","number","int","sourceRef","updateNodeSchema","positionSchema","createEdgeSchema","label","sourceHandle","targetHandle","SEMANTIC_FIELDS","createNode","data","defaultStatus","createEdge","eqf","updateNode","updated","semanticChanged","Object","keys","k","setNodeStatus","deprioritizeNode","cancelNode","deleteNode","deleted","updateNodePosition","updateNodePositions","rows","r","updateDbTablePosition","updateEndpointPosition"],"mappings":"oEAuBO,SAASS,AAAoBC,CAAe,CAAEC,CAAY,EAC/D,IAAMC,EAAM,CAAEL,EAAGI,EAAQJ,CAAC,CAAEC,EAAGG,EAAQH,CAAC,AAAC,EACzC,IAAK,IAAIK,EAAI,EAAGA,EAAI,KAAOH,EAASI,IAAI,CAAC,AAACC,GAX9B,CAWoCb,GAPzCG,KAAKC,GAAG,CAO0CM,AAPzCT,EAAEI,CAAC,CAAGH,AAOwCW,EAPtCR,CAAC,IAAIP,GAASK,KAAKC,GAAG,CAACH,EAAEK,CAAC,CAAGJ,EAAEI,CAAC,GAOWK,CAPPZ,GAOY,AACtEW,EAAIJ,CAAC,EAXK,EAWDP,EAEX,OAAOW,CACT,2BC7BA,IAAA,EAAA,EAAA,CAAA,CAAA,MACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAwBA,SAASgB,IACP,MAAO,CAAA,EAAA,EAAA,IAAA,AAAI,EAAC,CAAA,EAAA,EAAA,OAAA,AAAO,IAAI,0BACzB,+BAEO,SAASC,EACd,GAAI,CAEF,OADYE,AACLD,KADUE,KAAK,CAAC,CAAA,EAAA,EAAA,YAAA,AAAY,EAACJ,IAAW,SACpCK,GAAG,EAAI,IACpB,CAAE,KAAM,CACN,OAAO,IACT,CACF,gCApBO,SAAShB,AACdC,CAAiB,CACjBC,CAAyC,EAEzC,IAAMC,EAAK,IAAIF,EAAQ,CAACG,IAAI,GAAGC,IAAI,CAAC,KAC9BC,EAAKJ,EAAMK,GAAG,CAAC,AAACT,GAAM,CAAA,EAAGA,EAAEU,MAAM,CAAC,CAAC,EAAEV,EAAEW,IAAI,CAAA,CAAE,EAAEL,IAAI,GAAGC,IAAI,CAAC,KACjE,MAAO,GAAGN,QAAuBE,EAAQS,MAAM,CAAC,CAAC,EAAEP,AAArB,CAAC,EAAuB,CAAC,CAAEG,GAAI,AAC/D,4BAeO,SAASW,AAAsBD,CAAW,EAC/C,CAAA,EAAA,EAAA,eAAA,AAAe,EAACL,IAAW,KAAEK,CAAI,EACnC,mMC1CA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,MACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,MAKA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,sBAEA,eAAeE,EAAWC,CAAU,EAClC,MAAM,CAAA,EAAA,EAAA,cAAA,AAAc,EAAC,CAAEC,iBAAkBD,CAAG,EAC9C,CAeO,eAAeE,IACpB,IAAMC,EAAQ,MAAM,EAAA,EAAE,CAACC,KAAK,CAACC,IAAI,CAACC,QAAQ,CAAC,CACzCC,MAAO,CAACC,EAAG,IAAEC,CAAE,CAAE,GAAKA,EAAGD,EAAEE,IAAI,CAAE,WACjCC,QAAS,CAACH,EAAG,KAAEI,CAAG,CAAE,GAAKA,EAAIJ,EAAEK,SAAS,CAC1C,GAEA,MAAO,CACLC,OAFaX,AAELW,EAFWC,MAAM,CAAC,AAACC,GAAM,CAACA,EAAEC,QAAQ,EAE7B7B,GAAG,CAAC,AAAC8B,IAAM,AAAC,CACzBlB,GAAIkB,EAAElB,EAAE,CACRmB,MAAOD,EAAEC,KAAK,CACdC,OAAQF,EAAEE,MAAM,CAChBC,MAAOlB,EACJY,MAAM,CAAC,AAACC,GAAMA,EAAEC,QAAQ,GAAKC,EAAElB,EAAE,EACjCZ,GAAG,CAAC,AAACoB,IAAM,AAAC,CACXR,GAAIQ,EAAER,EAAE,CACRmB,MAAOX,EAAEW,KAAK,CACdC,OAAQZ,EAAEY,MAAM,CAChBE,UAAwB,gBAAbd,EAAEY,MAAM,AACrB,CAAC,GACL,CAAC,CACH,CACF,CAQA,eAAeG,EAAUvB,CAAU,CAAEoB,CAAc,EACjD,MAAM,EAAA,EAAE,CAACI,MAAM,CAAC,EAAA,IAAI,EAAEC,GAAG,CAAC,QAAEL,CAAO,GAAGb,KAAK,CAAC,CAAA,EAAA,EAAA,EAAA,AAAE,EAAC,EAAA,IAAI,CAACP,EAAE,CAAEA,IACxD,MAAM0B,EAAkB1B,GACxB,MAAM,CAAA,EAAA,EAAA,WAAW,AAAX,GACR,gCAoBA,IAAM2B,EAAoB,IAAIC,IAAI,CAAC,OAAQ,YAAa,gBAAgB,EAClEC,EAAkB,IAAID,IAAI,CAAC,cAAe,UAAU,EACpDE,EAAyB,IAAIF,IAAI,CAAC,YAAa,gBAAgB,EAe9D,eAAeF,EAAkBU,CAAc,QACpD,IAAMC,EAAO,MAAM,EAAA,EAAE,CAACjC,KAAK,CAACC,IAAI,CAACiC,SAAS,CAAC,CACzC/B,MAAO,CAACC,EAAG,CAAEC,IAAE,CAAE,GAAKA,EAAGD,EAAER,EAAE,CAAEoC,GAC/BG,QAAS,CAAEtB,UAAU,EAAMP,MAAM,CAAK,CACxC,GACA,GAAI,CAAC2B,GAAMpB,UAA0B,YAAdoB,EAAK3B,IAAI,CAAgB,OAEhD,IAAM8B,EAAS,MAAM,EAAA,EAAE,CAACpC,KAAK,CAACC,IAAI,CAACiC,SAAS,CAAC,CAC3C/B,MAAO,CAACC,EAAG,IAAEC,CAAE,CAAE,GAAKA,EAAGD,EAAER,EAAE,CAAEqC,EAAKpB,QAAQ,EAC5CsB,QAAS,CAAEvC,IAAI,EAAMoB,QAAQ,EAAMV,MAAM,CAAK,CAChD,GACA,GAAI,CAAC8B,GAA0B,YAAhBA,EAAO9B,IAAI,EACtBoB,EAAuBK,GAAG,CAACK,EAAOpB,MAAM,EADF,CACK,MAM/C,IAAMsB,EA9BN,AAAKV,CADqBA,EA+BSS,CAJlB,AA1Bb,IA8BYV,EAJO,EAAA,EAAE,AA3BwB,CA2BvB3B,KAAK,CAACC,IAAI,CAACC,QAAQ,CAAC,CAC5CC,MAAO,CAACC,EAAG,IAAEC,CAAE,CAAE,GAAKA,EAAGD,EAAES,QAAQ,CAAEuB,EAAOxC,EAAE,EAC9CuC,QAAS,CAAEnB,QAAQ,CAAK,CAC1B,EAAA,EAC4ChC,GAAG,CAAC,AAAC8C,GAAMA,EAAEd,MAAM,GA9B5C7B,MAAM,CACrByC,CADuB,CACTC,KAAK,CAAC,AAACC,GAAMP,EAAkBQ,GAAG,CAACD,IAAY,CAAP,MACtDF,EAActD,IAAI,CAAC,AAACwD,GAAML,EAAgBM,GAAG,CAACD,IAAY,CAAP,aAChD,UAH2B,UA+B9BM,EAAOpB,MAAM,GAAKsB,IAEtB,KAF+B,CAEzB,EAAA,EAAE,CAAClB,MAAM,CAAC,EAAA,IAAI,EAAEC,GAAG,CAAC,CAAEL,OAAQsB,CAAQ,GAAGnC,KAAK,CAAC,CAAA,EAAA,EAAA,EAAE,AAAF,EAAG,EAAA,IAAI,CAACP,EAAE,CAAEwC,EAAOxC,EAAE,GAC1E,MAAM0B,EAAkBc,EAAOxC,EAAE,EACnC,CAkBO,eAAe2C,IAKpB,IAAMxC,EAAQyC,CAJF,MAAM,EAAA,EAAE,CAACxC,KAAK,CAACC,IAAI,CAACC,QAAQ,CAAC,CACvCC,MAAO,CAACC,EAAG,IAAEC,CAAE,CAAE,GAAKA,EAAGD,EAAEE,IAAI,CAAE,WACjC6B,QAAS,CAAEvC,GAAI,GAAMiB,UAAU,EAAM4B,QAAQ,EAAM1E,GAAG,EAAMC,GAAG,CAAK,CACtE,EAAA,EACkB2C,MAAM,CAAC,AAACC,GAAmB,UAAbA,EAAE6B,MAAM,EACxC,GAAI1C,EAAMZ,MAAM,CAAG,EAAG,OACtB,IAAMuD,EAAM3C,EAAMf,GAAG,CAAC,AAAC4B,GAAMA,EAAEhB,EAAE,EAC3BjB,EAAQ,MAAM,EAAA,EAAE,CAACqB,KAAK,CAAC2C,IAAI,CAACzC,QAAQ,CAAC,CACzCC,MAAO,CAACC,EAAG,KAAEwC,CAAG,IAAEvC,CAAE,CAAE,GACpBuC,EAAIvC,EAAGD,EAAEyC,IAAI,CAAE,WAAY,CAAA,EAAA,EAAA,OAAA,AAAO,EAACzC,EAAEnB,MAAM,CAAEyD,GAAM,CAAA,EAAA,EAAA,OAAA,AAAO,EAACtC,EAAElB,IAAI,CAAEwD,IACrEP,QAAS,CAAElD,QAAQ,EAAMC,MAAM,CAAK,CACtC,GAEMO,EAAM,CAAA,EAAA,EAAA,yBAAA,AAAyB,EAACiD,EAAK/D,GAC3C,GAAI,CAAA,EAAA,EAAA,oBAAA,AAAoB,MAAOc,EAAK,OAEpC,CAF4C,GAEtCrB,EAAM,CAAA,EAAA,EAAA,kBAAA,AAAkB,EAC5B2B,EAAMf,GAAG,CAAC,AAAC4B,IAAM,AAAC,CAAEhB,GAAIgB,EAAEhB,EAAE,CAAEiB,IAHiE,KAGvDD,EAAEC,QAAQ,CAAC,CAAC,EACpDlC,GAEImE,EAA8B,EAAE,CACtC,IAAK,IAAMlC,KAAKb,EAAO,CACrB,IAAMgD,EAAI3E,EAAI4E,GAAG,CAACpC,EAAEhB,EAAE,EACjBmD,GAAG,CACJlF,KAAKoF,KAAK,CAACF,EAAEhF,CAAC,IAAMF,KAAKoF,KAAK,CAACrC,EAAE7C,CAAC,GAAKF,KAAKoF,KAAK,CAACF,EAAE/E,CAAC,IAAMH,KAAKoF,KAAK,CAACrC,EAAE5C,EAAC,GAAG,AAChF8E,EAAQI,IAAI,CAAC,EAAA,EAAE,CAAC9B,MAAM,CAAC,EAAA,IAAI,EAAEC,GAAG,CAAC,CAAEtD,EAAGgF,EAAEhF,CAAC,CAAEC,EAAG+E,EAAE/E,CAAC,AAAC,GAAGmC,KAAK,CAAC,CAAA,EAAA,EAAA,EAAA,AAAE,EAAC,EAAA,IAAI,CAACP,EAAE,CAAEgB,EAAEhB,EAAE,GAC7E,CACA,MAAMuD,QAAQX,GAAG,CAACM,GAClB,CAAA,EAAA,EAAA,qBAAA,AAAqB,EAACrD,EACxB,CAEO,eAAe2D,EAAaC,CAMlC,EACC,IAAMtC,EAAQsC,EAAMtC,KAAK,CAACuC,IAAI,GAC9B,GAAI,CAACvC,EAAO,MAAM,AAAIwC,MAAM,kBAE5B,IAAMxD,EAAQ,MAAM,EAAA,EAAE,CAACC,KAAK,CAACC,IAAI,CAACC,QAAQ,CAAC,CAAEC,MAAO,CAACC,EAAG,IAAEC,CAAE,CAAE,GAAKA,EAAGD,EAAEE,IAAI,CAAE,UAAW,GAEzF,GAAI+C,EAAMzD,EAAE,CAAE,CACZ,IAAMgB,EAAIb,EAAMyD,IAAI,CAAC,AAACzF,GAAMA,EAAE6B,EAAE,GAAKyD,EAAMzD,EAAE,EAC7C,GAAIgB,EAGF,CAHK,MACL,MAAMO,EAAUP,EAAEhB,EAAE,CAAE,eACtB,MAAMD,EAAWiB,EAAEhB,EAAE,EACd,CAAE6D,OAAQ,UAAW7D,GAAIgB,EAAEhB,EAAE,CAAEmB,MAAOH,EAAEG,KAAK,CAAE2C,IAAK,IAAK,CAEpE,CAEA,GAAM,MAAEC,CAAI,CAAEC,YAAU,CAAE,CAAG,CAAA,EAAA,EAAA,YAAA,AAAY,EACvC7C,EACAhB,EAAMf,GAAG,CAAE4B,AAAD,IAAQ,AAAD,CAAGhB,GAAIgB,EAAEhB,EAAE,CAAEmB,MAAOH,EAAEG,KAAK,CAAC,CAAC,GAEhD,GAAI4C,EAGF,IAHQ,GACR,MAAMxC,EAAUwC,EAAK/D,EAAE,CAAE,eACzB,MAAMD,EAAWgE,EAAK/D,EAAE,EACjB,CAAE6D,OAAQ,UAAW7D,GAAI+D,EAAK/D,EAAE,CAAEmB,MAAO4C,EAAK5C,KAAK,CAAE2C,IAAK,QAASG,MAAOF,EAAKE,KAAK,AAAC,EAE9F,GAAID,EAAWzE,MAAM,CAAE,MAAO,CAAEsE,OAAQ,uBAAaG,CAAW,EAMhE,IAAMlD,EAASX,EAAMY,MAAM,CAAC,AAACC,GAAM,CAACA,EAAEC,QAAQ,EACxCiD,EAAaT,EAAMU,KAAK,EAAET,QAAU,GAEpCU,EAAWF,EACb,CAAA,EAAA,EAAA,aAAA,AAAa,EAACA,EAAYpD,EAAO1B,GAAG,CAAC,AAAC4B,GAAO,CAAD,CAAGhB,GAAIgB,EAAEhB,EAAE,CAAEmB,MAAOH,EAAEG,KAAK,CAAC,CAAC,GACzE,KACJ,GAAIiD,EAAU,MAAO,CAAEP,OAAQ,WAAYQ,QAASD,CAAS,EAE7D,IAAInD,EAA0B,KAC1BqD,EAA4B,KAC5BC,EAAkC,KACtC,GAAIL,EAAY,CACd,IAAMhD,EAAI,CAAA,EAAA,EAAA,YAAA,AAAY,EAACgD,EAAYpD,EAAO1B,GAAG,CAAC,AAAC4B,IAAM,AAAC,CAAEhB,GAAIgB,EAAEhB,EAAE,CAAEmB,MAAOH,EAAEG,KAAK,CAAC,CAAC,GAAI4C,IAAI,CAC1F9C,EAAWC,EAAElB,EAAE,CACfsE,EAAapD,EAAEC,KAAK,CACpBoD,EAAmBpE,EAAMyD,IAAI,CAAC,AAAC5C,GAAMA,EAAEhB,EAAE,GAAKkB,EAAElB,EAAE,GAAGwE,SAAW,IAClE,CAEA,IAAMA,EAAU,CAACf,EAAMe,OAAO,EAAEd,QAAUa,CAAAA,CAAgB,EAAK,KACzDE,EAAY,CAAA,EAAA,EAAA,uBAAA,AAAuB,EAAC,CACxCtD,QACAuD,SAAUF,EACVlG,SAAU6B,EAAMf,GAAG,CAAC,AAAC4B,IAAM,AAAC,CAAEhB,GAAIgB,EAAEhB,EAAE,CAAEmB,MAAOH,EAAEG,KAAK,CAAEqD,QAASxD,EAAEwD,OAAO,CAAEpD,OAAQJ,EAAEI,MAAM,CAAC,CAAC,CAChG,GACA,GAAIqD,EAAW,MAAO,CAAEZ,OAAQ,WAAYQ,QAASI,CAAU,EAE/D,IAAMhC,EAAWxB,EACbd,EAAMY,MAAM,CAAC,AAACC,GAAMA,EAAEC,QAAQ,GAAKA,GAAU1B,MAAM,CACnDuB,EAAOvB,MAAM,CACXf,EAAM,CAAA,EAAA,EAAA,mBAAA,AAAmB,EAC7B2B,EAAMf,GAAG,CAAC,AAAC4B,IAAM,AAAC,CAAE7C,EAAG6C,EAAE7C,CAAC,CAAEC,EAAG4C,EAAE5C,CAAC,CAAC,CAAC,EACpC,CACED,EAAG8C,EAAYH,EAAO8C,IAAI,CAAC,AAAC1C,GAAMA,EAAElB,EAAE,GAAKiB,IAAW9C,GAAK,EAAgB,IAAXsE,EAChErE,EAAG6C,EAAW,IAAiB,IAAXwB,EAAiB,CACvC,GAEI,CAACkC,EAAK,CAAG,MAAM,EAAA,EAAE,CACpBC,MAAM,CAAC,EAAA,IAAI,EACXC,MAAM,CAAC,CACNnE,KAAM,UACNS,QACA2D,MAAOrB,EAAMsB,MAAM,EAAI,aACvBP,EACApD,OAAQ,cACRyB,OAAQ,UACR5B,WACA9C,EAAGK,EAAIL,CAAC,CACRC,EAAGI,EAAIJ,CACT,AADU,GAET4G,SAAS,GAQZ,OAPA,MAAM,CAAA,EAAA,EAAA,WAAA,AAAW,EAACL,EAAK3E,EAAE,EACzB,MAAM0B,EAAkBiD,EAAK3E,EAAE,EAG/B,MAAM2C,IACN,MAAM,CAAA,EAAA,EAAA,WAAA,AAAW,IACjB,MAAM5C,EAAW4E,EAAK3E,EAAE,EACjB,CAAE6D,OAAQ,UAAW7D,GAAI2E,EAAK3E,EAAE,OAAEmB,EAAOgD,MAAOG,CAAW,CACpE,CAEO,eAAeW,EAAcxB,CAGnC,EACC,IAAMtD,EAAQ,MAAM,EAAA,EAAE,CAACC,KAAK,CAACC,IAAI,CAACC,QAAQ,CAAC,CAAEC,MAAO,CAACC,EAAG,CAAEC,IAAE,CAAE,GAAKA,EAAGD,EAAEE,IAAI,CAAE,UAAW,GAEzF,GAAI+C,EAAMzD,EAAE,CAAE,CACZ,IAAMgB,EAAIb,EAAMyD,IAAI,CAAEzF,AAAD,GAAOA,EAAE6B,EAAE,GAAKyD,EAAMzD,EAAE,EAC7C,GAAIgB,EAEF,CAFK,MACL,MAAMO,EAAUP,EAAEhB,EAAE,CAAE,QACf,CAAEkF,IAAI,EAAMlF,GAAIgB,EAAEhB,EAAE,AAAC,CAEhC,CACA,GAAI,CAACyD,EAAMtC,KAAK,CAAE,MAAO,CAAE+D,IAAI,CAAM,EAErC,GAAM,MAAEnB,CAAI,YAAEC,CAAU,CAAE,CAAG,CAAA,EAAA,EAAA,YAAA,AAAY,EACvCP,EAAMtC,KAAK,CACXhB,EAAMf,GAAG,CAAC,AAAC4B,IAAM,AAAC,CAAEhB,GAAIgB,EAAEhB,EAAE,CAAEmB,MAAOH,EAAEG,KAAK,CAAC,CAAC,UAEhD,AAAI4C,GACF,GADQ,GACFxC,EAAUwC,EAAK/D,EAAE,CAAE,QAClB,CAAEkF,IAAI,EAAMlF,GAAI+D,EAAK/D,EAAE,AAAC,GAE1B,CAAEkF,IAAI,EAAOlB,WAAYA,EAAWzE,MAAM,CAAGyE,OAAamB,CAAU,CAC7E,CAGA,SAASC,EAAcjC,CAAS,EAC9B,IAAIjB,EAAIiB,EAAEO,IAAI,GACR2B,EAAO,CAAA,EAAA,EAAA,QAAA,AAAQ,IAErB,OADInD,EAAEoD,UAAU,CAACD,KAAOnD,EAAIA,EAAEqD,KAAK,CAACF,EAAK9F,OAAM,EACxC2C,EAAEsD,OAAO,CAAC,SAAU,IAAI9B,IAAI,EACrC,CASA,IAAM+B,EAAgB,IAAI7D,IAAI,CAAC,OAAQ,UAAW,UAAW,OAAO,EAC9D8D,EAAsB,EAAA,CAAC,CAACC,MAAM,CAAC,CACnCxE,MAAO,EAAA,CAAC,CAACyE,MAAM,GAAGlC,IAAI,GAAGmC,GAAG,CAAC,GAC7BC,OAAQ,EAAA,CAAC,CAACF,MAAM,GAAGlC,IAAI,GAAGmC,GAAG,CAAC,GAC9BE,KAAM,EAAA,CAAC,CAACH,MAAM,GAAGI,OAAO,GACxBlB,MAAO,EAAA,CAAC,CAACc,MAAM,GAAGI,OAAO,GACzB5E,OAAQ,EAAA,CAAC,CAACwE,MAAM,GAAGI,OAAO,GAC1BC,MAAO,EAAA,CAAC,CAACC,KAAK,CAAC,EAAA,CAAC,CAACN,MAAM,IAAIO,QAAQ,GACnCC,QAAS,EAAA,CAAC,CAACF,KAAK,CAAC,EAAA,CAAC,CAACN,MAAM,IAAIO,QAAQ,EACvC,GAGO,eAAeE,EAA6B5C,CAAgB,EACjE,IAAM6C,EAAS,EAAA,CAAC,CAACJ,KAAK,CAACR,GAAqB9F,KAAK,CAAC6D,GAE5C8C,EAAQ,IAAIC,IAClB,IAAK,IAAMC,KAAKH,EAAQC,EAAM9E,GAAG,CAACgF,EAAEtF,KAAK,CAACuF,WAAW,GAAID,GACzD,IAAME,EAAaC,MAAMC,IAAI,CAACN,EAAM1B,MAAM,IAC1C,GAAI,CAAC8B,EAAWpH,MAAM,CAAE,OAAO,EAE/B,IAAMjB,EAAW,MAAM,EAAA,EAAE,CAAC8B,KAAK,CAACC,IAAI,CAACC,QAAQ,CAAC,CAC5CC,MAAO,CAACC,EAAG,CAAEC,IAAE,CAAE,GAAKA,EAAGD,EAAEE,IAAI,CAAE,eACnC,GACMoG,EAAc,IAAIN,IAAIlI,EAASc,GAAG,CAAE4B,AAAD,GAAO,CAACA,EAAEG,KAAK,CAACuF,WAAW,GAAI1F,EAAE,GACpE+F,EAAY,IAAIP,IAAoBlI,EAASc,GAAG,CAAC,AAAC4B,GAAM,CAACA,EAAEG,KAAK,CAACuF,WAAW,GAAI1F,EAAEhB,EAAE,CAAC,GAIrFgH,EAAY,IAAIR,IAChBS,EAAe,IAAIT,IACzB,IAAK,IAAMxF,KAAK1C,EAAU,CACxB,IAAM4I,EAAI,CAAClG,EAAEwD,OAAO,EAAI,EAAA,CAAE,CAAEd,IAAI,IAAM,GAClC,CAACsD,EAAU7E,GAAG,CAAC+E,IAAIF,EAAUvF,GAAG,CAACyF,EAAGlG,EAAE7C,CAAC,EAC3C8I,EAAaxF,GAAG,CAACyF,EAAGjJ,KAAKkJ,GAAG,CAACF,EAAa7D,GAAG,CAAC8D,IAAM,CAAC,IAAKlG,EAAE5C,CAAC,EAC/D,CACA,IAAIgJ,EAAU9I,EAASiB,MAAM,CAAGtB,KAAKkJ,GAAG,IAAI7I,EAASc,GAAG,CAAC,AAAC4B,GAAMA,EAAE7C,CAAC,GAAK,IAAM,EAE9E,IAAK,IAAMsI,KAAKE,EAAY,CAC1B,IAAMU,EAAMZ,EAAEtF,KAAK,CAACuF,WAAW,GACzBtF,EAASqF,EAAErF,MAAM,EAAIqE,EAActD,GAAG,CAACsE,EAAErF,MAAM,EAAIqF,EAAErF,MAAM,CAAG,OAC9DkG,EAAQR,EAAY1D,GAAG,CAACiE,GAC9B,GAAIC,EACF,KADS,CACH,EAAA,EAAE,CACL9F,MAAM,CAAC,EAAA,IAAI,EACXC,GAAG,CAAC,CAAE+C,QAASiC,EAAEX,MAAM,CAAEC,KAAMU,EAAEV,IAAI,EAAIuB,EAAMvB,IAAI,CAAEjB,MAAO2B,EAAE3B,KAAK,EAAIwC,EAAMxC,KAAK,QAAE1D,CAAO,GAC3Fb,KAAK,CAAC,CAAA,EAAA,EAAA,EAAA,AAAE,EAAC,EAAA,IAAI,CAACP,EAAE,CAAEsH,EAAMtH,EAAE,GACzByG,EAAER,KAAK,EAAE1G,QAAQ,CACnB,MAAM,EAAA,EAAE,CAACgI,MAAM,CAAC,EAAA,QAAQ,EAAEhH,KAAK,CAAC,CAAA,EAAA,EAAA,EAAA,AAAE,EAAC,EAAA,QAAQ,CAAC6B,MAAM,CAAEkF,EAAMtH,EAAE,GAC5D,MAAM,EAAA,EAAE,CACL4E,MAAM,CAAC,EAAA,QAAQ,EACfC,MAAM,CAAC+B,MAAMC,IAAI,CAAC,IAAIjF,IAAI6E,EAAER,KAAK,GAAG7G,GAAG,CAAC,AAACoI,IAAU,CAAEpF,EAAH,KAAWkF,EAAMtH,EAAE,MAAEwH,EAAK,CAAC,IAElF,MAAM,CAAA,EAAA,EAAA,WAAA,AAAW,EAACF,EAAMtH,EAAE,MACrB,CACL,IAAMkH,EAAIT,EAAEX,MAAM,CAACpC,IAAI,IAAM,IACzBvF,EAAI6I,EAAU5D,GAAG,CAAC8D,QACZ/B,IAANhH,IACFA,EAAIiJ,CADe,CAEnBA,GAAW,IACXJ,EAAUvF,GAAG,CAACyF,EAAG/I,IAEnB,IAAMC,EAAK6I,AAAD,GAAc7D,GAAG,CAAC8D,IAAM,CAAC,GAAA,CAAG,CAAI,IAC1CD,EAAaxF,GAAG,CAACyF,EAAG9I,GACpB,GAAM,CAACqJ,EAAQ,CAAG,MAAM,EAAA,EAAE,CACvB7C,MAAM,CAAC,EAAA,IAAI,EACXC,MAAM,CAAC,CACNnE,KAAM,eACNmC,OAAQ,SACR2B,QAASiC,EAAEX,MAAM,CACjB3E,MAAOsF,EAAEtF,KAAK,CACd4E,KAAMU,EAAEV,IAAI,EAAI,KAChBjB,MAAO2B,EAAE3B,KAAK,EAAI,YAClB1D,EACAjD,MACAC,CACF,GACC4G,SAAS,GACRyB,EAAER,KAAK,EAAE1G,QAAQ,AACnB,MAAM,EAAA,EAAE,CACLqF,MAAM,CAAC,EAAA,QAAQ,EACfC,MAAM,CAAC+B,MAAMC,IAAI,CAAC,IAAIjF,IAAI6E,EAAER,KAAK,GAAG7G,GAAG,CAAC,AAACoI,IAAU,CAAEpF,EAAH,KAAWqF,EAAQzH,EAAE,MAAEwH,EAAK,CAAC,GAEpFT,EAAUtF,GAAG,CAAC4F,EAAKI,EAAQzH,EAAE,EAC7B,MAAM,CAAA,EAAA,EAAA,WAAA,AAAW,EAACyH,EAAQzH,EAAE,CAC9B,CACF,CAGA,IAAK,IAAMyG,KAAKE,EAAY,CAC1B,IAAMtH,EAAS0H,EAAU3D,GAAG,CAACqD,EAAEtF,KAAK,CAACuF,WAAW,IAChD,GAAKrH,CAAD,CACJ,IAAK,EADQ,EACFqI,KAAOjB,EAAEL,OAAO,EAAI,EAAE,CAAE,CACjC,IAAM9G,EAAOyH,EAAU3D,GAAG,CAACsE,EAAIhE,IAAI,GAAGgD,WAAW,IAC5CpH,GAAQA,IAASD,GAKlB,CAJQ,AAIPsI,IALyB,EACZ,EAAA,EAAE,CAACvH,KAAK,CAAC2C,IAAI,CAACT,SAAS,CAAC,CACxC/B,MAAO,CAACC,EAAG,KAAEwC,CAAG,IAAEvC,CAAE,CAAE,GACpBuC,EAAIvC,EAAGD,EAAEnB,MAAM,CAAEA,GAASoB,EAAGD,EAAElB,IAAI,CAAEA,GAAOmB,EAAGD,EAAEyC,IAAI,CAAE,WAC3D,IAEE,MAAM,EAAA,EAAE,CACL2B,MAAM,CAAC,EAAA,IAAI,EACXC,MAAM,CAAC,QAAExF,OAAQC,EAAM2D,KAAM,SAAU,GACvC2E,KAAK,CAAC,KAAO,EAJbD,CAKP,CACF,CAEA,OAAOhB,EAAWpH,MAAM,AAC1B,CAOO,eAAesI,EAAgBpE,CAMrC,EACC,IAAMtD,EAAQ,MAAM,EAAA,EAAE,CAACC,KAAK,CAACC,IAAI,CAACC,QAAQ,CAAC,CAAEC,MAAO,CAACC,EAAG,IAAEC,CAAE,CAAE,GAAKA,EAAGD,EAAEE,IAAI,CAAE,UAAW,GACrFoH,EAASrE,EAAMzD,EAAE,CAAGG,EAAMyD,IAAI,CAAC,AAAC5C,GAAMA,EAAEhB,EAAE,GAAKyD,EAAMzD,EAAE,OAAImF,EAC/D,GAAI,CAAC2C,GAAUrE,EAAMtC,KAAK,CAAE,CAC1B,GAAM,MAAE4C,CAAI,YAAEC,CAAU,CAAE,CAAG,CAAA,EAAA,EAAA,YAAA,AAAY,EACvCP,EAAMtC,KAAK,CACXhB,EAAMf,GAAG,CAAE4B,AAAD,IAAQ,AAAD,CAAGhB,GAAIgB,EAAEhB,EAAE,CAAEmB,MAAOH,EAAEG,KAAK,CAAC,CAAC,GAEhD,GAAI4C,EAAM+D,EAAS3H,EAAMyD,IAAI,CAAC,AAAC5C,GAAMA,EAAEhB,EAAE,GAAK+D,EAAK/D,EAAE,OAChD,GAAIgE,EAAWzE,MAAM,CAAE,MAAO,CAAE2F,IAAI,aAAOlB,CAAW,CAC7D,CACA,GAAI,CAAC8D,EAAQ,MAAO,CAAE5C,IAAI,CAAM,EAShC,GARA,MAAM,EAAA,EAAE,CACL1D,MAAM,CAAC,EAAA,IAAI,EACXC,GAAG,CAAC,CAAEqD,MAAOrB,EAAMsE,WAAW,CAAE3G,OAAQ,MAAO,GAC/Cb,KAAK,CAAC,CAAA,EAAA,EAAA,EAAA,AAAE,EAAC,EAAA,IAAI,CAACP,EAAE,CAAE8H,EAAO9H,EAAE,GAC9B,MAAM,CAAA,EAAA,EAAA,WAAW,AAAX,EAAY8H,EAAO9H,EAAE,EAC3B,MAAM0B,EAAkBoG,EAAO9H,EAAE,EAG7ByD,EAAMwC,KAAK,EAAE1G,OAEf,CAFuB,GAElB,IAAMiI,KADGZ,GACKoB,GADCnB,GACM,CADF,CAAC,IAAIjF,IAAI6B,EAAMwC,KAAK,CAAC7G,GAAG,CAACgG,GAAerE,MAAM,CAACkH,WAErE,MAAM,EAAA,EAAE,CACLrD,MAAM,CAAC,EAAA,QAAQ,EACfC,MAAM,CAAC,CAAEzC,OAAQ0F,EAAO9H,EAAE,MAAEwH,CAAK,GACjCU,mBAAmB,CAAC,CAAEJ,OAAQ,CAAC,EAAA,QAAQ,CAAC1F,MAAM,CAAE,EAAA,QAAQ,CAACoF,IAAI,CAAE,AAAD,GAmBrE,OAZA,MAAM,EAAA,EAAE,CACLhG,MAAM,CAAC,EAAA,UAAU,EACjBC,GAAG,CAAC,CAAExB,iBAAkB,IAAK,GAC7BM,KAAK,CAAC,CAAA,EAAA,EAAA,EAAA,AAAE,EAAC,EAAA,UAAU,CAACN,gBAAgB,CAAE6H,EAAO9H,EAAE,GAI9CyD,EAAM0E,YAAY,EAAE5I,QAAQ,AAC9B,MAAM8G,EAA6B5C,EAAM0E,YAAY,EAGvD,MAAM,CAAA,EAAA,EAAA,WAAA,AAAW,IACV,CAAEjD,IAAI,EAAMlF,GAAI8H,EAAO9H,EAAE,AAAC,CACnC,CAGO,eAAeoI,EAAW3E,CAIhC,EACC,IAAMwC,EAAQW,MAAMC,IAAI,CAAC,IAAIjF,IAAK6B,AAAD,GAAOwC,KAAK,EAAI,EAAA,AAAE,EAAE7G,GAAG,CAACgG,GAAerE,MAAM,CAACkH,WACzE9H,EAAQ,MAAM,EAAA,EAAE,CAACC,KAAK,CAACC,IAAI,CAACC,QAAQ,CAAC,CAAEC,MAAO,CAACC,EAAG,CAAEC,IAAE,CAAE,GAAKA,EAAGD,EAAEE,IAAI,CAAE,UAAW,GAErFoH,EAASrE,EAAMzD,EAAE,CAAGG,EAAMyD,IAAI,CAAC,AAAC5C,GAAMA,EAAEhB,EAAE,GAAKyD,EAAMzD,EAAE,OAAImF,EAC/D,GAAI,CAAC2C,GAAUrE,EAAMtC,KAAK,CAAE,CAC1B,GAAM,MAAE4C,CAAI,CAAEC,YAAU,CAAE,CAAG,CAAA,EAAA,EAAA,YAAA,AAAY,EACvCP,EAAMtC,KAAK,CACXhB,EAAMf,GAAG,CAAC,AAAC4B,IAAM,AAAC,CAAEhB,GAAIgB,EAAEhB,EAAE,CAAEmB,MAAOH,EAAEG,KAAK,CAAC,CAAC,GAEhD,GAAI4C,EAAM+D,EAAS3H,EAAMyD,IAAI,CAAC,AAAC5C,GAAMA,EAAEhB,EAAE,GAAK+D,EAAK/D,EAAE,OAChD,GAAIgE,EAAWzE,MAAM,CAAE,MAAO,CAAE2F,IAAI,aAAOlB,CAAW,CAC7D,CACA,GAAI,CAAC8D,EAAQ,MAAO,CAAE5C,GAAI,EAAM,EAEhC,IAAK,IAAMsC,KAAQvB,EACjB,IADwB,EAClB,EAAA,EAAE,CACLrB,MAAM,CAAC,EAAA,QAAQ,EACfC,MAAM,CAAC,CAAEzC,OAAQ0F,EAAO9H,EAAE,MAAEwH,CAAK,GACjCU,mBAAmB,CAAC,CAAEJ,OAAQ,CAAC,EAAA,QAAQ,CAAC1F,MAAM,CAAE,EAAA,QAAQ,CAACoF,IAAI,CAAC,AAAC,EAEpE,OAAM,CAAA,EAAA,EAAA,WAAW,AAAX,IACN,IAAMa,EAAY,AAChB,OAAM,EAAA,EAAE,CAACC,MAAM,CAAC,CAAEtH,EAAG,CAAA,EAAA,EAAA,KAAA,AAAK,GAAG,GAAG6F,IAAI,CAAC,EAAA,QAAQ,EAAEtG,KAAK,CAAC,CAAA,EAAA,EAAA,EAAE,AAAF,EAAG,EAAA,QAAQ,CAAC6B,MAAM,CAAE0F,EAAO9H,EAAE,EAAA,CACpF,AAAC,CAAC,EAAE,CAACgB,CAAC,CACN,MAAO,CAAEkE,IAAI,EAAMlF,GAAI8H,EAAO9H,EAAE,CAAEuI,MAAOF,CAAU,CACrD,CAwBO,eAAeG,EAAiB/E,CAItC,EACC,IAIIjB,EAJEiG,EAAQhF,EAAMgF,GAIKtD,EAJA,CAACpE,MAAM,CAAC,AAACtC,GAAMA,EAAE0C,KAAK,CAACuC,IAAI,IACpD,GAAI,CAAC+E,EAAMlJ,MAAM,CAAE,MAAO,CAAE2F,IAAI,EAAOwD,OAAQ,UAAW,EAI1D,GAAIjF,EAAMxC,QAAQ,CAChBuB,CADkB,CACT,MAAM,EAAA,EAAE,CAACpC,KAAK,CAACC,IAAI,CAACiC,SAAS,CAAC,CAAE/B,MAAO,CAACC,EAAG,IAAEC,CAAE,CAAE,GAAKA,EAAGD,EAAER,EAAE,CAAEyD,EAAMxC,QAAQ,CAAG,QACpF,GAAIwC,EAAMkF,WAAW,EAAIlF,EAAMkF,WAAW,CAACjF,IAAI,GAAI,CACxD,IAAMM,EAAa,MAAM,EAAA,EAAE,CAAC5D,KAAK,CAACC,IAAI,CAACC,QAAQ,CAAC,CAC9CC,MAAO,CAACC,EAAG,QAAEoI,CAAM,CAAE,GAAKA,EAAOpI,EAAES,QAAQ,EAC3CsB,QAAS,CAAEvC,IAAI,EAAMmB,MAAO,GAAMqD,SAAS,EAAMpD,QAAQ,CAAK,CAChE,GACM,MAAE2C,CAAI,CAAEC,WAAY6E,CAAG,CAAE,CAAG,CAAA,EAAA,EAAA,YAAA,AAAY,EAC5CpF,EAAMkF,WAAW,CAACjF,IAAI,GACtBM,EAAW5E,GAAG,CAAC,AAACqH,IAAM,AAAC,CACrBzG,GAAIyG,EAAEzG,EAAE,CACRmB,MAAOsF,EAAEtF,KAAK,CACdqD,QAASiC,EAAEjC,OAAO,CAClBpD,OAAQqF,EAAErF,MAAM,CAClB,CAAC,GAEH,GAAI2C,EAAMvB,EAAS,MAAM,EAAA,EAAE,CAACpC,KAAK,CAACC,IAAI,CAACiC,SAAS,CAAC,CAAE/B,MAAO,CAACC,EAAG,IAAEC,CAAE,CAAE,GAAKA,EAAGD,EAAER,EAAE,CAAE+D,EAAK/D,EAAE,CAAE,QACtF,GAAI6I,EAAItJ,MAAM,CAAE,MAAO,CAAE2F,IAAI,EAAOwD,OAAQ,YAAa1E,WAAY6E,CAAI,CAChF,CACA,GAAI,CAACrG,EAAQ,MAAO,CAAE0C,IAAI,EAAOwD,OAAQ,kBAAmB,EAC5D,IAAMI,EAAatG,EAIbC,EAAW,MAAM,EAAA,EAAE,CAACrC,KAAK,CAACC,IAAI,CAACC,QAAQ,CAAC,CAC5CC,MAAO,CAACC,EAAG,IAAEC,CAAE,CAAE,GAAKA,EAAGD,EAAES,QAAQ,CAAE6H,EAAW9I,EAAE,EAClDuC,QAAS,CAAEvC,IAAI,EAAMmB,OAAO,CAAK,CACnC,GACM4H,EAAON,EAAM1H,MAAM,CAAC,AAACiI,GAAO,CAAA,EAAA,EAAA,YAAY,AAAZ,EAAaA,EAAG7H,KAAK,CAACuC,IAAI,GAAIjB,GAAUsB,IAAI,EAC9E,GAAIgF,EAAKxJ,MAAM,CACb,CADe,KACR,CACL2F,IAAI,EACJwD,OAAQ,YACRrE,QACE,CAAC,uCAAuC,EAAEyE,EAAW3H,KAAK,CAAC,AAC3D,GAD8D,AAC9D,EAAG4H,EAAK3J,GAAG,CAAC,AAAC8H,GAAM,CAAC,CAAC,EAAEA,EAAE/F,KAAK,CAACuC,IAAI,GAAG,CAAC,CAAC,EAAExE,IAAI,CAAC,MAAM,yDAAE,CAAC,AAE5D,AAHmE,EAQrE,CANM,AADA,GAOA+J,EAAY,CAChB,MAAM,EAAA,EAAE,CAAC7I,KAAK,CAACC,IAAI,CAACC,QAAQ,CAAC,CAC3BC,MAAO,CAACC,EAAG,IAAEC,CAAE,CAAE,GAAKA,EAAGD,EAAEE,IAAI,CAAEoI,EAAWpI,IAAI,EAChD6B,QAAS,CAAEpE,GAAG,EAAMC,GAAG,CAAK,CAC9B,EAAA,CACF,CAAEgB,GAAG,CAAC,AAAC4B,IAAM,AAAC,CAAE7C,EAAG6C,EAAE7C,CAAC,CAAEC,EAAG4C,EAAE5C,CAAC,AAAC,CAAC,GAC1BqJ,EAAgD,EAAE,CACxD,IAAK,IAAIhJ,EAAI,EAAGA,EAAIgK,EAAMlJ,MAAM,CAAEd,IAAK,CACrC,IAAMuK,EAAKP,CAAK,CAAChK,EAAE,CACbD,EAAM,CAAA,EAAA,EAAA,mBAAA,AAAmB,EAACyK,EAAW,CAAE9K,EAAG2K,EAAW3K,CAAC,CAAO,IAAJM,EAASL,EAAG0K,EAAW1K,CAAC,CAAG,GAAI,GAC9F6K,EAAU3F,IAAI,CAAC9E,GACf,IAAMwC,EAAI,MAAM,CAAA,EAAA,EAAA,UAAA,AAAU,EAAC,CACzBN,KAAMoI,EAAWpI,IAAI,CACrBS,MAAO6H,EAAG7H,KAAK,CAACuC,IAAI,GACpBoB,MAAOkE,EAAGlE,KAAK,EAAI,KACnBN,QAASsE,EAAWtE,OAAO,EAAI,KAC/BvD,SAAU6H,EAAW9I,EAAE,CACvB7B,EAAGK,EAAIL,CAAC,CACRC,EAAGI,EAAIJ,CAAC,AACV,GACAqJ,EAAQnE,IAAI,CAAC,CAAEtD,GAAIgB,EAAEhB,EAAE,CAAEmB,MAAOH,EAAEG,KAAK,AAAC,EAC1C,CAMA,OAFIsG,EAAQlI,MAAM,EAAE,MAAMmC,EAAkB+F,CAAO,CAAC,EAAE,CAACzH,EAAE,EACzD,MAAM,CAAA,EAAA,EAAA,WAAA,AAAW,IACV,CAAEkF,IAAI,EAAM1C,OAAQ,CAAExC,GAAI8I,EAAW9I,EAAE,CAAEmB,MAAO2H,EAAW3H,KAAK,AAAC,EAAGsG,SAAQ,CACrF,gDC3mBA,IAAA,EAAA,EAAA,CAAA,CAAA,OAEO,IAAMyB,EAAO,EAAA,CAAC,CAACC,IAAI,CAAC,CAAC,UAAW,eAAe,EAEzCC,EAAc,EAAA,CAAC,CAACD,IAAI,CAAC,CAEhC,UACA,cACA,OACA,UACA,YACA,gBAEA,OACA,UACA,UACA,OACD,EAEwB,EAAA,CAAC,CAACA,IAAI,CAAC,CAAC,UAAW,WAAY,UAAW,WAAW,EAEvE,IAAMG,EAAmB,EAAA,CAAC,CAAC3D,MAAM,CAAC,CACvCjF,KAAMwI,EACN/H,MAAO,EAAA,CAAC,CAACyE,MAAM,GAAGlC,IAAI,GAAGmC,GAAG,CAAC,GAAGsB,GAAG,CAAC,KACpC3C,QAAS,EAAA,CAAC,CAACoB,MAAM,GAAGlC,IAAI,GAAGyD,GAAG,CAAC,IAAInB,OAAO,GAC1CD,KAAM,EAAA,CAAC,CAACH,MAAM,GAAGlC,IAAI,GAAGyD,GAAG,CAAC,KAAKnB,OAAO,GACxClB,MAAO,EAAA,CAAC,CAACc,MAAM,GAAGlC,IAAI,GAAGyD,GAAG,CAAC,KAAMnB,OAAO,GAC1C/E,SAAU,EAAA,CAAC,CAAC2E,MAAM,GAAGI,OAAO,GAC5B5E,OAAQgI,EAAYjD,QAAQ,GAC5BoD,SAAU,EAAA,CAAC,CAACC,MAAM,GAAGC,GAAG,GAAG5D,GAAG,CAAC,GAAGsB,GAAG,CAAC,GAAGhB,QAAQ,GACjDhI,EAAG,EAAA,CAAC,CAACqL,MAAM,GAAGrD,QAAQ,GACtB/H,EAAG,EAAA,CAAC,CAACoL,MAAM,GAAGrD,QAAQ,GACtBuD,UAAW,EAAA,CAAC,CAAC9D,MAAM,GAAGlC,IAAI,GAAGyD,GAAG,CAAC,KAAKnB,OAAO,EAC/C,GAGa2D,EAAmB,EAAA,CAAC,CAAChE,MAAM,CAAC,CACvCxE,MAAO,EAAA,CAAC,CAACyE,MAAM,GAAGlC,IAAI,GAAGmC,GAAG,CAAC,GAAGsB,GAAG,CAAC,KAAKhB,QAAQ,GACjDJ,KAAM,EAAA,CAAC,CAACH,MAAM,GAAGlC,IAAI,GAAGyD,GAAG,CAAC,KAAKnB,OAAO,GACxClB,MAAO,EAAA,CAAC,CAACc,MAAM,GAAGlC,IAAI,GAAGyD,GAAG,CAAC,KAAMnB,OAAO,GAC1CxB,QAAS,EAAA,CAAC,CAACoB,MAAM,GAAGlC,IAAI,GAAGyD,GAAG,CAAC,IAAInB,OAAO,GAC1C5E,OAAQgI,EAAYjD,QAAQ,GAC5BoD,SAAU,EAAA,CAAC,CAACC,MAAM,GAAGC,GAAG,GAAG5D,GAAG,CAAC,GAAGsB,GAAG,CAAC,GAAGhB,QAAQ,GACjDuD,UAAW,EAAA,CAAC,CAAC9D,MAAM,GAAGlC,IAAI,GAAGyD,GAAG,CAAC,KAAKnB,OAAO,EAC/C,GAGa4D,EAAiB,EAAA,CAAC,CAACjE,MAAM,CAAC,CACrCxH,EAAG,EAAA,CAAC,CAACqL,MAAM,GACXpL,EAAG,EAAA,CAAC,CAACoL,MAAM,EACb,GAEaK,EAAmB,EAAA,CAAC,CAAClE,MAAM,CAAC,CACvCtG,OAAQ,EAAA,CAAC,CAACuG,MAAM,GAAGC,GAAG,CAAC,GACvBvG,KAAM,EAAA,CAAC,CAACsG,MAAM,GAAGC,GAAG,CAAC,GACrB5C,KAAM,EAAA,CAAC,CAACkG,IAAI,CAAC,CAAC,UAAW,UAAW,WAAW,EAAEhD,QAAQ,GACzD2D,MAAO,EAAA,CAAC,CAAClE,MAAM,GAAGlC,IAAI,GAAGyD,GAAG,CAAC,IAAInB,OAAO,GAExC+D,aAAc,EAAA,CAAC,CAACnE,MAAM,GAAGlC,IAAI,GAAGyD,GAAG,CAAC,IAAInB,OAAO,GAC/CgE,aAAc,EAAA,CAAC,CAACpE,MAAM,GAAGlC,IAAI,GAAGyD,GAAG,CAAC,IAAInB,OAAO,EACjD,0UC5DA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,6CAiBA,IAAMiE,EAAkB,IAAIrI,IAAI,CAAC,QAAS,OAAQ,QAAS,UAAU,EAE9D,eAAesI,EAAWzG,CAAsB,EACrD,IAAM0G,EAAO,EAAA,gBAAgB,CAACvK,KAAK,CAAC6D,GAC9B2G,EAAgBD,AAAc,mBAATzJ,IAAI,CAAsB,UAAY,UAC3D,CAAC+G,EAAQ,CAAG,MAAM,EAAA,EAAE,CACvB7C,MAAM,CAAC,EAAA,IAAI,EACXC,MAAM,CAAC,CACNnE,KAAMyJ,EAAKzJ,IAAI,CACfS,MAAOgJ,EAAKhJ,KAAK,CACjBqD,QAAS2F,EAAK3F,OAAO,EAAI,KACzBuB,KAAMoE,EAAKpE,IAAI,EAAI,KACnBjB,MAAOqF,EAAKrF,KAAK,EAAI,KACrB7D,SAAUkJ,EAAKlJ,QAAQ,EAAI,KAC3BG,OAAQ+I,EAAK/I,MAAM,EAAIgJ,EACvBb,SAAUY,EAAKZ,QAAQ,EAAI,EAC3BpL,EAAGgM,EAAKhM,CAAC,EAAI,EACbC,EAAG+L,EAAK/L,CAAC,EAAI,EACbsL,UAAWS,EAAKT,SAAS,EAAI,IAC/B,GACC1E,SAAS,GAEZ,OADA,MAAM,CAAA,EAAA,EAAA,WAAA,AAAW,EAACyC,EAAQzH,EAAE,EACrByH,CACT,CAKO,eAAe4C,EAAW5G,CAAsB,EACrD,IAAM0G,EAAO,EAAA,gBAAgB,CAACvK,KAAK,CAAC6D,GACpC,GAAI0G,EAAK9K,MAAM,GAAK8K,EAAK7K,IAAI,CAAE,MAAM,AAAIqE,MAAM,yBAC/C,IAAMV,EAAOkH,EAAKlH,IAAI,EAAI,UACpB3E,EAAW,MAAM,EAAA,EAAE,CAAC8B,KAAK,CAAC2C,IAAI,CAACT,SAAS,CAAC,CAC7C/B,MAAO,CAAC5B,EAAG,CAAEqE,IAAKjF,CAAC,CAAE0C,GAAI6J,CAAG,CAAE,GAC5BvM,EAAEuM,EAAI3L,EAAEU,MAAM,CAAE8K,EAAK9K,MAAM,EAAGiL,EAAI3L,EAAEW,IAAI,CAAE6K,EAAK7K,IAAI,EAAGgL,EAAI3L,EAAEsE,IAAI,CAAEA,GACtE,GACA,GAAI3E,EAAU,OAAOA,EACrB,GAAM,CAACmJ,EAAQ,CAAG,MAAM,EAAA,EAAE,CACvB7C,MAAM,CAAC,EAAA,IAAI,EACXC,MAAM,CAAC,CACNxF,OAAQ8K,EAAK9K,MAAM,CACnBC,KAAM6K,EAAK7K,IAAI,MACf2D,EACA6G,MAAOK,EAAKL,KAAK,EAAI,KACrBC,aAAcI,EAAKJ,YAAY,EAAI,KACnCC,aAAcG,EAAKH,YAAY,EAAI,IACrC,GACChF,SAAS,GACZ,OAAOyC,CACT,CAEO,eAAe8C,EAAWvK,CAAU,CAAEyD,CAAsB,EACjE,IAAM0G,EAAO,EAAA,gBAAgB,CAACvK,KAAK,CAAC6D,GAC9B,CAAC+G,EAAQ,CAAG,MAAM,EAAA,EAAE,CAAChJ,MAAM,CAAC,EAAA,IAAI,EAAEC,GAAG,CAAC0I,GAAM5J,KAAK,CAAC,CAAA,EAAA,EAAA,EAAA,AAAE,EAAC,EAAA,IAAI,CAACP,EAAE,CAAEA,IAAKgF,SAAS,GAOlF,OAJwB0F,AACpBD,OAD2BE,IAAI,CAACR,GAAMzL,IAAI,CAAC,AAACkM,GAAMX,EAAgB9H,GAAG,CAACyI,KACrD,MAAM,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC5K,QAEnBmF,IAAhBgF,EAAK/I,MAAM,EAAgB,MAAM,CAAA,EAAA,EAAA,iBAAA,AAAiB,EAACpB,GAChDwK,CACT,CA+BO,eAAeQ,EAAWhL,CAAU,EACzC,GAAM,CAACiL,EAAQ,CAAG,MAAM,EAAA,EAAE,CAAC1D,MAAM,CAAC,EAAA,IAAI,EAAEhH,KAAK,CAAC,CAAA,EAAA,EAAA,EAAE,AAAF,EAAG,EAAA,IAAI,CAACP,EAAE,CAAEA,IAAKgF,SAAS,GACxE,OAAOiG,CACT,CAEO,eAAeC,EAAmBlL,CAAU,CAAE7B,CAAS,CAAEC,CAAS,EACvE,IAAMI,EAAM,EAAA,cAAc,CAACoB,KAAK,CAAC,GAAEzB,IAAGC,CAAE,GAClC,CAACoM,EAAQ,CAAG,MAAM,EAAA,EAAE,CAAChJ,MAAM,CAAC,EAAA,IAAI,EAAEC,GAAG,CAACjD,GAAK+B,KAAK,CAAC,CAAA,EAAA,EAAA,EAAA,AAAE,EAAC,EAAA,IAAI,CAACP,EAAE,CAAEA,IAAKgF,SAAS,GACjF,OAAOwF,CACT,CAIO,eAAeW,EAAoBC,CAA4C,EAOpF,OANA,MAAM7H,QAAQX,GAAG,CACfwI,EAAKhM,GAAG,CAAC,AAACiM,IACR,IAAM7M,EAAM,EAAA,cAAc,CAACoB,KAAK,CAAC,CAAEzB,EAAGkN,EAAElN,CAAC,CAAEC,EAAGiN,EAAEjN,CAAC,AAAC,GAClD,OAAO,EAAA,EAAE,CAACoD,MAAM,CAAC,EAAA,IAAI,EAAEC,GAAG,CAACjD,GAAK+B,KAAK,CAAC,CAAA,EAAA,EAAA,EAAA,AAAE,EAAC,EAAA,IAAI,CAACP,EAAE,CAAEqL,EAAErL,EAAE,EACxD,IAEKoL,EAAK7L,MACd,AADoB,CAKb,eAAe+L,EAAsBtL,CAAU,CAAE7B,CAAS,CAAEC,CAAS,EAC1E,IAAMI,EAAM,EAAA,cAAc,CAACoB,KAAK,CAAC,GAAEzB,IAAGC,CAAE,GAClC,CAACoM,EAAQ,CAAG,MAAM,EAAA,EAAE,CAAChJ,MAAM,CAAC,EAAA,OAAO,EAAEC,GAAG,CAACjD,GAAK+B,KAAK,CAAC,CAAA,EAAA,EAAA,EAAA,AAAE,EAAC,EAAA,OAAO,CAACP,EAAE,CAAEA,IAAKgF,SAAS,GACvF,OAAOwF,CACT,CAEO,eAAee,EAAuBvL,CAAU,CAAE7B,CAAS,CAAEC,CAAS,EAC3E,IAAMI,EAAM,EAAA,cAAc,CAACoB,KAAK,CAAC,GAAEzB,IAAGC,CAAE,GAClC,CAACoM,EAAQ,CAAG,MAAM,EAAA,EAAE,CAAChJ,MAAM,CAAC,EAAA,QAAQ,EAAEC,GAAG,CAACjD,GAAK+B,KAAK,CAAC,CAAA,EAAA,EAAA,EAAA,AAAE,EAAC,EAAA,QAAQ,CAACP,EAAE,CAAEA,IAAKgF,SAAS,GACzF,OAAOwF,CACT"}
@@ -0,0 +1,7 @@
1
+ module.exports=[39513,e=>{"use strict";let t=new Set(["GET","HEAD","OPTIONS"]);e.s(["accessForMethod",0,function(e){return t.has(e.trim().toUpperCase())?"read":"write"}])},23737,e=>e.a(async(t,n)=>{try{var a=e.i(66680),o=e.i(2157),i=e.i(50227),l=e.i(69719),r=e.i(75225),s=e.i(91426),d=e.i(34700),m=e.i(38752),u=e.i(94930),p=e.i(6659),c=e.i(39513),f=e.i(96902),b=t([s,p,f]);function h(){return(0,i.join)((0,m.dataDir)(),"draft.json")}function g(){return(0,i.join)((0,m.dataDir)(),"draft-verdict.json")}function $(){try{return JSON.parse((0,o.readFileSync)(h(),"utf8"))}catch{return null}}function y(){(0,o.rmSync)(h(),{force:!0})}function w(e){let t=new Map(e.tables.map(e=>[e.id,e.name])),n=["## Approved schema","","### Tables"];for(let t of e.tables)for(let e of(n.push(`- **${t.name}**${t.domain?` (${t.domain})`:""}`),t.columns)){let t=[e.isPk&&"PK",e.isFk&&"FK",e.nullable?"NULL":"NOT NULL"].filter(Boolean).join(" ");n.push(` - ${e.name} ${e.type}${t?` ${t}`:""}${e.note?` — ${e.note}`:""}`)}if(e.relations.length)for(let a of(n.push("","### Relations (FKs)"),e.relations)){let e=t.get(a.fromTableId)??a.fromTableId,o=t.get(a.toTableId)??a.toTableId;n.push(`- ${e}.${a.fromColumn} → ${o}.${a.toColumn}`)}if(e.endpoints.length)for(let a of(n.push("","### Endpoints"),e.endpoints)){let e=a.links.map(e=>`${t.get(e.tableId)??e.tableId} (${e.access})`).join(", ");n.push(`- ${a.method} ${a.path}${e?` — ${e}`:""}`)}return n.join("\n")}function z(e){(0,u.writeJsonAtomic)(g(),e)}[s,p,f]=b.then?(await b)():b;let I=l.z.object({proposedAt:l.z.number(),status:l.z.string(),tables:l.z.array(l.z.object({id:l.z.string(),name:l.z.string().trim().min(1),domain:l.z.string().nullable(),description:l.z.string().nullable(),x:l.z.number(),y:l.z.number(),columns:l.z.array(l.z.object({name:l.z.string().trim().min(1),type:l.z.string(),isPk:l.z.boolean(),isFk:l.z.boolean(),nullable:l.z.boolean(),note:l.z.string().nullable()}))})),relations:l.z.array(l.z.object({id:l.z.string(),fromTableId:l.z.string(),toTableId:l.z.string(),fromColumn:l.z.string(),toColumn:l.z.string(),label:l.z.string().nullable()})),endpoints:l.z.array(l.z.object({id:l.z.string(),method:l.z.string().trim().min(1),path:l.z.string().trim().min(1),domain:l.z.string().nullable(),description:l.z.string().nullable(),x:l.z.number(),y:l.z.number(),links:l.z.array(l.z.object({tableId:l.z.string(),access:l.z.string()}))}))});async function T(e,t=s.db){let n=I.parse(e),a=new Map(n.tables.map(e=>[e.id,e.name])),o=new Map;for(let e of n.tables){let[n]=await t.insert(d.dbTable).values({name:e.name,domain:e.domain,description:e.description,source:"MANUAL",x:e.x,y:e.y}).onConflictDoUpdate({target:d.dbTable.name,set:{domain:e.domain,description:e.description}}).returning();o.set(e.name,n.id),await t.delete(d.dbColumn).where((0,r.eq)(d.dbColumn.tableId,n.id)),e.columns.length&&await t.insert(d.dbColumn).values(e.columns.map((e,t)=>({tableId:n.id,name:e.name,type:e.type,isPk:e.isPk,isFk:e.isFk,nullable:e.nullable,note:e.note,ord:t})))}let i=async e=>{let n=a.get(e);if(n)return o.get(n)??null;let i=await t.query.dbTable.findFirst({where:(t,{eq:n})=>n(t.id,e)}).catch(()=>null);return i?i.id:null};for(let e of n.relations){let n=await i(e.fromTableId),a=await i(e.toTableId);n&&a&&(await t.query.dbRelation.findFirst({where:(t,{and:o,eq:i})=>o(i(t.fromTableId,n),i(t.toTableId,a),i(t.fromColumn,e.fromColumn),i(t.toColumn,e.toColumn))})||await t.insert(d.dbRelation).values({fromTableId:n,toTableId:a,fromColumn:e.fromColumn,toColumn:e.toColumn,label:e.label}))}for(let e of n.endpoints){let[n]=await t.insert(d.endpoint).values({method:e.method,path:e.path,domain:e.domain,description:e.description,source:"MANUAL",x:e.x,y:e.y}).onConflictDoUpdate({target:[d.endpoint.method,d.endpoint.path],set:{domain:e.domain,description:e.description}}).returning();for(let a of(await t.delete(d.endpointTable).where((0,r.eq)(d.endpointTable.endpointId,n.id)),e.links)){let e=await i(a.tableId);e&&await t.insert(d.endpointTable).values({endpointId:n.id,tableId:e,access:a.access}).catch(()=>{})}}let l=`${n.tables.length} table(s), ${n.relations.length} relation(s) and ${n.endpoints.length} endpoint(s) approved and persisted to the schema.`;return z({proposedAt:n.proposedAt,status:"approved",summary:l,detail:w(n)}),y(),await (0,p.bumpVersion)(t),{tables:n.tables.length,relations:n.relations.length,endpoints:n.endpoints.length}}async function k(e=s.db){let t=await e.query.endpoint.findMany({with:{tables:!0}}),n=0;for(let a of t)if("write"===(0,c.accessForMethod)(a.method))for(let t of a.tables)"read"===t.access&&(await e.update(d.endpointTable).set({access:"write"}).where((0,r.eq)(d.endpointTable.id,t.id)),n++);return n}e.s(["approveDraft",0,T,"backfillEndpointAccess",0,k,"clearDraftDoc",0,y,"describeApprovedDoc",0,w,"diffDocs",0,function(e,t){let n=[],a=new Map(e.tables.map(e=>[e.name,e])),o=new Map(t.tables.map(e=>[e.name,e]));for(let e of t.tables)a.has(e.name)||n.push(`added table **${e.name}**`);for(let t of e.tables)o.has(t.name)||n.push(`removed table **${t.name}**`);for(let e of t.tables){let t=a.get(e.name);if(!t)continue;let o=new Map(t.columns.map(e=>[e.name,e])),i=new Map(e.columns.map(e=>[e.name,e]));for(let t of e.columns){let a=o.get(t.name);if(!a){n.push(`added column **${e.name}.${t.name}** (${t.type})`);continue}let i=[];a.type!==t.type&&i.push(`type ${a.type} → ${t.type}`),a.isPk!==t.isPk&&i.push(t.isPk?"now PK":"no longer PK"),a.isFk!==t.isFk&&i.push(t.isFk?"now FK":"no longer FK"),a.nullable!==t.nullable&&i.push(t.nullable?"now accepts NULL":"now NOT NULL"),(a.note??"")!==(t.note??"")&&i.push(`note: "${t.note??""}"`),i.length&&n.push(`changed **${e.name}.${t.name}** — ${i.join("; ")}`)}for(let a of t.columns)i.has(a.name)||n.push(`removed column **${e.name}.${a.name}** (was ${a.type})`)}let i=(e,t)=>`${t.get(e.fromTableId)??e.fromTableId}.${e.fromColumn}→${t.get(e.toTableId)??e.toTableId}.${e.toColumn}`,l=new Map(e.tables.map(e=>[e.id,e.name])),r=new Map(t.tables.map(e=>[e.id,e.name])),s=new Set(e.relations.map(e=>i(e,l))),d=new Set(t.relations.map(e=>i(e,r)));for(let e of d)s.has(e)||n.push(`added relation ${e}`);for(let e of s)d.has(e)||n.push(`removed relation ${e}`);let m=e=>`${e.method} ${e.path}`,u=new Map(e.endpoints.map(e=>[m(e),e])),p=new Map(t.endpoints.map(e=>[m(e),e]));for(let[e,t]of p)if(!u.has(e)){let a=t.links.map(e=>`${r.get(e.tableId)??e.tableId} (${e.access})`).join(", ");n.push(`added endpoint **${e}**${a?` — ${a}`:""}`)}for(let[e]of u)p.has(e)||n.push(`removed endpoint **${e}**`);return n},"discardDraft",0,function(){let e=$();e&&z({proposedAt:e.proposedAt,status:"discarded",summary:"The user discarded the draft."}),y()},"draftState",0,function(){let e=$();if(e)return{state:"pending",proposedAt:e.proposedAt};let t=function(){try{return JSON.parse((0,o.readFileSync)(g(),"utf8"))}catch{return null}}();return t?{state:t.status,proposedAt:t.proposedAt,summary:t.summary,detail:t.detail}:{state:"none"}},"purgeDraft",0,function(){(0,o.rmSync)(h(),{force:!0}),(0,o.rmSync)(g(),{force:!0})},"readDraftDoc",0,$,"writeProposal",0,function(e,t=0,n=Date.now()){let i=function(e,t,n=0){let o=new Map,i=(0,f.packTablesMasonry)(e.tables.map(e=>({key:e.name,columnCount:e.columns.length}))),l=0,r=e.tables.map(e=>{let t=(0,a.randomUUID)();o.set(e.name,t);let r=i.get(e.name)??{x:0,y:0};return l=Math.max(l,r.y+(0,f.estimateTableHeight)(e.columns.length)),{id:t,name:e.name,domain:e.domain??null,description:e.description??null,x:r.x,y:n+r.y,columns:e.columns.map(e=>({name:e.name,type:e.type,isPk:e.isPk??!1,isFk:e.isFk??!1,nullable:e.nullable??!0,note:e.note??null}))}}),s=e.relations.flatMap(e=>{let t=o.get(e.fromTable),n=o.get(e.toTable);return t&&n?[{id:(0,a.randomUUID)(),fromTableId:t,toTableId:n,fromColumn:e.fromColumn,toColumn:e.toColumn,label:e.label??`${e.fromColumn} → ${e.toTable}.${e.toColumn}`}]:[]}),d=n+l+280,m=e.endpoints.map((e,t)=>({id:(0,a.randomUUID)(),method:e.method,path:e.path,domain:e.domain??null,description:e.description??null,x:t%3*320+40,y:d+120*Math.floor(t/3),links:e.uses.flatMap(e=>{let t=o.get(e.table);return t?[{tableId:t,access:e.access}]:[]})}));return{proposedAt:t,status:"pending",tables:r,relations:s,endpoints:m}}(e,n,t);return(0,u.writeJsonAtomic)(h(),i),(0,o.rmSync)(g(),{force:!0}),i}]),n()}catch(e){n(e)}},!1),74005,e=>{"use strict";var t=e.i(2157),n=e.i(50227),a=e.i(38752),o=e.i(94930);function i(){return(0,n.join)((0,a.dataDir)(),"plan-meta.json")}e.s(["clearPlanMeta",0,function(){(0,t.rmSync)(i(),{force:!0})},"readPlanMeta",0,function(){try{return JSON.parse((0,t.readFileSync)(i(),"utf8"))}catch{return null}},"writePlanMeta",0,function(e){(0,o.writeJsonAtomic)(i(),e)}])},56715,e=>{"use strict";var t=e.i(2157),n=e.i(50227),a=e.i(38752),o=e.i(94930);function i(){return(0,n.join)((0,a.dataDir)(),"plan-annotations-current.json")}function l(){try{let e=JSON.parse((0,t.readFileSync)(i(),"utf8"));return{annotations:e.annotations??[],globalComment:e.globalComment??"",submitted:!!e.submitted,submittedAt:e.submittedAt,boardEdits:e.boardEdits??"",questions:e.questions??[]}}catch{return{annotations:[],globalComment:"",submitted:!1,questions:[]}}}function r(e){let t;return[function(e,t=""){let n=e.filter(e=>(e.kind??"comment")==="comment"&&e.comment.trim()),a=e.filter(e=>"deletion"===e.kind),o=t.trim();if(!n.length&&!a.length&&!o)return"";let i=[];if(o&&i.push(`## Overall feedback
2
+
3
+ ${o}`),n.length){let e=["## Inline comments",""];for(let t of n){let n=t.excerpt.split("\n").map(e=>`> ${e}`).join("\n");e.push(`${n}
4
+
5
+ ${t.comment.trim()}`)}i.push(e.join("\n"))}if(a.length){let e=["## Marked for deletion","","The user marked these passages for removal — drop them from the next plan:",""];for(let t of a){let n=t.excerpt.split("\n").map(e=>`> ${e}`).join("\n");e.push(n),e.push("")}i.push(e.join("\n").trim())}return i.join("\n\n").trim()}(e.annotations,e.globalComment),e.boardEdits??"",!(t=(e.questions??[]).filter(e=>e.question.trim())).length?"":["## Questions to answer before approving",...t.map(e=>`- **${e.target}** — ${e.question.trim()}`)].join("\n")].filter(Boolean).join("\n\n")}e.s(["clearStoredAnnotations",0,function(){(0,t.rmSync)(i(),{force:!0})},"readAnnotationFeedback",0,function(){let e=l();return{submitted:e.submitted,feedback:e.submitted?r(e):""}},"readStoredAnnotations",0,l,"renderAnnotationFeedback",0,r,"writeStoredAnnotations",0,function(e){(0,o.writeJsonAtomic)(i(),e)}],56715)}];
6
+
7
+ //# sourceMappingURL=lib_10tibe8._.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../lib/access.ts","../../../lib/draft-store.ts","../../../lib/plan-meta.ts","../../../lib/plan-annotations-store.ts","../../../lib/annotations.ts"],"sourcesContent":["// Read/write/read-write is a per-link field on an endpoint→table usage, NOT the HTTP\n// method. But when nobody sets it explicitly, the only sane default comes from the verb:\n// safe methods read, mutating methods write. Used as the default in the design schema,\n// for canvas-drawn links, and to repair endpoints that were stored before this existed.\n\nconst READ_METHODS = new Set([\"GET\", \"HEAD\", \"OPTIONS\"]);\n\nexport function accessForMethod(method: string): \"read\" | \"write\" {\n return READ_METHODS.has(method.trim().toUpperCase()) ? \"read\" : \"write\";\n}\n","import { randomUUID } from \"node:crypto\";\nimport { readFileSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { z } from \"zod\";\nimport { eq } from \"drizzle-orm\";\nimport { db, type DB } from \"@/lib/db-drizzle\";\nimport { dbTable, dbColumn, dbRelation, endpoint, endpointTable } from \"@/lib/drizzle/schema\";\nimport { dataDir } from \"@/lib/project\";\nimport { writeJsonAtomic } from \"@/lib/atomic-write\";\nimport { bumpVersion } from \"@/lib/ingest\";\nimport { accessForMethod } from \"@/lib/access\";\nimport { estimateTableHeight, packTablesMasonry } from \"@/lib/table-layout\";\nimport type { DraftGraph } from \"@/lib/design\";\nimport type { DraftDoc, DraftEndpointT, DraftTableT } from \"@/components/graph/db-types\";\n\n// The DB-designer draft lives as ONE JSON object on disk (dataDir()/draft.json) so a\n// Claude Code session can propose one and the browser can pick it up. The browser edits\n// it locally (undo/redo, connections) and only \"Aprovar\" writes it into the real schema.\n// A small verdict file records the last approve/discard so the blocking beacon_draft_table\n// MCP tool can poll the outcome and tell Claude to proceed.\n\ntype Prisma = DB;\n\nfunction draftPath(): string {\n return join(dataDir(), \"draft.json\");\n}\nfunction verdictPath(): string {\n return join(dataDir(), \"draft-verdict.json\");\n}\n\nexport function readDraftDoc(): DraftDoc | null {\n try {\n return JSON.parse(readFileSync(draftPath(), \"utf8\")) as DraftDoc;\n } catch {\n return null;\n }\n}\n\nfunction writeDoc(doc: DraftDoc): void {\n writeJsonAtomic(draftPath(), doc);\n}\n\n/**\n * Position a name-keyed proposal into a DraftDoc with stable ids + a grid layout.\n * `originY` shifts the whole draft down so it doesn't land on top of existing canvas content\n * (default 0 keeps the old behavior for tests and code paths that already pick a position).\n */\nexport function graphToDoc(graph: DraftGraph, proposedAt: number, originY = 0): DraftDoc {\n const idByName = new Map<string, string>();\n // Mirror the persisted /db layout: masonry pack the proposed tables so a tall draft\n // (10+ columns) doesn't render under its neighbour the moment it shows up on the canvas.\n const positions = packTablesMasonry(\n graph.tables.map((t) => ({ key: t.name, columnCount: t.columns.length })),\n );\n let bottom = 0;\n const tables: DraftTableT[] = graph.tables.map((t) => {\n const id = randomUUID();\n idByName.set(t.name, id);\n const p = positions.get(t.name) ?? { x: 0, y: 0 };\n bottom = Math.max(bottom, p.y + estimateTableHeight(t.columns.length));\n return {\n id,\n name: t.name,\n domain: t.domain ?? null,\n description: t.description ?? null,\n x: p.x,\n y: originY + p.y,\n columns: t.columns.map((c) => ({\n name: c.name,\n type: c.type,\n isPk: c.isPk ?? false,\n isFk: c.isFk ?? false,\n nullable: c.nullable ?? true,\n note: c.note ?? null,\n })),\n };\n });\n\n const relations = graph.relations.flatMap((r) => {\n const fromTableId = idByName.get(r.fromTable);\n const toTableId = idByName.get(r.toTable);\n if (!fromTableId || !toTableId) return [];\n return [\n {\n id: randomUUID(),\n fromTableId,\n toTableId,\n fromColumn: r.fromColumn,\n toColumn: r.toColumn,\n label: r.label ?? `${r.fromColumn} → ${r.toTable}.${r.toColumn}`,\n },\n ];\n });\n\n const baseY = originY + bottom + 280;\n const endpoints: DraftEndpointT[] = graph.endpoints.map((e, i) => ({\n id: randomUUID(),\n method: e.method,\n path: e.path,\n domain: e.domain ?? null,\n description: e.description ?? null,\n x: (i % 3) * 320 + 40,\n y: baseY + Math.floor(i / 3) * 120,\n links: e.uses.flatMap((u) => {\n const tableId = idByName.get(u.table);\n return tableId ? [{ tableId, access: u.access }] : [];\n }),\n }));\n\n return { proposedAt, status: \"pending\", tables, relations, endpoints };\n}\n\n/** A fresh proposal from Claude / the generator. Supersedes any prior draft + verdict.\n * `originY` (computed by callers via computeDraftOriginY) shifts the layout below the\n * existing canvas so a fresh draft doesn't land on top of real tables. */\nexport function writeProposal(graph: DraftGraph, originY = 0, now = Date.now()): DraftDoc {\n const doc = graphToDoc(graph, now, originY);\n writeDoc(doc);\n rmSync(verdictPath(), { force: true });\n return doc;\n}\n\nexport function clearDraftDoc(): void {\n rmSync(draftPath(), { force: true });\n}\n\n/** Wipe the draft + its verdict entirely (used by the destructive reset). */\nexport function purgeDraft(): void {\n rmSync(draftPath(), { force: true });\n rmSync(verdictPath(), { force: true });\n}\n\n// ── Verdict (so the blocking MCP tool learns the user's decision) ────────────\n\ninterface DraftVerdict {\n proposedAt: number;\n status: \"approved\" | \"discarded\";\n summary: string;\n detail?: string; // full approved schema (Claude reads the edited columns from here)\n}\n\n// A readable snapshot of exactly what the user approved — including columns they added or\n// edited on the canvas and their notes — so the blocking MCP tool hands the agent the\n// source of truth instead of letting it implement from the draft it originally proposed.\n// Approve = \"build this final schema.\" Any \"you proposed X, the user changed Y\" diff\n// flows through the SUBMIT-FEEDBACK path (lib/plan-feedback.ts), not here.\nexport function describeApprovedDoc(doc: DraftDoc): string {\n const nameById = new Map(doc.tables.map((t) => [t.id, t.name]));\n const lines: string[] = [\"## Approved schema\", \"\", \"### Tables\"];\n for (const t of doc.tables) {\n lines.push(`- **${t.name}**${t.domain ? ` (${t.domain})` : \"\"}`);\n for (const c of t.columns) {\n const flags = [c.isPk && \"PK\", c.isFk && \"FK\", c.nullable ? \"NULL\" : \"NOT NULL\"]\n .filter(Boolean)\n .join(\" \");\n lines.push(` - ${c.name} ${c.type}${flags ? ` ${flags}` : \"\"}${c.note ? ` — ${c.note}` : \"\"}`);\n }\n }\n\n if (doc.relations.length) {\n lines.push(\"\", \"### Relations (FKs)\");\n for (const r of doc.relations) {\n const from = nameById.get(r.fromTableId) ?? r.fromTableId;\n const to = nameById.get(r.toTableId) ?? r.toTableId;\n lines.push(`- ${from}.${r.fromColumn} → ${to}.${r.toColumn}`);\n }\n }\n\n if (doc.endpoints.length) {\n lines.push(\"\", \"### Endpoints\");\n for (const e of doc.endpoints) {\n const uses = e.links\n .map((l) => `${nameById.get(l.tableId) ?? l.tableId} (${l.access})`)\n .join(\", \");\n lines.push(`- ${e.method} ${e.path}${uses ? ` — ${uses}` : \"\"}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/** Human-readable lines describing additions/removals/retypes between the originally\n * proposed draft and the doc the user later approved or surfaced as feedback. Covers\n * tables/columns plus relation and endpoint add/remove signals — enough to tell the\n * agent \"you proposed X, the user wants Y instead.\" */\nexport function diffDocs(orig: DraftDoc, current: DraftDoc): string[] {\n const lines: string[] = [];\n const origByName = new Map(orig.tables.map((t) => [t.name, t]));\n const currentByName = new Map(current.tables.map((t) => [t.name, t]));\n\n for (const t of current.tables) {\n if (!origByName.has(t.name)) lines.push(`added table **${t.name}**`);\n }\n for (const t of orig.tables) {\n if (!currentByName.has(t.name)) lines.push(`removed table **${t.name}**`);\n }\n\n for (const a of current.tables) {\n const o = origByName.get(a.name);\n if (!o) continue;\n const origCols = new Map(o.columns.map((c) => [c.name, c]));\n const currentCols = new Map(a.columns.map((c) => [c.name, c]));\n for (const c of a.columns) {\n const prior = origCols.get(c.name);\n if (!prior) {\n lines.push(`added column **${a.name}.${c.name}** (${c.type})`);\n continue;\n }\n const diffs: string[] = [];\n if (prior.type !== c.type) diffs.push(`type ${prior.type} → ${c.type}`);\n if (prior.isPk !== c.isPk) diffs.push(c.isPk ? \"now PK\" : \"no longer PK\");\n if (prior.isFk !== c.isFk) diffs.push(c.isFk ? \"now FK\" : \"no longer FK\");\n if (prior.nullable !== c.nullable)\n diffs.push(c.nullable ? \"now accepts NULL\" : \"now NOT NULL\");\n if ((prior.note ?? \"\") !== (c.note ?? \"\")) diffs.push(`note: \"${c.note ?? \"\"}\"`);\n if (diffs.length) lines.push(`changed **${a.name}.${c.name}** — ${diffs.join(\"; \")}`);\n }\n for (const c of o.columns) {\n if (!currentCols.has(c.name))\n lines.push(`removed column **${a.name}.${c.name}** (was ${c.type})`);\n }\n }\n\n // Relations: identify by from/to table name + from/to column. Renames against a still-\n // existing table count as a change; renames against a dropped table fall out as \"removed\".\n const relKey = (\n r: { fromTableId: string; toTableId: string; fromColumn: string; toColumn: string },\n nameById: Map<string, string>,\n ) =>\n `${nameById.get(r.fromTableId) ?? r.fromTableId}.${r.fromColumn}→${nameById.get(r.toTableId) ?? r.toTableId}.${r.toColumn}`;\n const origRelNames = new Map(orig.tables.map((t) => [t.id, t.name]));\n const currRelNames = new Map(current.tables.map((t) => [t.id, t.name]));\n const origRels = new Set(orig.relations.map((r) => relKey(r, origRelNames)));\n const currRels = new Set(current.relations.map((r) => relKey(r, currRelNames)));\n for (const key of currRels) if (!origRels.has(key)) lines.push(`added relation ${key}`);\n for (const key of origRels) if (!currRels.has(key)) lines.push(`removed relation ${key}`);\n\n // Endpoints: identity is method + path. Usage-link changes ride along under the\n // endpoint that owns them.\n const epKey = (e: { method: string; path: string }) => `${e.method} ${e.path}`;\n const origEps = new Map(orig.endpoints.map((e) => [epKey(e), e]));\n const currEps = new Map(current.endpoints.map((e) => [epKey(e), e]));\n for (const [k, e] of currEps) {\n if (!origEps.has(k)) {\n const uses = e.links\n .map((l) => `${currRelNames.get(l.tableId) ?? l.tableId} (${l.access})`)\n .join(\", \");\n lines.push(`added endpoint **${k}**${uses ? ` — ${uses}` : \"\"}`);\n }\n }\n for (const [k] of origEps) {\n if (!currEps.has(k)) lines.push(`removed endpoint **${k}**`);\n }\n\n return lines;\n}\nfunction writeVerdict(v: DraftVerdict): void {\n writeJsonAtomic(verdictPath(), v);\n}\nfunction readVerdict(): DraftVerdict | null {\n try {\n return JSON.parse(readFileSync(verdictPath(), \"utf8\")) as DraftVerdict;\n } catch {\n return null;\n }\n}\n\nexport function discardDraft(): void {\n const doc = readDraftDoc();\n if (doc)\n writeVerdict({\n proposedAt: doc.proposedAt,\n status: \"discarded\",\n summary: \"The user discarded the draft.\",\n });\n clearDraftDoc();\n}\n\nexport type DraftState =\n | { state: \"pending\"; proposedAt: number }\n | { state: \"approved\" | \"discarded\"; proposedAt: number; summary: string; detail?: string }\n | { state: \"none\" };\n\nexport function draftState(): DraftState {\n const doc = readDraftDoc();\n if (doc) return { state: \"pending\", proposedAt: doc.proposedAt };\n const v = readVerdict();\n if (v) return { state: v.status, proposedAt: v.proposedAt, summary: v.summary, detail: v.detail };\n return { state: \"none\" };\n}\n\n// ── Approve: persist the (possibly edited) draft into the real schema ────────\n\nconst draftDocSchema = z.object({\n proposedAt: z.number(),\n status: z.string(),\n tables: z.array(\n z.object({\n id: z.string(),\n name: z.string().trim().min(1),\n domain: z.string().nullable(),\n description: z.string().nullable(),\n x: z.number(),\n y: z.number(),\n columns: z.array(\n z.object({\n name: z.string().trim().min(1),\n type: z.string(),\n isPk: z.boolean(),\n isFk: z.boolean(),\n nullable: z.boolean(),\n note: z.string().nullable(),\n }),\n ),\n }),\n ),\n relations: z.array(\n z.object({\n id: z.string(),\n fromTableId: z.string(),\n toTableId: z.string(),\n fromColumn: z.string(),\n toColumn: z.string(),\n label: z.string().nullable(),\n }),\n ),\n endpoints: z.array(\n z.object({\n id: z.string(),\n method: z.string().trim().min(1),\n path: z.string().trim().min(1),\n domain: z.string().nullable(),\n description: z.string().nullable(),\n x: z.number(),\n y: z.number(),\n links: z.array(z.object({ tableId: z.string(), access: z.string() })),\n }),\n ),\n});\n\nexport async function approveDraft(\n input: unknown,\n prisma: Prisma = db,\n): Promise<{ tables: number; relations: number; endpoints: number }> {\n const doc = draftDocSchema.parse(input) as DraftDoc;\n const nameById = new Map(doc.tables.map((t) => [t.id, t.name]));\n const realIdByName = new Map<string, string>();\n\n // Tables → upsert by name (source MANUAL = approved/planned, renders solid). Columns replaced.\n for (const t of doc.tables) {\n const [saved] = await prisma\n .insert(dbTable)\n .values({\n name: t.name,\n domain: t.domain,\n description: t.description,\n source: \"MANUAL\",\n x: t.x,\n y: t.y,\n })\n .onConflictDoUpdate({\n target: dbTable.name,\n set: { domain: t.domain, description: t.description },\n })\n .returning();\n realIdByName.set(t.name, saved.id);\n await prisma.delete(dbColumn).where(eq(dbColumn.tableId, saved.id));\n if (t.columns.length)\n await prisma.insert(dbColumn).values(\n t.columns.map((c, i) => ({\n tableId: saved.id,\n name: c.name,\n type: c.type,\n isPk: c.isPk,\n isFk: c.isFk,\n nullable: c.nullable,\n note: c.note,\n ord: i,\n })),\n );\n }\n\n // A draft/real table id → the real DbTable id it maps to (links can point at either).\n const resolveRealId = async (id: string): Promise<string | null> => {\n const name = nameById.get(id);\n if (name) return realIdByName.get(name) ?? null;\n const t = await prisma.query.dbTable\n .findFirst({ where: (x, { eq }) => eq(x.id, id) })\n .catch(() => null);\n return t ? t.id : null;\n };\n\n // Relations → DbRelation (skip dups + unresolvable).\n for (const rel of doc.relations) {\n const fromId = await resolveRealId(rel.fromTableId);\n const toId = await resolveRealId(rel.toTableId);\n if (!fromId || !toId) continue;\n const exists = await prisma.query.dbRelation.findFirst({\n where: (x, { and, eq }) =>\n and(\n eq(x.fromTableId, fromId),\n eq(x.toTableId, toId),\n eq(x.fromColumn, rel.fromColumn),\n eq(x.toColumn, rel.toColumn),\n ),\n });\n if (exists) continue;\n await prisma.insert(dbRelation).values({\n fromTableId: fromId,\n toTableId: toId,\n fromColumn: rel.fromColumn,\n toColumn: rel.toColumn,\n label: rel.label,\n });\n }\n\n // Endpoints → upsert by method+path; usage links → EndpointTable (now real ids exist).\n for (const e of doc.endpoints) {\n const [saved] = await prisma\n .insert(endpoint)\n .values({\n method: e.method,\n path: e.path,\n domain: e.domain,\n description: e.description,\n source: \"MANUAL\",\n x: e.x,\n y: e.y,\n })\n .onConflictDoUpdate({\n target: [endpoint.method, endpoint.path],\n set: { domain: e.domain, description: e.description },\n })\n .returning();\n await prisma.delete(endpointTable).where(eq(endpointTable.endpointId, saved.id));\n for (const link of e.links) {\n const tid = await resolveRealId(link.tableId);\n if (!tid) continue;\n await prisma\n .insert(endpointTable)\n .values({ endpointId: saved.id, tableId: tid, access: link.access })\n .catch(() => {}); // ignore the unique([endpointId,tableId]) clash on duplicate links\n }\n }\n\n const summary = `${doc.tables.length} table(s), ${doc.relations.length} relation(s) and ${doc.endpoints.length} endpoint(s) approved and persisted to the schema.`;\n writeVerdict({\n proposedAt: doc.proposedAt,\n status: \"approved\",\n summary,\n detail: describeApprovedDoc(doc),\n });\n clearDraftDoc();\n await bumpVersion(prisma);\n return { tables: doc.tables.length, relations: doc.relations.length, endpoints: doc.endpoints.length };\n}\n\n/**\n * Repair endpoints stored before access was inferred from the method: a mutating endpoint\n * (POST/PUT/PATCH/DELETE) whose table link defaulted to \"read\" is bumped to \"write\". GET\n * reads and explicit \"write\"/\"read-write\" links are left untouched. Returns links updated.\n */\nexport async function backfillEndpointAccess(prisma: Prisma = db): Promise<number> {\n const eps = await prisma.query.endpoint.findMany({ with: { tables: true } });\n let fixed = 0;\n for (const e of eps) {\n if (accessForMethod(e.method) !== \"write\") continue;\n for (const link of e.tables) {\n if (link.access !== \"read\") continue;\n await prisma.update(endpointTable).set({ access: \"write\" }).where(eq(endpointTable.id, link.id));\n fixed++;\n }\n }\n return fixed;\n}\n","import { readFileSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { dataDir } from \"@/lib/project\";\nimport { writeJsonAtomic } from \"@/lib/atomic-write\";\n\n// Disk-backed metadata for the in-flight plan: description, when it was proposed, and\n// the feature titles the agent originally pushed. Lives next to plan-annotations.json\n// in the workspace data dir so the annotations endpoint can read it without crossing\n// route-handler boundaries.\n\nexport interface PlanMeta {\n description: string;\n proposedAt: number;\n // Raw markdown pushed by `beacon plan` (the ExitPlanMode hook). When set, /plan renders\n // it directly instead of synthesising from features+tables.\n markdown?: string;\n // Feature titles the agent proposed in THIS round. Used to diff the current DRAFT\n // feature board against the original proposal at feedback time.\n originalFeatures?: string[];\n // Hash of the proposal content (description + markdown + draft + features). Lets POST\n // /api/plan recognise an identical re-push (a crashed/resumed session) and NOT reset the\n // round, so in-flight feedback survives.\n contentHash?: string;\n}\n\nfunction metaPath(): string {\n return join(dataDir(), \"plan-meta.json\");\n}\n\nexport function readPlanMeta(): PlanMeta | null {\n try {\n return JSON.parse(readFileSync(metaPath(), \"utf8\")) as PlanMeta;\n } catch {\n return null;\n }\n}\n\nexport function writePlanMeta(m: PlanMeta): void {\n writeJsonAtomic(metaPath(), m);\n}\n\nexport function clearPlanMeta(): void {\n rmSync(metaPath(), { force: true });\n}\n","import { readFileSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { dataDir } from \"@/lib/project\";\nimport { writeJsonAtomic } from \"@/lib/atomic-write\";\nimport { renderFeedback, type TextAnnotation } from \"@/lib/annotations\";\n\n// Disk store for the in-flight plan's annotation state, shared by the annotations route\n// (which the panel writes through) and the verdict resolver (lib/plan-resolve.ts) so the\n// \"did the user submit feedback, and what is it?\" question has exactly one answer. Lives at\n// dataDir()/plan-annotations-current.json.\n\n// \"Explain This Node\": a node-scoped question the user asked on a /plan board. It rides back to\n// the terminal session inside the existing feedback bundle (plan-loop piggyback) — no new channel.\nexport interface PlanQuestion {\n target: string; // e.g. \"feature: Risk Badges\" / \"table: users\" / \"endpoint: DELETE /posts/{id}\"\n question: string;\n}\n\nexport interface StoredAnnotations {\n annotations: TextAnnotation[];\n globalComment: string;\n submitted: boolean;\n submittedAt?: number;\n // Board edits markdown captured at submit time. Snapshot — not recomputed on every read.\n boardEdits?: string;\n // Per-node questions captured at submit time (Explain This Node).\n questions?: PlanQuestion[];\n}\n\n// Render node questions into a feedback section the agent reads. Pure — unit-tested.\nexport function renderQuestions(questions: ReadonlyArray<PlanQuestion>): string {\n const valid = questions.filter((q) => q.question.trim());\n if (!valid.length) return \"\";\n const lines = valid.map((q) => `- **${q.target}** — ${q.question.trim()}`);\n return [\"## Questions to answer before approving\", ...lines].join(\"\\n\");\n}\n\nfunction annotationsPath(): string {\n return join(dataDir(), \"plan-annotations-current.json\");\n}\n\nexport function readStoredAnnotations(): StoredAnnotations {\n try {\n const v = JSON.parse(readFileSync(annotationsPath(), \"utf8\")) as Partial<StoredAnnotations>;\n return {\n annotations: v.annotations ?? [],\n globalComment: v.globalComment ?? \"\",\n submitted: !!v.submitted,\n submittedAt: v.submittedAt,\n boardEdits: v.boardEdits ?? \"\",\n questions: v.questions ?? [],\n };\n } catch {\n return { annotations: [], globalComment: \"\", submitted: false, questions: [] };\n }\n}\n\nexport function writeStoredAnnotations(s: StoredAnnotations): void {\n writeJsonAtomic(annotationsPath(), s);\n}\n\nexport function clearStoredAnnotations(): void {\n rmSync(annotationsPath(), { force: true });\n}\n\n// The combined feedback markdown: inline text annotations + the board-edits snapshot + any\n// node-scoped questions (Explain This Node).\nexport function renderAnnotationFeedback(s: StoredAnnotations): string {\n const annot = renderFeedback(s.annotations, s.globalComment);\n const board = s.boardEdits ?? \"\";\n const questions = renderQuestions(s.questions ?? []);\n return [annot, board, questions].filter(Boolean).join(\"\\n\\n\");\n}\n\n// The single source of truth for \"is there submitted feedback, and what is it?\". An empty\n// submit (no comments, no board edits) returns submitted:true but feedback:\"\" — callers must\n// treat empty feedback as NOT a verdict.\nexport function readAnnotationFeedback(): { submitted: boolean; feedback: string } {\n const s = readStoredAnnotations();\n return { submitted: s.submitted, feedback: s.submitted ? renderAnnotationFeedback(s) : \"\" };\n}\n","// Beacon-native annotation primitive. The user selects a chunk of text in the rendered\n// plan markdown and attaches a comment to that exact excerpt — same UX as plannotator's\n// highlight-then-comment. Annotations accumulate; submission packages them into a single\n// markdown blob the blocking MCP tool returns to Claude.\n\nexport type AnnotationKind = \"comment\" | \"deletion\";\n\nexport interface TextAnnotation {\n id: string; // stable client-generated id\n excerpt: string; // the highlighted text, verbatim\n comment: string; // the user's note (ignored for kind=\"deletion\")\n kind?: AnnotationKind; // defaults to \"comment\" for older saves\n}\n\n// Renders accumulated annotations + an optional global comment into a markdown payload\n// the blocking MCP tool returns to the terminal agent. Empty comments are dropped so the\n// message stays signal. Inline annotations are rendered as blockquoted excerpts followed\n// by the user's comment.\nexport function renderFeedback(\n annotations: TextAnnotation[],\n globalComment = \"\",\n): string {\n const comments = annotations.filter(\n (a) => (a.kind ?? \"comment\") === \"comment\" && a.comment.trim(),\n );\n const deletions = annotations.filter((a) => a.kind === \"deletion\");\n const global = globalComment.trim();\n if (!comments.length && !deletions.length && !global) return \"\";\n const parts: string[] = [];\n if (global) parts.push(`## Overall feedback\\n\\n${global}`);\n if (comments.length) {\n const blocks: string[] = [\"## Inline comments\", \"\"];\n for (const a of comments) {\n const quoted = a.excerpt\n .split(\"\\n\")\n .map((line) => `> ${line}`)\n .join(\"\\n\");\n blocks.push(`${quoted}\\n\\n${a.comment.trim()}`);\n }\n parts.push(blocks.join(\"\\n\"));\n }\n if (deletions.length) {\n const blocks: string[] = [\n \"## Marked for deletion\",\n \"\",\n \"The user marked these passages for removal — drop them from the next plan:\",\n \"\",\n ];\n for (const a of deletions) {\n const quoted = a.excerpt\n .split(\"\\n\")\n .map((line) => `> ${line}`)\n .join(\"\\n\");\n blocks.push(quoted);\n blocks.push(\"\");\n }\n parts.push(blocks.join(\"\\n\").trim());\n }\n return parts.join(\"\\n\\n\").trim();\n}\n"],"names":["READ_METHODS","Set","accessForMethod","method","has","trim","toUpperCase","draftPath","verdictPath","readDraftDoc","JSON","parse","writeDoc","doc","graphToDoc","graph","proposedAt","originY","idByName","Map","positions","tables","map","t","key","name","columnCount","columns","length","bottom","id","set","p","get","x","y","Math","max","domain","description","c","type","isPk","isFk","nullable","note","relations","flatMap","r","fromTableId","fromTable","toTableId","toTable","fromColumn","toColumn","label","baseY","endpoints","e","i","path","floor","links","uses","u","tableId","table","access","status","writeProposal","now","Date","force","clearDraftDoc","purgeDraft","describeApprovedDoc","nameById","lines","push","flags","filter","Boolean","join","from","to","l","diffDocs","orig","current","origByName","currentByName","a","o","origCols","currentCols","prior","diffs","relKey","origRelNames","currRelNames","origRels","currRels","epKey","origEps","currEps","k","writeVerdict","v","readVerdict","discardDraft","summary","draftState","state","detail","draftDocSchema","object","number","string","array","min","boolean","approveDraft","input","prisma","realIdByName","saved","insert","values","source","onConflictDoUpdate","target","returning","delete","where","ord","resolveRealId","query","dbTable","findFirst","eq","catch","rel","fromId","toId","exists","dbRelation","and","endpointId","link","tid","backfillEndpointAccess","eps","endpoint","findMany","with","fixed","update","metaPath","readPlanMeta","writePlanMeta","m","clearPlanMeta","renderFeedback","annotations","globalComment","comments","kind","comment","deletions","global","parts","blocks","quoted","excerpt","split","line"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ module.exports=[53870,e=>{"use strict";var t=e.i(2157),a=e.i(50227),r=e.i(66680),n=e.i(38752),i=e.i(94930);function o(){let e=(0,a.join)((0,n.dataDir)(),"plans","history");return(0,t.mkdirSync)(e,{recursive:!0}),e}e.s(["archivePlan",0,function(e){let t={...e,id:(0,r.randomUUID)().slice(0,8),archivedAt:Date.now()};return(0,i.writeJsonAtomic)((0,a.join)(o(),`${t.id}.json`),t,!0),t},"listHistory",0,function(){let e;try{e=(0,t.readdirSync)(o())}catch{return[]}let r=[];for(let n of e)if(n.endsWith(".json"))try{let e=(0,a.join)(o(),n),i=(0,t.readFileSync)(e,"utf8"),s=JSON.parse(i);r.push(s)}catch{}return r.sort((e,t)=>t.archivedAt-e.archivedAt)},"readArchivedPlan",0,function(e){try{let r=(0,t.readFileSync)((0,a.join)(o(),`${e}.json`),"utf8");return JSON.parse(r)}catch{return null}}])},40717,e=>{"use strict";var t=e.i(69719),a=e.i(39513);let r=t.z.preprocess(e=>{if("string"==typeof e){let[t,...a]=e.trim().split(/\s+/);return{name:t,type:a.join(" ")||"text"}}return e},t.z.object({name:t.z.string().trim().min(1),type:t.z.string().trim().min(1),isPk:t.z.boolean().optional(),isFk:t.z.boolean().optional(),nullable:t.z.boolean().optional(),note:t.z.string().nullish()})),n=t.z.object({name:t.z.string().trim().min(1),domain:t.z.string().nullish(),description:t.z.string().nullish(),columns:t.z.array(r).default([])}),i=t.z.object({fromTable:t.z.string(),fromColumn:t.z.string(),toTable:t.z.string(),toColumn:t.z.string(),label:t.z.string().nullish()}),o=t.z.object({method:t.z.string().trim().min(1),path:t.z.string().trim().min(1),domain:t.z.string().nullish(),description:t.z.string().nullish(),uses:t.z.array(t.z.object({table:t.z.string().trim().min(1),access:t.z.string().optional()})).default([])}).transform(e=>({...e,uses:e.uses.map(t=>({...t,access:t.access??(0,a.accessForMethod)(e.method)}))})),s=t.z.object({tables:t.z.array(n).default([]),relations:t.z.array(i).default([]),endpoints:t.z.array(o).default([])});e.s(["draftSchema",0,s,"endpointSchema",0,o,"relationSchema",0,i,"tableSchema",0,n])},69062,e=>e.a(async(t,a)=>{try{var r=e.i(69719),n=e.i(75225),i=e.i(91426),o=e.i(34700),s=e.i(22609),l=t([i]);[i]=l.then?(await l)():l;let p=r.z.object({title:r.z.string().trim().min(1),role:r.z.string().nullish(),plain:r.z.string().nullish(),cluster:r.z.string().nullish(),category:r.z.string().nullish(),domain:r.z.string().nullish(),priority:r.z.number().nullish(),dependsOn:r.z.array(r.z.string()).nullish()}).transform(({category:e,domain:t,priority:a,...r})=>({...r,cluster:r.cluster??e??t??null,priority:null==a?null:Math.max(0,Math.min(3,Math.round(a)))})),f=r.z.object({features:r.z.array(p).default([])});async function d(e=i.db){await e.delete(o.node).where((0,n.and)((0,n.eq)(o.node.source,"DRAFT"),(0,n.eq)(o.node.view,"ROADMAP")))}async function u(e,t=i.db){let a=f.parse(e);await d(t);let r=await t.query.node.findFirst({where:(e,{eq:t})=>t(e.view,"ROADMAP"),orderBy:(e,{desc:t})=>t(e.y)}),n=(r?.y??0)+200,l=new Set(a.features.map(e=>e.title.trim())),c=a.features.map(e=>({id:e.title.trim()})),p=a.features.flatMap(e=>(e.dependsOn??[]).map(e=>e.trim()).filter(t=>l.has(t)&&t!==e.title.trim()).map(t=>({fromId:e.title.trim(),toId:t}))),m=(0,s.forceLayoutRoadmap)(c,p),h=new Map;for(let e of a.features){let a=m.get(e.title.trim())??{x:0,y:0},[r]=await t.insert(o.node).values({view:"ROADMAP",source:"DRAFT",status:"PENDING",title:e.title,role:e.role??null,plain:e.plain??null,cluster:e.cluster??null,priority:e.priority??2,x:a.x,y:a.y+n}).returning();h.set(e.title.trim(),r.id)}for(let e of a.features){let a=h.get(e.title.trim());if(a&&e.dependsOn)for(let r of e.dependsOn){let e=h.get(r.trim());e&&e!==a&&(await t.query.edge.findFirst({where:(t,{and:r,eq:n})=>r(n(t.fromId,a),n(t.toId,e),n(t.kind,"DEPENDS"))})||await t.insert(o.edge).values({fromId:a,toId:e,kind:"DEPENDS"}))}}}async function c(e=i.db){let t=await e.query.node.findMany({where:(e,{and:t,eq:a})=>t(a(e.source,"DRAFT"),a(e.view,"ROADMAP")),orderBy:(e,{asc:t})=>t(e.createdAt)}),a=t.map(e=>e.id),r=a.length?await e.query.edge.findMany({where:(e,{and:t,eq:r})=>t(r(e.kind,"DEPENDS"),(0,n.inArray)(e.fromId,a),(0,n.inArray)(e.toId,a))}):[],o=new Map(t.map(e=>[e.id,e.title])),s=new Map;for(let e of r){let t=o.get(e.toId);if(!t)continue;let a=s.get(e.fromId)??[];a.push(t),s.set(e.fromId,a)}return{features:t.map(e=>({title:e.title,role:e.role,plain:e.plain,cluster:e.cluster,priority:e.priority,dependsOn:s.get(e.id)}))}}e.s(["clearFeatureDraft",0,d,"featureItemSchema",0,p,"featureSchema",0,f,"getFeatureDraft",0,c,"persistFeatureDraft",0,u]),a()}catch(e){a(e)}},!1),47231,e=>{"use strict";e.s(["synthesizePlanMarkdown",0,function(e,t,a){let r=[`# Plan: ${e}`,""],n=a?.features??[];if(n.length)for(let e of(r.push("## Features",""),n))r.push(`### ${e.title}`),e.cluster&&r.push(`*Domain:* \`${e.cluster}\``),e.role&&r.push(`*Role:* ${e.role}`),e.plain&&r.push("",e.plain),r.push("");let i=t?.tables??[];if(i.length)for(let e of(r.push("## Database — Tables",""),i)){for(let t of(r.push(`### Table \`${e.name}\``),e.domain&&r.push(`*Domain:* \`${e.domain}\``),e.description&&r.push("",e.description,""),e.columns)){let e=[t.isPk&&"PK",t.isFk&&"FK",t.nullable?"NULL":"NOT NULL"].filter(Boolean).join(" ");r.push(`- \`${t.name}\` ${t.type}${e?` *${e}*`:""}${t.note?` — ${t.note}`:""}`)}r.push("")}let o=t?.relations??[];if(o.length){let e=new Map(i.map(e=>[e.id,e.name]));for(let t of(r.push("## Database — Relations (FKs)",""),o)){let a=e.get(t.fromTableId)??t.fromTableId,n=e.get(t.toTableId)??t.toTableId;r.push(`- \`${a}.${t.fromColumn}\` → \`${n}.${t.toColumn}\``)}r.push("")}let s=t?.endpoints??[];if(s.length){let e=new Map(i.map(e=>[e.id,e.name]));for(let t of(r.push("## Endpoints",""),s)){if(r.push(`### ${t.method} ${t.path}`),t.domain&&r.push(`*Domain:* \`${t.domain}\``),t.description&&r.push("",t.description),t.links.length){let a=t.links.map(t=>`\`${e.get(t.tableId)??t.tableId}\` (${t.access})`).join(", ");r.push("",`Touches: ${a}`)}r.push("")}}return r.join("\n")}])},20537,e=>e.a(async(t,a)=>{try{var r=e.i(40717),n=e.i(69062),i=t([n]);[n]=i.then?(await i)():i;let s=/^[ \t]*```beacon[ \t]*\r?\n([\s\S]*?)\r?\n[ \t]*```[ \t]*$/im;function o(e,t){if(!Array.isArray(e))return[];let a=[];for(let r of e){let e=t.safeParse(r);e.success&&a.push(e.data)}return a}e.s(["extractBeaconBlock",0,function(e){let t,a=e.match(s);if(!a)return{prose:e};try{t=JSON.parse(a[1])}catch{return{prose:e}}let i=t&&"object"==typeof t?t:{},l=o(i.tables,r.tableSchema),d=o(i.relations,r.relationSchema),u=o(i.endpoints,r.endpointSchema),c=o(i.features,n.featureItemSchema),p=l.length||u.length||d.length?{tables:l,relations:d,endpoints:u}:void 0,f=c.length?c:void 0;return p||f?{prose:e.replace(s,"").replace(/\n{3,}/g,"\n\n").trim(),draft:p,features:f}:{prose:e}}]),a()}catch(e){a(e)}},!1),13562,e=>{"use strict";var t=e.i(2157),a=e.i(50227),r=e.i(38752),n=e.i(94930);function i(){return(0,a.join)((0,r.dataDir)(),"plan-verdict.json")}e.s(["clearPlanVerdict",0,function(){(0,t.rmSync)(i(),{force:!0})},"readPlanVerdict",0,function(){try{return JSON.parse((0,t.readFileSync)(i(),"utf8"))}catch{return null}},"writePlanVerdict",0,function(e){(0,n.writeJsonAtomic)(i(),e)}])},62391,e=>e.a(async(t,a)=>{try{var r=e.i(75225),n=e.i(91426),i=e.i(34700),o=e.i(23737),s=e.i(69062),l=e.i(53870),d=e.i(47231),u=e.i(20537),c=e.i(74005),p=e.i(13562),f=e.i(56715),m=e.i(6659),h=t([n,o,s,u,m]);async function y(){let e=(0,c.readPlanMeta)(),t=(0,o.readDraftDoc)(),a=await (0,s.getFeatureDraft)(),r=(0,f.readStoredAnnotations)(),n=e?.description??"(no description)",i=e?.markdown?(0,u.extractBeaconBlock)(e.markdown).prose:(0,d.synthesizePlanMarkdown)(n,t,a);return{description:n,markdown:i,draftDoc:t,featureGraph:a,annotations:r.annotations,globalComment:r.globalComment}}async function g(){await (0,s.clearFeatureDraft)(),(0,o.clearDraftDoc)(),(0,c.clearPlanMeta)(),(0,f.clearStoredAnnotations)()}async function b(e){let t=(0,c.readPlanMeta)(),a=await y(),s=e?.doc??a.draftDoc,d=s?await (0,o.approveDraft)(s):null,u={count:(await n.db.update(i.node).set({source:"MANUAL"}).where((0,r.and)((0,r.eq)(i.node.source,"DRAFT"),(0,r.eq)(i.node.view,"ROADMAP"))).returning({id:i.node.id})).length};(0,l.archivePlan)({description:a.description,markdown:a.markdown,verdict:"approved",annotations:a.annotations,globalComment:a.globalComment,draftDoc:a.draftDoc,featureGraph:a.featureGraph});let f=[];d&&f.push(`${d.tables} table(s), ${d.relations} relation(s) and ${d.endpoints} endpoint(s)`),u.count&&f.push(`${u.count} feature(s)`);let h=f.length?`${f.join(" and ")} approved and persisted.`:"Plan approved.";return(0,p.writePlanVerdict)({proposedAt:t?.proposedAt??0,status:"approved",summary:h,detail:s?(0,o.describeApprovedDoc)(s):void 0,features:a.featureGraph.features.map(e=>e.title),decidedAt:Date.now()}),await g(),await (0,m.bumpVersion)(),{db:d,features:u.count}}async function w(){let e=(0,c.readPlanMeta)(),t=await y();(t.draftDoc&&(t.draftDoc.tables.length||t.draftDoc.endpoints.length)||t.featureGraph.features.length>0||e?.markdown)&&(0,l.archivePlan)({description:t.description,markdown:t.markdown,verdict:"discarded",annotations:t.annotations,globalComment:t.globalComment,draftDoc:t.draftDoc,featureGraph:t.featureGraph}),(0,p.writePlanVerdict)({proposedAt:e?.proposedAt??0,status:"discarded",summary:"The user discarded the plan.",decidedAt:Date.now()}),(0,o.discardDraft)(),await g(),await (0,m.bumpVersion)()}async function D(){let e=(0,f.readAnnotationFeedback)();if(e.submitted&&e.feedback)return{kind:"feedback",feedback:e.feedback};let t=(0,p.readPlanVerdict)();if(t)return"approved"===t.status?{kind:"approved",summary:t.summary,detail:t.detail,features:t.features}:{kind:"discarded",summary:t.summary};let a=(0,c.readPlanMeta)(),r=(0,o.readDraftDoc)(),n=await (0,s.getFeatureDraft)();return(r?.tables.length??0)+(r?.endpoints.length??0)+n.features.length>0||a?.markdown?{kind:"pending"}:{kind:"discarded",summary:"The user discarded the plan."}}[n,o,s,u,m]=h.then?(await h)():h,e.s(["approvePlan",0,b,"discardPlan",0,w,"resetPlanRound",0,function(){(0,f.clearStoredAnnotations)(),(0,p.clearPlanVerdict)()},"resolvePlanVerdict",0,D]),a()}catch(e){a(e)}},!1)];
2
+
3
+ //# sourceMappingURL=lib_1upr0dj._.js.map