trybeacon 0.1.46 → 0.1.48

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 (326) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +19 -17
  3. package/.next/build-manifest.json +2 -2
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/routes-manifest.json +12 -0
  6. package/.next/server/app/_global-error/page.js +3 -3
  7. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/_global-error.html +1 -1
  9. package/.next/server/app/_global-error.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/.next/server/app/_not-found/page.js +2 -2
  17. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  18. package/.next/server/app/_not-found.html +1 -1
  19. package/.next/server/app/_not-found.rsc +2 -2
  20. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  21. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  22. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  23. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  24. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  25. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  26. package/.next/server/app/api/board-annotations/[id]/route.js +1 -1
  27. package/.next/server/app/api/board-annotations/route.js +1 -1
  28. package/.next/server/app/api/board-layout/route.js +1 -1
  29. package/.next/server/app/api/bug-flags/[id]/route.js +1 -1
  30. package/.next/server/app/api/bug-flags/route.js +1 -1
  31. package/.next/server/app/api/code-graph/position/route.js +1 -1
  32. package/.next/server/app/api/code-graph/route.js +1 -1
  33. package/.next/server/app/api/context/feature/route.js +1 -1
  34. package/.next/server/app/api/context/file/route.js +1 -1
  35. package/.next/server/app/api/context/route.js +2 -2
  36. package/.next/server/app/api/db/arrange/route.js +1 -1
  37. package/.next/server/app/api/db/backfill-access/route.js +1 -1
  38. package/.next/server/app/api/db/position/route.js +1 -1
  39. package/.next/server/app/api/db/prune-planned/route.js +1 -1
  40. package/.next/server/app/api/db/reconcile-endpoints/route.js +1 -1
  41. package/.next/server/app/api/db/relations/[id]/route.js +1 -1
  42. package/.next/server/app/api/db/tables/[id]/route.js +1 -1
  43. package/.next/server/app/api/draft/approve/route.js +1 -1
  44. package/.next/server/app/api/draft/route.js +1 -1
  45. package/.next/server/app/api/draft/status/route.js +1 -1
  46. package/.next/server/app/api/edges/[id]/route.js +1 -1
  47. package/.next/server/app/api/edges/route.js +1 -1
  48. package/.next/server/app/api/endpoints/[id]/route.js +1 -1
  49. package/.next/server/app/api/entities/route.js +1 -1
  50. package/.next/server/app/api/feedback/[id]/route.js +1 -1
  51. package/.next/server/app/api/feedback/[id]/vote/route.js +1 -1
  52. package/.next/server/app/api/feedback/route.js +1 -1
  53. package/.next/server/app/api/flags/route.js +1 -0
  54. package/.next/server/app/api/flags/route.js.nft.json +1 -0
  55. package/.next/server/app/api/flags/route_client-reference-manifest.js +1 -0
  56. package/.next/server/app/api/ingest/route.js +2 -2
  57. package/.next/server/app/api/init/route.js +1 -1
  58. package/.next/server/app/api/map/describe/route.js +2 -2
  59. package/.next/server/app/api/map/files/route.js +1 -1
  60. package/.next/server/app/api/map/finish/route.js +1 -1
  61. package/.next/server/app/api/map/route.js +1 -1
  62. package/.next/server/app/api/map/start/route.js +1 -1
  63. package/.next/server/app/api/map/touch-active/route.js +1 -1
  64. package/.next/server/app/api/nodes/[id]/position/route.js +1 -1
  65. package/.next/server/app/api/nodes/[id]/route.js +1 -1
  66. package/.next/server/app/api/nodes/positions/route.js +1 -1
  67. package/.next/server/app/api/nodes/route.js +1 -1
  68. package/.next/server/app/api/nodes/subtasks/route.js +1 -1
  69. package/.next/server/app/api/notes/[id]/route.js +1 -1
  70. package/.next/server/app/api/notes/route.js +1 -1
  71. package/.next/server/app/api/open/route.js +1 -1
  72. package/.next/server/app/api/plan/annotations/route.js +3 -3
  73. package/.next/server/app/api/plan/approve/route.js +2 -2
  74. package/.next/server/app/api/plan/history/route.js +1 -1
  75. package/.next/server/app/api/plan/markdown/route.js +1 -1
  76. package/.next/server/app/api/plan/presence/route.js +1 -1
  77. package/.next/server/app/api/plan/route.js +1 -1
  78. package/.next/server/app/api/plan/verdict/route.js +1 -1
  79. package/.next/server/app/api/preferences/route.js +1 -1
  80. package/.next/server/app/api/project-meta/route.js +1 -1
  81. package/.next/server/app/api/reset/route.js +1 -1
  82. package/.next/server/app/api/scope-guard/check/route.js +1 -0
  83. package/.next/server/app/api/scope-guard/check/route.js.nft.json +1 -0
  84. package/.next/server/app/api/scope-guard/check/route_client-reference-manifest.js +1 -0
  85. package/.next/server/app/api/stream/route.js +2 -2
  86. package/.next/server/app/api/tab/nav/route.js +1 -1
  87. package/.next/server/app/api/tab/presence/route.js +1 -1
  88. package/.next/server/app/api/telemetry/route.js +1 -1
  89. package/.next/server/app/api/telemetry/stats/route.js +1 -1
  90. package/.next/server/app/api/version/route.js +1 -1
  91. package/.next/server/app/api/workspace/activate/route.js +1 -1
  92. package/.next/server/app/api/workspace/route.js +1 -1
  93. package/.next/server/app/apple-icon.png/route.js +1 -1
  94. package/.next/server/app/docs/page.js +2 -2
  95. package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  96. package/.next/server/app/docs.html +1 -1
  97. package/.next/server/app/docs.rsc +2 -2
  98. package/.next/server/app/docs.segments/_full.segment.rsc +2 -2
  99. package/.next/server/app/docs.segments/_head.segment.rsc +1 -1
  100. package/.next/server/app/docs.segments/_index.segment.rsc +2 -2
  101. package/.next/server/app/docs.segments/_tree.segment.rsc +2 -2
  102. package/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +1 -1
  103. package/.next/server/app/docs.segments/docs.segment.rsc +1 -1
  104. package/.next/server/app/feedback/page.js +2 -2
  105. package/.next/server/app/feedback/page_client-reference-manifest.js +1 -1
  106. package/.next/server/app/feedback.html +1 -1
  107. package/.next/server/app/feedback.rsc +2 -2
  108. package/.next/server/app/feedback.segments/_full.segment.rsc +2 -2
  109. package/.next/server/app/feedback.segments/_head.segment.rsc +1 -1
  110. package/.next/server/app/feedback.segments/_index.segment.rsc +2 -2
  111. package/.next/server/app/feedback.segments/_tree.segment.rsc +2 -2
  112. package/.next/server/app/feedback.segments/feedback/__PAGE__.segment.rsc +1 -1
  113. package/.next/server/app/feedback.segments/feedback.segment.rsc +1 -1
  114. package/.next/server/app/help/page.js +2 -2
  115. package/.next/server/app/help/page_client-reference-manifest.js +1 -1
  116. package/.next/server/app/help.html +1 -1
  117. package/.next/server/app/help.rsc +2 -2
  118. package/.next/server/app/help.segments/_full.segment.rsc +2 -2
  119. package/.next/server/app/help.segments/_head.segment.rsc +1 -1
  120. package/.next/server/app/help.segments/_index.segment.rsc +2 -2
  121. package/.next/server/app/help.segments/_tree.segment.rsc +2 -2
  122. package/.next/server/app/help.segments/help/__PAGE__.segment.rsc +1 -1
  123. package/.next/server/app/help.segments/help.segment.rsc +1 -1
  124. package/.next/server/app/icon.svg/route.js +1 -1
  125. package/.next/server/app/index.html +1 -1
  126. package/.next/server/app/index.rsc +2 -2
  127. package/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  128. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  129. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  130. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  131. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  132. package/.next/server/app/map/page.js +2 -2
  133. package/.next/server/app/map/page.js.nft.json +1 -1
  134. package/.next/server/app/map/page_client-reference-manifest.js +1 -1
  135. package/.next/server/app/page.js +2 -2
  136. package/.next/server/app/page_client-reference-manifest.js +1 -1
  137. package/.next/server/app/plan/page.js +2 -2
  138. package/.next/server/app/plan/page.js.nft.json +1 -1
  139. package/.next/server/app/plan/page_client-reference-manifest.js +1 -1
  140. package/.next/server/app/settings/page.js +2 -2
  141. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  142. package/.next/server/app-paths-manifest.json +19 -17
  143. package/.next/server/chunks/249.js +1 -1
  144. package/.next/server/chunks/2933.js +1 -1
  145. package/.next/server/chunks/3221.js +2 -2
  146. package/.next/server/chunks/3622.js +1 -1
  147. package/.next/server/chunks/4378.js +1 -1
  148. package/.next/server/chunks/4940.js +1 -1
  149. package/.next/server/chunks/805.js +1 -0
  150. package/.next/server/chunks/9213.js +1 -1
  151. package/.next/server/chunks/9683.js +1 -1
  152. package/.next/server/middleware-build-manifest.js +1 -1
  153. package/.next/server/pages/404.html +1 -1
  154. package/.next/server/pages/500.html +1 -1
  155. package/.next/server/server-reference-manifest.js +1 -1
  156. package/.next/server/server-reference-manifest.json +1 -1
  157. package/.next/static/chunks/85-82015ecb44b65d3e.js +1 -0
  158. package/.next/static/chunks/app/_global-error/page-dc3f0f4fd9e88c4e.js +1 -0
  159. package/.next/static/chunks/app/api/board-annotations/[id]/route-dc3f0f4fd9e88c4e.js +1 -0
  160. package/.next/static/chunks/app/api/board-annotations/route-dc3f0f4fd9e88c4e.js +1 -0
  161. package/.next/static/chunks/app/api/board-layout/route-dc3f0f4fd9e88c4e.js +1 -0
  162. package/.next/static/chunks/app/api/bug-flags/[id]/route-dc3f0f4fd9e88c4e.js +1 -0
  163. package/.next/static/chunks/app/api/bug-flags/route-dc3f0f4fd9e88c4e.js +1 -0
  164. package/.next/static/chunks/app/api/code-graph/position/route-dc3f0f4fd9e88c4e.js +1 -0
  165. package/.next/static/chunks/app/api/code-graph/route-dc3f0f4fd9e88c4e.js +1 -0
  166. package/.next/static/chunks/app/api/context/feature/route-dc3f0f4fd9e88c4e.js +1 -0
  167. package/.next/static/chunks/app/api/context/file/route-dc3f0f4fd9e88c4e.js +1 -0
  168. package/.next/static/chunks/app/api/context/route-dc3f0f4fd9e88c4e.js +1 -0
  169. package/.next/static/chunks/app/api/db/arrange/route-dc3f0f4fd9e88c4e.js +1 -0
  170. package/.next/static/chunks/app/api/db/backfill-access/route-dc3f0f4fd9e88c4e.js +1 -0
  171. package/.next/static/chunks/app/api/db/position/route-dc3f0f4fd9e88c4e.js +1 -0
  172. package/.next/static/chunks/app/api/db/prune-planned/route-dc3f0f4fd9e88c4e.js +1 -0
  173. package/.next/static/chunks/app/api/db/reconcile-endpoints/route-dc3f0f4fd9e88c4e.js +1 -0
  174. package/.next/static/chunks/app/api/db/relations/[id]/route-dc3f0f4fd9e88c4e.js +1 -0
  175. package/.next/static/chunks/app/api/db/tables/[id]/route-dc3f0f4fd9e88c4e.js +1 -0
  176. package/.next/static/chunks/app/api/draft/approve/route-dc3f0f4fd9e88c4e.js +1 -0
  177. package/.next/static/chunks/app/api/draft/route-dc3f0f4fd9e88c4e.js +1 -0
  178. package/.next/static/chunks/app/api/draft/status/route-dc3f0f4fd9e88c4e.js +1 -0
  179. package/.next/static/chunks/app/api/edges/[id]/route-dc3f0f4fd9e88c4e.js +1 -0
  180. package/.next/static/chunks/app/api/edges/route-dc3f0f4fd9e88c4e.js +1 -0
  181. package/.next/static/chunks/app/api/endpoints/[id]/route-dc3f0f4fd9e88c4e.js +1 -0
  182. package/.next/static/chunks/app/api/entities/route-dc3f0f4fd9e88c4e.js +1 -0
  183. package/.next/static/chunks/app/api/feedback/[id]/route-dc3f0f4fd9e88c4e.js +1 -0
  184. package/.next/static/chunks/app/api/feedback/[id]/vote/route-dc3f0f4fd9e88c4e.js +1 -0
  185. package/.next/static/chunks/app/api/feedback/route-dc3f0f4fd9e88c4e.js +1 -0
  186. package/.next/static/chunks/app/api/flags/route-dc3f0f4fd9e88c4e.js +1 -0
  187. package/.next/static/chunks/app/api/ingest/route-dc3f0f4fd9e88c4e.js +1 -0
  188. package/.next/static/chunks/app/api/init/route-dc3f0f4fd9e88c4e.js +1 -0
  189. package/.next/static/chunks/app/api/map/describe/route-dc3f0f4fd9e88c4e.js +1 -0
  190. package/.next/static/chunks/app/api/map/files/route-dc3f0f4fd9e88c4e.js +1 -0
  191. package/.next/static/chunks/app/api/map/finish/route-dc3f0f4fd9e88c4e.js +1 -0
  192. package/.next/static/chunks/app/api/map/route-dc3f0f4fd9e88c4e.js +1 -0
  193. package/.next/static/chunks/app/api/map/start/route-dc3f0f4fd9e88c4e.js +1 -0
  194. package/.next/static/chunks/app/api/map/touch-active/route-dc3f0f4fd9e88c4e.js +1 -0
  195. package/.next/static/chunks/app/api/nodes/[id]/position/route-dc3f0f4fd9e88c4e.js +1 -0
  196. package/.next/static/chunks/app/api/nodes/[id]/route-dc3f0f4fd9e88c4e.js +1 -0
  197. package/.next/static/chunks/app/api/nodes/positions/route-dc3f0f4fd9e88c4e.js +1 -0
  198. package/.next/static/chunks/app/api/nodes/route-dc3f0f4fd9e88c4e.js +1 -0
  199. package/.next/static/chunks/app/api/nodes/subtasks/route-dc3f0f4fd9e88c4e.js +1 -0
  200. package/.next/static/chunks/app/api/notes/[id]/route-dc3f0f4fd9e88c4e.js +1 -0
  201. package/.next/static/chunks/app/api/notes/route-dc3f0f4fd9e88c4e.js +1 -0
  202. package/.next/static/chunks/app/api/open/route-dc3f0f4fd9e88c4e.js +1 -0
  203. package/.next/static/chunks/app/api/plan/annotations/route-dc3f0f4fd9e88c4e.js +1 -0
  204. package/.next/static/chunks/app/api/plan/approve/route-dc3f0f4fd9e88c4e.js +1 -0
  205. package/.next/static/chunks/app/api/plan/history/route-dc3f0f4fd9e88c4e.js +1 -0
  206. package/.next/static/chunks/app/api/plan/markdown/route-dc3f0f4fd9e88c4e.js +1 -0
  207. package/.next/static/chunks/app/api/plan/presence/route-dc3f0f4fd9e88c4e.js +1 -0
  208. package/.next/static/chunks/app/api/plan/route-dc3f0f4fd9e88c4e.js +1 -0
  209. package/.next/static/chunks/app/api/plan/verdict/route-dc3f0f4fd9e88c4e.js +1 -0
  210. package/.next/static/chunks/app/api/preferences/route-dc3f0f4fd9e88c4e.js +1 -0
  211. package/.next/static/chunks/app/api/project-meta/route-dc3f0f4fd9e88c4e.js +1 -0
  212. package/.next/static/chunks/app/api/reset/route-dc3f0f4fd9e88c4e.js +1 -0
  213. package/.next/static/chunks/app/api/scope-guard/check/route-dc3f0f4fd9e88c4e.js +1 -0
  214. package/.next/static/chunks/app/api/stream/route-dc3f0f4fd9e88c4e.js +1 -0
  215. package/.next/static/chunks/app/api/tab/nav/route-dc3f0f4fd9e88c4e.js +1 -0
  216. package/.next/static/chunks/app/api/tab/presence/route-dc3f0f4fd9e88c4e.js +1 -0
  217. package/.next/static/chunks/app/api/telemetry/route-dc3f0f4fd9e88c4e.js +1 -0
  218. package/.next/static/chunks/app/api/telemetry/stats/route-dc3f0f4fd9e88c4e.js +1 -0
  219. package/.next/static/chunks/app/api/version/route-dc3f0f4fd9e88c4e.js +1 -0
  220. package/.next/static/chunks/app/api/workspace/activate/route-dc3f0f4fd9e88c4e.js +1 -0
  221. package/.next/static/chunks/app/api/workspace/route-dc3f0f4fd9e88c4e.js +1 -0
  222. package/.next/static/chunks/app/map/{page-e39e42ea48e335c5.js → page-c06fcf30d8172f82.js} +1 -1
  223. package/.next/static/chunks/app/plan/{page-6fe2020187a86e45.js → page-257d486640eadd7f.js} +1 -1
  224. package/.next/static/chunks/app/settings/page-7e176d120b1effa9.js +1 -0
  225. package/.next/static/chunks/next/dist/client/components/builtin/app-error-dc3f0f4fd9e88c4e.js +1 -0
  226. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-dc3f0f4fd9e88c4e.js +1 -0
  227. package/.next/static/chunks/next/dist/client/components/builtin/not-found-dc3f0f4fd9e88c4e.js +1 -0
  228. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-dc3f0f4fd9e88c4e.js +1 -0
  229. package/.next/static/css/5a58d83133d25695.css +1 -0
  230. package/.next/static/gNMdQmtkjPn6XQhRMDoMg/_buildManifest.js +1 -0
  231. package/.next/trace +39 -39
  232. package/.next/trace-build +1 -1
  233. package/.next/types/app/api/flags/route.ts +351 -0
  234. package/.next/types/app/api/scope-guard/check/route.ts +351 -0
  235. package/.next/types/routes.d.ts +3 -1
  236. package/.next/types/validator.ts +18 -0
  237. package/dist/bin/beacon.js +1 -1
  238. package/dist/bin/doctor.js +24 -18
  239. package/dist/bin/guard.js +3 -0
  240. package/dist/bin/hook.js +24 -18
  241. package/dist/bin/mcp.js +41 -35
  242. package/dist/bin/plan.js +21 -15
  243. package/dist/bin/remove.js +7 -6
  244. package/dist/bin/uninstall.js +24 -18
  245. package/dist/lib/assets.js +6 -0
  246. package/dist/lib/codex-install.js +6 -0
  247. package/dist/lib/global-install.js +7 -1
  248. package/dist/lib/telemetry.js +1 -1
  249. package/dist/lib/workspaces.js +1 -1
  250. package/drizzle/0008_good_lucky_pierre.sql +21 -0
  251. package/drizzle/meta/0008_snapshot.json +1904 -0
  252. package/drizzle/meta/_journal.json +7 -0
  253. package/package.json +1 -1
  254. package/public/install.sh +37 -6
  255. package/.next/server/chunks/5354.js +0 -1
  256. package/.next/static/5zLktwn2nHj-40t2fVml_/_buildManifest.js +0 -1
  257. package/.next/static/chunks/6229-35add8ccbfd89026.js +0 -1
  258. package/.next/static/chunks/app/_global-error/page-16ca2ed05a1d74d1.js +0 -1
  259. package/.next/static/chunks/app/api/board-annotations/[id]/route-16ca2ed05a1d74d1.js +0 -1
  260. package/.next/static/chunks/app/api/board-annotations/route-16ca2ed05a1d74d1.js +0 -1
  261. package/.next/static/chunks/app/api/board-layout/route-16ca2ed05a1d74d1.js +0 -1
  262. package/.next/static/chunks/app/api/bug-flags/[id]/route-16ca2ed05a1d74d1.js +0 -1
  263. package/.next/static/chunks/app/api/bug-flags/route-16ca2ed05a1d74d1.js +0 -1
  264. package/.next/static/chunks/app/api/code-graph/position/route-16ca2ed05a1d74d1.js +0 -1
  265. package/.next/static/chunks/app/api/code-graph/route-16ca2ed05a1d74d1.js +0 -1
  266. package/.next/static/chunks/app/api/context/feature/route-16ca2ed05a1d74d1.js +0 -1
  267. package/.next/static/chunks/app/api/context/file/route-16ca2ed05a1d74d1.js +0 -1
  268. package/.next/static/chunks/app/api/context/route-16ca2ed05a1d74d1.js +0 -1
  269. package/.next/static/chunks/app/api/db/arrange/route-16ca2ed05a1d74d1.js +0 -1
  270. package/.next/static/chunks/app/api/db/backfill-access/route-16ca2ed05a1d74d1.js +0 -1
  271. package/.next/static/chunks/app/api/db/position/route-16ca2ed05a1d74d1.js +0 -1
  272. package/.next/static/chunks/app/api/db/prune-planned/route-16ca2ed05a1d74d1.js +0 -1
  273. package/.next/static/chunks/app/api/db/reconcile-endpoints/route-16ca2ed05a1d74d1.js +0 -1
  274. package/.next/static/chunks/app/api/db/relations/[id]/route-16ca2ed05a1d74d1.js +0 -1
  275. package/.next/static/chunks/app/api/db/tables/[id]/route-16ca2ed05a1d74d1.js +0 -1
  276. package/.next/static/chunks/app/api/draft/approve/route-16ca2ed05a1d74d1.js +0 -1
  277. package/.next/static/chunks/app/api/draft/route-16ca2ed05a1d74d1.js +0 -1
  278. package/.next/static/chunks/app/api/draft/status/route-16ca2ed05a1d74d1.js +0 -1
  279. package/.next/static/chunks/app/api/edges/[id]/route-16ca2ed05a1d74d1.js +0 -1
  280. package/.next/static/chunks/app/api/edges/route-16ca2ed05a1d74d1.js +0 -1
  281. package/.next/static/chunks/app/api/endpoints/[id]/route-16ca2ed05a1d74d1.js +0 -1
  282. package/.next/static/chunks/app/api/entities/route-16ca2ed05a1d74d1.js +0 -1
  283. package/.next/static/chunks/app/api/feedback/[id]/route-16ca2ed05a1d74d1.js +0 -1
  284. package/.next/static/chunks/app/api/feedback/[id]/vote/route-16ca2ed05a1d74d1.js +0 -1
  285. package/.next/static/chunks/app/api/feedback/route-16ca2ed05a1d74d1.js +0 -1
  286. package/.next/static/chunks/app/api/ingest/route-16ca2ed05a1d74d1.js +0 -1
  287. package/.next/static/chunks/app/api/init/route-16ca2ed05a1d74d1.js +0 -1
  288. package/.next/static/chunks/app/api/map/describe/route-16ca2ed05a1d74d1.js +0 -1
  289. package/.next/static/chunks/app/api/map/files/route-16ca2ed05a1d74d1.js +0 -1
  290. package/.next/static/chunks/app/api/map/finish/route-16ca2ed05a1d74d1.js +0 -1
  291. package/.next/static/chunks/app/api/map/route-16ca2ed05a1d74d1.js +0 -1
  292. package/.next/static/chunks/app/api/map/start/route-16ca2ed05a1d74d1.js +0 -1
  293. package/.next/static/chunks/app/api/map/touch-active/route-16ca2ed05a1d74d1.js +0 -1
  294. package/.next/static/chunks/app/api/nodes/[id]/position/route-16ca2ed05a1d74d1.js +0 -1
  295. package/.next/static/chunks/app/api/nodes/[id]/route-16ca2ed05a1d74d1.js +0 -1
  296. package/.next/static/chunks/app/api/nodes/positions/route-16ca2ed05a1d74d1.js +0 -1
  297. package/.next/static/chunks/app/api/nodes/route-16ca2ed05a1d74d1.js +0 -1
  298. package/.next/static/chunks/app/api/nodes/subtasks/route-16ca2ed05a1d74d1.js +0 -1
  299. package/.next/static/chunks/app/api/notes/[id]/route-16ca2ed05a1d74d1.js +0 -1
  300. package/.next/static/chunks/app/api/notes/route-16ca2ed05a1d74d1.js +0 -1
  301. package/.next/static/chunks/app/api/open/route-16ca2ed05a1d74d1.js +0 -1
  302. package/.next/static/chunks/app/api/plan/annotations/route-16ca2ed05a1d74d1.js +0 -1
  303. package/.next/static/chunks/app/api/plan/approve/route-16ca2ed05a1d74d1.js +0 -1
  304. package/.next/static/chunks/app/api/plan/history/route-16ca2ed05a1d74d1.js +0 -1
  305. package/.next/static/chunks/app/api/plan/markdown/route-16ca2ed05a1d74d1.js +0 -1
  306. package/.next/static/chunks/app/api/plan/presence/route-16ca2ed05a1d74d1.js +0 -1
  307. package/.next/static/chunks/app/api/plan/route-16ca2ed05a1d74d1.js +0 -1
  308. package/.next/static/chunks/app/api/plan/verdict/route-16ca2ed05a1d74d1.js +0 -1
  309. package/.next/static/chunks/app/api/preferences/route-16ca2ed05a1d74d1.js +0 -1
  310. package/.next/static/chunks/app/api/project-meta/route-16ca2ed05a1d74d1.js +0 -1
  311. package/.next/static/chunks/app/api/reset/route-16ca2ed05a1d74d1.js +0 -1
  312. package/.next/static/chunks/app/api/stream/route-16ca2ed05a1d74d1.js +0 -1
  313. package/.next/static/chunks/app/api/tab/nav/route-16ca2ed05a1d74d1.js +0 -1
  314. package/.next/static/chunks/app/api/tab/presence/route-16ca2ed05a1d74d1.js +0 -1
  315. package/.next/static/chunks/app/api/telemetry/route-16ca2ed05a1d74d1.js +0 -1
  316. package/.next/static/chunks/app/api/telemetry/stats/route-16ca2ed05a1d74d1.js +0 -1
  317. package/.next/static/chunks/app/api/version/route-16ca2ed05a1d74d1.js +0 -1
  318. package/.next/static/chunks/app/api/workspace/activate/route-16ca2ed05a1d74d1.js +0 -1
  319. package/.next/static/chunks/app/api/workspace/route-16ca2ed05a1d74d1.js +0 -1
  320. package/.next/static/chunks/app/settings/page-67cab634be8bfef2.js +0 -1
  321. package/.next/static/chunks/next/dist/client/components/builtin/app-error-16ca2ed05a1d74d1.js +0 -1
  322. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-16ca2ed05a1d74d1.js +0 -1
  323. package/.next/static/chunks/next/dist/client/components/builtin/not-found-16ca2ed05a1d74d1.js +0 -1
  324. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-16ca2ed05a1d74d1.js +0 -1
  325. package/.next/static/css/2d019ca6e0582481.css +0 -1
  326. /package/.next/static/{5zLktwn2nHj-40t2fVml_ → gNMdQmtkjPn6XQhRMDoMg}/_ssgManifest.js +0 -0
package/dist/bin/plan.js CHANGED
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- var gZ=Object.defineProperty;var FZ=(Q)=>Q;function RZ(Q,Z){this[Q]=FZ.bind(null,Z)}var YQ=(Q,Z)=>{for(var $ in Z)gZ(Q,$,{get:Z[$],enumerable:!0,configurable:!0,set:RZ.bind(Z,$)})};var M=(Q,Z)=>()=>(Q&&(Z=Q(Q=0)),Z);var qQ={};YQ(qQ,{removeRepoAssets:()=>bZ,installRefreshSkill:()=>wZ,installPlanSkill:()=>AZ,installInitSkill:()=>uZ,installCodexRepoSkills:()=>fZ,ensureWorkflowDoc:()=>DZ,ensureMcp:()=>IZ,auditRepo:()=>OZ,REFRESH_SKILL:()=>VQ,PLAN_SKILL:()=>OQ,INIT_SKILL:()=>JQ});import{existsSync as v,mkdirSync as f,readFileSync as G,rmSync as E,writeFileSync as H}from"fs";import{join as U}from"path";function uZ(Q){let Z=U(Q,".claude","skills","beacon-init");f(Z,{recursive:!0});let $=U(Z,"SKILL.md");return H($,JQ),$}function wZ(Q){let Z=U(Q,".claude","skills","beacon-refresh");f(Z,{recursive:!0});let $=U(Z,"SKILL.md");return H($,VQ),$}function AZ(Q){let Z=U(Q,".claude","skills","beacon-plan");f(Z,{recursive:!0});let $=U(Z,"SKILL.md");return H($,OQ),$}function fZ(Q){let Z=[];for(let $ of EZ){let Y=U(Q,".agents","skills",$.name);f(Y,{recursive:!0});let J=U(Y,"SKILL.md");H(J,$.body()),Z.push(J)}return Z}function DZ(Q){let Z=U(Q,"AGENTS.md"),$="";try{$=G(Z,"utf8")}catch{}let Y=new RegExp(`${D}[\\s\\S]*?${zQ}`);$=Y.test($)?$.replace(Y,IQ):`${$.trim()}
3
+ var FZ=Object.defineProperty;var RZ=(Q)=>Q;function uZ(Q,Z){this[Q]=RZ.bind(null,Z)}var YQ=(Q,Z)=>{for(var $ in Z)FZ(Q,$,{get:Z[$],enumerable:!0,configurable:!0,set:uZ.bind(Z,$)})};var M=(Q,Z)=>()=>(Q&&(Z=Q(Q=0)),Z);var qQ={};YQ(qQ,{removeRepoAssets:()=>yZ,installRefreshSkill:()=>AZ,installPlanSkill:()=>EZ,installInitSkill:()=>wZ,installCodexRepoSkills:()=>DZ,ensureWorkflowDoc:()=>OZ,ensureMcp:()=>IZ,auditRepo:()=>bZ,REFRESH_SKILL:()=>VQ,PLAN_SKILL:()=>IQ,INIT_SKILL:()=>JQ});import{existsSync as v,mkdirSync as f,readFileSync as G,rmSync as E,writeFileSync as H}from"fs";import{join as U}from"path";function wZ(Q){let Z=U(Q,".claude","skills","beacon-init");f(Z,{recursive:!0});let $=U(Z,"SKILL.md");return H($,JQ),$}function AZ(Q){let Z=U(Q,".claude","skills","beacon-refresh");f(Z,{recursive:!0});let $=U(Z,"SKILL.md");return H($,VQ),$}function EZ(Q){let Z=U(Q,".claude","skills","beacon-plan");f(Z,{recursive:!0});let $=U(Z,"SKILL.md");return H($,IQ),$}function DZ(Q){let Z=[];for(let $ of fZ){let Y=U(Q,".agents","skills",$.name);f(Y,{recursive:!0});let J=U(Y,"SKILL.md");H(J,$.body()),Z.push(J)}return Z}function OZ(Q){let Z=U(Q,"AGENTS.md"),$="";try{$=G(Z,"utf8")}catch{}let Y=new RegExp(`${D}[\\s\\S]*?${zQ}`);$=Y.test($)?$.replace(Y,OQ):`${$.trim()}
4
4
 
5
- ${IQ}
5
+ ${OQ}
6
6
  `.trimStart(),H(Z,$.endsWith(`
7
7
  `)?$:`${$}
8
8
  `);let J=U(Q,"CLAUDE.md"),V="";try{V=G(J,"utf8")}catch{}if(!/@AGENTS\.md/.test(V))H(J,`${V?`${V.trim()}
9
9
 
10
10
  `:""}@AGENTS.md
11
11
  `)}function IZ(Q){let Z=U(Q,".mcp.json"),$={};try{$=JSON.parse(G(Z,"utf8"))}catch{}if($.mcpServers=$.mcpServers??{},$.mcpServers.beacon)return{path:Z,added:!1};return $.mcpServers.beacon={command:"beacon",args:["mcp"]},H(Z,JSON.stringify($,null,2)+`
12
- `),{path:Z,added:!0}}function OZ(Q){let Z=U(Q,".mcp.json"),$=!1;try{$=!!JSON.parse(G(Z,"utf8")).mcpServers?.beacon}catch{}let Y=!1;try{Y=G(U(Q,"AGENTS.md"),"utf8").includes(D)}catch{}let J=!1;try{J=/@AGENTS\.md/.test(G(U(Q,"CLAUDE.md"),"utf8"))}catch{}return{repo:Q,mcpRegistered:$,agentsMdBlock:Y,claudeMdImport:J,skills:{"beacon-init":v(U(Q,".claude","skills","beacon-init","SKILL.md")),"beacon-refresh":v(U(Q,".claude","skills","beacon-refresh","SKILL.md"))},codexSkills:{"beacon-init":v(U(Q,".agents","skills","beacon-init","SKILL.md")),"beacon-refresh":v(U(Q,".agents","skills","beacon-refresh","SKILL.md"))}}}function bZ(Q){let Z=[];for(let z of["beacon-init","beacon-refresh","beacon-db-design"]){let W=U(Q,".claude","skills",z);if(v(W))E(W,{recursive:!0,force:!0}),Z.push(z)}for(let z of["beacon-init","beacon-refresh"]){let W=U(Q,".agents","skills",z);if(v(W))E(W,{recursive:!0,force:!0}),Z.push(`codex:${z}`)}let $=!1,Y=U(Q,".mcp.json");try{let z=JSON.parse(G(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)E(Y,{force:!0});else H(Y,JSON.stringify(z,null,2)+`
12
+ `),{path:Z,added:!0}}function bZ(Q){let Z=U(Q,".mcp.json"),$=!1;try{$=!!JSON.parse(G(Z,"utf8")).mcpServers?.beacon}catch{}let Y=!1;try{Y=G(U(Q,"AGENTS.md"),"utf8").includes(D)}catch{}let J=!1;try{J=/@AGENTS\.md/.test(G(U(Q,"CLAUDE.md"),"utf8"))}catch{}return{repo:Q,mcpRegistered:$,agentsMdBlock:Y,claudeMdImport:J,skills:{"beacon-init":v(U(Q,".claude","skills","beacon-init","SKILL.md")),"beacon-refresh":v(U(Q,".claude","skills","beacon-refresh","SKILL.md"))},codexSkills:{"beacon-init":v(U(Q,".agents","skills","beacon-init","SKILL.md")),"beacon-refresh":v(U(Q,".agents","skills","beacon-refresh","SKILL.md"))}}}function yZ(Q){let Z=[];for(let z of["beacon-init","beacon-refresh","beacon-db-design"]){let W=U(Q,".claude","skills",z);if(v(W))E(W,{recursive:!0,force:!0}),Z.push(z)}for(let z of["beacon-init","beacon-refresh"]){let W=U(Q,".agents","skills",z);if(v(W))E(W,{recursive:!0,force:!0}),Z.push(`codex:${z}`)}let $=!1,Y=U(Q,".mcp.json");try{let z=JSON.parse(G(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)E(Y,{force:!0});else H(Y,JSON.stringify(z,null,2)+`
13
13
  `)}}catch{}let J=!1,V=U(Q,"AGENTS.md");try{let z=G(V,"utf8"),W=new RegExp(`\\n?${D}[\\s\\S]*?${zQ}\\n?`);if(W.test(z)){let B=z.replace(W,`
14
14
  `).replace(/\n{3,}/g,`
15
15
 
@@ -101,7 +101,7 @@ The one caveat: if the user manually edited an INIT-source node on the canvas (e
101
101
  If \`beacon_entities\` or \`beacon_init_persist\` isn't available, the Beacon panel isn't running in this repo. Tell the user to run \`beacon\` here first, then re-invoke /beacon-refresh.
102
102
 
103
103
  After the tool returns, report the final counts plus a one-line summary of the diff you surfaced.
104
- `,OQ=`---
104
+ `,IQ=`---
105
105
  name: beacon-plan
106
106
  description: Present your current plan or approach to the user on Beacon's /plan canvas for review \u2014 instead of asking for approval in prose. Use when the user says "present the plan", "show me the plan", "let me see it / the plan", or whenever you are about to end a turn asking whether to proceed with a plan, design, or approach.
107
107
  ---
@@ -129,6 +129,12 @@ Beacon extracts that block deterministically, strips it from the prose, and rend
129
129
  board on /plan. The board is built ONLY from the block \u2014 prose is never parsed \u2014 so mirror EVERY
130
130
  table/endpoint/feature you mention in the prose into the block, or that board will be empty.
131
131
 
132
+ - **Declare your scope.** List the repo-relative files this plan will touch in a top-level
133
+ \`"contract"\` array in the block (or the \`contract\` arg of \`beacon_propose_plan\`). When the user
134
+ has the plan scope-guard enabled, those files are frozen at approval and you're held to them while
135
+ implementing \u2014 editing an undeclared file pauses for the user's authorization (which then adds it
136
+ to the contract). Harmless when the guard is off. Declare the files you genuinely expect to edit.
137
+
132
138
  \`beacon_present_plan\` opens /plan and BLOCKS until the user clicks Approve / Discard / submits
133
139
  feedback, then returns their verdict. Implement code or migrations ONLY after it returns approval.
134
140
  If it returns feedback, revise and call it again.
@@ -143,7 +149,7 @@ If it returns feedback, revise and call it again.
143
149
  If \`beacon_present_plan\` isn't available, the panel isn't wired here \u2014 fall back to ExitPlanMode
144
150
  with the same \`\`\`beacon block (Claude Code only; Codex has no ExitPlanMode), or tell the user to
145
151
  run \`beacon\` in this repo once.
146
- `,EZ,D="<!-- beacon:workflow:start -->",zQ="<!-- beacon:workflow:end -->",IQ;var XQ=M(()=>{EZ=[{name:"beacon-init",body:()=>JQ},{name:"beacon-refresh",body:()=>VQ}];IQ=`${D}
152
+ `,fZ,D="<!-- beacon:workflow:start -->",zQ="<!-- beacon:workflow:end -->",OQ;var XQ=M(()=>{fZ=[{name:"beacon-init",body:()=>JQ},{name:"beacon-refresh",body:()=>VQ}];OQ=`${D}
147
153
  ## Beacon \u2014 feature workflow
148
154
 
149
155
  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:
@@ -201,18 +207,18 @@ Register them all in that single batched call. If a plan added five features, th
201
207
  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.
202
208
 
203
209
  Pull raw planning data anytime with \`beacon_entities\` (features / architecture / tables / endpoints).
204
- ${zQ}`});import{existsSync as bQ,mkdirSync as UQ,readFileSync as O,rmSync as yZ,writeFileSync as b}from"fs";import{dirname as yQ,join as I}from"path";function WQ(Q){try{return JSON.parse(O(Q,"utf8"))}catch{return{}}}function LQ(Q,Z){UQ(yQ(Q),{recursive:!0}),b(Q,JSON.stringify(Z,null,2)+`
210
+ ${zQ}`});import{existsSync as bQ,mkdirSync as UQ,readFileSync as I,rmSync as LZ,writeFileSync as b}from"fs";import{dirname as yQ,join as O}from"path";function WQ(Q){try{return JSON.parse(I(Q,"utf8"))}catch{return{}}}function LQ(Q,Z){UQ(yQ(Q),{recursive:!0}),b(Q,JSON.stringify(Z,null,2)+`
205
211
  `)}function L(Q,Z){let $=WQ(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}]}),LQ(Q,$),!0}function k(Q,Z){return(WQ(Q).hooks?.[Z.event]??[]).some((J)=>J.hooks?.some((V)=>V.command===Z.command))}function _(Q,Z){let $=WQ(Q),Y=$.hooks?.[Z.event];if(!Y)return!1;let J=!1,V=Y.map((q)=>{let X=q.hooks?.length??0,z=(q.hooks??[]).filter((W)=>W.command!==Z.command);if(z.length!==X)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 LQ(Q,$),!0}function S(Q,Z,$,Y){let J=`${Z}
206
212
  ${Y.trim()}
207
- ${$}`,V="";try{V=O(Q,"utf8")}catch{}let q=new RegExp(`${Z}[\\s\\S]*?${$}`);V=q.test(V)?V.replace(q,J):V.trim()?`${V.trim()}
213
+ ${$}`,V="";try{V=I(Q,"utf8")}catch{}let q=new RegExp(`${Z}[\\s\\S]*?${$}`);V=q.test(V)?V.replace(q,J):V.trim()?`${V.trim()}
208
214
 
209
215
  ${J}
210
216
  `:`${J}
211
217
  `,UQ(yQ(Q),{recursive:!0}),b(Q,V.endsWith(`
212
218
  `)?V:`${V}
213
- `)}function T(Q,Z){try{return O(Q,"utf8").includes(Z)}catch{return!1}}function h(Q,Z,$){let Y="";try{Y=O(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,`
219
+ `)}function T(Q,Z){try{return I(Q,"utf8").includes(Z)}catch{return!1}}function h(Q,Z,$){let Y="";try{Y=I(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,`
214
220
 
215
- `).trimStart();return b(Q,V),!0}function m(Q,Z,$){let Y=I(Q,Z);UQ(Y,{recursive:!0});let J=I(Y,"SKILL.md");return b(J,$),J}function g(Q,Z){return bQ(I(Q,Z,"SKILL.md"))}function p(Q,Z){let $=I(Q,Z);if(!bQ($))return!1;return yZ($,{recursive:!0,force:!0}),!0}var x,y=`## Beacon (visual planning panel)
221
+ `).trimStart();return b(Q,V),!0}function m(Q,Z,$){let Y=O(Q,Z);UQ(Y,{recursive:!0});let J=O(Y,"SKILL.md");return b(J,$),J}function g(Q,Z){return bQ(O(Q,Z,"SKILL.md"))}function p(Q,Z){let $=O(Q,Z);if(!bQ($))return!1;return LZ($,{recursive:!0,force:!0}),!0}var x,y=`## Beacon (visual planning panel)
216
222
 
217
223
  This machine has Beacon installed \u2014 a local visual planning surface for the terminal-side
218
224
  agent. Beacon proposes feature plans (roadmap features + DB schema + endpoints) via MCP,
@@ -233,24 +239,24 @@ the user reviews on a canvas at /plan, and feedback flows back as the next round
233
239
  Feedback bundles inline annotations on the markdown PLUS any edits the user made directly
234
240
  on the /map and /db boards (added features, attached subtasks, edited columns, new
235
241
  endpoints). Treat board edits as the user's revision intent \u2014 re-propose matching them
236
- verbatim. Do NOT implement until the tool returns approval.`;var BQ=M(()=>{x=["beacon-init","beacon-refresh","beacon-plan"]});import{mkdirSync as LZ,renameSync as kZ,rmSync as _Z,writeFileSync as SZ}from"fs";import{dirname as hZ}from"path";function c(Q,Z){LZ(hZ(Q),{recursive:!0});let $=`${Q}.tmp`;try{SZ($,Z),kZ($,Q)}catch(Y){throw _Z($,{force:!0}),Y}}function j1(Q,Z,$=!1){c(Q,JSON.stringify(Z,null,$?2:void 0))}var kQ=()=>{};var dQ={};YQ(dQ,{setupCodexAssets:()=>lZ,removeCodexMcp:()=>lQ,removeCodexArtifacts:()=>nZ,hasCodexMcp:()=>xQ,ensureCodexMcp:()=>cQ,codexMcpProblem:()=>cZ,codexDetected:()=>hQ,auditCodex:()=>dZ,CODEX_HOOKS:()=>s});import{readFileSync as a}from"fs";import{homedir as mZ}from"os";import{join as u}from"path";function _Q(){return process.env.HOME||process.env.USERPROFILE||mZ()}function hQ(){if(process.env.BEACON_CODEX==="1")return!0;if(process.env.BEACON_CODEX==="0")return!1;if(HQ===void 0)HQ=Bun.which("codex")!==null;return HQ}function R(Q){try{return Bun.TOML.parse(Q)}catch{return null}}function xQ(){try{return Boolean(R(a(C(),"utf8"))?.mcp_servers?.beacon)}catch{return!1}}function cZ(){let Q="";try{Q=a(C(),"utf8")}catch{return null}let Z=R(Q);if(!Z)return`~/.codex/config.toml does not parse \u2014 ${F}`;if(Z.mcp_servers?.beacon)return null;if(/^\s*mcp_servers\s*=/m.test(Q))return`mcp_servers is an inline table \u2014 ${F}`;return null}function cQ(){let Q="",Z=!1;try{Q=a(C(),"utf8"),Z=!0}catch{}if(Z){let V=R(Q);if(!V)return{added:!1,error:`~/.codex/config.toml does not parse \u2014 ${F}`};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 ${F}`}}let $=!Q?"":Q.endsWith(`
242
+ verbatim. Do NOT implement until the tool returns approval.`;var BQ=M(()=>{x=["beacon-init","beacon-refresh","beacon-plan"]});import{mkdirSync as kZ,renameSync as _Z,rmSync as SZ,writeFileSync as hZ}from"fs";import{dirname as mZ}from"path";function c(Q,Z){kZ(mZ(Q),{recursive:!0});let $=`${Q}.tmp`;try{hZ($,Z),_Z($,Q)}catch(Y){throw SZ($,{force:!0}),Y}}function G1(Q,Z,$=!1){c(Q,JSON.stringify(Z,null,$?2:void 0))}var kQ=()=>{};var dQ={};YQ(dQ,{setupCodexAssets:()=>dZ,removeCodexMcp:()=>lQ,removeCodexArtifacts:()=>aZ,hasCodexMcp:()=>xQ,ensureCodexMcp:()=>cQ,codexMcpProblem:()=>lZ,codexDetected:()=>hQ,auditCodex:()=>nZ,CODEX_HOOKS:()=>s});import{readFileSync as a}from"fs";import{homedir as pZ}from"os";import{join as u}from"path";function _Q(){return process.env.HOME||process.env.USERPROFILE||pZ()}function hQ(){if(process.env.BEACON_CODEX==="1")return!0;if(process.env.BEACON_CODEX==="0")return!1;if(HQ===void 0)HQ=Bun.which("codex")!==null;return HQ}function R(Q){try{return Bun.TOML.parse(Q)}catch{return null}}function xQ(){try{return Boolean(R(a(C(),"utf8"))?.mcp_servers?.beacon)}catch{return!1}}function lZ(){let Q="";try{Q=a(C(),"utf8")}catch{return null}let Z=R(Q);if(!Z)return`~/.codex/config.toml does not parse \u2014 ${F}`;if(Z.mcp_servers?.beacon)return null;if(/^\s*mcp_servers\s*=/m.test(Q))return`mcp_servers is an inline table \u2014 ${F}`;return null}function cQ(){let Q="",Z=!1;try{Q=a(C(),"utf8"),Z=!0}catch{}if(Z){let V=R(Q);if(!V)return{added:!1,error:`~/.codex/config.toml does not parse \u2014 ${F}`};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 ${F}`}}let $=!Q?"":Q.endsWith(`
237
243
  `)?`
238
244
  `:`
239
245
 
240
- `,Y=Q+$+pZ;if(R(Y)?.mcp_servers?.beacon?.command!=="beacon")return{added:!1,error:`could not safely append [mcp_servers.beacon] \u2014 ${F}`};return c(C(),Y),{added:!0}}function lQ(){let Q="";try{Q=a(C(),"utf8")}catch{return{removed:!1}}let Z=Q.split(`
246
+ `,Y=Q+$+cZ;if(R(Y)?.mcp_servers?.beacon?.command!=="beacon")return{added:!1,error:`could not safely append [mcp_servers.beacon] \u2014 ${F}`};return c(C(),Y),{added:!0}}function lQ(){let Q="";try{Q=a(C(),"utf8")}catch{return{removed:!1}}let Z=Q.split(`
241
247
  `),$=Z.indexOf(mQ);if($===-1)return{removed:!1,skipped:xQ()};let Y=Z.indexOf(pQ,$);if(Y===-1)return{removed:!1,skipped:!0};Z.splice($,Y-$+1);let J=Z.join(`
242
248
  `).replace(/\n{3,}/g,`
243
249
 
244
- `).replace(/^\n+/,"");if(R(J)===null)return{removed:!1,skipped:!0};return c(C(),J),{removed:!0}}async function lZ(){let{INIT_SKILL:Q,REFRESH_SKILL:Z,PLAN_SKILL:$}=await Promise.resolve().then(() => (XQ(),qQ)),Y={"beacon-init":Q,"beacon-refresh":Z,"beacon-plan":$},J=[];for(let z of x){if(!g(d(),z))J.push(z);m(d(),z,Y[z])}let V=0;for(let z of s)if(L(GQ(),{event:z.event,matcher:z.matcher,command:z.command}))V++;let q=T(l(),n);S(l(),n,SQ,y);let X=cQ();return{skillsAdded:J,hooksAdded:V,agentsMdBlockTouched:!q,mcp:X}}function dZ(){let Q={};for(let $ of x)Q[$]=g(d(),$);let Z={};for(let $ of s)Z[$.event]=k(GQ(),{event:$.event,command:$.command});return{detected:hQ(),skills:Q,hooks:Z,agentsMdBlock:T(l(),n),mcp:xQ()}}function nZ(){let Q=[];for(let J of x)if(p(d(),J))Q.push(J);let Z=0;for(let J of s)if(_(GQ(),{event:J.event,command:J.command}))Z++;let $=h(l(),n,SQ),Y=lQ();return{skillsRemoved:Q,hooksRemoved:Z,agentsMdBlockRemoved:$,mcpRemoved:Y.removed,mcpSkipped:Y.skipped}}var jQ=()=>u(_Q(),".codex"),GQ=()=>u(jQ(),"hooks.json"),C=()=>u(jQ(),"config.toml"),l=()=>u(jQ(),"AGENTS.md"),d=()=>u(_Q(),".agents","skills"),n="<!-- beacon:global:start -->",SQ="<!-- beacon:global:end -->",s,HQ,mQ="# beacon:start (managed by Beacon \u2014 `beacon uninstall` removes this block)",pQ="# beacon:end",pZ,F="add it manually: codex mcp add beacon -- beacon mcp";var nQ=M(()=>{BQ();kQ();s=[{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."}];pZ=`${mQ}
250
+ `).replace(/^\n+/,"");if(R(J)===null)return{removed:!1,skipped:!0};return c(C(),J),{removed:!0}}async function dZ(){let{INIT_SKILL:Q,REFRESH_SKILL:Z,PLAN_SKILL:$}=await Promise.resolve().then(() => (XQ(),qQ)),Y={"beacon-init":Q,"beacon-refresh":Z,"beacon-plan":$},J=[];for(let z of x){if(!g(d(),z))J.push(z);m(d(),z,Y[z])}let V=0;for(let z of s)if(L(GQ(),{event:z.event,matcher:z.matcher,command:z.command}))V++;let q=T(l(),n);S(l(),n,SQ,y);let X=cQ();return{skillsAdded:J,hooksAdded:V,agentsMdBlockTouched:!q,mcp:X}}function nZ(){let Q={};for(let $ of x)Q[$]=g(d(),$);let Z={};for(let $ of s)Z[$.event]=k(GQ(),{event:$.event,command:$.command});return{detected:hQ(),skills:Q,hooks:Z,agentsMdBlock:T(l(),n),mcp:xQ()}}function aZ(){let Q=[];for(let J of x)if(p(d(),J))Q.push(J);let Z=0;for(let J of s)if(_(GQ(),{event:J.event,command:J.command}))Z++;let $=h(l(),n,SQ),Y=lQ();return{skillsRemoved:Q,hooksRemoved:Z,agentsMdBlockRemoved:$,mcpRemoved:Y.removed,mcpSkipped:Y.skipped}}var jQ=()=>u(_Q(),".codex"),GQ=()=>u(jQ(),"hooks.json"),C=()=>u(jQ(),"config.toml"),l=()=>u(jQ(),"AGENTS.md"),d=()=>u(_Q(),".agents","skills"),n="<!-- beacon:global:start -->",SQ="<!-- beacon:global:end -->",s,HQ,mQ="# beacon:start (managed by Beacon \u2014 `beacon uninstall` removes this block)",pQ="# beacon:end",cZ,F="add it manually: codex mcp add beacon -- beacon mcp";var nQ=M(()=>{BQ();kQ();s=[{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."}];cZ=`${mQ}
245
251
  [mcp_servers.beacon]
246
252
  command = "beacon"
247
253
  args = ["mcp"]
248
254
  ${pQ}
249
- `});var iQ={};YQ(iQ,{provisionDb:()=>P0});import{createClient as V0}from"@libsql/client";import{drizzle as z0}from"drizzle-orm/libsql";import{migrate as q0}from"drizzle-orm/libsql/migrator";import{readMigrationFiles as X0}from"drizzle-orm/migrator";import{dirname as MQ,join as U0}from"path";import{fileURLToPath as W0}from"url";async function o(Q,Z){return(await Q.execute({sql:"SELECT 1 FROM sqlite_master WHERE type='table' AND name = ?",args:[Z]})).rows.length>0}async function G0(Q,Z){let $=await Q.execute(`PRAGMA table_info("${Z}")`);return new Set($.rows.map((Y)=>String(Y.name)))}async function oQ(Q){if(!await o(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 x0(Q){for(let[Z,$]of Object.entries(j0)){if(!await o(Q,Z))continue;let Y=await G0(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 P0(Q,Z=H0){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 o($,"__drizzle_migrations"),J=await o($,"Node"),V=!1;if(J&&!Y){let X=X0({migrationsFolder:Z})[0];if(X)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:[X.hash,X.folderMillis]}),V=!0}let q=await oQ($);if(await q0(z0($),{migrationsFolder:Z}),await oQ($)>q)V=!0;return await x0($),{migrated:V}}finally{$.close()}}var B0,H0,j0;var eQ=M(async()=>{B0=MQ(MQ(MQ(W0(import.meta.url)))),H0=process.env.BEACON_MIGRATIONS_DIR||U0(B0,"drizzle"),j0={Node:["createdAt","updatedAt"],Note:["createdAt","updatedAt"],DbTable:["createdAt","updatedAt"],Endpoint:["createdAt","updatedAt"],DraftTable:["createdAt"],SyncState:["codeGraphSyncedAt","updatedAt"],AppSetting:["updatedAt"],ProjectMeta:["updatedAt"],CodeFile:["updatedAt"]}});BQ();import{existsSync as aZ}from"fs";import{homedir as sZ}from"os";import{join as t}from"path";function tZ(){return process.env.HOME||process.env.USERPROFILE||sZ()}var r=()=>t(tZ(),".claude"),PQ=()=>t(r(),"skills"),KQ=()=>t(r(),"settings.json"),NQ=()=>t(r(),"CLAUDE.md"),vQ="<!-- beacon:global:start -->",aQ="<!-- beacon:global:end -->";var rZ=y,CQ=[{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 oZ(Q,Z){return m(PQ(),Q,Z)}function sQ(Q){return g(PQ(),Q)}function iZ(Q){return p(PQ(),Q)}function eZ(Q){return L(KQ(),Q)}function Q0(Q){return k(KQ(),Q)}function Z0(Q){return _(KQ(),Q)}function $0(Q){S(NQ(),vQ,aQ,Q)}function tQ(){return T(NQ(),vQ)}function Y0(){return h(NQ(),vQ,aQ)}function F1(){let Q={};for(let $ of x)Q[$]=sQ($);let Z={};for(let $ of CQ)Z[$.event]=Q0({event:$.event,command:$.command});return{homeExists:aZ(r()),skills:Q,hooks:Z,claudeMdBlock:tQ()}}async function J0(){let{INIT_SKILL:Q,REFRESH_SKILL:Z,PLAN_SKILL:$}=await Promise.resolve().then(() => (XQ(),qQ)),Y={"beacon-init":Q,"beacon-refresh":Z,"beacon-plan":$},J=[];for(let X of x){if(!sQ(X))J.push(X);oZ(X,Y[X])}let V=0;for(let X of CQ)if(eZ({event:X.event,matcher:X.matcher,command:X.command}))V++;let q=tQ();return $0(rZ),{skillsAdded:J,hooksAdded:V,claudeMdBlockTouched:!q}}async function rQ(){let Q;try{Q={ok:!0,...await J0()}}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(() => (nQ(),dQ));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 R1(){let Q=[];for(let Y of x)if(iZ(Y))Q.push(Y);let Z=0;for(let Y of CQ)if(Z0(Y))Z++;let $=Y0();return{skillsRemoved:Q,hooksRemoved:Z,claudeMdBlockRemoved:$}}import{AsyncLocalStorage as K0}from"async_hooks";import{spawnSync as N0}from"child_process";import{createHash as v0}from"crypto";import{existsSync as ZZ,mkdirSync as w,readFileSync as gQ,writeFileSync as FQ}from"fs";import{homedir as $Z}from"os";import{basename as C0,join as P,parse as M0,resolve as QZ}from"path";function j(){return process.env.BEACON_HOME||P($Z(),".beacon")}function RQ(){return P(j(),"workspaces.json")}function i(Q){return v0("sha256").update(Q).digest("hex").slice(0,12)}function S1(Q=process.cwd()){let Z=N0("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 YZ(Q){let Z=QZ(Q);return Z!==QZ($Z())&&Z!==M0(Z).root}function JZ(){return P(j(),"deleted.json")}function uQ(){try{let Q=JSON.parse(gQ(JZ(),"utf8"));return Array.isArray(Q)?Q:[]}catch{return[]}}function VZ(Q){w(j(),{recursive:!0}),FQ(JZ(),JSON.stringify(Q,null,2))}function zZ(Q){return uQ().includes(Q)}function h1(Q){let Z=uQ();if(!Z.includes(Q))VZ([...Z,Q])}function T0(Q){let Z=uQ();if(Z.includes(Q))VZ(Z.filter(($)=>$!==Q))}function e(Q){return P(j(),Q)}function g0(Q){return`file:${P(e(Q),"db.sqlite")}`}function A(){try{let Q=JSON.parse(gQ(RQ(),"utf8"));return Array.isArray(Q)?Q:[]}catch{return[]}}function wQ(Q){w(j(),{recursive:!0}),FQ(RQ(),JSON.stringify(Q,null,2))}function F0(){return A().sort((Q,Z)=>Z.lastOpenedAt.localeCompare(Q.lastOpenedAt))}function K(Q){return A().find((Z)=>Z.id===Q)??null}function qZ(Q,Z,$=new Date().toISOString()){if(!YZ(Q))throw Error(`beacon: refusing to register a non-repo path as a workspace: ${Q}`);let Y=i(Q);if(zZ(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||C0(Q),lastOpenedAt:$},X=[q,...J.filter((z)=>z.id!==Y)];return w(e(Y),{recursive:!0}),wQ(X),q}function m1(Q,Z){return T0(i(Q)),qZ(Q,Z)}function p1(Q,Z=new Date().toISOString()){let $=A(),Y=$.find((J)=>J.id===Q);if(!Y)return;Y.lastOpenedAt=Z,wQ($)}function c1(Q){if(wQ(A().filter((Z)=>Z.id!==Q)),AQ()===Q)R0(F0()[0]?.id??null)}function XZ(){return P(j(),"active")}function AQ(){try{return gQ(XZ(),"utf8").trim()||null}catch{return null}}function R0(Q){w(j(),{recursive:!0}),FQ(XZ(),Q??"")}function l1(){let Q=AQ();return Q?K(Q):null}function d1(){let Q=w0()??AQ();return Q?K(Q):null}function n1(Q){return K(Q)?.path??null}function a1(){return ZZ(RQ())}var UZ="beacon_ws";function WZ(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 s1(Q){let Z=Q.headers.get("x-beacon-workspace");if(Z&&K(Z))return Z;let $=WZ(Q,UZ);if($&&K($))return $;return null}var u0="x-beacon-workspace-path";async function t1(Q){let Z=Q.headers.get("x-beacon-workspace");if(Z&&K(Z))return Z;let $=Q.headers.get(u0);if($&&YZ($)&&!zZ(i($))&&(!Z||i($)===Z)){let J=qZ($);return await A0(J.id),J.id}let Y=WZ(Q,UZ);if(Y&&K(Y))return Y;return null}var BZ=new K0;function r1(Q,Z){return Q?BZ.run(Q,Z):Z()}function w0(){return BZ.getStore()??null}var TQ=new Set;function o1(Q){TQ.delete(P(e(Q),"db.sqlite"))}async function A0(Q){let Z=e(Q),$=P(Z,"db.sqlite"),Y=ZZ($);if(Y&&TQ.has($))return{ok:!0,created:!1,migrated:!1};try{w(Z,{recursive:!0});let{provisionDb:J}=await eQ().then(() => iQ),V=await J(g0(Q));return TQ.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 E0}from"net";var Q2=4319;function f0(Q,Z,$=400){return new Promise((Y)=>{let J=E0({host:Q,port:Z}),V=!1,q=(X)=>{if(V)return;V=!0,J.destroy(),Y(X)};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 f0(Z,Q))return!1;return!0}async function HZ(Q,Z=20){for(let $=Q;$<Q+Z;$++)if(await D0($))return $;return Q}import{execSync as S0,spawn as h0}from"child_process";import{mkdirSync as m0,openSync as p0,readFileSync as c0,writeFileSync as l0}from"fs";import{homedir as d0}from"os";import{dirname as n0,join as ZQ}from"path";import{fileURLToPath as a0}from"url";import{createHash as s0}from"crypto";var jZ=1500,GZ=345600000,$2=1800000,Y2=3000;import{mkdirSync as O0,readFileSync as b0,writeFileSync as y0}from"fs";import{join as L0}from"path";var I0=["default","acceptEdits","bypassPermissions","auto"];function xZ(Q){return typeof Q==="string"&&I0.includes(Q)}function PZ(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 KZ(){return L0(j(),"preferences.json")}function EQ(){try{let Q=JSON.parse(b0(KZ(),"utf8"));return{planApprovalMode:xZ(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={...EQ(),...Q};return O0(j(),{recursive:!0}),y0(KZ(),JSON.stringify(Z,null,2)),Z}function NZ(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`
255
+ `});var iQ={};YQ(iQ,{provisionDb:()=>K0});import{createClient as z0}from"@libsql/client";import{drizzle as q0}from"drizzle-orm/libsql";import{migrate as X0}from"drizzle-orm/libsql/migrator";import{readMigrationFiles as U0}from"drizzle-orm/migrator";import{dirname as MQ,join as W0}from"path";import{fileURLToPath as B0}from"url";async function o(Q,Z){return(await Q.execute({sql:"SELECT 1 FROM sqlite_master WHERE type='table' AND name = ?",args:[Z]})).rows.length>0}async function x0(Q,Z){let $=await Q.execute(`PRAGMA table_info("${Z}")`);return new Set($.rows.map((Y)=>String(Y.name)))}async function oQ(Q){if(!await o(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 P0(Q){for(let[Z,$]of Object.entries(G0)){if(!await o(Q,Z))continue;let Y=await x0(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 K0(Q,Z=j0){let $=z0({url:Q});try{await $.execute("PRAGMA journal_mode = WAL;"),await $.execute("PRAGMA foreign_keys = ON;"),await $.execute("PRAGMA busy_timeout = 5000;");let Y=await o($,"__drizzle_migrations"),J=await o($,"Node"),V=!1;if(J&&!Y){let X=U0({migrationsFolder:Z})[0];if(X)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:[X.hash,X.folderMillis]}),V=!0}let q=await oQ($);if(await X0(q0($),{migrationsFolder:Z}),await oQ($)>q)V=!0;return await P0($),{migrated:V}}finally{$.close()}}var H0,j0,G0;var eQ=M(async()=>{H0=MQ(MQ(MQ(B0(import.meta.url)))),j0=process.env.BEACON_MIGRATIONS_DIR||W0(H0,"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"]}});BQ();import{existsSync as sZ}from"fs";import{homedir as tZ}from"os";import{join as t}from"path";function rZ(){return process.env.HOME||process.env.USERPROFILE||tZ()}var r=()=>t(rZ(),".claude"),PQ=()=>t(r(),"skills"),KQ=()=>t(r(),"settings.json"),NQ=()=>t(r(),"CLAUDE.md"),vQ="<!-- beacon:global:start -->",aQ="<!-- beacon:global:end -->";var oZ=y,CQ=[{event:"PreToolUse",matcher:"Edit|Write|MultiEdit",command:"beacon guard",description:"Gate edits against the active plan's scope contract (when the scope-guard flag is on): in-scope \u2192 allow, off-scope \u2192 ask the user to authorize. No-op + fail-open otherwise."},{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 iZ(Q,Z){return m(PQ(),Q,Z)}function sQ(Q){return g(PQ(),Q)}function eZ(Q){return p(PQ(),Q)}function Q0(Q){return L(KQ(),Q)}function Z0(Q){return k(KQ(),Q)}function $0(Q){return _(KQ(),Q)}function Y0(Q){S(NQ(),vQ,aQ,Q)}function tQ(){return T(NQ(),vQ)}function J0(){return h(NQ(),vQ,aQ)}function R1(){let Q={};for(let $ of x)Q[$]=sQ($);let Z={};for(let $ of CQ)Z[$.event]=Z0({event:$.event,command:$.command});return{homeExists:sZ(r()),skills:Q,hooks:Z,claudeMdBlock:tQ()}}async function V0(){let{INIT_SKILL:Q,REFRESH_SKILL:Z,PLAN_SKILL:$}=await Promise.resolve().then(() => (XQ(),qQ)),Y={"beacon-init":Q,"beacon-refresh":Z,"beacon-plan":$},J=[];for(let X of x){if(!sQ(X))J.push(X);iZ(X,Y[X])}let V=0;for(let X of CQ)if(Q0({event:X.event,matcher:X.matcher,command:X.command}))V++;let q=tQ();return Y0(oZ),{skillsAdded:J,hooksAdded:V,claudeMdBlockTouched:!q}}async function rQ(){let Q;try{Q={ok:!0,...await V0()}}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(() => (nQ(),dQ));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 u1(){let Q=[];for(let Y of x)if(eZ(Y))Q.push(Y);let Z=0;for(let Y of CQ)if($0(Y))Z++;let $=J0();return{skillsRemoved:Q,hooksRemoved:Z,claudeMdBlockRemoved:$}}import{AsyncLocalStorage as N0}from"async_hooks";import{spawnSync as v0}from"child_process";import{createHash as C0}from"crypto";import{existsSync as ZZ,mkdirSync as w,readFileSync as gQ,writeFileSync as FQ}from"fs";import{homedir as $Z}from"os";import{basename as M0,join as P,parse as T0,resolve as QZ}from"path";function j(){return process.env.BEACON_HOME||P($Z(),".beacon")}function RQ(){return P(j(),"workspaces.json")}function i(Q){return C0("sha256").update(Q).digest("hex").slice(0,12)}function h1(Q=process.cwd()){let Z=v0("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 YZ(Q){let Z=QZ(Q);return Z!==QZ($Z())&&Z!==T0(Z).root}function JZ(){return P(j(),"deleted.json")}function uQ(){try{let Q=JSON.parse(gQ(JZ(),"utf8"));return Array.isArray(Q)?Q:[]}catch{return[]}}function VZ(Q){w(j(),{recursive:!0}),FQ(JZ(),JSON.stringify(Q,null,2))}function zZ(Q){return uQ().includes(Q)}function m1(Q){let Z=uQ();if(!Z.includes(Q))VZ([...Z,Q])}function g0(Q){let Z=uQ();if(Z.includes(Q))VZ(Z.filter(($)=>$!==Q))}function e(Q){return P(j(),Q)}function F0(Q){return`file:${P(e(Q),"db.sqlite")}`}function A(){try{let Q=JSON.parse(gQ(RQ(),"utf8"));return Array.isArray(Q)?Q:[]}catch{return[]}}function wQ(Q){w(j(),{recursive:!0}),FQ(RQ(),JSON.stringify(Q,null,2))}function qZ(){return A().sort((Q,Z)=>Z.lastOpenedAt.localeCompare(Q.lastOpenedAt))}function K(Q){return A().find((Z)=>Z.id===Q)??null}function XZ(Q,Z,$=new Date().toISOString()){if(!YZ(Q))throw Error(`beacon: refusing to register a non-repo path as a workspace: ${Q}`);let Y=i(Q);if(zZ(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||M0(Q),lastOpenedAt:$},X=[q,...J.filter((z)=>z.id!==Y)];return w(e(Y),{recursive:!0}),wQ(X),q}function p1(Q,Z){return g0(i(Q)),XZ(Q,Z)}function c1(Q,Z=new Date().toISOString()){let $=A(),Y=$.find((J)=>J.id===Q);if(!Y)return;Y.lastOpenedAt=Z,wQ($)}function l1(Q){if(wQ(A().filter((Z)=>Z.id!==Q)),AQ()===Q)R0(qZ()[0]?.id??null)}function UZ(){return P(j(),"active")}function AQ(){try{return gQ(UZ(),"utf8").trim()||null}catch{return null}}function R0(Q){w(j(),{recursive:!0}),FQ(UZ(),Q??"")}function d1(){let Q=AQ();return Q?K(Q):null}function n1(){let Q=A0()??AQ();return Q?K(Q):null}function a1(Q){return K(Q)?.path??null}function s1(){return ZZ(RQ())}var WZ="beacon_ws";function BZ(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 t1(Q){let Z=Q.headers.get("x-beacon-workspace");if(Z&&K(Z))return Z;let $=BZ(Q,WZ);if($&&K($))return $;return u0()}function u0(){let Q=qZ();return Q.length===1?Q[0].id:null}var w0="x-beacon-workspace-path";async function r1(Q){let Z=Q.headers.get("x-beacon-workspace");if(Z&&K(Z))return Z;let $=Q.headers.get(w0);if($&&YZ($)&&!zZ(i($))&&(!Z||i($)===Z)){let J=XZ($);return await E0(J.id),J.id}let Y=BZ(Q,WZ);if(Y&&K(Y))return Y;return null}var HZ=new N0;function o1(Q,Z){return Q?HZ.run(Q,Z):Z()}function A0(){return HZ.getStore()??null}var TQ=new Set;function i1(Q){TQ.delete(P(e(Q),"db.sqlite"))}async function E0(Q){let Z=e(Q),$=P(Z,"db.sqlite"),Y=ZZ($);if(Y&&TQ.has($))return{ok:!0,created:!1,migrated:!1};try{w(Z,{recursive:!0});let{provisionDb:J}=await eQ().then(() => iQ),V=await J(F0(Q));return TQ.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 f0}from"net";var Z2=4319;function D0(Q,Z,$=400){return new Promise((Y)=>{let J=f0({host:Q,port:Z}),V=!1,q=(X)=>{if(V)return;V=!0,J.destroy(),Y(X)};J.once("connect",()=>q(!0)),J.once("error",()=>q(!1)),J.setTimeout($,()=>q(!1))})}async function O0(Q){for(let Z of["127.0.0.1","::1"])if(await D0(Z,Q))return!1;return!0}async function jZ(Q,Z=20){for(let $=Q;$<Q+Z;$++)if(await O0($))return $;return Q}import{execSync as h0,spawn as m0}from"child_process";import{mkdirSync as p0,openSync as c0,readFileSync as l0,writeFileSync as d0}from"fs";import{homedir as n0}from"os";import{dirname as a0,join as ZQ}from"path";import{fileURLToPath as s0}from"url";import{createHash as t0}from"crypto";var GZ=1500,xZ=345600000,Y2=1800000,J2=3000;import{mkdirSync as b0,readFileSync as y0,writeFileSync as L0}from"fs";import{join as k0}from"path";var I0=["default","acceptEdits","bypassPermissions","auto"];function PZ(Q){return typeof Q==="string"&&I0.includes(Q)}function KZ(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 NZ(){return k0(j(),"preferences.json")}function EQ(){try{let Q=JSON.parse(y0(NZ(),"utf8"));return{planApprovalMode:PZ(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 B2(Q){let Z={...EQ(),...Q};return b0(j(),{recursive:!0}),L0(NZ(),JSON.stringify(Z,null,2)),Z}function vZ(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`
250
256
 
251
257
  This plan created these roadmap feature(s):
252
258
  `+Z.join(`
253
- `)+"\n\nWhen the work ships, register them in ONE call: `beacon_describe_feature` 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 k0}from"child_process";import{platform as vZ}from"os";function _0(Q){if(process.env.BEACON_NO_OPEN)return;let Z=vZ()==="darwin"?"open":vZ()==="win32"?"start":"xdg-open";try{k0(`${Z} "${Q}"`,{stdio:"ignore"})}catch{}}async function CZ(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}`);_0(`${Q}/api/workspace/activate?id=${Z}&redirect=${Y}`)}var t0=ZQ(n0(a0(import.meta.url)),".."),DQ=process.env.BEACON_HOME||ZQ(d0(),".beacon"),MZ=ZQ(DQ,"server.json"),r0=process.env.PORT||"4319";function o0(Q){try{return process.kill(Q,0),!0}catch{return!1}}function i0(Q){try{return JSON.parse(c0(Q,"utf8"))}catch{return null}}async function TZ(Q){try{return(await fetch(Q)).ok}catch{return!1}}async function e0(Q,Z=60){for(let $=0;$<Z;$++){if(await TZ(Q))return!0;await new Promise((Y)=>setTimeout(Y,500))}return!1}function Q1(Q){m0(DQ,{recursive:!0});let Z=p0(ZQ(DQ,"server.log"),"a"),$={...process.env,PORT:Q,BEACON_NO_OPEN:"1"};delete $.BEACON_REPO,delete $.BEACON_DATA_DIR,delete $.DATABASE_URL;let Y=h0("bun",["run","dev"],{cwd:t0,env:$,detached:!0,stdio:["ignore",Z,Z]});Y.unref();let J={pid:Y.pid??0,port:Q};return l0(MZ,JSON.stringify(J)),J}async function Z1(){let Q=i0(MZ);if(Q&&o0(Q.pid)&&await TZ(`http://localhost:${Q.port}/api/workspace`))return Q.port;let Z=String(await HZ(Number(r0))),{port:$}=Q1(Z);return await e0(`http://localhost:${$}/api/workspace`),$}function $1(){try{return S0("git rev-parse --show-toplevel",{cwd:process.cwd(),stdio:["ignore","pipe","ignore"]}).toString().trim()}catch{return""}}function Y1(Q){return s0("sha256").update(Q).digest("hex").slice(0,12)}async function J1(){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 fQ(Q,Z){return PZ(Q,Z)}function QQ(Q){return{hookSpecificOutput:{hookEventName:"PermissionRequest",decision:{behavior:"deny",message:Q}}}}function N(Q){process.stdout.write(JSON.stringify(Q)),process.exit(0)}(async()=>{await rQ();let Z=(await J1())?.tool_input?.plan;if(!Z||!Z.trim())N(fQ());let Y=`http://localhost:${await Z1()}`,J=$1()||process.cwd(),V=Y1(J);await fetch(`${Y}/api/workspace/activate?id=${V}`).catch(()=>{});let q=Z.split(`
254
- `,1)[0]?.replace(/^#+\s*/,"").slice(0,160)||"Plan review",X=await fetch(`${Y}/api/plan`,{method:"POST",headers:{"content-type":"application/json","x-beacon-workspace":V},body:JSON.stringify({description:q,markdown:Z})});if(X.status===422){let B=await X.json().catch(()=>({}));N(QQ(B.error??"Beacon rejected the plan: every roadmap feature needs a category and a priority. Add them and re-present."))}if(!X.ok)N(fQ());await CZ(Y,V);let z=Date.now()+GZ,W=(B)=>new Promise(($Q)=>setTimeout($Q,B));while(Date.now()<z){await W(jZ);let B=await fetch(`${Y}/api/plan/verdict`,{headers:{"x-beacon-workspace":V}}).then(($Q)=>$Q.json()).catch(()=>null);if(!B)continue;if(B.kind==="approved")N(fQ(EQ().planApprovalMode,NZ(B.features)));if(B.kind==="discarded")N(QQ("The user discarded the plan in Beacon. Ask what they want to adjust before re-presenting."));if(B.kind==="feedback")N(QQ(`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):
259
+ `)+"\n\nWhen the work ships, register them in ONE call: `beacon_describe_feature` 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 _0}from"child_process";import{platform as CZ}from"os";function S0(Q){if(process.env.BEACON_NO_OPEN)return;let Z=CZ()==="darwin"?"open":CZ()==="win32"?"start":"xdg-open";try{_0(`${Z} "${Q}"`,{stdio:"ignore"})}catch{}}async function MZ(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}`);S0(`${Q}/api/workspace/activate?id=${Z}&redirect=${Y}`)}var r0=ZQ(a0(s0(import.meta.url)),".."),DQ=process.env.BEACON_HOME||ZQ(n0(),".beacon"),TZ=ZQ(DQ,"server.json"),o0=process.env.PORT||"4319";function i0(Q){try{return process.kill(Q,0),!0}catch{return!1}}function e0(Q){try{return JSON.parse(l0(Q,"utf8"))}catch{return null}}async function gZ(Q){try{return(await fetch(Q)).ok}catch{return!1}}async function Q1(Q,Z=60){for(let $=0;$<Z;$++){if(await gZ(Q))return!0;await new Promise((Y)=>setTimeout(Y,500))}return!1}function Z1(Q){p0(DQ,{recursive:!0});let Z=c0(ZQ(DQ,"server.log"),"a"),$={...process.env,PORT:Q,BEACON_NO_OPEN:"1"};delete $.BEACON_REPO,delete $.BEACON_DATA_DIR,delete $.DATABASE_URL;let Y=m0("bun",["run","dev"],{cwd:r0,env:$,detached:!0,stdio:["ignore",Z,Z]});Y.unref();let J={pid:Y.pid??0,port:Q};return d0(TZ,JSON.stringify(J)),J}async function $1(){let Q=e0(TZ);if(Q&&i0(Q.pid)&&await gZ(`http://localhost:${Q.port}/api/workspace`))return Q.port;let Z=String(await jZ(Number(o0))),{port:$}=Z1(Z);return await Q1(`http://localhost:${$}/api/workspace`),$}function Y1(){try{return h0("git rev-parse --show-toplevel",{cwd:process.cwd(),stdio:["ignore","pipe","ignore"]}).toString().trim()}catch{return""}}function J1(Q){return t0("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 fQ(Q,Z){return KZ(Q,Z)}function QQ(Q){return{hookSpecificOutput:{hookEventName:"PermissionRequest",decision:{behavior:"deny",message:Q}}}}function N(Q){process.stdout.write(JSON.stringify(Q)),process.exit(0)}(async()=>{await rQ();let Z=(await V1())?.tool_input?.plan;if(!Z||!Z.trim())N(fQ());let Y=`http://localhost:${await $1()}`,J=Y1()||process.cwd(),V=J1(J);await fetch(`${Y}/api/workspace/activate?id=${V}`).catch(()=>{});let q=Z.split(`
260
+ `,1)[0]?.replace(/^#+\s*/,"").slice(0,160)||"Plan review",X=await fetch(`${Y}/api/plan`,{method:"POST",headers:{"content-type":"application/json","x-beacon-workspace":V},body:JSON.stringify({description:q,markdown:Z})});if(X.status===422){let B=await X.json().catch(()=>({}));N(QQ(B.error??"Beacon rejected the plan: every roadmap feature needs a category and a priority. Add them and re-present."))}if(!X.ok)N(fQ());await MZ(Y,V);let z=Date.now()+xZ,W=(B)=>new Promise(($Q)=>setTimeout($Q,B));while(Date.now()<z){await W(GZ);let B=await fetch(`${Y}/api/plan/verdict`,{headers:{"x-beacon-workspace":V}}).then(($Q)=>$Q.json()).catch(()=>null);if(!B)continue;if(B.kind==="approved")N(fQ(EQ().planApprovalMode,vZ(B.features)));if(B.kind==="discarded")N(QQ("The user discarded the plan in Beacon. Ask what they want to adjust before re-presenting."));if(B.kind==="feedback")N(QQ(`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):
255
261
 
256
262
  `+B.feedback))}N(QQ("Beacon plan review timed out without a verdict. Re-present the plan and ask the user to review it."))})();
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- var g5=Object.defineProperty;var h5=(Z)=>Z;function b5(Z,$){this[Z]=h5.bind(null,$)}var wZ=(Z,$)=>{for(var Q in $)g5(Z,Q,{get:$[Q],enumerable:!0,configurable:!0,set:b5.bind($,Q)})};var K4=(Z,$)=>()=>(Z&&($=Z(Z=0)),$);var Y4={};wZ(Y4,{provisionDb:()=>t5});import{createClient as m5}from"@libsql/client";import{drizzle as p5}from"drizzle-orm/libsql";import{migrate as c5}from"drizzle-orm/libsql/migrator";import{readMigrationFiles as l5}from"drizzle-orm/migrator";import{dirname as yZ,join as d5}from"path";import{fileURLToPath as n5}from"url";async function _Z(Z,$){return(await Z.execute({sql:"SELECT 1 FROM sqlite_master WHERE type='table' AND name = ?",args:[$]})).rows.length>0}async function s5(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 _Z(Z,"__drizzle_migrations"))return 0;let $=await Z.execute('SELECT count(*) AS n FROM "__drizzle_migrations"');return Number($.rows[0]?.n??0)}async function a5(Z){for(let[$,Q]of Object.entries(i5)){if(!await _Z(Z,$))continue;let J=await s5(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 t5(Z,$=o5){let Q=m5({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 _Z(Q,"__drizzle_migrations"),V=await _Z(Q,"Node"),K=!1;if(V&&!J){let X=l5({migrationsFolder:$})[0];if(X)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:[X.hash,X.folderMillis]}),K=!0}let Y=await X4(Q);if(await c5(p5(Q),{migrationsFolder:$}),await X4(Q)>Y)K=!0;return await a5(Q),{migrated:K}}finally{Q.close()}}var r5,o5,i5;var G4=K4(async()=>{r5=yZ(yZ(yZ(n5(import.meta.url)))),o5=process.env.BEACON_MIGRATIONS_DIR||d5(r5,"drizzle"),i5={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 d7,renameSync as n7,rmSync as r7,writeFileSync as o7}from"fs";import{dirname as i7}from"path";function s7(Z,$){d7(i7(Z),{recursive:!0});let Q=`${Z}.tmp`;try{o7(Q,$),n7(Q,Z)}catch(J){throw r7(Q,{force:!0}),J}}function a7(Z,$,Q=!1){s7(Z,JSON.stringify($,null,Q?2:void 0))}var q5=()=>{};import{AsyncLocalStorage as e5}from"async_hooks";import{spawnSync as Z6}from"child_process";import{createHash as $6}from"crypto";import{existsSync as j4,mkdirSync as LZ,readFileSync as uZ,writeFileSync as xZ}from"fs";import{homedir as U4}from"os";import{basename as Q6,join as ZZ,parse as J6,resolve as M4}from"path";function a(){return process.env.BEACON_HOME||ZZ(U4(),".beacon")}function gZ(){return ZZ(a(),"workspaces.json")}function QZ(Z){return $6("sha256").update(Z).digest("hex").slice(0,12)}function hZ(Z=process.cwd()){let $=Z6("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 H4(Z){let $=M4(Z);return $!==M4(U4())&&$!==J6($).root}function W4(){return ZZ(a(),"deleted.json")}function bZ(){try{let Z=JSON.parse(uZ(W4(),"utf8"));return Array.isArray(Z)?Z:[]}catch{return[]}}function L4(Z){LZ(a(),{recursive:!0}),xZ(W4(),JSON.stringify(Z,null,2))}function C4(Z){return bZ().includes(Z)}function B4(Z){let $=bZ();if(!$.includes(Z))L4([...$,Z])}function V6(Z){let $=bZ();if($.includes(Z))L4($.filter((Q)=>Q!==Z))}function n(Z){return ZZ(a(),Z)}function JZ(Z){return`file:${ZZ(n(Z),"db.sqlite")}`}function CZ(){try{let Z=JSON.parse(uZ(gZ(),"utf8"));return Array.isArray(Z)?Z:[]}catch{return[]}}function mZ(Z){LZ(a(),{recursive:!0}),xZ(gZ(),JSON.stringify(Z,null,2))}function pZ(){return CZ().sort((Z,$)=>$.lastOpenedAt.localeCompare(Z.lastOpenedAt))}function x(Z){return CZ().find(($)=>$.id===Z)??null}function N4(Z,$,Q=new Date().toISOString()){if(!H4(Z))throw Error(`beacon: refusing to register a non-repo path as a workspace: ${Z}`);let J=QZ(Z);if(C4(J))throw Error(`beacon: workspace ${J} (${Z}) was deleted \u2014 run \`beacon\` or /beacon-init to re-add it`);let V=CZ(),K=V.find((j)=>j.id===J),Y={id:J,path:Z,name:$||K?.name||Q6(Z),lastOpenedAt:Q},X=[Y,...V.filter((j)=>j.id!==J)];return LZ(n(J),{recursive:!0}),mZ(X),Y}function y8(Z,$){return V6(QZ(Z)),N4(Z,$)}function f8(Z,$=new Date().toISOString()){let Q=CZ(),J=Q.find((V)=>V.id===Z);if(!J)return;J.lastOpenedAt=$,mZ(Q)}function q4(Z){if(mZ(CZ().filter(($)=>$.id!==Z)),r()===Z)K6(pZ()[0]?.id??null)}function O4(){return ZZ(a(),"active")}function r(){try{return uZ(O4(),"utf8").trim()||null}catch{return null}}function K6(Z){LZ(a(),{recursive:!0}),xZ(O4(),Z??"")}function X6(){let Z=r();return Z?x(Z):null}function u8(){let Z=FZ()??r();return Z?x(Z):null}function x8(Z){return x(Z)?.path??null}function g8(){return j4(gZ())}var A4="beacon_ws";function _4(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 h8(Z){let $=Z.headers.get("x-beacon-workspace");if($&&x($))return $;let Q=_4(Z,A4);if(Q&&x(Q))return Q;return null}var Y6="x-beacon-workspace-path";async function b8(Z){let $=Z.headers.get("x-beacon-workspace");if($&&x($))return $;let Q=Z.headers.get(Y6);if(Q&&H4(Q)&&!C4(QZ(Q))&&(!$||QZ(Q)===$)){let V=N4(Q);return await cZ(V.id),V.id}let J=_4(Z,A4);if(J&&x(J))return J;return null}var F4=new e5;function G6(Z,$){return Z?F4.run(Z,$):$()}function FZ(){return F4.getStore()??null}var fZ=new Set;function D4(Z){fZ.delete(ZZ(n(Z),"db.sqlite"))}async function cZ(Z){let $=n(Z),Q=ZZ($,"db.sqlite"),J=j4(Q);if(J&&fZ.has(Q))return{ok:!0,created:!1,migrated:!1};try{LZ($,{recursive:!0});let{provisionDb:V}=await G4().then(() => Y4),K=await V(JZ(Z));return fZ.add(Q),{ok:!0,created:!J,migrated:J&&K.migrated}}catch(V){return{ok:!1,created:!1,migrated:!1,error:V instanceof Error?V.message:String(V)}}}import{existsSync as N8,readFileSync as q8}from"fs";import{resolve as w5}from"path";import{rmSync as B8}from"fs";import{drizzle as k6}from"drizzle-orm/libsql";import{createClient as T6}from"@libsql/client";var lZ={};wZ(lZ,{tag:()=>jZ,syncState:()=>s,projectMeta:()=>L6,note:()=>U6,nodeTags:()=>KZ,nodeFile:()=>BZ,node:()=>T,endpointTable:()=>o,endpoint:()=>v,edge:()=>VZ,draftTable:()=>c,draftRelation:()=>XZ,draftColumn:()=>qZ,dbTable:()=>E,dbRelation:()=>l,dbColumn:()=>e,codeFileEdge:()=>u,codeFile:()=>f,bugFlag:()=>NZ,boardAnnotation:()=>H6,appSetting:()=>W6});import{sqliteTable as w,index as k,foreignKey as M6,text as W,integer as z,real as b,uniqueIndex as t,primaryKey as j6}from"drizzle-orm/sqlite-core";import{createId as h}from"@paralleldrive/cuid2";var T=w("Node",{id:W().primaryKey().$defaultFn(()=>h()),view:W().notNull(),kind:W().default("FEATURE").notNull(),cluster:W(),layer:W(),title:W().notNull(),role:W(),plain:W(),status:W().default("PENDING").notNull(),priority:z().default(2).notNull(),progress:z().default(0).notNull(),x:b().default(0).notNull(),y:b().default(0).notNull(),sourceRef:W(),externalId:W(),source:W().default("MANUAL").notNull(),planId:W(),parentId:W(),createdAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[k("Node_cluster_idx").on(Z.cluster),k("Node_parentId_idx").on(Z.parentId),k("Node_view_idx").on(Z.view),M6(()=>({columns:[Z.parentId],foreignColumns:[Z.id],name:"Node_parentId_Node_id_fk"})).onUpdate("cascade").onDelete("cascade")]),BZ=w("NodeFile",{id:W().primaryKey().$defaultFn(()=>h()),nodeId:W().notNull().references(()=>T.id,{onDelete:"cascade",onUpdate:"cascade"}),path:W().notNull()},(Z)=>[t("NodeFile_nodeId_path_key").on(Z.nodeId,Z.path),k("NodeFile_nodeId_idx").on(Z.nodeId)]),jZ=w("Tag",{id:W().primaryKey().$defaultFn(()=>h()),label:W().notNull(),color:W()},(Z)=>[t("Tag_label_key").on(Z.label)]),VZ=w("Edge",{id:W().primaryKey().$defaultFn(()=>h()),fromId:W().notNull().references(()=>T.id,{onDelete:"cascade",onUpdate:"cascade"}),toId:W().notNull().references(()=>T.id,{onDelete:"cascade",onUpdate:"cascade"}),kind:W().default("DEPENDS").notNull(),label:W(),sourceHandle:W(),targetHandle:W()},(Z)=>[t("Edge_fromId_toId_kind_key").on(Z.fromId,Z.toId,Z.kind),k("Edge_toId_idx").on(Z.toId),k("Edge_fromId_idx").on(Z.fromId)]),KZ=w("_NodeTags",{a:W("A").notNull().references(()=>T.id,{onDelete:"cascade",onUpdate:"cascade"}),b:W("B").notNull().references(()=>jZ.id,{onDelete:"cascade",onUpdate:"cascade"})},(Z)=>[t("_NodeTags_AB_unique").on(Z.a,Z.b),k("_NodeTags_B_index").on(Z.b)]),U6=w("Note",{id:W().primaryKey().$defaultFn(()=>h()),title:W().default("Untitled").notNull(),body:W().default("").notNull(),ord:b().default(0).notNull(),pinned:z({mode:"boolean"}).default(!1).notNull(),createdAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[k("Note_updatedAt_idx").on(Z.updatedAt)]),H6=w("BoardAnnotation",{id:W().primaryKey().$defaultFn(()=>h()),targetKind:W().notNull(),targetId:W().notNull(),columnName:W(),body:W().default("").notNull(),x:b(),y:b(),createdAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[k("BoardAnnotation_target_idx").on(Z.targetId)]),NZ=w("BugFlag",{id:W().primaryKey().$defaultFn(()=>h()),nodeId:W().notNull().references(()=>T.id,{onDelete:"cascade",onUpdate:"cascade"}),by:W().notNull(),note:W().notNull(),resolvedAt:z({mode:"timestamp_ms"}),createdAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date)},(Z)=>[k("BugFlag_nodeId_idx").on(Z.nodeId)]),E=w("DbTable",{id:W().primaryKey().$defaultFn(()=>h()),name:W().notNull(),domain:W(),description:W(),source:W().default("MANUAL").notNull(),planId:W(),x:b().default(0).notNull(),y:b().default(0).notNull(),createdAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[k("DbTable_domain_idx").on(Z.domain),t("DbTable_name_key").on(Z.name)]),e=w("DbColumn",{id:W().primaryKey().$defaultFn(()=>h()),tableId:W().notNull().references(()=>E.id,{onDelete:"cascade",onUpdate:"cascade"}),name:W().notNull(),type:W().notNull(),isPk:z({mode:"boolean"}).default(!1).notNull(),isFk:z({mode:"boolean"}).default(!1).notNull(),nullable:z({mode:"boolean"}).default(!0).notNull(),note:W(),ord:z().default(0).notNull()},(Z)=>[t("DbColumn_tableId_name_key").on(Z.tableId,Z.name),k("DbColumn_tableId_idx").on(Z.tableId)]),l=w("DbRelation",{id:W().primaryKey().$defaultFn(()=>h()),fromTableId:W().notNull().references(()=>E.id,{onDelete:"cascade",onUpdate:"cascade"}),toTableId:W().notNull().references(()=>E.id,{onDelete:"cascade",onUpdate:"cascade"}),fromColumn:W().notNull(),toColumn:W().notNull(),label:W()},(Z)=>[k("DbRelation_toTableId_idx").on(Z.toTableId),k("DbRelation_fromTableId_idx").on(Z.fromTableId)]),v=w("Endpoint",{id:W().primaryKey().$defaultFn(()=>h()),method:W().notNull(),path:W().notNull(),domain:W(),description:W(),source:W().default("MANUAL").notNull(),planId:W(),x:b().default(0).notNull(),y:b().default(0).notNull(),createdAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[t("Endpoint_method_path_key").on(Z.method,Z.path),k("Endpoint_domain_idx").on(Z.domain)]),o=w("EndpointTable",{id:W().primaryKey().$defaultFn(()=>h()),endpointId:W().notNull().references(()=>v.id,{onDelete:"cascade",onUpdate:"cascade"}),tableId:W().notNull().references(()=>E.id,{onDelete:"cascade",onUpdate:"cascade"}),access:W().default("read").notNull()},(Z)=>[t("EndpointTable_endpointId_tableId_key").on(Z.endpointId,Z.tableId),k("EndpointTable_tableId_idx").on(Z.tableId)]),c=w("DraftTable",{id:W().primaryKey().$defaultFn(()=>h()),name:W().notNull(),domain:W(),description:W(),x:b().default(0).notNull(),y:b().default(0).notNull(),createdAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date)},(Z)=>[t("DraftTable_name_key").on(Z.name)]),qZ=w("DraftColumn",{id:W().primaryKey().$defaultFn(()=>h()),tableId:W().notNull().references(()=>c.id,{onDelete:"cascade",onUpdate:"cascade"}),name:W().notNull(),type:W().notNull(),isPk:z({mode:"boolean"}).default(!1).notNull(),isFk:z({mode:"boolean"}).default(!1).notNull(),nullable:z({mode:"boolean"}).default(!0).notNull(),note:W(),ord:z().default(0).notNull()},(Z)=>[k("DraftColumn_tableId_idx").on(Z.tableId)]),XZ=w("DraftRelation",{id:W().primaryKey().$defaultFn(()=>h()),fromTableId:W().notNull().references(()=>c.id,{onDelete:"cascade",onUpdate:"cascade"}),toTableId:W().notNull().references(()=>c.id,{onDelete:"cascade",onUpdate:"cascade"}),fromColumn:W().notNull(),toColumn:W().notNull(),label:W()},(Z)=>[k("DraftRelation_toTableId_idx").on(Z.toTableId),k("DraftRelation_fromTableId_idx").on(Z.fromTableId)]),f=w("CodeFile",{path:W().primaryKey(),root:W(),lang:W(),x:b().default(0).notNull(),y:b().default(0).notNull(),mtimeMs:b(),size:z(),inDegree:z().default(0).notNull(),outDegree:z().default(0).notNull(),updatedAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)}),u=w("CodeFileEdge",{fromPath:W().notNull().references(()=>f.path,{onDelete:"cascade",onUpdate:"cascade"}),toPath:W().notNull().references(()=>f.path,{onDelete:"cascade",onUpdate:"cascade"}),circular:z({mode:"boolean"}).default(!1).notNull()},(Z)=>[k("CodeFileEdge_circular_idx").on(Z.circular),k("CodeFileEdge_toPath_idx").on(Z.toPath),k("CodeFileEdge_fromPath_idx").on(Z.fromPath),j6({columns:[Z.fromPath,Z.toPath],name:"CodeFileEdge_fromPath_toPath_pk"})]),s=w("SyncState",{id:W().primaryKey().default("singleton"),version:z().default(0).notNull(),codeGraphSyncedAt:z({mode:"timestamp_ms"}),updatedAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)}),W6=w("AppSetting",{id:W().primaryKey().default("singleton"),editor:W().default("auto").notNull(),currentFeatureId:W(),updatedAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)}),L6=w("ProjectMeta",{id:W().primaryKey().default("singleton"),overview:W(),conventions:W().default("[]").notNull(),hasFrontend:z({mode:"boolean"}),classificationRoots:W().default("[]").notNull(),updatedAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)});var dZ={};wZ(dZ,{tagRelations:()=>q6,nodeTagsRelations:()=>O6,nodeRelations:()=>C6,nodeFileRelations:()=>B6,endpointTableRelations:()=>P6,endpointRelations:()=>z6,edgeRelations:()=>A6,draftTableRelations:()=>E6,draftRelationRelations:()=>R6,draftColumnRelations:()=>I6,dbTableRelations:()=>_6,dbRelationRelations:()=>D6,dbColumnRelations:()=>F6,codeFileRelations:()=>S6,codeFileEdgeRelations:()=>v6,bugFlagRelations:()=>N6});import{relations as g}from"drizzle-orm";var C6=g(T,({one:Z,many:$})=>({files:$(BZ),bugFlags:$(NZ),nodeTags:$(KZ),edgesOut:$(VZ,{relationName:"EdgeFrom"}),edgesIn:$(VZ,{relationName:"EdgeTo"}),parent:Z(T,{fields:[T.parentId],references:[T.id],relationName:"NodeTree"}),children:$(T,{relationName:"NodeTree"})})),B6=g(BZ,({one:Z})=>({node:Z(T,{fields:[BZ.nodeId],references:[T.id]})})),N6=g(NZ,({one:Z})=>({node:Z(T,{fields:[NZ.nodeId],references:[T.id]})})),q6=g(jZ,({many:Z})=>({nodeTags:Z(KZ)})),O6=g(KZ,({one:Z})=>({node:Z(T,{fields:[KZ.a],references:[T.id]}),tag:Z(jZ,{fields:[KZ.b],references:[jZ.id]})})),A6=g(VZ,({one:Z})=>({from:Z(T,{fields:[VZ.fromId],references:[T.id],relationName:"EdgeFrom"}),to:Z(T,{fields:[VZ.toId],references:[T.id],relationName:"EdgeTo"})})),_6=g(E,({many:Z})=>({columns:Z(e),fksOut:Z(l,{relationName:"FkFrom"}),fksIn:Z(l,{relationName:"FkTo"}),usages:Z(o)})),F6=g(e,({one:Z})=>({table:Z(E,{fields:[e.tableId],references:[E.id]})})),D6=g(l,({one:Z})=>({fromTable:Z(E,{fields:[l.fromTableId],references:[E.id],relationName:"FkFrom"}),toTable:Z(E,{fields:[l.toTableId],references:[E.id],relationName:"FkTo"})})),z6=g(v,({many:Z})=>({tables:Z(o)})),P6=g(o,({one:Z})=>({endpoint:Z(v,{fields:[o.endpointId],references:[v.id]}),table:Z(E,{fields:[o.tableId],references:[E.id]})})),E6=g(c,({many:Z})=>({columns:Z(qZ),fksOut:Z(XZ,{relationName:"DraftFkFrom"}),fksIn:Z(XZ,{relationName:"DraftFkTo"})})),I6=g(qZ,({one:Z})=>({table:Z(c,{fields:[qZ.tableId],references:[c.id]})})),R6=g(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"})})),S6=g(f,({many:Z})=>({edgesOut:Z(u,{relationName:"CFEFrom"}),edgesIn:Z(u,{relationName:"CFETo"})})),v6=g(u,({one:Z})=>({fromFile:Z(f,{fields:[u.fromPath],references:[f.path],relationName:"CFEFrom"}),toFile:Z(f,{fields:[u.toPath],references:[f.path],relationName:"CFETo"})}));var w6={...lZ,...dZ};function y6(){let Z=process.env.DATABASE_URL;if(Z&&/^(file:|libsql:|wss?:|https?:|:memory:)/i.test(Z))return Z;return"file:./dev.db"}var f6=y6();function z4(Z){let $=T6({url:Z});return $.execute("PRAGMA foreign_keys = ON;"),$.execute("PRAGMA busy_timeout = 5000;"),k6($,{schema:w6})}var rZ=globalThis,nZ=rZ.dzDefault??z4(f6);rZ.dzDefault=nZ;var DZ=rZ.dzByUrl??=new Map;function oZ(Z){let $=DZ.get(Z);if(!$)$=z4(Z),DZ.set(Z,$);return $}function P4(Z){let $=DZ.get(Z);DZ.delete(Z);try{$?.$client?.close?.()}catch{}}function u6(){if(process.env.BEACON_REPO)return nZ;let Z=FZ()??r();if(!Z)return nZ;return oZ(JZ(Z))}var m=new Proxy({},{get(Z,$){let Q=u6(),J=Q[$];return typeof J==="function"?J.bind(Q):J}});import{existsSync as W8}from"fs";import{existsSync as R5,readFileSync as Y8,watch as G8}from"fs";import{readFile as I5}from"fs/promises";import{join as AZ,relative as M8,resolve as j8}from"path";import{existsSync as c4,readFileSync as l4}from"fs";import{readdir as W7,readFile as L7,stat as d4}from"fs/promises";import{extname as n4,join as IZ,relative as HZ,resolve as UZ}from"path";import{extname as g4}from"path";import{dirname as x6,resolve as g6}from"path";var iZ=[".ts",".tsx",".js",".jsx",".mjs",".cjs"],h6=[/(?:^|[\n;])\s*(?:import|export)[^'"`\n]{0,4000}?from\s*['"]([^'"`]+)['"]/g,/(?:^|[\n;])\s*import\s*['"]([^'"`]+)['"]/g,/\brequire\(\s*['"]([^'"`]+)['"]\s*\)/g,/\bimport\(\s*['"]([^'"`]+)['"]\s*\)/g];function b6(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 m6(Z){let $=new Set;for(let Q of h6)for(let J of Z.matchAll(Q))$.add(J[1]);return $}function p6(Z,$,Q,J){if(Z.startsWith(".")){let V=g6("/",x6($),Z),K=b6(V).replace(/^\//,"");return E4(K,Q)}for(let V of J)if(Z.startsWith(V.from)){let K=Z.slice(V.from.length),Y=V.to?`${V.to}/${K}`:K,X=E4(Y,Q);if(X)return X}return null}var I4={id:"ts",extensions:iZ,specifiers:m6,resolve(Z,$,Q){let J=p6(Z,$,Q.fileSet,Q.tsAliases??[]);return J?[J]:[]}};import{dirname as zZ,join as c6,normalize as l6}from"path";var d6=[".py",".pyi"],R4=[/(?:^|[\n;])\s*from\s+(\.*[\w.]*)\s+import\b/g,/(?:^|[\n;])\s*import\s+([\w.]+(?:\s*,\s*[\w.]+)*)/g];function S4(Z,$){for(let Q of[`${Z}.py`,`${Z}/__init__.py`,`${Z}.pyi`])if($.has(Q))return[Q];return[]}function n6(Z){let $=new Set;for(let Q of Z.matchAll(R4[0])){let J=Q[1].trim();if(J)$.add(J)}for(let Q of Z.matchAll(R4[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 v4={id:"python",extensions:d6,specifiers:n6,resolve(Z,$,Q){if(Z.startsWith(".")){let Y=Z.length-Z.replace(/^\.+/,"").length,X=Z.slice(Y),j=zZ($);for(let M=1;M<Y;M++)j=zZ(j);let B=X?c6(j,X.replace(/\./g,"/")):j;return S4(l6(B).replace(/\\/g,"/"),Q.fileSet)}let J=Z.replace(/\./g,"/"),V=[],K=zZ($);while(K&&K!=="."&&K!=="/")V.push(K),K=zZ(K);V.push("");for(let Y of V){let X=S4(Y?`${Y}/${J}`:J,Q.fileSet);if(X.length)return X}return[]}};import{dirname as r6}from"path";var o6=[".go"],i6=/(?:^|[\n;])\s*import\s+(?:[\w.]+\s+)?"([^"]+)"/g,s6=/(?:^|[\n;])\s*import\s*\(([\s\S]*?)\)/g,a6=/"([^"]+)"/g;function t6(Z){let $=new Set;for(let Q of Z.matchAll(i6))$.add(Q[1]);for(let Q of Z.matchAll(s6))for(let J of Q[1].matchAll(a6))$.add(J[1]);return $}var k4={id:"go",extensions:o6,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 K=[];for(let Y of Q.fileSet){if(!Y.endsWith(".go"))continue;let X=r6(Y);if(V===""&&X==="."||X===V)K.push(Y)}return K.sort()},specifiers:t6};import{basename as T4,dirname as sZ,join as w4,normalize as y4}from"path";var e6=[".rs"],Z7=/(?:^|[\n;])\s*(?:pub\s+)?mod\s+(\w+)\s*;/g,$7=/(?:^|[\n;])\s*(?:pub\s+)?use\s+([\w:]+)/g;function Q7(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 J7=new Set(["mod.rs","lib.rs","main.rs"]);function V7(Z){let $=new Set;for(let Q of Z.matchAll(Z7))$.add(`./${Q[1]}`);for(let Q of Z.matchAll($7)){let J=Q7(Q[1]);if(J)$.add(J)}return $}var f4={id:"rust",extensions:e6,specifiers:V7,resolve(Z,$,Q){let J=Q.fileSet;if(Z.startsWith("./")||Z.startsWith("../")){let V=Z.replace(/^\.\//,""),K=y4(w4(sZ($),Z)).replace(/\\/g,"/"),Y=aZ(K,J);if(Y.length)return Y;if(Z.startsWith("./")&&!J7.has(T4($))){let X=w4(sZ($),T4($,".rs"),V);if(Y=aZ(y4(X).replace(/\\/g,"/"),J),Y.length)return Y}return[]}if(Z.startsWith("crate/")){let V=$.split("/"),K=V.lastIndexOf("src"),Y=K>=0?V.slice(0,K+1).join("/"):sZ($),X=Z.slice(6).split("/");for(let j of[X.join("/"),X.slice(0,-1).join("/")]){if(!j)continue;let B=aZ(`${Y}/${j}`,J);if(B.length)return B}return[]}return[]}};import{dirname as K7,extname as X7,join as Y7,normalize as G7}from"path";var u4=[".swift",".java",".rb",".kt",".kts",".cs",".php",".scala",".c",".h",".cpp",".hpp",".cc",".hh",".m",".mm",".ex",".exs",".lua",".dart",".vue",".svelte"],M7=[/\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 j7(Z){let $=new Set;for(let Q of M7)for(let J of Z.matchAll(Q)){let V=J[1].trim();if(V)$.add(V)}return $}var x4={id:"fallback",extensions:u4,specifiers:j7,resolve(Z,$,Q){let V=[X7($).toLowerCase(),...u4].filter((j,B,M)=>j&&M.indexOf(j)===B),K=Z.includes("/")||Z.includes("\\"),Y=Z.startsWith(".")||K?Z.replace(/\\/g,"/"):Z.replace(/[.:]+/g,"/"),X=[G7(Y7(K7($),Y)).replace(/\\/g,"/"),Y.replace(/^\.\//,"")];for(let j of X){if(Q.fileSet.has(j))return[j];for(let B of V){let M=j.endsWith(B)?j:`${j}${B}`;if(Q.fileSet.has(M))return[M];if(Q.fileSet.has(`${j}/index${B}`))return[`${j}/index${B}`]}}return[]}};var U7=[I4,v4,k4,f4,x4],PZ=new Map;for(let Z of U7)for(let $ of Z.extensions)PZ.set($,Z);var H7={".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 PZ.get(g4(Z).toLowerCase())??null}function h4(Z){let $=g4(Z).toLowerCase();if(!PZ.has($))return null;return H7[$]??$.slice(1)}function eZ(){return new Set(PZ.keys())}var r4=new Set(["node_modules",".git",".next","dist","build","__pycache__","target",".venv","venv","env",".turbo","coverage",".beacon",".playwright-mcp","generated","migrations","drizzle","alembic","migrate"]);function C7(Z=5){let $=performance.now();return async()=>{if(performance.now()-$>Z)await new Promise((Q)=>setImmediate(Q)),$=performance.now()}}var B7=()=>Promise.resolve();async function o4(Z,$,Q,J,V){let K;try{K=await W7($,{withFileTypes:!0})}catch{return}for(let Y of K){if(Y.name.startsWith("."))continue;if(r4.has(Y.name))continue;let X=IZ($,Y.name);if(Y.isDirectory()){await o4(Z,X,Q,J,V);continue}if(!Y.isFile())continue;if(Y.name.endsWith(".d.ts"))continue;if(!Q.has(n4(Y.name).toLowerCase()))continue;J.push(HZ(Z,X))}await V()}async function N7(Z,$=B7){let Q=[];return await o4(Z,Z,eZ(),Q,$),Q.map((J)=>J.split(/[\\/]/).join("/")).sort()}function q7(Z){try{return JSON.parse(Z)}catch{}let $=Z.replace(/\/\*[^"]*?\*\//g,"").replace(/(^|[^:"])\/\/.*$/gm,"$1").replace(/,\s*([}\]])/g,"$1");return JSON.parse($)}function b4(Z){return Z.replace(/^\.\/?/,"").replace(/\/$/,"")}function i4(Z){let $=IZ(Z,"tsconfig.json");if(!c4($))return[];let Q;try{Q=q7(l4($,"utf8"))}catch{return[]}let J=Q.compilerOptions?.paths??{},V=b4(Q.compilerOptions?.baseUrl??"."),K=[];for(let[Y,X]of Object.entries(J)){if(!Y.endsWith("/*")||!X.length)continue;let j=X[0];if(!j.endsWith("/*"))continue;let B=Y.slice(0,-1),M=b4(j.slice(0,-1)),L=[V,M].filter(Boolean).join("/");K.push({from:B,to:L})}return K}function EZ(Z){let $=IZ(Z,"go.mod");if(!c4($))return null;try{let Q=/^\s*module\s+(\S+)/m.exec(l4($,"utf8"));return Q?Q[1]:null}catch{return null}}function p(Z){return Z.split(/[\\/]/).join("/")}function s4(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 O7(Z,$,Q){let J=(Array.isArray(Z)?Z:[Z]).map((B)=>p(UZ(B))),V=p($?UZ($):J.length===1?J[0]:s4(J)),K=new Map,Y=[];for(let B of J){let M=p(HZ(V,B));for(let L of i4(B))Y.push({from:L.from,to:[M,L.to].filter(Boolean).join("/")});for(let L of await N7(B,Q)){let C=p(IZ(B,L)),q=p(HZ(V,C));if(K.has(q))continue;try{let U=await d4(C);K.set(q,{path:q,abs:C,root:M||null,mtimeMs:U.mtimeMs,size:U.size})}catch{}await Q()}}let X=J.map(EZ).find(Boolean)??EZ(V);return{metas:[...K.values()].sort((B,M)=>B.path.localeCompare(M.path)),ctx:{fileSet:new Set(K.keys()),tsAliases:Y,goModulePath:X}}}var m4=50000;function A7(Z){let $=0;for(let Q=0;Q<Z.length;Q++)if(Z.charCodeAt(Q)===10){if(Q-$>m4)return!0;$=Q+1}return Z.length-$>m4}async function p4(Z){let $=tZ(Z.path);if(!$||Z.size>200000)return new Set;try{let Q=await L7(Z.abs,"utf8");if(A7(Q))return new Set;return $.specifiers(Q)}catch{return new Set}}function a4(Z,$){let Q=(Array.isArray(Z)?Z:[Z]).map((U)=>p(UZ(U))),J=p($?UZ($):Q.length===1?Q[0]:s4(Q)),V=new Map,K=new Map,Y=[],X=null;function j(){Y=[];for(let U of Q){let H=p(HZ(J,U));for(let O of i4(U))Y.push({from:O.from,to:[H,O.to].filter(Boolean).join("/")})}X=Q.map(EZ).find(Boolean)??EZ(J)}function B(U){let H=U.split("/");for(let A=0;A<H.length;A++){let N=H[A];if(!N||N.startsWith("."))return!0;if(A<H.length-1&&r4.has(N))return!0}let O=H[H.length-1];if(O.endsWith(".d.ts"))return!0;return!eZ().has(n4(O).toLowerCase())}function M(U){let H=p(UZ(U));for(let O of Q)if(H===O||H.startsWith(`${O}/`)){let A=H.slice(O.length).replace(/^\/+/,"");if(B(A))return null;return{path:p(HZ(J,H)),root:p(HZ(J,O))||null}}return null}function L(){let U={fileSet:new Set(V.keys()),tsAliases:Y,goModulePath:X},H=[...V.values()].sort((N,G)=>N.path.localeCompare(G.path)),O=[];for(let N of H){let G=tZ(N.path);if(!G)continue;let _=K.get(N.path)??new Set,F=new Set;for(let R of _)for(let y of G.resolve(R,N.path,U)){if(!y||y===N.path||F.has(y))continue;F.add(y),O.push({from:N.path,to:y})}}return{files:H.map((N)=>({path:N.path,lang:h4(N.path),root:N.root,mtimeMs:N.mtimeMs,size:N.size})),edges:O}}async function C(){let U=C7(),{metas:H,ctx:O}=await O7(Z,$,U);V.clear(),K.clear();for(let A of H)await U(),V.set(A.path,A),K.set(A.path,await p4(A));return Y=O.tsAliases??[],X=O.goModulePath??null,L()}async function q(U){let H=p(UZ(U));if(!Q.some((F)=>H===F||H.startsWith(`${F}/`)))return!1;let O=H.split("/").pop()??"";if(O==="tsconfig.json"||O==="go.mod"){let F=H.slice(0,H.length-O.length-1);if(Q.includes(F))return j(),!0;return!1}let A=M(U);if(!A)return!1;let N;try{N=await d4(H)}catch{let F=V.delete(A.path);return K.delete(A.path),F}let G=V.get(A.path);if(G&&G.mtimeMs===N.mtimeMs&&G.size===N.size)return!1;let _={path:A.path,abs:H,root:A.root,mtimeMs:N.mtimeMs,size:N.size};return V.set(A.path,_),K.set(A.path,await p4(_)),!0}return{seed:C,applyChange:q,snapshot:L}}function t4(Z){let $=Object.keys(Z.tableVars),Q=new Map;if(!$.length){for(let Y of Z.routeFiles)Q.set(Y,[]);return Q}let J=new Map;for(let Y of Z.edges){let X=J.get(Y.from)??[];X.push(Y.to),J.set(Y.from,X)}let V=new Map($.map((Y)=>[Y,new RegExp(`(?:query\\.${Y}\\b|\\.from\\(\\s*${Y}\\b)`)])),K=new Map($.map((Y)=>[Y,new RegExp(`(?:insert|update|delete)\\(\\s*${Y}\\b`)]));for(let Y of Z.routeFiles){let X=new Set([Y]),j=[Y];for(let C=0;C<2&&X.size<25;C++){let q=[];for(let U of j)for(let H of J.get(U)??[]){if(X.has(H)||X.size>=25)continue;X.add(H),q.push(H)}j=q}let B=new Set,M=new Set;for(let C of X){let q=Z.content(C);if(!q)continue;for(let U of $){if(!B.has(U)&&V.get(U).test(q))B.add(U);if(!M.has(U)&&K.get(U).test(q))M.add(U)}}let L=[];for(let C of $){let q=B.has(C),U=M.has(C);if(!q&&!U)continue;L.push({table:Z.tableVars[C],access:q&&U?"read-write":U?"write":"read"})}Q.set(Y,L)}return Q}function e4(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 K=Q[2]??"",Y=K.match(/\d+/)?.[0];switch(Q[1]){case"GUID":case"Uuid":case"UUID":return"uuid";case"String":return Y?`varchar(${Y})`:"varchar";case"Text":return"text";case"DateTime":return/timezone\s*=\s*True/.test(K)?"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 Y?`vector(${Y})`:"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 RZ(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 _7(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 F7(Z,$,Q){let J=Q.match(/__tablename__\s*=\s*["']([^"']+)["']/)?.[1],V=[],K=[],Y=[],X=/(\w+)\s*:\s*Mapped\s*\[/g,j;while(j=X.exec(Q)){let L=j.index+j[0].length-1,C=_7(Q,L);if(C===null)continue;let q=L+C.length+2,U=Q.slice(q).match(/^\s*=\s*(\w+)\s*\(/);if(!U||U[1]!=="mapped_column")continue;Y.push({colName:j[1],pyType:C,argsAt:q+U[0].length-1})}let B=/(\w+)\s*=\s*(mapped_column|Column)\s*\(/g;while(j=B.exec(Q))Y.push({colName:j[1],pyType:"",argsAt:j.index+j[0].length-1});Y.sort((L,C)=>L.argsAt-C.argsAt);let M=new Set;for(let L of Y){if(M.has(L.colName)||L.colName==="__tablename__")continue;M.add(L.colName);let C=RZ(Q,L.argsAt),q=/primary_key\s*=\s*True/.test(C)||void 0,U=/nullable\s*=\s*False/.test(C)?!1:!0,H=C.match(/ForeignKey\(\s*["']([^"']+?)\.([^"'.]+)["']/);if(V.push({name:L.colName,type:e4(C,L.pyType),isPk:q,isFk:H?!0:void 0,nullable:U}),H)K.push({column:L.colName,toTable:H[1],toColumn:H[2]})}return{name:Z,bases:$,tableName:J,columns:V,fks:K}}function D7(Z){let $=[],Q=[],J=/\bTable\s*(\()\s*["']([^"']+)["']\s*,/g,V;while(V=J.exec(Z)){let K=V[2],Y=RZ(Z,V.index+V[0].indexOf("("));if(!/\bmetadata\b/.test(Y)||!/\bColumn\s*\(/.test(Y))continue;let X=[],j=/\bColumn\s*\(/g,B;while(B=j.exec(Y)){let M=RZ(Y,B.index+B[0].length-1),L=M.match(/^\s*["'](\w+)["']\s*,/)?.[1];if(!L)continue;let C=/primary_key\s*=\s*True/.test(M)||void 0,q=/nullable\s*=\s*False/.test(M)?!1:!0,U=M.match(/ForeignKey\(\s*["']([^"']+?)\.([^"'.]+)["']/);if(X.push({name:L,type:e4(M,""),isPk:C,isFk:U?!0:void 0,nullable:q}),U)Q.push({fromTable:K,fromColumn:L,toTable:U[1],toColumn:U[2]})}if(X.length)$.push({name:K,columns:X})}return{tables:$,relations:Q}}function z7(Z){let $=new Map,Q={tables:[],relations:[]};for(let X of Z){if(!X.path.endsWith(".py"))continue;if(!/mapped_column\s*\(|__tablename__|\bTable\s*\(\s*["']/.test(X.content))continue;let j=D7(X.content);Q.tables.push(...j.tables),Q.relations.push(...j.relations);let B=/^class\s+(\w+)\s*\(([^)]*)\)\s*:/gm,M,L=[];while(M=B.exec(X.content))L.push({name:M[1],bases:M[2].split(",").map((C)=>C.trim().split(/[.[]/)[0]).filter(Boolean),at:M.index});for(let C=0;C<L.length;C++){let q=X.content.slice(L[C].at,L[C+1]?.at??X.content.length),U=F7(L[C].name,L[C].bases,q);$.set(U.name,U)}}if(![...$.values()].some((X)=>X.tableName)&&!Q.tables.length)return{tables:[],relations:[]};let J=(X,j=new Set)=>{if(j.has(X.name))return[];j.add(X.name);let B=[];for(let M of X.bases){let L=$.get(M);if(L&&!L.tableName)B.push(...J(L,j))}return B.push(...X.columns),B},V=[],K=[];for(let X of $.values()){if(!X.tableName)continue;let j=J(X),B=new Map;for(let U of j)if(!B.has(U.name))B.set(U.name,U);let M=[...B.values()],L=(U)=>M.splice(M.findIndex((H)=>H.name===U),1)[0],C=M.some((U)=>U.name==="id")?L("id"):null,q=["created_at","updated_at","deleted_at"].filter((U)=>M.some((H)=>H.name===U)).map((U)=>L(U));V.push({name:X.tableName,columns:[...C?[C]:[],...M,...q]});for(let U of X.fks)K.push({fromTable:X.tableName,fromColumn:U.column,toTable:U.toTable,toColumn:U.toColumn})}let Y=new Set(V.map((X)=>X.name));for(let X of Q.tables)if(!Y.has(X.name))V.push(X);return K.push(...Q.relations.filter((X)=>!Y.has(X.fromTable))),{tables:V,relations:K}}function P7(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 E7(Z){let $=[],Q=[];for(let J of Z){if(!J.path.endsWith(".prisma"))continue;let V=/model\s+(\w+)\s*\{([\s\S]*?)\}/g,K;while(K=V.exec(J.content)){let Y=K[1],X=K[2].match(/@@map\(\s*["']([^"']+)["']\s*\)/)?.[1]??Y,j=[];for(let B of K[2].split(`
4
- `)){let M=B.trim().match(/^(\w+)\s+(\w+(?:\[\])?\??)\s*(.*)$/);if(!M||/^@@/.test(B.trim()))continue;let[,L,C,q]=M,U=/^(String|Int|BigInt|Float|Decimal|Boolean|DateTime|Json|Bytes)(\[\])?\??$/.test(C),H=q.match(/@relation\([^)]*fields:\s*\[(\w+)\][^)]*references:\s*\[(\w+)\]/);if(H)Q.push({fromTable:X,fromColumn:H[1],toTable:C.replace(/[?[\]]/g,""),toColumn:H[2]});if(!U)continue;j.push({name:L,type:P7(C),isPk:/@id\b/.test(q)||void 0,isFk:/@relation\b/.test(q)||void 0,nullable:C.endsWith("?")})}if(j.length)$.push({name:X,columns:j})}}return{tables:$,relations:Q}}function I7(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 R7(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 S7(Z){let $=[],Q=/(\w+)\s*:\s*(text|integer|real|blob|numeric|varchar|boolean|timestamp|serial|uuid|json|jsonb)\s*\(/g;for(let K of Z){if(!/\.(ts|tsx|mts|cts)$/.test(K.path))continue;if(!/\b(?:sqliteTable|pgTable|mysqlTable)\s*\(/.test(K.content))continue;let Y=/(?:export\s+)?const\s+(\w+)\s*=\s*(?:sqliteTable|pgTable|mysqlTable)\s*\(\s*["']([^"']+)["']\s*,/g,X;while(X=Y.exec(K.content)){let j=K.content.indexOf("{",X.index+X[0].length);if(j<0)continue;let B=R7(K.content,j),M={varName:X[1],tableName:X[2],columns:[],colByProp:new Map,fks:[]},L=[];Q.lastIndex=0;for(let C of B.matchAll(Q))L.push({prop:C[1],builder:C[2],at:C.index,argOpen:C.index+C[0].length-1});L.forEach((C,q)=>{let U=B.slice(C.at,L[q+1]?.at??B.length),H=RZ(B,C.argOpen),A=H.match(/^\s*["']([^"']+)["']/)?.[1]??C.prop,N=U.match(/\.references\(\s*\(\)\s*=>\s*(\w+)\.(\w+)/);if(M.columns.push({name:A,type:I7(C.builder,H),isPk:/\.primaryKey\(\)/.test(U)||void 0,isFk:N?!0:void 0,nullable:/\.notNull\(\)/.test(U)?!1:!0}),M.colByProp.set(C.prop,A),N)M.fks.push({column:A,toVar:N[1],toProp:N[2]})}),$.push(M)}}if(!$.length)return{tables:[],relations:[]};let J=new Map($.map((K)=>[K.varName,K])),V=[];for(let K of $)for(let Y of K.fks){let X=J.get(Y.toVar);if(!X)continue;V.push({fromTable:K.tableName,fromColumn:Y.column,toTable:X.tableName,toColumn:X.colByProp.get(Y.toProp)??Y.toProp})}return{tables:$.map((K)=>({name:K.tableName,columns:K.columns})),relations:V,tableVars:Object.fromEntries($.map((K)=>[K.varName,K.tableName]))}}function Z5(Z){let $=S7(Z);if($.tables.length)return $;let Q=E7(Z);if(Q.tables.length)return Q;return z7(Z)}var v7=["GET","POST","PUT","PATCH","DELETE"];function k7(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 $5(Z){let $=[];for(let Q of Z){let J=k7(Q.path);if(!J)continue;for(let V of v7)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 T7=/(^|\/)app\/.*\/route\.(ts|tsx|js|jsx|mjs)$/,w7=/\.(ts|py)$/,y7=/(schema|model)/i;function Z4(Z){if(Z.endsWith(".prisma"))return!0;if(T7.test(Z))return!0;return w7.test(Z)&&y7.test(Z)}function Q5(Z,$=300){return Z.filter(Z4).slice(0,$)}import{z as d}from"zod";import{and as F5,eq as WZ,inArray as J8,notInArray as V8}from"drizzle-orm";import{z as P}from"zod";import{and as t7,eq as kZ,inArray as Q4,notInArray as e7,or as Z8,sql as $8}from"drizzle-orm";var J5=240,V5=50;function K5(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+J5&&J.x+J5>V.x&&J.y<V.y+V5&&J.y+V5>V.y)return!0}return!1}import{eq as f7}from"drizzle-orm";var X5=(Z)=>Z.replace(/\{[^}]*\}/g,"{}");function u7(Z,$){if(Z.method.toUpperCase()!==$.method.toUpperCase())return!1;let Q=X5(Z.path),J=X5($.path);return J===Q||J.endsWith(Q)}async function Y5(Z=m){let[$,Q]=await Promise.all([Z.query.endpoint.findMany({where:(V,{ne:K})=>K(V.source,"INTROSPECTION")}),Z.query.endpoint.findMany({where:(V,{eq:K})=>K(V.source,"INTROSPECTION")})]),J={collapsed:0,mappings:[]};for(let V of $){let K=Q.find((Y)=>u7(V,Y));if(!K)continue;await Z.delete(v).where(f7(v.id,V.id)),J.collapsed++,J.mappings.push({planned:`${V.method} ${V.path}`,code:`${K.method} ${K.path}`})}return J}import{and as G5,inArray as x7,isNull as M5,ne as j5,or as g7}from"drizzle-orm";var h7=new Set(["DONE","CANCELLED","DEPRIORITIZED"]);async function b7(Z){let $=await Z.query.node.findMany({where:(J,{and:V,eq:K,isNotNull:Y})=>V(K(J.view,"ROADMAP"),Y(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)&&h7.has(J.status))}return[...Q.entries()].filter(([,J])=>J).map(([J])=>J)}async function U5(Z=m){let $=await b7(Z),Q=(K)=>$.length?g7(M5(K.planId),x7(K.planId,$)):M5(K.planId),J=await Z.delete(E).where(G5(j5(E.source,"INTROSPECTION"),Q(E))).returning({id:E.id}),V=await Z.delete(v).where(G5(j5(v.source,"INTROSPECTION"),Q(v))).returning({id:v.id});return{tables:J.length,endpoints:V.length}}var W5=320;function $Z(Z){return 36+Math.max(0,Z)*30+16}var YZ=60,m7=280,SZ=14,H5=120,OZ=170,p7=2560;var vZ=(Z)=>(Z??"").trim()||"\u2014";function c7(Z,$,Q){let J=new Map;for(let K of Z.uses){if(!$.has(K.tableId))continue;J.set(K.tableId,(J.get(K.tableId)??0)+1)}let V=null;for(let[K,Y]of J){if(V===null){V=K;continue}let X=J.get(V);if(Y>X){V=K;continue}if(Y<X)continue;let j=Q?.get(K)??0,B=Q?.get(V)??0;if(j<B)V=K;else if(j===B&&$.get(K).localeCompare($.get(V))<0)V=K}return V}function $4(Z,$){let Q=new Map(Z.map((V)=>[V.id,V.name])),J=new Map;for(let V of $)for(let K of V.uses){if(!Q.has(K.tableId))continue;J.set(K.tableId,(J.get(K.tableId)??0)+1)}return new Map($.map((V)=>[V.id,c7(V,Q,J)]))}var l7=(Z,$)=>Z.path.localeCompare($.path)||Z.method.localeCompare($.method)||Z.id.localeCompare($.id);function L5(Z,$){let Q=$4(Z,$),J=new Map,V=[];for(let N of[...$].sort(l7)){let G=Q.get(N.id)??null;if(G){let _=J.get(G);if(_)_.push(N);else J.set(G,[N])}else V.push(N)}let K=(N)=>{let G=J.get(N.id)?.length??0;return $Z(N.columnCount)+(G?SZ+G*YZ:0)+50},Y=Array.from(new Set(Z.map((N)=>vZ(N.domain)))),X=Y.filter((N)=>N!=="\u2014").sort(),j=Y.includes("\u2014")?[...X,"\u2014"]:X,B=[];for(let N of j){let G=Z.filter((S)=>vZ(S.domain)===N).sort((S,I)=>S.name.localeCompare(I.name)),_=G.reduce((S,I)=>S+K(I),0),F=Math.max(1,Math.min(12,G.length,Math.round(Math.sqrt(_/320)))),R=Array(F).fill(0),y=new Map;for(let S of G){let I=0;for(let D=1;D<F;D++)if(R[D]<R[I])I=D;y.set(S.id,{x:I*320,y:R[I]}),R[I]+=K(S)}B.push({d:N,w:F*320,h:Math.max(...R,0),tableLocal:y})}let M=B.reduce((N,G)=>N+(G.w+H5)*(G.h+OZ),0),L=Math.max(p7,Math.round(Math.sqrt(M*2.2))),C=new Map,q=new Map,U=0,H=0,O=0,A=0;for(let N of B){if(U>0&&U+N.w>L)H+=O+OZ,U=0,O=0;let G=Z.filter((_)=>N.tableLocal.has(_.id));for(let _ of G){let F=N.tableLocal.get(_.id),R=U+F.x,y=H+F.y;C.set(_.id,{x:R,y}),(J.get(_.id)??[]).forEach((I,D)=>{q.set(I.id,{x:R,y:y+$Z(_.columnCount)+SZ+D*YZ})})}O=Math.max(O,N.h),A=Math.max(A,H+N.h),U+=N.w+H5}if(V.length){let N=A+OZ,G=Math.max(1,Math.min(4,Math.ceil(Math.sqrt(V.length/2))));V.forEach((_,F)=>{q.set(_.id,{x:F%G*m7,y:N+Math.floor(F/G)*YZ})})}return{tables:C,endpoints:q}}function C5(Z,$,Q){let J=$4($,Q),V=new Map;for(let q of Q){let U=J.get(q.id);if(U)V.set(U,(V.get(U)??0)+1)}let K=(q)=>{let U=V.get(q.id)??0;return q.y+$Z(q.columnCount)+(U?SZ+U*YZ:0)},Y=vZ(Z.domain),X=$.filter((q)=>vZ(q.domain)===Y);if(!X.length){let q=$.length?Math.max(...$.map(K),...Q.map((U)=>U.y+YZ)):0;return{x:0,y:$.length||Q.length?q+OZ:0}}let j=Math.min(...X.map((q)=>q.x)),B=X.map((q)=>Math.max(0,Math.round((q.x-j)/320))),M=Math.min(12,Math.max(...B)+1),L=Array(M).fill(Math.min(...X.map((q)=>q.y)));X.forEach((q,U)=>{let H=Math.min(B[U],M-1);L[H]=Math.max(L[H],K(q)+50)});let C=0;for(let q=1;q<M;q++)if(L[q]<L[C])C=q;return{x:j+C*320,y:L[C]}}function B5(Z,$,Q){let J=$4($,[...Q,Z]),V=J.get(Z.id),K=V?$.find((X)=>X.id===V):void 0;if(K){let X=Q.filter((M)=>J.get(M.id)===K.id),j=K.y+$Z(K.columnCount)+SZ,B=X.length?Math.max(...X.map((M)=>M.y))+YZ:j;return{x:K.x,y:B}}let Y=[...$.map((X)=>X.y+$Z(X.columnCount)),...Q.map((X)=>X.y+YZ)];return{x:0,y:Y.length?Math.max(...Y)+OZ:0}}function N5(Z){let $=W5-20;for(let Q=0;Q<Z.length;Q++)for(let J=Q+1;J<Z.length;J++){let V=Z[Q],K=Z[J],Y=$Z(V.columnCount),X=$Z(K.columnCount);if(V.x<K.x+$&&V.x+$>K.x&&V.y<K.y+X&&V.y+Y>K.y)return!0}return!1}import{eq as O5}from"drizzle-orm";q5();async function A5(Z=m){let[$,Q]=await Promise.all([Z.query.dbTable.findMany({with:{columns:{columns:{id:!0}}},orderBy:(K,{asc:Y})=>Y(K.name)}),Z.query.endpoint.findMany({with:{tables:{columns:{tableId:!0}}}})]),J=L5($.map((K)=>({id:K.id,name:K.name,domain:K.domain,columnCount:K.columns.length})),Q.map((K)=>({id:K.id,method:K.method,path:K.path,uses:K.tables.map((Y)=>({tableId:Y.tableId}))}))),V=0;for(let K of $){let Y=J.tables.get(K.id);if(!Y||Math.round(Y.x)===Math.round(K.x)&&Math.round(Y.y)===Math.round(K.y))continue;await Z.update(E).set({x:Y.x,y:Y.y}).where(O5(E.id,K.id)),V++}for(let K of Q){let Y=J.endpoints.get(K.id);if(!Y||Math.round(Y.x)===Math.round(K.x)&&Math.round(Y.y)===Math.round(K.y))continue;await Z.update(v).set({x:Y.x,y:Y.y}).where(O5(v.id,K.id)),V++}return V}var Q8=P.object({tables:P.array(P.object({name:P.string().trim().min(1),domain:P.string().nullish(),description:P.string().nullish(),columns:P.array(P.object({name:P.string().trim().min(1),type:P.string().trim().min(1),isPk:P.boolean().optional(),isFk:P.boolean().optional(),nullable:P.boolean().optional(),note:P.string().nullish()})).default([])})).default([]),relations:P.array(P.object({fromTable:P.string(),fromColumn:P.string(),toTable:P.string(),toColumn:P.string(),label:P.string().nullish()})).default([]),endpoints:P.array(P.object({method:P.string().trim().min(1),path:P.string().trim().min(1),domain:P.string().nullish(),description:P.string().nullish(),uses:P.array(P.object({table:P.string(),access:P.string().default("read")})).default([])})).default([])});async function TZ(Z=m){let[$]=await Z.insert(s).values({id:"singleton",version:1}).onConflictDoUpdate({target:s.id,set:{version:$8`${s.version} + 1`}}).returning();return $.version}async function _5(Z,$=m,Q={}){let J=Q8.parse(Z),V=J.tables.length>0,K=J.endpoints.length>0,Y=J.tables.map((G)=>G.name);if(V)await $.delete(E).where(Y.length?t7(kZ(E.source,"INTROSPECTION"),e7(E.name,Y)):kZ(E.source,"INTROSPECTION"));let X=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}}}}),B=new Map(X.map((G)=>[G.name,G])),M=X.map((G)=>({id:G.id,name:G.name,domain:G.domain,columnCount:G.columns.length,x:G.x,y:G.y})),L=j.map((G)=>({id:G.id,method:G.method,path:G.path,uses:G.tables.map((_)=>({tableId:_.tableId})),x:G.x,y:G.y})),C=new Map;for(let G of J.tables){if(B.has(G.name))continue;let _=C5({domain:G.domain??null,columnCount:G.columns.length},M,L);C.set(G.name,_),M.push({id:`new:${G.name}`,name:G.name,domain:G.domain??null,columnCount:G.columns.length,..._})}let q=new Map;for(let G of J.tables){let _=B.get(G.name),F=C.get(G.name),R=_?.x??F?.x??0,y=_?.y??F?.y??0,[S]=await $.insert(E).values({name:G.name,domain:G.domain??null,description:G.description??null,source:"INTROSPECTION",x:R,y}).onConflictDoUpdate({target:E.name,set:{...G.domain!=null?{domain:G.domain}:{},...G.description!=null?{description:G.description}:{},source:"INTROSPECTION"}}).returning();if(q.set(G.name,S.id),await $.delete(e).where(kZ(e.tableId,S.id)),G.columns.length)await $.insert(e).values(G.columns.map((I,D)=>({tableId:S.id,name:I.name,type:I.type,isPk:I.isPk??!1,isFk:I.isFk??!1,nullable:I.nullable??!0,note:I.note??null,ord:D})))}let U=[...q.values()];if(U.length)await $.delete(l).where(Z8(Q4(l.fromTableId,U),Q4(l.toTableId,U)));for(let G of J.relations){let _=q.get(G.fromTable),F=q.get(G.toTable);if(!_||!F)continue;await $.insert(l).values({fromTableId:_,toTableId:F,fromColumn:G.fromColumn,toColumn:G.toColumn,label:G.label??`${G.fromColumn} \u2192 ${G.toTable}.${G.toColumn}`})}let H=new Set(J.endpoints.map((G)=>`${G.method} ${G.path}`));if(K){let _=(await $.query.endpoint.findMany({where:(F,{eq:R})=>R(F.source,"INTROSPECTION")})).filter((F)=>!H.has(`${F.method} ${F.path}`)).map((F)=>F.id);if(_.length)await $.delete(v).where(Q4(v.id,_))}for(let G of M)if(G.id.startsWith("new:"))G.id=q.get(G.name)??G.id;for(let G of J.endpoints){let _=await $.query.endpoint.findFirst({where:(S,{and:I,eq:D})=>I(D(S.method,G.method),D(S.path,G.path))}),F,R;if(_)F=_.x,R=_.y;else{let S={id:`new:${G.method} ${G.path}`,method:G.method,path:G.path,uses:G.uses.map((D)=>({tableId:q.get(D.table)??""})).filter((D)=>D.tableId)},I=B5(S,M,L);F=I.x,R=I.y,L.push({...S,x:F,y:R})}let[y]=await $.insert(v).values({method:G.method,path:G.path,domain:G.domain??null,description:G.description??null,source:"INTROSPECTION",x:F,y:R}).onConflictDoUpdate({target:[v.method,v.path],set:{...G.domain!=null?{domain:G.domain}:{},...G.description!=null?{description:G.description}:{},source:"INTROSPECTION"}}).returning();if(!Q.partial||G.uses.length>0)await $.delete(o).where(kZ(o.endpointId,y.id));for(let S of G.uses){let I=q.get(S.table)??(await $.query.dbTable.findFirst({where:(D,{eq:MZ})=>MZ(D.name,S.table)}))?.id;if(!I)continue;await $.insert(o).values({endpointId:y.id,tableId:I,access:S.access})}}await Y5($),await U5($);let O=await $.query.dbTable.findMany({where:(G,{eq:_})=>_(G.source,"INTROSPECTION"),columns:{x:!0,y:!0},with:{columns:{columns:{id:!0}}}}),A=await $.select({x:v.x,y:v.y}).from(v);if(N5(O.map((G)=>({x:G.x,y:G.y,columnCount:G.columns.length})))||K5(A))await A5($);let N=await TZ($);return{tables:J.tables.length,relations:J.relations.length,endpoints:J.endpoints.length,version:N}}var D5=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 z5(Z,$){let Q=new Map;for(let C of Z)Q.set(C,[]);for(let C of $)Q.get(C.from)?.push(C.to);let J=new Map,V=new Map,K=new Set,Y=[],X=new Map,j=[],B=0,M=0;for(let C of Z){if(J.has(C))continue;let q=[{v:C,iter:0}];J.set(C,B),V.set(C,B),B++,Y.push(C),K.add(C);while(q.length){let U=q[q.length-1],H=Q.get(U.v)??[];if(U.iter<H.length){let O=H[U.iter++];if(!J.has(O))J.set(O,B),V.set(O,B),B++,Y.push(O),K.add(O),q.push({v:O,iter:0});else if(K.has(O))V.set(U.v,Math.min(V.get(U.v),J.get(O)))}else{if(V.get(U.v)===J.get(U.v)){let A=0,N;do N=Y.pop(),K.delete(N),X.set(N,M),A++;while(N!==U.v);j.push(A),M++}q.pop();let O=q[q.length-1];if(O)V.set(O.v,Math.min(V.get(O.v),V.get(U.v)))}}}let L=new Set;for(let C of $){let q=X.get(C.from);if(q!==void 0&&q===X.get(C.to)&&j[q]>1)L.add(`${C.from}|${C.to}`)}return L}async function P5(Z,$=m){let Q=D5.parse(Z),J=Q.files.map((L)=>L.path),V=new Set(J),K=Q.edges.filter((L)=>V.has(L.from)&&V.has(L.to)&&L.from!==L.to),Y=z5(J,K),X=new Map,j=new Map;for(let L of K)j.set(L.from,(j.get(L.from)??0)+1),X.set(L.to,(X.get(L.to)??0)+1);await $.delete(f).where(V8(f.path,J));for(let L of Q.files){let C={root:L.root??null,lang:L.lang??null,mtimeMs:L.mtimeMs??null,size:L.size??null,inDegree:X.get(L.path)??0,outDegree:j.get(L.path)??0};await $.insert(f).values({path:L.path,...C}).onConflictDoUpdate({target:f.path,set:C})}await $.delete(u);let B=0;if(K.length)await $.insert(u).values(K.map((L)=>{let C=Y.has(`${L.from}|${L.to}`);if(C)B++;return{fromPath:L.from,toPath:L.to,circular:C}}));let M=await TZ($);return await $.update(s).set({codeGraphSyncedAt:new Date}).where(WZ(s.id,"singleton")),{files:Q.files.length,edges:K.length,circular:B,version:M}}var K8=(Z,$)=>`${Z}\x00${$}`;function J4(Z){let $=D5.parse(Z),Q=$.files.map((M)=>M.path),J=new Set(Q),V=$.edges.filter((M)=>J.has(M.from)&&J.has(M.to)&&M.from!==M.to),K=z5(Q,V),Y=new Map,X=new Map;for(let M of V)X.set(M.from,(X.get(M.from)??0)+1),Y.set(M.to,(Y.get(M.to)??0)+1);let j=new Map;for(let M of $.files)j.set(M.path,{root:M.root??null,lang:M.lang??null,mtimeMs:M.mtimeMs??null,size:M.size??null,inDegree:Y.get(M.path)??0,outDegree:X.get(M.path)??0});let B=new Map;for(let M of V)B.set(K8(M.from,M.to),{from:M.from,to:M.to,circular:K.has(`${M.from}|${M.to}`)});return{files:j,edges:B}}var X8=(Z,$)=>Z.root===$.root&&Z.lang===$.lang&&Z.mtimeMs===$.mtimeMs&&Z.size===$.size&&Z.inDegree===$.inDegree&&Z.outDegree===$.outDegree;async function E5(Z,$,Q=m){for(let[X,j]of $.files){let B=Z.files.get(X);if(B&&X8(B,j))continue;let M={root:j.root,lang:j.lang,mtimeMs:j.mtimeMs,size:j.size,inDegree:j.inDegree,outDegree:j.outDegree};await Q.insert(f).values({path:X,...M}).onConflictDoUpdate({target:f.path,set:M})}let J=[...Z.files.keys()].filter((X)=>!$.files.has(X));if(J.length)await Q.delete(f).where(J8(f.path,J));for(let[X,j]of Z.edges)if(!$.edges.has(X))await Q.delete(u).where(F5(WZ(u.fromPath,j.from),WZ(u.toPath,j.to)));let V=[];for(let[X,j]of $.edges){let B=Z.edges.get(X);if(!B)V.push({fromPath:j.from,toPath:j.to,circular:j.circular});else if(B.circular!==j.circular)await Q.update(u).set({circular:j.circular}).where(F5(WZ(u.fromPath,j.from),WZ(u.toPath,j.to)))}if(V.length)await Q.insert(u).values(V);let K=await TZ(Q);await Q.update(s).set({codeGraphSyncedAt:new Date}).where(WZ(s.id,"singleton"));let Y=0;for(let X of $.edges.values())if(X.circular)Y++;return{files:$.files.size,edges:$.edges.size,circular:Y,version:K}}var U8=/[/\\](node_modules|\.git|\.next|dist|build|__pycache__|target|\.venv|venv|\.beacon|\.playwright-mcp|generated|coverage)[/\\]/;function H8(Z){try{let $=AZ(Z,"beacon.config.json");if(R5($)){let Q=JSON.parse(Y8($,"utf8"));if(Array.isArray(Q.roots)&&Q.roots.length)return Q.roots.map((J)=>j8(Z,J))}}catch{}return[Z]}function S5(Z){let $=H8(Z.path),Q=cZ(Z.id),J=oZ(JZ(Z.id)),V=a4($,Z.path);async function K(){let H=Q5(V.snapshot().files.map((_)=>_.path));for(let _ of $)for(let F of["prisma/schema.prisma","schema.prisma"]){let R=AZ(_,F);if(R5(R))H.push(Y(R))}let O=[];for(let _ of H)try{O.push({path:_,content:await I5(AZ(Z.path,_),"utf8")})}catch{}let A=Z5(O),N=$5(O);if(!A.tables.length&&!N.length)return;if(N.length&&A.tableVars&&Object.keys(A.tableVars).length){let F=V.snapshot().edges,R=new Set(N.map((D)=>D.file)),y=new Map;for(let D of F){let MZ=y.get(D.from)??[];MZ.push(D.to),y.set(D.from,MZ)}for(let D=0;D<2;D++)for(let MZ of[...R])for(let x5 of y.get(MZ)??[])R.add(x5);let S=new Map;for(let D of[...R].slice(0,600))try{S.set(D,await I5(AZ(Z.path,D),"utf8"))}catch{}let I=t4({routeFiles:[...new Set(N.map((D)=>D.file))],edges:F,content:(D)=>S.get(D)??null,tableVars:A.tableVars});for(let D of N)D.uses=I.get(D.file)??[]}let G=await _5({tables:A.tables,relations:A.relations,endpoints:N},J,{partial:!0});console.log(`[beacon-inline] schema synced (${Z.name}): ${G.tables} tables / ${G.endpoints} endpoints`)}function Y(H){return M8(Z.path,H).split(/[\\/]/).join("/")}let X=null,j=!1,B=new Set,M=null,L=!1;async function C(){if(L){q();return}L=!0;try{if(await Q,j)X=null,j=!1;if(X===null){let N=await V.seed(),G=await P5(N,J);X=J4(N),console.log(`[beacon-inline] code-graph synced (${Z.name}): ${G.files} files / ${G.edges} imports${G.circular>0?` (${G.circular} circular)`:""}`),await K();return}let H=[...B];B.clear();let O=H.some((N)=>Z4(Y(N))),A=!1;for(let N of H)if(await V.applyChange(N))A=!0;if(A){let N=J4(V.snapshot()),G=await E5(X,N,J);X=N,console.log(`[beacon-inline] code-graph updated (${Z.name}): ${G.files} files / ${G.edges} imports${G.circular>0?` (${G.circular} circular)`:""}`)}if(O)await K()}catch(H){console.error(`[beacon-inline] error (${Z.name}):`,H instanceof Error?H.message:H)}finally{L=!1}}function q(){if(M)clearTimeout(M);M=setTimeout(C,600)}let U=[];for(let H of $)try{let O=G8(H,{recursive:!0,persistent:!0},(A,N)=>{if(!N){j=!0,q();return}let G=String(N);if(U8.test(`/${G}`))return;B.add(AZ(H,G)),q()});O.on("error",(A)=>console.error(`[beacon-inline] watcher error (${Z.name}):`,A)),U.push(O)}catch(O){console.error(`[beacon-inline] live watch unavailable for ${H} (${Z.name}):`,O instanceof Error?O.message:O)}return console.log(`[beacon-inline] watching ${Z.name} (${$.join(", ")}) \u2014 initial extract\u2026`),C(),{async stop(){if(M)clearTimeout(M);for(let H of U)H.close()}}}function L8(Z){let $=Z.limit??6,Q=Z.hardCap??12,J=new Map,V=0,K=new Set;function Y(H){let O=J.get(H);if(O)O.seq=++V}function X(H){if(J.has(H.id))return Y(H.id);if(!Z.exists(H.path))return;J.set(H.id,{handle:Z.start(H),seq:++V})}function j(){let H=null,O=1/0;for(let[A,N]of J){if(K.has(A))continue;if(N.seq<O)O=N.seq,H=A}if(H)J.get(H).handle.stop(),J.delete(H)}function B(){let H=Z.list().filter((O)=>Z.exists(O.path)).slice(0,$);K=new Set(H.map((O)=>O.id));for(let O of H)X(O);for(let[O,A]of[...J]){let N=Z.get(O);if(!N||!Z.exists(N.path))A.handle.stop(),J.delete(O)}}function M(H){if(J.has(H))return Y(H);let O=Z.get(H);if(!O||!Z.exists(O.path))return;if(J.size>=Q)j();if(J.size>=Q)return;J.set(H,{handle:Z.start(O),seq:++V})}async function L(H){let O=J.get(H);if(!O)return;J.delete(H),await O.handle.stop()}function C(H){return J.has(H)}function q(){return[...J.keys()]}async function U(){await Promise.all([...J.values()].map((H)=>H.handle.stop())),J.clear()}return{reconcile:B,ensureWatcher:M,stopWatcher:L,isWatching:C,activeIds:q,stopAll:U}}var C8=L8({list:pZ,get:x,exists:W8,start:(Z)=>S5(Z)});async function v5(Z){await C8.stopWatcher(Z)}async function k5(Z){if(!x(Z))return{ok:!1,removed:!1,fallbackId:r(),error:"unknown workspace"};q4(Z),B4(Z),await v5(Z),P4(JZ(Z)),D4(Z);try{B8(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 V4=process.argv.slice(3),y5=V4.includes("--yes")||V4.includes("-y"),GZ=V4.find((Z)=>!Z.startsWith("-")),T5=(Z)=>`\x1B[32m\u2713\x1B[0m ${Z}`,f5=(Z)=>`\x1B[2m${Z}\x1B[0m`,u5=(Z)=>`
5
- \x1B[1m${Z}\x1B[0m`;function O8(){if(!GZ)return x(QZ(hZ(process.cwd())));if(/^[0-9a-f]{12}$/.test(GZ)){let Z=x(GZ);if(Z)return Z}return x(QZ(hZ(w5(GZ))))}var i=O8();if(!i)console.error(`[beacon] ${GZ??process.cwd()} is not a registered Beacon workspace \u2014 nothing to remove.`),process.exit(1);console.log(u5(y5?"Beacon \xB7 remove workspace":"Beacon \xB7 remove workspace (dry run)"));console.log(` name: ${i.name}${r()===i.id?" (currently active)":""}`);console.log(` repo: ${i.path} ${f5("(untouched \u2014 only Beacon's data is erased)")}`);console.log(` data: ${n(i.id)} ${f5("(deleted)")}`);if(!y5)console.log(u5("Nothing was changed.")),console.log(` Run \x1B[1mbeacon remove${GZ?` ${GZ}`:""} --yes\x1B[0m to apply.
6
- `),process.exit(0);async function A8(Z){try{let{pid:$,port:Q}=JSON.parse(q8(w5(a(),"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 A8(i.id))console.log(` ${T5(`removed ${i.name} (via the running daemon)`)}
7
- `);else{let Z=await k5(i.id);if(!Z.ok)console.error(`[beacon] remove failed: ${Z.error??"unknown error"}`),process.exit(1);console.log(` ${T5(`removed ${i.name}`)}
8
- `)}if(N8(n(i.id)))console.error(`[beacon] warning: ${n(i.id)} still exists \u2014 remove it manually.`),process.exit(1);
3
+ var m5=Object.defineProperty;var p5=(Z)=>Z;function c5(Z,$){this[Z]=p5.bind(null,$)}var uZ=(Z,$)=>{for(var Q in $)m5(Z,Q,{get:$[Q],enumerable:!0,configurable:!0,set:c5.bind($,Q)})};var X4=(Z,$)=>()=>(Z&&($=Z(Z=0)),$);var G4={};uZ(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 fZ,join as o5}from"path";import{fileURLToPath as i5}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 e5(Z,$){let Q=await Z.execute(`PRAGMA table_info("${$}")`);return new Set(Q.rows.map((J)=>String(J.name)))}async function Y4(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 Z6(Z){for(let[$,Q]of Object.entries(t5)){if(!await DZ(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 DZ(Q,"__drizzle_migrations"),V=await DZ(Q,"Node"),K=!1;if(V&&!J){let X=r5({migrationsFolder:$})[0];if(X)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:[X.hash,X.folderMillis]}),K=!0}let Y=await Y4(Q);if(await n5(d5(Q),{migrationsFolder:$}),await Y4(Q)>Y)K=!0;return await Z6(Q),{migrated:K}}finally{Q.close()}}var s5,a5,t5;var M4=X4(async()=>{s5=fZ(fZ(fZ(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 K8,renameSync as X8,rmSync as Y8,writeFileSync as G8}from"fs";import{dirname as M8}from"path";function U8(Z,$){K8(M8(Z),{recursive:!0});let Q=`${Z}.tmp`;try{G8(Q,$),X8(Q,Z)}catch(J){throw Y8(Q,{force:!0}),J}}function j8(Z,$,Q=!1){U8(Z,JSON.stringify($,null,Q?2:void 0))}var D5=()=>{};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 LZ,readFileSync as gZ,writeFileSync as hZ}from"fs";import{homedir as H4}from"os";import{basename as K6,join as ZZ,parse as X6,resolve as U4}from"path";function t(){return process.env.BEACON_HOME||ZZ(H4(),".beacon")}function bZ(){return ZZ(t(),"workspaces.json")}function QZ(Z){return V6("sha256").update(Z).digest("hex").slice(0,12)}function mZ(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())&&$!==X6($).root}function L4(){return ZZ(t(),"deleted.json")}function pZ(){try{let Z=JSON.parse(gZ(L4(),"utf8"));return Array.isArray(Z)?Z:[]}catch{return[]}}function C4(Z){LZ(t(),{recursive:!0}),hZ(L4(),JSON.stringify(Z,null,2))}function B4(Z){return pZ().includes(Z)}function N4(Z){let $=pZ();if(!$.includes(Z))C4([...$,Z])}function Y6(Z){let $=pZ();if($.includes(Z))C4($.filter((Q)=>Q!==Z))}function n(Z){return ZZ(t(),Z)}function JZ(Z){return`file:${ZZ(n(Z),"db.sqlite")}`}function CZ(){try{let Z=JSON.parse(gZ(bZ(),"utf8"));return Array.isArray(Z)?Z:[]}catch{return[]}}function cZ(Z){LZ(t(),{recursive:!0}),hZ(bZ(),JSON.stringify(Z,null,2))}function AZ(){return CZ().sort((Z,$)=>$.lastOpenedAt.localeCompare(Z.lastOpenedAt))}function g(Z){return CZ().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=QZ(Z);if(B4(J))throw Error(`beacon: workspace ${J} (${Z}) was deleted \u2014 run \`beacon\` or /beacon-init to re-add it`);let V=CZ(),K=V.find((U)=>U.id===J),Y={id:J,path:Z,name:$||K?.name||K6(Z),lastOpenedAt:Q},X=[Y,...V.filter((U)=>U.id!==J)];return LZ(n(J),{recursive:!0}),cZ(X),Y}function o8(Z,$){return Y6(QZ(Z)),q4(Z,$)}function i8(Z,$=new Date().toISOString()){let Q=CZ(),J=Q.find((V)=>V.id===Z);if(!J)return;J.lastOpenedAt=$,cZ(Q)}function O4(Z){if(cZ(CZ().filter(($)=>$.id!==Z)),r()===Z)G6(AZ()[0]?.id??null)}function _4(){return ZZ(t(),"active")}function r(){try{return gZ(_4(),"utf8").trim()||null}catch{return null}}function G6(Z){LZ(t(),{recursive:!0}),hZ(_4(),Z??"")}function M6(){let Z=r();return Z?g(Z):null}function s8(){let Z=zZ()??r();return Z?g(Z):null}function a8(Z){return g(Z)?.path??null}function t8(){return j4(bZ())}var D4="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 e8(Z){let $=Z.headers.get("x-beacon-workspace");if($&&g($))return $;let Q=A4(Z,D4);if(Q&&g(Q))return Q;return U6()}function U6(){let Z=AZ();return Z.length===1?Z[0].id:null}var j6="x-beacon-workspace-path";async function Z$(Z){let $=Z.headers.get("x-beacon-workspace");if($&&g($))return $;let Q=Z.headers.get(j6);if(Q&&W4(Q)&&!B4(QZ(Q))&&(!$||QZ(Q)===$)){let V=q4(Q);return await lZ(V.id),V.id}let J=A4(Z,D4);if(J&&g(J))return J;return null}var z4=new Q6;function H6(Z,$){return Z?z4.run(Z,$):$()}function zZ(){return z4.getStore()??null}var xZ=new Set;function F4(Z){xZ.delete(ZZ(n(Z),"db.sqlite"))}async function lZ(Z){let $=n(Z),Q=ZZ($,"db.sqlite"),J=j4(Q);if(J&&xZ.has(Q))return{ok:!0,created:!1,migrated:!1};try{LZ($,{recursive:!0});let{provisionDb:V}=await M4().then(() => G4),K=await V(JZ(Z));return xZ.add(Q),{ok:!0,created:!J,migrated:J&&K.migrated}}catch(V){return{ok:!1,created:!1,migrated:!1,error:V instanceof Error?V.message:String(V)}}}import{existsSync as k8,readFileSync as w8}from"fs";import{resolve as f5}from"path";import{rmSync as v8}from"fs";import{drizzle as x6}from"drizzle-orm/libsql";import{createClient as g6}from"@libsql/client";var dZ={};uZ(dZ,{workspaceFlag:()=>O6,tag:()=>UZ,syncState:()=>a,projectMeta:()=>q6,planContract:()=>_6,note:()=>C6,nodeTags:()=>KZ,nodeFile:()=>BZ,node:()=>T,endpointTable:()=>i,endpoint:()=>v,edge:()=>VZ,draftTable:()=>c,draftRelation:()=>XZ,draftColumn:()=>qZ,dbTable:()=>E,dbRelation:()=>l,dbColumn:()=>e,codeFileEdge:()=>x,codeFile:()=>u,bugFlag:()=>NZ,boardAnnotation:()=>B6,appSetting:()=>N6});import{sqliteTable as w,index as k,foreignKey as W6,text as C,integer as z,real as b,uniqueIndex as o,primaryKey as L6}from"drizzle-orm/sqlite-core";import{createId as f}from"@paralleldrive/cuid2";var T=w("Node",{id:C().primaryKey().$defaultFn(()=>f()),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:z().default(2).notNull(),progress:z().default(0).notNull(),x:b().default(0).notNull(),y:b().default(0).notNull(),sourceRef:C(),externalId:C(),source:C().default("MANUAL").notNull(),planId:C(),parentId:C(),createdAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[k("Node_cluster_idx").on(Z.cluster),k("Node_parentId_idx").on(Z.parentId),k("Node_view_idx").on(Z.view),W6(()=>({columns:[Z.parentId],foreignColumns:[Z.id],name:"Node_parentId_Node_id_fk"})).onUpdate("cascade").onDelete("cascade")]),BZ=w("NodeFile",{id:C().primaryKey().$defaultFn(()=>f()),nodeId:C().notNull().references(()=>T.id,{onDelete:"cascade",onUpdate:"cascade"}),path:C().notNull()},(Z)=>[o("NodeFile_nodeId_path_key").on(Z.nodeId,Z.path),k("NodeFile_nodeId_idx").on(Z.nodeId)]),UZ=w("Tag",{id:C().primaryKey().$defaultFn(()=>f()),label:C().notNull(),color:C()},(Z)=>[o("Tag_label_key").on(Z.label)]),VZ=w("Edge",{id:C().primaryKey().$defaultFn(()=>f()),fromId:C().notNull().references(()=>T.id,{onDelete:"cascade",onUpdate:"cascade"}),toId:C().notNull().references(()=>T.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),k("Edge_toId_idx").on(Z.toId),k("Edge_fromId_idx").on(Z.fromId)]),KZ=w("_NodeTags",{a:C("A").notNull().references(()=>T.id,{onDelete:"cascade",onUpdate:"cascade"}),b:C("B").notNull().references(()=>UZ.id,{onDelete:"cascade",onUpdate:"cascade"})},(Z)=>[o("_NodeTags_AB_unique").on(Z.a,Z.b),k("_NodeTags_B_index").on(Z.b)]),C6=w("Note",{id:C().primaryKey().$defaultFn(()=>f()),title:C().default("Untitled").notNull(),body:C().default("").notNull(),ord:b().default(0).notNull(),pinned:z({mode:"boolean"}).default(!1).notNull(),createdAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[k("Note_updatedAt_idx").on(Z.updatedAt)]),B6=w("BoardAnnotation",{id:C().primaryKey().$defaultFn(()=>f()),targetKind:C().notNull(),targetId:C().notNull(),columnName:C(),body:C().default("").notNull(),x:b(),y:b(),createdAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[k("BoardAnnotation_target_idx").on(Z.targetId)]),NZ=w("BugFlag",{id:C().primaryKey().$defaultFn(()=>f()),nodeId:C().notNull().references(()=>T.id,{onDelete:"cascade",onUpdate:"cascade"}),by:C().notNull(),note:C().notNull(),resolvedAt:z({mode:"timestamp_ms"}),createdAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date)},(Z)=>[k("BugFlag_nodeId_idx").on(Z.nodeId)]),E=w("DbTable",{id:C().primaryKey().$defaultFn(()=>f()),name:C().notNull(),domain:C(),description:C(),source:C().default("MANUAL").notNull(),planId:C(),x:b().default(0).notNull(),y:b().default(0).notNull(),createdAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[k("DbTable_domain_idx").on(Z.domain),o("DbTable_name_key").on(Z.name)]),e=w("DbColumn",{id:C().primaryKey().$defaultFn(()=>f()),tableId:C().notNull().references(()=>E.id,{onDelete:"cascade",onUpdate:"cascade"}),name:C().notNull(),type:C().notNull(),isPk:z({mode:"boolean"}).default(!1).notNull(),isFk:z({mode:"boolean"}).default(!1).notNull(),nullable:z({mode:"boolean"}).default(!0).notNull(),note:C(),ord:z().default(0).notNull()},(Z)=>[o("DbColumn_tableId_name_key").on(Z.tableId,Z.name),k("DbColumn_tableId_idx").on(Z.tableId)]),l=w("DbRelation",{id:C().primaryKey().$defaultFn(()=>f()),fromTableId:C().notNull().references(()=>E.id,{onDelete:"cascade",onUpdate:"cascade"}),toTableId:C().notNull().references(()=>E.id,{onDelete:"cascade",onUpdate:"cascade"}),fromColumn:C().notNull(),toColumn:C().notNull(),label:C()},(Z)=>[k("DbRelation_toTableId_idx").on(Z.toTableId),k("DbRelation_fromTableId_idx").on(Z.fromTableId)]),v=w("Endpoint",{id:C().primaryKey().$defaultFn(()=>f()),method:C().notNull(),path:C().notNull(),domain:C(),description:C(),source:C().default("MANUAL").notNull(),planId:C(),x:b().default(0).notNull(),y:b().default(0).notNull(),createdAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[o("Endpoint_method_path_key").on(Z.method,Z.path),k("Endpoint_domain_idx").on(Z.domain)]),i=w("EndpointTable",{id:C().primaryKey().$defaultFn(()=>f()),endpointId:C().notNull().references(()=>v.id,{onDelete:"cascade",onUpdate:"cascade"}),tableId:C().notNull().references(()=>E.id,{onDelete:"cascade",onUpdate:"cascade"}),access:C().default("read").notNull()},(Z)=>[o("EndpointTable_endpointId_tableId_key").on(Z.endpointId,Z.tableId),k("EndpointTable_tableId_idx").on(Z.tableId)]),c=w("DraftTable",{id:C().primaryKey().$defaultFn(()=>f()),name:C().notNull(),domain:C(),description:C(),x:b().default(0).notNull(),y:b().default(0).notNull(),createdAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date)},(Z)=>[o("DraftTable_name_key").on(Z.name)]),qZ=w("DraftColumn",{id:C().primaryKey().$defaultFn(()=>f()),tableId:C().notNull().references(()=>c.id,{onDelete:"cascade",onUpdate:"cascade"}),name:C().notNull(),type:C().notNull(),isPk:z({mode:"boolean"}).default(!1).notNull(),isFk:z({mode:"boolean"}).default(!1).notNull(),nullable:z({mode:"boolean"}).default(!0).notNull(),note:C(),ord:z().default(0).notNull()},(Z)=>[k("DraftColumn_tableId_idx").on(Z.tableId)]),XZ=w("DraftRelation",{id:C().primaryKey().$defaultFn(()=>f()),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)=>[k("DraftRelation_toTableId_idx").on(Z.toTableId),k("DraftRelation_fromTableId_idx").on(Z.fromTableId)]),u=w("CodeFile",{path:C().primaryKey(),root:C(),lang:C(),x:b().default(0).notNull(),y:b().default(0).notNull(),mtimeMs:b(),size:z(),inDegree:z().default(0).notNull(),outDegree:z().default(0).notNull(),updatedAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)}),x=w("CodeFileEdge",{fromPath:C().notNull().references(()=>u.path,{onDelete:"cascade",onUpdate:"cascade"}),toPath:C().notNull().references(()=>u.path,{onDelete:"cascade",onUpdate:"cascade"}),circular:z({mode:"boolean"}).default(!1).notNull()},(Z)=>[k("CodeFileEdge_circular_idx").on(Z.circular),k("CodeFileEdge_toPath_idx").on(Z.toPath),k("CodeFileEdge_fromPath_idx").on(Z.fromPath),L6({columns:[Z.fromPath,Z.toPath],name:"CodeFileEdge_fromPath_toPath_pk"})]),a=w("SyncState",{id:C().primaryKey().default("singleton"),version:z().default(0).notNull(),codeGraphSyncedAt:z({mode:"timestamp_ms"}),updatedAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)}),N6=w("AppSetting",{id:C().primaryKey().default("singleton"),editor:C().default("auto").notNull(),currentFeatureId:C(),updatedAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)}),q6=w("ProjectMeta",{id:C().primaryKey().default("singleton"),overview:C(),conventions:C().default("[]").notNull(),hasFrontend:z({mode:"boolean"}),classificationRoots:C().default("[]").notNull(),updatedAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)}),O6=w("WorkspaceFlag",{id:C().primaryKey().$defaultFn(()=>f()),key:C().notNull(),enabled:z({mode:"boolean"}).default(!1).notNull(),config:C(),updatedAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[o("WorkspaceFlag_key_key").on(Z.key)]),_6=w("PlanContract",{id:C().primaryKey().$defaultFn(()=>f()),planId:C().notNull(),declaredFiles:C().default("[]").notNull(),authorizedExtras:C().default("[]").notNull(),active:z({mode:"boolean"}).default(!1).notNull(),createdAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:z({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[o("PlanContract_planId_key").on(Z.planId),k("PlanContract_active_idx").on(Z.active)]);var nZ={};uZ(nZ,{tagRelations:()=>F6,nodeTagsRelations:()=>P6,nodeRelations:()=>D6,nodeFileRelations:()=>A6,endpointTableRelations:()=>k6,endpointRelations:()=>v6,edgeRelations:()=>E6,draftTableRelations:()=>w6,draftRelationRelations:()=>y6,draftColumnRelations:()=>T6,dbTableRelations:()=>I6,dbRelationRelations:()=>S6,dbColumnRelations:()=>R6,codeFileRelations:()=>u6,codeFileEdgeRelations:()=>f6,bugFlagRelations:()=>z6});import{relations as h}from"drizzle-orm";var D6=h(T,({one:Z,many:$})=>({files:$(BZ),bugFlags:$(NZ),nodeTags:$(KZ),edgesOut:$(VZ,{relationName:"EdgeFrom"}),edgesIn:$(VZ,{relationName:"EdgeTo"}),parent:Z(T,{fields:[T.parentId],references:[T.id],relationName:"NodeTree"}),children:$(T,{relationName:"NodeTree"})})),A6=h(BZ,({one:Z})=>({node:Z(T,{fields:[BZ.nodeId],references:[T.id]})})),z6=h(NZ,({one:Z})=>({node:Z(T,{fields:[NZ.nodeId],references:[T.id]})})),F6=h(UZ,({many:Z})=>({nodeTags:Z(KZ)})),P6=h(KZ,({one:Z})=>({node:Z(T,{fields:[KZ.a],references:[T.id]}),tag:Z(UZ,{fields:[KZ.b],references:[UZ.id]})})),E6=h(VZ,({one:Z})=>({from:Z(T,{fields:[VZ.fromId],references:[T.id],relationName:"EdgeFrom"}),to:Z(T,{fields:[VZ.toId],references:[T.id],relationName:"EdgeTo"})})),I6=h(E,({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(E,{fields:[e.tableId],references:[E.id]})})),S6=h(l,({one:Z})=>({fromTable:Z(E,{fields:[l.fromTableId],references:[E.id],relationName:"FkFrom"}),toTable:Z(E,{fields:[l.toTableId],references:[E.id],relationName:"FkTo"})})),v6=h(v,({many:Z})=>({tables:Z(i)})),k6=h(i,({one:Z})=>({endpoint:Z(v,{fields:[i.endpointId],references:[v.id]}),table:Z(E,{fields:[i.tableId],references:[E.id]})})),w6=h(c,({many:Z})=>({columns:Z(qZ),fksOut:Z(XZ,{relationName:"DraftFkFrom"}),fksIn:Z(XZ,{relationName:"DraftFkTo"})})),T6=h(qZ,({one:Z})=>({table:Z(c,{fields:[qZ.tableId],references:[c.id]})})),y6=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"})})),u6=h(u,({many:Z})=>({edgesOut:Z(x,{relationName:"CFEFrom"}),edgesIn:Z(x,{relationName:"CFETo"})})),f6=h(x,({one:Z})=>({fromFile:Z(u,{fields:[x.fromPath],references:[u.path],relationName:"CFEFrom"}),toFile:Z(u,{fields:[x.toPath],references:[u.path],relationName:"CFETo"})}));var h6={...dZ,...nZ};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 m6=b6();function P4(Z){let $=g6({url:Z});return $.execute("PRAGMA foreign_keys = ON;"),$.execute("PRAGMA busy_timeout = 5000;"),x6($,{schema:h6})}var oZ=globalThis,rZ=oZ.dzDefault??P4(m6);oZ.dzDefault=rZ;var FZ=oZ.dzByUrl??=new Map;function iZ(Z){let $=FZ.get(Z);if(!$)$=P4(Z),FZ.set(Z,$);return $}function E4(Z){let $=FZ.get(Z);FZ.delete(Z);try{$?.$client?.close?.()}catch{}}function p6(){if(process.env.BEACON_REPO)return rZ;let Z=zZ()??r();if(!Z)return rZ;return iZ(JZ(Z))}var m=new Proxy({},{get(Z,$){let Q=p6(),J=Q[$];return typeof J==="function"?J.bind(Q):J}});import{existsSync as I8}from"fs";import{existsSync as k5,readFileSync as D8,watch as A8}from"fs";import{readFile as v5}from"fs/promises";import{join as _Z,relative as z8,resolve as F8}from"path";import{existsSync as l4,readFileSync as d4}from"fs";import{readdir as O7,readFile as _7,stat as n4}from"fs/promises";import{extname as r4,join as RZ,relative as HZ,resolve as jZ}from"path";import{extname as h4}from"path";import{dirname as c6,resolve as l6}from"path";var sZ=[".ts",".tsx",".js",".jsx",".mjs",".cjs"],d6=[/(?:^|[\n;])\s*(?:import|export)[^'"`\n]{0,4000}?from\s*['"]([^'"`]+)['"]/g,/(?:^|[\n;])\s*import\s*['"]([^'"`]+)['"]/g,/\brequire\(\s*['"]([^'"`]+)['"]\s*\)/g,/\bimport\(\s*['"]([^'"`]+)['"]\s*\)/g];function n6(Z){return Z.split(/[\\/]/).join("/")}function I4(Z,$){if($.has(Z))return Z;for(let Q of sZ){let J=`${Z}${Q}`;if($.has(J))return J}for(let Q of sZ){let J=`${Z}/index${Q}`;if($.has(J))return J}return null}function r6(Z){let $=new Set;for(let Q of d6)for(let J of Z.matchAll(Q))$.add(J[1]);return $}function o6(Z,$,Q,J){if(Z.startsWith(".")){let V=l6("/",c6($),Z),K=n6(V).replace(/^\//,"");return I4(K,Q)}for(let V of J)if(Z.startsWith(V.from)){let K=Z.slice(V.from.length),Y=V.to?`${V.to}/${K}`:K,X=I4(Y,Q);if(X)return X}return null}var R4={id:"ts",extensions:sZ,specifiers:r6,resolve(Z,$,Q){let J=o6(Z,$,Q.fileSet,Q.tsAliases??[]);return J?[J]:[]}};import{dirname as PZ,join as i6,normalize as s6}from"path";var a6=[".py",".pyi"],S4=[/(?:^|[\n;])\s*from\s+(\.*[\w.]*)\s+import\b/g,/(?:^|[\n;])\s*import\s+([\w.]+(?:\s*,\s*[\w.]+)*)/g];function v4(Z,$){for(let Q of[`${Z}.py`,`${Z}/__init__.py`,`${Z}.pyi`])if($.has(Q))return[Q];return[]}function t6(Z){let $=new Set;for(let Q of Z.matchAll(S4[0])){let J=Q[1].trim();if(J)$.add(J)}for(let Q of Z.matchAll(S4[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 k4={id:"python",extensions:a6,specifiers:t6,resolve(Z,$,Q){if(Z.startsWith(".")){let Y=Z.length-Z.replace(/^\.+/,"").length,X=Z.slice(Y),U=PZ($);for(let M=1;M<Y;M++)U=PZ(U);let H=X?i6(U,X.replace(/\./g,"/")):U;return v4(s6(H).replace(/\\/g,"/"),Q.fileSet)}let J=Z.replace(/\./g,"/"),V=[],K=PZ($);while(K&&K!=="."&&K!=="/")V.push(K),K=PZ(K);V.push("");for(let Y of V){let X=v4(Y?`${Y}/${J}`:J,Q.fileSet);if(X.length)return X}return[]}};import{dirname as e6}from"path";var Z7=[".go"],$7=/(?:^|[\n;])\s*import\s+(?:[\w.]+\s+)?"([^"]+)"/g,Q7=/(?:^|[\n;])\s*import\s*\(([\s\S]*?)\)/g,J7=/"([^"]+)"/g;function V7(Z){let $=new Set;for(let Q of Z.matchAll($7))$.add(Q[1]);for(let Q of Z.matchAll(Q7))for(let J of Q[1].matchAll(J7))$.add(J[1]);return $}var w4={id:"go",extensions:Z7,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 K=[];for(let Y of Q.fileSet){if(!Y.endsWith(".go"))continue;let X=e6(Y);if(V===""&&X==="."||X===V)K.push(Y)}return K.sort()},specifiers:V7};import{basename as T4,dirname as aZ,join as y4,normalize as u4}from"path";var K7=[".rs"],X7=/(?:^|[\n;])\s*(?:pub\s+)?mod\s+(\w+)\s*;/g,Y7=/(?:^|[\n;])\s*(?:pub\s+)?use\s+([\w:]+)/g;function G7(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 tZ(Z,$){for(let Q of[`${Z}.rs`,`${Z}/mod.rs`])if($.has(Q))return[Q];return[]}var M7=new Set(["mod.rs","lib.rs","main.rs"]);function U7(Z){let $=new Set;for(let Q of Z.matchAll(X7))$.add(`./${Q[1]}`);for(let Q of Z.matchAll(Y7)){let J=G7(Q[1]);if(J)$.add(J)}return $}var f4={id:"rust",extensions:K7,specifiers:U7,resolve(Z,$,Q){let J=Q.fileSet;if(Z.startsWith("./")||Z.startsWith("../")){let V=Z.replace(/^\.\//,""),K=u4(y4(aZ($),Z)).replace(/\\/g,"/"),Y=tZ(K,J);if(Y.length)return Y;if(Z.startsWith("./")&&!M7.has(T4($))){let X=y4(aZ($),T4($,".rs"),V);if(Y=tZ(u4(X).replace(/\\/g,"/"),J),Y.length)return Y}return[]}if(Z.startsWith("crate/")){let V=$.split("/"),K=V.lastIndexOf("src"),Y=K>=0?V.slice(0,K+1).join("/"):aZ($),X=Z.slice(6).split("/");for(let U of[X.join("/"),X.slice(0,-1).join("/")]){if(!U)continue;let H=tZ(`${Y}/${U}`,J);if(H.length)return H}return[]}return[]}};import{dirname as j7,extname as H7,join as W7,normalize as L7}from"path";var x4=[".swift",".java",".rb",".kt",".kts",".cs",".php",".scala",".c",".h",".cpp",".hpp",".cc",".hh",".m",".mm",".ex",".exs",".lua",".dart",".vue",".svelte"],C7=[/\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 C7)for(let J of Z.matchAll(Q)){let V=J[1].trim();if(V)$.add(V)}return $}var g4={id:"fallback",extensions:x4,specifiers:B7,resolve(Z,$,Q){let V=[H7($).toLowerCase(),...x4].filter((U,H,M)=>U&&M.indexOf(U)===H),K=Z.includes("/")||Z.includes("\\"),Y=Z.startsWith(".")||K?Z.replace(/\\/g,"/"):Z.replace(/[.:]+/g,"/"),X=[L7(W7(j7($),Y)).replace(/\\/g,"/"),Y.replace(/^\.\//,"")];for(let U of X){if(Q.fileSet.has(U))return[U];for(let H of V){let M=U.endsWith(H)?U:`${U}${H}`;if(Q.fileSet.has(M))return[M];if(Q.fileSet.has(`${U}/index${H}`))return[`${U}/index${H}`]}}return[]}};var N7=[R4,k4,w4,f4,g4],EZ=new Map;for(let Z of N7)for(let $ of Z.extensions)EZ.set($,Z);var q7={".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 eZ(Z){return EZ.get(h4(Z).toLowerCase())??null}function b4(Z){let $=h4(Z).toLowerCase();if(!EZ.has($))return null;return q7[$]??$.slice(1)}function Z4(){return new Set(EZ.keys())}var o4=new Set(["node_modules",".git",".next","dist","build","__pycache__","target",".venv","venv","env",".turbo","coverage",".beacon",".playwright-mcp","generated","migrations","alembic","migrate"]);function D7(Z=5){let $=performance.now();return async()=>{if(performance.now()-$>Z)await new Promise((Q)=>setImmediate(Q)),$=performance.now()}}var A7=()=>Promise.resolve();async function i4(Z,$,Q,J,V){let K;try{K=await O7($,{withFileTypes:!0})}catch{return}for(let Y of K){if(Y.name.startsWith("."))continue;if(o4.has(Y.name))continue;let X=RZ($,Y.name);if(Y.isDirectory()){await i4(Z,X,Q,J,V);continue}if(!Y.isFile())continue;if(Y.name.endsWith(".d.ts"))continue;if(!Q.has(r4(Y.name).toLowerCase()))continue;J.push(HZ(Z,X))}await V()}async function z7(Z,$=A7){let Q=[];return await i4(Z,Z,Z4(),Q,$),Q.map((J)=>J.split(/[\\/]/).join("/")).sort()}function F7(Z){try{return JSON.parse(Z)}catch{}let $=Z.replace(/\/\*[^"]*?\*\//g,"").replace(/(^|[^:"])\/\/.*$/gm,"$1").replace(/,\s*([}\]])/g,"$1");return JSON.parse($)}function m4(Z){return Z.replace(/^\.\/?/,"").replace(/\/$/,"")}function s4(Z){let $=RZ(Z,"tsconfig.json");if(!l4($))return[];let Q;try{Q=F7(d4($,"utf8"))}catch{return[]}let J=Q.compilerOptions?.paths??{},V=m4(Q.compilerOptions?.baseUrl??"."),K=[];for(let[Y,X]of Object.entries(J)){if(!Y.endsWith("/*")||!X.length)continue;let U=X[0];if(!U.endsWith("/*"))continue;let H=Y.slice(0,-1),M=m4(U.slice(0,-1)),L=[V,M].filter(Boolean).join("/");K.push({from:H,to:L})}return K}function IZ(Z){let $=RZ(Z,"go.mod");if(!l4($))return null;try{let Q=/^\s*module\s+(\S+)/m.exec(d4($,"utf8"));return Q?Q[1]:null}catch{return null}}function p(Z){return Z.split(/[\\/]/).join("/")}function a4(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 P7(Z,$,Q){let J=(Array.isArray(Z)?Z:[Z]).map((H)=>p(jZ(H))),V=p($?jZ($):J.length===1?J[0]:a4(J)),K=new Map,Y=[];for(let H of J){let M=p(HZ(V,H));for(let L of s4(H))Y.push({from:L.from,to:[M,L.to].filter(Boolean).join("/")});for(let L of await z7(H,Q)){let B=p(RZ(H,L)),q=p(HZ(V,B));if(K.has(q))continue;try{let j=await n4(B);K.set(q,{path:q,abs:B,root:M||null,mtimeMs:j.mtimeMs,size:j.size})}catch{}await Q()}}let X=J.map(IZ).find(Boolean)??IZ(V);return{metas:[...K.values()].sort((H,M)=>H.path.localeCompare(M.path)),ctx:{fileSet:new Set(K.keys()),tsAliases:Y,goModulePath:X}}}var p4=50000;function E7(Z){let $=0;for(let Q=0;Q<Z.length;Q++)if(Z.charCodeAt(Q)===10){if(Q-$>p4)return!0;$=Q+1}return Z.length-$>p4}async function c4(Z){let $=eZ(Z.path);if(!$||Z.size>200000)return new Set;try{let Q=await _7(Z.abs,"utf8");if(E7(Q))return new Set;return $.specifiers(Q)}catch{return new Set}}function t4(Z,$){let Q=(Array.isArray(Z)?Z:[Z]).map((j)=>p(jZ(j))),J=p($?jZ($):Q.length===1?Q[0]:a4(Q)),V=new Map,K=new Map,Y=[],X=null;function U(){Y=[];for(let j of Q){let W=p(HZ(J,j));for(let O of s4(j))Y.push({from:O.from,to:[W,O.to].filter(Boolean).join("/")})}X=Q.map(IZ).find(Boolean)??IZ(J)}function H(j){let W=j.split("/");for(let _=0;_<W.length;_++){let N=W[_];if(!N||N.startsWith("."))return!0;if(_<W.length-1&&o4.has(N))return!0}let O=W[W.length-1];if(O.endsWith(".d.ts"))return!0;return!Z4().has(r4(O).toLowerCase())}function M(j){let W=p(jZ(j));for(let O of Q)if(W===O||W.startsWith(`${O}/`)){let _=W.slice(O.length).replace(/^\/+/,"");if(H(_))return null;return{path:p(HZ(J,W)),root:p(HZ(J,O))||null}}return null}function L(){let j={fileSet:new Set(V.keys()),tsAliases:Y,goModulePath:X},W=[...V.values()].sort((N,G)=>N.path.localeCompare(G.path)),O=[];for(let N of W){let G=eZ(N.path);if(!G)continue;let D=K.get(N.path)??new Set,A=new Set;for(let R of D)for(let y of G.resolve(R,N.path,j)){if(!y||y===N.path||A.has(y))continue;A.add(y),O.push({from:N.path,to:y})}}return{files:W.map((N)=>({path:N.path,lang:b4(N.path),root:N.root,mtimeMs:N.mtimeMs,size:N.size})),edges:O}}async function B(){let j=D7(),{metas:W,ctx:O}=await P7(Z,$,j);V.clear(),K.clear();for(let _ of W)await j(),V.set(_.path,_),K.set(_.path,await c4(_));return Y=O.tsAliases??[],X=O.goModulePath??null,L()}async function q(j){let W=p(jZ(j));if(!Q.some((A)=>W===A||W.startsWith(`${A}/`)))return!1;let O=W.split("/").pop()??"";if(O==="tsconfig.json"||O==="go.mod"){let A=W.slice(0,W.length-O.length-1);if(Q.includes(A))return U(),!0;return!1}let _=M(j);if(!_)return!1;let N;try{N=await n4(W)}catch{let A=V.delete(_.path);return K.delete(_.path),A}let G=V.get(_.path);if(G&&G.mtimeMs===N.mtimeMs&&G.size===N.size)return!1;let D={path:_.path,abs:W,root:_.root,mtimeMs:N.mtimeMs,size:N.size};return V.set(_.path,D),K.set(_.path,await c4(D)),!0}return{seed:B,applyChange:q,snapshot:L}}function e4(Z){let $=Object.keys(Z.tableVars),Q=new Map;if(!$.length){for(let Y of Z.routeFiles)Q.set(Y,[]);return Q}let J=new Map;for(let Y of Z.edges){let X=J.get(Y.from)??[];X.push(Y.to),J.set(Y.from,X)}let V=new Map($.map((Y)=>[Y,new RegExp(`(?:query\\.${Y}\\b|\\.from\\(\\s*${Y}\\b)`)])),K=new Map($.map((Y)=>[Y,new RegExp(`(?:insert|update|delete)\\(\\s*${Y}\\b`)]));for(let Y of Z.routeFiles){let X=new Set([Y]),U=[Y];for(let B=0;B<2&&X.size<25;B++){let q=[];for(let j of U)for(let W of J.get(j)??[]){if(X.has(W)||X.size>=25)continue;X.add(W),q.push(W)}U=q}let H=new Set,M=new Set;for(let B of X){let q=Z.content(B);if(!q)continue;for(let j of $){if(!H.has(j)&&V.get(j).test(q))H.add(j);if(!M.has(j)&&K.get(j).test(q))M.add(j)}}let L=[];for(let B of $){let q=H.has(B),j=M.has(B);if(!q&&!j)continue;L.push({table:Z.tableVars[B],access:q&&j?"read-write":j?"write":"read"})}Q.set(Y,L)}return Q}function $5(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 K=Q[2]??"",Y=K.match(/\d+/)?.[0];switch(Q[1]){case"GUID":case"Uuid":case"UUID":return"uuid";case"String":return Y?`varchar(${Y})`:"varchar";case"Text":return"text";case"DateTime":return/timezone\s*=\s*True/.test(K)?"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 Y?`vector(${Y})`:"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 I7(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 R7(Z,$,Q){let J=Q.match(/__tablename__\s*=\s*["']([^"']+)["']/)?.[1],V=[],K=[],Y=[],X=/(\w+)\s*:\s*Mapped\s*\[/g,U;while(U=X.exec(Q)){let L=U.index+U[0].length-1,B=I7(Q,L);if(B===null)continue;let q=L+B.length+2,j=Q.slice(q).match(/^\s*=\s*(\w+)\s*\(/);if(!j||j[1]!=="mapped_column")continue;Y.push({colName:U[1],pyType:B,argsAt:q+j[0].length-1})}let H=/(\w+)\s*=\s*(mapped_column|Column)\s*\(/g;while(U=H.exec(Q))Y.push({colName:U[1],pyType:"",argsAt:U.index+U[0].length-1});Y.sort((L,B)=>L.argsAt-B.argsAt);let M=new Set;for(let L of Y){if(M.has(L.colName)||L.colName==="__tablename__")continue;M.add(L.colName);let B=SZ(Q,L.argsAt),q=/primary_key\s*=\s*True/.test(B)||void 0,j=/nullable\s*=\s*False/.test(B)?!1:!0,W=B.match(/ForeignKey\(\s*["']([^"']+?)\.([^"'.]+)["']/);if(V.push({name:L.colName,type:$5(B,L.pyType),isPk:q,isFk:W?!0:void 0,nullable:j}),W)K.push({column:L.colName,toTable:W[1],toColumn:W[2]})}return{name:Z,bases:$,tableName:J,columns:V,fks:K}}function S7(Z){let $=[],Q=[],J=/\bTable\s*(\()\s*["']([^"']+)["']\s*,/g,V;while(V=J.exec(Z)){let K=V[2],Y=SZ(Z,V.index+V[0].indexOf("("));if(!/\bmetadata\b/.test(Y)||!/\bColumn\s*\(/.test(Y))continue;let X=[],U=/\bColumn\s*\(/g,H;while(H=U.exec(Y)){let M=SZ(Y,H.index+H[0].length-1),L=M.match(/^\s*["'](\w+)["']\s*,/)?.[1];if(!L)continue;let B=/primary_key\s*=\s*True/.test(M)||void 0,q=/nullable\s*=\s*False/.test(M)?!1:!0,j=M.match(/ForeignKey\(\s*["']([^"']+?)\.([^"'.]+)["']/);if(X.push({name:L,type:$5(M,""),isPk:B,isFk:j?!0:void 0,nullable:q}),j)Q.push({fromTable:K,fromColumn:L,toTable:j[1],toColumn:j[2]})}if(X.length)$.push({name:K,columns:X})}return{tables:$,relations:Q}}function v7(Z){let $=new Map,Q={tables:[],relations:[]};for(let X of Z){if(!X.path.endsWith(".py"))continue;if(!/mapped_column\s*\(|__tablename__|\bTable\s*\(\s*["']/.test(X.content))continue;let U=S7(X.content);Q.tables.push(...U.tables),Q.relations.push(...U.relations);let H=/^class\s+(\w+)\s*\(([^)]*)\)\s*:/gm,M,L=[];while(M=H.exec(X.content))L.push({name:M[1],bases:M[2].split(",").map((B)=>B.trim().split(/[.[]/)[0]).filter(Boolean),at:M.index});for(let B=0;B<L.length;B++){let q=X.content.slice(L[B].at,L[B+1]?.at??X.content.length),j=R7(L[B].name,L[B].bases,q);$.set(j.name,j)}}if(![...$.values()].some((X)=>X.tableName)&&!Q.tables.length)return{tables:[],relations:[]};let J=(X,U=new Set)=>{if(U.has(X.name))return[];U.add(X.name);let H=[];for(let M of X.bases){let L=$.get(M);if(L&&!L.tableName)H.push(...J(L,U))}return H.push(...X.columns),H},V=[],K=[];for(let X of $.values()){if(!X.tableName)continue;let U=J(X),H=new Map;for(let j of U)if(!H.has(j.name))H.set(j.name,j);let M=[...H.values()],L=(j)=>M.splice(M.findIndex((W)=>W.name===j),1)[0],B=M.some((j)=>j.name==="id")?L("id"):null,q=["created_at","updated_at","deleted_at"].filter((j)=>M.some((W)=>W.name===j)).map((j)=>L(j));V.push({name:X.tableName,columns:[...B?[B]:[],...M,...q]});for(let j of X.fks)K.push({fromTable:X.tableName,fromColumn:j.column,toTable:j.toTable,toColumn:j.toColumn})}let Y=new Set(V.map((X)=>X.name));for(let X of Q.tables)if(!Y.has(X.name))V.push(X);return K.push(...Q.relations.filter((X)=>!Y.has(X.fromTable))),{tables:V,relations:K}}function k7(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 w7(Z){let $=[],Q=[];for(let J of Z){if(!J.path.endsWith(".prisma"))continue;let V=/model\s+(\w+)\s*\{([\s\S]*?)\}/g,K;while(K=V.exec(J.content)){let Y=K[1],X=K[2].match(/@@map\(\s*["']([^"']+)["']\s*\)/)?.[1]??Y,U=[];for(let H of K[2].split(`
4
+ `)){let M=H.trim().match(/^(\w+)\s+(\w+(?:\[\])?\??)\s*(.*)$/);if(!M||/^@@/.test(H.trim()))continue;let[,L,B,q]=M,j=/^(String|Int|BigInt|Float|Decimal|Boolean|DateTime|Json|Bytes)(\[\])?\??$/.test(B),W=q.match(/@relation\([^)]*fields:\s*\[(\w+)\][^)]*references:\s*\[(\w+)\]/);if(W)Q.push({fromTable:X,fromColumn:W[1],toTable:B.replace(/[?[\]]/g,""),toColumn:W[2]});if(!j)continue;U.push({name:L,type:k7(B),isPk:/@id\b/.test(q)||void 0,isFk:/@relation\b/.test(q)||void 0,nullable:B.endsWith("?")})}if(U.length)$.push({name:X,columns:U})}}return{tables:$,relations:Q}}function T7(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 y7(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 u7(Z){let $=[],Q=/(\w+)\s*:\s*(text|integer|real|blob|numeric|varchar|boolean|timestamp|serial|uuid|json|jsonb)\s*\(/g;for(let K of Z){if(!/\.(ts|tsx|mts|cts)$/.test(K.path))continue;if(!/\b(?:sqliteTable|pgTable|mysqlTable)\s*\(/.test(K.content))continue;let Y=/(?:export\s+)?const\s+(\w+)\s*=\s*(?:sqliteTable|pgTable|mysqlTable)\s*\(\s*["']([^"']+)["']\s*,/g,X;while(X=Y.exec(K.content)){let U=K.content.indexOf("{",X.index+X[0].length);if(U<0)continue;let H=y7(K.content,U),M={varName:X[1],tableName:X[2],columns:[],colByProp:new Map,fks:[]},L=[];Q.lastIndex=0;for(let B of H.matchAll(Q))L.push({prop:B[1],builder:B[2],at:B.index,argOpen:B.index+B[0].length-1});L.forEach((B,q)=>{let j=H.slice(B.at,L[q+1]?.at??H.length),W=SZ(H,B.argOpen),_=W.match(/^\s*["']([^"']+)["']/)?.[1]??B.prop,N=j.match(/\.references\(\s*\(\)\s*=>\s*(\w+)\.(\w+)/);if(M.columns.push({name:_,type:T7(B.builder,W),isPk:/\.primaryKey\(\)/.test(j)||void 0,isFk:N?!0:void 0,nullable:/\.notNull\(\)/.test(j)?!1:!0}),M.colByProp.set(B.prop,_),N)M.fks.push({column:_,toVar:N[1],toProp:N[2]})}),$.push(M)}}if(!$.length)return{tables:[],relations:[]};let J=new Map($.map((K)=>[K.varName,K])),V=[];for(let K of $)for(let Y of K.fks){let X=J.get(Y.toVar);if(!X)continue;V.push({fromTable:K.tableName,fromColumn:Y.column,toTable:X.tableName,toColumn:X.colByProp.get(Y.toProp)??Y.toProp})}return{tables:$.map((K)=>({name:K.tableName,columns:K.columns})),relations:V,tableVars:Object.fromEntries($.map((K)=>[K.varName,K.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"},x7=/^(List|Set|Map|Collection|Iterable)$/;function Q5(Z){if(/byte\s*\[\s*\]/.test(Z))return"byte[]";return(Z.replace(/<.*>/,"").trim().split(".").pop()??Z).trim()}function g7(Z){let $=Q5(Z);if($==="byte[]")return"bytea";return f7[$]??$.toLowerCase()}function vZ(Z,$){return Z.match(new RegExp(`\\b${$}\\s*=\\s*"([^"]*)"`))?.[1]}function Z5(Z,$){let Q=Z.match(new RegExp(`\\b${$}\\s*=\\s*(true|false)`));return Q?Q[1]==="true":void 0}function h7(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:K,rest:Y}=h7(V);if(Q.push(...K),!Y)continue;let X=Y,U="";while(X!==U)U=X,X=X.replace(/^(?:public|private|protected|static|final|transient|volatile)\s+/,"");let H=!X.includes("(")?X.match(/^([\w.$]+(?:<[^>]*>)?(?:\s*\[\s*\])?)\s+(\w+)\s*[;=]/):null;if(H)$.push({annots:Q,type:H[1],name:H[2]});Q=[]}return $}function m7(Z){let $=[],Q=/\bclass\s+(\w+)/g,J;while(J=Q.exec(Z))$.push({name:J[1],at:J.index});let V=[];for(let K=0;K<$.length;K++){let Y=Z.slice(K===0?0:$[K-1].at,$[K].at);if(!/@Entity\b/.test(Y))continue;let X=Y.match(/@Table\s*\([^)]*\)/)?.[0]??"",U=vZ(X,"name")??$[K].name,H=Z.slice($[K].at,$[K+1]?.at??Z.length),M=b7(H),L=M.find((q)=>q.annots.some((j)=>/@Id\b/.test(j))),B=L?vZ(L.annots.find((q)=>/@Column\b/.test(q))??"","name")??L.name:"id";V.push({className:$[K].name,tableName:U,idColumn:B,fields:M})}return V}function p7(Z){let $=Z.filter((X)=>X.path.endsWith(".java")&&/@Entity\b/.test(X.content));if(!$.length)return{tables:[],relations:[]};let Q=$.flatMap((X)=>m7(X.content));if(!Q.length)return{tables:[],relations:[]};let J=new Map(Q.map((X)=>[X.className,X.tableName])),V=new Map(Q.map((X)=>[X.className,X.idColumn])),K=[],Y=[];for(let X of Q){let U=[];for(let H of X.fields){let M=H.annots.join(" ");if(/@Transient\b/.test(M))continue;let L=Q5(H.type);if(/@ManyToOne\b|@OneToOne\b|@OneToMany\b|@ManyToMany\b/.test(M)||J.has(L)){let N=H.annots.find((D)=>/@JoinColumn\b/.test(D)),G=N?vZ(N,"name"):void 0;if(G){U.push({name:G,type:"bigint",isFk:!0,nullable:Z5(M,"nullable")??!0});let D=J.get(L);if(D)Y.push({fromTable:X.tableName,fromColumn:G,toTable:D,toColumn:V.get(L)??"id"})}continue}if(x7.test(L))continue;let j=H.annots.find((N)=>/@Column\b/.test(N))??"",W=vZ(j,"name")??H.name,O=H.annots.some((N)=>/@Id\b/.test(N)),_=Z5(j,"nullable");U.push({name:W,type:g7(H.type),...O?{isPk:!0}:{},..._!==void 0?{nullable:_}:{}})}K.push({name:X.tableName,columns:U})}return{tables:K,relations:Y}}function J5(Z){let $=u7(Z);if($.tables.length)return $;let Q=w7(Z);if(Q.tables.length)return Q;let J=v7(Z);if(J.tables.length)return J;return p7(Z)}var c7=["GET","POST","PUT","PATCH","DELETE"];function l7(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 V5(Z){let $=[];for(let Q of Z){let J=l7(Q.path);if(!J)continue;for(let V of c7)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 d7=/(^|\/)app\/.*\/route\.(ts|tsx|js|jsx|mjs)$/,n7=/\.(ts|py)$/,r7=/(schema|model)/i,o7=/(\.(test|spec)\.[jt]sx?$)|(^|\/)(tests?|__tests__|__mocks__)\/|(^|\/)test_[^/]+\.py$|_test\.py$/;function $4(Z){if(o7.test(Z))return!1;if(Z.endsWith(".prisma"))return!0;if(d7.test(Z))return!0;if(Z.endsWith(".java"))return!0;return n7.test(Z)&&r7.test(Z)}function K5(Z,$=300){return Z.filter($4).slice(0,$)}import{z as d}from"zod";import{and as P5,eq as WZ,inArray as N8,notInArray as q8}from"drizzle-orm";import{z as P}from"zod";import{and as H8,eq as TZ,inArray as J4,notInArray as W8,or as L8,sql as C8}from"drizzle-orm";var X5=240,Y5=50;function G5(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+Y5&&J.y+Y5>V.y)return!0}return!1}import{eq as i7}from"drizzle-orm";var M5=(Z)=>Z.replace(/\{[^}]*\}/g,"{}");function s7(Z,$){if(Z.method.toUpperCase()!==$.method.toUpperCase())return!1;let Q=M5(Z.path),J=M5($.path);return J===Q||J.endsWith(Q)}async function U5(Z=m){let[$,Q]=await Promise.all([Z.query.endpoint.findMany({where:(V,{ne:K})=>K(V.source,"INTROSPECTION")}),Z.query.endpoint.findMany({where:(V,{eq:K})=>K(V.source,"INTROSPECTION")})]),J={collapsed:0,mappings:[]};for(let V of $){let K=Q.find((Y)=>s7(V,Y));if(!K)continue;await Z.delete(v).where(i7(v.id,V.id)),J.collapsed++,J.mappings.push({planned:`${V.method} ${V.path}`,code:`${K.method} ${K.path}`})}return J}import{and as j5,inArray as a7,isNull as H5,ne as W5,or as t7}from"drizzle-orm";var e7=new Set(["DONE","CANCELLED","DEPRIORITIZED"]);async function Z8(Z){let $=await Z.query.node.findMany({where:(J,{and:V,eq:K,isNotNull:Y})=>V(K(J.view,"ROADMAP"),Y(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)&&e7.has(J.status))}return[...Q.entries()].filter(([,J])=>J).map(([J])=>J)}async function L5(Z=m){let $=await Z8(Z),Q=(K)=>$.length?t7(H5(K.planId),a7(K.planId,$)):H5(K.planId),J=await Z.delete(E).where(j5(W5(E.source,"INTROSPECTION"),Q(E))).returning({id:E.id}),V=await Z.delete(v).where(j5(W5(v.source,"INTROSPECTION"),Q(v))).returning({id:v.id});return{tables:J.length,endpoints:V.length}}var B5=320;function $Z(Z){return 36+Math.max(0,Z)*30+16}var YZ=60,$8=280,kZ=14,C5=120,OZ=170,Q8=2560;var wZ=(Z)=>(Z??"").trim()||"\u2014";function J8(Z,$,Q){let J=new Map;for(let K of Z.uses){if(!$.has(K.tableId))continue;J.set(K.tableId,(J.get(K.tableId)??0)+1)}let V=null;for(let[K,Y]of J){if(V===null){V=K;continue}let X=J.get(V);if(Y>X){V=K;continue}if(Y<X)continue;let U=Q?.get(K)??0,H=Q?.get(V)??0;if(U<H)V=K;else if(U===H&&$.get(K).localeCompare($.get(V))<0)V=K}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 K of V.uses){if(!Q.has(K.tableId))continue;J.set(K.tableId,(J.get(K.tableId)??0)+1)}return new Map($.map((V)=>[V.id,J8(V,Q,J)]))}var V8=(Z,$)=>Z.path.localeCompare($.path)||Z.method.localeCompare($.method)||Z.id.localeCompare($.id);function N5(Z,$){let Q=Q4(Z,$),J=new Map,V=[];for(let N of[...$].sort(V8)){let G=Q.get(N.id)??null;if(G){let D=J.get(G);if(D)D.push(N);else J.set(G,[N])}else V.push(N)}let K=(N)=>{let G=J.get(N.id)?.length??0;return $Z(N.columnCount)+(G?kZ+G*YZ:0)+50},Y=Array.from(new Set(Z.map((N)=>wZ(N.domain)))),X=Y.filter((N)=>N!=="\u2014").sort(),U=Y.includes("\u2014")?[...X,"\u2014"]:X,H=[];for(let N of U){let G=Z.filter((S)=>wZ(S.domain)===N).sort((S,I)=>S.name.localeCompare(I.name)),D=G.reduce((S,I)=>S+K(I),0),A=Math.max(1,Math.min(12,G.length,Math.round(Math.sqrt(D/320)))),R=Array(A).fill(0),y=new Map;for(let S of G){let I=0;for(let F=1;F<A;F++)if(R[F]<R[I])I=F;y.set(S.id,{x:I*320,y:R[I]}),R[I]+=K(S)}H.push({d:N,w:A*320,h:Math.max(...R,0),tableLocal:y})}let M=H.reduce((N,G)=>N+(G.w+C5)*(G.h+OZ),0),L=Math.max(Q8,Math.round(Math.sqrt(M*2.2))),B=new Map,q=new Map,j=0,W=0,O=0,_=0;for(let N of H){if(j>0&&j+N.w>L)W+=O+OZ,j=0,O=0;let G=Z.filter((D)=>N.tableLocal.has(D.id));for(let D of G){let A=N.tableLocal.get(D.id),R=j+A.x,y=W+A.y;B.set(D.id,{x:R,y}),(J.get(D.id)??[]).forEach((I,F)=>{q.set(I.id,{x:R,y:y+$Z(D.columnCount)+kZ+F*YZ})})}O=Math.max(O,N.h),_=Math.max(_,W+N.h),j+=N.w+C5}if(V.length){let N=_+OZ,G=Math.max(1,Math.min(4,Math.ceil(Math.sqrt(V.length/2))));V.forEach((D,A)=>{q.set(D.id,{x:A%G*$8,y:N+Math.floor(A/G)*YZ})})}return{tables:B,endpoints:q}}function q5(Z,$,Q){let J=Q4($,Q),V=new Map;for(let q of Q){let j=J.get(q.id);if(j)V.set(j,(V.get(j)??0)+1)}let K=(q)=>{let j=V.get(q.id)??0;return q.y+$Z(q.columnCount)+(j?kZ+j*YZ:0)},Y=wZ(Z.domain),X=$.filter((q)=>wZ(q.domain)===Y);if(!X.length){let q=$.length?Math.max(...$.map(K),...Q.map((j)=>j.y+YZ)):0;return{x:0,y:$.length||Q.length?q+OZ:0}}let U=Math.min(...X.map((q)=>q.x)),H=X.map((q)=>Math.max(0,Math.round((q.x-U)/320))),M=Math.min(12,Math.max(...H)+1),L=Array(M).fill(Math.min(...X.map((q)=>q.y)));X.forEach((q,j)=>{let W=Math.min(H[j],M-1);L[W]=Math.max(L[W],K(q)+50)});let B=0;for(let q=1;q<M;q++)if(L[q]<L[B])B=q;return{x:U+B*320,y:L[B]}}function O5(Z,$,Q){let J=Q4($,[...Q,Z]),V=J.get(Z.id),K=V?$.find((X)=>X.id===V):void 0;if(K){let X=Q.filter((M)=>J.get(M.id)===K.id),U=K.y+$Z(K.columnCount)+kZ,H=X.length?Math.max(...X.map((M)=>M.y))+YZ:U;return{x:K.x,y:H}}let Y=[...$.map((X)=>X.y+$Z(X.columnCount)),...Q.map((X)=>X.y+YZ)];return{x:0,y:Y.length?Math.max(...Y)+OZ:0}}function _5(Z){let $=B5-20;for(let Q=0;Q<Z.length;Q++)for(let J=Q+1;J<Z.length;J++){let V=Z[Q],K=Z[J],Y=$Z(V.columnCount),X=$Z(K.columnCount);if(V.x<K.x+$&&V.x+$>K.x&&V.y<K.y+X&&V.y+Y>K.y)return!0}return!1}import{eq as A5}from"drizzle-orm";D5();async function z5(Z=m){let[$,Q]=await Promise.all([Z.query.dbTable.findMany({with:{columns:{columns:{id:!0}}},orderBy:(K,{asc:Y})=>Y(K.name)}),Z.query.endpoint.findMany({with:{tables:{columns:{tableId:!0}}}})]),J=N5($.map((K)=>({id:K.id,name:K.name,domain:K.domain,columnCount:K.columns.length})),Q.map((K)=>({id:K.id,method:K.method,path:K.path,uses:K.tables.map((Y)=>({tableId:Y.tableId}))}))),V=0;for(let K of $){let Y=J.tables.get(K.id);if(!Y||Math.round(Y.x)===Math.round(K.x)&&Math.round(Y.y)===Math.round(K.y))continue;await Z.update(E).set({x:Y.x,y:Y.y}).where(A5(E.id,K.id)),V++}for(let K of Q){let Y=J.endpoints.get(K.id);if(!Y||Math.round(Y.x)===Math.round(K.x)&&Math.round(Y.y)===Math.round(K.y))continue;await Z.update(v).set({x:Y.x,y:Y.y}).where(A5(v.id,K.id)),V++}return V}var B8=P.object({tables:P.array(P.object({name:P.string().trim().min(1),domain:P.string().nullish(),description:P.string().nullish(),columns:P.array(P.object({name:P.string().trim().min(1),type:P.string().trim().min(1),isPk:P.boolean().optional(),isFk:P.boolean().optional(),nullable:P.boolean().optional(),note:P.string().nullish()})).default([])})).default([]),relations:P.array(P.object({fromTable:P.string(),fromColumn:P.string(),toTable:P.string(),toColumn:P.string(),label:P.string().nullish()})).default([]),endpoints:P.array(P.object({method:P.string().trim().min(1),path:P.string().trim().min(1),domain:P.string().nullish(),description:P.string().nullish(),uses:P.array(P.object({table:P.string(),access:P.string().default("read")})).default([])})).default([])});async function yZ(Z=m){let[$]=await Z.insert(a).values({id:"singleton",version:1}).onConflictDoUpdate({target:a.id,set:{version:C8`${a.version} + 1`}}).returning();return $.version}async function F5(Z,$=m,Q={}){let J=B8.parse(Z),V=J.tables.length>0,K=J.endpoints.length>0,Y=J.tables.map((G)=>G.name);if(V)await $.delete(E).where(Y.length?H8(TZ(E.source,"INTROSPECTION"),W8(E.name,Y)):TZ(E.source,"INTROSPECTION"));let X=await $.query.dbTable.findMany({columns:{id:!0,name:!0,domain:!0,x:!0,y:!0},with:{columns:{columns:{id:!0}}}}),U=await $.query.endpoint.findMany({columns:{id:!0,method:!0,path:!0,x:!0,y:!0},with:{tables:{columns:{tableId:!0}}}}),H=new Map(X.map((G)=>[G.name,G])),M=X.map((G)=>({id:G.id,name:G.name,domain:G.domain,columnCount:G.columns.length,x:G.x,y:G.y})),L=U.map((G)=>({id:G.id,method:G.method,path:G.path,uses:G.tables.map((D)=>({tableId:D.tableId})),x:G.x,y:G.y})),B=new Map;for(let G of J.tables){if(H.has(G.name))continue;let D=q5({domain:G.domain??null,columnCount:G.columns.length},M,L);B.set(G.name,D),M.push({id:`new:${G.name}`,name:G.name,domain:G.domain??null,columnCount:G.columns.length,...D})}let q=new Map;for(let G of J.tables){let D=H.get(G.name),A=B.get(G.name),R=D?.x??A?.x??0,y=D?.y??A?.y??0,[S]=await $.insert(E).values({name:G.name,domain:G.domain??null,description:G.description??null,source:"INTROSPECTION",x:R,y}).onConflictDoUpdate({target:E.name,set:{...G.domain!=null?{domain:G.domain}:{},...G.description!=null?{description:G.description}:{},source:"INTROSPECTION"}}).returning();if(q.set(G.name,S.id),await $.delete(e).where(TZ(e.tableId,S.id)),G.columns.length)await $.insert(e).values(G.columns.map((I,F)=>({tableId:S.id,name:I.name,type:I.type,isPk:I.isPk??!1,isFk:I.isFk??!1,nullable:I.nullable??!0,note:I.note??null,ord:F})))}let j=[...q.values()];if(j.length)await $.delete(l).where(L8(J4(l.fromTableId,j),J4(l.toTableId,j)));for(let G of J.relations){let D=q.get(G.fromTable),A=q.get(G.toTable);if(!D||!A)continue;await $.insert(l).values({fromTableId:D,toTableId:A,fromColumn:G.fromColumn,toColumn:G.toColumn,label:G.label??`${G.fromColumn} \u2192 ${G.toTable}.${G.toColumn}`})}let W=new Set(J.endpoints.map((G)=>`${G.method} ${G.path}`));if(K){let D=(await $.query.endpoint.findMany({where:(A,{eq:R})=>R(A.source,"INTROSPECTION")})).filter((A)=>!W.has(`${A.method} ${A.path}`)).map((A)=>A.id);if(D.length)await $.delete(v).where(J4(v.id,D))}for(let G of M)if(G.id.startsWith("new:"))G.id=q.get(G.name)??G.id;for(let G of J.endpoints){let D=await $.query.endpoint.findFirst({where:(S,{and:I,eq:F})=>I(F(S.method,G.method),F(S.path,G.path))}),A,R;if(D)A=D.x,R=D.y;else{let S={id:`new:${G.method} ${G.path}`,method:G.method,path:G.path,uses:G.uses.map((F)=>({tableId:q.get(F.table)??""})).filter((F)=>F.tableId)},I=O5(S,M,L);A=I.x,R=I.y,L.push({...S,x:A,y:R})}let[y]=await $.insert(v).values({method:G.method,path:G.path,domain:G.domain??null,description:G.description??null,source:"INTROSPECTION",x:A,y:R}).onConflictDoUpdate({target:[v.method,v.path],set:{...G.domain!=null?{domain:G.domain}:{},...G.description!=null?{description:G.description}:{},source:"INTROSPECTION"}}).returning();if(!Q.partial||G.uses.length>0)await $.delete(i).where(TZ(i.endpointId,y.id));for(let S of G.uses){let I=q.get(S.table)??(await $.query.dbTable.findFirst({where:(F,{eq:MZ})=>MZ(F.name,S.table)}))?.id;if(!I)continue;await $.insert(i).values({endpointId:y.id,tableId:I,access:S.access})}}await U5($),await L5($);let O=await $.query.dbTable.findMany({where:(G,{eq:D})=>D(G.source,"INTROSPECTION"),columns:{x:!0,y:!0},with:{columns:{columns:{id:!0}}}}),_=await $.select({x:v.x,y:v.y}).from(v);if(_5(O.map((G)=>({x:G.x,y:G.y,columnCount:G.columns.length})))||G5(_))await z5($);let N=await yZ($);return{tables:J.tables.length,relations:J.relations.length,endpoints:J.endpoints.length,version:N}}var E5=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 I5(Z,$){let Q=new Map;for(let B of Z)Q.set(B,[]);for(let B of $)Q.get(B.from)?.push(B.to);let J=new Map,V=new Map,K=new Set,Y=[],X=new Map,U=[],H=0,M=0;for(let B of Z){if(J.has(B))continue;let q=[{v:B,iter:0}];J.set(B,H),V.set(B,H),H++,Y.push(B),K.add(B);while(q.length){let j=q[q.length-1],W=Q.get(j.v)??[];if(j.iter<W.length){let O=W[j.iter++];if(!J.has(O))J.set(O,H),V.set(O,H),H++,Y.push(O),K.add(O),q.push({v:O,iter:0});else if(K.has(O))V.set(j.v,Math.min(V.get(j.v),J.get(O)))}else{if(V.get(j.v)===J.get(j.v)){let _=0,N;do N=Y.pop(),K.delete(N),X.set(N,M),_++;while(N!==j.v);U.push(_),M++}q.pop();let O=q[q.length-1];if(O)V.set(O.v,Math.min(V.get(O.v),V.get(j.v)))}}}let L=new Set;for(let B of $){let q=X.get(B.from);if(q!==void 0&&q===X.get(B.to)&&U[q]>1)L.add(`${B.from}|${B.to}`)}return L}async function R5(Z,$=m){let Q=E5.parse(Z),J=Q.files.map((L)=>L.path),V=new Set(J),K=Q.edges.filter((L)=>V.has(L.from)&&V.has(L.to)&&L.from!==L.to),Y=I5(J,K),X=new Map,U=new Map;for(let L of K)U.set(L.from,(U.get(L.from)??0)+1),X.set(L.to,(X.get(L.to)??0)+1);await $.delete(u).where(q8(u.path,J));for(let L of Q.files){let B={root:L.root??null,lang:L.lang??null,mtimeMs:L.mtimeMs??null,size:L.size??null,inDegree:X.get(L.path)??0,outDegree:U.get(L.path)??0};await $.insert(u).values({path:L.path,...B}).onConflictDoUpdate({target:u.path,set:B})}await $.delete(x);let H=0;if(K.length)await $.insert(x).values(K.map((L)=>{let B=Y.has(`${L.from}|${L.to}`);if(B)H++;return{fromPath:L.from,toPath:L.to,circular:B}}));let M=await yZ($);return await $.update(a).set({codeGraphSyncedAt:new Date}).where(WZ(a.id,"singleton")),{files:Q.files.length,edges:K.length,circular:H,version:M}}var O8=(Z,$)=>`${Z}\x00${$}`;function V4(Z){let $=E5.parse(Z),Q=$.files.map((M)=>M.path),J=new Set(Q),V=$.edges.filter((M)=>J.has(M.from)&&J.has(M.to)&&M.from!==M.to),K=I5(Q,V),Y=new Map,X=new Map;for(let M of V)X.set(M.from,(X.get(M.from)??0)+1),Y.set(M.to,(Y.get(M.to)??0)+1);let U=new Map;for(let M of $.files)U.set(M.path,{root:M.root??null,lang:M.lang??null,mtimeMs:M.mtimeMs??null,size:M.size??null,inDegree:Y.get(M.path)??0,outDegree:X.get(M.path)??0});let H=new Map;for(let M of V)H.set(O8(M.from,M.to),{from:M.from,to:M.to,circular:K.has(`${M.from}|${M.to}`)});return{files:U,edges:H}}var _8=(Z,$)=>Z.root===$.root&&Z.lang===$.lang&&Z.mtimeMs===$.mtimeMs&&Z.size===$.size&&Z.inDegree===$.inDegree&&Z.outDegree===$.outDegree;async function S5(Z,$,Q=m){for(let[X,U]of $.files){let H=Z.files.get(X);if(H&&_8(H,U))continue;let M={root:U.root,lang:U.lang,mtimeMs:U.mtimeMs,size:U.size,inDegree:U.inDegree,outDegree:U.outDegree};await Q.insert(u).values({path:X,...M}).onConflictDoUpdate({target:u.path,set:M})}let J=[...Z.files.keys()].filter((X)=>!$.files.has(X));if(J.length)await Q.delete(u).where(N8(u.path,J));for(let[X,U]of Z.edges)if(!$.edges.has(X))await Q.delete(x).where(P5(WZ(x.fromPath,U.from),WZ(x.toPath,U.to)));let V=[];for(let[X,U]of $.edges){let H=Z.edges.get(X);if(!H)V.push({fromPath:U.from,toPath:U.to,circular:U.circular});else if(H.circular!==U.circular)await Q.update(x).set({circular:U.circular}).where(P5(WZ(x.fromPath,U.from),WZ(x.toPath,U.to)))}if(V.length)await Q.insert(x).values(V);let K=await yZ(Q);await Q.update(a).set({codeGraphSyncedAt:new Date}).where(WZ(a.id,"singleton"));let Y=0;for(let X of $.edges.values())if(X.circular)Y++;return{files:$.files.size,edges:$.edges.size,circular:Y,version:K}}var P8=/[/\\](node_modules|\.git|\.next|dist|build|__pycache__|target|\.venv|venv|\.beacon|\.playwright-mcp|generated|coverage)[/\\]/;function E8(Z){try{let $=_Z(Z,"beacon.config.json");if(k5($)){let Q=JSON.parse(D8($,"utf8"));if(Array.isArray(Q.roots)&&Q.roots.length)return Q.roots.map((J)=>F8(Z,J))}}catch{}return[Z]}function w5(Z){let $=E8(Z.path),Q=lZ(Z.id),J=iZ(JZ(Z.id)),V=t4($,Z.path);async function K(){let W=K5(V.snapshot().files.map((D)=>D.path));for(let D of $)for(let A of["prisma/schema.prisma","schema.prisma"]){let R=_Z(D,A);if(k5(R))W.push(Y(R))}let O=[];for(let D of W)try{O.push({path:D,content:await v5(_Z(Z.path,D),"utf8")})}catch{}let _=J5(O),N=V5(O);if(!_.tables.length&&!N.length)return;if(N.length&&_.tableVars&&Object.keys(_.tableVars).length){let A=V.snapshot().edges,R=new Set(N.map((F)=>F.file)),y=new Map;for(let F of A){let MZ=y.get(F.from)??[];MZ.push(F.to),y.set(F.from,MZ)}for(let F=0;F<2;F++)for(let MZ of[...R])for(let b5 of y.get(MZ)??[])R.add(b5);let S=new Map;for(let F of[...R].slice(0,600))try{S.set(F,await v5(_Z(Z.path,F),"utf8"))}catch{}let I=e4({routeFiles:[...new Set(N.map((F)=>F.file))],edges:A,content:(F)=>S.get(F)??null,tableVars:_.tableVars});for(let F of N)F.uses=I.get(F.file)??[]}let G=await F5({tables:_.tables,relations:_.relations,endpoints:N},J,{partial:!0});console.log(`[beacon-inline] schema synced (${Z.name}): ${G.tables} tables / ${G.endpoints} endpoints`)}function Y(W){return z8(Z.path,W).split(/[\\/]/).join("/")}let X=null,U=!1,H=new Set,M=null,L=!1;async function B(){if(L){q();return}L=!0;try{if(await Q,U)X=null,U=!1;if(X===null){let N=await V.seed(),G=await R5(N,J);X=V4(N),console.log(`[beacon-inline] code-graph synced (${Z.name}): ${G.files} files / ${G.edges} imports${G.circular>0?` (${G.circular} circular)`:""}`),await K();return}let W=[...H];H.clear();let O=W.some((N)=>$4(Y(N))),_=!1;for(let N of W)if(await V.applyChange(N))_=!0;if(_){let N=V4(V.snapshot()),G=await S5(X,N,J);X=N,console.log(`[beacon-inline] code-graph updated (${Z.name}): ${G.files} files / ${G.edges} imports${G.circular>0?` (${G.circular} circular)`:""}`)}if(O)await K()}catch(W){console.error(`[beacon-inline] error (${Z.name}):`,W instanceof Error?W.message:W)}finally{L=!1}}function q(){if(M)clearTimeout(M);M=setTimeout(B,600)}let j=[];for(let W of $)try{let O=A8(W,{recursive:!0,persistent:!0},(_,N)=>{if(!N){U=!0,q();return}let G=String(N);if(P8.test(`/${G}`))return;H.add(_Z(W,G)),q()});O.on("error",(_)=>console.error(`[beacon-inline] watcher error (${Z.name}):`,_)),j.push(O)}catch(O){console.error(`[beacon-inline] live watch unavailable for ${W} (${Z.name}):`,O instanceof Error?O.message:O)}return console.log(`[beacon-inline] watching ${Z.name} (${$.join(", ")}) \u2014 initial extract\u2026`),B(),{async stop(){if(M)clearTimeout(M);for(let W of j)W.close()}}}function R8(Z){let $=Z.limit??6,Q=Z.hardCap??12,J=new Map,V=0,K=new Set;function Y(W){let O=J.get(W);if(O)O.seq=++V}function X(W){if(J.has(W.id))return Y(W.id);if(!Z.exists(W.path))return;J.set(W.id,{handle:Z.start(W),seq:++V})}function U(){let W=null,O=1/0;for(let[_,N]of J){if(K.has(_))continue;if(N.seq<O)O=N.seq,W=_}if(W)J.get(W).handle.stop(),J.delete(W)}function H(){let W=Z.list().filter((O)=>Z.exists(O.path)).slice(0,$);K=new Set(W.map((O)=>O.id));for(let O of W)X(O);for(let[O,_]of[...J]){let N=Z.get(O);if(!N||!Z.exists(N.path))_.handle.stop(),J.delete(O)}}function M(W){if(J.has(W))return Y(W);let O=Z.get(W);if(!O||!Z.exists(O.path))return;if(J.size>=Q)U();if(J.size>=Q)return;J.set(W,{handle:Z.start(O),seq:++V})}async function L(W){let O=J.get(W);if(!O)return;J.delete(W),await O.handle.stop()}function B(W){return J.has(W)}function q(){return[...J.keys()]}async function j(){await Promise.all([...J.values()].map((W)=>W.handle.stop())),J.clear()}return{reconcile:H,ensureWatcher:M,stopWatcher:L,isWatching:B,activeIds:q,stopAll:j}}var S8=R8({list:AZ,get:g,exists:I8,start:(Z)=>w5(Z)});async function T5(Z){await S8.stopWatcher(Z)}async function y5(Z){if(!g(Z))return{ok:!1,removed:!1,fallbackId:r(),error:"unknown workspace"};O4(Z),N4(Z),await T5(Z),E4(JZ(Z)),F4(Z);try{v8(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),x5=K4.includes("--yes")||K4.includes("-y"),GZ=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 T8(){if(!GZ)return g(QZ(mZ(process.cwd())));if(/^[0-9a-f]{12}$/.test(GZ)){let Z=g(GZ);if(Z)return Z}return g(QZ(mZ(f5(GZ))))}var s=T8();if(!s)console.error(`[beacon] ${GZ??process.cwd()} is not a registered Beacon workspace \u2014 nothing to remove.`),process.exit(1);console.log(h5(x5?"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(!x5)console.log(h5("Nothing was changed.")),console.log(` Run \x1B[1mbeacon remove${GZ?` ${GZ}`:""} --yes\x1B[0m to apply.
7
+ `),process.exit(0);async function y8(Z){try{let{pid:$,port:Q}=JSON.parse(w8(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 y8(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
+ `)}if(k8(n(s.id)))console.error(`[beacon] warning: ${n(s.id)} still exists \u2014 remove it manually.`),process.exit(1);