trybeacon 0.1.73 → 0.1.75

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 (383) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.next/BUILD_ID +1 -1
  3. package/.next/app-path-routes-manifest.json +26 -22
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +3 -3
  6. package/.next/routes-manifest.json +24 -0
  7. package/.next/server/app/_global-error/page.js +3 -3
  8. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/_global-error.html +1 -1
  10. package/.next/server/app/_global-error.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  16. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  17. package/.next/server/app/_not-found/page.js +2 -2
  18. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  19. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  20. package/.next/server/app/_not-found.html +1 -1
  21. package/.next/server/app/_not-found.rsc +23 -22
  22. package/.next/server/app/_not-found.segments/_full.segment.rsc +23 -22
  23. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  24. package/.next/server/app/_not-found.segments/_index.segment.rsc +12 -11
  25. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  26. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  27. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  28. package/.next/server/app/api/ask/answer/route.js +1 -0
  29. package/.next/server/app/api/ask/answer/route.js.nft.json +1 -0
  30. package/.next/server/app/api/ask/answer/route_client-reference-manifest.js +1 -0
  31. package/.next/server/app/api/ask/route.js +1 -0
  32. package/.next/server/app/api/ask/route.js.nft.json +1 -0
  33. package/.next/server/app/api/ask/route_client-reference-manifest.js +1 -0
  34. package/.next/server/app/api/ask/verdict/route.js +1 -0
  35. package/.next/server/app/api/ask/verdict/route.js.nft.json +1 -0
  36. package/.next/server/app/api/ask/verdict/route_client-reference-manifest.js +1 -0
  37. package/.next/server/app/api/board-annotations/[id]/route.js +1 -1
  38. package/.next/server/app/api/board-annotations/route.js +1 -1
  39. package/.next/server/app/api/board-layout/route.js +1 -1
  40. package/.next/server/app/api/bug-flags/[id]/route.js +1 -1
  41. package/.next/server/app/api/bug-flags/route.js +1 -1
  42. package/.next/server/app/api/changes/comment/answer/route.js +4 -0
  43. package/.next/server/app/api/changes/comment/answer/route.js.nft.json +1 -0
  44. package/.next/server/app/api/changes/comment/answer/route_client-reference-manifest.js +1 -0
  45. package/.next/server/app/api/changes/comment/claim/route.js +4 -1
  46. package/.next/server/app/api/changes/comment/route.js +4 -1
  47. package/.next/server/app/api/changes/quality/route.js +1 -1
  48. package/.next/server/app/api/changes/route.js +1 -1
  49. package/.next/server/app/api/changes/viewed/route.js +1 -1
  50. package/.next/server/app/api/code-graph/position/route.js +1 -1
  51. package/.next/server/app/api/code-graph/route.js +1 -1
  52. package/.next/server/app/api/context/feature/route.js +1 -1
  53. package/.next/server/app/api/context/file/route.js +1 -1
  54. package/.next/server/app/api/context/route.js +1 -1
  55. package/.next/server/app/api/db/arrange/route.js +1 -1
  56. package/.next/server/app/api/db/backfill-access/route.js +1 -1
  57. package/.next/server/app/api/db/position/route.js +1 -1
  58. package/.next/server/app/api/db/prune-planned/route.js +1 -1
  59. package/.next/server/app/api/db/reconcile-endpoints/route.js +1 -1
  60. package/.next/server/app/api/db/relations/[id]/route.js +1 -1
  61. package/.next/server/app/api/db/tables/[id]/route.js +1 -1
  62. package/.next/server/app/api/draft/approve/route.js +1 -1
  63. package/.next/server/app/api/draft/route.js +1 -1
  64. package/.next/server/app/api/draft/status/route.js +1 -1
  65. package/.next/server/app/api/edges/[id]/route.js +1 -1
  66. package/.next/server/app/api/edges/route.js +1 -1
  67. package/.next/server/app/api/endpoints/[id]/route.js +1 -1
  68. package/.next/server/app/api/entities/route.js +1 -1
  69. package/.next/server/app/api/ingest/route.js +1 -1
  70. package/.next/server/app/api/init/route.js +1 -1
  71. package/.next/server/app/api/lesson/close/route.js +1 -1
  72. package/.next/server/app/api/lesson/presence/route.js +1 -1
  73. package/.next/server/app/api/lesson/questions/route.js +1 -1
  74. package/.next/server/app/api/lesson/route.js +1 -1
  75. package/.next/server/app/api/lesson/save/route.js +1 -1
  76. package/.next/server/app/api/lesson/verdict/route.js +1 -1
  77. package/.next/server/app/api/map/describe/route.js +1 -1
  78. package/.next/server/app/api/map/files/route.js +1 -1
  79. package/.next/server/app/api/map/finish/route.js +1 -1
  80. package/.next/server/app/api/map/route.js +1 -1
  81. package/.next/server/app/api/map/start/route.js +1 -1
  82. package/.next/server/app/api/map/touch-active/route.js +1 -1
  83. package/.next/server/app/api/mention-search/route.js +1 -1
  84. package/.next/server/app/api/nodes/[id]/position/route.js +1 -1
  85. package/.next/server/app/api/nodes/[id]/route.js +1 -1
  86. package/.next/server/app/api/nodes/positions/route.js +1 -1
  87. package/.next/server/app/api/nodes/route.js +1 -1
  88. package/.next/server/app/api/nodes/subtasks/route.js +1 -1
  89. package/.next/server/app/api/notes/[id]/route.js +1 -1
  90. package/.next/server/app/api/notes/route.js +1 -1
  91. package/.next/server/app/api/open/route.js +1 -1
  92. package/.next/server/app/api/plan/annotations/route.js +3 -3
  93. package/.next/server/app/api/plan/approve/route.js +1 -1
  94. package/.next/server/app/api/plan/history/route.js +1 -1
  95. package/.next/server/app/api/plan/markdown/route.js +1 -1
  96. package/.next/server/app/api/plan/presence/route.js +1 -1
  97. package/.next/server/app/api/plan/route.js +1 -1
  98. package/.next/server/app/api/plan/verdict/route.js +1 -1
  99. package/.next/server/app/api/preferences/route.js +1 -1
  100. package/.next/server/app/api/project-meta/route.js +1 -1
  101. package/.next/server/app/api/reset/route.js +1 -1
  102. package/.next/server/app/api/scope-guard/check/route.js +4 -1
  103. package/.next/server/app/api/share/create/route.js +1 -1
  104. package/.next/server/app/api/share/route.js +1 -1
  105. package/.next/server/app/api/stream/route.js +2 -2
  106. package/.next/server/app/api/tab/nav/route.js +1 -1
  107. package/.next/server/app/api/tab/presence/route.js +1 -1
  108. package/.next/server/app/api/telemetry/route.js +1 -1
  109. package/.next/server/app/api/telemetry/stats/route.js +1 -1
  110. package/.next/server/app/api/version/route.js +1 -1
  111. package/.next/server/app/api/workspace/activate/route.js +1 -1
  112. package/.next/server/app/api/workspace/route.js +1 -1
  113. package/.next/server/app/apple-icon.png/route.js +1 -1
  114. package/.next/server/app/docs/page.js +2 -2
  115. package/.next/server/app/docs/page.js.nft.json +1 -1
  116. package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  117. package/.next/server/app/docs.html +1 -1
  118. package/.next/server/app/docs.rsc +24 -23
  119. package/.next/server/app/docs.segments/_full.segment.rsc +24 -23
  120. package/.next/server/app/docs.segments/_head.segment.rsc +1 -1
  121. package/.next/server/app/docs.segments/_index.segment.rsc +12 -11
  122. package/.next/server/app/docs.segments/_tree.segment.rsc +2 -2
  123. package/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +1 -1
  124. package/.next/server/app/docs.segments/docs.segment.rsc +1 -1
  125. package/.next/server/app/help/page.js +2 -2
  126. package/.next/server/app/help/page.js.nft.json +1 -1
  127. package/.next/server/app/help/page_client-reference-manifest.js +1 -1
  128. package/.next/server/app/help.html +1 -1
  129. package/.next/server/app/help.rsc +32 -31
  130. package/.next/server/app/help.segments/_full.segment.rsc +32 -31
  131. package/.next/server/app/help.segments/_head.segment.rsc +1 -1
  132. package/.next/server/app/help.segments/_index.segment.rsc +12 -11
  133. package/.next/server/app/help.segments/_tree.segment.rsc +2 -2
  134. package/.next/server/app/help.segments/help/__PAGE__.segment.rsc +1 -1
  135. package/.next/server/app/help.segments/help.segment.rsc +1 -1
  136. package/.next/server/app/icon.svg/route.js +1 -1
  137. package/.next/server/app/index.html +1 -1
  138. package/.next/server/app/index.rsc +22 -21
  139. package/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  140. package/.next/server/app/index.segments/_full.segment.rsc +22 -21
  141. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  142. package/.next/server/app/index.segments/_index.segment.rsc +12 -11
  143. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  144. package/.next/server/app/learn/page.js +4 -4
  145. package/.next/server/app/learn/page.js.nft.json +1 -1
  146. package/.next/server/app/learn/page_client-reference-manifest.js +1 -1
  147. package/.next/server/app/map/page.js +2 -2
  148. package/.next/server/app/map/page.js.nft.json +1 -1
  149. package/.next/server/app/map/page_client-reference-manifest.js +1 -1
  150. package/.next/server/app/page.js +2 -2
  151. package/.next/server/app/page.js.nft.json +1 -1
  152. package/.next/server/app/page_client-reference-manifest.js +1 -1
  153. package/.next/server/app/plan/page.js +3 -3
  154. package/.next/server/app/plan/page.js.nft.json +1 -1
  155. package/.next/server/app/plan/page_client-reference-manifest.js +1 -1
  156. package/.next/server/app/s/[token]/page.js +2 -2
  157. package/.next/server/app/s/[token]/page.js.nft.json +1 -1
  158. package/.next/server/app/s/[token]/page_client-reference-manifest.js +1 -1
  159. package/.next/server/app/settings/page.js +2 -2
  160. package/.next/server/app/settings/page.js.nft.json +1 -1
  161. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  162. package/.next/server/app-paths-manifest.json +26 -22
  163. package/.next/server/chunks/1179.js +1 -0
  164. package/.next/server/chunks/2031.js +1 -0
  165. package/.next/server/chunks/2693.js +5 -2
  166. package/.next/server/chunks/374.js +1 -0
  167. package/.next/server/chunks/4378.js +1 -1
  168. package/.next/server/chunks/5295.js +1 -0
  169. package/.next/server/chunks/{4700.js → 5704.js} +2 -2
  170. package/.next/server/chunks/8227.js +1 -1
  171. package/.next/server/chunks/9683.js +1 -1
  172. package/.next/server/middleware-build-manifest.js +1 -1
  173. package/.next/server/pages/404.html +1 -1
  174. package/.next/server/pages/500.html +1 -1
  175. package/.next/server/server-reference-manifest.js +1 -1
  176. package/.next/server/server-reference-manifest.json +1 -1
  177. package/.next/static/chunks/1072-351ce2030dee0f4e.js +1 -0
  178. package/.next/static/chunks/3908-80efc60050779adf.js +1 -0
  179. package/.next/static/chunks/5697-5b9719b81806b4cf.js +1 -0
  180. package/.next/static/chunks/7424-d7fa15ef452064dd.js +1 -0
  181. package/.next/static/chunks/app/_global-error/page-d54a69e7dc6b4008.js +1 -0
  182. package/.next/static/chunks/app/api/ask/answer/route-d54a69e7dc6b4008.js +1 -0
  183. package/.next/static/chunks/app/api/ask/route-d54a69e7dc6b4008.js +1 -0
  184. package/.next/static/chunks/app/api/ask/verdict/route-d54a69e7dc6b4008.js +1 -0
  185. package/.next/static/chunks/app/api/board-annotations/[id]/route-d54a69e7dc6b4008.js +1 -0
  186. package/.next/static/chunks/app/api/board-annotations/route-d54a69e7dc6b4008.js +1 -0
  187. package/.next/static/chunks/app/api/board-layout/route-d54a69e7dc6b4008.js +1 -0
  188. package/.next/static/chunks/app/api/bug-flags/[id]/route-d54a69e7dc6b4008.js +1 -0
  189. package/.next/static/chunks/app/api/bug-flags/route-d54a69e7dc6b4008.js +1 -0
  190. package/.next/static/chunks/app/api/changes/comment/answer/route-d54a69e7dc6b4008.js +1 -0
  191. package/.next/static/chunks/app/api/changes/comment/claim/route-d54a69e7dc6b4008.js +1 -0
  192. package/.next/static/chunks/app/api/changes/comment/route-d54a69e7dc6b4008.js +1 -0
  193. package/.next/static/chunks/app/api/changes/quality/route-d54a69e7dc6b4008.js +1 -0
  194. package/.next/static/chunks/app/api/changes/route-d54a69e7dc6b4008.js +1 -0
  195. package/.next/static/chunks/app/api/changes/viewed/route-d54a69e7dc6b4008.js +1 -0
  196. package/.next/static/chunks/app/api/code-graph/position/route-d54a69e7dc6b4008.js +1 -0
  197. package/.next/static/chunks/app/api/code-graph/route-d54a69e7dc6b4008.js +1 -0
  198. package/.next/static/chunks/app/api/context/feature/route-d54a69e7dc6b4008.js +1 -0
  199. package/.next/static/chunks/app/api/context/file/route-d54a69e7dc6b4008.js +1 -0
  200. package/.next/static/chunks/app/api/context/route-d54a69e7dc6b4008.js +1 -0
  201. package/.next/static/chunks/app/api/db/arrange/route-d54a69e7dc6b4008.js +1 -0
  202. package/.next/static/chunks/app/api/db/backfill-access/route-d54a69e7dc6b4008.js +1 -0
  203. package/.next/static/chunks/app/api/db/position/route-d54a69e7dc6b4008.js +1 -0
  204. package/.next/static/chunks/app/api/db/prune-planned/route-d54a69e7dc6b4008.js +1 -0
  205. package/.next/static/chunks/app/api/db/reconcile-endpoints/route-d54a69e7dc6b4008.js +1 -0
  206. package/.next/static/chunks/app/api/db/relations/[id]/route-d54a69e7dc6b4008.js +1 -0
  207. package/.next/static/chunks/app/api/db/tables/[id]/route-d54a69e7dc6b4008.js +1 -0
  208. package/.next/static/chunks/app/api/draft/approve/route-d54a69e7dc6b4008.js +1 -0
  209. package/.next/static/chunks/app/api/draft/route-d54a69e7dc6b4008.js +1 -0
  210. package/.next/static/chunks/app/api/draft/status/route-d54a69e7dc6b4008.js +1 -0
  211. package/.next/static/chunks/app/api/edges/[id]/route-d54a69e7dc6b4008.js +1 -0
  212. package/.next/static/chunks/app/api/edges/route-d54a69e7dc6b4008.js +1 -0
  213. package/.next/static/chunks/app/api/endpoints/[id]/route-d54a69e7dc6b4008.js +1 -0
  214. package/.next/static/chunks/app/api/entities/route-d54a69e7dc6b4008.js +1 -0
  215. package/.next/static/chunks/app/api/ingest/route-d54a69e7dc6b4008.js +1 -0
  216. package/.next/static/chunks/app/api/init/route-d54a69e7dc6b4008.js +1 -0
  217. package/.next/static/chunks/app/api/lesson/close/route-d54a69e7dc6b4008.js +1 -0
  218. package/.next/static/chunks/app/api/lesson/presence/route-d54a69e7dc6b4008.js +1 -0
  219. package/.next/static/chunks/app/api/lesson/questions/route-d54a69e7dc6b4008.js +1 -0
  220. package/.next/static/chunks/app/api/lesson/route-d54a69e7dc6b4008.js +1 -0
  221. package/.next/static/chunks/app/api/lesson/save/route-d54a69e7dc6b4008.js +1 -0
  222. package/.next/static/chunks/app/api/lesson/verdict/route-d54a69e7dc6b4008.js +1 -0
  223. package/.next/static/chunks/app/api/map/describe/route-d54a69e7dc6b4008.js +1 -0
  224. package/.next/static/chunks/app/api/map/files/route-d54a69e7dc6b4008.js +1 -0
  225. package/.next/static/chunks/app/api/map/finish/route-d54a69e7dc6b4008.js +1 -0
  226. package/.next/static/chunks/app/api/map/route-d54a69e7dc6b4008.js +1 -0
  227. package/.next/static/chunks/app/api/map/start/route-d54a69e7dc6b4008.js +1 -0
  228. package/.next/static/chunks/app/api/map/touch-active/route-d54a69e7dc6b4008.js +1 -0
  229. package/.next/static/chunks/app/api/mention-search/route-d54a69e7dc6b4008.js +1 -0
  230. package/.next/static/chunks/app/api/nodes/[id]/position/route-d54a69e7dc6b4008.js +1 -0
  231. package/.next/static/chunks/app/api/nodes/[id]/route-d54a69e7dc6b4008.js +1 -0
  232. package/.next/static/chunks/app/api/nodes/positions/route-d54a69e7dc6b4008.js +1 -0
  233. package/.next/static/chunks/app/api/nodes/route-d54a69e7dc6b4008.js +1 -0
  234. package/.next/static/chunks/app/api/nodes/subtasks/route-d54a69e7dc6b4008.js +1 -0
  235. package/.next/static/chunks/app/api/notes/[id]/route-d54a69e7dc6b4008.js +1 -0
  236. package/.next/static/chunks/app/api/notes/route-d54a69e7dc6b4008.js +1 -0
  237. package/.next/static/chunks/app/api/open/route-d54a69e7dc6b4008.js +1 -0
  238. package/.next/static/chunks/app/api/plan/annotations/route-d54a69e7dc6b4008.js +1 -0
  239. package/.next/static/chunks/app/api/plan/approve/route-d54a69e7dc6b4008.js +1 -0
  240. package/.next/static/chunks/app/api/plan/history/route-d54a69e7dc6b4008.js +1 -0
  241. package/.next/static/chunks/app/api/plan/markdown/route-d54a69e7dc6b4008.js +1 -0
  242. package/.next/static/chunks/app/api/plan/presence/route-d54a69e7dc6b4008.js +1 -0
  243. package/.next/static/chunks/app/api/plan/route-d54a69e7dc6b4008.js +1 -0
  244. package/.next/static/chunks/app/api/plan/verdict/route-d54a69e7dc6b4008.js +1 -0
  245. package/.next/static/chunks/app/api/preferences/route-d54a69e7dc6b4008.js +1 -0
  246. package/.next/static/chunks/app/api/project-meta/route-d54a69e7dc6b4008.js +1 -0
  247. package/.next/static/chunks/app/api/reset/route-d54a69e7dc6b4008.js +1 -0
  248. package/.next/static/chunks/app/api/scope-guard/check/route-d54a69e7dc6b4008.js +1 -0
  249. package/.next/static/chunks/app/api/share/create/route-d54a69e7dc6b4008.js +1 -0
  250. package/.next/static/chunks/app/api/share/route-d54a69e7dc6b4008.js +1 -0
  251. package/.next/static/chunks/app/api/stream/route-d54a69e7dc6b4008.js +1 -0
  252. package/.next/static/chunks/app/api/tab/nav/route-d54a69e7dc6b4008.js +1 -0
  253. package/.next/static/chunks/app/api/tab/presence/route-d54a69e7dc6b4008.js +1 -0
  254. package/.next/static/chunks/app/api/telemetry/route-d54a69e7dc6b4008.js +1 -0
  255. package/.next/static/chunks/app/api/telemetry/stats/route-d54a69e7dc6b4008.js +1 -0
  256. package/.next/static/chunks/app/api/version/route-d54a69e7dc6b4008.js +1 -0
  257. package/.next/static/chunks/app/api/workspace/activate/route-d54a69e7dc6b4008.js +1 -0
  258. package/.next/static/chunks/app/api/workspace/route-d54a69e7dc6b4008.js +1 -0
  259. package/.next/static/chunks/app/layout-f908dc26e06f4302.js +1 -0
  260. package/.next/static/chunks/app/learn/{page-a14eaf5143e2df55.js → page-454e91fdcd29a1ee.js} +1 -1
  261. package/.next/static/chunks/app/map/{page-06282017c592fb3c.js → page-66f3cac308b215a7.js} +1 -1
  262. package/.next/static/chunks/app/plan/page-63b2f0d1f090f26f.js +11 -0
  263. package/.next/static/chunks/app/s/[token]/{page-a4deb16beff21840.js → page-6be414f07f63a402.js} +1 -1
  264. package/.next/static/chunks/app/settings/{page-67cab634be8bfef2.js → page-a751eabdd933f685.js} +1 -1
  265. package/.next/static/chunks/next/dist/client/components/builtin/app-error-d54a69e7dc6b4008.js +1 -0
  266. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-d54a69e7dc6b4008.js +1 -0
  267. package/.next/static/chunks/next/dist/client/components/builtin/not-found-d54a69e7dc6b4008.js +1 -0
  268. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d54a69e7dc6b4008.js +1 -0
  269. package/.next/static/css/60048003a8c96562.css +1 -0
  270. package/.next/static/ldWTvBCY5D7kyH8PMAEWm/_buildManifest.js +1 -0
  271. package/.next/trace +46 -45
  272. package/.next/trace-build +1 -1
  273. package/.next/types/app/api/ask/answer/route.ts +351 -0
  274. package/.next/types/app/api/ask/route.ts +351 -0
  275. package/.next/types/app/api/ask/verdict/route.ts +351 -0
  276. package/.next/types/app/api/changes/comment/answer/route.ts +351 -0
  277. package/.next/types/routes.d.ts +5 -1
  278. package/.next/types/validator.ts +36 -0
  279. package/dist/bin/answer.js +8 -0
  280. package/dist/bin/ask.js +5 -0
  281. package/dist/bin/beacon.js +5 -5
  282. package/dist/bin/doctor.js +20 -20
  283. package/dist/bin/guard.js +1 -1
  284. package/dist/bin/hook.js +20 -20
  285. package/dist/bin/mcp.js +32 -32
  286. package/dist/bin/plan.js +18 -18
  287. package/dist/bin/remove.js +6 -6
  288. package/dist/bin/stop-hook.js +7 -3
  289. package/dist/bin/uninstall.js +20 -20
  290. package/dist/lib/global-install.js +1 -1
  291. package/dist/lib/telemetry.js +1 -1
  292. package/dist/lib/workspaces.js +1 -1
  293. package/package.json +1 -1
  294. package/.next/server/chunks/4307.js +0 -1
  295. package/.next/server/chunks/5719.js +0 -1
  296. package/.next/server/chunks/8190.js +0 -1
  297. package/.next/static/chunks/2231-63ad38ec8fb7cb6f.js +0 -1
  298. package/.next/static/chunks/5909-387573cddda35a48.js +0 -1
  299. package/.next/static/chunks/766-242213d211df0afd.js +0 -1
  300. package/.next/static/chunks/8997-78a359d0d238622e.js +0 -1
  301. package/.next/static/chunks/app/_global-error/page-5f4c3e6e9cc8e6c9.js +0 -1
  302. package/.next/static/chunks/app/api/board-annotations/[id]/route-5f4c3e6e9cc8e6c9.js +0 -1
  303. package/.next/static/chunks/app/api/board-annotations/route-5f4c3e6e9cc8e6c9.js +0 -1
  304. package/.next/static/chunks/app/api/board-layout/route-5f4c3e6e9cc8e6c9.js +0 -1
  305. package/.next/static/chunks/app/api/bug-flags/[id]/route-5f4c3e6e9cc8e6c9.js +0 -1
  306. package/.next/static/chunks/app/api/bug-flags/route-5f4c3e6e9cc8e6c9.js +0 -1
  307. package/.next/static/chunks/app/api/changes/comment/claim/route-5f4c3e6e9cc8e6c9.js +0 -1
  308. package/.next/static/chunks/app/api/changes/comment/route-5f4c3e6e9cc8e6c9.js +0 -1
  309. package/.next/static/chunks/app/api/changes/quality/route-5f4c3e6e9cc8e6c9.js +0 -1
  310. package/.next/static/chunks/app/api/changes/route-5f4c3e6e9cc8e6c9.js +0 -1
  311. package/.next/static/chunks/app/api/changes/viewed/route-5f4c3e6e9cc8e6c9.js +0 -1
  312. package/.next/static/chunks/app/api/code-graph/position/route-5f4c3e6e9cc8e6c9.js +0 -1
  313. package/.next/static/chunks/app/api/code-graph/route-5f4c3e6e9cc8e6c9.js +0 -1
  314. package/.next/static/chunks/app/api/context/feature/route-5f4c3e6e9cc8e6c9.js +0 -1
  315. package/.next/static/chunks/app/api/context/file/route-5f4c3e6e9cc8e6c9.js +0 -1
  316. package/.next/static/chunks/app/api/context/route-5f4c3e6e9cc8e6c9.js +0 -1
  317. package/.next/static/chunks/app/api/db/arrange/route-5f4c3e6e9cc8e6c9.js +0 -1
  318. package/.next/static/chunks/app/api/db/backfill-access/route-5f4c3e6e9cc8e6c9.js +0 -1
  319. package/.next/static/chunks/app/api/db/position/route-5f4c3e6e9cc8e6c9.js +0 -1
  320. package/.next/static/chunks/app/api/db/prune-planned/route-5f4c3e6e9cc8e6c9.js +0 -1
  321. package/.next/static/chunks/app/api/db/reconcile-endpoints/route-5f4c3e6e9cc8e6c9.js +0 -1
  322. package/.next/static/chunks/app/api/db/relations/[id]/route-5f4c3e6e9cc8e6c9.js +0 -1
  323. package/.next/static/chunks/app/api/db/tables/[id]/route-5f4c3e6e9cc8e6c9.js +0 -1
  324. package/.next/static/chunks/app/api/draft/approve/route-5f4c3e6e9cc8e6c9.js +0 -1
  325. package/.next/static/chunks/app/api/draft/route-5f4c3e6e9cc8e6c9.js +0 -1
  326. package/.next/static/chunks/app/api/draft/status/route-5f4c3e6e9cc8e6c9.js +0 -1
  327. package/.next/static/chunks/app/api/edges/[id]/route-5f4c3e6e9cc8e6c9.js +0 -1
  328. package/.next/static/chunks/app/api/edges/route-5f4c3e6e9cc8e6c9.js +0 -1
  329. package/.next/static/chunks/app/api/endpoints/[id]/route-5f4c3e6e9cc8e6c9.js +0 -1
  330. package/.next/static/chunks/app/api/entities/route-5f4c3e6e9cc8e6c9.js +0 -1
  331. package/.next/static/chunks/app/api/ingest/route-5f4c3e6e9cc8e6c9.js +0 -1
  332. package/.next/static/chunks/app/api/init/route-5f4c3e6e9cc8e6c9.js +0 -1
  333. package/.next/static/chunks/app/api/lesson/close/route-5f4c3e6e9cc8e6c9.js +0 -1
  334. package/.next/static/chunks/app/api/lesson/presence/route-5f4c3e6e9cc8e6c9.js +0 -1
  335. package/.next/static/chunks/app/api/lesson/questions/route-5f4c3e6e9cc8e6c9.js +0 -1
  336. package/.next/static/chunks/app/api/lesson/route-5f4c3e6e9cc8e6c9.js +0 -1
  337. package/.next/static/chunks/app/api/lesson/save/route-5f4c3e6e9cc8e6c9.js +0 -1
  338. package/.next/static/chunks/app/api/lesson/verdict/route-5f4c3e6e9cc8e6c9.js +0 -1
  339. package/.next/static/chunks/app/api/map/describe/route-5f4c3e6e9cc8e6c9.js +0 -1
  340. package/.next/static/chunks/app/api/map/files/route-5f4c3e6e9cc8e6c9.js +0 -1
  341. package/.next/static/chunks/app/api/map/finish/route-5f4c3e6e9cc8e6c9.js +0 -1
  342. package/.next/static/chunks/app/api/map/route-5f4c3e6e9cc8e6c9.js +0 -1
  343. package/.next/static/chunks/app/api/map/start/route-5f4c3e6e9cc8e6c9.js +0 -1
  344. package/.next/static/chunks/app/api/map/touch-active/route-5f4c3e6e9cc8e6c9.js +0 -1
  345. package/.next/static/chunks/app/api/mention-search/route-5f4c3e6e9cc8e6c9.js +0 -1
  346. package/.next/static/chunks/app/api/nodes/[id]/position/route-5f4c3e6e9cc8e6c9.js +0 -1
  347. package/.next/static/chunks/app/api/nodes/[id]/route-5f4c3e6e9cc8e6c9.js +0 -1
  348. package/.next/static/chunks/app/api/nodes/positions/route-5f4c3e6e9cc8e6c9.js +0 -1
  349. package/.next/static/chunks/app/api/nodes/route-5f4c3e6e9cc8e6c9.js +0 -1
  350. package/.next/static/chunks/app/api/nodes/subtasks/route-5f4c3e6e9cc8e6c9.js +0 -1
  351. package/.next/static/chunks/app/api/notes/[id]/route-5f4c3e6e9cc8e6c9.js +0 -1
  352. package/.next/static/chunks/app/api/notes/route-5f4c3e6e9cc8e6c9.js +0 -1
  353. package/.next/static/chunks/app/api/open/route-5f4c3e6e9cc8e6c9.js +0 -1
  354. package/.next/static/chunks/app/api/plan/annotations/route-5f4c3e6e9cc8e6c9.js +0 -1
  355. package/.next/static/chunks/app/api/plan/approve/route-5f4c3e6e9cc8e6c9.js +0 -1
  356. package/.next/static/chunks/app/api/plan/history/route-5f4c3e6e9cc8e6c9.js +0 -1
  357. package/.next/static/chunks/app/api/plan/markdown/route-5f4c3e6e9cc8e6c9.js +0 -1
  358. package/.next/static/chunks/app/api/plan/presence/route-5f4c3e6e9cc8e6c9.js +0 -1
  359. package/.next/static/chunks/app/api/plan/route-5f4c3e6e9cc8e6c9.js +0 -1
  360. package/.next/static/chunks/app/api/plan/verdict/route-5f4c3e6e9cc8e6c9.js +0 -1
  361. package/.next/static/chunks/app/api/preferences/route-5f4c3e6e9cc8e6c9.js +0 -1
  362. package/.next/static/chunks/app/api/project-meta/route-5f4c3e6e9cc8e6c9.js +0 -1
  363. package/.next/static/chunks/app/api/reset/route-5f4c3e6e9cc8e6c9.js +0 -1
  364. package/.next/static/chunks/app/api/scope-guard/check/route-5f4c3e6e9cc8e6c9.js +0 -1
  365. package/.next/static/chunks/app/api/share/create/route-5f4c3e6e9cc8e6c9.js +0 -1
  366. package/.next/static/chunks/app/api/share/route-5f4c3e6e9cc8e6c9.js +0 -1
  367. package/.next/static/chunks/app/api/stream/route-5f4c3e6e9cc8e6c9.js +0 -1
  368. package/.next/static/chunks/app/api/tab/nav/route-5f4c3e6e9cc8e6c9.js +0 -1
  369. package/.next/static/chunks/app/api/tab/presence/route-5f4c3e6e9cc8e6c9.js +0 -1
  370. package/.next/static/chunks/app/api/telemetry/route-5f4c3e6e9cc8e6c9.js +0 -1
  371. package/.next/static/chunks/app/api/telemetry/stats/route-5f4c3e6e9cc8e6c9.js +0 -1
  372. package/.next/static/chunks/app/api/version/route-5f4c3e6e9cc8e6c9.js +0 -1
  373. package/.next/static/chunks/app/api/workspace/activate/route-5f4c3e6e9cc8e6c9.js +0 -1
  374. package/.next/static/chunks/app/api/workspace/route-5f4c3e6e9cc8e6c9.js +0 -1
  375. package/.next/static/chunks/app/layout-6e934a2850efd223.js +0 -1
  376. package/.next/static/chunks/app/plan/page-41a3990cb858c5f2.js +0 -11
  377. package/.next/static/chunks/next/dist/client/components/builtin/app-error-5f4c3e6e9cc8e6c9.js +0 -1
  378. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-5f4c3e6e9cc8e6c9.js +0 -1
  379. package/.next/static/chunks/next/dist/client/components/builtin/not-found-5f4c3e6e9cc8e6c9.js +0 -1
  380. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-5f4c3e6e9cc8e6c9.js +0 -1
  381. package/.next/static/css/95dc31edc34789a7.css +0 -1
  382. package/.next/static/mB9lqGEsIvB7tTvv9GU48/_buildManifest.js +0 -1
  383. /package/.next/static/{mB9lqGEsIvB7tTvv9GU48 → ldWTvBCY5D7kyH8PMAEWm}/_ssgManifest.js +0 -0
package/dist/bin/plan.js CHANGED
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- var fZ=Object.defineProperty;var IZ=(Q)=>Q;function bZ(Q,Z){this[Q]=IZ.bind(null,Z)}var VQ=(Q,Z)=>{for(var $ in Z)fZ(Q,$,{get:Z[$],enumerable:!0,configurable:!0,set:bZ.bind(Z,$)})};var M=(Q,Z)=>()=>(Q&&(Z=Q(Q=0)),Z);var LQ=1500,kQ=480000,C1=1800000,f=3600000,M1=3000;var zQ=()=>{};var HQ={};VQ(HQ,{stripAgentsPointer:()=>mQ,removeRepoAssets:()=>lZ,installRefreshSkill:()=>LZ,installPlanSkill:()=>kZ,installInitSkill:()=>yZ,installExplainSkill:()=>_Z,installCodexRepoSkills:()=>hZ,ensureWorkflowDoc:()=>mZ,ensureMcp:()=>pZ,contextDocTargets:()=>WQ,auditRepo:()=>cZ,REFRESH_SKILL:()=>XQ,PLAN_SKILL:()=>SQ,INIT_SKILL:()=>qQ,EXPLAIN_SKILL:()=>hQ});import{existsSync as j,mkdirSync as R,readFileSync as K,rmSync as I,writeFileSync as B}from"fs";import{join as U}from"path";function yZ(Q){let Z=U(Q,".claude","skills","beacon-init");R(Z,{recursive:!0});let $=U(Z,"SKILL.md");return B($,qQ),$}function LZ(Q){let Z=U(Q,".claude","skills","beacon-refresh");R(Z,{recursive:!0});let $=U(Z,"SKILL.md");return B($,XQ),$}function kZ(Q){let Z=U(Q,".claude","skills","beacon-plan");R(Z,{recursive:!0});let $=U(Z,"SKILL.md");return B($,SQ),$}function _Z(Q){let Z=U(Q,".claude","skills","beacon-explain");R(Z,{recursive:!0});let $=U(Z,"SKILL.md");return B($,hQ),$}function hZ(Q){let Z=[];for(let $ of SZ){let Y=U(Q,".agents","skills",$.name);R(Y,{recursive:!0});let J=U(Y,"SKILL.md");B(J,$.body()),Z.push(J)}return Z}function WQ(Q){let Z=U(Q,"AGENTS.md"),$=U(Q,"CLAUDE.md"),Y=j(Z),J=j($);if(!Y&&!J)return[Z,$];let V=[];if(Y)V.push(Z);if(J)V.push($);return V}function mQ(Q){let Z=U(Q,"CLAUDE.md");if(!j(Z))return;let $=K(Z,"utf8"),Y=$.split(`
3
+ var AZ=Object.defineProperty;var IZ=(Q)=>Q;function yZ(Q,Z){this[Q]=IZ.bind(null,Z)}var VQ=(Q,Z)=>{for(var $ in Z)AZ(Q,$,{get:Z[$],enumerable:!0,configurable:!0,set:yZ.bind(Z,$)})};var M=(Q,Z)=>()=>(Q&&(Z=Q(Q=0)),Z);var LQ=1500,kQ=480000,M1=1800000,A=3600000,T1=3000;var zQ=()=>{};var HQ={};VQ(HQ,{stripAgentsPointer:()=>mQ,removeRepoAssets:()=>dZ,installRefreshSkill:()=>kZ,installPlanSkill:()=>_Z,installInitSkill:()=>LZ,installExplainSkill:()=>SZ,installCodexRepoSkills:()=>mZ,ensureWorkflowDoc:()=>pZ,ensureMcp:()=>cZ,contextDocTargets:()=>WQ,auditRepo:()=>lZ,REFRESH_SKILL:()=>XQ,PLAN_SKILL:()=>SQ,INIT_SKILL:()=>qQ,EXPLAIN_SKILL:()=>hQ});import{existsSync as j,mkdirSync as R,readFileSync as K,rmSync as I,writeFileSync as B}from"fs";import{join as U}from"path";function LZ(Q){let Z=U(Q,".claude","skills","beacon-init");R(Z,{recursive:!0});let $=U(Z,"SKILL.md");return B($,qQ),$}function kZ(Q){let Z=U(Q,".claude","skills","beacon-refresh");R(Z,{recursive:!0});let $=U(Z,"SKILL.md");return B($,XQ),$}function _Z(Q){let Z=U(Q,".claude","skills","beacon-plan");R(Z,{recursive:!0});let $=U(Z,"SKILL.md");return B($,SQ),$}function SZ(Q){let Z=U(Q,".claude","skills","beacon-explain");R(Z,{recursive:!0});let $=U(Z,"SKILL.md");return B($,hQ),$}function mZ(Q){let Z=[];for(let $ of hZ){let Y=U(Q,".agents","skills",$.name);R(Y,{recursive:!0});let J=U(Y,"SKILL.md");B(J,$.body()),Z.push(J)}return Z}function WQ(Q){let Z=U(Q,"AGENTS.md"),$=U(Q,"CLAUDE.md"),Y=j(Z),J=j($);if(!Y&&!J)return[Z,$];let V=[];if(Y)V.push(Z);if(J)V.push($);return V}function mQ(Q){let Z=U(Q,"CLAUDE.md");if(!j(Z))return;let $=K(Z,"utf8"),Y=$.split(`
4
4
  `).filter((J)=>!/^\s*@\.?\/?AGENTS\.md\s*$/.test(J)).join(`
5
5
  `).trim();if(Y&&Y!==$.trim())B(Z,`${Y}
6
- `)}function mZ(Q){let Z=new RegExp(`${b}[\\s\\S]*?${UQ}`);for(let $ of WQ(Q)){let Y="";try{Y=K($,"utf8")}catch{}Y=Z.test(Y)?Y.replace(Z,_Q):`${Y.trim()}
6
+ `)}function pZ(Q){let Z=new RegExp(`${y}[\\s\\S]*?${UQ}`);for(let $ of WQ(Q)){let Y="";try{Y=K($,"utf8")}catch{}Y=Z.test(Y)?Y.replace(Z,_Q):`${Y.trim()}
7
7
 
8
8
  ${_Q}
9
9
  `.trimStart(),B($,Y.endsWith(`
10
10
  `)?Y:`${Y}
11
- `)}mQ(Q)}function pZ(Q){let Z=U(Q,".mcp.json"),$={};try{$=JSON.parse(K(Z,"utf8"))}catch{}$.mcpServers=$.mcpServers??{};let Y=$.mcpServers.beacon;if(Y){if(!Y.timeout||Y.timeout<f)return Y.timeout=f,B(Z,JSON.stringify($,null,2)+`
12
- `),{path:Z,added:!1,updated:!0};return{path:Z,added:!1,updated:!1}}return $.mcpServers.beacon={command:"beacon",args:["mcp"],timeout:f},B(Z,JSON.stringify($,null,2)+`
13
- `),{path:Z,added:!0,updated:!1}}function cZ(Q){let Z=U(Q,".mcp.json"),$=!1;try{$=!!JSON.parse(K(Z,"utf8")).mcpServers?.beacon}catch{}let Y=WQ(Q).some((J)=>{try{return K(J,"utf8").includes(b)}catch{return!1}});return{repo:Q,mcpRegistered:$,workflowBlock:Y,skills:{"beacon-init":j(U(Q,".claude","skills","beacon-init","SKILL.md")),"beacon-refresh":j(U(Q,".claude","skills","beacon-refresh","SKILL.md"))},codexSkills:{"beacon-init":j(U(Q,".agents","skills","beacon-init","SKILL.md")),"beacon-refresh":j(U(Q,".agents","skills","beacon-refresh","SKILL.md"))}}}function lZ(Q){let Z=[];for(let z of["beacon-init","beacon-refresh","beacon-db-design"]){let X=U(Q,".claude","skills",z);if(j(X))I(X,{recursive:!0,force:!0}),Z.push(z)}for(let z of["beacon-init","beacon-refresh"]){let X=U(Q,".agents","skills",z);if(j(X))I(X,{recursive:!0,force:!0}),Z.push(`codex:${z}`)}let $=!1,Y=U(Q,".mcp.json");try{let z=JSON.parse(K(Y,"utf8"));if(z.mcpServers?.beacon){if(delete z.mcpServers.beacon,$=!0,z.mcpServers&&Object.keys(z.mcpServers).length===0)delete z.mcpServers;if(Object.keys(z).length===0)I(Y,{force:!0});else B(Y,JSON.stringify(z,null,2)+`
14
- `)}}catch{}let J=!1,V=new RegExp(`\\n?${b}[\\s\\S]*?${UQ}\\n?`);for(let z of[U(Q,"AGENTS.md"),U(Q,"CLAUDE.md")])try{let X=K(z,"utf8");if(V.test(X)){let H=X.replace(V,`
11
+ `)}mQ(Q)}function cZ(Q){let Z=U(Q,".mcp.json"),$={};try{$=JSON.parse(K(Z,"utf8"))}catch{}$.mcpServers=$.mcpServers??{};let Y=$.mcpServers.beacon;if(Y){if(!Y.timeout||Y.timeout<A)return Y.timeout=A,B(Z,JSON.stringify($,null,2)+`
12
+ `),{path:Z,added:!1,updated:!0};return{path:Z,added:!1,updated:!1}}return $.mcpServers.beacon={command:"beacon",args:["mcp"],timeout:A},B(Z,JSON.stringify($,null,2)+`
13
+ `),{path:Z,added:!0,updated:!1}}function lZ(Q){let Z=U(Q,".mcp.json"),$=!1;try{$=!!JSON.parse(K(Z,"utf8")).mcpServers?.beacon}catch{}let Y=WQ(Q).some((J)=>{try{return K(J,"utf8").includes(y)}catch{return!1}});return{repo:Q,mcpRegistered:$,workflowBlock:Y,skills:{"beacon-init":j(U(Q,".claude","skills","beacon-init","SKILL.md")),"beacon-refresh":j(U(Q,".claude","skills","beacon-refresh","SKILL.md"))},codexSkills:{"beacon-init":j(U(Q,".agents","skills","beacon-init","SKILL.md")),"beacon-refresh":j(U(Q,".agents","skills","beacon-refresh","SKILL.md"))}}}function dZ(Q){let Z=[];for(let z of["beacon-init","beacon-refresh","beacon-db-design"]){let X=U(Q,".claude","skills",z);if(j(X))I(X,{recursive:!0,force:!0}),Z.push(z)}for(let z of["beacon-init","beacon-refresh"]){let X=U(Q,".agents","skills",z);if(j(X))I(X,{recursive:!0,force:!0}),Z.push(`codex:${z}`)}let $=!1,Y=U(Q,".mcp.json");try{let z=JSON.parse(K(Y,"utf8"));if(z.mcpServers?.beacon){if(delete z.mcpServers.beacon,$=!0,z.mcpServers&&Object.keys(z.mcpServers).length===0)delete z.mcpServers;if(Object.keys(z).length===0)I(Y,{force:!0});else B(Y,JSON.stringify(z,null,2)+`
14
+ `)}}catch{}let J=!1,V=new RegExp(`\\n?${y}[\\s\\S]*?${UQ}\\n?`);for(let z of[U(Q,"AGENTS.md"),U(Q,"CLAUDE.md")])try{let X=K(z,"utf8");if(V.test(X)){let H=X.replace(V,`
15
15
  `).replace(/\n{3,}/g,`
16
16
 
17
17
  `).trimStart();B(z,H.endsWith(`
@@ -229,7 +229,7 @@ so the learner sees the table IN CONTEXT, wired to the code that uses it.
229
229
  Every answer must ADD understanding (rationale, trade-off) \u2014 never just restate the question. Expand
230
230
  the narrative or add nodes where it helps. Keep looping until the tool reports the user saved or closed
231
231
  the lesson.
232
- `,SZ,b="<!-- beacon:workflow:start -->",UQ="<!-- beacon:workflow:end -->",_Q;var BQ=M(()=>{zQ();SZ=[{name:"beacon-init",body:()=>qQ},{name:"beacon-refresh",body:()=>XQ}];_Q=`${b}
232
+ `,hZ,y="<!-- beacon:workflow:start -->",UQ="<!-- beacon:workflow:end -->",_Q;var BQ=M(()=>{zQ();hZ=[{name:"beacon-init",body:()=>qQ},{name:"beacon-refresh",body:()=>XQ}];_Q=`${y}
233
233
  ## Beacon \u2014 feature workflow
234
234
 
235
235
  This project uses Beacon (a local planning/visualization panel; run \`beacon\` to open it). When you start work on a FEATURE \u2014 whether referenced via an \`@beacon:feature://\u2026\` mention, an \`@beacon:note://\u2026\` note the user wrote in the Notes panel (treat its checkbox \`- [ ]\` todos as subtasks and order features by their dependencies), or just described in chat \u2014 follow these steps in order:
@@ -301,18 +301,18 @@ Register them all in that single batched call. If a plan added five features, th
301
301
  If the feature added or materially changed a REAL architectural component (a subsystem \u2014 NOT a file), also pass \`architecture: [{ title, domain, role, \u2026 }]\` so the Architecture map stays accurate. It upserts curated components by title; never list files as components. If you found a bug or something worth investigating in a component's code, add \`bugs: [{ note }]\` to its architecture entry \u2014 it renders as a bug flag on the node (attributed to the agent); identical open flags are not duplicated. Only flag what you actually saw in the code.
302
302
 
303
303
  Pull raw planning data anytime with \`beacon_entities\` (features / architecture / tables / endpoints).
304
- ${UQ}`});import{existsSync as y,mkdirSync as GQ,readdirSync as dZ,readFileSync as T,rmSync as nZ,writeFileSync as L}from"fs";import{dirname as pQ,join as N}from"path";function cQ(){return!!process.env.CLAUDE_PLUGIN_ROOT}function lQ(Q=process.env.HOME||process.env.USERPROFILE||""){if(!Q)return null;let Z=N(Q,".claude","plugins");if(!y(Z))return null;let $=[Z];for(let Y=0;Y<3&&$.length;Y++){let J=[];for(let V of $){let q=N(V,".claude-plugin","plugin.json");try{if(y(q)&&JSON.parse(T(q,"utf8")).name==="beacon")return V}catch{}try{for(let W of dZ(V,{withFileTypes:!0}))if(W.isDirectory())J.push(N(V,W.name))}catch{}}$=J}return null}function dQ(Q){return lQ(Q)!==null}function aZ(Q){return/[\\/]\.claude[\\/]plugins[\\/]/.test(Q)}function sZ(Q=process.env.HOME||process.env.USERPROFILE||""){if(!Q)return null;try{let Z=JSON.parse(T(N(Q,".claude","plugins","installed_plugins.json"),"utf8"));for(let $ of Object.keys(Z.plugins??{}))if(/^beacon@/.test($))return{key:$,marketplace:$.split("@")[1]??""}}catch{}return null}function jQ(Q){try{return JSON.parse(T(Q,"utf8"))}catch{return{}}}function nQ(Q,Z){GQ(pQ(Q),{recursive:!0}),L(Q,JSON.stringify(Z,null,2)+`
305
- `)}function _(Q,Z){let $=jQ(Q);$.hooks=$.hooks??{},$.hooks[Z.event]=$.hooks[Z.event]??[];let Y=$.hooks[Z.event];if(Y.some((V)=>V.matcher===Z.matcher&&V.hooks?.some((q)=>q.command===Z.command)))return!1;return Y.push({matcher:Z.matcher,hooks:[{type:"command",command:Z.command}]}),nQ(Q,$),!0}function S(Q,Z){return(jQ(Q).hooks?.[Z.event]??[]).some((J)=>J.hooks?.some((V)=>V.command===Z.command))}function h(Q,Z){let $=jQ(Q),Y=$.hooks?.[Z.event];if(!Y)return!1;let J=!1,V=Y.map((q)=>{let W=q.hooks?.length??0,z=(q.hooks??[]).filter((X)=>X.command!==Z.command);if(z.length!==W)J=!0;return{...q,hooks:z}}).filter((q)=>(q.hooks??[]).length>0);if(!J)return!1;if(V.length)$.hooks[Z.event]=V;else delete $.hooks[Z.event];if($.hooks&&Object.keys($.hooks).length===0)delete $.hooks;return nQ(Q,$),!0}function m(Q,Z,$,Y){let J=`${Z}
304
+ ${UQ}`});import{existsSync as L,mkdirSync as GQ,readdirSync as aZ,readFileSync as T,rmSync as nZ,writeFileSync as k}from"fs";import{dirname as pQ,join as x}from"path";function cQ(){return!!process.env.CLAUDE_PLUGIN_ROOT}function lQ(Q=process.env.HOME||process.env.USERPROFILE||""){if(!Q)return null;let Z=x(Q,".claude","plugins");if(!L(Z))return null;let $=[Z];for(let Y=0;Y<3&&$.length;Y++){let J=[];for(let V of $){let q=x(V,".claude-plugin","plugin.json");try{if(L(q)&&JSON.parse(T(q,"utf8")).name==="beacon")return V}catch{}try{for(let W of aZ(V,{withFileTypes:!0}))if(W.isDirectory())J.push(x(V,W.name))}catch{}}$=J}return null}function dQ(Q){return lQ(Q)!==null}function sZ(Q){return/[\\/]\.claude[\\/]plugins[\\/]/.test(Q)}function tZ(Q=process.env.HOME||process.env.USERPROFILE||""){if(!Q)return null;try{let Z=JSON.parse(T(x(Q,".claude","plugins","installed_plugins.json"),"utf8"));for(let $ of Object.keys(Z.plugins??{}))if(/^beacon@/.test($))return{key:$,marketplace:$.split("@")[1]??""}}catch{}return null}function jQ(Q){try{return JSON.parse(T(Q,"utf8"))}catch{return{}}}function aQ(Q,Z){GQ(pQ(Q),{recursive:!0}),k(Q,JSON.stringify(Z,null,2)+`
305
+ `)}function S(Q,Z){let $=jQ(Q);$.hooks=$.hooks??{},$.hooks[Z.event]=$.hooks[Z.event]??[];let Y=$.hooks[Z.event];if(Y.some((V)=>V.matcher===Z.matcher&&V.hooks?.some((q)=>q.command===Z.command)))return!1;return Y.push({matcher:Z.matcher,hooks:[{type:"command",command:Z.command}]}),aQ(Q,$),!0}function h(Q,Z){return(jQ(Q).hooks?.[Z.event]??[]).some((J)=>J.hooks?.some((V)=>V.command===Z.command))}function m(Q,Z){let $=jQ(Q),Y=$.hooks?.[Z.event];if(!Y)return!1;let J=!1,V=Y.map((q)=>{let W=q.hooks?.length??0,z=(q.hooks??[]).filter((X)=>X.command!==Z.command);if(z.length!==W)J=!0;return{...q,hooks:z}}).filter((q)=>(q.hooks??[]).length>0);if(!J)return!1;if(V.length)$.hooks[Z.event]=V;else delete $.hooks[Z.event];if($.hooks&&Object.keys($.hooks).length===0)delete $.hooks;return aQ(Q,$),!0}function p(Q,Z,$,Y){let J=`${Z}
306
306
  ${Y.trim()}
307
307
  ${$}`,V="";try{V=T(Q,"utf8")}catch{}let q=new RegExp(`${Z}[\\s\\S]*?${$}`);V=q.test(V)?V.replace(q,J):V.trim()?`${V.trim()}
308
308
 
309
309
  ${J}
310
310
  `:`${J}
311
- `,GQ(pQ(Q),{recursive:!0}),L(Q,V.endsWith(`
311
+ `,GQ(pQ(Q),{recursive:!0}),k(Q,V.endsWith(`
312
312
  `)?V:`${V}
313
- `)}function w(Q,Z){try{return T(Q,"utf8").includes(Z)}catch{return!1}}function p(Q,Z,$){let Y="";try{Y=T(Q,"utf8")}catch{return!1}let J=new RegExp(`${Z}[\\s\\S]*?${$}\\n?`);if(!J.test(Y))return!1;let V=Y.replace(J,"").replace(/\n{3,}/g,`
313
+ `)}function w(Q,Z){try{return T(Q,"utf8").includes(Z)}catch{return!1}}function c(Q,Z,$){let Y="";try{Y=T(Q,"utf8")}catch{return!1}let J=new RegExp(`${Z}[\\s\\S]*?${$}\\n?`);if(!J.test(Y))return!1;let V=Y.replace(J,"").replace(/\n{3,}/g,`
314
314
 
315
- `).trimStart();return L(Q,V),!0}function c(Q,Z,$){let Y=N(Q,Z);GQ(Y,{recursive:!0});let J=N(Y,"SKILL.md");return L(J,$),J}function u(Q,Z){return y(N(Q,Z,"SKILL.md"))}function l(Q,Z){let $=N(Q,Z);if(!y($))return!1;return nZ($,{recursive:!0,force:!0}),!0}var x,k=`## Beacon (visual planning panel)
315
+ `).trimStart();return k(Q,V),!0}function l(Q,Z,$){let Y=x(Q,Z);GQ(Y,{recursive:!0});let J=x(Y,"SKILL.md");return k(J,$),J}function g(Q,Z){return L(x(Q,Z,"SKILL.md"))}function d(Q,Z){let $=x(Q,Z);if(!L($))return!1;return nZ($,{recursive:!0,force:!0}),!0}var N,_=`## Beacon (visual planning panel)
316
316
 
317
317
  This machine has Beacon installed \u2014 a local visual planning surface for the terminal-side
318
318
  agent. Beacon proposes feature plans (roadmap features + DB schema + endpoints) via MCP,
@@ -336,24 +336,24 @@ the user reviews on a canvas at /plan, and feedback flows back as the next round
336
336
  Feedback bundles inline annotations on the markdown PLUS any edits the user made directly
337
337
  on the /map and /db boards (added features, attached subtasks, edited columns, new
338
338
  endpoints). Treat board edits as the user's revision intent \u2014 re-propose matching them
339
- verbatim. Do NOT implement until the tool returns approval.`;var KQ=M(()=>{x=["beacon-init","beacon-refresh","beacon-plan","beacon-explain"]});import{mkdirSync as tZ,renameSync as rZ,rmSync as oZ,writeFileSync as iZ}from"fs";import{dirname as eZ}from"path";function d(Q,Z){tZ(eZ(Q),{recursive:!0});let $=`${Q}.tmp`;try{iZ($,Z),rZ($,Q)}catch(Y){throw oZ($,{force:!0}),Y}}function A1(Q,Z,$=!1){d(Q,JSON.stringify(Z,null,$?2:void 0))}var aQ=()=>{};var ZZ={};VQ(ZZ,{setupCodexAssets:()=>Y0,removeCodexMcp:()=>QZ,removeCodexArtifacts:()=>V0,hasCodexMcp:()=>vQ,ensureCodexMcp:()=>eQ,codexMcpProblem:()=>$0,codexDetected:()=>rQ,auditCodex:()=>J0,CODEX_HOOKS:()=>r});import{readFileSync as t}from"fs";import{homedir as Q0}from"os";import{join as O}from"path";function sQ(){return process.env.HOME||process.env.USERPROFILE||Q0()}function rQ(){if(process.env.BEACON_CODEX==="1")return!0;if(process.env.BEACON_CODEX==="0")return!1;if(NQ===void 0)NQ=Bun.which("codex")!==null;return NQ}function D(Q){try{return Bun.TOML.parse(Q)}catch{return null}}function vQ(){try{return Boolean(D(t(F(),"utf8"))?.mcp_servers?.beacon)}catch{return!1}}function $0(){let Q="";try{Q=t(F(),"utf8")}catch{return null}let Z=D(Q);if(!Z)return`~/.codex/config.toml does not parse \u2014 ${g}`;if(Z.mcp_servers?.beacon)return null;if(/^\s*mcp_servers\s*=/m.test(Q))return`mcp_servers is an inline table \u2014 ${g}`;return null}function eQ(){let Q="",Z=!1;try{Q=t(F(),"utf8"),Z=!0}catch{}if(Z){let V=D(Q);if(!V)return{added:!1,error:`~/.codex/config.toml does not parse \u2014 ${g}`};if(V.mcp_servers?.beacon)return{added:!1};if(/^\s*mcp_servers\s*=/m.test(Q))return{added:!1,error:`mcp_servers is an inline table \u2014 ${g}`}}let $=!Q?"":Q.endsWith(`
339
+ verbatim. Do NOT implement until the tool returns approval.`;var KQ=M(()=>{N=["beacon-init","beacon-refresh","beacon-plan","beacon-explain"]});import{mkdirSync as rZ,renameSync as oZ,rmSync as iZ,writeFileSync as eZ}from"fs";import{dirname as Q0}from"path";function a(Q,Z){rZ(Q0(Q),{recursive:!0});let $=`${Q}.tmp`;try{eZ($,Z),oZ($,Q)}catch(Y){throw iZ($,{force:!0}),Y}}function b1(Q,Z,$=!1){a(Q,JSON.stringify(Z,null,$?2:void 0))}var nQ=()=>{};var ZZ={};VQ(ZZ,{setupCodexAssets:()=>J0,removeCodexMcp:()=>QZ,removeCodexArtifacts:()=>z0,hasCodexMcp:()=>vQ,ensureCodexMcp:()=>eQ,codexMcpProblem:()=>Y0,codexDetected:()=>rQ,auditCodex:()=>V0,CODEX_HOOKS:()=>o});import{readFileSync as r}from"fs";import{homedir as Z0}from"os";import{join as f}from"path";function sQ(){return process.env.HOME||process.env.USERPROFILE||Z0()}function rQ(){if(process.env.BEACON_CODEX==="1")return!0;if(process.env.BEACON_CODEX==="0")return!1;if(xQ===void 0)xQ=Bun.which("codex")!==null;return xQ}function O(Q){try{return Bun.TOML.parse(Q)}catch{return null}}function vQ(){try{return Boolean(O(r(F(),"utf8"))?.mcp_servers?.beacon)}catch{return!1}}function Y0(){let Q="";try{Q=r(F(),"utf8")}catch{return null}let Z=O(Q);if(!Z)return`~/.codex/config.toml does not parse \u2014 ${D}`;if(Z.mcp_servers?.beacon)return null;if(/^\s*mcp_servers\s*=/m.test(Q))return`mcp_servers is an inline table \u2014 ${D}`;return null}function eQ(){let Q="",Z=!1;try{Q=r(F(),"utf8"),Z=!0}catch{}if(Z){let V=O(Q);if(!V)return{added:!1,error:`~/.codex/config.toml does not parse \u2014 ${D}`};if(V.mcp_servers?.beacon)return{added:!1};if(/^\s*mcp_servers\s*=/m.test(Q))return{added:!1,error:`mcp_servers is an inline table \u2014 ${D}`}}let $=!Q?"":Q.endsWith(`
340
340
  `)?`
341
341
  `:`
342
342
 
343
- `,Y=Q+$+Z0;if(D(Y)?.mcp_servers?.beacon?.command!=="beacon")return{added:!1,error:`could not safely append [mcp_servers.beacon] \u2014 ${g}`};return d(F(),Y),{added:!0}}function QZ(){let Q="";try{Q=t(F(),"utf8")}catch{return{removed:!1}}let Z=Q.split(`
343
+ `,Y=Q+$+$0;if(O(Y)?.mcp_servers?.beacon?.command!=="beacon")return{added:!1,error:`could not safely append [mcp_servers.beacon] \u2014 ${D}`};return a(F(),Y),{added:!0}}function QZ(){let Q="";try{Q=r(F(),"utf8")}catch{return{removed:!1}}let Z=Q.split(`
344
344
  `),$=Z.indexOf(oQ);if($===-1)return{removed:!1,skipped:vQ()};let Y=Z.indexOf(iQ,$);if(Y===-1)return{removed:!1,skipped:!0};Z.splice($,Y-$+1);let J=Z.join(`
345
345
  `).replace(/\n{3,}/g,`
346
346
 
347
- `).replace(/^\n+/,"");if(D(J)===null)return{removed:!1,skipped:!0};return d(F(),J),{removed:!0}}async function Y0(){let{INIT_SKILL:Q,REFRESH_SKILL:Z,PLAN_SKILL:$,EXPLAIN_SKILL:Y}=await Promise.resolve().then(() => (BQ(),HQ)),J={"beacon-init":Q,"beacon-refresh":Z,"beacon-plan":$,"beacon-explain":Y},V=[];for(let X of x){if(!u(a(),X))V.push(X);c(a(),X,J[X])}let q=0;for(let X of r)if(_(PQ(),{event:X.event,matcher:X.matcher,command:X.command}))q++;let W=w(n(),s);m(n(),s,tQ,k);let z=eQ();return{skillsAdded:V,hooksAdded:q,agentsMdBlockTouched:!W,mcp:z}}function J0(){let Q={};for(let $ of x)Q[$]=u(a(),$);let Z={};for(let $ of r)Z[$.event]=S(PQ(),{event:$.event,command:$.command});return{detected:rQ(),skills:Q,hooks:Z,agentsMdBlock:w(n(),s),mcp:vQ()}}function V0(){let Q=[];for(let J of x)if(l(a(),J))Q.push(J);let Z=0;for(let J of r)if(h(PQ(),{event:J.event,command:J.command}))Z++;let $=p(n(),s,tQ),Y=QZ();return{skillsRemoved:Q,hooksRemoved:Z,agentsMdBlockRemoved:$,mcpRemoved:Y.removed,mcpSkipped:Y.skipped}}var xQ=()=>O(sQ(),".codex"),PQ=()=>O(xQ(),"hooks.json"),F=()=>O(xQ(),"config.toml"),n=()=>O(xQ(),"AGENTS.md"),a=()=>O(sQ(),".agents","skills"),s="<!-- beacon:global:start -->",tQ="<!-- beacon:global:end -->",r,NQ,oQ="# beacon:start (managed by Beacon \u2014 `beacon uninstall` removes this block)",iQ="# beacon:end",Z0,g="add it manually: codex mcp add beacon -- beacon mcp";var $Z=M(()=>{KQ();aQ();r=[{event:"PostToolUse",matcher:"apply_patch",command:"beacon hook",description:"Report file edits to Beacon's active feature so the map stays fresh."},{event:"UserPromptSubmit",matcher:"*",command:"beacon prompt",description:"On feature-y prompts in a Beacon-wired repo, remind the agent to run the context\u2192propose\u2192describe loop (no-op otherwise)."},{event:"Stop",matcher:"*",command:"beacon stop-hook",description:"When the agent ends a turn asking for plan approval in prose, nudge it to present the plan on Beacon's /plan canvas."}];Z0=`${oQ}
347
+ `).replace(/^\n+/,"");if(O(J)===null)return{removed:!1,skipped:!0};return a(F(),J),{removed:!0}}async function J0(){let{INIT_SKILL:Q,REFRESH_SKILL:Z,PLAN_SKILL:$,EXPLAIN_SKILL:Y}=await Promise.resolve().then(() => (BQ(),HQ)),J={"beacon-init":Q,"beacon-refresh":Z,"beacon-plan":$,"beacon-explain":Y},V=[];for(let X of N){if(!g(s(),X))V.push(X);l(s(),X,J[X])}let q=0;for(let X of o)if(S(PQ(),{event:X.event,matcher:X.matcher,command:X.command}))q++;let W=w(n(),t);p(n(),t,tQ,_);let z=eQ();return{skillsAdded:V,hooksAdded:q,agentsMdBlockTouched:!W,mcp:z}}function V0(){let Q={};for(let $ of N)Q[$]=g(s(),$);let Z={};for(let $ of o)Z[$.event]=h(PQ(),{event:$.event,command:$.command});return{detected:rQ(),skills:Q,hooks:Z,agentsMdBlock:w(n(),t),mcp:vQ()}}function z0(){let Q=[];for(let J of N)if(d(s(),J))Q.push(J);let Z=0;for(let J of o)if(m(PQ(),{event:J.event,command:J.command}))Z++;let $=c(n(),t,tQ),Y=QZ();return{skillsRemoved:Q,hooksRemoved:Z,agentsMdBlockRemoved:$,mcpRemoved:Y.removed,mcpSkipped:Y.skipped}}var NQ=()=>f(sQ(),".codex"),PQ=()=>f(NQ(),"hooks.json"),F=()=>f(NQ(),"config.toml"),n=()=>f(NQ(),"AGENTS.md"),s=()=>f(sQ(),".agents","skills"),t="<!-- beacon:global:start -->",tQ="<!-- beacon:global:end -->",o,xQ,oQ="# beacon:start (managed by Beacon \u2014 `beacon uninstall` removes this block)",iQ="# beacon:end",$0,D="add it manually: codex mcp add beacon -- beacon mcp";var $Z=M(()=>{KQ();nQ();o=[{event:"PostToolUse",matcher:"apply_patch",command:"beacon hook",description:"Report file edits to Beacon's active feature so the map stays fresh."},{event:"UserPromptSubmit",matcher:"*",command:"beacon prompt",description:"On feature-y prompts in a Beacon-wired repo, remind the agent to run the context\u2192propose\u2192describe loop (no-op otherwise)."},{event:"Stop",matcher:"*",command:"beacon stop-hook",description:"When the agent ends a turn asking for plan approval in prose, nudge it to present the plan on Beacon's /plan canvas."}];$0=`${oQ}
348
348
  [mcp_servers.beacon]
349
349
  command = "beacon"
350
350
  args = ["mcp"]
351
351
  ${iQ}
352
- `});var XZ={};VQ(XZ,{provisionDb:()=>E0});import{createClient as v0}from"@libsql/client";import{drizzle as C0}from"drizzle-orm/libsql";import{migrate as M0}from"drizzle-orm/libsql/migrator";import{readMigrationFiles as T0}from"drizzle-orm/migrator";import{dirname as wQ,join as F0}from"path";import{fileURLToPath as R0}from"url";async function e(Q,Z){return(await Q.execute({sql:"SELECT 1 FROM sqlite_master WHERE type='table' AND name = ?",args:[Z]})).rows.length>0}async function D0(Q,Z){let $=await Q.execute(`PRAGMA table_info("${Z}")`);return new Set($.rows.map((Y)=>String(Y.name)))}async function qZ(Q){if(!await e(Q,"__drizzle_migrations"))return 0;let Z=await Q.execute('SELECT count(*) AS n FROM "__drizzle_migrations"');return Number(Z.rows[0]?.n??0)}async function O0(Q){for(let[Z,$]of Object.entries(g0)){if(!await e(Q,Z))continue;let Y=await D0(Q,Z);for(let J of $){if(!Y.has(J))continue;await Q.execute(`UPDATE "${Z}" SET "${J}" = CAST((julianday("${J}") - 2440587.5) * 86400000 AS INTEGER) WHERE typeof("${J}") = 'text'`)}}}async function E0(Q,Z=u0){let $=v0({url:Q});try{await $.execute("PRAGMA journal_mode = WAL;"),await $.execute("PRAGMA foreign_keys = ON;"),await $.execute("PRAGMA busy_timeout = 5000;");let Y=await e($,"__drizzle_migrations"),J=await e($,"Node"),V=!1;if(J&&!Y){let W=T0({migrationsFolder:Z})[0];if(W)await $.execute('CREATE TABLE IF NOT EXISTS "__drizzle_migrations" (id SERIAL PRIMARY KEY, hash text NOT NULL, created_at numeric)'),await $.execute({sql:'INSERT INTO "__drizzle_migrations" ("hash", "created_at") VALUES (?, ?)',args:[W.hash,W.folderMillis]}),V=!0}let q=await qZ($);if(await M0(C0($),{migrationsFolder:Z}),await qZ($)>q)V=!0;return await O0($),{migrated:V}}finally{$.close()}}var w0,u0,g0;var UZ=M(async()=>{w0=wQ(wQ(wQ(R0(import.meta.url)))),u0=process.env.BEACON_MIGRATIONS_DIR||F0(w0,"drizzle"),g0={Node:["createdAt","updatedAt"],Note:["createdAt","updatedAt"],DbTable:["createdAt","updatedAt"],Endpoint:["createdAt","updatedAt"],DraftTable:["createdAt"],SyncState:["codeGraphSyncedAt","updatedAt"],AppSetting:["updatedAt"],ProjectMeta:["updatedAt"],CodeFile:["updatedAt"]}});KQ();import{existsSync as z0}from"fs";import{homedir as q0}from"os";import{join as o}from"path";function X0(){return process.env.HOME||process.env.USERPROFILE||q0()}var i=()=>o(X0(),".claude"),CQ=()=>o(i(),"skills"),MQ=()=>o(i(),"settings.json"),TQ=()=>o(i(),"CLAUDE.md"),FQ="<!-- beacon:global:start -->",YZ="<!-- beacon:global:end -->";var U0=k,RQ=[{event:"PreToolUse",matcher:"Edit|Write|MultiEdit",command:"beacon guard",description:"Gate edits against the active plan's scope contract: in-scope \u2192 allow, off-scope \u2192 ask the user to authorize. Fail-open when there's no active contract."},{event:"PostToolUse",matcher:"Edit|Write|MultiEdit",command:"beacon hook",description:"Report file edits to Beacon's active feature so the map stays fresh."},{event:"PermissionRequest",matcher:"ExitPlanMode",command:"beacon plan",description:"Pipe the agent's plan markdown into Beacon's /plan canvas for review."},{event:"UserPromptSubmit",matcher:"*",command:"beacon prompt",description:"On feature-y prompts in a Beacon-wired repo, remind the agent to run the context\u2192propose\u2192describe loop (no-op otherwise)."},{event:"Stop",matcher:"*",command:"beacon stop-hook",description:"When the agent ends a turn asking for plan approval in prose (instead of presenting it), nudge it to present the plan on Beacon's /plan canvas. Bounded by stop_hook_active \u2014 at most one nudge."}];function W0(Q,Z){return c(CQ(),Q,Z)}function JZ(Q){return u(CQ(),Q)}function H0(Q){return l(CQ(),Q)}function B0(Q){return _(MQ(),Q)}function G0(Q){return S(MQ(),Q)}function j0(Q){return h(MQ(),Q)}function K0(Q){m(TQ(),FQ,YZ,Q)}function VZ(){return w(TQ(),FQ)}function N0(){return p(TQ(),FQ,YZ)}function p1(){let Q={};for(let $ of x)Q[$]=JZ($);let Z={};for(let $ of RQ)Z[$.event]=G0({event:$.event,command:$.command});return{homeExists:z0(i()),skills:Q,hooks:Z,claudeMdBlock:VZ()}}async function x0(){let{INIT_SKILL:Q,REFRESH_SKILL:Z,PLAN_SKILL:$,EXPLAIN_SKILL:Y}=await Promise.resolve().then(() => (BQ(),HQ)),J={"beacon-init":Q,"beacon-refresh":Z,"beacon-plan":$,"beacon-explain":Y},V=[];for(let z of x){if(!JZ(z))V.push(z);W0(z,J[z])}let q=0;for(let z of RQ)if(B0({event:z.event,matcher:z.matcher,command:z.command}))q++;let W=VZ();return K0(U0),{skillsAdded:V,hooksAdded:q,claudeMdBlockTouched:!W}}async function zZ(){if(cQ())return{ok:!0,skipped:"plugin",skillsAdded:[],hooksAdded:0,claudeMdBlockTouched:!1};let Q;if(dQ()){try{P0()}catch{}Q={ok:!0,skipped:"plugin-present",skillsAdded:[],hooksAdded:0,claudeMdBlockTouched:!1}}else try{Q={ok:!0,...await x0()}}catch(Z){Q={ok:!1,error:Z instanceof Error?Z.message:String(Z),skillsAdded:[],hooksAdded:0,claudeMdBlockTouched:!1}}try{let Z=await Promise.resolve().then(() => ($Z(),ZZ));if(Z.codexDetected())Q.codex={ok:!0,...await Z.setupCodexAssets()}}catch(Z){Q.codex={ok:!1,error:Z instanceof Error?Z.message:String(Z),skillsAdded:[],hooksAdded:0,agentsMdBlockTouched:!1,mcp:{added:!1}}}return Q}function P0(){let Q=[];for(let Y of x)if(H0(Y))Q.push(Y);let Z=0;for(let Y of RQ)if(j0(Y))Z++;let $=N0();return{skillsRemoved:Q,hooksRemoved:Z,claudeMdBlockRemoved:$}}import{AsyncLocalStorage as A0}from"async_hooks";import{spawnSync as f0}from"child_process";import{createHash as I0}from"crypto";import{existsSync as HZ,mkdirSync as E,readFileSync as gQ,writeFileSync as DQ}from"fs";import{homedir as BZ}from"os";import{basename as b0,join as P,parse as y0,resolve as WZ}from"path";function G(){return process.env.BEACON_HOME||P(BZ(),".beacon")}function OQ(){return P(G(),"workspaces.json")}function QQ(Q){return I0("sha256").update(Q).digest("hex").slice(0,12)}function $2(Q=process.cwd()){let Z=f0("git",["rev-parse","--show-toplevel"],{cwd:Q,stdio:["ignore","pipe","ignore"]});if(Z.status===0){let $=Z.stdout?.toString().trim();if($)return $}return Q}function GZ(Q){let Z=WZ(Q);return Z!==WZ(BZ())&&Z!==y0(Z).root}function jZ(){return P(G(),"deleted.json")}function EQ(){try{let Q=JSON.parse(gQ(jZ(),"utf8"));return Array.isArray(Q)?Q:[]}catch{return[]}}function KZ(Q){E(G(),{recursive:!0}),DQ(jZ(),JSON.stringify(Q,null,2))}function NZ(Q){return EQ().includes(Q)}function Y2(Q){let Z=EQ();if(!Z.includes(Q))KZ([...Z,Q])}function L0(Q){let Z=EQ();if(Z.includes(Q))KZ(Z.filter(($)=>$!==Q))}function ZQ(Q){return P(G(),Q)}function k0(Q){return`file:${P(ZQ(Q),"db.sqlite")}`}function A(){try{let Q=JSON.parse(gQ(OQ(),"utf8"));return Array.isArray(Q)?Q:[]}catch{return[]}}function AQ(Q){E(G(),{recursive:!0}),DQ(OQ(),JSON.stringify(Q,null,2))}function xZ(){return A().sort((Q,Z)=>Z.lastOpenedAt.localeCompare(Q.lastOpenedAt))}function v(Q){return A().find((Z)=>Z.id===Q)??null}function PZ(Q,Z,$=new Date().toISOString()){if(!GZ(Q))throw Error(`beacon: refusing to register a non-repo path as a workspace: ${Q}`);let Y=QQ(Q);if(NZ(Y))throw Error(`beacon: workspace ${Y} (${Q}) was deleted \u2014 run \`beacon\` or /beacon-init to re-add it`);let J=A(),V=J.find((z)=>z.id===Y),q={id:Y,path:Q,name:Z||V?.name||b0(Q),lastOpenedAt:$},W=[q,...J.filter((z)=>z.id!==Y)];return E(ZQ(Y),{recursive:!0}),AQ(W),q}function J2(Q,Z){return L0(QQ(Q)),PZ(Q,Z)}function V2(Q,Z=new Date().toISOString()){let $=A(),Y=$.find((J)=>J.id===Q);if(!Y)return;Y.lastOpenedAt=Z,AQ($)}function z2(Q){if(AQ(A().filter((Z)=>Z.id!==Q)),fQ()===Q)_0(xZ()[0]?.id??null)}function vZ(){return P(G(),"active")}function fQ(){try{return gQ(vZ(),"utf8").trim()||null}catch{return null}}function _0(Q){E(G(),{recursive:!0}),DQ(vZ(),Q??"")}function q2(){let Q=fQ();return Q?v(Q):null}function X2(){let Q=m0()??fQ();return Q?v(Q):null}function U2(Q){return v(Q)?.path??null}function W2(){return HZ(OQ())}var CZ="beacon_ws";function MZ(Q,Z){let $=Q.headers.get("cookie");if(!$)return null;for(let Y of $.split(";")){let J=Y.indexOf("=");if(J===-1)continue;if(Y.slice(0,J).trim()===Z)return decodeURIComponent(Y.slice(J+1).trim())}return null}function H2(Q){let Z=Q.headers.get("x-beacon-workspace");if(Z&&v(Z))return Z;let $=MZ(Q,CZ);if($&&v($))return $;return S0()}function S0(){let Q=xZ();return Q.length===1?Q[0].id:null}var h0="x-beacon-workspace-path";async function B2(Q){let Z=Q.headers.get("x-beacon-workspace");if(Z&&v(Z))return Z;let $=Q.headers.get(h0);if($&&GZ($)&&!NZ(QQ($))&&(!Z||QQ($)===Z)){let J=PZ($);return await p0(J.id),J.id}let Y=MZ(Q,CZ);if(Y&&v(Y))return Y;return null}var TZ=new A0;function G2(Q,Z){return Q?TZ.run(Q,Z):Z()}function m0(){return TZ.getStore()??null}var uQ=new Set;function j2(Q){uQ.delete(P(ZQ(Q),"db.sqlite"))}async function p0(Q){let Z=ZQ(Q),$=P(Z,"db.sqlite"),Y=HZ($);if(Y&&uQ.has($))return{ok:!0,created:!1,migrated:!1};try{E(Z,{recursive:!0});let{provisionDb:J}=await UZ().then(() => XZ),V=await J(k0(Q));return uQ.add($),{ok:!0,created:!Y,migrated:Y&&V.migrated}}catch(J){return{ok:!1,created:!1,migrated:!1,error:J instanceof Error?J.message:String(J)}}}import{connect as c0}from"net";var x2=4319;function l0(Q,Z,$=400){return new Promise((Y)=>{let J=c0({host:Q,port:Z}),V=!1,q=(W)=>{if(V)return;V=!0,J.destroy(),Y(W)};J.once("connect",()=>q(!0)),J.once("error",()=>q(!1)),J.setTimeout($,()=>q(!1))})}async function d0(Q){for(let Z of["127.0.0.1","::1"])if(await l0(Z,Q))return!1;return!0}async function FZ(Q,Z=20){for(let $=Q;$<Q+Z;$++)if(await d0($))return $;return Q}import{execSync as e0,spawn as Q1}from"child_process";import{mkdirSync as Z1,openSync as $1,readFileSync as Y1,writeFileSync as J1}from"fs";import{homedir as V1}from"os";import{dirname as z1,join as YQ}from"path";import{fileURLToPath as q1}from"url";import{createHash as X1}from"crypto";zQ();import{mkdirSync as a0,readFileSync as s0,writeFileSync as t0}from"fs";import{join as r0}from"path";var n0=["default","acceptEdits","bypassPermissions","auto"];function RZ(Q){return typeof Q==="string"&&n0.includes(Q)}function wZ(Q,Z){let $={behavior:"allow"};if(Q)$.updatedPermissions=[{type:"setMode",mode:Q,destination:"session"}];let Y={hookEventName:"PermissionRequest",decision:$};if(Z?.trim())Y.additionalContext=Z;return{hookSpecificOutput:Y}}function uZ(){return r0(G(),"preferences.json")}function IQ(){try{let Q=JSON.parse(s0(uZ(),"utf8"));return{planApprovalMode:RZ(Q.planApprovalMode)?Q.planApprovalMode:void 0,planApprovalModeConfigured:Q.planApprovalModeConfigured===!0,telemetryUuid:typeof Q.telemetryUuid==="string"?Q.telemetryUuid:void 0,telemetryEnabled:Q.telemetryEnabled===!1?!1:Q.telemetryEnabled===!0?!0:void 0}}catch{return{}}}function R2(Q){let Z={...IQ(),...Q};return a0(G(),{recursive:!0}),t0(uZ(),JSON.stringify(Z,null,2)),Z}function gZ(Q){if(!Q?.length)return"";let Z=Q.map((Y)=>Y.id?` \u2022 ${Y.title} \u2014 id: ${Y.id}`:` \u2022 ${Y.title}`),$=Q.some((Y)=>Y.id);return`
352
+ `});var XZ={};VQ(XZ,{provisionDb:()=>E0});import{createClient as C0}from"@libsql/client";import{drizzle as M0}from"drizzle-orm/libsql";import{migrate as T0}from"drizzle-orm/libsql/migrator";import{readMigrationFiles as F0}from"drizzle-orm/migrator";import{dirname as wQ,join as R0}from"path";import{fileURLToPath as w0}from"url";async function QQ(Q,Z){return(await Q.execute({sql:"SELECT 1 FROM sqlite_master WHERE type='table' AND name = ?",args:[Z]})).rows.length>0}async function f0(Q,Z){let $=await Q.execute(`PRAGMA table_info("${Z}")`);return new Set($.rows.map((Y)=>String(Y.name)))}async function qZ(Q){if(!await QQ(Q,"__drizzle_migrations"))return 0;let Z=await Q.execute('SELECT count(*) AS n FROM "__drizzle_migrations"');return Number(Z.rows[0]?.n??0)}async function u0(Q){for(let[Z,$]of Object.entries(O0)){if(!await QQ(Q,Z))continue;let Y=await f0(Q,Z);for(let J of $){if(!Y.has(J))continue;await Q.execute(`UPDATE "${Z}" SET "${J}" = CAST((julianday("${J}") - 2440587.5) * 86400000 AS INTEGER) WHERE typeof("${J}") = 'text'`)}}}async function E0(Q,Z=D0){let $=C0({url:Q});try{await $.execute("PRAGMA journal_mode = WAL;"),await $.execute("PRAGMA foreign_keys = ON;"),await $.execute("PRAGMA busy_timeout = 5000;");let Y=await QQ($,"__drizzle_migrations"),J=await QQ($,"Node"),V=!1;if(J&&!Y){let W=F0({migrationsFolder:Z})[0];if(W)await $.execute('CREATE TABLE IF NOT EXISTS "__drizzle_migrations" (id SERIAL PRIMARY KEY, hash text NOT NULL, created_at numeric)'),await $.execute({sql:'INSERT INTO "__drizzle_migrations" ("hash", "created_at") VALUES (?, ?)',args:[W.hash,W.folderMillis]}),V=!0}let q=await qZ($);if(await T0(M0($),{migrationsFolder:Z}),await qZ($)>q)V=!0;return await u0($),{migrated:V}}finally{$.close()}}var g0,D0,O0;var UZ=M(async()=>{g0=wQ(wQ(wQ(w0(import.meta.url)))),D0=process.env.BEACON_MIGRATIONS_DIR||R0(g0,"drizzle"),O0={Node:["createdAt","updatedAt"],Note:["createdAt","updatedAt"],DbTable:["createdAt","updatedAt"],Endpoint:["createdAt","updatedAt"],DraftTable:["createdAt"],SyncState:["codeGraphSyncedAt","updatedAt"],AppSetting:["updatedAt"],ProjectMeta:["updatedAt"],CodeFile:["updatedAt"]}});KQ();import{existsSync as q0}from"fs";import{homedir as X0}from"os";import{join as i}from"path";function U0(){return process.env.HOME||process.env.USERPROFILE||X0()}var e=()=>i(U0(),".claude"),CQ=()=>i(e(),"skills"),MQ=()=>i(e(),"settings.json"),TQ=()=>i(e(),"CLAUDE.md"),FQ="<!-- beacon:global:start -->",YZ="<!-- beacon:global:end -->";var W0=_,RQ=[{event:"PreToolUse",matcher:"Edit|Write|MultiEdit",command:"beacon guard",description:"Gate edits against the active plan's scope contract: in-scope \u2192 allow, off-scope \u2192 ask the user to authorize. Fail-open when there's no active contract."},{event:"PostToolUse",matcher:"Edit|Write|MultiEdit",command:"beacon hook",description:"Report file edits to Beacon's active feature so the map stays fresh."},{event:"PermissionRequest",matcher:"ExitPlanMode",command:"beacon plan",description:"Pipe the agent's plan markdown into Beacon's /plan canvas for review."},{event:"PreToolUse",matcher:"AskUserQuestion",command:"beacon ask",description:"Surface the agent's AskUserQuestion in Beacon's modal; your pick flows back as the answer (falls through to the terminal if Beacon isn't open)."},{event:"PermissionRequest",matcher:"Edit|Write|MultiEdit|Bash|NotebookEdit",command:"beacon ask",description:"Surface edit/create/run approvals in Beacon's modal; your allow/deny flows back (falls through to the terminal prompt if Beacon isn't open)."},{event:"UserPromptSubmit",matcher:"*",command:"beacon prompt",description:"On feature-y prompts in a Beacon-wired repo, remind the agent to run the context\u2192propose\u2192describe loop (no-op otherwise)."},{event:"Stop",matcher:"*",command:"beacon stop-hook",description:"When the agent ends a turn asking for plan approval in prose (instead of presenting it), nudge it to present the plan on Beacon's /plan canvas. Bounded by stop_hook_active \u2014 at most one nudge."}];function H0(Q,Z){return l(CQ(),Q,Z)}function JZ(Q){return g(CQ(),Q)}function B0(Q){return d(CQ(),Q)}function G0(Q){return S(MQ(),Q)}function j0(Q){return h(MQ(),Q)}function K0(Q){return m(MQ(),Q)}function x0(Q){p(TQ(),FQ,YZ,Q)}function VZ(){return w(TQ(),FQ)}function N0(){return c(TQ(),FQ,YZ)}function c1(){let Q={};for(let $ of N)Q[$]=JZ($);let Z={};for(let $ of RQ)Z[$.event]=j0({event:$.event,command:$.command});return{homeExists:q0(e()),skills:Q,hooks:Z,claudeMdBlock:VZ()}}async function P0(){let{INIT_SKILL:Q,REFRESH_SKILL:Z,PLAN_SKILL:$,EXPLAIN_SKILL:Y}=await Promise.resolve().then(() => (BQ(),HQ)),J={"beacon-init":Q,"beacon-refresh":Z,"beacon-plan":$,"beacon-explain":Y},V=[];for(let z of N){if(!JZ(z))V.push(z);H0(z,J[z])}let q=0;for(let z of RQ)if(G0({event:z.event,matcher:z.matcher,command:z.command}))q++;let W=VZ();return x0(W0),{skillsAdded:V,hooksAdded:q,claudeMdBlockTouched:!W}}async function zZ(){if(cQ())return{ok:!0,skipped:"plugin",skillsAdded:[],hooksAdded:0,claudeMdBlockTouched:!1};let Q;if(dQ()){try{v0()}catch{}Q={ok:!0,skipped:"plugin-present",skillsAdded:[],hooksAdded:0,claudeMdBlockTouched:!1}}else try{Q={ok:!0,...await P0()}}catch(Z){Q={ok:!1,error:Z instanceof Error?Z.message:String(Z),skillsAdded:[],hooksAdded:0,claudeMdBlockTouched:!1}}try{let Z=await Promise.resolve().then(() => ($Z(),ZZ));if(Z.codexDetected())Q.codex={ok:!0,...await Z.setupCodexAssets()}}catch(Z){Q.codex={ok:!1,error:Z instanceof Error?Z.message:String(Z),skillsAdded:[],hooksAdded:0,agentsMdBlockTouched:!1,mcp:{added:!1}}}return Q}function v0(){let Q=[];for(let Y of N)if(B0(Y))Q.push(Y);let Z=0;for(let Y of RQ)if(K0(Y))Z++;let $=N0();return{skillsRemoved:Q,hooksRemoved:Z,claudeMdBlockRemoved:$}}import{AsyncLocalStorage as b0}from"async_hooks";import{spawnSync as A0}from"child_process";import{createHash as I0}from"crypto";import{existsSync as HZ,mkdirSync as E,readFileSync as DQ,writeFileSync as OQ}from"fs";import{homedir as BZ}from"os";import{basename as y0,join as P,parse as L0,resolve as WZ}from"path";function G(){return process.env.BEACON_HOME||P(BZ(),".beacon")}function fQ(){return P(G(),"workspaces.json")}function u(Q){return I0("sha256").update(Q).digest("hex").slice(0,12)}function k0(Q=process.cwd()){let Z=A0("git",["rev-parse","--show-toplevel"],{cwd:Q,stdio:["ignore","pipe","ignore"]});if(Z.status===0){let $=Z.stdout?.toString().trim();if($)return $}return Q}function GZ(Q){let Z=WZ(Q);return Z!==WZ(BZ())&&Z!==L0(Z).root}function jZ(){return P(G(),"deleted.json")}function uQ(){try{let Q=JSON.parse(DQ(jZ(),"utf8"));return Array.isArray(Q)?Q:[]}catch{return[]}}function KZ(Q){E(G(),{recursive:!0}),OQ(jZ(),JSON.stringify(Q,null,2))}function xZ(Q){return uQ().includes(Q)}function Y2(Q){let Z=uQ();if(!Z.includes(Q))KZ([...Z,Q])}function _0(Q){let Z=uQ();if(Z.includes(Q))KZ(Z.filter(($)=>$!==Q))}function ZQ(Q){return P(G(),Q)}function S0(Q){return`file:${P(ZQ(Q),"db.sqlite")}`}function b(){try{let Q=JSON.parse(DQ(fQ(),"utf8"));return Array.isArray(Q)?Q:[]}catch{return[]}}function EQ(Q){E(G(),{recursive:!0}),OQ(fQ(),JSON.stringify(Q,null,2))}function NZ(){return b().sort((Q,Z)=>Z.lastOpenedAt.localeCompare(Q.lastOpenedAt))}function v(Q){return b().find((Z)=>Z.id===Q)??null}function PZ(Q,Z,$=new Date().toISOString()){if(!GZ(Q))throw Error(`beacon: refusing to register a non-repo path as a workspace: ${Q}`);let Y=u(Q);if(xZ(Y))throw Error(`beacon: workspace ${Y} (${Q}) was deleted \u2014 run \`beacon\` or /beacon-init to re-add it`);let J=b(),V=J.find((z)=>z.id===Y),q={id:Y,path:Q,name:Z||V?.name||y0(Q),lastOpenedAt:$},W=[q,...J.filter((z)=>z.id!==Y)];return E(ZQ(Y),{recursive:!0}),EQ(W),q}function J2(Q,Z){return _0(u(Q)),PZ(Q,Z)}function V2(Q,Z=new Date().toISOString()){let $=b(),Y=$.find((J)=>J.id===Q);if(!Y)return;Y.lastOpenedAt=Z,EQ($)}function z2(Q){if(EQ(b().filter((Z)=>Z.id!==Q)),bQ()===Q)h0(NZ()[0]?.id??null)}function vZ(){return P(G(),"active")}function bQ(){try{return DQ(vZ(),"utf8").trim()||null}catch{return null}}function h0(Q){E(G(),{recursive:!0}),OQ(vZ(),Q??"")}function q2(){let Q=bQ();return Q?v(Q):null}function X2(){let Q=p0()??bQ();return Q?v(Q):null}function U2(Q){return v(Q)?.path??null}function W2(){return HZ(fQ())}var CZ="beacon_ws";function MZ(Q,Z){let $=Q.headers.get("cookie");if(!$)return null;for(let Y of $.split(";")){let J=Y.indexOf("=");if(J===-1)continue;if(Y.slice(0,J).trim()===Z)return decodeURIComponent(Y.slice(J+1).trim())}return null}function H2(Q){let Z=Q.headers.get("x-beacon-workspace");if(Z&&v(Z))return Z;let $=MZ(Q,CZ);if($&&v($))return $;return m0()}function m0(){let Q=NZ();return Q.length===1?Q[0].id:null}var TZ="x-beacon-workspace-path";function B2(Q=process.cwd()){let Z=k0(Q);return{"x-beacon-workspace":u(Z),[TZ]:Z}}async function G2(Q){let Z=Q.headers.get("x-beacon-workspace");if(Z&&v(Z))return Z;let $=Q.headers.get(TZ);if($&&GZ($)&&!xZ(u($))&&(!Z||u($)===Z)){let J=PZ($);return await c0(J.id),J.id}let Y=MZ(Q,CZ);if(Y&&v(Y))return Y;return null}var FZ=new b0;function j2(Q,Z){return Q?FZ.run(Q,Z):Z()}function p0(){return FZ.getStore()??null}var gQ=new Set;function K2(Q){gQ.delete(P(ZQ(Q),"db.sqlite"))}async function c0(Q){let Z=ZQ(Q),$=P(Z,"db.sqlite"),Y=HZ($);if(Y&&gQ.has($))return{ok:!0,created:!1,migrated:!1};try{E(Z,{recursive:!0});let{provisionDb:J}=await UZ().then(() => XZ),V=await J(S0(Q));return gQ.add($),{ok:!0,created:!Y,migrated:Y&&V.migrated}}catch(J){return{ok:!1,created:!1,migrated:!1,error:J instanceof Error?J.message:String(J)}}}import{connect as l0}from"net";var P2=4319;function d0(Q,Z,$=400){return new Promise((Y)=>{let J=l0({host:Q,port:Z}),V=!1,q=(W)=>{if(V)return;V=!0,J.destroy(),Y(W)};J.once("connect",()=>q(!0)),J.once("error",()=>q(!1)),J.setTimeout($,()=>q(!1))})}async function a0(Q){for(let Z of["127.0.0.1","::1"])if(await d0(Z,Q))return!1;return!0}async function RZ(Q,Z=20){for(let $=Q;$<Q+Z;$++)if(await a0($))return $;return Q}import{execSync as Q1,spawn as Z1}from"child_process";import{mkdirSync as $1,openSync as Y1,readFileSync as J1,writeFileSync as V1}from"fs";import{homedir as z1}from"os";import{dirname as q1,join as YQ}from"path";import{fileURLToPath as X1}from"url";import{createHash as U1}from"crypto";zQ();import{mkdirSync as s0,readFileSync as t0,writeFileSync as r0}from"fs";import{join as o0}from"path";var n0=["default","acceptEdits","bypassPermissions","auto"];function wZ(Q){return typeof Q==="string"&&n0.includes(Q)}function gZ(Q,Z,$){let Y={behavior:"allow"};if($&&Object.keys($).length>0)Y.updatedInput=$;if(Q)Y.updatedPermissions=[{type:"setMode",mode:Q,destination:"session"}];let J={hookEventName:"PermissionRequest",decision:Y};if(Z?.trim())J.additionalContext=Z;return{hookSpecificOutput:J}}function DZ(){return o0(G(),"preferences.json")}function AQ(){try{let Q=JSON.parse(t0(DZ(),"utf8"));return{planApprovalMode:wZ(Q.planApprovalMode)?Q.planApprovalMode:void 0,planApprovalModeConfigured:Q.planApprovalModeConfigured===!0,telemetryUuid:typeof Q.telemetryUuid==="string"?Q.telemetryUuid:void 0,telemetryEnabled:Q.telemetryEnabled===!1?!1:Q.telemetryEnabled===!0?!0:void 0}}catch{return{}}}function w2(Q){let Z={...AQ(),...Q};return s0(G(),{recursive:!0}),r0(DZ(),JSON.stringify(Z,null,2)),Z}function OZ(Q){if(!Q?.length)return"";let Z=Q.map((Y)=>Y.id?` \u2022 ${Y.title} \u2014 id: ${Y.id}`:` \u2022 ${Y.title}`),$=Q.some((Y)=>Y.id);return`
353
353
 
354
354
  This plan created these roadmap feature(s):
355
355
  `+Z.join(`
356
- `)+'\n\nWhen the work ships, register them in ONE call: `beacon_feature({ action: "done" })` with a '+"`features` array \u2014 one entry per feature"+($?", each keyed by the `id` above (no title-matching needed)":"")+", each with the files you touched + a short markdown summary. Do them all in that single "+"batched call so every feature flips to Done \u2014 do NOT register only the umbrella, and do "+"NOT make one call per feature."}import{execSync as o0}from"child_process";import{platform as DZ}from"os";function i0(Q){if(process.env.BEACON_NO_OPEN)return;let Z=DZ()==="darwin"?"open":DZ()==="win32"?"start":"xdg-open";try{o0(`${Z} "${Q}"`,{stdio:"ignore"})}catch{}}async function OZ(Q,Z){if(await fetch(`${Q}/api/plan/presence`,{headers:{"x-beacon-workspace":Z}}).then((J)=>J.json()).then((J)=>!!J?.live).catch(()=>!1))return;let Y=encodeURIComponent(`/plan?ws=${Z}`);i0(`${Q}/api/workspace/activate?id=${Z}&redirect=${Y}`)}var U1=YQ(z1(q1(import.meta.url)),".."),yQ=process.env.BEACON_HOME||YQ(V1(),".beacon"),EZ=YQ(yQ,"server.json"),W1=process.env.PORT||"4319";function H1(Q){try{return process.kill(Q,0),!0}catch{return!1}}function B1(Q){try{return JSON.parse(Y1(Q,"utf8"))}catch{return null}}async function AZ(Q){try{return(await fetch(Q)).ok}catch{return!1}}async function G1(Q,Z=60){for(let $=0;$<Z;$++){if(await AZ(Q))return!0;await new Promise((Y)=>setTimeout(Y,500))}return!1}function j1(Q){Z1(yQ,{recursive:!0});let Z=$1(YQ(yQ,"server.log"),"a"),$={...process.env,PORT:Q,BEACON_NO_OPEN:"1"};delete $.BEACON_REPO,delete $.BEACON_DATA_DIR,delete $.DATABASE_URL;let Y=Q1("bun",["run","dev"],{cwd:U1,env:$,detached:!0,stdio:["ignore",Z,Z]});Y.unref();let J={pid:Y.pid??0,port:Q};return J1(EZ,JSON.stringify(J)),J}async function K1(){let Q=B1(EZ);if(Q&&H1(Q.pid)&&await AZ(`http://localhost:${Q.port}/api/workspace`))return Q.port;let Z=String(await FZ(Number(W1))),{port:$}=j1(Z);return await G1(`http://localhost:${$}/api/workspace`),$}function N1(){try{return e0("git rev-parse --show-toplevel",{cwd:process.cwd(),stdio:["ignore","pipe","ignore"]}).toString().trim()}catch{return""}}function x1(Q){return X1("sha256").update(Q).digest("hex").slice(0,12)}async function P1(){if(process.stdin.isTTY)return null;let Q=[];for await(let $ of process.stdin)Q.push($);let Z=Buffer.concat(Q).toString("utf8").trim();if(!Z)return null;try{return JSON.parse(Z)}catch{return null}}function bQ(Q,Z){return wZ(Q,Z)}function $Q(Q){return{hookSpecificOutput:{hookEventName:"PermissionRequest",decision:{behavior:"deny",message:Q}}}}function C(Q){process.stdout.write(JSON.stringify(Q)),process.exit(0)}(async()=>{await zZ();let Z=(await P1())?.tool_input?.plan;if(!Z||!Z.trim())C(bQ());let Y=`http://localhost:${await K1()}`,J=N1()||process.cwd(),V=x1(J);await fetch(`${Y}/api/workspace/activate?id=${V}`).catch(()=>{});let q=Z.split(`
357
- `,1)[0]?.replace(/^#+\s*/,"").slice(0,160)||"Plan review",W=await fetch(`${Y}/api/plan`,{method:"POST",headers:{"content-type":"application/json","x-beacon-workspace":V},body:JSON.stringify({description:q,markdown:Z})});if(W.status===422){let H=await W.json().catch(()=>({}));C($Q(H.error??"Beacon rejected the plan: every roadmap feature needs a category and a priority. Add them and re-present."))}if(!W.ok)C(bQ());await OZ(Y,V);let z=Date.now()+kQ,X=(H)=>new Promise((JQ)=>setTimeout(JQ,H));while(Date.now()<z){await X(LQ);let H=await fetch(`${Y}/api/plan/verdict`,{headers:{"x-beacon-workspace":V}}).then((JQ)=>JQ.json()).catch(()=>null);if(!H)continue;if(H.kind==="approved")C(bQ(IQ().planApprovalMode,gZ(H.features)));if(H.kind==="discarded")C($Q("The user discarded the plan in Beacon. Ask what they want to adjust before re-presenting."));if(H.kind==="feedback")C($Q(`The user left feedback on the plan in Beacon (inline comments and/or edits on the /map and /db boards). Revise the plan based on the feedback below, then re-present (call ExitPlanMode again):
356
+ `)+'\n\nWhen the work ships, register them in ONE call: `beacon_feature({ action: "done" })` with a '+"`features` array \u2014 one entry per feature"+($?", each keyed by the `id` above (no title-matching needed)":"")+", each with the files you touched + a short markdown summary. Do them all in that single "+"batched call so every feature flips to Done \u2014 do NOT register only the umbrella, and do "+"NOT make one call per feature."}import{execSync as i0}from"child_process";import{platform as fZ}from"os";function e0(Q){if(process.env.BEACON_NO_OPEN)return;let Z=fZ()==="darwin"?"open":fZ()==="win32"?"start":"xdg-open";try{i0(`${Z} "${Q}"`,{stdio:"ignore"})}catch{}}async function uZ(Q,Z){if(await fetch(`${Q}/api/plan/presence`,{headers:{"x-beacon-workspace":Z}}).then((J)=>J.json()).then((J)=>!!J?.live).catch(()=>!1))return;let Y=encodeURIComponent(`/plan?ws=${Z}`);e0(`${Q}/api/workspace/activate?id=${Z}&redirect=${Y}`)}var W1=YQ(q1(X1(import.meta.url)),".."),yQ=process.env.BEACON_HOME||YQ(z1(),".beacon"),EZ=YQ(yQ,"server.json"),H1=process.env.PORT||"4319";function B1(Q){try{return process.kill(Q,0),!0}catch{return!1}}function G1(Q){try{return JSON.parse(J1(Q,"utf8"))}catch{return null}}async function bZ(Q){try{return(await fetch(Q)).ok}catch{return!1}}async function j1(Q,Z=60){for(let $=0;$<Z;$++){if(await bZ(Q))return!0;await new Promise((Y)=>setTimeout(Y,500))}return!1}function K1(Q){$1(yQ,{recursive:!0});let Z=Y1(YQ(yQ,"server.log"),"a"),$={...process.env,PORT:Q,BEACON_NO_OPEN:"1"};delete $.BEACON_REPO,delete $.BEACON_DATA_DIR,delete $.DATABASE_URL;let Y=Z1("bun",["run","dev"],{cwd:W1,env:$,detached:!0,stdio:["ignore",Z,Z]});Y.unref();let J={pid:Y.pid??0,port:Q};return V1(EZ,JSON.stringify(J)),J}async function x1(){let Q=G1(EZ);if(Q&&B1(Q.pid)&&await bZ(`http://localhost:${Q.port}/api/workspace`))return Q.port;let Z=String(await RZ(Number(H1))),{port:$}=K1(Z);return await j1(`http://localhost:${$}/api/workspace`),$}function N1(){try{return Q1("git rev-parse --show-toplevel",{cwd:process.cwd(),stdio:["ignore","pipe","ignore"]}).toString().trim()}catch{return""}}function P1(Q){return U1("sha256").update(Q).digest("hex").slice(0,12)}async function v1(){if(process.stdin.isTTY)return null;let Q=[];for await(let $ of process.stdin)Q.push($);let Z=Buffer.concat(Q).toString("utf8").trim();if(!Z)return null;try{return JSON.parse(Z)}catch{return null}}function IQ(Q,Z,$){return gZ(Q,Z,$)}function $Q(Q){return{hookSpecificOutput:{hookEventName:"PermissionRequest",decision:{behavior:"deny",message:Q}}}}function C(Q){process.stdout.write(JSON.stringify(Q)),process.exit(0)}(async()=>{await zZ();let Z=(await v1())?.tool_input?.plan;if(!Z||!Z.trim())C(IQ());let Y=`http://localhost:${await x1()}`,J=N1()||process.cwd(),V=P1(J);await fetch(`${Y}/api/workspace/activate?id=${V}`).catch(()=>{});let q=Z.split(`
357
+ `,1)[0]?.replace(/^#+\s*/,"").slice(0,160)||"Plan review",W=await fetch(`${Y}/api/plan`,{method:"POST",headers:{"content-type":"application/json","x-beacon-workspace":V},body:JSON.stringify({description:q,markdown:Z})});if(W.status===422){let H=await W.json().catch(()=>({}));C($Q(H.error??"Beacon rejected the plan: every roadmap feature needs a category and a priority. Add them and re-present."))}if(!W.ok)C(IQ());await uZ(Y,V);let z=Date.now()+kQ,X=(H)=>new Promise((JQ)=>setTimeout(JQ,H));while(Date.now()<z){await X(LQ);let H=await fetch(`${Y}/api/plan/verdict`,{headers:{"x-beacon-workspace":V}}).then((JQ)=>JQ.json()).catch(()=>null);if(!H)continue;if(H.kind==="approved")C(IQ(AQ().planApprovalMode,OZ(H.features),{plan:Z}));if(H.kind==="discarded")C($Q("The user discarded the plan in Beacon. Ask what they want to adjust before re-presenting."));if(H.kind==="feedback")C($Q(`The user left feedback on the plan in Beacon (inline comments and/or edits on the /map and /db boards). Revise the plan based on the feedback below, then re-present (call ExitPlanMode again):
358
358
 
359
359
  `+H.feedback))}C($Q("\u23F3 Still awaiting your review in Beacon \u2014 the plan is open on /plan and nothing was lost. "+"Claude Code caps a single plan-review hook at ~10 minutes, so to keep waiting you MUST call ExitPlanMode again now with the SAME plan. Re-presenting resumes the same review (your in-progress annotations and any decision are preserved). Do NOT implement, and do "+"NOT ask in the terminal \u2014 just re-present."))})();
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- var p5=Object.defineProperty;var c5=(Z)=>Z;function l5(Z,$){this[Z]=c5.bind(null,$)}var xZ=(Z,$)=>{for(var Q in $)p5(Z,Q,{get:$[Q],enumerable:!0,configurable:!0,set:l5.bind($,Q)})};var G4=(Z,$)=>()=>(Z&&($=Z(Z=0)),$);var U4={};xZ(U4,{provisionDb:()=>Q6});import{createClient as d5}from"@libsql/client";import{drizzle as n5}from"drizzle-orm/libsql";import{migrate as r5}from"drizzle-orm/libsql/migrator";import{readMigrationFiles as o5}from"drizzle-orm/migrator";import{dirname as fZ,join as i5}from"path";import{fileURLToPath as s5}from"url";async function DZ(Z,$){return(await Z.execute({sql:"SELECT 1 FROM sqlite_master WHERE type='table' AND name = ?",args:[$]})).rows.length>0}async function Z6(Z,$){let Q=await Z.execute(`PRAGMA table_info("${$}")`);return new Set(Q.rows.map((J)=>String(J.name)))}async function M4(Z){if(!await DZ(Z,"__drizzle_migrations"))return 0;let $=await Z.execute('SELECT count(*) AS n FROM "__drizzle_migrations"');return Number($.rows[0]?.n??0)}async function $6(Z){for(let[$,Q]of Object.entries(e5)){if(!await DZ(Z,$))continue;let J=await Z6(Z,$);for(let V of Q){if(!J.has(V))continue;await Z.execute(`UPDATE "${$}" SET "${V}" = CAST((julianday("${V}") - 2440587.5) * 86400000 AS INTEGER) WHERE typeof("${V}") = 'text'`)}}}async function Q6(Z,$=t5){let Q=d5({url:Z});try{await Q.execute("PRAGMA journal_mode = WAL;"),await Q.execute("PRAGMA foreign_keys = ON;"),await Q.execute("PRAGMA busy_timeout = 5000;");let J=await DZ(Q,"__drizzle_migrations"),V=await DZ(Q,"Node"),Y=!1;if(V&&!J){let K=o5({migrationsFolder:$})[0];if(K)await Q.execute('CREATE TABLE IF NOT EXISTS "__drizzle_migrations" (id SERIAL PRIMARY KEY, hash text NOT NULL, created_at numeric)'),await Q.execute({sql:'INSERT INTO "__drizzle_migrations" ("hash", "created_at") VALUES (?, ?)',args:[K.hash,K.folderMillis]}),Y=!0}let X=await M4(Q);if(await r5(n5(Q),{migrationsFolder:$}),await M4(Q)>X)Y=!0;return await $6(Q),{migrated:Y}}finally{Q.close()}}var a5,t5,e5;var j4=G4(async()=>{a5=fZ(fZ(fZ(s5(import.meta.url)))),t5=process.env.BEACON_MIGRATIONS_DIR||i5(a5,"drizzle"),e5={Node:["createdAt","updatedAt"],Note:["createdAt","updatedAt"],DbTable:["createdAt","updatedAt"],Endpoint:["createdAt","updatedAt"],DraftTable:["createdAt"],SyncState:["codeGraphSyncedAt","updatedAt"],AppSetting:["updatedAt"],ProjectMeta:["updatedAt"],CodeFile:["updatedAt"]}});import{mkdirSync as W8,renameSync as N8,rmSync as C8,writeFileSync as L8}from"fs";import{dirname as B8}from"path";function q8(Z,$){W8(B8(Z),{recursive:!0});let Q=`${Z}.tmp`;try{L8(Q,$),N8(Q,Z)}catch(J){throw C8(Q,{force:!0}),J}}function O8(Z,$,Q=!1){q8(Z,JSON.stringify($,null,Q?2:void 0))}var F5=()=>{};import{AsyncLocalStorage as J6}from"async_hooks";import{spawnSync as V6}from"child_process";import{createHash as K6}from"crypto";import{existsSync as W4,mkdirSync as CZ,readFileSync as hZ,writeFileSync as mZ}from"fs";import{homedir as N4}from"os";import{basename as Y6,join as ZZ,parse as X6,resolve as H4}from"path";function t(){return process.env.BEACON_HOME||ZZ(N4(),".beacon")}function bZ(){return ZZ(t(),"workspaces.json")}function JZ(Z){return K6("sha256").update(Z).digest("hex").slice(0,12)}function pZ(Z=process.cwd()){let $=V6("git",["rev-parse","--show-toplevel"],{cwd:Z,stdio:["ignore","pipe","ignore"]});if($.status===0){let Q=$.stdout?.toString().trim();if(Q)return Q}return Z}function C4(Z){let $=H4(Z);return $!==H4(N4())&&$!==X6($).root}function L4(){return ZZ(t(),"deleted.json")}function cZ(){try{let Z=JSON.parse(hZ(L4(),"utf8"));return Array.isArray(Z)?Z:[]}catch{return[]}}function B4(Z){CZ(t(),{recursive:!0}),mZ(L4(),JSON.stringify(Z,null,2))}function q4(Z){return cZ().includes(Z)}function O4(Z){let $=cZ();if(!$.includes(Z))B4([...$,Z])}function G6(Z){let $=cZ();if($.includes(Z))B4($.filter((Q)=>Q!==Z))}function n(Z){return ZZ(t(),Z)}function VZ(Z){return`file:${ZZ(n(Z),"db.sqlite")}`}function LZ(){try{let Z=JSON.parse(hZ(bZ(),"utf8"));return Array.isArray(Z)?Z:[]}catch{return[]}}function lZ(Z){CZ(t(),{recursive:!0}),mZ(bZ(),JSON.stringify(Z,null,2))}function FZ(){return LZ().sort((Z,$)=>$.lastOpenedAt.localeCompare(Z.lastOpenedAt))}function g(Z){return LZ().find(($)=>$.id===Z)??null}function z4(Z,$,Q=new Date().toISOString()){if(!C4(Z))throw Error(`beacon: refusing to register a non-repo path as a workspace: ${Z}`);let J=JZ(Z);if(q4(J))throw Error(`beacon: workspace ${J} (${Z}) was deleted \u2014 run \`beacon\` or /beacon-init to re-add it`);let V=LZ(),Y=V.find((j)=>j.id===J),X={id:J,path:Z,name:$||Y?.name||Y6(Z),lastOpenedAt:Q},K=[X,...V.filter((j)=>j.id!==J)];return CZ(n(J),{recursive:!0}),lZ(K),X}function Q$(Z,$){return G6(JZ(Z)),z4(Z,$)}function J$(Z,$=new Date().toISOString()){let Q=LZ(),J=Q.find((V)=>V.id===Z);if(!J)return;J.lastOpenedAt=$,lZ(Q)}function D4(Z){if(lZ(LZ().filter(($)=>$.id!==Z)),r()===Z)M6(FZ()[0]?.id??null)}function F4(){return ZZ(t(),"active")}function r(){try{return hZ(F4(),"utf8").trim()||null}catch{return null}}function M6(Z){CZ(t(),{recursive:!0}),mZ(F4(),Z??"")}function U6(){let Z=r();return Z?g(Z):null}function V$(){let Z=_Z()??r();return Z?g(Z):null}function K$(Z){return g(Z)?.path??null}function Y$(){return W4(bZ())}var _4="beacon_ws";function A4(Z,$){let Q=Z.headers.get("cookie");if(!Q)return null;for(let J of Q.split(";")){let V=J.indexOf("=");if(V===-1)continue;if(J.slice(0,V).trim()===$)return decodeURIComponent(J.slice(V+1).trim())}return null}function X$(Z){let $=Z.headers.get("x-beacon-workspace");if($&&g($))return $;let Q=A4(Z,_4);if(Q&&g(Q))return Q;return j6()}function j6(){let Z=FZ();return Z.length===1?Z[0].id:null}var H6="x-beacon-workspace-path";async function G$(Z){let $=Z.headers.get("x-beacon-workspace");if($&&g($))return $;let Q=Z.headers.get(H6);if(Q&&C4(Q)&&!q4(JZ(Q))&&(!$||JZ(Q)===$)){let V=z4(Q);return await dZ(V.id),V.id}let J=A4(Z,_4);if(J&&g(J))return J;return null}var P4=new J6;function W6(Z,$){return Z?P4.run(Z,$):$()}function _Z(){return P4.getStore()??null}var gZ=new Set;function I4(Z){gZ.delete(ZZ(n(Z),"db.sqlite"))}async function dZ(Z){let $=n(Z),Q=ZZ($,"db.sqlite"),J=W4(Q);if(J&&gZ.has(Q))return{ok:!0,created:!1,migrated:!1};try{CZ($,{recursive:!0});let{provisionDb:V}=await j4().then(() => U4),Y=await V(VZ(Z));return gZ.add(Q),{ok:!0,created:!J,migrated:J&&Y.migrated}}catch(V){return{ok:!1,created:!1,migrated:!1,error:V instanceof Error?V.message:String(V)}}}import{existsSync as h8,readFileSync as m8}from"fs";import{resolve as f5}from"path";import{rmSync as g8}from"fs";import{drizzle as g6}from"drizzle-orm/libsql";import{createClient as h6}from"@libsql/client";var nZ={};xZ(nZ,{workspaceFlag:()=>z6,tag:()=>jZ,syncState:()=>a,projectMeta:()=>O6,planContract:()=>D6,note:()=>L6,nodeTags:()=>YZ,nodeFile:()=>BZ,node:()=>k,endpointTable:()=>i,endpoint:()=>E,edge:()=>KZ,draftTable:()=>c,draftRelation:()=>XZ,draftColumn:()=>OZ,dbTable:()=>P,dbRelation:()=>l,dbColumn:()=>e,codeFileEdge:()=>x,codeFile:()=>y,bugFlag:()=>qZ,boardAnnotation:()=>B6,appSetting:()=>q6});import{sqliteTable as v,index as S,foreignKey as N6,text as C,integer as _,real as m,uniqueIndex as o,primaryKey as C6}from"drizzle-orm/sqlite-core";import{createId as u}from"@paralleldrive/cuid2";var k=v("Node",{id:C().primaryKey().$defaultFn(()=>u()),view:C().notNull(),kind:C().default("FEATURE").notNull(),cluster:C(),layer:C(),title:C().notNull(),role:C(),plain:C(),status:C().default("PENDING").notNull(),priority:_().default(2).notNull(),progress:_().default(0).notNull(),x:m().default(0).notNull(),y:m().default(0).notNull(),sourceRef:C(),externalId:C(),source:C().default("MANUAL").notNull(),planId:C(),parentId:C(),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[S("Node_cluster_idx").on(Z.cluster),S("Node_parentId_idx").on(Z.parentId),S("Node_view_idx").on(Z.view),N6(()=>({columns:[Z.parentId],foreignColumns:[Z.id],name:"Node_parentId_Node_id_fk"})).onUpdate("cascade").onDelete("cascade")]),BZ=v("NodeFile",{id:C().primaryKey().$defaultFn(()=>u()),nodeId:C().notNull().references(()=>k.id,{onDelete:"cascade",onUpdate:"cascade"}),path:C().notNull()},(Z)=>[o("NodeFile_nodeId_path_key").on(Z.nodeId,Z.path),S("NodeFile_nodeId_idx").on(Z.nodeId)]),jZ=v("Tag",{id:C().primaryKey().$defaultFn(()=>u()),label:C().notNull(),color:C()},(Z)=>[o("Tag_label_key").on(Z.label)]),KZ=v("Edge",{id:C().primaryKey().$defaultFn(()=>u()),fromId:C().notNull().references(()=>k.id,{onDelete:"cascade",onUpdate:"cascade"}),toId:C().notNull().references(()=>k.id,{onDelete:"cascade",onUpdate:"cascade"}),kind:C().default("DEPENDS").notNull(),label:C(),sourceHandle:C(),targetHandle:C()},(Z)=>[o("Edge_fromId_toId_kind_key").on(Z.fromId,Z.toId,Z.kind),S("Edge_toId_idx").on(Z.toId),S("Edge_fromId_idx").on(Z.fromId)]),YZ=v("_NodeTags",{a:C("A").notNull().references(()=>k.id,{onDelete:"cascade",onUpdate:"cascade"}),b:C("B").notNull().references(()=>jZ.id,{onDelete:"cascade",onUpdate:"cascade"})},(Z)=>[o("_NodeTags_AB_unique").on(Z.a,Z.b),S("_NodeTags_B_index").on(Z.b)]),L6=v("Note",{id:C().primaryKey().$defaultFn(()=>u()),title:C().default("Untitled").notNull(),body:C().default("").notNull(),ord:m().default(0).notNull(),pinned:_({mode:"boolean"}).default(!1).notNull(),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[S("Note_updatedAt_idx").on(Z.updatedAt)]),B6=v("BoardAnnotation",{id:C().primaryKey().$defaultFn(()=>u()),targetKind:C().notNull(),targetId:C().notNull(),columnName:C(),body:C().default("").notNull(),x:m(),y:m(),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[S("BoardAnnotation_target_idx").on(Z.targetId)]),qZ=v("BugFlag",{id:C().primaryKey().$defaultFn(()=>u()),nodeId:C().notNull().references(()=>k.id,{onDelete:"cascade",onUpdate:"cascade"}),by:C().notNull(),note:C().notNull(),resolvedAt:_({mode:"timestamp_ms"}),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date)},(Z)=>[S("BugFlag_nodeId_idx").on(Z.nodeId)]),P=v("DbTable",{id:C().primaryKey().$defaultFn(()=>u()),name:C().notNull(),domain:C(),description:C(),source:C().default("MANUAL").notNull(),planId:C(),x:m().default(0).notNull(),y:m().default(0).notNull(),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[S("DbTable_domain_idx").on(Z.domain),o("DbTable_name_key").on(Z.name)]),e=v("DbColumn",{id:C().primaryKey().$defaultFn(()=>u()),tableId:C().notNull().references(()=>P.id,{onDelete:"cascade",onUpdate:"cascade"}),name:C().notNull(),type:C().notNull(),isPk:_({mode:"boolean"}).default(!1).notNull(),isFk:_({mode:"boolean"}).default(!1).notNull(),nullable:_({mode:"boolean"}).default(!0).notNull(),note:C(),ord:_().default(0).notNull()},(Z)=>[o("DbColumn_tableId_name_key").on(Z.tableId,Z.name),S("DbColumn_tableId_idx").on(Z.tableId)]),l=v("DbRelation",{id:C().primaryKey().$defaultFn(()=>u()),fromTableId:C().notNull().references(()=>P.id,{onDelete:"cascade",onUpdate:"cascade"}),toTableId:C().notNull().references(()=>P.id,{onDelete:"cascade",onUpdate:"cascade"}),fromColumn:C().notNull(),toColumn:C().notNull(),label:C()},(Z)=>[S("DbRelation_toTableId_idx").on(Z.toTableId),S("DbRelation_fromTableId_idx").on(Z.fromTableId)]),E=v("Endpoint",{id:C().primaryKey().$defaultFn(()=>u()),method:C().notNull(),path:C().notNull(),domain:C(),description:C(),source:C().default("MANUAL").notNull(),planId:C(),x:m().default(0).notNull(),y:m().default(0).notNull(),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[o("Endpoint_method_path_key").on(Z.method,Z.path),S("Endpoint_domain_idx").on(Z.domain)]),i=v("EndpointTable",{id:C().primaryKey().$defaultFn(()=>u()),endpointId:C().notNull().references(()=>E.id,{onDelete:"cascade",onUpdate:"cascade"}),tableId:C().notNull().references(()=>P.id,{onDelete:"cascade",onUpdate:"cascade"}),access:C().default("read").notNull()},(Z)=>[o("EndpointTable_endpointId_tableId_key").on(Z.endpointId,Z.tableId),S("EndpointTable_tableId_idx").on(Z.tableId)]),c=v("DraftTable",{id:C().primaryKey().$defaultFn(()=>u()),name:C().notNull(),domain:C(),description:C(),x:m().default(0).notNull(),y:m().default(0).notNull(),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date)},(Z)=>[o("DraftTable_name_key").on(Z.name)]),OZ=v("DraftColumn",{id:C().primaryKey().$defaultFn(()=>u()),tableId:C().notNull().references(()=>c.id,{onDelete:"cascade",onUpdate:"cascade"}),name:C().notNull(),type:C().notNull(),isPk:_({mode:"boolean"}).default(!1).notNull(),isFk:_({mode:"boolean"}).default(!1).notNull(),nullable:_({mode:"boolean"}).default(!0).notNull(),note:C(),ord:_().default(0).notNull()},(Z)=>[S("DraftColumn_tableId_idx").on(Z.tableId)]),XZ=v("DraftRelation",{id:C().primaryKey().$defaultFn(()=>u()),fromTableId:C().notNull().references(()=>c.id,{onDelete:"cascade",onUpdate:"cascade"}),toTableId:C().notNull().references(()=>c.id,{onDelete:"cascade",onUpdate:"cascade"}),fromColumn:C().notNull(),toColumn:C().notNull(),label:C()},(Z)=>[S("DraftRelation_toTableId_idx").on(Z.toTableId),S("DraftRelation_fromTableId_idx").on(Z.fromTableId)]),y=v("CodeFile",{path:C().primaryKey(),root:C(),lang:C(),x:m().default(0).notNull(),y:m().default(0).notNull(),mtimeMs:m(),size:_(),inDegree:_().default(0).notNull(),outDegree:_().default(0).notNull(),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)}),x=v("CodeFileEdge",{fromPath:C().notNull().references(()=>y.path,{onDelete:"cascade",onUpdate:"cascade"}),toPath:C().notNull().references(()=>y.path,{onDelete:"cascade",onUpdate:"cascade"}),circular:_({mode:"boolean"}).default(!1).notNull()},(Z)=>[S("CodeFileEdge_circular_idx").on(Z.circular),S("CodeFileEdge_toPath_idx").on(Z.toPath),S("CodeFileEdge_fromPath_idx").on(Z.fromPath),C6({columns:[Z.fromPath,Z.toPath],name:"CodeFileEdge_fromPath_toPath_pk"})]),a=v("SyncState",{id:C().primaryKey().default("singleton"),version:_().default(0).notNull(),codeGraphSyncedAt:_({mode:"timestamp_ms"}),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)}),q6=v("AppSetting",{id:C().primaryKey().default("singleton"),editor:C().default("auto").notNull(),currentFeatureId:C(),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)}),O6=v("ProjectMeta",{id:C().primaryKey().default("singleton"),overview:C(),conventions:C().default("[]").notNull(),hasFrontend:_({mode:"boolean"}),classificationRoots:C().default("[]").notNull(),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)}),z6=v("WorkspaceFlag",{id:C().primaryKey().$defaultFn(()=>u()),key:C().notNull(),enabled:_({mode:"boolean"}).default(!1).notNull(),config:C(),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[o("WorkspaceFlag_key_key").on(Z.key)]),D6=v("PlanContract",{id:C().primaryKey().$defaultFn(()=>u()),planId:C().notNull(),declaredFiles:C().default("[]").notNull(),authorizedExtras:C().default("[]").notNull(),active:_({mode:"boolean"}).default(!1).notNull(),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[o("PlanContract_planId_key").on(Z.planId),S("PlanContract_active_idx").on(Z.active)]);var rZ={};xZ(rZ,{tagRelations:()=>P6,nodeTagsRelations:()=>I6,nodeRelations:()=>F6,nodeFileRelations:()=>_6,endpointTableRelations:()=>w6,endpointRelations:()=>k6,edgeRelations:()=>R6,draftTableRelations:()=>T6,draftRelationRelations:()=>u6,draftColumnRelations:()=>y6,dbTableRelations:()=>E6,dbRelationRelations:()=>v6,dbColumnRelations:()=>S6,codeFileRelations:()=>x6,codeFileEdgeRelations:()=>f6,bugFlagRelations:()=>A6});import{relations as h}from"drizzle-orm";var F6=h(k,({one:Z,many:$})=>({files:$(BZ),bugFlags:$(qZ),nodeTags:$(YZ),edgesOut:$(KZ,{relationName:"EdgeFrom"}),edgesIn:$(KZ,{relationName:"EdgeTo"}),parent:Z(k,{fields:[k.parentId],references:[k.id],relationName:"NodeTree"}),children:$(k,{relationName:"NodeTree"})})),_6=h(BZ,({one:Z})=>({node:Z(k,{fields:[BZ.nodeId],references:[k.id]})})),A6=h(qZ,({one:Z})=>({node:Z(k,{fields:[qZ.nodeId],references:[k.id]})})),P6=h(jZ,({many:Z})=>({nodeTags:Z(YZ)})),I6=h(YZ,({one:Z})=>({node:Z(k,{fields:[YZ.a],references:[k.id]}),tag:Z(jZ,{fields:[YZ.b],references:[jZ.id]})})),R6=h(KZ,({one:Z})=>({from:Z(k,{fields:[KZ.fromId],references:[k.id],relationName:"EdgeFrom"}),to:Z(k,{fields:[KZ.toId],references:[k.id],relationName:"EdgeTo"})})),E6=h(P,({many:Z})=>({columns:Z(e),fksOut:Z(l,{relationName:"FkFrom"}),fksIn:Z(l,{relationName:"FkTo"}),usages:Z(i)})),S6=h(e,({one:Z})=>({table:Z(P,{fields:[e.tableId],references:[P.id]})})),v6=h(l,({one:Z})=>({fromTable:Z(P,{fields:[l.fromTableId],references:[P.id],relationName:"FkFrom"}),toTable:Z(P,{fields:[l.toTableId],references:[P.id],relationName:"FkTo"})})),k6=h(E,({many:Z})=>({tables:Z(i)})),w6=h(i,({one:Z})=>({endpoint:Z(E,{fields:[i.endpointId],references:[E.id]}),table:Z(P,{fields:[i.tableId],references:[P.id]})})),T6=h(c,({many:Z})=>({columns:Z(OZ),fksOut:Z(XZ,{relationName:"DraftFkFrom"}),fksIn:Z(XZ,{relationName:"DraftFkTo"})})),y6=h(OZ,({one:Z})=>({table:Z(c,{fields:[OZ.tableId],references:[c.id]})})),u6=h(XZ,({one:Z})=>({fromTable:Z(c,{fields:[XZ.fromTableId],references:[c.id],relationName:"DraftFkFrom"}),toTable:Z(c,{fields:[XZ.toTableId],references:[c.id],relationName:"DraftFkTo"})})),x6=h(y,({many:Z})=>({edgesOut:Z(x,{relationName:"CFEFrom"}),edgesIn:Z(x,{relationName:"CFETo"})})),f6=h(x,({one:Z})=>({fromFile:Z(y,{fields:[x.fromPath],references:[y.path],relationName:"CFEFrom"}),toFile:Z(y,{fields:[x.toPath],references:[y.path],relationName:"CFETo"})}));var m6={...nZ,...rZ};function b6(){let Z=process.env.DATABASE_URL;if(Z&&/^(file:|libsql:|wss?:|https?:|:memory:)/i.test(Z))return Z;return"file:./dev.db"}var p6=b6();function R4(Z){let $=h6({url:Z});return $.execute("PRAGMA foreign_keys = ON;"),$.execute("PRAGMA busy_timeout = 5000;"),g6($,{schema:m6})}var iZ=globalThis,oZ=iZ.dzDefault??R4(p6);iZ.dzDefault=oZ;var AZ=iZ.dzByUrl??=new Map;function sZ(Z){let $=AZ.get(Z);if(!$)$=R4(Z),AZ.set(Z,$);return $}function E4(Z){let $=AZ.get(Z);AZ.delete(Z);try{$?.$client?.close?.()}catch{}}function c6(){if(process.env.BEACON_REPO)return oZ;let Z=_Z()??r();if(!Z)return oZ;return sZ(VZ(Z))}var b=new Proxy({},{get(Z,$){let Q=c6(),J=Q[$];return typeof J==="function"?J.bind(Q):J}});import{existsSync as u8}from"fs";import{existsSync as w5,readFileSync as S8,watch as v8}from"fs";import{readFile as k5}from"fs/promises";import{join as zZ,relative as k8,resolve as w8}from"path";import{existsSync as n4,readFileSync as r4}from"fs";import{readdir as z7,readFile as D7,stat as o4}from"fs/promises";import{extname as i4,join as EZ,relative as WZ,resolve as HZ}from"path";import{extname as b4}from"path";import{dirname as l6,resolve as d6}from"path";var aZ=[".ts",".tsx",".js",".jsx",".mjs",".cjs"],n6=[/(?:^|[\n;])\s*(?:import|export)[^'"`\n]{0,4000}?from\s*['"]([^'"`]+)['"]/g,/(?:^|[\n;])\s*import\s*['"]([^'"`]+)['"]/g,/\brequire\(\s*['"]([^'"`]+)['"]\s*\)/g,/\bimport\(\s*['"]([^'"`]+)['"]\s*\)/g];function r6(Z){return Z.split(/[\\/]/).join("/")}function S4(Z,$){if($.has(Z))return Z;for(let Q of aZ){let J=`${Z}${Q}`;if($.has(J))return J}for(let Q of aZ){let J=`${Z}/index${Q}`;if($.has(J))return J}return null}function o6(Z){let $=new Set;for(let Q of n6)for(let J of Z.matchAll(Q))$.add(J[1]);return $}function i6(Z,$,Q,J){if(Z.startsWith(".")){let V=d6("/",l6($),Z),Y=r6(V).replace(/^\//,"");return S4(Y,Q)}for(let V of J)if(Z.startsWith(V.from)){let Y=Z.slice(V.from.length),X=V.to?`${V.to}/${Y}`:Y,K=S4(X,Q);if(K)return K}return null}var v4={id:"ts",extensions:aZ,specifiers:o6,resolve(Z,$,Q){let J=i6(Z,$,Q.fileSet,Q.tsAliases??[]);return J?[J]:[]}};import{dirname as PZ,join as s6,normalize as a6}from"path";var t6=[".py",".pyi"],k4=[/(?:^|[\n;])\s*from\s+(\.*[\w.]*)\s+import\b/g,/(?:^|[\n;])\s*import\s+([\w.]+(?:\s*,\s*[\w.]+)*)/g];function w4(Z,$){for(let Q of[`${Z}.py`,`${Z}/__init__.py`,`${Z}.pyi`])if($.has(Q))return[Q];return[]}function e6(Z){let $=new Set;for(let Q of Z.matchAll(k4[0])){let J=Q[1].trim();if(J)$.add(J)}for(let Q of Z.matchAll(k4[1]))for(let J of Q[1].split(/\s*,\s*/)){let V=J.trim().split(/\s+as\s+/)[0].trim();if(V)$.add(V)}return $}var T4={id:"python",extensions:t6,specifiers:e6,resolve(Z,$,Q){if(Z.startsWith(".")){let X=Z.length-Z.replace(/^\.+/,"").length,K=Z.slice(X),j=PZ($);for(let U=1;U<X;U++)j=PZ(j);let W=K?s6(j,K.replace(/\./g,"/")):j;return w4(a6(W).replace(/\\/g,"/"),Q.fileSet)}let J=Z.replace(/\./g,"/"),V=[],Y=PZ($);while(Y&&Y!=="."&&Y!=="/")V.push(Y),Y=PZ(Y);V.push("");for(let X of V){let K=w4(X?`${X}/${J}`:J,Q.fileSet);if(K.length)return K}return[]}};import{dirname as Z7}from"path";var $7=[".go"],Q7=/(?:^|[\n;])\s*import\s+(?:[\w.]+\s+)?"([^"]+)"/g,J7=/(?:^|[\n;])\s*import\s*\(([\s\S]*?)\)/g,V7=/"([^"]+)"/g;function K7(Z){let $=new Set;for(let Q of Z.matchAll(Q7))$.add(Q[1]);for(let Q of Z.matchAll(J7))for(let J of Q[1].matchAll(V7))$.add(J[1]);return $}var y4={id:"go",extensions:$7,resolve(Z,$,Q){let J=Q.goModulePath;if(!J)return[];let V=null;if(Z===J)V="";else if(Z.startsWith(`${J}/`))V=Z.slice(J.length+1);if(V===null)return[];let Y=[];for(let X of Q.fileSet){if(!X.endsWith(".go"))continue;let K=Z7(X);if(V===""&&K==="."||K===V)Y.push(X)}return Y.sort()},specifiers:K7};import{basename as u4,dirname as tZ,join as x4,normalize as f4}from"path";var Y7=[".rs"],X7=/(?:^|[\n;])\s*(?:pub\s+)?mod\s+(\w+)\s*;/g,G7=/(?:^|[\n;])\s*(?:pub\s+)?use\s+([\w:]+)/g;function M7(Z){let $=Z.split("::").filter((Q)=>Q&&Q!=="*");if(!$.length)return"";if($[0]==="crate")return["crate",...$.slice(1)].join("/");if($[0]==="super")return["..",...$.slice(1)].join("/");if($[0]==="self")return[".",...$.slice(1)].join("/");return $.join("/")}function eZ(Z,$){for(let Q of[`${Z}.rs`,`${Z}/mod.rs`])if($.has(Q))return[Q];return[]}var U7=new Set(["mod.rs","lib.rs","main.rs"]);function j7(Z){let $=new Set;for(let Q of Z.matchAll(X7))$.add(`./${Q[1]}`);for(let Q of Z.matchAll(G7)){let J=M7(Q[1]);if(J)$.add(J)}return $}var g4={id:"rust",extensions:Y7,specifiers:j7,resolve(Z,$,Q){let J=Q.fileSet;if(Z.startsWith("./")||Z.startsWith("../")){let V=Z.replace(/^\.\//,""),Y=f4(x4(tZ($),Z)).replace(/\\/g,"/"),X=eZ(Y,J);if(X.length)return X;if(Z.startsWith("./")&&!U7.has(u4($))){let K=x4(tZ($),u4($,".rs"),V);if(X=eZ(f4(K).replace(/\\/g,"/"),J),X.length)return X}return[]}if(Z.startsWith("crate/")){let V=$.split("/"),Y=V.lastIndexOf("src"),X=Y>=0?V.slice(0,Y+1).join("/"):tZ($),K=Z.slice(6).split("/");for(let j of[K.join("/"),K.slice(0,-1).join("/")]){if(!j)continue;let W=eZ(`${X}/${j}`,J);if(W.length)return W}return[]}return[]}};import{dirname as H7,extname as W7,join as N7,normalize as C7}from"path";var h4=[".swift",".java",".rb",".kt",".kts",".cs",".php",".scala",".c",".h",".cpp",".hpp",".cc",".hh",".m",".mm",".ex",".exs",".lua",".dart",".vue",".svelte"],L7=[/\b(?:require_relative|require|include|import|use|using|from)\s*\(?\s*['"]([^'"`\n]+)['"]/g,/(?:^|[\n;])\s*import\s+([\w.]+)/g,/(?:^|[\n;])\s*from\s+([\w.]+)\s+import\b/g,/(?:^|[\n;])\s*using\s+([\w.]+)\s*;/g,/(?:^|[\n;])\s*use\s+([\w\\]+)/g,/#\s*include\s*[<"]([^>"\n]+)[>"]/g];function B7(Z){let $=new Set;for(let Q of L7)for(let J of Z.matchAll(Q)){let V=J[1].trim();if(V)$.add(V)}return $}var m4={id:"fallback",extensions:h4,specifiers:B7,resolve(Z,$,Q){let V=[W7($).toLowerCase(),...h4].filter((j,W,U)=>j&&U.indexOf(j)===W),Y=Z.includes("/")||Z.includes("\\"),X=Z.startsWith(".")||Y?Z.replace(/\\/g,"/"):Z.replace(/[.:]+/g,"/"),K=[C7(N7(H7($),X)).replace(/\\/g,"/"),X.replace(/^\.\//,"")];for(let j of K){if(Q.fileSet.has(j))return[j];for(let W of V){let U=j.endsWith(W)?j:`${j}${W}`;if(Q.fileSet.has(U))return[U];if(Q.fileSet.has(`${j}/index${W}`))return[`${j}/index${W}`]}}return[]}};var q7=[v4,T4,y4,g4,m4],IZ=new Map;for(let Z of q7)for(let $ of Z.extensions)IZ.set($,Z);var O7={".ts":"ts",".tsx":"ts",".js":"js",".jsx":"js",".mjs":"js",".cjs":"js",".py":"py",".pyi":"py",".go":"go",".rs":"rs",".swift":"swift",".java":"java",".rb":"ruby",".kt":"kotlin",".kts":"kotlin",".cs":"csharp",".php":"php",".scala":"scala",".c":"c",".h":"c",".cpp":"cpp",".hpp":"cpp",".cc":"cpp",".hh":"cpp",".m":"objc",".mm":"objc",".ex":"elixir",".exs":"elixir",".lua":"lua",".dart":"dart",".vue":"vue",".svelte":"svelte"};function Z4(Z){return IZ.get(b4(Z).toLowerCase())??null}function p4(Z){let $=b4(Z).toLowerCase();if(!IZ.has($))return null;return O7[$]??$.slice(1)}function $4(){return new Set(IZ.keys())}var s4=new Set(["node_modules",".git",".next","dist","build","__pycache__","target",".venv","venv","env",".turbo","coverage",".beacon",".playwright-mcp","generated","migrations","alembic","migrate"]);function F7(Z=5){let $=performance.now();return async()=>{if(performance.now()-$>Z)await new Promise((Q)=>setImmediate(Q)),$=performance.now()}}var _7=()=>Promise.resolve();async function a4(Z,$,Q,J,V){let Y;try{Y=await z7($,{withFileTypes:!0})}catch{return}for(let X of Y){if(X.name.startsWith("."))continue;if(s4.has(X.name))continue;let K=EZ($,X.name);if(X.isDirectory()){await a4(Z,K,Q,J,V);continue}if(!X.isFile())continue;if(X.name.endsWith(".d.ts"))continue;if(!Q.has(i4(X.name).toLowerCase()))continue;J.push(WZ(Z,K))}await V()}async function A7(Z,$=_7){let Q=[];return await a4(Z,Z,$4(),Q,$),Q.map((J)=>J.split(/[\\/]/).join("/")).sort()}function P7(Z){try{return JSON.parse(Z)}catch{}let $=Z.replace(/\/\*[^"]*?\*\//g,"").replace(/(^|[^:"])\/\/.*$/gm,"$1").replace(/,\s*([}\]])/g,"$1");return JSON.parse($)}function c4(Z){return Z.replace(/^\.\/?/,"").replace(/\/$/,"")}function t4(Z){let $=EZ(Z,"tsconfig.json");if(!n4($))return[];let Q;try{Q=P7(r4($,"utf8"))}catch{return[]}let J=Q.compilerOptions?.paths??{},V=c4(Q.compilerOptions?.baseUrl??"."),Y=[];for(let[X,K]of Object.entries(J)){if(!X.endsWith("/*")||!K.length)continue;let j=K[0];if(!j.endsWith("/*"))continue;let W=X.slice(0,-1),U=c4(j.slice(0,-1)),N=[V,U].filter(Boolean).join("/");Y.push({from:W,to:N})}return Y}function RZ(Z){let $=EZ(Z,"go.mod");if(!n4($))return null;try{let Q=/^\s*module\s+(\S+)/m.exec(r4($,"utf8"));return Q?Q[1]:null}catch{return null}}function p(Z){return Z.split(/[\\/]/).join("/")}function e4(Z){if(Z.length===1)return Z[0];let $=Z.map((V)=>p(V).split("/")),Q=$[0],J=0;for(;J<Q.length;J++)if(!$.every((V)=>V[J]===Q[J]))break;return Q.slice(0,J).join("/")||"/"}async function I7(Z,$,Q){let J=(Array.isArray(Z)?Z:[Z]).map((W)=>p(HZ(W))),V=p($?HZ($):J.length===1?J[0]:e4(J)),Y=new Map,X=[];for(let W of J){let U=p(WZ(V,W));for(let N of t4(W))X.push({from:N.from,to:[U,N.to].filter(Boolean).join("/")});for(let N of await A7(W,Q)){let L=p(EZ(W,N)),q=p(WZ(V,L));if(Y.has(q))continue;try{let H=await o4(L);Y.set(q,{path:q,abs:L,root:U||null,mtimeMs:H.mtimeMs,size:H.size})}catch{}await Q()}}let K=J.map(RZ).find(Boolean)??RZ(V);return{metas:[...Y.values()].sort((W,U)=>W.path.localeCompare(U.path)),ctx:{fileSet:new Set(Y.keys()),tsAliases:X,goModulePath:K}}}var l4=50000;function R7(Z){let $=0;for(let Q=0;Q<Z.length;Q++)if(Z.charCodeAt(Q)===10){if(Q-$>l4)return!0;$=Q+1}return Z.length-$>l4}async function d4(Z){let $=Z4(Z.path);if(!$||Z.size>200000)return new Set;try{let Q=await D7(Z.abs,"utf8");if(R7(Q))return new Set;return $.specifiers(Q)}catch{return new Set}}function Z5(Z,$){let Q=(Array.isArray(Z)?Z:[Z]).map((H)=>p(HZ(H))),J=p($?HZ($):Q.length===1?Q[0]:e4(Q)),V=new Map,Y=new Map,X=[],K=null;function j(){X=[];for(let H of Q){let G=p(WZ(J,H));for(let B of t4(H))X.push({from:B.from,to:[G,B.to].filter(Boolean).join("/")})}K=Q.map(RZ).find(Boolean)??RZ(J)}function W(H){let G=H.split("/");for(let z=0;z<G.length;z++){let O=G[z];if(!O||O.startsWith("."))return!0;if(z<G.length-1&&s4.has(O))return!0}let B=G[G.length-1];if(B.endsWith(".d.ts"))return!0;return!$4().has(i4(B).toLowerCase())}function U(H){let G=p(HZ(H));for(let B of Q)if(G===B||G.startsWith(`${B}/`)){let z=G.slice(B.length).replace(/^\/+/,"");if(W(z))return null;return{path:p(WZ(J,G)),root:p(WZ(J,B))||null}}return null}function N(){let H={fileSet:new Set(V.keys()),tsAliases:X,goModulePath:K},G=[...V.values()].sort((O,M)=>O.path.localeCompare(M.path)),B=[];for(let O of G){let M=Z4(O.path);if(!M)continue;let F=Y.get(O.path)??new Set,D=new Set;for(let R of F)for(let w of M.resolve(R,O.path,H)){if(!w||w===O.path||D.has(w))continue;D.add(w),B.push({from:O.path,to:w})}}return{files:G.map((O)=>({path:O.path,lang:p4(O.path),root:O.root,mtimeMs:O.mtimeMs,size:O.size})),edges:B}}async function L(){let H=F7(),{metas:G,ctx:B}=await I7(Z,$,H);V.clear(),Y.clear();for(let z of G)await H(),V.set(z.path,z),Y.set(z.path,await d4(z));return X=B.tsAliases??[],K=B.goModulePath??null,N()}async function q(H){let G=p(HZ(H));if(!Q.some((D)=>G===D||G.startsWith(`${D}/`)))return!1;let B=G.split("/").pop()??"";if(B==="tsconfig.json"||B==="go.mod"){let D=G.slice(0,G.length-B.length-1);if(Q.includes(D))return j(),!0;return!1}let z=U(H);if(!z)return!1;let O;try{O=await o4(G)}catch{let D=V.delete(z.path);return Y.delete(z.path),D}let M=V.get(z.path);if(M&&M.mtimeMs===O.mtimeMs&&M.size===O.size)return!1;let F={path:z.path,abs:G,root:z.root,mtimeMs:O.mtimeMs,size:O.size};return V.set(z.path,F),Y.set(z.path,await d4(F)),!0}return{seed:L,applyChange:q,snapshot:N}}function $5(Z){let $=Object.keys(Z.tableVars),Q=new Map;if(!$.length){for(let X of Z.routeFiles)Q.set(X,[]);return Q}let J=new Map;for(let X of Z.edges){let K=J.get(X.from)??[];K.push(X.to),J.set(X.from,K)}let V=new Map($.map((X)=>[X,new RegExp(`(?:query\\.${X}\\b|\\.from\\(\\s*${X}\\b)`)])),Y=new Map($.map((X)=>[X,new RegExp(`(?:insert|update|delete)\\(\\s*${X}\\b`)]));for(let X of Z.routeFiles){let K=new Set([X]),j=[X];for(let L=0;L<2&&K.size<25;L++){let q=[];for(let H of j)for(let G of J.get(H)??[]){if(K.has(G)||K.size>=25)continue;K.add(G),q.push(G)}j=q}let W=new Set,U=new Set;for(let L of K){let q=Z.content(L);if(!q)continue;for(let H of $){if(!W.has(H)&&V.get(H).test(q))W.add(H);if(!U.has(H)&&Y.get(H).test(q))U.add(H)}}let N=[];for(let L of $){let q=W.has(L),H=U.has(L);if(!q&&!H)continue;N.push({table:Z.tableVars[L],access:q&&H?"read-write":H?"write":"read"})}Q.set(X,N)}return Q}function J5(Z,$){if(/_JSON_OR_JSONB|\bJSONB\b|\bJSON\b/.test(Z))return"jsonb";let Q=Z.match(/\b(GUID|Uuid|UUID|String|Text|DateTime|Date|Time|BigInteger|SmallInteger|Integer|Boolean|Float|Numeric|Decimal|Vector|TSVECTOR|LargeBinary|Enum)\b\s*(\([^)]*\))?/);if(Q){let Y=Q[2]??"",X=Y.match(/\d+/)?.[0];switch(Q[1]){case"GUID":case"Uuid":case"UUID":return"uuid";case"String":return X?`varchar(${X})`:"varchar";case"Text":return"text";case"DateTime":return/timezone\s*=\s*True/.test(Y)?"timestamptz":"timestamp";case"Date":return"date";case"Time":return"time";case"BigInteger":return"bigint";case"SmallInteger":return"smallint";case"Integer":return"integer";case"Boolean":return"boolean";case"Float":return"float";case"Numeric":case"Decimal":return"numeric";case"Vector":return X?`vector(${X})`:"vector";case"TSVECTOR":return"tsvector";case"LargeBinary":return"bytea";case"Enum":return"varchar"}}let J=$.replace(/\s*\|\s*None/g,"").trim(),V=J.match(/^Optional\[([\s\S]*)\]$/);if(V)J=V[1].trim();if(/uuid/i.test(J))return"uuid";if(/datetime/i.test(J))return"timestamptz";if(/\bint\b/i.test(J))return"integer";if(/\bbool\b/i.test(J))return"boolean";if(/\bfloat\b/.test(J)&&!/\blist\b/.test(J))return"float";if(/\bdict\b|\blist\b|\bAny\b/.test(J))return"jsonb";return"text"}function SZ(Z,$){let Q=0;for(let J=$;J<Z.length;J++)if(Z[J]==="(")Q++;else if(Z[J]===")"){if(Q--,Q===0)return Z.slice($+1,J)}return""}function E7(Z,$){let Q=0;for(let J=$;J<Z.length;J++)if(Z[J]==="[")Q++;else if(Z[J]==="]"){if(Q--,Q===0)return Z.slice($+1,J)}return null}function S7(Z,$,Q){let J=Q.match(/__tablename__\s*=\s*["']([^"']+)["']/)?.[1],V=[],Y=[],X=[],K=/(\w+)\s*:\s*Mapped\s*\[/g,j;while(j=K.exec(Q)){let N=j.index+j[0].length-1,L=E7(Q,N);if(L===null)continue;let q=N+L.length+2,H=Q.slice(q).match(/^\s*=\s*(\w+)\s*\(/);if(!H||H[1]!=="mapped_column")continue;X.push({colName:j[1],pyType:L,argsAt:q+H[0].length-1})}let W=/(\w+)\s*=\s*(mapped_column|Column)\s*\(/g;while(j=W.exec(Q))X.push({colName:j[1],pyType:"",argsAt:j.index+j[0].length-1});X.sort((N,L)=>N.argsAt-L.argsAt);let U=new Set;for(let N of X){if(U.has(N.colName)||N.colName==="__tablename__")continue;U.add(N.colName);let L=SZ(Q,N.argsAt),q=/primary_key\s*=\s*True/.test(L)||void 0,H=/nullable\s*=\s*False/.test(L)?!1:!0,G=L.match(/ForeignKey\(\s*["']([^"']+?)\.([^"'.]+)["']/);if(V.push({name:N.colName,type:J5(L,N.pyType),isPk:q,isFk:G?!0:void 0,nullable:H}),G)Y.push({column:N.colName,toTable:G[1],toColumn:G[2]})}return{name:Z,bases:$,tableName:J,columns:V,fks:Y}}function v7(Z){let $=[],Q=[],J=/\bTable\s*(\()\s*["']([^"']+)["']\s*,/g,V;while(V=J.exec(Z)){let Y=V[2],X=SZ(Z,V.index+V[0].indexOf("("));if(!/\bmetadata\b/.test(X)||!/\bColumn\s*\(/.test(X))continue;let K=[],j=/\bColumn\s*\(/g,W;while(W=j.exec(X)){let U=SZ(X,W.index+W[0].length-1),N=U.match(/^\s*["'](\w+)["']\s*,/)?.[1];if(!N)continue;let L=/primary_key\s*=\s*True/.test(U)||void 0,q=/nullable\s*=\s*False/.test(U)?!1:!0,H=U.match(/ForeignKey\(\s*["']([^"']+?)\.([^"'.]+)["']/);if(K.push({name:N,type:J5(U,""),isPk:L,isFk:H?!0:void 0,nullable:q}),H)Q.push({fromTable:Y,fromColumn:N,toTable:H[1],toColumn:H[2]})}if(K.length)$.push({name:Y,columns:K})}return{tables:$,relations:Q}}function k7(Z){let $=new Map,Q={tables:[],relations:[]};for(let K of Z){if(!K.path.endsWith(".py"))continue;if(!/mapped_column\s*\(|__tablename__|\bTable\s*\(\s*["']/.test(K.content))continue;let j=v7(K.content);Q.tables.push(...j.tables),Q.relations.push(...j.relations);let W=/^class\s+(\w+)\s*\(([^)]*)\)\s*:/gm,U,N=[];while(U=W.exec(K.content))N.push({name:U[1],bases:U[2].split(",").map((L)=>L.trim().split(/[.[]/)[0]).filter(Boolean),at:U.index});for(let L=0;L<N.length;L++){let q=K.content.slice(N[L].at,N[L+1]?.at??K.content.length),H=S7(N[L].name,N[L].bases,q);$.set(H.name,H)}}if(![...$.values()].some((K)=>K.tableName)&&!Q.tables.length)return{tables:[],relations:[]};let J=(K,j=new Set)=>{if(j.has(K.name))return[];j.add(K.name);let W=[];for(let U of K.bases){let N=$.get(U);if(N&&!N.tableName)W.push(...J(N,j))}return W.push(...K.columns),W},V=[],Y=[];for(let K of $.values()){if(!K.tableName)continue;let j=J(K),W=new Map;for(let H of j)if(!W.has(H.name))W.set(H.name,H);let U=[...W.values()],N=(H)=>U.splice(U.findIndex((G)=>G.name===H),1)[0],L=U.some((H)=>H.name==="id")?N("id"):null,q=["created_at","updated_at","deleted_at"].filter((H)=>U.some((G)=>G.name===H)).map((H)=>N(H));V.push({name:K.tableName,columns:[...L?[L]:[],...U,...q]});for(let H of K.fks)Y.push({fromTable:K.tableName,fromColumn:H.column,toTable:H.toTable,toColumn:H.toColumn})}let X=new Set(V.map((K)=>K.name));for(let K of Q.tables)if(!X.has(K.name))V.push(K);return Y.push(...Q.relations.filter((K)=>!X.has(K.fromTable))),{tables:V,relations:Y}}function w7(Z){let $=Z.replace(/[?[\]]/g,"");return{String:"text",Int:"integer",BigInt:"bigint",Float:"float",Decimal:"numeric",Boolean:"boolean",DateTime:"timestamptz",Json:"jsonb",Bytes:"bytea"}[$]??$.toLowerCase()}function T7(Z){let $=[],Q=[];for(let J of Z){if(!J.path.endsWith(".prisma"))continue;let V=/model\s+(\w+)\s*\{([\s\S]*?)\}/g,Y;while(Y=V.exec(J.content)){let X=Y[1],K=Y[2].match(/@@map\(\s*["']([^"']+)["']\s*\)/)?.[1]??X,j=[];for(let W of Y[2].split(`
4
- `)){let U=W.trim().match(/^(\w+)\s+(\w+(?:\[\])?\??)\s*(.*)$/);if(!U||/^@@/.test(W.trim()))continue;let[,N,L,q]=U,H=/^(String|Int|BigInt|Float|Decimal|Boolean|DateTime|Json|Bytes)(\[\])?\??$/.test(L),G=q.match(/@relation\([^)]*fields:\s*\[(\w+)\][^)]*references:\s*\[(\w+)\]/);if(G)Q.push({fromTable:K,fromColumn:G[1],toTable:L.replace(/[?[\]]/g,""),toColumn:G[2]});if(!H)continue;j.push({name:N,type:w7(L),isPk:/@id\b/.test(q)||void 0,isFk:/@relation\b/.test(q)||void 0,nullable:L.endsWith("?")})}if(j.length)$.push({name:K,columns:j})}}return{tables:$,relations:Q}}function y7(Z,$){if(/mode:\s*["']timestamp/.test($))return"timestamp";if(/mode:\s*["']boolean["']/.test($))return"boolean";if(/mode:\s*["']json["']/.test($))return"jsonb";return Z}function u7(Z,$){let Q=0;for(let J=$;J<Z.length;J++)if(Z[J]==="{")Q++;else if(Z[J]==="}"){if(Q--,Q===0)return Z.slice($+1,J)}return""}function x7(Z){let $=[],Q=/(\w+)\s*:\s*(text|integer|real|blob|numeric|varchar|boolean|timestamp|serial|uuid|json|jsonb)\s*\(/g;for(let Y of Z){if(!/\.(ts|tsx|mts|cts)$/.test(Y.path))continue;if(!/\b(?:sqliteTable|pgTable|mysqlTable)\s*\(/.test(Y.content))continue;let X=/(?:export\s+)?const\s+(\w+)\s*=\s*(?:sqliteTable|pgTable|mysqlTable)\s*\(\s*["']([^"']+)["']\s*,/g,K;while(K=X.exec(Y.content)){let j=Y.content.indexOf("{",K.index+K[0].length);if(j<0)continue;let W=u7(Y.content,j),U={varName:K[1],tableName:K[2],columns:[],colByProp:new Map,fks:[]},N=[];Q.lastIndex=0;for(let L of W.matchAll(Q))N.push({prop:L[1],builder:L[2],at:L.index,argOpen:L.index+L[0].length-1});N.forEach((L,q)=>{let H=W.slice(L.at,N[q+1]?.at??W.length),G=SZ(W,L.argOpen),z=G.match(/^\s*["']([^"']+)["']/)?.[1]??L.prop,O=H.match(/\.references\(\s*\(\)\s*=>\s*(\w+)\.(\w+)/);if(U.columns.push({name:z,type:y7(L.builder,G),isPk:/\.primaryKey\(\)/.test(H)||void 0,isFk:O?!0:void 0,nullable:/\.notNull\(\)/.test(H)?!1:!0}),U.colByProp.set(L.prop,z),O)U.fks.push({column:z,toVar:O[1],toProp:O[2]})}),$.push(U)}}if(!$.length)return{tables:[],relations:[]};let J=new Map($.map((Y)=>[Y.varName,Y])),V=[];for(let Y of $)for(let X of Y.fks){let K=J.get(X.toVar);if(!K)continue;V.push({fromTable:Y.tableName,fromColumn:X.column,toTable:K.tableName,toColumn:K.colByProp.get(X.toProp)??X.toProp})}return{tables:$.map((Y)=>({name:Y.tableName,columns:Y.columns})),relations:V,tableVars:Object.fromEntries($.map((Y)=>[Y.varName,Y.tableName]))}}var f7={long:"bigint",Long:"bigint",BigInteger:"bigint",int:"integer",Integer:"integer",short:"smallint",Short:"smallint",String:"varchar",char:"varchar",Character:"varchar",boolean:"boolean",Boolean:"boolean",UUID:"uuid",BigDecimal:"numeric",double:"double",Double:"double",float:"float",Float:"float",LocalDate:"date",LocalDateTime:"timestamp",Instant:"timestamp",Timestamp:"timestamp",Date:"timestamp",OffsetDateTime:"timestamptz",ZonedDateTime:"timestamptz",LocalTime:"time"},g7=/^(List|Set|Map|Collection|Iterable)$/;function V5(Z){if(/byte\s*\[\s*\]/.test(Z))return"byte[]";return(Z.replace(/<.*>/,"").trim().split(".").pop()??Z).trim()}function h7(Z){let $=V5(Z);if($==="byte[]")return"bytea";return f7[$]??$.toLowerCase()}function vZ(Z,$){return Z.match(new RegExp(`\\b${$}\\s*=\\s*"([^"]*)"`))?.[1]}function Q5(Z,$){let Q=Z.match(new RegExp(`\\b${$}\\s*=\\s*(true|false)`));return Q?Q[1]==="true":void 0}function m7(Z){let $=[],Q=Z,J;while(J=Q.match(/^@[\w.]+(\([^)]*\))?\s*/))$.push(Q.slice(0,J[0].length).trim()),Q=Q.slice(J[0].length);return{annots:$,rest:Q.trim()}}function b7(Z){let $=[],Q=[];for(let J of Z.split(`
5
- `)){let V=J.trim();if(!V||V.startsWith("//")||V.startsWith("*")||V.startsWith("/*"))continue;let{annots:Y,rest:X}=m7(V);if(Q.push(...Y),!X)continue;let K=X,j="";while(K!==j)j=K,K=K.replace(/^(?:public|private|protected|static|final|transient|volatile)\s+/,"");let W=!K.includes("(")?K.match(/^([\w.$]+(?:<[^>]*>)?(?:\s*\[\s*\])?)\s+(\w+)\s*[;=]/):null;if(W)$.push({annots:Q,type:W[1],name:W[2]});Q=[]}return $}function p7(Z){let $=[],Q=/\bclass\s+(\w+)/g,J;while(J=Q.exec(Z))$.push({name:J[1],at:J.index});let V=[];for(let Y=0;Y<$.length;Y++){let X=Z.slice(Y===0?0:$[Y-1].at,$[Y].at);if(!/@Entity\b/.test(X))continue;let K=X.match(/@Table\s*\([^)]*\)/)?.[0]??"",j=vZ(K,"name")??$[Y].name,W=Z.slice($[Y].at,$[Y+1]?.at??Z.length),U=b7(W),N=U.find((q)=>q.annots.some((H)=>/@Id\b/.test(H))),L=N?vZ(N.annots.find((q)=>/@Column\b/.test(q))??"","name")??N.name:"id";V.push({className:$[Y].name,tableName:j,idColumn:L,fields:U})}return V}function c7(Z){let $=Z.filter((K)=>K.path.endsWith(".java")&&/@Entity\b/.test(K.content));if(!$.length)return{tables:[],relations:[]};let Q=$.flatMap((K)=>p7(K.content));if(!Q.length)return{tables:[],relations:[]};let J=new Map(Q.map((K)=>[K.className,K.tableName])),V=new Map(Q.map((K)=>[K.className,K.idColumn])),Y=[],X=[];for(let K of Q){let j=[];for(let W of K.fields){let U=W.annots.join(" ");if(/@Transient\b/.test(U))continue;let N=V5(W.type);if(/@ManyToOne\b|@OneToOne\b|@OneToMany\b|@ManyToMany\b/.test(U)||J.has(N)){let O=W.annots.find((F)=>/@JoinColumn\b/.test(F)),M=O?vZ(O,"name"):void 0;if(M){j.push({name:M,type:"bigint",isFk:!0,nullable:Q5(U,"nullable")??!0});let F=J.get(N);if(F)X.push({fromTable:K.tableName,fromColumn:M,toTable:F,toColumn:V.get(N)??"id"})}continue}if(g7.test(N))continue;let H=W.annots.find((O)=>/@Column\b/.test(O))??"",G=vZ(H,"name")??W.name,B=W.annots.some((O)=>/@Id\b/.test(O)),z=Q5(H,"nullable");j.push({name:G,type:h7(W.type),...B?{isPk:!0}:{},...z!==void 0?{nullable:z}:{}})}Y.push({name:K.tableName,columns:j})}return{tables:Y,relations:X}}function K5(Z){let $=x7(Z);if($.tables.length)return $;let Q=T7(Z);if(Q.tables.length)return Q;let J=k7(Z);if(J.tables.length)return J;return c7(Z)}var l7=["GET","POST","PUT","PATCH","DELETE"];function d7(Z){let $=Z.match(/(?:^|\/)app\/(.+)\/route\.(?:ts|tsx|js|jsx|mjs)$/);if(!$)return null;let Q=$[1].split("/").filter((J)=>!(J.startsWith("(")&&J.endsWith(")"))).map((J)=>{let V=J.match(/^\[{1,2}(?:\.\.\.)?([^\]]+)\]{1,2}$/);return V?`{${V[1]}}`:J});if(Q[0]!=="api")return null;return`/${Q.join("/")}`}function Y5(Z){let $=[];for(let Q of Z){let J=d7(Q.path);if(!J)continue;for(let V of l7)if(new RegExp(`export\\s+(?:async\\s+)?(?:function|const)\\s+${V}\\b`).test(Q.content))$.push({method:V,path:J,uses:[],file:Q.path})}return $.sort((Q,J)=>`${Q.path} ${Q.method}`.localeCompare(`${J.path} ${J.method}`))}var n7=/(^|\/)app\/.*\/route\.(ts|tsx|js|jsx|mjs)$/,r7=/\.(ts|py)$/,o7=/(schema|model)/i,i7=/(\.(test|spec)\.[jt]sx?$)|(^|\/)(tests?|__tests__|__mocks__)\/|(^|\/)test_[^/]+\.py$|_test\.py$/;function Q4(Z){if(i7.test(Z))return!1;if(Z.endsWith(".prisma"))return!0;if(n7.test(Z))return!0;if(Z.endsWith(".java"))return!0;return r7.test(Z)&&o7.test(Z)}function X5(Z,$=300){return Z.filter(Q4).slice(0,$)}import{z as d}from"zod";import{and as I5,eq as NZ,inArray as P8,notInArray as I8}from"drizzle-orm";import{z as A}from"zod";import{and as z8,eq as yZ,inArray as K4,notInArray as D8,or as F8,sql as _8}from"drizzle-orm";var G5=300,M5=50;function U5(Z){for(let $=0;$<Z.length;$++)for(let Q=$+1;Q<Z.length;Q++){let J=Z[$],V=Z[Q];if(J.x<V.x+G5&&J.x+G5>V.x&&J.y<V.y+M5&&J.y+M5>V.y)return!0}return!1}import{eq as s7}from"drizzle-orm";var j5=(Z)=>Z.replace(/\{[^}]*\}/g,"{}");function a7(Z,$){if(Z.method.toUpperCase()!==$.method.toUpperCase())return!1;let Q=j5(Z.path),J=j5($.path);return J===Q||J.endsWith(Q)}async function H5(Z=b){let[$,Q]=await Promise.all([Z.query.endpoint.findMany({where:(V,{ne:Y})=>Y(V.source,"INTROSPECTION")}),Z.query.endpoint.findMany({where:(V,{eq:Y})=>Y(V.source,"INTROSPECTION")})]),J={collapsed:0,mappings:[]};for(let V of $){let Y=Q.find((X)=>a7(V,X));if(!Y)continue;await Z.delete(E).where(s7(E.id,V.id)),J.collapsed++,J.mappings.push({planned:`${V.method} ${V.path}`,code:`${Y.method} ${Y.path}`})}return J}import{and as W5,inArray as t7,isNull as N5,ne as C5,or as e7}from"drizzle-orm";var Z8=new Set(["DONE","CANCELLED","DEPRIORITIZED"]);async function $8(Z){let $=await Z.query.node.findMany({where:(J,{and:V,eq:Y,isNotNull:X})=>V(Y(J.view,"ROADMAP"),X(J.planId)),columns:{planId:!0,status:!0}}),Q=new Map;for(let J of $){let V=J.planId;Q.set(V,(Q.get(V)??!0)&&Z8.has(J.status))}return[...Q.entries()].filter(([,J])=>J).map(([J])=>J)}async function L5(Z=b){let $=await $8(Z),Q=(Y)=>$.length?e7(N5(Y.planId),t7(Y.planId,$)):N5(Y.planId),J=await Z.delete(P).where(W5(C5(P.source,"INTROSPECTION"),Q(P))).returning({id:P.id}),V=await Z.delete(E).where(W5(C5(E.source,"INTROSPECTION"),Q(E))).returning({id:E.id});return{tables:J.length,endpoints:V.length}}var Q8=(Z)=>Z&&Number.isFinite(Z)&&Z>0?Math.min(3.2,Math.max(0.7,Z)):1.8;function J8(Z,$){let Q=Q8($.viewportAspect)*($.aspectSlack??1),J=Z.reduce((V,Y)=>V+(Y.w+$.gapX)*(Y.h+$.gapY),0);return Math.max($.minBandW,Math.round(Math.sqrt(J*Q)))}function B5(Z,$){let Q=J8(Z,$),J=new Map,V=0,Y=0,X=0;for(let K of Z){if(V>0&&V+K.w>Q)Y+=X+$.gapY,V=0,X=0;J.set(K.id,{x:V,y:Y}),X=Math.max(X,K.h),V+=K.w+$.gapX}return J}var $Z=320,J4=30,V8=36,K8=30,Y8=16;function QZ(Z){return V8+Math.max(0,Z)*K8+Y8}var GZ=60,X8=300,kZ=10,G8=84,wZ=72,M8=3*$Z,U8=1.7;var TZ=(Z)=>(Z??"").trim()||"\u2014";function j8(Z,$,Q){let J=new Map;for(let Y of Z.uses){if(!$.has(Y.tableId))continue;J.set(Y.tableId,(J.get(Y.tableId)??0)+1)}let V=null;for(let[Y,X]of J){if(V===null){V=Y;continue}let K=J.get(V);if(X>K){V=Y;continue}if(X<K)continue;let j=Q?.get(Y)??0,W=Q?.get(V)??0;if(j<W)V=Y;else if(j===W&&$.get(Y).localeCompare($.get(V))<0)V=Y}return V}function V4(Z,$){let Q=new Map(Z.map((V)=>[V.id,V.name])),J=new Map;for(let V of $)for(let Y of V.uses){if(!Q.has(Y.tableId))continue;J.set(Y.tableId,(J.get(Y.tableId)??0)+1)}return new Map($.map((V)=>[V.id,j8(V,Q,J)]))}var H8=(Z,$)=>Z.path.localeCompare($.path)||Z.method.localeCompare($.method)||Z.id.localeCompare($.id);function q5(Z,$,Q={}){let J=V4(Z,$),V=new Map,Y=[];for(let G of[...$].sort(H8)){let B=J.get(G.id)??null;if(B){let z=V.get(B);if(z)z.push(G);else V.set(B,[G])}else Y.push(G)}let X=(G)=>{let B=V.get(G.id)?.length??0;return QZ(G.columnCount)+(B?kZ+B*GZ:0)+J4},K=Array.from(new Set(Z.map((G)=>TZ(G.domain)))),j=K.filter((G)=>G!=="\u2014").sort(),W=K.includes("\u2014")?[...j,"\u2014"]:j,U=[];for(let G of W){let B=Z.filter((D)=>TZ(D.domain)===G).sort((D,R)=>D.name.localeCompare(R.name)),z=B.reduce((D,R)=>D+X(R),0),O=Math.max(1,Math.min(12,B.length,Math.round(Math.sqrt(z/$Z)))),M=Array(O).fill(0),F=new Map;for(let D of B){let R=0;for(let w=1;w<O;w++)if(M[w]<M[R])R=w;F.set(D.id,{x:R*$Z,y:M[R]}),M[R]+=X(D)}U.push({d:G,w:O*$Z,h:Math.max(...M,0),tableLocal:F})}let N=B5(U.map((G)=>({id:G.d,w:G.w,h:G.h})),{gapX:G8,gapY:wZ,viewportAspect:Q.viewportAspect,minBandW:M8,aspectSlack:U8}),L=new Map,q=new Map,H=0;for(let G of U){let B=N.get(G.d),z=Z.filter((O)=>G.tableLocal.has(O.id));for(let O of z){let M=G.tableLocal.get(O.id),F=B.x+M.x,D=B.y+M.y;L.set(O.id,{x:F,y:D}),(V.get(O.id)??[]).forEach((w,T)=>{q.set(w.id,{x:F,y:D+QZ(O.columnCount)+kZ+T*GZ})})}H=Math.max(H,B.y+G.h)}if(Y.length){let G=H+wZ,B=Math.max(1,Math.min(4,Math.ceil(Math.sqrt(Y.length/2))));Y.forEach((z,O)=>{q.set(z.id,{x:O%B*X8,y:G+Math.floor(O/B)*GZ})})}return{tables:L,endpoints:q}}function O5(Z,$,Q){let J=V4($,Q),V=new Map;for(let q of Q){let H=J.get(q.id);if(H)V.set(H,(V.get(H)??0)+1)}let Y=(q)=>{let H=V.get(q.id)??0;return q.y+QZ(q.columnCount)+(H?kZ+H*GZ:0)},X=TZ(Z.domain),K=$.filter((q)=>TZ(q.domain)===X);if(!K.length){let q=$.length?Math.max(...$.map(Y),...Q.map((H)=>H.y+GZ)):0;return{x:0,y:$.length||Q.length?q+wZ:0}}let j=Math.min(...K.map((q)=>q.x)),W=K.map((q)=>Math.max(0,Math.round((q.x-j)/$Z))),U=Math.min(12,Math.max(...W)+1),N=Array(U).fill(Math.min(...K.map((q)=>q.y)));K.forEach((q,H)=>{let G=Math.min(W[H],U-1);N[G]=Math.max(N[G],Y(q)+J4)});let L=0;for(let q=1;q<U;q++)if(N[q]<N[L])L=q;return{x:j+L*$Z,y:N[L]}}function z5(Z,$,Q){let J=V4($,[...Q,Z]),V=J.get(Z.id),Y=V?$.find((K)=>K.id===V):void 0;if(Y){let K=Q.filter((U)=>J.get(U.id)===Y.id),j=Y.y+QZ(Y.columnCount)+kZ,W=K.length?Math.max(...K.map((U)=>U.y))+GZ:j;return{x:Y.x,y:W}}let X=[...$.map((K)=>K.y+QZ(K.columnCount)),...Q.map((K)=>K.y+GZ)];return{x:0,y:X.length?Math.max(...X)+wZ:0}}function D5(Z){let $=$Z-20;for(let Q=0;Q<Z.length;Q++)for(let J=Q+1;J<Z.length;J++){let V=Z[Q],Y=Z[J],X=QZ(V.columnCount),K=QZ(Y.columnCount);if(V.x<Y.x+$&&V.x+$>Y.x&&V.y<Y.y+K&&V.y+X>Y.y)return!0}return!1}import{eq as _5}from"drizzle-orm";F5();async function A5(Z=b,$){let[Q,J]=await Promise.all([Z.query.dbTable.findMany({with:{columns:{columns:{id:!0}}},orderBy:(X,{asc:K})=>K(X.name)}),Z.query.endpoint.findMany({with:{tables:{columns:{tableId:!0}}}})]),V=q5(Q.map((X)=>({id:X.id,name:X.name,domain:X.domain,columnCount:X.columns.length})),J.map((X)=>({id:X.id,method:X.method,path:X.path,uses:X.tables.map((K)=>({tableId:K.tableId}))})),{viewportAspect:$}),Y=0;for(let X of Q){let K=V.tables.get(X.id);if(!K||Math.round(K.x)===Math.round(X.x)&&Math.round(K.y)===Math.round(X.y))continue;await Z.update(P).set({x:K.x,y:K.y}).where(_5(P.id,X.id)),Y++}for(let X of J){let K=V.endpoints.get(X.id);if(!K||Math.round(K.x)===Math.round(X.x)&&Math.round(K.y)===Math.round(X.y))continue;await Z.update(E).set({x:K.x,y:K.y}).where(_5(E.id,X.id)),Y++}return Y}var A8=A.object({tables:A.array(A.object({name:A.string().trim().min(1),domain:A.string().nullish(),description:A.string().nullish(),columns:A.array(A.object({name:A.string().trim().min(1),type:A.string().trim().min(1),isPk:A.boolean().optional(),isFk:A.boolean().optional(),nullable:A.boolean().optional(),note:A.string().nullish()})).default([])})).default([]),relations:A.array(A.object({fromTable:A.string(),fromColumn:A.string(),toTable:A.string(),toColumn:A.string(),label:A.string().nullish()})).default([]),endpoints:A.array(A.object({method:A.string().trim().min(1),path:A.string().trim().min(1),domain:A.string().nullish(),description:A.string().nullish(),uses:A.array(A.object({table:A.string(),access:A.string().default("read")})).default([])})).default([])});async function uZ(Z=b){let[$]=await Z.insert(a).values({id:"singleton",version:1}).onConflictDoUpdate({target:a.id,set:{version:_8`${a.version} + 1`}}).returning();return $.version}async function P5(Z,$=b,Q={}){let J=A8.parse(Z),V=J.tables.length>0,Y=J.endpoints.length>0,X=J.tables.map((M)=>M.name);if(V)await $.delete(P).where(X.length?z8(yZ(P.source,"INTROSPECTION"),D8(P.name,X)):yZ(P.source,"INTROSPECTION"));let K=await $.query.dbTable.findMany({columns:{id:!0,name:!0,domain:!0,x:!0,y:!0},with:{columns:{columns:{id:!0}}}}),j=await $.query.endpoint.findMany({columns:{id:!0,method:!0,path:!0,x:!0,y:!0},with:{tables:{columns:{tableId:!0}}}}),W=new Map(K.map((M)=>[M.name,M])),U=K.map((M)=>({id:M.id,name:M.name,domain:M.domain,columnCount:M.columns.length,x:M.x,y:M.y})),N=j.map((M)=>({id:M.id,method:M.method,path:M.path,uses:M.tables.map((F)=>({tableId:F.tableId})),x:M.x,y:M.y})),L=new Map;for(let M of J.tables){if(W.has(M.name))continue;let F=O5({domain:M.domain??null,columnCount:M.columns.length},U,N);L.set(M.name,F),U.push({id:`new:${M.name}`,name:M.name,domain:M.domain??null,columnCount:M.columns.length,...F})}let q=new Map;for(let M of J.tables){let F=W.get(M.name),D=L.get(M.name),R=F?.x??D?.x??0,w=F?.y??D?.y??0,[T]=await $.insert(P).values({name:M.name,domain:M.domain??null,description:M.description??null,source:"INTROSPECTION",x:R,y:w}).onConflictDoUpdate({target:P.name,set:{...M.domain!=null?{domain:M.domain}:{},...M.description!=null?{description:M.description}:{},source:"INTROSPECTION"}}).returning();if(q.set(M.name,T.id),await $.delete(e).where(yZ(e.tableId,T.id)),M.columns.length)await $.insert(e).values(M.columns.map((f,I)=>({tableId:T.id,name:f.name,type:f.type,isPk:f.isPk??!1,isFk:f.isFk??!1,nullable:f.nullable??!0,note:f.note??null,ord:I})))}let H=[...q.values()];if(H.length)await $.delete(l).where(F8(K4(l.fromTableId,H),K4(l.toTableId,H)));for(let M of J.relations){let F=q.get(M.fromTable),D=q.get(M.toTable);if(!F||!D)continue;await $.insert(l).values({fromTableId:F,toTableId:D,fromColumn:M.fromColumn,toColumn:M.toColumn,label:M.label??`${M.fromColumn} \u2192 ${M.toTable}.${M.toColumn}`})}let G=new Set(J.endpoints.map((M)=>`${M.method} ${M.path}`));if(Y){let F=(await $.query.endpoint.findMany({where:(D,{eq:R})=>R(D.source,"INTROSPECTION")})).filter((D)=>!G.has(`${D.method} ${D.path}`)).map((D)=>D.id);if(F.length)await $.delete(E).where(K4(E.id,F))}for(let M of U)if(M.id.startsWith("new:"))M.id=q.get(M.name)??M.id;for(let M of J.endpoints){let F=await $.query.endpoint.findFirst({where:(T,{and:f,eq:I})=>f(I(T.method,M.method),I(T.path,M.path))}),D,R;if(F)D=F.x,R=F.y;else{let T={id:`new:${M.method} ${M.path}`,method:M.method,path:M.path,uses:M.uses.map((I)=>({tableId:q.get(I.table)??""})).filter((I)=>I.tableId)},f=z5(T,U,N);D=f.x,R=f.y,N.push({...T,x:D,y:R})}let[w]=await $.insert(E).values({method:M.method,path:M.path,domain:M.domain??null,description:M.description??null,source:"INTROSPECTION",x:D,y:R}).onConflictDoUpdate({target:[E.method,E.path],set:{...M.domain!=null?{domain:M.domain}:{},...M.description!=null?{description:M.description}:{},source:"INTROSPECTION"}}).returning();if(!Q.partial||M.uses.length>0)await $.delete(i).where(yZ(i.endpointId,w.id));for(let T of M.uses){let f=q.get(T.table)??(await $.query.dbTable.findFirst({where:(I,{eq:UZ})=>UZ(I.name,T.table)}))?.id;if(!f)continue;await $.insert(i).values({endpointId:w.id,tableId:f,access:T.access})}}await H5($),await L5($);let B=await $.query.dbTable.findMany({where:(M,{eq:F})=>F(M.source,"INTROSPECTION"),columns:{x:!0,y:!0},with:{columns:{columns:{id:!0}}}}),z=await $.select({x:E.x,y:E.y}).from(E);if(D5(B.map((M)=>({x:M.x,y:M.y,columnCount:M.columns.length})))||U5(z))await A5($);let O=await uZ($);return{tables:J.tables.length,relations:J.relations.length,endpoints:J.endpoints.length,version:O}}var R5=d.object({files:d.array(d.object({path:d.string().trim().min(1),root:d.string().nullish(),lang:d.string().nullish(),mtimeMs:d.number().nullish(),size:d.number().nullish()})).default([]),edges:d.array(d.object({from:d.string().trim().min(1),to:d.string().trim().min(1)})).default([])});function E5(Z,$){let Q=new Map;for(let L of Z)Q.set(L,[]);for(let L of $)Q.get(L.from)?.push(L.to);let J=new Map,V=new Map,Y=new Set,X=[],K=new Map,j=[],W=0,U=0;for(let L of Z){if(J.has(L))continue;let q=[{v:L,iter:0}];J.set(L,W),V.set(L,W),W++,X.push(L),Y.add(L);while(q.length){let H=q[q.length-1],G=Q.get(H.v)??[];if(H.iter<G.length){let B=G[H.iter++];if(!J.has(B))J.set(B,W),V.set(B,W),W++,X.push(B),Y.add(B),q.push({v:B,iter:0});else if(Y.has(B))V.set(H.v,Math.min(V.get(H.v),J.get(B)))}else{if(V.get(H.v)===J.get(H.v)){let z=0,O;do O=X.pop(),Y.delete(O),K.set(O,U),z++;while(O!==H.v);j.push(z),U++}q.pop();let B=q[q.length-1];if(B)V.set(B.v,Math.min(V.get(B.v),V.get(H.v)))}}}let N=new Set;for(let L of $){let q=K.get(L.from);if(q!==void 0&&q===K.get(L.to)&&j[q]>1)N.add(`${L.from}|${L.to}`)}return N}async function S5(Z,$=b){let Q=R5.parse(Z),J=Q.files.map((N)=>N.path),V=new Set(J),Y=Q.edges.filter((N)=>V.has(N.from)&&V.has(N.to)&&N.from!==N.to),X=E5(J,Y),K=new Map,j=new Map;for(let N of Y)j.set(N.from,(j.get(N.from)??0)+1),K.set(N.to,(K.get(N.to)??0)+1);await $.delete(y).where(I8(y.path,J));for(let N of Q.files){let L={root:N.root??null,lang:N.lang??null,mtimeMs:N.mtimeMs??null,size:N.size??null,inDegree:K.get(N.path)??0,outDegree:j.get(N.path)??0};await $.insert(y).values({path:N.path,...L}).onConflictDoUpdate({target:y.path,set:L})}await $.delete(x);let W=0;if(Y.length)await $.insert(x).values(Y.map((N)=>{let L=X.has(`${N.from}|${N.to}`);if(L)W++;return{fromPath:N.from,toPath:N.to,circular:L}}));let U=await uZ($);return await $.update(a).set({codeGraphSyncedAt:new Date}).where(NZ(a.id,"singleton")),{files:Q.files.length,edges:Y.length,circular:W,version:U}}var R8=(Z,$)=>`${Z}\x00${$}`;function Y4(Z){let $=R5.parse(Z),Q=$.files.map((U)=>U.path),J=new Set(Q),V=$.edges.filter((U)=>J.has(U.from)&&J.has(U.to)&&U.from!==U.to),Y=E5(Q,V),X=new Map,K=new Map;for(let U of V)K.set(U.from,(K.get(U.from)??0)+1),X.set(U.to,(X.get(U.to)??0)+1);let j=new Map;for(let U of $.files)j.set(U.path,{root:U.root??null,lang:U.lang??null,mtimeMs:U.mtimeMs??null,size:U.size??null,inDegree:X.get(U.path)??0,outDegree:K.get(U.path)??0});let W=new Map;for(let U of V)W.set(R8(U.from,U.to),{from:U.from,to:U.to,circular:Y.has(`${U.from}|${U.to}`)});return{files:j,edges:W}}var E8=(Z,$)=>Z.root===$.root&&Z.lang===$.lang&&Z.mtimeMs===$.mtimeMs&&Z.size===$.size&&Z.inDegree===$.inDegree&&Z.outDegree===$.outDegree;async function v5(Z,$,Q=b){for(let[K,j]of $.files){let W=Z.files.get(K);if(W&&E8(W,j))continue;let U={root:j.root,lang:j.lang,mtimeMs:j.mtimeMs,size:j.size,inDegree:j.inDegree,outDegree:j.outDegree};await Q.insert(y).values({path:K,...U}).onConflictDoUpdate({target:y.path,set:U})}let J=[...Z.files.keys()].filter((K)=>!$.files.has(K));if(J.length)await Q.delete(y).where(P8(y.path,J));for(let[K,j]of Z.edges)if(!$.edges.has(K))await Q.delete(x).where(I5(NZ(x.fromPath,j.from),NZ(x.toPath,j.to)));let V=[];for(let[K,j]of $.edges){let W=Z.edges.get(K);if(!W)V.push({fromPath:j.from,toPath:j.to,circular:j.circular});else if(W.circular!==j.circular)await Q.update(x).set({circular:j.circular}).where(I5(NZ(x.fromPath,j.from),NZ(x.toPath,j.to)))}if(V.length)await Q.insert(x).values(V);let Y=await uZ(Q);await Q.update(a).set({codeGraphSyncedAt:new Date}).where(NZ(a.id,"singleton"));let X=0;for(let K of $.edges.values())if(K.circular)X++;return{files:$.files.size,edges:$.edges.size,circular:X,version:Y}}var T8=/[/\\](node_modules|\.git|\.next|dist|build|__pycache__|target|\.venv|venv|\.beacon|\.playwright-mcp|generated|coverage)[/\\]/;function y8(Z){try{let $=zZ(Z,"beacon.config.json");if(w5($)){let Q=JSON.parse(S8($,"utf8"));if(Array.isArray(Q.roots)&&Q.roots.length)return Q.roots.map((J)=>w8(Z,J))}}catch{}return[Z]}function T5(Z){let $=y8(Z.path),Q=dZ(Z.id),J=sZ(VZ(Z.id)),V=Z5($,Z.path);async function Y(){let G=X5(V.snapshot().files.map((F)=>F.path));for(let F of $)for(let D of["prisma/schema.prisma","schema.prisma"]){let R=zZ(F,D);if(w5(R))G.push(X(R))}let B=[];for(let F of G)try{B.push({path:F,content:await k5(zZ(Z.path,F),"utf8")})}catch{}let z=K5(B),O=Y5(B);if(!z.tables.length&&!O.length)return;if(O.length&&z.tableVars&&Object.keys(z.tableVars).length){let D=V.snapshot().edges,R=new Set(O.map((I)=>I.file)),w=new Map;for(let I of D){let UZ=w.get(I.from)??[];UZ.push(I.to),w.set(I.from,UZ)}for(let I=0;I<2;I++)for(let UZ of[...R])for(let b5 of w.get(UZ)??[])R.add(b5);let T=new Map;for(let I of[...R].slice(0,600))try{T.set(I,await k5(zZ(Z.path,I),"utf8"))}catch{}let f=$5({routeFiles:[...new Set(O.map((I)=>I.file))],edges:D,content:(I)=>T.get(I)??null,tableVars:z.tableVars});for(let I of O)I.uses=f.get(I.file)??[]}let M=await P5({tables:z.tables,relations:z.relations,endpoints:O},J,{partial:!0});console.log(`[beacon-inline] schema synced (${Z.name}): ${M.tables} tables / ${M.endpoints} endpoints`)}function X(G){return k8(Z.path,G).split(/[\\/]/).join("/")}let K=null,j=!1,W=new Set,U=null,N=!1;async function L(){if(N){q();return}N=!0;try{if(await Q,j)K=null,j=!1;if(K===null){let O=await V.seed(),M=await S5(O,J);K=Y4(O),console.log(`[beacon-inline] code-graph synced (${Z.name}): ${M.files} files / ${M.edges} imports${M.circular>0?` (${M.circular} circular)`:""}`),await Y();return}let G=[...W];W.clear();let B=G.some((O)=>Q4(X(O))),z=!1;for(let O of G)if(await V.applyChange(O))z=!0;if(z){let O=Y4(V.snapshot()),M=await v5(K,O,J);K=O,console.log(`[beacon-inline] code-graph updated (${Z.name}): ${M.files} files / ${M.edges} imports${M.circular>0?` (${M.circular} circular)`:""}`)}if(B)await Y()}catch(G){console.error(`[beacon-inline] error (${Z.name}):`,G instanceof Error?G.message:G)}finally{N=!1}}function q(){if(U)clearTimeout(U);U=setTimeout(L,600)}let H=[];for(let G of $)try{let B=v8(G,{recursive:!0,persistent:!0},(z,O)=>{if(!O){j=!0,q();return}let M=String(O);if(T8.test(`/${M}`))return;W.add(zZ(G,M)),q()});B.on("error",(z)=>console.error(`[beacon-inline] watcher error (${Z.name}):`,z)),H.push(B)}catch(B){console.error(`[beacon-inline] live watch unavailable for ${G} (${Z.name}):`,B instanceof Error?B.message:B)}return console.log(`[beacon-inline] watching ${Z.name} (${$.join(", ")}) \u2014 initial extract\u2026`),L(),{async stop(){if(U)clearTimeout(U);for(let G of H)G.close()}}}function x8(Z){let $=Z.limit??6,Q=Z.hardCap??12,J=new Map,V=0,Y=new Set;function X(G){let B=J.get(G);if(B)B.seq=++V}function K(G){if(J.has(G.id))return X(G.id);if(!Z.exists(G.path))return;J.set(G.id,{handle:Z.start(G),seq:++V})}function j(){let G=null,B=1/0;for(let[z,O]of J){if(Y.has(z))continue;if(O.seq<B)B=O.seq,G=z}if(G)J.get(G).handle.stop(),J.delete(G)}function W(){let G=Z.list().filter((B)=>Z.exists(B.path)).slice(0,$);Y=new Set(G.map((B)=>B.id));for(let B of G)K(B);for(let[B,z]of[...J]){let O=Z.get(B);if(!O||!Z.exists(O.path))z.handle.stop(),J.delete(B)}}function U(G){if(J.has(G))return X(G);let B=Z.get(G);if(!B||!Z.exists(B.path))return;if(J.size>=Q)j();if(J.size>=Q)return;J.set(G,{handle:Z.start(B),seq:++V})}async function N(G){let B=J.get(G);if(!B)return;J.delete(G),await B.handle.stop()}function L(G){return J.has(G)}function q(){return[...J.keys()]}async function H(){await Promise.all([...J.values()].map((G)=>G.handle.stop())),J.clear()}return{reconcile:W,ensureWatcher:U,stopWatcher:N,isWatching:L,activeIds:q,stopAll:H}}var f8=x8({list:FZ,get:g,exists:u8,start:(Z)=>T5(Z)});async function y5(Z){await f8.stopWatcher(Z)}async function u5(Z){if(!g(Z))return{ok:!1,removed:!1,fallbackId:r(),error:"unknown workspace"};D4(Z),O4(Z),await y5(Z),E4(VZ(Z)),I4(Z);try{g8(n(Z),{recursive:!0,force:!0})}catch($){return{ok:!1,removed:!0,fallbackId:r(),error:$ instanceof Error?$.message:String($)}}return{ok:!0,removed:!0,fallbackId:r()}}var X4=process.argv.slice(3),g5=X4.includes("--yes")||X4.includes("-y"),MZ=X4.find((Z)=>!Z.startsWith("-")),x5=(Z)=>`\x1B[32m\u2713\x1B[0m ${Z}`,h5=(Z)=>`\x1B[2m${Z}\x1B[0m`,m5=(Z)=>`
6
- \x1B[1m${Z}\x1B[0m`;function b8(){if(!MZ)return g(JZ(pZ(process.cwd())));if(/^[0-9a-f]{12}$/.test(MZ)){let Z=g(MZ);if(Z)return Z}return g(JZ(pZ(f5(MZ))))}var s=b8();if(!s)console.error(`[beacon] ${MZ??process.cwd()} is not a registered Beacon workspace \u2014 nothing to remove.`),process.exit(1);console.log(m5(g5?"Beacon \xB7 remove workspace":"Beacon \xB7 remove workspace (dry run)"));console.log(` name: ${s.name}${r()===s.id?" (currently active)":""}`);console.log(` repo: ${s.path} ${h5("(untouched \u2014 only Beacon's data is erased)")}`);console.log(` data: ${n(s.id)} ${h5("(deleted)")}`);if(!g5)console.log(m5("Nothing was changed.")),console.log(` Run \x1B[1mbeacon remove${MZ?` ${MZ}`:""} --yes\x1B[0m to apply.
7
- `),process.exit(0);async function p8(Z){try{let{pid:$,port:Q}=JSON.parse(m8(f5(t(),"server.json"),"utf8"));if(!$||!Q)return!1;return process.kill($,0),(await fetch(`http://localhost:${Q}/api/workspace`,{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify({id:Z}),signal:AbortSignal.timeout(1e4)})).ok}catch{return!1}}if(await p8(s.id))console.log(` ${x5(`removed ${s.name} (via the running daemon)`)}
8
- `);else{let Z=await u5(s.id);if(!Z.ok)console.error(`[beacon] remove failed: ${Z.error??"unknown error"}`),process.exit(1);console.log(` ${x5(`removed ${s.name}`)}
3
+ var b5=Object.defineProperty;var p5=(Z)=>Z;function c5(Z,$){this[Z]=p5.bind(null,$)}var gZ=(Z,$)=>{for(var Q in $)b5(Z,Q,{get:$[Q],enumerable:!0,configurable:!0,set:c5.bind($,Q)})};var Y4=(Z,$)=>()=>(Z&&($=Z(Z=0)),$);var G4={};gZ(G4,{provisionDb:()=>$6});import{createClient as l5}from"@libsql/client";import{drizzle as d5}from"drizzle-orm/libsql";import{migrate as n5}from"drizzle-orm/libsql/migrator";import{readMigrationFiles as r5}from"drizzle-orm/migrator";import{dirname as hZ,join as o5}from"path";import{fileURLToPath as i5}from"url";async function zZ(Z,$){return(await Z.execute({sql:"SELECT 1 FROM sqlite_master WHERE type='table' AND name = ?",args:[$]})).rows.length>0}async function e5(Z,$){let Q=await Z.execute(`PRAGMA table_info("${$}")`);return new Set(Q.rows.map((J)=>String(J.name)))}async function X4(Z){if(!await zZ(Z,"__drizzle_migrations"))return 0;let $=await Z.execute('SELECT count(*) AS n FROM "__drizzle_migrations"');return Number($.rows[0]?.n??0)}async function Z6(Z){for(let[$,Q]of Object.entries(t5)){if(!await zZ(Z,$))continue;let J=await e5(Z,$);for(let V of Q){if(!J.has(V))continue;await Z.execute(`UPDATE "${$}" SET "${V}" = CAST((julianday("${V}") - 2440587.5) * 86400000 AS INTEGER) WHERE typeof("${V}") = 'text'`)}}}async function $6(Z,$=a5){let Q=l5({url:Z});try{await Q.execute("PRAGMA journal_mode = WAL;"),await Q.execute("PRAGMA foreign_keys = ON;"),await Q.execute("PRAGMA busy_timeout = 5000;");let J=await zZ(Q,"__drizzle_migrations"),V=await zZ(Q,"Node"),Y=!1;if(V&&!J){let K=r5({migrationsFolder:$})[0];if(K)await Q.execute('CREATE TABLE IF NOT EXISTS "__drizzle_migrations" (id SERIAL PRIMARY KEY, hash text NOT NULL, created_at numeric)'),await Q.execute({sql:'INSERT INTO "__drizzle_migrations" ("hash", "created_at") VALUES (?, ?)',args:[K.hash,K.folderMillis]}),Y=!0}let X=await X4(Q);if(await n5(d5(Q),{migrationsFolder:$}),await X4(Q)>X)Y=!0;return await Z6(Q),{migrated:Y}}finally{Q.close()}}var s5,a5,t5;var M4=Y4(async()=>{s5=hZ(hZ(hZ(i5(import.meta.url)))),a5=process.env.BEACON_MIGRATIONS_DIR||o5(s5,"drizzle"),t5={Node:["createdAt","updatedAt"],Note:["createdAt","updatedAt"],DbTable:["createdAt","updatedAt"],Endpoint:["createdAt","updatedAt"],DraftTable:["createdAt"],SyncState:["codeGraphSyncedAt","updatedAt"],AppSetting:["updatedAt"],ProjectMeta:["updatedAt"],CodeFile:["updatedAt"]}});import{mkdirSync as W8,renameSync as C8,rmSync as N8,writeFileSync as L8}from"fs";import{dirname as B8}from"path";function q8(Z,$){W8(B8(Z),{recursive:!0});let Q=`${Z}.tmp`;try{L8(Q,$),C8(Q,Z)}catch(J){throw N8(Q,{force:!0}),J}}function O8(Z,$,Q=!1){q8(Z,JSON.stringify($,null,Q?2:void 0))}var z5=()=>{};import{AsyncLocalStorage as Q6}from"async_hooks";import{spawnSync as J6}from"child_process";import{createHash as V6}from"crypto";import{existsSync as j4,mkdirSync as NZ,readFileSync as bZ,writeFileSync as pZ}from"fs";import{homedir as H4}from"os";import{basename as K6,join as $Z,parse as Y6,resolve as U4}from"path";function t(){return process.env.BEACON_HOME||$Z(H4(),".beacon")}function cZ(){return $Z(t(),"workspaces.json")}function ZZ(Z){return V6("sha256").update(Z).digest("hex").slice(0,12)}function FZ(Z=process.cwd()){let $=J6("git",["rev-parse","--show-toplevel"],{cwd:Z,stdio:["ignore","pipe","ignore"]});if($.status===0){let Q=$.stdout?.toString().trim();if(Q)return Q}return Z}function W4(Z){let $=U4(Z);return $!==U4(H4())&&$!==Y6($).root}function C4(){return $Z(t(),"deleted.json")}function lZ(){try{let Z=JSON.parse(bZ(C4(),"utf8"));return Array.isArray(Z)?Z:[]}catch{return[]}}function N4(Z){NZ(t(),{recursive:!0}),pZ(C4(),JSON.stringify(Z,null,2))}function L4(Z){return lZ().includes(Z)}function B4(Z){let $=lZ();if(!$.includes(Z))N4([...$,Z])}function X6(Z){let $=lZ();if($.includes(Z))N4($.filter((Q)=>Q!==Z))}function n(Z){return $Z(t(),Z)}function VZ(Z){return`file:${$Z(n(Z),"db.sqlite")}`}function LZ(){try{let Z=JSON.parse(bZ(cZ(),"utf8"));return Array.isArray(Z)?Z:[]}catch{return[]}}function dZ(Z){NZ(t(),{recursive:!0}),pZ(cZ(),JSON.stringify(Z,null,2))}function _Z(){return LZ().sort((Z,$)=>$.lastOpenedAt.localeCompare(Z.lastOpenedAt))}function g(Z){return LZ().find(($)=>$.id===Z)??null}function q4(Z,$,Q=new Date().toISOString()){if(!W4(Z))throw Error(`beacon: refusing to register a non-repo path as a workspace: ${Z}`);let J=ZZ(Z);if(L4(J))throw Error(`beacon: workspace ${J} (${Z}) was deleted \u2014 run \`beacon\` or /beacon-init to re-add it`);let V=LZ(),Y=V.find((j)=>j.id===J),X={id:J,path:Z,name:$||Y?.name||K6(Z),lastOpenedAt:Q},K=[X,...V.filter((j)=>j.id!==J)];return NZ(n(J),{recursive:!0}),dZ(K),X}function Q$(Z,$){return X6(ZZ(Z)),q4(Z,$)}function J$(Z,$=new Date().toISOString()){let Q=LZ(),J=Q.find((V)=>V.id===Z);if(!J)return;J.lastOpenedAt=$,dZ(Q)}function O4(Z){if(dZ(LZ().filter(($)=>$.id!==Z)),r()===Z)G6(_Z()[0]?.id??null)}function D4(){return $Z(t(),"active")}function r(){try{return bZ(D4(),"utf8").trim()||null}catch{return null}}function G6(Z){NZ(t(),{recursive:!0}),pZ(D4(),Z??"")}function M6(){let Z=r();return Z?g(Z):null}function V$(){let Z=AZ()??r();return Z?g(Z):null}function K$(Z){return g(Z)?.path??null}function Y$(){return j4(cZ())}var z4="beacon_ws";function F4(Z,$){let Q=Z.headers.get("cookie");if(!Q)return null;for(let J of Q.split(";")){let V=J.indexOf("=");if(V===-1)continue;if(J.slice(0,V).trim()===$)return decodeURIComponent(J.slice(V+1).trim())}return null}function X$(Z){let $=Z.headers.get("x-beacon-workspace");if($&&g($))return $;let Q=F4(Z,z4);if(Q&&g(Q))return Q;return U6()}function U6(){let Z=_Z();return Z.length===1?Z[0].id:null}var _4="x-beacon-workspace-path";function G$(Z=process.cwd()){let $=FZ(Z);return{"x-beacon-workspace":ZZ($),[_4]:$}}async function M$(Z){let $=Z.headers.get("x-beacon-workspace");if($&&g($))return $;let Q=Z.headers.get(_4);if(Q&&W4(Q)&&!L4(ZZ(Q))&&(!$||ZZ(Q)===$)){let V=q4(Q);return await nZ(V.id),V.id}let J=F4(Z,z4);if(J&&g(J))return J;return null}var A4=new Q6;function j6(Z,$){return Z?A4.run(Z,$):$()}function AZ(){return A4.getStore()??null}var mZ=new Set;function P4(Z){mZ.delete($Z(n(Z),"db.sqlite"))}async function nZ(Z){let $=n(Z),Q=$Z($,"db.sqlite"),J=j4(Q);if(J&&mZ.has(Q))return{ok:!0,created:!1,migrated:!1};try{NZ($,{recursive:!0});let{provisionDb:V}=await M4().then(() => G4),Y=await V(VZ(Z));return mZ.add(Q),{ok:!0,created:!J,migrated:J&&Y.migrated}}catch(V){return{ok:!1,created:!1,migrated:!1,error:V instanceof Error?V.message:String(V)}}}import{existsSync as h8,readFileSync as m8}from"fs";import{resolve as x5}from"path";import{rmSync as g8}from"fs";import{drizzle as x6}from"drizzle-orm/libsql";import{createClient as f6}from"@libsql/client";var rZ={};gZ(rZ,{workspaceFlag:()=>q6,tag:()=>jZ,syncState:()=>a,projectMeta:()=>B6,planContract:()=>O6,note:()=>C6,nodeTags:()=>YZ,nodeFile:()=>BZ,node:()=>k,endpointTable:()=>i,endpoint:()=>E,edge:()=>KZ,draftTable:()=>c,draftRelation:()=>XZ,draftColumn:()=>OZ,dbTable:()=>P,dbRelation:()=>l,dbColumn:()=>e,codeFileEdge:()=>x,codeFile:()=>y,bugFlag:()=>qZ,boardAnnotation:()=>N6,appSetting:()=>L6});import{sqliteTable as v,index as S,foreignKey as H6,text as N,integer as _,real as m,uniqueIndex as o,primaryKey as W6}from"drizzle-orm/sqlite-core";import{createId as u}from"@paralleldrive/cuid2";var k=v("Node",{id:N().primaryKey().$defaultFn(()=>u()),view:N().notNull(),kind:N().default("FEATURE").notNull(),cluster:N(),layer:N(),title:N().notNull(),role:N(),plain:N(),status:N().default("PENDING").notNull(),priority:_().default(2).notNull(),progress:_().default(0).notNull(),x:m().default(0).notNull(),y:m().default(0).notNull(),sourceRef:N(),externalId:N(),source:N().default("MANUAL").notNull(),planId:N(),parentId:N(),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[S("Node_cluster_idx").on(Z.cluster),S("Node_parentId_idx").on(Z.parentId),S("Node_view_idx").on(Z.view),H6(()=>({columns:[Z.parentId],foreignColumns:[Z.id],name:"Node_parentId_Node_id_fk"})).onUpdate("cascade").onDelete("cascade")]),BZ=v("NodeFile",{id:N().primaryKey().$defaultFn(()=>u()),nodeId:N().notNull().references(()=>k.id,{onDelete:"cascade",onUpdate:"cascade"}),path:N().notNull()},(Z)=>[o("NodeFile_nodeId_path_key").on(Z.nodeId,Z.path),S("NodeFile_nodeId_idx").on(Z.nodeId)]),jZ=v("Tag",{id:N().primaryKey().$defaultFn(()=>u()),label:N().notNull(),color:N()},(Z)=>[o("Tag_label_key").on(Z.label)]),KZ=v("Edge",{id:N().primaryKey().$defaultFn(()=>u()),fromId:N().notNull().references(()=>k.id,{onDelete:"cascade",onUpdate:"cascade"}),toId:N().notNull().references(()=>k.id,{onDelete:"cascade",onUpdate:"cascade"}),kind:N().default("DEPENDS").notNull(),label:N(),sourceHandle:N(),targetHandle:N()},(Z)=>[o("Edge_fromId_toId_kind_key").on(Z.fromId,Z.toId,Z.kind),S("Edge_toId_idx").on(Z.toId),S("Edge_fromId_idx").on(Z.fromId)]),YZ=v("_NodeTags",{a:N("A").notNull().references(()=>k.id,{onDelete:"cascade",onUpdate:"cascade"}),b:N("B").notNull().references(()=>jZ.id,{onDelete:"cascade",onUpdate:"cascade"})},(Z)=>[o("_NodeTags_AB_unique").on(Z.a,Z.b),S("_NodeTags_B_index").on(Z.b)]),C6=v("Note",{id:N().primaryKey().$defaultFn(()=>u()),title:N().default("Untitled").notNull(),body:N().default("").notNull(),ord:m().default(0).notNull(),pinned:_({mode:"boolean"}).default(!1).notNull(),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[S("Note_updatedAt_idx").on(Z.updatedAt)]),N6=v("BoardAnnotation",{id:N().primaryKey().$defaultFn(()=>u()),targetKind:N().notNull(),targetId:N().notNull(),columnName:N(),body:N().default("").notNull(),x:m(),y:m(),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[S("BoardAnnotation_target_idx").on(Z.targetId)]),qZ=v("BugFlag",{id:N().primaryKey().$defaultFn(()=>u()),nodeId:N().notNull().references(()=>k.id,{onDelete:"cascade",onUpdate:"cascade"}),by:N().notNull(),note:N().notNull(),resolvedAt:_({mode:"timestamp_ms"}),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date)},(Z)=>[S("BugFlag_nodeId_idx").on(Z.nodeId)]),P=v("DbTable",{id:N().primaryKey().$defaultFn(()=>u()),name:N().notNull(),domain:N(),description:N(),source:N().default("MANUAL").notNull(),planId:N(),x:m().default(0).notNull(),y:m().default(0).notNull(),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[S("DbTable_domain_idx").on(Z.domain),o("DbTable_name_key").on(Z.name)]),e=v("DbColumn",{id:N().primaryKey().$defaultFn(()=>u()),tableId:N().notNull().references(()=>P.id,{onDelete:"cascade",onUpdate:"cascade"}),name:N().notNull(),type:N().notNull(),isPk:_({mode:"boolean"}).default(!1).notNull(),isFk:_({mode:"boolean"}).default(!1).notNull(),nullable:_({mode:"boolean"}).default(!0).notNull(),note:N(),ord:_().default(0).notNull()},(Z)=>[o("DbColumn_tableId_name_key").on(Z.tableId,Z.name),S("DbColumn_tableId_idx").on(Z.tableId)]),l=v("DbRelation",{id:N().primaryKey().$defaultFn(()=>u()),fromTableId:N().notNull().references(()=>P.id,{onDelete:"cascade",onUpdate:"cascade"}),toTableId:N().notNull().references(()=>P.id,{onDelete:"cascade",onUpdate:"cascade"}),fromColumn:N().notNull(),toColumn:N().notNull(),label:N()},(Z)=>[S("DbRelation_toTableId_idx").on(Z.toTableId),S("DbRelation_fromTableId_idx").on(Z.fromTableId)]),E=v("Endpoint",{id:N().primaryKey().$defaultFn(()=>u()),method:N().notNull(),path:N().notNull(),domain:N(),description:N(),source:N().default("MANUAL").notNull(),planId:N(),x:m().default(0).notNull(),y:m().default(0).notNull(),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[o("Endpoint_method_path_key").on(Z.method,Z.path),S("Endpoint_domain_idx").on(Z.domain)]),i=v("EndpointTable",{id:N().primaryKey().$defaultFn(()=>u()),endpointId:N().notNull().references(()=>E.id,{onDelete:"cascade",onUpdate:"cascade"}),tableId:N().notNull().references(()=>P.id,{onDelete:"cascade",onUpdate:"cascade"}),access:N().default("read").notNull()},(Z)=>[o("EndpointTable_endpointId_tableId_key").on(Z.endpointId,Z.tableId),S("EndpointTable_tableId_idx").on(Z.tableId)]),c=v("DraftTable",{id:N().primaryKey().$defaultFn(()=>u()),name:N().notNull(),domain:N(),description:N(),x:m().default(0).notNull(),y:m().default(0).notNull(),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date)},(Z)=>[o("DraftTable_name_key").on(Z.name)]),OZ=v("DraftColumn",{id:N().primaryKey().$defaultFn(()=>u()),tableId:N().notNull().references(()=>c.id,{onDelete:"cascade",onUpdate:"cascade"}),name:N().notNull(),type:N().notNull(),isPk:_({mode:"boolean"}).default(!1).notNull(),isFk:_({mode:"boolean"}).default(!1).notNull(),nullable:_({mode:"boolean"}).default(!0).notNull(),note:N(),ord:_().default(0).notNull()},(Z)=>[S("DraftColumn_tableId_idx").on(Z.tableId)]),XZ=v("DraftRelation",{id:N().primaryKey().$defaultFn(()=>u()),fromTableId:N().notNull().references(()=>c.id,{onDelete:"cascade",onUpdate:"cascade"}),toTableId:N().notNull().references(()=>c.id,{onDelete:"cascade",onUpdate:"cascade"}),fromColumn:N().notNull(),toColumn:N().notNull(),label:N()},(Z)=>[S("DraftRelation_toTableId_idx").on(Z.toTableId),S("DraftRelation_fromTableId_idx").on(Z.fromTableId)]),y=v("CodeFile",{path:N().primaryKey(),root:N(),lang:N(),x:m().default(0).notNull(),y:m().default(0).notNull(),mtimeMs:m(),size:_(),inDegree:_().default(0).notNull(),outDegree:_().default(0).notNull(),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)}),x=v("CodeFileEdge",{fromPath:N().notNull().references(()=>y.path,{onDelete:"cascade",onUpdate:"cascade"}),toPath:N().notNull().references(()=>y.path,{onDelete:"cascade",onUpdate:"cascade"}),circular:_({mode:"boolean"}).default(!1).notNull()},(Z)=>[S("CodeFileEdge_circular_idx").on(Z.circular),S("CodeFileEdge_toPath_idx").on(Z.toPath),S("CodeFileEdge_fromPath_idx").on(Z.fromPath),W6({columns:[Z.fromPath,Z.toPath],name:"CodeFileEdge_fromPath_toPath_pk"})]),a=v("SyncState",{id:N().primaryKey().default("singleton"),version:_().default(0).notNull(),codeGraphSyncedAt:_({mode:"timestamp_ms"}),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)}),L6=v("AppSetting",{id:N().primaryKey().default("singleton"),editor:N().default("auto").notNull(),currentFeatureId:N(),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)}),B6=v("ProjectMeta",{id:N().primaryKey().default("singleton"),overview:N(),conventions:N().default("[]").notNull(),hasFrontend:_({mode:"boolean"}),classificationRoots:N().default("[]").notNull(),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)}),q6=v("WorkspaceFlag",{id:N().primaryKey().$defaultFn(()=>u()),key:N().notNull(),enabled:_({mode:"boolean"}).default(!1).notNull(),config:N(),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[o("WorkspaceFlag_key_key").on(Z.key)]),O6=v("PlanContract",{id:N().primaryKey().$defaultFn(()=>u()),planId:N().notNull(),declaredFiles:N().default("[]").notNull(),authorizedExtras:N().default("[]").notNull(),active:_({mode:"boolean"}).default(!1).notNull(),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[o("PlanContract_planId_key").on(Z.planId),S("PlanContract_active_idx").on(Z.active)]);var oZ={};gZ(oZ,{tagRelations:()=>_6,nodeTagsRelations:()=>A6,nodeRelations:()=>D6,nodeFileRelations:()=>z6,endpointTableRelations:()=>v6,endpointRelations:()=>S6,edgeRelations:()=>P6,draftTableRelations:()=>k6,draftRelationRelations:()=>T6,draftColumnRelations:()=>w6,dbTableRelations:()=>I6,dbRelationRelations:()=>E6,dbColumnRelations:()=>R6,codeFileRelations:()=>y6,codeFileEdgeRelations:()=>u6,bugFlagRelations:()=>F6});import{relations as h}from"drizzle-orm";var D6=h(k,({one:Z,many:$})=>({files:$(BZ),bugFlags:$(qZ),nodeTags:$(YZ),edgesOut:$(KZ,{relationName:"EdgeFrom"}),edgesIn:$(KZ,{relationName:"EdgeTo"}),parent:Z(k,{fields:[k.parentId],references:[k.id],relationName:"NodeTree"}),children:$(k,{relationName:"NodeTree"})})),z6=h(BZ,({one:Z})=>({node:Z(k,{fields:[BZ.nodeId],references:[k.id]})})),F6=h(qZ,({one:Z})=>({node:Z(k,{fields:[qZ.nodeId],references:[k.id]})})),_6=h(jZ,({many:Z})=>({nodeTags:Z(YZ)})),A6=h(YZ,({one:Z})=>({node:Z(k,{fields:[YZ.a],references:[k.id]}),tag:Z(jZ,{fields:[YZ.b],references:[jZ.id]})})),P6=h(KZ,({one:Z})=>({from:Z(k,{fields:[KZ.fromId],references:[k.id],relationName:"EdgeFrom"}),to:Z(k,{fields:[KZ.toId],references:[k.id],relationName:"EdgeTo"})})),I6=h(P,({many:Z})=>({columns:Z(e),fksOut:Z(l,{relationName:"FkFrom"}),fksIn:Z(l,{relationName:"FkTo"}),usages:Z(i)})),R6=h(e,({one:Z})=>({table:Z(P,{fields:[e.tableId],references:[P.id]})})),E6=h(l,({one:Z})=>({fromTable:Z(P,{fields:[l.fromTableId],references:[P.id],relationName:"FkFrom"}),toTable:Z(P,{fields:[l.toTableId],references:[P.id],relationName:"FkTo"})})),S6=h(E,({many:Z})=>({tables:Z(i)})),v6=h(i,({one:Z})=>({endpoint:Z(E,{fields:[i.endpointId],references:[E.id]}),table:Z(P,{fields:[i.tableId],references:[P.id]})})),k6=h(c,({many:Z})=>({columns:Z(OZ),fksOut:Z(XZ,{relationName:"DraftFkFrom"}),fksIn:Z(XZ,{relationName:"DraftFkTo"})})),w6=h(OZ,({one:Z})=>({table:Z(c,{fields:[OZ.tableId],references:[c.id]})})),T6=h(XZ,({one:Z})=>({fromTable:Z(c,{fields:[XZ.fromTableId],references:[c.id],relationName:"DraftFkFrom"}),toTable:Z(c,{fields:[XZ.toTableId],references:[c.id],relationName:"DraftFkTo"})})),y6=h(y,({many:Z})=>({edgesOut:Z(x,{relationName:"CFEFrom"}),edgesIn:Z(x,{relationName:"CFETo"})})),u6=h(x,({one:Z})=>({fromFile:Z(y,{fields:[x.fromPath],references:[y.path],relationName:"CFEFrom"}),toFile:Z(y,{fields:[x.toPath],references:[y.path],relationName:"CFETo"})}));var g6={...rZ,...oZ};function h6(){let Z=process.env.DATABASE_URL;if(Z&&/^(file:|libsql:|wss?:|https?:|:memory:)/i.test(Z))return Z;return"file:./dev.db"}var m6=h6();function b6(Z){let $=f6({url:Z});return $.execute("PRAGMA foreign_keys = ON;"),$.execute("PRAGMA busy_timeout = 5000;"),x6($,{schema:g6})}var p6=globalThis,PZ=p6.dzByUrl??=new Map;function I4(){return IZ(m6)}function IZ(Z){let $=PZ.get(Z);if(!$)$=b6(Z),PZ.set(Z,$);return $}function R4(Z){let $=PZ.get(Z);PZ.delete(Z);try{$?.$client?.close?.()}catch{}}function c6(){if(process.env.BEACON_REPO)return I4();let Z=AZ()??r();if(!Z)return I4();return IZ(VZ(Z))}var b=new Proxy({},{get(Z,$){let Q=c6(),J=Q[$];return typeof J==="function"?J.bind(Q):J}});import{existsSync as u8}from"fs";import{existsSync as k5,readFileSync as S8,watch as v8}from"fs";import{readFile as v5}from"fs/promises";import{join as DZ,relative as k8,resolve as w8}from"path";import{existsSync as d4,readFileSync as n4}from"fs";import{readdir as D7,readFile as z7,stat as r4}from"fs/promises";import{extname as o4,join as vZ,relative as WZ,resolve as HZ}from"path";import{extname as m4}from"path";import{dirname as l6,resolve as d6}from"path";var iZ=[".ts",".tsx",".js",".jsx",".mjs",".cjs"],n6=[/(?:^|[\n;])\s*(?:import|export)[^'"`\n]{0,4000}?from\s*['"]([^'"`]+)['"]/g,/(?:^|[\n;])\s*import\s*['"]([^'"`]+)['"]/g,/\brequire\(\s*['"]([^'"`]+)['"]\s*\)/g,/\bimport\(\s*['"]([^'"`]+)['"]\s*\)/g];function r6(Z){return Z.split(/[\\/]/).join("/")}function E4(Z,$){if($.has(Z))return Z;for(let Q of iZ){let J=`${Z}${Q}`;if($.has(J))return J}for(let Q of iZ){let J=`${Z}/index${Q}`;if($.has(J))return J}return null}function o6(Z){let $=new Set;for(let Q of n6)for(let J of Z.matchAll(Q))$.add(J[1]);return $}function i6(Z,$,Q,J){if(Z.startsWith(".")){let V=d6("/",l6($),Z),Y=r6(V).replace(/^\//,"");return E4(Y,Q)}for(let V of J)if(Z.startsWith(V.from)){let Y=Z.slice(V.from.length),X=V.to?`${V.to}/${Y}`:Y,K=E4(X,Q);if(K)return K}return null}var S4={id:"ts",extensions:iZ,specifiers:o6,resolve(Z,$,Q){let J=i6(Z,$,Q.fileSet,Q.tsAliases??[]);return J?[J]:[]}};import{dirname as RZ,join as s6,normalize as a6}from"path";var t6=[".py",".pyi"],v4=[/(?:^|[\n;])\s*from\s+(\.*[\w.]*)\s+import\b/g,/(?:^|[\n;])\s*import\s+([\w.]+(?:\s*,\s*[\w.]+)*)/g];function k4(Z,$){for(let Q of[`${Z}.py`,`${Z}/__init__.py`,`${Z}.pyi`])if($.has(Q))return[Q];return[]}function e6(Z){let $=new Set;for(let Q of Z.matchAll(v4[0])){let J=Q[1].trim();if(J)$.add(J)}for(let Q of Z.matchAll(v4[1]))for(let J of Q[1].split(/\s*,\s*/)){let V=J.trim().split(/\s+as\s+/)[0].trim();if(V)$.add(V)}return $}var w4={id:"python",extensions:t6,specifiers:e6,resolve(Z,$,Q){if(Z.startsWith(".")){let X=Z.length-Z.replace(/^\.+/,"").length,K=Z.slice(X),j=RZ($);for(let U=1;U<X;U++)j=RZ(j);let W=K?s6(j,K.replace(/\./g,"/")):j;return k4(a6(W).replace(/\\/g,"/"),Q.fileSet)}let J=Z.replace(/\./g,"/"),V=[],Y=RZ($);while(Y&&Y!=="."&&Y!=="/")V.push(Y),Y=RZ(Y);V.push("");for(let X of V){let K=k4(X?`${X}/${J}`:J,Q.fileSet);if(K.length)return K}return[]}};import{dirname as Z7}from"path";var $7=[".go"],Q7=/(?:^|[\n;])\s*import\s+(?:[\w.]+\s+)?"([^"]+)"/g,J7=/(?:^|[\n;])\s*import\s*\(([\s\S]*?)\)/g,V7=/"([^"]+)"/g;function K7(Z){let $=new Set;for(let Q of Z.matchAll(Q7))$.add(Q[1]);for(let Q of Z.matchAll(J7))for(let J of Q[1].matchAll(V7))$.add(J[1]);return $}var T4={id:"go",extensions:$7,resolve(Z,$,Q){let J=Q.goModulePath;if(!J)return[];let V=null;if(Z===J)V="";else if(Z.startsWith(`${J}/`))V=Z.slice(J.length+1);if(V===null)return[];let Y=[];for(let X of Q.fileSet){if(!X.endsWith(".go"))continue;let K=Z7(X);if(V===""&&K==="."||K===V)Y.push(X)}return Y.sort()},specifiers:K7};import{basename as y4,dirname as sZ,join as u4,normalize as x4}from"path";var Y7=[".rs"],X7=/(?:^|[\n;])\s*(?:pub\s+)?mod\s+(\w+)\s*;/g,G7=/(?:^|[\n;])\s*(?:pub\s+)?use\s+([\w:]+)/g;function M7(Z){let $=Z.split("::").filter((Q)=>Q&&Q!=="*");if(!$.length)return"";if($[0]==="crate")return["crate",...$.slice(1)].join("/");if($[0]==="super")return["..",...$.slice(1)].join("/");if($[0]==="self")return[".",...$.slice(1)].join("/");return $.join("/")}function aZ(Z,$){for(let Q of[`${Z}.rs`,`${Z}/mod.rs`])if($.has(Q))return[Q];return[]}var U7=new Set(["mod.rs","lib.rs","main.rs"]);function j7(Z){let $=new Set;for(let Q of Z.matchAll(X7))$.add(`./${Q[1]}`);for(let Q of Z.matchAll(G7)){let J=M7(Q[1]);if(J)$.add(J)}return $}var f4={id:"rust",extensions:Y7,specifiers:j7,resolve(Z,$,Q){let J=Q.fileSet;if(Z.startsWith("./")||Z.startsWith("../")){let V=Z.replace(/^\.\//,""),Y=x4(u4(sZ($),Z)).replace(/\\/g,"/"),X=aZ(Y,J);if(X.length)return X;if(Z.startsWith("./")&&!U7.has(y4($))){let K=u4(sZ($),y4($,".rs"),V);if(X=aZ(x4(K).replace(/\\/g,"/"),J),X.length)return X}return[]}if(Z.startsWith("crate/")){let V=$.split("/"),Y=V.lastIndexOf("src"),X=Y>=0?V.slice(0,Y+1).join("/"):sZ($),K=Z.slice(6).split("/");for(let j of[K.join("/"),K.slice(0,-1).join("/")]){if(!j)continue;let W=aZ(`${X}/${j}`,J);if(W.length)return W}return[]}return[]}};import{dirname as H7,extname as W7,join as C7,normalize as N7}from"path";var g4=[".swift",".java",".rb",".kt",".kts",".cs",".php",".scala",".c",".h",".cpp",".hpp",".cc",".hh",".m",".mm",".ex",".exs",".lua",".dart",".vue",".svelte"],L7=[/\b(?:require_relative|require|include|import|use|using|from)\s*\(?\s*['"]([^'"`\n]+)['"]/g,/(?:^|[\n;])\s*import\s+([\w.]+)/g,/(?:^|[\n;])\s*from\s+([\w.]+)\s+import\b/g,/(?:^|[\n;])\s*using\s+([\w.]+)\s*;/g,/(?:^|[\n;])\s*use\s+([\w\\]+)/g,/#\s*include\s*[<"]([^>"\n]+)[>"]/g];function B7(Z){let $=new Set;for(let Q of L7)for(let J of Z.matchAll(Q)){let V=J[1].trim();if(V)$.add(V)}return $}var h4={id:"fallback",extensions:g4,specifiers:B7,resolve(Z,$,Q){let V=[W7($).toLowerCase(),...g4].filter((j,W,U)=>j&&U.indexOf(j)===W),Y=Z.includes("/")||Z.includes("\\"),X=Z.startsWith(".")||Y?Z.replace(/\\/g,"/"):Z.replace(/[.:]+/g,"/"),K=[N7(C7(H7($),X)).replace(/\\/g,"/"),X.replace(/^\.\//,"")];for(let j of K){if(Q.fileSet.has(j))return[j];for(let W of V){let U=j.endsWith(W)?j:`${j}${W}`;if(Q.fileSet.has(U))return[U];if(Q.fileSet.has(`${j}/index${W}`))return[`${j}/index${W}`]}}return[]}};var q7=[S4,w4,T4,f4,h4],EZ=new Map;for(let Z of q7)for(let $ of Z.extensions)EZ.set($,Z);var O7={".ts":"ts",".tsx":"ts",".js":"js",".jsx":"js",".mjs":"js",".cjs":"js",".py":"py",".pyi":"py",".go":"go",".rs":"rs",".swift":"swift",".java":"java",".rb":"ruby",".kt":"kotlin",".kts":"kotlin",".cs":"csharp",".php":"php",".scala":"scala",".c":"c",".h":"c",".cpp":"cpp",".hpp":"cpp",".cc":"cpp",".hh":"cpp",".m":"objc",".mm":"objc",".ex":"elixir",".exs":"elixir",".lua":"lua",".dart":"dart",".vue":"vue",".svelte":"svelte"};function tZ(Z){return EZ.get(m4(Z).toLowerCase())??null}function b4(Z){let $=m4(Z).toLowerCase();if(!EZ.has($))return null;return O7[$]??$.slice(1)}function eZ(){return new Set(EZ.keys())}var i4=new Set(["node_modules",".git",".next","dist","build","__pycache__","target",".venv","venv","env",".turbo","coverage",".beacon",".playwright-mcp","generated","migrations","alembic","migrate"]);function F7(Z=5){let $=performance.now();return async()=>{if(performance.now()-$>Z)await new Promise((Q)=>setImmediate(Q)),$=performance.now()}}var _7=()=>Promise.resolve();async function s4(Z,$,Q,J,V){let Y;try{Y=await D7($,{withFileTypes:!0})}catch{return}for(let X of Y){if(X.name.startsWith("."))continue;if(i4.has(X.name))continue;let K=vZ($,X.name);if(X.isDirectory()){await s4(Z,K,Q,J,V);continue}if(!X.isFile())continue;if(X.name.endsWith(".d.ts"))continue;if(!Q.has(o4(X.name).toLowerCase()))continue;J.push(WZ(Z,K))}await V()}async function A7(Z,$=_7){let Q=[];return await s4(Z,Z,eZ(),Q,$),Q.map((J)=>J.split(/[\\/]/).join("/")).sort()}function P7(Z){try{return JSON.parse(Z)}catch{}let $=Z.replace(/\/\*[^"]*?\*\//g,"").replace(/(^|[^:"])\/\/.*$/gm,"$1").replace(/,\s*([}\]])/g,"$1");return JSON.parse($)}function p4(Z){return Z.replace(/^\.\/?/,"").replace(/\/$/,"")}function a4(Z){let $=vZ(Z,"tsconfig.json");if(!d4($))return[];let Q;try{Q=P7(n4($,"utf8"))}catch{return[]}let J=Q.compilerOptions?.paths??{},V=p4(Q.compilerOptions?.baseUrl??"."),Y=[];for(let[X,K]of Object.entries(J)){if(!X.endsWith("/*")||!K.length)continue;let j=K[0];if(!j.endsWith("/*"))continue;let W=X.slice(0,-1),U=p4(j.slice(0,-1)),C=[V,U].filter(Boolean).join("/");Y.push({from:W,to:C})}return Y}function SZ(Z){let $=vZ(Z,"go.mod");if(!d4($))return null;try{let Q=/^\s*module\s+(\S+)/m.exec(n4($,"utf8"));return Q?Q[1]:null}catch{return null}}function p(Z){return Z.split(/[\\/]/).join("/")}function t4(Z){if(Z.length===1)return Z[0];let $=Z.map((V)=>p(V).split("/")),Q=$[0],J=0;for(;J<Q.length;J++)if(!$.every((V)=>V[J]===Q[J]))break;return Q.slice(0,J).join("/")||"/"}async function I7(Z,$,Q){let J=(Array.isArray(Z)?Z:[Z]).map((W)=>p(HZ(W))),V=p($?HZ($):J.length===1?J[0]:t4(J)),Y=new Map,X=[];for(let W of J){let U=p(WZ(V,W));for(let C of a4(W))X.push({from:C.from,to:[U,C.to].filter(Boolean).join("/")});for(let C of await A7(W,Q)){let L=p(vZ(W,C)),q=p(WZ(V,L));if(Y.has(q))continue;try{let H=await r4(L);Y.set(q,{path:q,abs:L,root:U||null,mtimeMs:H.mtimeMs,size:H.size})}catch{}await Q()}}let K=J.map(SZ).find(Boolean)??SZ(V);return{metas:[...Y.values()].sort((W,U)=>W.path.localeCompare(U.path)),ctx:{fileSet:new Set(Y.keys()),tsAliases:X,goModulePath:K}}}var c4=50000;function R7(Z){let $=0;for(let Q=0;Q<Z.length;Q++)if(Z.charCodeAt(Q)===10){if(Q-$>c4)return!0;$=Q+1}return Z.length-$>c4}async function l4(Z){let $=tZ(Z.path);if(!$||Z.size>200000)return new Set;try{let Q=await z7(Z.abs,"utf8");if(R7(Q))return new Set;return $.specifiers(Q)}catch{return new Set}}function e4(Z,$){let Q=(Array.isArray(Z)?Z:[Z]).map((H)=>p(HZ(H))),J=p($?HZ($):Q.length===1?Q[0]:t4(Q)),V=new Map,Y=new Map,X=[],K=null;function j(){X=[];for(let H of Q){let G=p(WZ(J,H));for(let B of a4(H))X.push({from:B.from,to:[G,B.to].filter(Boolean).join("/")})}K=Q.map(SZ).find(Boolean)??SZ(J)}function W(H){let G=H.split("/");for(let D=0;D<G.length;D++){let O=G[D];if(!O||O.startsWith("."))return!0;if(D<G.length-1&&i4.has(O))return!0}let B=G[G.length-1];if(B.endsWith(".d.ts"))return!0;return!eZ().has(o4(B).toLowerCase())}function U(H){let G=p(HZ(H));for(let B of Q)if(G===B||G.startsWith(`${B}/`)){let D=G.slice(B.length).replace(/^\/+/,"");if(W(D))return null;return{path:p(WZ(J,G)),root:p(WZ(J,B))||null}}return null}function C(){let H={fileSet:new Set(V.keys()),tsAliases:X,goModulePath:K},G=[...V.values()].sort((O,M)=>O.path.localeCompare(M.path)),B=[];for(let O of G){let M=tZ(O.path);if(!M)continue;let F=Y.get(O.path)??new Set,z=new Set;for(let R of F)for(let w of M.resolve(R,O.path,H)){if(!w||w===O.path||z.has(w))continue;z.add(w),B.push({from:O.path,to:w})}}return{files:G.map((O)=>({path:O.path,lang:b4(O.path),root:O.root,mtimeMs:O.mtimeMs,size:O.size})),edges:B}}async function L(){let H=F7(),{metas:G,ctx:B}=await I7(Z,$,H);V.clear(),Y.clear();for(let D of G)await H(),V.set(D.path,D),Y.set(D.path,await l4(D));return X=B.tsAliases??[],K=B.goModulePath??null,C()}async function q(H){let G=p(HZ(H));if(!Q.some((z)=>G===z||G.startsWith(`${z}/`)))return!1;let B=G.split("/").pop()??"";if(B==="tsconfig.json"||B==="go.mod"){let z=G.slice(0,G.length-B.length-1);if(Q.includes(z))return j(),!0;return!1}let D=U(H);if(!D)return!1;let O;try{O=await r4(G)}catch{let z=V.delete(D.path);return Y.delete(D.path),z}let M=V.get(D.path);if(M&&M.mtimeMs===O.mtimeMs&&M.size===O.size)return!1;let F={path:D.path,abs:G,root:D.root,mtimeMs:O.mtimeMs,size:O.size};return V.set(D.path,F),Y.set(D.path,await l4(F)),!0}return{seed:L,applyChange:q,snapshot:C}}function Z5(Z){let $=Object.keys(Z.tableVars),Q=new Map;if(!$.length){for(let X of Z.routeFiles)Q.set(X,[]);return Q}let J=new Map;for(let X of Z.edges){let K=J.get(X.from)??[];K.push(X.to),J.set(X.from,K)}let V=new Map($.map((X)=>[X,new RegExp(`(?:query\\.${X}\\b|\\.from\\(\\s*${X}\\b)`)])),Y=new Map($.map((X)=>[X,new RegExp(`(?:insert|update|delete)\\(\\s*${X}\\b`)]));for(let X of Z.routeFiles){let K=new Set([X]),j=[X];for(let L=0;L<2&&K.size<25;L++){let q=[];for(let H of j)for(let G of J.get(H)??[]){if(K.has(G)||K.size>=25)continue;K.add(G),q.push(G)}j=q}let W=new Set,U=new Set;for(let L of K){let q=Z.content(L);if(!q)continue;for(let H of $){if(!W.has(H)&&V.get(H).test(q))W.add(H);if(!U.has(H)&&Y.get(H).test(q))U.add(H)}}let C=[];for(let L of $){let q=W.has(L),H=U.has(L);if(!q&&!H)continue;C.push({table:Z.tableVars[L],access:q&&H?"read-write":H?"write":"read"})}Q.set(X,C)}return Q}function Q5(Z,$){if(/_JSON_OR_JSONB|\bJSONB\b|\bJSON\b/.test(Z))return"jsonb";let Q=Z.match(/\b(GUID|Uuid|UUID|String|Text|DateTime|Date|Time|BigInteger|SmallInteger|Integer|Boolean|Float|Numeric|Decimal|Vector|TSVECTOR|LargeBinary|Enum)\b\s*(\([^)]*\))?/);if(Q){let Y=Q[2]??"",X=Y.match(/\d+/)?.[0];switch(Q[1]){case"GUID":case"Uuid":case"UUID":return"uuid";case"String":return X?`varchar(${X})`:"varchar";case"Text":return"text";case"DateTime":return/timezone\s*=\s*True/.test(Y)?"timestamptz":"timestamp";case"Date":return"date";case"Time":return"time";case"BigInteger":return"bigint";case"SmallInteger":return"smallint";case"Integer":return"integer";case"Boolean":return"boolean";case"Float":return"float";case"Numeric":case"Decimal":return"numeric";case"Vector":return X?`vector(${X})`:"vector";case"TSVECTOR":return"tsvector";case"LargeBinary":return"bytea";case"Enum":return"varchar"}}let J=$.replace(/\s*\|\s*None/g,"").trim(),V=J.match(/^Optional\[([\s\S]*)\]$/);if(V)J=V[1].trim();if(/uuid/i.test(J))return"uuid";if(/datetime/i.test(J))return"timestamptz";if(/\bint\b/i.test(J))return"integer";if(/\bbool\b/i.test(J))return"boolean";if(/\bfloat\b/.test(J)&&!/\blist\b/.test(J))return"float";if(/\bdict\b|\blist\b|\bAny\b/.test(J))return"jsonb";return"text"}function kZ(Z,$){let Q=0;for(let J=$;J<Z.length;J++)if(Z[J]==="(")Q++;else if(Z[J]===")"){if(Q--,Q===0)return Z.slice($+1,J)}return""}function E7(Z,$){let Q=0;for(let J=$;J<Z.length;J++)if(Z[J]==="[")Q++;else if(Z[J]==="]"){if(Q--,Q===0)return Z.slice($+1,J)}return null}function S7(Z,$,Q){let J=Q.match(/__tablename__\s*=\s*["']([^"']+)["']/)?.[1],V=[],Y=[],X=[],K=/(\w+)\s*:\s*Mapped\s*\[/g,j;while(j=K.exec(Q)){let C=j.index+j[0].length-1,L=E7(Q,C);if(L===null)continue;let q=C+L.length+2,H=Q.slice(q).match(/^\s*=\s*(\w+)\s*\(/);if(!H||H[1]!=="mapped_column")continue;X.push({colName:j[1],pyType:L,argsAt:q+H[0].length-1})}let W=/(\w+)\s*=\s*(mapped_column|Column)\s*\(/g;while(j=W.exec(Q))X.push({colName:j[1],pyType:"",argsAt:j.index+j[0].length-1});X.sort((C,L)=>C.argsAt-L.argsAt);let U=new Set;for(let C of X){if(U.has(C.colName)||C.colName==="__tablename__")continue;U.add(C.colName);let L=kZ(Q,C.argsAt),q=/primary_key\s*=\s*True/.test(L)||void 0,H=/nullable\s*=\s*False/.test(L)?!1:!0,G=L.match(/ForeignKey\(\s*["']([^"']+?)\.([^"'.]+)["']/);if(V.push({name:C.colName,type:Q5(L,C.pyType),isPk:q,isFk:G?!0:void 0,nullable:H}),G)Y.push({column:C.colName,toTable:G[1],toColumn:G[2]})}return{name:Z,bases:$,tableName:J,columns:V,fks:Y}}function v7(Z){let $=[],Q=[],J=/\bTable\s*(\()\s*["']([^"']+)["']\s*,/g,V;while(V=J.exec(Z)){let Y=V[2],X=kZ(Z,V.index+V[0].indexOf("("));if(!/\bmetadata\b/.test(X)||!/\bColumn\s*\(/.test(X))continue;let K=[],j=/\bColumn\s*\(/g,W;while(W=j.exec(X)){let U=kZ(X,W.index+W[0].length-1),C=U.match(/^\s*["'](\w+)["']\s*,/)?.[1];if(!C)continue;let L=/primary_key\s*=\s*True/.test(U)||void 0,q=/nullable\s*=\s*False/.test(U)?!1:!0,H=U.match(/ForeignKey\(\s*["']([^"']+?)\.([^"'.]+)["']/);if(K.push({name:C,type:Q5(U,""),isPk:L,isFk:H?!0:void 0,nullable:q}),H)Q.push({fromTable:Y,fromColumn:C,toTable:H[1],toColumn:H[2]})}if(K.length)$.push({name:Y,columns:K})}return{tables:$,relations:Q}}function k7(Z){let $=new Map,Q={tables:[],relations:[]};for(let K of Z){if(!K.path.endsWith(".py"))continue;if(!/mapped_column\s*\(|__tablename__|\bTable\s*\(\s*["']/.test(K.content))continue;let j=v7(K.content);Q.tables.push(...j.tables),Q.relations.push(...j.relations);let W=/^class\s+(\w+)\s*\(([^)]*)\)\s*:/gm,U,C=[];while(U=W.exec(K.content))C.push({name:U[1],bases:U[2].split(",").map((L)=>L.trim().split(/[.[]/)[0]).filter(Boolean),at:U.index});for(let L=0;L<C.length;L++){let q=K.content.slice(C[L].at,C[L+1]?.at??K.content.length),H=S7(C[L].name,C[L].bases,q);$.set(H.name,H)}}if(![...$.values()].some((K)=>K.tableName)&&!Q.tables.length)return{tables:[],relations:[]};let J=(K,j=new Set)=>{if(j.has(K.name))return[];j.add(K.name);let W=[];for(let U of K.bases){let C=$.get(U);if(C&&!C.tableName)W.push(...J(C,j))}return W.push(...K.columns),W},V=[],Y=[];for(let K of $.values()){if(!K.tableName)continue;let j=J(K),W=new Map;for(let H of j)if(!W.has(H.name))W.set(H.name,H);let U=[...W.values()],C=(H)=>U.splice(U.findIndex((G)=>G.name===H),1)[0],L=U.some((H)=>H.name==="id")?C("id"):null,q=["created_at","updated_at","deleted_at"].filter((H)=>U.some((G)=>G.name===H)).map((H)=>C(H));V.push({name:K.tableName,columns:[...L?[L]:[],...U,...q]});for(let H of K.fks)Y.push({fromTable:K.tableName,fromColumn:H.column,toTable:H.toTable,toColumn:H.toColumn})}let X=new Set(V.map((K)=>K.name));for(let K of Q.tables)if(!X.has(K.name))V.push(K);return Y.push(...Q.relations.filter((K)=>!X.has(K.fromTable))),{tables:V,relations:Y}}function w7(Z){let $=Z.replace(/[?[\]]/g,"");return{String:"text",Int:"integer",BigInt:"bigint",Float:"float",Decimal:"numeric",Boolean:"boolean",DateTime:"timestamptz",Json:"jsonb",Bytes:"bytea"}[$]??$.toLowerCase()}function T7(Z){let $=[],Q=[];for(let J of Z){if(!J.path.endsWith(".prisma"))continue;let V=/model\s+(\w+)\s*\{([\s\S]*?)\}/g,Y;while(Y=V.exec(J.content)){let X=Y[1],K=Y[2].match(/@@map\(\s*["']([^"']+)["']\s*\)/)?.[1]??X,j=[];for(let W of Y[2].split(`
4
+ `)){let U=W.trim().match(/^(\w+)\s+(\w+(?:\[\])?\??)\s*(.*)$/);if(!U||/^@@/.test(W.trim()))continue;let[,C,L,q]=U,H=/^(String|Int|BigInt|Float|Decimal|Boolean|DateTime|Json|Bytes)(\[\])?\??$/.test(L),G=q.match(/@relation\([^)]*fields:\s*\[(\w+)\][^)]*references:\s*\[(\w+)\]/);if(G)Q.push({fromTable:K,fromColumn:G[1],toTable:L.replace(/[?[\]]/g,""),toColumn:G[2]});if(!H)continue;j.push({name:C,type:w7(L),isPk:/@id\b/.test(q)||void 0,isFk:/@relation\b/.test(q)||void 0,nullable:L.endsWith("?")})}if(j.length)$.push({name:K,columns:j})}}return{tables:$,relations:Q}}function y7(Z,$){if(/mode:\s*["']timestamp/.test($))return"timestamp";if(/mode:\s*["']boolean["']/.test($))return"boolean";if(/mode:\s*["']json["']/.test($))return"jsonb";return Z}function u7(Z,$){let Q=0;for(let J=$;J<Z.length;J++)if(Z[J]==="{")Q++;else if(Z[J]==="}"){if(Q--,Q===0)return Z.slice($+1,J)}return""}function x7(Z){let $=[],Q=/(\w+)\s*:\s*(text|integer|real|blob|numeric|varchar|boolean|timestamp|serial|uuid|json|jsonb)\s*\(/g;for(let Y of Z){if(!/\.(ts|tsx|mts|cts)$/.test(Y.path))continue;if(!/\b(?:sqliteTable|pgTable|mysqlTable)\s*\(/.test(Y.content))continue;let X=/(?:export\s+)?const\s+(\w+)\s*=\s*(?:sqliteTable|pgTable|mysqlTable)\s*\(\s*["']([^"']+)["']\s*,/g,K;while(K=X.exec(Y.content)){let j=Y.content.indexOf("{",K.index+K[0].length);if(j<0)continue;let W=u7(Y.content,j),U={varName:K[1],tableName:K[2],columns:[],colByProp:new Map,fks:[]},C=[];Q.lastIndex=0;for(let L of W.matchAll(Q))C.push({prop:L[1],builder:L[2],at:L.index,argOpen:L.index+L[0].length-1});C.forEach((L,q)=>{let H=W.slice(L.at,C[q+1]?.at??W.length),G=kZ(W,L.argOpen),D=G.match(/^\s*["']([^"']+)["']/)?.[1]??L.prop,O=H.match(/\.references\(\s*\(\)\s*=>\s*(\w+)\.(\w+)/);if(U.columns.push({name:D,type:y7(L.builder,G),isPk:/\.primaryKey\(\)/.test(H)||void 0,isFk:O?!0:void 0,nullable:/\.notNull\(\)/.test(H)?!1:!0}),U.colByProp.set(L.prop,D),O)U.fks.push({column:D,toVar:O[1],toProp:O[2]})}),$.push(U)}}if(!$.length)return{tables:[],relations:[]};let J=new Map($.map((Y)=>[Y.varName,Y])),V=[];for(let Y of $)for(let X of Y.fks){let K=J.get(X.toVar);if(!K)continue;V.push({fromTable:Y.tableName,fromColumn:X.column,toTable:K.tableName,toColumn:K.colByProp.get(X.toProp)??X.toProp})}return{tables:$.map((Y)=>({name:Y.tableName,columns:Y.columns})),relations:V,tableVars:Object.fromEntries($.map((Y)=>[Y.varName,Y.tableName]))}}var f7={long:"bigint",Long:"bigint",BigInteger:"bigint",int:"integer",Integer:"integer",short:"smallint",Short:"smallint",String:"varchar",char:"varchar",Character:"varchar",boolean:"boolean",Boolean:"boolean",UUID:"uuid",BigDecimal:"numeric",double:"double",Double:"double",float:"float",Float:"float",LocalDate:"date",LocalDateTime:"timestamp",Instant:"timestamp",Timestamp:"timestamp",Date:"timestamp",OffsetDateTime:"timestamptz",ZonedDateTime:"timestamptz",LocalTime:"time"},g7=/^(List|Set|Map|Collection|Iterable)$/;function J5(Z){if(/byte\s*\[\s*\]/.test(Z))return"byte[]";return(Z.replace(/<.*>/,"").trim().split(".").pop()??Z).trim()}function h7(Z){let $=J5(Z);if($==="byte[]")return"bytea";return f7[$]??$.toLowerCase()}function wZ(Z,$){return Z.match(new RegExp(`\\b${$}\\s*=\\s*"([^"]*)"`))?.[1]}function $5(Z,$){let Q=Z.match(new RegExp(`\\b${$}\\s*=\\s*(true|false)`));return Q?Q[1]==="true":void 0}function m7(Z){let $=[],Q=Z,J;while(J=Q.match(/^@[\w.]+(\([^)]*\))?\s*/))$.push(Q.slice(0,J[0].length).trim()),Q=Q.slice(J[0].length);return{annots:$,rest:Q.trim()}}function b7(Z){let $=[],Q=[];for(let J of Z.split(`
5
+ `)){let V=J.trim();if(!V||V.startsWith("//")||V.startsWith("*")||V.startsWith("/*"))continue;let{annots:Y,rest:X}=m7(V);if(Q.push(...Y),!X)continue;let K=X,j="";while(K!==j)j=K,K=K.replace(/^(?:public|private|protected|static|final|transient|volatile)\s+/,"");let W=!K.includes("(")?K.match(/^([\w.$]+(?:<[^>]*>)?(?:\s*\[\s*\])?)\s+(\w+)\s*[;=]/):null;if(W)$.push({annots:Q,type:W[1],name:W[2]});Q=[]}return $}function p7(Z){let $=[],Q=/\bclass\s+(\w+)/g,J;while(J=Q.exec(Z))$.push({name:J[1],at:J.index});let V=[];for(let Y=0;Y<$.length;Y++){let X=Z.slice(Y===0?0:$[Y-1].at,$[Y].at);if(!/@Entity\b/.test(X))continue;let K=X.match(/@Table\s*\([^)]*\)/)?.[0]??"",j=wZ(K,"name")??$[Y].name,W=Z.slice($[Y].at,$[Y+1]?.at??Z.length),U=b7(W),C=U.find((q)=>q.annots.some((H)=>/@Id\b/.test(H))),L=C?wZ(C.annots.find((q)=>/@Column\b/.test(q))??"","name")??C.name:"id";V.push({className:$[Y].name,tableName:j,idColumn:L,fields:U})}return V}function c7(Z){let $=Z.filter((K)=>K.path.endsWith(".java")&&/@Entity\b/.test(K.content));if(!$.length)return{tables:[],relations:[]};let Q=$.flatMap((K)=>p7(K.content));if(!Q.length)return{tables:[],relations:[]};let J=new Map(Q.map((K)=>[K.className,K.tableName])),V=new Map(Q.map((K)=>[K.className,K.idColumn])),Y=[],X=[];for(let K of Q){let j=[];for(let W of K.fields){let U=W.annots.join(" ");if(/@Transient\b/.test(U))continue;let C=J5(W.type);if(/@ManyToOne\b|@OneToOne\b|@OneToMany\b|@ManyToMany\b/.test(U)||J.has(C)){let O=W.annots.find((F)=>/@JoinColumn\b/.test(F)),M=O?wZ(O,"name"):void 0;if(M){j.push({name:M,type:"bigint",isFk:!0,nullable:$5(U,"nullable")??!0});let F=J.get(C);if(F)X.push({fromTable:K.tableName,fromColumn:M,toTable:F,toColumn:V.get(C)??"id"})}continue}if(g7.test(C))continue;let H=W.annots.find((O)=>/@Column\b/.test(O))??"",G=wZ(H,"name")??W.name,B=W.annots.some((O)=>/@Id\b/.test(O)),D=$5(H,"nullable");j.push({name:G,type:h7(W.type),...B?{isPk:!0}:{},...D!==void 0?{nullable:D}:{}})}Y.push({name:K.tableName,columns:j})}return{tables:Y,relations:X}}function V5(Z){let $=x7(Z);if($.tables.length)return $;let Q=T7(Z);if(Q.tables.length)return Q;let J=k7(Z);if(J.tables.length)return J;return c7(Z)}var l7=["GET","POST","PUT","PATCH","DELETE"];function d7(Z){let $=Z.match(/(?:^|\/)app\/(.+)\/route\.(?:ts|tsx|js|jsx|mjs)$/);if(!$)return null;let Q=$[1].split("/").filter((J)=>!(J.startsWith("(")&&J.endsWith(")"))).map((J)=>{let V=J.match(/^\[{1,2}(?:\.\.\.)?([^\]]+)\]{1,2}$/);return V?`{${V[1]}}`:J});if(Q[0]!=="api")return null;return`/${Q.join("/")}`}function K5(Z){let $=[];for(let Q of Z){let J=d7(Q.path);if(!J)continue;for(let V of l7)if(new RegExp(`export\\s+(?:async\\s+)?(?:function|const)\\s+${V}\\b`).test(Q.content))$.push({method:V,path:J,uses:[],file:Q.path})}return $.sort((Q,J)=>`${Q.path} ${Q.method}`.localeCompare(`${J.path} ${J.method}`))}var n7=/(^|\/)app\/.*\/route\.(ts|tsx|js|jsx|mjs)$/,r7=/\.(ts|py)$/,o7=/(schema|model)/i,i7=/(\.(test|spec)\.[jt]sx?$)|(^|\/)(tests?|__tests__|__mocks__)\/|(^|\/)test_[^/]+\.py$|_test\.py$/;function Z4(Z){if(i7.test(Z))return!1;if(Z.endsWith(".prisma"))return!0;if(n7.test(Z))return!0;if(Z.endsWith(".java"))return!0;return r7.test(Z)&&o7.test(Z)}function Y5(Z,$=300){return Z.filter(Z4).slice(0,$)}import{z as d}from"zod";import{and as P5,eq as CZ,inArray as P8,notInArray as I8}from"drizzle-orm";import{z as A}from"zod";import{and as D8,eq as xZ,inArray as J4,notInArray as z8,or as F8,sql as _8}from"drizzle-orm";var X5=300,G5=50;function M5(Z){for(let $=0;$<Z.length;$++)for(let Q=$+1;Q<Z.length;Q++){let J=Z[$],V=Z[Q];if(J.x<V.x+X5&&J.x+X5>V.x&&J.y<V.y+G5&&J.y+G5>V.y)return!0}return!1}import{eq as s7}from"drizzle-orm";var U5=(Z)=>Z.replace(/\{[^}]*\}/g,"{}");function a7(Z,$){if(Z.method.toUpperCase()!==$.method.toUpperCase())return!1;let Q=U5(Z.path),J=U5($.path);return J===Q||J.endsWith(Q)}async function j5(Z=b){let[$,Q]=await Promise.all([Z.query.endpoint.findMany({where:(V,{ne:Y})=>Y(V.source,"INTROSPECTION")}),Z.query.endpoint.findMany({where:(V,{eq:Y})=>Y(V.source,"INTROSPECTION")})]),J={collapsed:0,mappings:[]};for(let V of $){let Y=Q.find((X)=>a7(V,X));if(!Y)continue;await Z.delete(E).where(s7(E.id,V.id)),J.collapsed++,J.mappings.push({planned:`${V.method} ${V.path}`,code:`${Y.method} ${Y.path}`})}return J}import{and as H5,inArray as t7,isNull as W5,ne as C5,or as e7}from"drizzle-orm";var Z8=new Set(["DONE","CANCELLED","DEPRIORITIZED"]);async function $8(Z){let $=await Z.query.node.findMany({where:(J,{and:V,eq:Y,isNotNull:X})=>V(Y(J.view,"ROADMAP"),X(J.planId)),columns:{planId:!0,status:!0}}),Q=new Map;for(let J of $){let V=J.planId;Q.set(V,(Q.get(V)??!0)&&Z8.has(J.status))}return[...Q.entries()].filter(([,J])=>J).map(([J])=>J)}async function N5(Z=b){let $=await $8(Z),Q=(Y)=>$.length?e7(W5(Y.planId),t7(Y.planId,$)):W5(Y.planId),J=await Z.delete(P).where(H5(C5(P.source,"INTROSPECTION"),Q(P))).returning({id:P.id}),V=await Z.delete(E).where(H5(C5(E.source,"INTROSPECTION"),Q(E))).returning({id:E.id});return{tables:J.length,endpoints:V.length}}var Q8=(Z)=>Z&&Number.isFinite(Z)&&Z>0?Math.min(3.2,Math.max(0.7,Z)):1.8;function J8(Z,$){let Q=Q8($.viewportAspect)*($.aspectSlack??1),J=Z.reduce((V,Y)=>V+(Y.w+$.gapX)*(Y.h+$.gapY),0);return Math.max($.minBandW,Math.round(Math.sqrt(J*Q)))}function L5(Z,$){let Q=J8(Z,$),J=new Map,V=0,Y=0,X=0;for(let K of Z){if(V>0&&V+K.w>Q)Y+=X+$.gapY,V=0,X=0;J.set(K.id,{x:V,y:Y}),X=Math.max(X,K.h),V+=K.w+$.gapX}return J}var QZ=320,$4=30,V8=36,K8=30,Y8=16;function JZ(Z){return V8+Math.max(0,Z)*K8+Y8}var GZ=60,X8=300,TZ=10,G8=84,yZ=72,M8=3*QZ,U8=1.7;var uZ=(Z)=>(Z??"").trim()||"\u2014";function j8(Z,$,Q){let J=new Map;for(let Y of Z.uses){if(!$.has(Y.tableId))continue;J.set(Y.tableId,(J.get(Y.tableId)??0)+1)}let V=null;for(let[Y,X]of J){if(V===null){V=Y;continue}let K=J.get(V);if(X>K){V=Y;continue}if(X<K)continue;let j=Q?.get(Y)??0,W=Q?.get(V)??0;if(j<W)V=Y;else if(j===W&&$.get(Y).localeCompare($.get(V))<0)V=Y}return V}function Q4(Z,$){let Q=new Map(Z.map((V)=>[V.id,V.name])),J=new Map;for(let V of $)for(let Y of V.uses){if(!Q.has(Y.tableId))continue;J.set(Y.tableId,(J.get(Y.tableId)??0)+1)}return new Map($.map((V)=>[V.id,j8(V,Q,J)]))}var H8=(Z,$)=>Z.path.localeCompare($.path)||Z.method.localeCompare($.method)||Z.id.localeCompare($.id);function B5(Z,$,Q={}){let J=Q4(Z,$),V=new Map,Y=[];for(let G of[...$].sort(H8)){let B=J.get(G.id)??null;if(B){let D=V.get(B);if(D)D.push(G);else V.set(B,[G])}else Y.push(G)}let X=(G)=>{let B=V.get(G.id)?.length??0;return JZ(G.columnCount)+(B?TZ+B*GZ:0)+$4},K=Array.from(new Set(Z.map((G)=>uZ(G.domain)))),j=K.filter((G)=>G!=="\u2014").sort(),W=K.includes("\u2014")?[...j,"\u2014"]:j,U=[];for(let G of W){let B=Z.filter((z)=>uZ(z.domain)===G).sort((z,R)=>z.name.localeCompare(R.name)),D=B.reduce((z,R)=>z+X(R),0),O=Math.max(1,Math.min(12,B.length,Math.round(Math.sqrt(D/QZ)))),M=Array(O).fill(0),F=new Map;for(let z of B){let R=0;for(let w=1;w<O;w++)if(M[w]<M[R])R=w;F.set(z.id,{x:R*QZ,y:M[R]}),M[R]+=X(z)}U.push({d:G,w:O*QZ,h:Math.max(...M,0),tableLocal:F})}let C=L5(U.map((G)=>({id:G.d,w:G.w,h:G.h})),{gapX:G8,gapY:yZ,viewportAspect:Q.viewportAspect,minBandW:M8,aspectSlack:U8}),L=new Map,q=new Map,H=0;for(let G of U){let B=C.get(G.d),D=Z.filter((O)=>G.tableLocal.has(O.id));for(let O of D){let M=G.tableLocal.get(O.id),F=B.x+M.x,z=B.y+M.y;L.set(O.id,{x:F,y:z}),(V.get(O.id)??[]).forEach((w,T)=>{q.set(w.id,{x:F,y:z+JZ(O.columnCount)+TZ+T*GZ})})}H=Math.max(H,B.y+G.h)}if(Y.length){let G=H+yZ,B=Math.max(1,Math.min(4,Math.ceil(Math.sqrt(Y.length/2))));Y.forEach((D,O)=>{q.set(D.id,{x:O%B*X8,y:G+Math.floor(O/B)*GZ})})}return{tables:L,endpoints:q}}function q5(Z,$,Q){let J=Q4($,Q),V=new Map;for(let q of Q){let H=J.get(q.id);if(H)V.set(H,(V.get(H)??0)+1)}let Y=(q)=>{let H=V.get(q.id)??0;return q.y+JZ(q.columnCount)+(H?TZ+H*GZ:0)},X=uZ(Z.domain),K=$.filter((q)=>uZ(q.domain)===X);if(!K.length){let q=$.length?Math.max(...$.map(Y),...Q.map((H)=>H.y+GZ)):0;return{x:0,y:$.length||Q.length?q+yZ:0}}let j=Math.min(...K.map((q)=>q.x)),W=K.map((q)=>Math.max(0,Math.round((q.x-j)/QZ))),U=Math.min(12,Math.max(...W)+1),C=Array(U).fill(Math.min(...K.map((q)=>q.y)));K.forEach((q,H)=>{let G=Math.min(W[H],U-1);C[G]=Math.max(C[G],Y(q)+$4)});let L=0;for(let q=1;q<U;q++)if(C[q]<C[L])L=q;return{x:j+L*QZ,y:C[L]}}function O5(Z,$,Q){let J=Q4($,[...Q,Z]),V=J.get(Z.id),Y=V?$.find((K)=>K.id===V):void 0;if(Y){let K=Q.filter((U)=>J.get(U.id)===Y.id),j=Y.y+JZ(Y.columnCount)+TZ,W=K.length?Math.max(...K.map((U)=>U.y))+GZ:j;return{x:Y.x,y:W}}let X=[...$.map((K)=>K.y+JZ(K.columnCount)),...Q.map((K)=>K.y+GZ)];return{x:0,y:X.length?Math.max(...X)+yZ:0}}function D5(Z){let $=QZ-20;for(let Q=0;Q<Z.length;Q++)for(let J=Q+1;J<Z.length;J++){let V=Z[Q],Y=Z[J],X=JZ(V.columnCount),K=JZ(Y.columnCount);if(V.x<Y.x+$&&V.x+$>Y.x&&V.y<Y.y+K&&V.y+X>Y.y)return!0}return!1}import{eq as F5}from"drizzle-orm";z5();async function _5(Z=b,$){let[Q,J]=await Promise.all([Z.query.dbTable.findMany({with:{columns:{columns:{id:!0}}},orderBy:(X,{asc:K})=>K(X.name)}),Z.query.endpoint.findMany({with:{tables:{columns:{tableId:!0}}}})]),V=B5(Q.map((X)=>({id:X.id,name:X.name,domain:X.domain,columnCount:X.columns.length})),J.map((X)=>({id:X.id,method:X.method,path:X.path,uses:X.tables.map((K)=>({tableId:K.tableId}))})),{viewportAspect:$}),Y=0;for(let X of Q){let K=V.tables.get(X.id);if(!K||Math.round(K.x)===Math.round(X.x)&&Math.round(K.y)===Math.round(X.y))continue;await Z.update(P).set({x:K.x,y:K.y}).where(F5(P.id,X.id)),Y++}for(let X of J){let K=V.endpoints.get(X.id);if(!K||Math.round(K.x)===Math.round(X.x)&&Math.round(K.y)===Math.round(X.y))continue;await Z.update(E).set({x:K.x,y:K.y}).where(F5(E.id,X.id)),Y++}return Y}var A8=A.object({tables:A.array(A.object({name:A.string().trim().min(1),domain:A.string().nullish(),description:A.string().nullish(),columns:A.array(A.object({name:A.string().trim().min(1),type:A.string().trim().min(1),isPk:A.boolean().optional(),isFk:A.boolean().optional(),nullable:A.boolean().optional(),note:A.string().nullish()})).default([])})).default([]),relations:A.array(A.object({fromTable:A.string(),fromColumn:A.string(),toTable:A.string(),toColumn:A.string(),label:A.string().nullish()})).default([]),endpoints:A.array(A.object({method:A.string().trim().min(1),path:A.string().trim().min(1),domain:A.string().nullish(),description:A.string().nullish(),uses:A.array(A.object({table:A.string(),access:A.string().default("read")})).default([])})).default([])});async function fZ(Z=b){let[$]=await Z.insert(a).values({id:"singleton",version:1}).onConflictDoUpdate({target:a.id,set:{version:_8`${a.version} + 1`}}).returning();return $.version}async function A5(Z,$=b,Q={}){let J=A8.parse(Z),V=J.tables.length>0,Y=J.endpoints.length>0,X=J.tables.map((M)=>M.name);if(V)await $.delete(P).where(X.length?D8(xZ(P.source,"INTROSPECTION"),z8(P.name,X)):xZ(P.source,"INTROSPECTION"));let K=await $.query.dbTable.findMany({columns:{id:!0,name:!0,domain:!0,x:!0,y:!0},with:{columns:{columns:{id:!0}}}}),j=await $.query.endpoint.findMany({columns:{id:!0,method:!0,path:!0,x:!0,y:!0},with:{tables:{columns:{tableId:!0}}}}),W=new Map(K.map((M)=>[M.name,M])),U=K.map((M)=>({id:M.id,name:M.name,domain:M.domain,columnCount:M.columns.length,x:M.x,y:M.y})),C=j.map((M)=>({id:M.id,method:M.method,path:M.path,uses:M.tables.map((F)=>({tableId:F.tableId})),x:M.x,y:M.y})),L=new Map;for(let M of J.tables){if(W.has(M.name))continue;let F=q5({domain:M.domain??null,columnCount:M.columns.length},U,C);L.set(M.name,F),U.push({id:`new:${M.name}`,name:M.name,domain:M.domain??null,columnCount:M.columns.length,...F})}let q=new Map;for(let M of J.tables){let F=W.get(M.name),z=L.get(M.name),R=F?.x??z?.x??0,w=F?.y??z?.y??0,[T]=await $.insert(P).values({name:M.name,domain:M.domain??null,description:M.description??null,source:"INTROSPECTION",x:R,y:w}).onConflictDoUpdate({target:P.name,set:{...M.domain!=null?{domain:M.domain}:{},...M.description!=null?{description:M.description}:{},source:"INTROSPECTION"}}).returning();if(q.set(M.name,T.id),await $.delete(e).where(xZ(e.tableId,T.id)),M.columns.length)await $.insert(e).values(M.columns.map((f,I)=>({tableId:T.id,name:f.name,type:f.type,isPk:f.isPk??!1,isFk:f.isFk??!1,nullable:f.nullable??!0,note:f.note??null,ord:I})))}let H=[...q.values()];if(H.length)await $.delete(l).where(F8(J4(l.fromTableId,H),J4(l.toTableId,H)));for(let M of J.relations){let F=q.get(M.fromTable),z=q.get(M.toTable);if(!F||!z)continue;await $.insert(l).values({fromTableId:F,toTableId:z,fromColumn:M.fromColumn,toColumn:M.toColumn,label:M.label??`${M.fromColumn} \u2192 ${M.toTable}.${M.toColumn}`})}let G=new Set(J.endpoints.map((M)=>`${M.method} ${M.path}`));if(Y){let F=(await $.query.endpoint.findMany({where:(z,{eq:R})=>R(z.source,"INTROSPECTION")})).filter((z)=>!G.has(`${z.method} ${z.path}`)).map((z)=>z.id);if(F.length)await $.delete(E).where(J4(E.id,F))}for(let M of U)if(M.id.startsWith("new:"))M.id=q.get(M.name)??M.id;for(let M of J.endpoints){let F=await $.query.endpoint.findFirst({where:(T,{and:f,eq:I})=>f(I(T.method,M.method),I(T.path,M.path))}),z,R;if(F)z=F.x,R=F.y;else{let T={id:`new:${M.method} ${M.path}`,method:M.method,path:M.path,uses:M.uses.map((I)=>({tableId:q.get(I.table)??""})).filter((I)=>I.tableId)},f=O5(T,U,C);z=f.x,R=f.y,C.push({...T,x:z,y:R})}let[w]=await $.insert(E).values({method:M.method,path:M.path,domain:M.domain??null,description:M.description??null,source:"INTROSPECTION",x:z,y:R}).onConflictDoUpdate({target:[E.method,E.path],set:{...M.domain!=null?{domain:M.domain}:{},...M.description!=null?{description:M.description}:{},source:"INTROSPECTION"}}).returning();if(!Q.partial||M.uses.length>0)await $.delete(i).where(xZ(i.endpointId,w.id));for(let T of M.uses){let f=q.get(T.table)??(await $.query.dbTable.findFirst({where:(I,{eq:UZ})=>UZ(I.name,T.table)}))?.id;if(!f)continue;await $.insert(i).values({endpointId:w.id,tableId:f,access:T.access})}}await j5($),await N5($);let B=await $.query.dbTable.findMany({where:(M,{eq:F})=>F(M.source,"INTROSPECTION"),columns:{x:!0,y:!0},with:{columns:{columns:{id:!0}}}}),D=await $.select({x:E.x,y:E.y}).from(E);if(D5(B.map((M)=>({x:M.x,y:M.y,columnCount:M.columns.length})))||M5(D))await _5($);let O=await fZ($);return{tables:J.tables.length,relations:J.relations.length,endpoints:J.endpoints.length,version:O}}var I5=d.object({files:d.array(d.object({path:d.string().trim().min(1),root:d.string().nullish(),lang:d.string().nullish(),mtimeMs:d.number().nullish(),size:d.number().nullish()})).default([]),edges:d.array(d.object({from:d.string().trim().min(1),to:d.string().trim().min(1)})).default([])});function R5(Z,$){let Q=new Map;for(let L of Z)Q.set(L,[]);for(let L of $)Q.get(L.from)?.push(L.to);let J=new Map,V=new Map,Y=new Set,X=[],K=new Map,j=[],W=0,U=0;for(let L of Z){if(J.has(L))continue;let q=[{v:L,iter:0}];J.set(L,W),V.set(L,W),W++,X.push(L),Y.add(L);while(q.length){let H=q[q.length-1],G=Q.get(H.v)??[];if(H.iter<G.length){let B=G[H.iter++];if(!J.has(B))J.set(B,W),V.set(B,W),W++,X.push(B),Y.add(B),q.push({v:B,iter:0});else if(Y.has(B))V.set(H.v,Math.min(V.get(H.v),J.get(B)))}else{if(V.get(H.v)===J.get(H.v)){let D=0,O;do O=X.pop(),Y.delete(O),K.set(O,U),D++;while(O!==H.v);j.push(D),U++}q.pop();let B=q[q.length-1];if(B)V.set(B.v,Math.min(V.get(B.v),V.get(H.v)))}}}let C=new Set;for(let L of $){let q=K.get(L.from);if(q!==void 0&&q===K.get(L.to)&&j[q]>1)C.add(`${L.from}|${L.to}`)}return C}async function E5(Z,$=b){let Q=I5.parse(Z),J=Q.files.map((C)=>C.path),V=new Set(J),Y=Q.edges.filter((C)=>V.has(C.from)&&V.has(C.to)&&C.from!==C.to),X=R5(J,Y),K=new Map,j=new Map;for(let C of Y)j.set(C.from,(j.get(C.from)??0)+1),K.set(C.to,(K.get(C.to)??0)+1);await $.delete(y).where(I8(y.path,J));for(let C of Q.files){let L={root:C.root??null,lang:C.lang??null,mtimeMs:C.mtimeMs??null,size:C.size??null,inDegree:K.get(C.path)??0,outDegree:j.get(C.path)??0};await $.insert(y).values({path:C.path,...L}).onConflictDoUpdate({target:y.path,set:L})}await $.delete(x);let W=0;if(Y.length)await $.insert(x).values(Y.map((C)=>{let L=X.has(`${C.from}|${C.to}`);if(L)W++;return{fromPath:C.from,toPath:C.to,circular:L}}));let U=await fZ($);return await $.update(a).set({codeGraphSyncedAt:new Date}).where(CZ(a.id,"singleton")),{files:Q.files.length,edges:Y.length,circular:W,version:U}}var R8=(Z,$)=>`${Z}\x00${$}`;function V4(Z){let $=I5.parse(Z),Q=$.files.map((U)=>U.path),J=new Set(Q),V=$.edges.filter((U)=>J.has(U.from)&&J.has(U.to)&&U.from!==U.to),Y=R5(Q,V),X=new Map,K=new Map;for(let U of V)K.set(U.from,(K.get(U.from)??0)+1),X.set(U.to,(X.get(U.to)??0)+1);let j=new Map;for(let U of $.files)j.set(U.path,{root:U.root??null,lang:U.lang??null,mtimeMs:U.mtimeMs??null,size:U.size??null,inDegree:X.get(U.path)??0,outDegree:K.get(U.path)??0});let W=new Map;for(let U of V)W.set(R8(U.from,U.to),{from:U.from,to:U.to,circular:Y.has(`${U.from}|${U.to}`)});return{files:j,edges:W}}var E8=(Z,$)=>Z.root===$.root&&Z.lang===$.lang&&Z.mtimeMs===$.mtimeMs&&Z.size===$.size&&Z.inDegree===$.inDegree&&Z.outDegree===$.outDegree;async function S5(Z,$,Q=b){for(let[K,j]of $.files){let W=Z.files.get(K);if(W&&E8(W,j))continue;let U={root:j.root,lang:j.lang,mtimeMs:j.mtimeMs,size:j.size,inDegree:j.inDegree,outDegree:j.outDegree};await Q.insert(y).values({path:K,...U}).onConflictDoUpdate({target:y.path,set:U})}let J=[...Z.files.keys()].filter((K)=>!$.files.has(K));if(J.length)await Q.delete(y).where(P8(y.path,J));for(let[K,j]of Z.edges)if(!$.edges.has(K))await Q.delete(x).where(P5(CZ(x.fromPath,j.from),CZ(x.toPath,j.to)));let V=[];for(let[K,j]of $.edges){let W=Z.edges.get(K);if(!W)V.push({fromPath:j.from,toPath:j.to,circular:j.circular});else if(W.circular!==j.circular)await Q.update(x).set({circular:j.circular}).where(P5(CZ(x.fromPath,j.from),CZ(x.toPath,j.to)))}if(V.length)await Q.insert(x).values(V);let Y=await fZ(Q);await Q.update(a).set({codeGraphSyncedAt:new Date}).where(CZ(a.id,"singleton"));let X=0;for(let K of $.edges.values())if(K.circular)X++;return{files:$.files.size,edges:$.edges.size,circular:X,version:Y}}var T8=/[/\\](node_modules|\.git|\.next|dist|build|__pycache__|target|\.venv|venv|\.beacon|\.playwright-mcp|generated|coverage)[/\\]/;function y8(Z){try{let $=DZ(Z,"beacon.config.json");if(k5($)){let Q=JSON.parse(S8($,"utf8"));if(Array.isArray(Q.roots)&&Q.roots.length)return Q.roots.map((J)=>w8(Z,J))}}catch{}return[Z]}function w5(Z){let $=y8(Z.path),Q=nZ(Z.id),J=IZ(VZ(Z.id)),V=e4($,Z.path);async function Y(){let G=Y5(V.snapshot().files.map((F)=>F.path));for(let F of $)for(let z of["prisma/schema.prisma","schema.prisma"]){let R=DZ(F,z);if(k5(R))G.push(X(R))}let B=[];for(let F of G)try{B.push({path:F,content:await v5(DZ(Z.path,F),"utf8")})}catch{}let D=V5(B),O=K5(B);if(!D.tables.length&&!O.length)return;if(O.length&&D.tableVars&&Object.keys(D.tableVars).length){let z=V.snapshot().edges,R=new Set(O.map((I)=>I.file)),w=new Map;for(let I of z){let UZ=w.get(I.from)??[];UZ.push(I.to),w.set(I.from,UZ)}for(let I=0;I<2;I++)for(let UZ of[...R])for(let m5 of w.get(UZ)??[])R.add(m5);let T=new Map;for(let I of[...R].slice(0,600))try{T.set(I,await v5(DZ(Z.path,I),"utf8"))}catch{}let f=Z5({routeFiles:[...new Set(O.map((I)=>I.file))],edges:z,content:(I)=>T.get(I)??null,tableVars:D.tableVars});for(let I of O)I.uses=f.get(I.file)??[]}let M=await A5({tables:D.tables,relations:D.relations,endpoints:O},J,{partial:!0});console.log(`[beacon-inline] schema synced (${Z.name}): ${M.tables} tables / ${M.endpoints} endpoints`)}function X(G){return k8(Z.path,G).split(/[\\/]/).join("/")}let K=null,j=!1,W=new Set,U=null,C=!1;async function L(){if(C){q();return}C=!0;try{if(await Q,j)K=null,j=!1;if(K===null){let O=await V.seed(),M=await E5(O,J);K=V4(O),console.log(`[beacon-inline] code-graph synced (${Z.name}): ${M.files} files / ${M.edges} imports${M.circular>0?` (${M.circular} circular)`:""}`),await Y();return}let G=[...W];W.clear();let B=G.some((O)=>Z4(X(O))),D=!1;for(let O of G)if(await V.applyChange(O))D=!0;if(D){let O=V4(V.snapshot()),M=await S5(K,O,J);K=O,console.log(`[beacon-inline] code-graph updated (${Z.name}): ${M.files} files / ${M.edges} imports${M.circular>0?` (${M.circular} circular)`:""}`)}if(B)await Y()}catch(G){console.error(`[beacon-inline] error (${Z.name}):`,G instanceof Error?G.message:G)}finally{C=!1}}function q(){if(U)clearTimeout(U);U=setTimeout(L,600)}let H=[];for(let G of $)try{let B=v8(G,{recursive:!0,persistent:!0},(D,O)=>{if(!O){j=!0,q();return}let M=String(O);if(T8.test(`/${M}`))return;W.add(DZ(G,M)),q()});B.on("error",(D)=>console.error(`[beacon-inline] watcher error (${Z.name}):`,D)),H.push(B)}catch(B){console.error(`[beacon-inline] live watch unavailable for ${G} (${Z.name}):`,B instanceof Error?B.message:B)}return console.log(`[beacon-inline] watching ${Z.name} (${$.join(", ")}) \u2014 initial extract\u2026`),L(),{async stop(){if(U)clearTimeout(U);for(let G of H)G.close()}}}function x8(Z){let $=Z.limit??6,Q=Z.hardCap??12,J=new Map,V=0,Y=new Set;function X(G){let B=J.get(G);if(B)B.seq=++V}function K(G){if(J.has(G.id))return X(G.id);if(!Z.exists(G.path))return;J.set(G.id,{handle:Z.start(G),seq:++V})}function j(){let G=null,B=1/0;for(let[D,O]of J){if(Y.has(D))continue;if(O.seq<B)B=O.seq,G=D}if(G)J.get(G).handle.stop(),J.delete(G)}function W(){let G=Z.list().filter((B)=>Z.exists(B.path)).slice(0,$);Y=new Set(G.map((B)=>B.id));for(let B of G)K(B);for(let[B,D]of[...J]){let O=Z.get(B);if(!O||!Z.exists(O.path))D.handle.stop(),J.delete(B)}}function U(G){if(J.has(G))return X(G);let B=Z.get(G);if(!B||!Z.exists(B.path))return;if(J.size>=Q)j();if(J.size>=Q)return;J.set(G,{handle:Z.start(B),seq:++V})}async function C(G){let B=J.get(G);if(!B)return;J.delete(G),await B.handle.stop()}function L(G){return J.has(G)}function q(){return[...J.keys()]}async function H(){await Promise.all([...J.values()].map((G)=>G.handle.stop())),J.clear()}return{reconcile:W,ensureWatcher:U,stopWatcher:C,isWatching:L,activeIds:q,stopAll:H}}var f8=x8({list:_Z,get:g,exists:u8,start:(Z)=>w5(Z)});async function T5(Z){await f8.stopWatcher(Z)}async function y5(Z){if(!g(Z))return{ok:!1,removed:!1,fallbackId:r(),error:"unknown workspace"};O4(Z),B4(Z),await T5(Z),R4(VZ(Z)),P4(Z);try{g8(n(Z),{recursive:!0,force:!0})}catch($){return{ok:!1,removed:!0,fallbackId:r(),error:$ instanceof Error?$.message:String($)}}return{ok:!0,removed:!0,fallbackId:r()}}var K4=process.argv.slice(3),f5=K4.includes("--yes")||K4.includes("-y"),MZ=K4.find((Z)=>!Z.startsWith("-")),u5=(Z)=>`\x1B[32m\u2713\x1B[0m ${Z}`,g5=(Z)=>`\x1B[2m${Z}\x1B[0m`,h5=(Z)=>`
6
+ \x1B[1m${Z}\x1B[0m`;function b8(){if(!MZ)return g(ZZ(FZ(process.cwd())));if(/^[0-9a-f]{12}$/.test(MZ)){let Z=g(MZ);if(Z)return Z}return g(ZZ(FZ(x5(MZ))))}var s=b8();if(!s)console.error(`[beacon] ${MZ??process.cwd()} is not a registered Beacon workspace \u2014 nothing to remove.`),process.exit(1);console.log(h5(f5?"Beacon \xB7 remove workspace":"Beacon \xB7 remove workspace (dry run)"));console.log(` name: ${s.name}${r()===s.id?" (currently active)":""}`);console.log(` repo: ${s.path} ${g5("(untouched \u2014 only Beacon's data is erased)")}`);console.log(` data: ${n(s.id)} ${g5("(deleted)")}`);if(!f5)console.log(h5("Nothing was changed.")),console.log(` Run \x1B[1mbeacon remove${MZ?` ${MZ}`:""} --yes\x1B[0m to apply.
7
+ `),process.exit(0);async function p8(Z){try{let{pid:$,port:Q}=JSON.parse(m8(x5(t(),"server.json"),"utf8"));if(!$||!Q)return!1;return process.kill($,0),(await fetch(`http://localhost:${Q}/api/workspace`,{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify({id:Z}),signal:AbortSignal.timeout(1e4)})).ok}catch{return!1}}if(await p8(s.id))console.log(` ${u5(`removed ${s.name} (via the running daemon)`)}
8
+ `);else{let Z=await y5(s.id);if(!Z.ok)console.error(`[beacon] remove failed: ${Z.error??"unknown error"}`),process.exit(1);console.log(` ${u5(`removed ${s.name}`)}
9
9
  `)}if(h8(n(s.id)))console.error(`[beacon] warning: ${n(s.id)} still exists \u2014 remove it manually.`),process.exit(1);