trybeacon 0.1.48 → 0.1.49

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 (105) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +8 -8
  3. package/.next/build-manifest.json +2 -2
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  6. package/.next/server/app/_global-error.html +1 -1
  7. package/.next/server/app/_global-error.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  15. package/.next/server/app/_not-found.html +1 -1
  16. package/.next/server/app/_not-found.rsc +2 -2
  17. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  18. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  20. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  21. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  22. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  23. package/.next/server/app/api/db/arrange/route.js +1 -1
  24. package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  25. package/.next/server/app/docs.html +1 -1
  26. package/.next/server/app/docs.rsc +2 -2
  27. package/.next/server/app/docs.segments/_full.segment.rsc +2 -2
  28. package/.next/server/app/docs.segments/_head.segment.rsc +1 -1
  29. package/.next/server/app/docs.segments/_index.segment.rsc +2 -2
  30. package/.next/server/app/docs.segments/_tree.segment.rsc +2 -2
  31. package/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +1 -1
  32. package/.next/server/app/docs.segments/docs.segment.rsc +1 -1
  33. package/.next/server/app/feedback/page_client-reference-manifest.js +1 -1
  34. package/.next/server/app/feedback.html +1 -1
  35. package/.next/server/app/feedback.rsc +2 -2
  36. package/.next/server/app/feedback.segments/_full.segment.rsc +2 -2
  37. package/.next/server/app/feedback.segments/_head.segment.rsc +1 -1
  38. package/.next/server/app/feedback.segments/_index.segment.rsc +2 -2
  39. package/.next/server/app/feedback.segments/_tree.segment.rsc +2 -2
  40. package/.next/server/app/feedback.segments/feedback/__PAGE__.segment.rsc +1 -1
  41. package/.next/server/app/feedback.segments/feedback.segment.rsc +1 -1
  42. package/.next/server/app/help/page_client-reference-manifest.js +1 -1
  43. package/.next/server/app/help.html +1 -1
  44. package/.next/server/app/help.rsc +2 -2
  45. package/.next/server/app/help.segments/_full.segment.rsc +2 -2
  46. package/.next/server/app/help.segments/_head.segment.rsc +1 -1
  47. package/.next/server/app/help.segments/_index.segment.rsc +2 -2
  48. package/.next/server/app/help.segments/_tree.segment.rsc +2 -2
  49. package/.next/server/app/help.segments/help/__PAGE__.segment.rsc +1 -1
  50. package/.next/server/app/help.segments/help.segment.rsc +1 -1
  51. package/.next/server/app/index.html +1 -1
  52. package/.next/server/app/index.rsc +3 -3
  53. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  54. package/.next/server/app/index.segments/_full.segment.rsc +3 -3
  55. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  56. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  57. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  58. package/.next/server/app/map/page.js +2 -2
  59. package/.next/server/app/map/page.js.nft.json +1 -1
  60. package/.next/server/app/map/page_client-reference-manifest.js +1 -1
  61. package/.next/server/app/page.js +1 -1
  62. package/.next/server/app/page_client-reference-manifest.js +1 -1
  63. package/.next/server/app/plan/page.js +2 -2
  64. package/.next/server/app/plan/page.js.nft.json +1 -1
  65. package/.next/server/app/plan/page_client-reference-manifest.js +1 -1
  66. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  67. package/.next/server/app-paths-manifest.json +8 -8
  68. package/.next/server/chunks/1341.js +1 -1
  69. package/.next/server/chunks/2933.js +1 -1
  70. package/.next/server/chunks/{7208.js → 2999.js} +3 -3
  71. package/.next/server/chunks/7331.js +1 -0
  72. package/.next/server/chunks/9734.js +1 -1
  73. package/.next/server/middleware-build-manifest.js +1 -1
  74. package/.next/server/pages/404.html +1 -1
  75. package/.next/server/pages/500.html +1 -1
  76. package/.next/server/server-reference-manifest.js +1 -1
  77. package/.next/server/server-reference-manifest.json +1 -1
  78. package/.next/static/chunks/3343-af1292b51a276724.js +1 -0
  79. package/.next/static/chunks/7323-480fb88e9d24f9e9.js +1 -0
  80. package/.next/static/chunks/app/map/page-66d71744ae3363d7.js +1 -0
  81. package/.next/static/chunks/app/page-541e900d67f17dae.js +1 -0
  82. package/.next/static/chunks/app/plan/page-e7d16fa2a3713a92.js +1 -0
  83. package/.next/static/css/629ab377241de9ca.css +1 -0
  84. package/.next/trace +39 -39
  85. package/.next/trace-build +1 -1
  86. package/dist/bin/beacon.js +7 -7
  87. package/dist/bin/doctor.js +27 -26
  88. package/dist/bin/hook.js +27 -26
  89. package/dist/bin/mcp.js +34 -33
  90. package/dist/bin/plan.js +29 -28
  91. package/dist/bin/remove.js +7 -7
  92. package/dist/bin/uninstall.js +26 -25
  93. package/dist/lib/assets.js +14 -13
  94. package/dist/lib/codex-install.js +24 -23
  95. package/dist/lib/global-install.js +24 -23
  96. package/package.json +1 -1
  97. package/.next/server/chunks/805.js +0 -1
  98. package/.next/static/chunks/8074-a6b2725786399e2c.js +0 -1
  99. package/.next/static/chunks/85-82015ecb44b65d3e.js +0 -1
  100. package/.next/static/chunks/app/map/page-c06fcf30d8172f82.js +0 -1
  101. package/.next/static/chunks/app/page-968dd5a6f667bff9.js +0 -1
  102. package/.next/static/chunks/app/plan/page-257d486640eadd7f.js +0 -1
  103. package/.next/static/css/5a58d83133d25695.css +0 -1
  104. /package/.next/static/{gNMdQmtkjPn6XQhRMDoMg → qeqVD-yeoYO_3C0pw9kHg}/_buildManifest.js +0 -0
  105. /package/.next/static/{gNMdQmtkjPn6XQhRMDoMg → qeqVD-yeoYO_3C0pw9kHg}/_ssgManifest.js +0 -0
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
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);
3
+ var p5=Object.defineProperty;var c5=(Z)=>Z;function l5(Z,$){this[Z]=c5.bind(null,$)}var xZ=(Z,$)=>{for(var Q in $)p5(Z,Q,{get:$[Q],enumerable:!0,configurable:!0,set:l5.bind($,Q)})};var G4=(Z,$)=>()=>(Z&&($=Z(Z=0)),$);var U4={};xZ(U4,{provisionDb:()=>Q6});import{createClient as d5}from"@libsql/client";import{drizzle as n5}from"drizzle-orm/libsql";import{migrate as r5}from"drizzle-orm/libsql/migrator";import{readMigrationFiles as o5}from"drizzle-orm/migrator";import{dirname as fZ,join as i5}from"path";import{fileURLToPath as s5}from"url";async function DZ(Z,$){return(await Z.execute({sql:"SELECT 1 FROM sqlite_master WHERE type='table' AND name = ?",args:[$]})).rows.length>0}async function Z6(Z,$){let Q=await Z.execute(`PRAGMA table_info("${$}")`);return new Set(Q.rows.map((J)=>String(J.name)))}async function M4(Z){if(!await DZ(Z,"__drizzle_migrations"))return 0;let $=await Z.execute('SELECT count(*) AS n FROM "__drizzle_migrations"');return Number($.rows[0]?.n??0)}async function $6(Z){for(let[$,Q]of Object.entries(e5)){if(!await DZ(Z,$))continue;let J=await Z6(Z,$);for(let V of Q){if(!J.has(V))continue;await Z.execute(`UPDATE "${$}" SET "${V}" = CAST((julianday("${V}") - 2440587.5) * 86400000 AS INTEGER) WHERE typeof("${V}") = 'text'`)}}}async function Q6(Z,$=t5){let Q=d5({url:Z});try{await Q.execute("PRAGMA journal_mode = WAL;"),await Q.execute("PRAGMA foreign_keys = ON;"),await Q.execute("PRAGMA busy_timeout = 5000;");let J=await DZ(Q,"__drizzle_migrations"),V=await DZ(Q,"Node"),Y=!1;if(V&&!J){let K=o5({migrationsFolder:$})[0];if(K)await Q.execute('CREATE TABLE IF NOT EXISTS "__drizzle_migrations" (id SERIAL PRIMARY KEY, hash text NOT NULL, created_at numeric)'),await Q.execute({sql:'INSERT INTO "__drizzle_migrations" ("hash", "created_at") VALUES (?, ?)',args:[K.hash,K.folderMillis]}),Y=!0}let X=await M4(Q);if(await r5(n5(Q),{migrationsFolder:$}),await M4(Q)>X)Y=!0;return await $6(Q),{migrated:Y}}finally{Q.close()}}var a5,t5,e5;var j4=G4(async()=>{a5=fZ(fZ(fZ(s5(import.meta.url)))),t5=process.env.BEACON_MIGRATIONS_DIR||i5(a5,"drizzle"),e5={Node:["createdAt","updatedAt"],Note:["createdAt","updatedAt"],DbTable:["createdAt","updatedAt"],Endpoint:["createdAt","updatedAt"],DraftTable:["createdAt"],SyncState:["codeGraphSyncedAt","updatedAt"],AppSetting:["updatedAt"],ProjectMeta:["updatedAt"],CodeFile:["updatedAt"]}});import{mkdirSync as W8,renameSync as N8,rmSync as C8,writeFileSync as L8}from"fs";import{dirname as B8}from"path";function q8(Z,$){W8(B8(Z),{recursive:!0});let Q=`${Z}.tmp`;try{L8(Q,$),N8(Q,Z)}catch(J){throw C8(Q,{force:!0}),J}}function O8(Z,$,Q=!1){q8(Z,JSON.stringify($,null,Q?2:void 0))}var F5=()=>{};import{AsyncLocalStorage as J6}from"async_hooks";import{spawnSync as V6}from"child_process";import{createHash as K6}from"crypto";import{existsSync as W4,mkdirSync as CZ,readFileSync as hZ,writeFileSync as mZ}from"fs";import{homedir as N4}from"os";import{basename as Y6,join as ZZ,parse as X6,resolve as H4}from"path";function t(){return process.env.BEACON_HOME||ZZ(N4(),".beacon")}function bZ(){return ZZ(t(),"workspaces.json")}function JZ(Z){return K6("sha256").update(Z).digest("hex").slice(0,12)}function pZ(Z=process.cwd()){let $=V6("git",["rev-parse","--show-toplevel"],{cwd:Z,stdio:["ignore","pipe","ignore"]});if($.status===0){let Q=$.stdout?.toString().trim();if(Q)return Q}return Z}function C4(Z){let $=H4(Z);return $!==H4(N4())&&$!==X6($).root}function L4(){return ZZ(t(),"deleted.json")}function cZ(){try{let Z=JSON.parse(hZ(L4(),"utf8"));return Array.isArray(Z)?Z:[]}catch{return[]}}function B4(Z){CZ(t(),{recursive:!0}),mZ(L4(),JSON.stringify(Z,null,2))}function q4(Z){return cZ().includes(Z)}function O4(Z){let $=cZ();if(!$.includes(Z))B4([...$,Z])}function G6(Z){let $=cZ();if($.includes(Z))B4($.filter((Q)=>Q!==Z))}function n(Z){return ZZ(t(),Z)}function VZ(Z){return`file:${ZZ(n(Z),"db.sqlite")}`}function LZ(){try{let Z=JSON.parse(hZ(bZ(),"utf8"));return Array.isArray(Z)?Z:[]}catch{return[]}}function lZ(Z){CZ(t(),{recursive:!0}),mZ(bZ(),JSON.stringify(Z,null,2))}function FZ(){return LZ().sort((Z,$)=>$.lastOpenedAt.localeCompare(Z.lastOpenedAt))}function g(Z){return LZ().find(($)=>$.id===Z)??null}function z4(Z,$,Q=new Date().toISOString()){if(!C4(Z))throw Error(`beacon: refusing to register a non-repo path as a workspace: ${Z}`);let J=JZ(Z);if(q4(J))throw Error(`beacon: workspace ${J} (${Z}) was deleted \u2014 run \`beacon\` or /beacon-init to re-add it`);let V=LZ(),Y=V.find((j)=>j.id===J),X={id:J,path:Z,name:$||Y?.name||Y6(Z),lastOpenedAt:Q},K=[X,...V.filter((j)=>j.id!==J)];return CZ(n(J),{recursive:!0}),lZ(K),X}function Q$(Z,$){return G6(JZ(Z)),z4(Z,$)}function J$(Z,$=new Date().toISOString()){let Q=LZ(),J=Q.find((V)=>V.id===Z);if(!J)return;J.lastOpenedAt=$,lZ(Q)}function D4(Z){if(lZ(LZ().filter(($)=>$.id!==Z)),r()===Z)M6(FZ()[0]?.id??null)}function F4(){return ZZ(t(),"active")}function r(){try{return hZ(F4(),"utf8").trim()||null}catch{return null}}function M6(Z){CZ(t(),{recursive:!0}),mZ(F4(),Z??"")}function U6(){let Z=r();return Z?g(Z):null}function V$(){let Z=_Z()??r();return Z?g(Z):null}function K$(Z){return g(Z)?.path??null}function Y$(){return W4(bZ())}var _4="beacon_ws";function A4(Z,$){let Q=Z.headers.get("cookie");if(!Q)return null;for(let J of Q.split(";")){let V=J.indexOf("=");if(V===-1)continue;if(J.slice(0,V).trim()===$)return decodeURIComponent(J.slice(V+1).trim())}return null}function X$(Z){let $=Z.headers.get("x-beacon-workspace");if($&&g($))return $;let Q=A4(Z,_4);if(Q&&g(Q))return Q;return j6()}function j6(){let Z=FZ();return Z.length===1?Z[0].id:null}var H6="x-beacon-workspace-path";async function G$(Z){let $=Z.headers.get("x-beacon-workspace");if($&&g($))return $;let Q=Z.headers.get(H6);if(Q&&C4(Q)&&!q4(JZ(Q))&&(!$||JZ(Q)===$)){let V=z4(Q);return await dZ(V.id),V.id}let J=A4(Z,_4);if(J&&g(J))return J;return null}var P4=new J6;function W6(Z,$){return Z?P4.run(Z,$):$()}function _Z(){return P4.getStore()??null}var gZ=new Set;function I4(Z){gZ.delete(ZZ(n(Z),"db.sqlite"))}async function dZ(Z){let $=n(Z),Q=ZZ($,"db.sqlite"),J=W4(Q);if(J&&gZ.has(Q))return{ok:!0,created:!1,migrated:!1};try{CZ($,{recursive:!0});let{provisionDb:V}=await j4().then(() => U4),Y=await V(VZ(Z));return gZ.add(Q),{ok:!0,created:!J,migrated:J&&Y.migrated}}catch(V){return{ok:!1,created:!1,migrated:!1,error:V instanceof Error?V.message:String(V)}}}import{existsSync as h8,readFileSync as m8}from"fs";import{resolve as f5}from"path";import{rmSync as g8}from"fs";import{drizzle as g6}from"drizzle-orm/libsql";import{createClient as h6}from"@libsql/client";var nZ={};xZ(nZ,{workspaceFlag:()=>z6,tag:()=>jZ,syncState:()=>a,projectMeta:()=>O6,planContract:()=>D6,note:()=>L6,nodeTags:()=>YZ,nodeFile:()=>BZ,node:()=>k,endpointTable:()=>i,endpoint:()=>E,edge:()=>KZ,draftTable:()=>c,draftRelation:()=>XZ,draftColumn:()=>OZ,dbTable:()=>P,dbRelation:()=>l,dbColumn:()=>e,codeFileEdge:()=>x,codeFile:()=>y,bugFlag:()=>qZ,boardAnnotation:()=>B6,appSetting:()=>q6});import{sqliteTable as v,index as S,foreignKey as N6,text as C,integer as _,real as m,uniqueIndex as o,primaryKey as C6}from"drizzle-orm/sqlite-core";import{createId as u}from"@paralleldrive/cuid2";var k=v("Node",{id:C().primaryKey().$defaultFn(()=>u()),view:C().notNull(),kind:C().default("FEATURE").notNull(),cluster:C(),layer:C(),title:C().notNull(),role:C(),plain:C(),status:C().default("PENDING").notNull(),priority:_().default(2).notNull(),progress:_().default(0).notNull(),x:m().default(0).notNull(),y:m().default(0).notNull(),sourceRef:C(),externalId:C(),source:C().default("MANUAL").notNull(),planId:C(),parentId:C(),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[S("Node_cluster_idx").on(Z.cluster),S("Node_parentId_idx").on(Z.parentId),S("Node_view_idx").on(Z.view),N6(()=>({columns:[Z.parentId],foreignColumns:[Z.id],name:"Node_parentId_Node_id_fk"})).onUpdate("cascade").onDelete("cascade")]),BZ=v("NodeFile",{id:C().primaryKey().$defaultFn(()=>u()),nodeId:C().notNull().references(()=>k.id,{onDelete:"cascade",onUpdate:"cascade"}),path:C().notNull()},(Z)=>[o("NodeFile_nodeId_path_key").on(Z.nodeId,Z.path),S("NodeFile_nodeId_idx").on(Z.nodeId)]),jZ=v("Tag",{id:C().primaryKey().$defaultFn(()=>u()),label:C().notNull(),color:C()},(Z)=>[o("Tag_label_key").on(Z.label)]),KZ=v("Edge",{id:C().primaryKey().$defaultFn(()=>u()),fromId:C().notNull().references(()=>k.id,{onDelete:"cascade",onUpdate:"cascade"}),toId:C().notNull().references(()=>k.id,{onDelete:"cascade",onUpdate:"cascade"}),kind:C().default("DEPENDS").notNull(),label:C(),sourceHandle:C(),targetHandle:C()},(Z)=>[o("Edge_fromId_toId_kind_key").on(Z.fromId,Z.toId,Z.kind),S("Edge_toId_idx").on(Z.toId),S("Edge_fromId_idx").on(Z.fromId)]),YZ=v("_NodeTags",{a:C("A").notNull().references(()=>k.id,{onDelete:"cascade",onUpdate:"cascade"}),b:C("B").notNull().references(()=>jZ.id,{onDelete:"cascade",onUpdate:"cascade"})},(Z)=>[o("_NodeTags_AB_unique").on(Z.a,Z.b),S("_NodeTags_B_index").on(Z.b)]),L6=v("Note",{id:C().primaryKey().$defaultFn(()=>u()),title:C().default("Untitled").notNull(),body:C().default("").notNull(),ord:m().default(0).notNull(),pinned:_({mode:"boolean"}).default(!1).notNull(),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[S("Note_updatedAt_idx").on(Z.updatedAt)]),B6=v("BoardAnnotation",{id:C().primaryKey().$defaultFn(()=>u()),targetKind:C().notNull(),targetId:C().notNull(),columnName:C(),body:C().default("").notNull(),x:m(),y:m(),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[S("BoardAnnotation_target_idx").on(Z.targetId)]),qZ=v("BugFlag",{id:C().primaryKey().$defaultFn(()=>u()),nodeId:C().notNull().references(()=>k.id,{onDelete:"cascade",onUpdate:"cascade"}),by:C().notNull(),note:C().notNull(),resolvedAt:_({mode:"timestamp_ms"}),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date)},(Z)=>[S("BugFlag_nodeId_idx").on(Z.nodeId)]),P=v("DbTable",{id:C().primaryKey().$defaultFn(()=>u()),name:C().notNull(),domain:C(),description:C(),source:C().default("MANUAL").notNull(),planId:C(),x:m().default(0).notNull(),y:m().default(0).notNull(),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[S("DbTable_domain_idx").on(Z.domain),o("DbTable_name_key").on(Z.name)]),e=v("DbColumn",{id:C().primaryKey().$defaultFn(()=>u()),tableId:C().notNull().references(()=>P.id,{onDelete:"cascade",onUpdate:"cascade"}),name:C().notNull(),type:C().notNull(),isPk:_({mode:"boolean"}).default(!1).notNull(),isFk:_({mode:"boolean"}).default(!1).notNull(),nullable:_({mode:"boolean"}).default(!0).notNull(),note:C(),ord:_().default(0).notNull()},(Z)=>[o("DbColumn_tableId_name_key").on(Z.tableId,Z.name),S("DbColumn_tableId_idx").on(Z.tableId)]),l=v("DbRelation",{id:C().primaryKey().$defaultFn(()=>u()),fromTableId:C().notNull().references(()=>P.id,{onDelete:"cascade",onUpdate:"cascade"}),toTableId:C().notNull().references(()=>P.id,{onDelete:"cascade",onUpdate:"cascade"}),fromColumn:C().notNull(),toColumn:C().notNull(),label:C()},(Z)=>[S("DbRelation_toTableId_idx").on(Z.toTableId),S("DbRelation_fromTableId_idx").on(Z.fromTableId)]),E=v("Endpoint",{id:C().primaryKey().$defaultFn(()=>u()),method:C().notNull(),path:C().notNull(),domain:C(),description:C(),source:C().default("MANUAL").notNull(),planId:C(),x:m().default(0).notNull(),y:m().default(0).notNull(),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[o("Endpoint_method_path_key").on(Z.method,Z.path),S("Endpoint_domain_idx").on(Z.domain)]),i=v("EndpointTable",{id:C().primaryKey().$defaultFn(()=>u()),endpointId:C().notNull().references(()=>E.id,{onDelete:"cascade",onUpdate:"cascade"}),tableId:C().notNull().references(()=>P.id,{onDelete:"cascade",onUpdate:"cascade"}),access:C().default("read").notNull()},(Z)=>[o("EndpointTable_endpointId_tableId_key").on(Z.endpointId,Z.tableId),S("EndpointTable_tableId_idx").on(Z.tableId)]),c=v("DraftTable",{id:C().primaryKey().$defaultFn(()=>u()),name:C().notNull(),domain:C(),description:C(),x:m().default(0).notNull(),y:m().default(0).notNull(),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date)},(Z)=>[o("DraftTable_name_key").on(Z.name)]),OZ=v("DraftColumn",{id:C().primaryKey().$defaultFn(()=>u()),tableId:C().notNull().references(()=>c.id,{onDelete:"cascade",onUpdate:"cascade"}),name:C().notNull(),type:C().notNull(),isPk:_({mode:"boolean"}).default(!1).notNull(),isFk:_({mode:"boolean"}).default(!1).notNull(),nullable:_({mode:"boolean"}).default(!0).notNull(),note:C(),ord:_().default(0).notNull()},(Z)=>[S("DraftColumn_tableId_idx").on(Z.tableId)]),XZ=v("DraftRelation",{id:C().primaryKey().$defaultFn(()=>u()),fromTableId:C().notNull().references(()=>c.id,{onDelete:"cascade",onUpdate:"cascade"}),toTableId:C().notNull().references(()=>c.id,{onDelete:"cascade",onUpdate:"cascade"}),fromColumn:C().notNull(),toColumn:C().notNull(),label:C()},(Z)=>[S("DraftRelation_toTableId_idx").on(Z.toTableId),S("DraftRelation_fromTableId_idx").on(Z.fromTableId)]),y=v("CodeFile",{path:C().primaryKey(),root:C(),lang:C(),x:m().default(0).notNull(),y:m().default(0).notNull(),mtimeMs:m(),size:_(),inDegree:_().default(0).notNull(),outDegree:_().default(0).notNull(),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)}),x=v("CodeFileEdge",{fromPath:C().notNull().references(()=>y.path,{onDelete:"cascade",onUpdate:"cascade"}),toPath:C().notNull().references(()=>y.path,{onDelete:"cascade",onUpdate:"cascade"}),circular:_({mode:"boolean"}).default(!1).notNull()},(Z)=>[S("CodeFileEdge_circular_idx").on(Z.circular),S("CodeFileEdge_toPath_idx").on(Z.toPath),S("CodeFileEdge_fromPath_idx").on(Z.fromPath),C6({columns:[Z.fromPath,Z.toPath],name:"CodeFileEdge_fromPath_toPath_pk"})]),a=v("SyncState",{id:C().primaryKey().default("singleton"),version:_().default(0).notNull(),codeGraphSyncedAt:_({mode:"timestamp_ms"}),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)}),q6=v("AppSetting",{id:C().primaryKey().default("singleton"),editor:C().default("auto").notNull(),currentFeatureId:C(),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)}),O6=v("ProjectMeta",{id:C().primaryKey().default("singleton"),overview:C(),conventions:C().default("[]").notNull(),hasFrontend:_({mode:"boolean"}),classificationRoots:C().default("[]").notNull(),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)}),z6=v("WorkspaceFlag",{id:C().primaryKey().$defaultFn(()=>u()),key:C().notNull(),enabled:_({mode:"boolean"}).default(!1).notNull(),config:C(),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[o("WorkspaceFlag_key_key").on(Z.key)]),D6=v("PlanContract",{id:C().primaryKey().$defaultFn(()=>u()),planId:C().notNull(),declaredFiles:C().default("[]").notNull(),authorizedExtras:C().default("[]").notNull(),active:_({mode:"boolean"}).default(!1).notNull(),createdAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date),updatedAt:_({mode:"timestamp_ms"}).notNull().$defaultFn(()=>new Date).$onUpdate(()=>new Date)},(Z)=>[o("PlanContract_planId_key").on(Z.planId),S("PlanContract_active_idx").on(Z.active)]);var rZ={};xZ(rZ,{tagRelations:()=>P6,nodeTagsRelations:()=>I6,nodeRelations:()=>F6,nodeFileRelations:()=>_6,endpointTableRelations:()=>w6,endpointRelations:()=>k6,edgeRelations:()=>R6,draftTableRelations:()=>T6,draftRelationRelations:()=>u6,draftColumnRelations:()=>y6,dbTableRelations:()=>E6,dbRelationRelations:()=>v6,dbColumnRelations:()=>S6,codeFileRelations:()=>x6,codeFileEdgeRelations:()=>f6,bugFlagRelations:()=>A6});import{relations as h}from"drizzle-orm";var F6=h(k,({one:Z,many:$})=>({files:$(BZ),bugFlags:$(qZ),nodeTags:$(YZ),edgesOut:$(KZ,{relationName:"EdgeFrom"}),edgesIn:$(KZ,{relationName:"EdgeTo"}),parent:Z(k,{fields:[k.parentId],references:[k.id],relationName:"NodeTree"}),children:$(k,{relationName:"NodeTree"})})),_6=h(BZ,({one:Z})=>({node:Z(k,{fields:[BZ.nodeId],references:[k.id]})})),A6=h(qZ,({one:Z})=>({node:Z(k,{fields:[qZ.nodeId],references:[k.id]})})),P6=h(jZ,({many:Z})=>({nodeTags:Z(YZ)})),I6=h(YZ,({one:Z})=>({node:Z(k,{fields:[YZ.a],references:[k.id]}),tag:Z(jZ,{fields:[YZ.b],references:[jZ.id]})})),R6=h(KZ,({one:Z})=>({from:Z(k,{fields:[KZ.fromId],references:[k.id],relationName:"EdgeFrom"}),to:Z(k,{fields:[KZ.toId],references:[k.id],relationName:"EdgeTo"})})),E6=h(P,({many:Z})=>({columns:Z(e),fksOut:Z(l,{relationName:"FkFrom"}),fksIn:Z(l,{relationName:"FkTo"}),usages:Z(i)})),S6=h(e,({one:Z})=>({table:Z(P,{fields:[e.tableId],references:[P.id]})})),v6=h(l,({one:Z})=>({fromTable:Z(P,{fields:[l.fromTableId],references:[P.id],relationName:"FkFrom"}),toTable:Z(P,{fields:[l.toTableId],references:[P.id],relationName:"FkTo"})})),k6=h(E,({many:Z})=>({tables:Z(i)})),w6=h(i,({one:Z})=>({endpoint:Z(E,{fields:[i.endpointId],references:[E.id]}),table:Z(P,{fields:[i.tableId],references:[P.id]})})),T6=h(c,({many:Z})=>({columns:Z(OZ),fksOut:Z(XZ,{relationName:"DraftFkFrom"}),fksIn:Z(XZ,{relationName:"DraftFkTo"})})),y6=h(OZ,({one:Z})=>({table:Z(c,{fields:[OZ.tableId],references:[c.id]})})),u6=h(XZ,({one:Z})=>({fromTable:Z(c,{fields:[XZ.fromTableId],references:[c.id],relationName:"DraftFkFrom"}),toTable:Z(c,{fields:[XZ.toTableId],references:[c.id],relationName:"DraftFkTo"})})),x6=h(y,({many:Z})=>({edgesOut:Z(x,{relationName:"CFEFrom"}),edgesIn:Z(x,{relationName:"CFETo"})})),f6=h(x,({one:Z})=>({fromFile:Z(y,{fields:[x.fromPath],references:[y.path],relationName:"CFEFrom"}),toFile:Z(y,{fields:[x.toPath],references:[y.path],relationName:"CFETo"})}));var m6={...nZ,...rZ};function b6(){let Z=process.env.DATABASE_URL;if(Z&&/^(file:|libsql:|wss?:|https?:|:memory:)/i.test(Z))return Z;return"file:./dev.db"}var p6=b6();function R4(Z){let $=h6({url:Z});return $.execute("PRAGMA foreign_keys = ON;"),$.execute("PRAGMA busy_timeout = 5000;"),g6($,{schema:m6})}var iZ=globalThis,oZ=iZ.dzDefault??R4(p6);iZ.dzDefault=oZ;var AZ=iZ.dzByUrl??=new Map;function sZ(Z){let $=AZ.get(Z);if(!$)$=R4(Z),AZ.set(Z,$);return $}function E4(Z){let $=AZ.get(Z);AZ.delete(Z);try{$?.$client?.close?.()}catch{}}function c6(){if(process.env.BEACON_REPO)return oZ;let Z=_Z()??r();if(!Z)return oZ;return sZ(VZ(Z))}var b=new Proxy({},{get(Z,$){let Q=c6(),J=Q[$];return typeof J==="function"?J.bind(Q):J}});import{existsSync as u8}from"fs";import{existsSync as w5,readFileSync as S8,watch as v8}from"fs";import{readFile as k5}from"fs/promises";import{join as zZ,relative as k8,resolve as w8}from"path";import{existsSync as n4,readFileSync as r4}from"fs";import{readdir as z7,readFile as D7,stat as o4}from"fs/promises";import{extname as i4,join as EZ,relative as WZ,resolve as HZ}from"path";import{extname as b4}from"path";import{dirname as l6,resolve as d6}from"path";var aZ=[".ts",".tsx",".js",".jsx",".mjs",".cjs"],n6=[/(?:^|[\n;])\s*(?:import|export)[^'"`\n]{0,4000}?from\s*['"]([^'"`]+)['"]/g,/(?:^|[\n;])\s*import\s*['"]([^'"`]+)['"]/g,/\brequire\(\s*['"]([^'"`]+)['"]\s*\)/g,/\bimport\(\s*['"]([^'"`]+)['"]\s*\)/g];function r6(Z){return Z.split(/[\\/]/).join("/")}function S4(Z,$){if($.has(Z))return Z;for(let Q of aZ){let J=`${Z}${Q}`;if($.has(J))return J}for(let Q of aZ){let J=`${Z}/index${Q}`;if($.has(J))return J}return null}function o6(Z){let $=new Set;for(let Q of n6)for(let J of Z.matchAll(Q))$.add(J[1]);return $}function i6(Z,$,Q,J){if(Z.startsWith(".")){let V=d6("/",l6($),Z),Y=r6(V).replace(/^\//,"");return S4(Y,Q)}for(let V of J)if(Z.startsWith(V.from)){let Y=Z.slice(V.from.length),X=V.to?`${V.to}/${Y}`:Y,K=S4(X,Q);if(K)return K}return null}var v4={id:"ts",extensions:aZ,specifiers:o6,resolve(Z,$,Q){let J=i6(Z,$,Q.fileSet,Q.tsAliases??[]);return J?[J]:[]}};import{dirname as PZ,join as s6,normalize as a6}from"path";var t6=[".py",".pyi"],k4=[/(?:^|[\n;])\s*from\s+(\.*[\w.]*)\s+import\b/g,/(?:^|[\n;])\s*import\s+([\w.]+(?:\s*,\s*[\w.]+)*)/g];function w4(Z,$){for(let Q of[`${Z}.py`,`${Z}/__init__.py`,`${Z}.pyi`])if($.has(Q))return[Q];return[]}function e6(Z){let $=new Set;for(let Q of Z.matchAll(k4[0])){let J=Q[1].trim();if(J)$.add(J)}for(let Q of Z.matchAll(k4[1]))for(let J of Q[1].split(/\s*,\s*/)){let V=J.trim().split(/\s+as\s+/)[0].trim();if(V)$.add(V)}return $}var T4={id:"python",extensions:t6,specifiers:e6,resolve(Z,$,Q){if(Z.startsWith(".")){let X=Z.length-Z.replace(/^\.+/,"").length,K=Z.slice(X),j=PZ($);for(let U=1;U<X;U++)j=PZ(j);let W=K?s6(j,K.replace(/\./g,"/")):j;return w4(a6(W).replace(/\\/g,"/"),Q.fileSet)}let J=Z.replace(/\./g,"/"),V=[],Y=PZ($);while(Y&&Y!=="."&&Y!=="/")V.push(Y),Y=PZ(Y);V.push("");for(let X of V){let K=w4(X?`${X}/${J}`:J,Q.fileSet);if(K.length)return K}return[]}};import{dirname as Z7}from"path";var $7=[".go"],Q7=/(?:^|[\n;])\s*import\s+(?:[\w.]+\s+)?"([^"]+)"/g,J7=/(?:^|[\n;])\s*import\s*\(([\s\S]*?)\)/g,V7=/"([^"]+)"/g;function K7(Z){let $=new Set;for(let Q of Z.matchAll(Q7))$.add(Q[1]);for(let Q of Z.matchAll(J7))for(let J of Q[1].matchAll(V7))$.add(J[1]);return $}var y4={id:"go",extensions:$7,resolve(Z,$,Q){let J=Q.goModulePath;if(!J)return[];let V=null;if(Z===J)V="";else if(Z.startsWith(`${J}/`))V=Z.slice(J.length+1);if(V===null)return[];let Y=[];for(let X of Q.fileSet){if(!X.endsWith(".go"))continue;let K=Z7(X);if(V===""&&K==="."||K===V)Y.push(X)}return Y.sort()},specifiers:K7};import{basename as u4,dirname as tZ,join as x4,normalize as f4}from"path";var Y7=[".rs"],X7=/(?:^|[\n;])\s*(?:pub\s+)?mod\s+(\w+)\s*;/g,G7=/(?:^|[\n;])\s*(?:pub\s+)?use\s+([\w:]+)/g;function M7(Z){let $=Z.split("::").filter((Q)=>Q&&Q!=="*");if(!$.length)return"";if($[0]==="crate")return["crate",...$.slice(1)].join("/");if($[0]==="super")return["..",...$.slice(1)].join("/");if($[0]==="self")return[".",...$.slice(1)].join("/");return $.join("/")}function eZ(Z,$){for(let Q of[`${Z}.rs`,`${Z}/mod.rs`])if($.has(Q))return[Q];return[]}var U7=new Set(["mod.rs","lib.rs","main.rs"]);function j7(Z){let $=new Set;for(let Q of Z.matchAll(X7))$.add(`./${Q[1]}`);for(let Q of Z.matchAll(G7)){let J=M7(Q[1]);if(J)$.add(J)}return $}var g4={id:"rust",extensions:Y7,specifiers:j7,resolve(Z,$,Q){let J=Q.fileSet;if(Z.startsWith("./")||Z.startsWith("../")){let V=Z.replace(/^\.\//,""),Y=f4(x4(tZ($),Z)).replace(/\\/g,"/"),X=eZ(Y,J);if(X.length)return X;if(Z.startsWith("./")&&!U7.has(u4($))){let K=x4(tZ($),u4($,".rs"),V);if(X=eZ(f4(K).replace(/\\/g,"/"),J),X.length)return X}return[]}if(Z.startsWith("crate/")){let V=$.split("/"),Y=V.lastIndexOf("src"),X=Y>=0?V.slice(0,Y+1).join("/"):tZ($),K=Z.slice(6).split("/");for(let j of[K.join("/"),K.slice(0,-1).join("/")]){if(!j)continue;let W=eZ(`${X}/${j}`,J);if(W.length)return W}return[]}return[]}};import{dirname as H7,extname as W7,join as N7,normalize as C7}from"path";var h4=[".swift",".java",".rb",".kt",".kts",".cs",".php",".scala",".c",".h",".cpp",".hpp",".cc",".hh",".m",".mm",".ex",".exs",".lua",".dart",".vue",".svelte"],L7=[/\b(?:require_relative|require|include|import|use|using|from)\s*\(?\s*['"]([^'"`\n]+)['"]/g,/(?:^|[\n;])\s*import\s+([\w.]+)/g,/(?:^|[\n;])\s*from\s+([\w.]+)\s+import\b/g,/(?:^|[\n;])\s*using\s+([\w.]+)\s*;/g,/(?:^|[\n;])\s*use\s+([\w\\]+)/g,/#\s*include\s*[<"]([^>"\n]+)[>"]/g];function B7(Z){let $=new Set;for(let Q of L7)for(let J of Z.matchAll(Q)){let V=J[1].trim();if(V)$.add(V)}return $}var m4={id:"fallback",extensions:h4,specifiers:B7,resolve(Z,$,Q){let V=[W7($).toLowerCase(),...h4].filter((j,W,U)=>j&&U.indexOf(j)===W),Y=Z.includes("/")||Z.includes("\\"),X=Z.startsWith(".")||Y?Z.replace(/\\/g,"/"):Z.replace(/[.:]+/g,"/"),K=[C7(N7(H7($),X)).replace(/\\/g,"/"),X.replace(/^\.\//,"")];for(let j of K){if(Q.fileSet.has(j))return[j];for(let W of V){let U=j.endsWith(W)?j:`${j}${W}`;if(Q.fileSet.has(U))return[U];if(Q.fileSet.has(`${j}/index${W}`))return[`${j}/index${W}`]}}return[]}};var q7=[v4,T4,y4,g4,m4],IZ=new Map;for(let Z of q7)for(let $ of Z.extensions)IZ.set($,Z);var O7={".ts":"ts",".tsx":"ts",".js":"js",".jsx":"js",".mjs":"js",".cjs":"js",".py":"py",".pyi":"py",".go":"go",".rs":"rs",".swift":"swift",".java":"java",".rb":"ruby",".kt":"kotlin",".kts":"kotlin",".cs":"csharp",".php":"php",".scala":"scala",".c":"c",".h":"c",".cpp":"cpp",".hpp":"cpp",".cc":"cpp",".hh":"cpp",".m":"objc",".mm":"objc",".ex":"elixir",".exs":"elixir",".lua":"lua",".dart":"dart",".vue":"vue",".svelte":"svelte"};function Z4(Z){return IZ.get(b4(Z).toLowerCase())??null}function p4(Z){let $=b4(Z).toLowerCase();if(!IZ.has($))return null;return O7[$]??$.slice(1)}function $4(){return new Set(IZ.keys())}var s4=new Set(["node_modules",".git",".next","dist","build","__pycache__","target",".venv","venv","env",".turbo","coverage",".beacon",".playwright-mcp","generated","migrations","alembic","migrate"]);function F7(Z=5){let $=performance.now();return async()=>{if(performance.now()-$>Z)await new Promise((Q)=>setImmediate(Q)),$=performance.now()}}var _7=()=>Promise.resolve();async function a4(Z,$,Q,J,V){let Y;try{Y=await z7($,{withFileTypes:!0})}catch{return}for(let X of Y){if(X.name.startsWith("."))continue;if(s4.has(X.name))continue;let K=EZ($,X.name);if(X.isDirectory()){await a4(Z,K,Q,J,V);continue}if(!X.isFile())continue;if(X.name.endsWith(".d.ts"))continue;if(!Q.has(i4(X.name).toLowerCase()))continue;J.push(WZ(Z,K))}await V()}async function A7(Z,$=_7){let Q=[];return await a4(Z,Z,$4(),Q,$),Q.map((J)=>J.split(/[\\/]/).join("/")).sort()}function P7(Z){try{return JSON.parse(Z)}catch{}let $=Z.replace(/\/\*[^"]*?\*\//g,"").replace(/(^|[^:"])\/\/.*$/gm,"$1").replace(/,\s*([}\]])/g,"$1");return JSON.parse($)}function c4(Z){return Z.replace(/^\.\/?/,"").replace(/\/$/,"")}function t4(Z){let $=EZ(Z,"tsconfig.json");if(!n4($))return[];let Q;try{Q=P7(r4($,"utf8"))}catch{return[]}let J=Q.compilerOptions?.paths??{},V=c4(Q.compilerOptions?.baseUrl??"."),Y=[];for(let[X,K]of Object.entries(J)){if(!X.endsWith("/*")||!K.length)continue;let j=K[0];if(!j.endsWith("/*"))continue;let W=X.slice(0,-1),U=c4(j.slice(0,-1)),N=[V,U].filter(Boolean).join("/");Y.push({from:W,to:N})}return Y}function RZ(Z){let $=EZ(Z,"go.mod");if(!n4($))return null;try{let Q=/^\s*module\s+(\S+)/m.exec(r4($,"utf8"));return Q?Q[1]:null}catch{return null}}function p(Z){return Z.split(/[\\/]/).join("/")}function e4(Z){if(Z.length===1)return Z[0];let $=Z.map((V)=>p(V).split("/")),Q=$[0],J=0;for(;J<Q.length;J++)if(!$.every((V)=>V[J]===Q[J]))break;return Q.slice(0,J).join("/")||"/"}async function I7(Z,$,Q){let J=(Array.isArray(Z)?Z:[Z]).map((W)=>p(HZ(W))),V=p($?HZ($):J.length===1?J[0]:e4(J)),Y=new Map,X=[];for(let W of J){let U=p(WZ(V,W));for(let N of t4(W))X.push({from:N.from,to:[U,N.to].filter(Boolean).join("/")});for(let N of await A7(W,Q)){let L=p(EZ(W,N)),q=p(WZ(V,L));if(Y.has(q))continue;try{let H=await o4(L);Y.set(q,{path:q,abs:L,root:U||null,mtimeMs:H.mtimeMs,size:H.size})}catch{}await Q()}}let K=J.map(RZ).find(Boolean)??RZ(V);return{metas:[...Y.values()].sort((W,U)=>W.path.localeCompare(U.path)),ctx:{fileSet:new Set(Y.keys()),tsAliases:X,goModulePath:K}}}var l4=50000;function R7(Z){let $=0;for(let Q=0;Q<Z.length;Q++)if(Z.charCodeAt(Q)===10){if(Q-$>l4)return!0;$=Q+1}return Z.length-$>l4}async function d4(Z){let $=Z4(Z.path);if(!$||Z.size>200000)return new Set;try{let Q=await D7(Z.abs,"utf8");if(R7(Q))return new Set;return $.specifiers(Q)}catch{return new Set}}function Z5(Z,$){let Q=(Array.isArray(Z)?Z:[Z]).map((H)=>p(HZ(H))),J=p($?HZ($):Q.length===1?Q[0]:e4(Q)),V=new Map,Y=new Map,X=[],K=null;function j(){X=[];for(let H of Q){let G=p(WZ(J,H));for(let B of t4(H))X.push({from:B.from,to:[G,B.to].filter(Boolean).join("/")})}K=Q.map(RZ).find(Boolean)??RZ(J)}function W(H){let G=H.split("/");for(let z=0;z<G.length;z++){let O=G[z];if(!O||O.startsWith("."))return!0;if(z<G.length-1&&s4.has(O))return!0}let B=G[G.length-1];if(B.endsWith(".d.ts"))return!0;return!$4().has(i4(B).toLowerCase())}function U(H){let G=p(HZ(H));for(let B of Q)if(G===B||G.startsWith(`${B}/`)){let z=G.slice(B.length).replace(/^\/+/,"");if(W(z))return null;return{path:p(WZ(J,G)),root:p(WZ(J,B))||null}}return null}function N(){let H={fileSet:new Set(V.keys()),tsAliases:X,goModulePath:K},G=[...V.values()].sort((O,M)=>O.path.localeCompare(M.path)),B=[];for(let O of G){let M=Z4(O.path);if(!M)continue;let F=Y.get(O.path)??new Set,D=new Set;for(let R of F)for(let w of M.resolve(R,O.path,H)){if(!w||w===O.path||D.has(w))continue;D.add(w),B.push({from:O.path,to:w})}}return{files:G.map((O)=>({path:O.path,lang:p4(O.path),root:O.root,mtimeMs:O.mtimeMs,size:O.size})),edges:B}}async function L(){let H=F7(),{metas:G,ctx:B}=await I7(Z,$,H);V.clear(),Y.clear();for(let z of G)await H(),V.set(z.path,z),Y.set(z.path,await d4(z));return X=B.tsAliases??[],K=B.goModulePath??null,N()}async function q(H){let G=p(HZ(H));if(!Q.some((D)=>G===D||G.startsWith(`${D}/`)))return!1;let B=G.split("/").pop()??"";if(B==="tsconfig.json"||B==="go.mod"){let D=G.slice(0,G.length-B.length-1);if(Q.includes(D))return j(),!0;return!1}let z=U(H);if(!z)return!1;let O;try{O=await o4(G)}catch{let D=V.delete(z.path);return Y.delete(z.path),D}let M=V.get(z.path);if(M&&M.mtimeMs===O.mtimeMs&&M.size===O.size)return!1;let F={path:z.path,abs:G,root:z.root,mtimeMs:O.mtimeMs,size:O.size};return V.set(z.path,F),Y.set(z.path,await d4(F)),!0}return{seed:L,applyChange:q,snapshot:N}}function $5(Z){let $=Object.keys(Z.tableVars),Q=new Map;if(!$.length){for(let X of Z.routeFiles)Q.set(X,[]);return Q}let J=new Map;for(let X of Z.edges){let K=J.get(X.from)??[];K.push(X.to),J.set(X.from,K)}let V=new Map($.map((X)=>[X,new RegExp(`(?:query\\.${X}\\b|\\.from\\(\\s*${X}\\b)`)])),Y=new Map($.map((X)=>[X,new RegExp(`(?:insert|update|delete)\\(\\s*${X}\\b`)]));for(let X of Z.routeFiles){let K=new Set([X]),j=[X];for(let L=0;L<2&&K.size<25;L++){let q=[];for(let H of j)for(let G of J.get(H)??[]){if(K.has(G)||K.size>=25)continue;K.add(G),q.push(G)}j=q}let W=new Set,U=new Set;for(let L of K){let q=Z.content(L);if(!q)continue;for(let H of $){if(!W.has(H)&&V.get(H).test(q))W.add(H);if(!U.has(H)&&Y.get(H).test(q))U.add(H)}}let N=[];for(let L of $){let q=W.has(L),H=U.has(L);if(!q&&!H)continue;N.push({table:Z.tableVars[L],access:q&&H?"read-write":H?"write":"read"})}Q.set(X,N)}return Q}function J5(Z,$){if(/_JSON_OR_JSONB|\bJSONB\b|\bJSON\b/.test(Z))return"jsonb";let Q=Z.match(/\b(GUID|Uuid|UUID|String|Text|DateTime|Date|Time|BigInteger|SmallInteger|Integer|Boolean|Float|Numeric|Decimal|Vector|TSVECTOR|LargeBinary|Enum)\b\s*(\([^)]*\))?/);if(Q){let Y=Q[2]??"",X=Y.match(/\d+/)?.[0];switch(Q[1]){case"GUID":case"Uuid":case"UUID":return"uuid";case"String":return X?`varchar(${X})`:"varchar";case"Text":return"text";case"DateTime":return/timezone\s*=\s*True/.test(Y)?"timestamptz":"timestamp";case"Date":return"date";case"Time":return"time";case"BigInteger":return"bigint";case"SmallInteger":return"smallint";case"Integer":return"integer";case"Boolean":return"boolean";case"Float":return"float";case"Numeric":case"Decimal":return"numeric";case"Vector":return X?`vector(${X})`:"vector";case"TSVECTOR":return"tsvector";case"LargeBinary":return"bytea";case"Enum":return"varchar"}}let J=$.replace(/\s*\|\s*None/g,"").trim(),V=J.match(/^Optional\[([\s\S]*)\]$/);if(V)J=V[1].trim();if(/uuid/i.test(J))return"uuid";if(/datetime/i.test(J))return"timestamptz";if(/\bint\b/i.test(J))return"integer";if(/\bbool\b/i.test(J))return"boolean";if(/\bfloat\b/.test(J)&&!/\blist\b/.test(J))return"float";if(/\bdict\b|\blist\b|\bAny\b/.test(J))return"jsonb";return"text"}function SZ(Z,$){let Q=0;for(let J=$;J<Z.length;J++)if(Z[J]==="(")Q++;else if(Z[J]===")"){if(Q--,Q===0)return Z.slice($+1,J)}return""}function E7(Z,$){let Q=0;for(let J=$;J<Z.length;J++)if(Z[J]==="[")Q++;else if(Z[J]==="]"){if(Q--,Q===0)return Z.slice($+1,J)}return null}function S7(Z,$,Q){let J=Q.match(/__tablename__\s*=\s*["']([^"']+)["']/)?.[1],V=[],Y=[],X=[],K=/(\w+)\s*:\s*Mapped\s*\[/g,j;while(j=K.exec(Q)){let N=j.index+j[0].length-1,L=E7(Q,N);if(L===null)continue;let q=N+L.length+2,H=Q.slice(q).match(/^\s*=\s*(\w+)\s*\(/);if(!H||H[1]!=="mapped_column")continue;X.push({colName:j[1],pyType:L,argsAt:q+H[0].length-1})}let W=/(\w+)\s*=\s*(mapped_column|Column)\s*\(/g;while(j=W.exec(Q))X.push({colName:j[1],pyType:"",argsAt:j.index+j[0].length-1});X.sort((N,L)=>N.argsAt-L.argsAt);let U=new Set;for(let N of X){if(U.has(N.colName)||N.colName==="__tablename__")continue;U.add(N.colName);let L=SZ(Q,N.argsAt),q=/primary_key\s*=\s*True/.test(L)||void 0,H=/nullable\s*=\s*False/.test(L)?!1:!0,G=L.match(/ForeignKey\(\s*["']([^"']+?)\.([^"'.]+)["']/);if(V.push({name:N.colName,type:J5(L,N.pyType),isPk:q,isFk:G?!0:void 0,nullable:H}),G)Y.push({column:N.colName,toTable:G[1],toColumn:G[2]})}return{name:Z,bases:$,tableName:J,columns:V,fks:Y}}function v7(Z){let $=[],Q=[],J=/\bTable\s*(\()\s*["']([^"']+)["']\s*,/g,V;while(V=J.exec(Z)){let Y=V[2],X=SZ(Z,V.index+V[0].indexOf("("));if(!/\bmetadata\b/.test(X)||!/\bColumn\s*\(/.test(X))continue;let K=[],j=/\bColumn\s*\(/g,W;while(W=j.exec(X)){let U=SZ(X,W.index+W[0].length-1),N=U.match(/^\s*["'](\w+)["']\s*,/)?.[1];if(!N)continue;let L=/primary_key\s*=\s*True/.test(U)||void 0,q=/nullable\s*=\s*False/.test(U)?!1:!0,H=U.match(/ForeignKey\(\s*["']([^"']+?)\.([^"'.]+)["']/);if(K.push({name:N,type:J5(U,""),isPk:L,isFk:H?!0:void 0,nullable:q}),H)Q.push({fromTable:Y,fromColumn:N,toTable:H[1],toColumn:H[2]})}if(K.length)$.push({name:Y,columns:K})}return{tables:$,relations:Q}}function k7(Z){let $=new Map,Q={tables:[],relations:[]};for(let K of Z){if(!K.path.endsWith(".py"))continue;if(!/mapped_column\s*\(|__tablename__|\bTable\s*\(\s*["']/.test(K.content))continue;let j=v7(K.content);Q.tables.push(...j.tables),Q.relations.push(...j.relations);let W=/^class\s+(\w+)\s*\(([^)]*)\)\s*:/gm,U,N=[];while(U=W.exec(K.content))N.push({name:U[1],bases:U[2].split(",").map((L)=>L.trim().split(/[.[]/)[0]).filter(Boolean),at:U.index});for(let L=0;L<N.length;L++){let q=K.content.slice(N[L].at,N[L+1]?.at??K.content.length),H=S7(N[L].name,N[L].bases,q);$.set(H.name,H)}}if(![...$.values()].some((K)=>K.tableName)&&!Q.tables.length)return{tables:[],relations:[]};let J=(K,j=new Set)=>{if(j.has(K.name))return[];j.add(K.name);let W=[];for(let U of K.bases){let N=$.get(U);if(N&&!N.tableName)W.push(...J(N,j))}return W.push(...K.columns),W},V=[],Y=[];for(let K of $.values()){if(!K.tableName)continue;let j=J(K),W=new Map;for(let H of j)if(!W.has(H.name))W.set(H.name,H);let U=[...W.values()],N=(H)=>U.splice(U.findIndex((G)=>G.name===H),1)[0],L=U.some((H)=>H.name==="id")?N("id"):null,q=["created_at","updated_at","deleted_at"].filter((H)=>U.some((G)=>G.name===H)).map((H)=>N(H));V.push({name:K.tableName,columns:[...L?[L]:[],...U,...q]});for(let H of K.fks)Y.push({fromTable:K.tableName,fromColumn:H.column,toTable:H.toTable,toColumn:H.toColumn})}let X=new Set(V.map((K)=>K.name));for(let K of Q.tables)if(!X.has(K.name))V.push(K);return Y.push(...Q.relations.filter((K)=>!X.has(K.fromTable))),{tables:V,relations:Y}}function w7(Z){let $=Z.replace(/[?[\]]/g,"");return{String:"text",Int:"integer",BigInt:"bigint",Float:"float",Decimal:"numeric",Boolean:"boolean",DateTime:"timestamptz",Json:"jsonb",Bytes:"bytea"}[$]??$.toLowerCase()}function T7(Z){let $=[],Q=[];for(let J of Z){if(!J.path.endsWith(".prisma"))continue;let V=/model\s+(\w+)\s*\{([\s\S]*?)\}/g,Y;while(Y=V.exec(J.content)){let X=Y[1],K=Y[2].match(/@@map\(\s*["']([^"']+)["']\s*\)/)?.[1]??X,j=[];for(let W of Y[2].split(`
4
+ `)){let U=W.trim().match(/^(\w+)\s+(\w+(?:\[\])?\??)\s*(.*)$/);if(!U||/^@@/.test(W.trim()))continue;let[,N,L,q]=U,H=/^(String|Int|BigInt|Float|Decimal|Boolean|DateTime|Json|Bytes)(\[\])?\??$/.test(L),G=q.match(/@relation\([^)]*fields:\s*\[(\w+)\][^)]*references:\s*\[(\w+)\]/);if(G)Q.push({fromTable:K,fromColumn:G[1],toTable:L.replace(/[?[\]]/g,""),toColumn:G[2]});if(!H)continue;j.push({name:N,type:w7(L),isPk:/@id\b/.test(q)||void 0,isFk:/@relation\b/.test(q)||void 0,nullable:L.endsWith("?")})}if(j.length)$.push({name:K,columns:j})}}return{tables:$,relations:Q}}function y7(Z,$){if(/mode:\s*["']timestamp/.test($))return"timestamp";if(/mode:\s*["']boolean["']/.test($))return"boolean";if(/mode:\s*["']json["']/.test($))return"jsonb";return Z}function u7(Z,$){let Q=0;for(let J=$;J<Z.length;J++)if(Z[J]==="{")Q++;else if(Z[J]==="}"){if(Q--,Q===0)return Z.slice($+1,J)}return""}function x7(Z){let $=[],Q=/(\w+)\s*:\s*(text|integer|real|blob|numeric|varchar|boolean|timestamp|serial|uuid|json|jsonb)\s*\(/g;for(let Y of Z){if(!/\.(ts|tsx|mts|cts)$/.test(Y.path))continue;if(!/\b(?:sqliteTable|pgTable|mysqlTable)\s*\(/.test(Y.content))continue;let X=/(?:export\s+)?const\s+(\w+)\s*=\s*(?:sqliteTable|pgTable|mysqlTable)\s*\(\s*["']([^"']+)["']\s*,/g,K;while(K=X.exec(Y.content)){let j=Y.content.indexOf("{",K.index+K[0].length);if(j<0)continue;let W=u7(Y.content,j),U={varName:K[1],tableName:K[2],columns:[],colByProp:new Map,fks:[]},N=[];Q.lastIndex=0;for(let L of W.matchAll(Q))N.push({prop:L[1],builder:L[2],at:L.index,argOpen:L.index+L[0].length-1});N.forEach((L,q)=>{let H=W.slice(L.at,N[q+1]?.at??W.length),G=SZ(W,L.argOpen),z=G.match(/^\s*["']([^"']+)["']/)?.[1]??L.prop,O=H.match(/\.references\(\s*\(\)\s*=>\s*(\w+)\.(\w+)/);if(U.columns.push({name:z,type:y7(L.builder,G),isPk:/\.primaryKey\(\)/.test(H)||void 0,isFk:O?!0:void 0,nullable:/\.notNull\(\)/.test(H)?!1:!0}),U.colByProp.set(L.prop,z),O)U.fks.push({column:z,toVar:O[1],toProp:O[2]})}),$.push(U)}}if(!$.length)return{tables:[],relations:[]};let J=new Map($.map((Y)=>[Y.varName,Y])),V=[];for(let Y of $)for(let X of Y.fks){let K=J.get(X.toVar);if(!K)continue;V.push({fromTable:Y.tableName,fromColumn:X.column,toTable:K.tableName,toColumn:K.colByProp.get(X.toProp)??X.toProp})}return{tables:$.map((Y)=>({name:Y.tableName,columns:Y.columns})),relations:V,tableVars:Object.fromEntries($.map((Y)=>[Y.varName,Y.tableName]))}}var f7={long:"bigint",Long:"bigint",BigInteger:"bigint",int:"integer",Integer:"integer",short:"smallint",Short:"smallint",String:"varchar",char:"varchar",Character:"varchar",boolean:"boolean",Boolean:"boolean",UUID:"uuid",BigDecimal:"numeric",double:"double",Double:"double",float:"float",Float:"float",LocalDate:"date",LocalDateTime:"timestamp",Instant:"timestamp",Timestamp:"timestamp",Date:"timestamp",OffsetDateTime:"timestamptz",ZonedDateTime:"timestamptz",LocalTime:"time"},g7=/^(List|Set|Map|Collection|Iterable)$/;function V5(Z){if(/byte\s*\[\s*\]/.test(Z))return"byte[]";return(Z.replace(/<.*>/,"").trim().split(".").pop()??Z).trim()}function h7(Z){let $=V5(Z);if($==="byte[]")return"bytea";return f7[$]??$.toLowerCase()}function vZ(Z,$){return Z.match(new RegExp(`\\b${$}\\s*=\\s*"([^"]*)"`))?.[1]}function Q5(Z,$){let Q=Z.match(new RegExp(`\\b${$}\\s*=\\s*(true|false)`));return Q?Q[1]==="true":void 0}function m7(Z){let $=[],Q=Z,J;while(J=Q.match(/^@[\w.]+(\([^)]*\))?\s*/))$.push(Q.slice(0,J[0].length).trim()),Q=Q.slice(J[0].length);return{annots:$,rest:Q.trim()}}function b7(Z){let $=[],Q=[];for(let J of Z.split(`
5
+ `)){let V=J.trim();if(!V||V.startsWith("//")||V.startsWith("*")||V.startsWith("/*"))continue;let{annots:Y,rest:X}=m7(V);if(Q.push(...Y),!X)continue;let K=X,j="";while(K!==j)j=K,K=K.replace(/^(?:public|private|protected|static|final|transient|volatile)\s+/,"");let W=!K.includes("(")?K.match(/^([\w.$]+(?:<[^>]*>)?(?:\s*\[\s*\])?)\s+(\w+)\s*[;=]/):null;if(W)$.push({annots:Q,type:W[1],name:W[2]});Q=[]}return $}function p7(Z){let $=[],Q=/\bclass\s+(\w+)/g,J;while(J=Q.exec(Z))$.push({name:J[1],at:J.index});let V=[];for(let Y=0;Y<$.length;Y++){let X=Z.slice(Y===0?0:$[Y-1].at,$[Y].at);if(!/@Entity\b/.test(X))continue;let K=X.match(/@Table\s*\([^)]*\)/)?.[0]??"",j=vZ(K,"name")??$[Y].name,W=Z.slice($[Y].at,$[Y+1]?.at??Z.length),U=b7(W),N=U.find((q)=>q.annots.some((H)=>/@Id\b/.test(H))),L=N?vZ(N.annots.find((q)=>/@Column\b/.test(q))??"","name")??N.name:"id";V.push({className:$[Y].name,tableName:j,idColumn:L,fields:U})}return V}function c7(Z){let $=Z.filter((K)=>K.path.endsWith(".java")&&/@Entity\b/.test(K.content));if(!$.length)return{tables:[],relations:[]};let Q=$.flatMap((K)=>p7(K.content));if(!Q.length)return{tables:[],relations:[]};let J=new Map(Q.map((K)=>[K.className,K.tableName])),V=new Map(Q.map((K)=>[K.className,K.idColumn])),Y=[],X=[];for(let K of Q){let j=[];for(let W of K.fields){let U=W.annots.join(" ");if(/@Transient\b/.test(U))continue;let N=V5(W.type);if(/@ManyToOne\b|@OneToOne\b|@OneToMany\b|@ManyToMany\b/.test(U)||J.has(N)){let O=W.annots.find((F)=>/@JoinColumn\b/.test(F)),M=O?vZ(O,"name"):void 0;if(M){j.push({name:M,type:"bigint",isFk:!0,nullable:Q5(U,"nullable")??!0});let F=J.get(N);if(F)X.push({fromTable:K.tableName,fromColumn:M,toTable:F,toColumn:V.get(N)??"id"})}continue}if(g7.test(N))continue;let H=W.annots.find((O)=>/@Column\b/.test(O))??"",G=vZ(H,"name")??W.name,B=W.annots.some((O)=>/@Id\b/.test(O)),z=Q5(H,"nullable");j.push({name:G,type:h7(W.type),...B?{isPk:!0}:{},...z!==void 0?{nullable:z}:{}})}Y.push({name:K.tableName,columns:j})}return{tables:Y,relations:X}}function K5(Z){let $=x7(Z);if($.tables.length)return $;let Q=T7(Z);if(Q.tables.length)return Q;let J=k7(Z);if(J.tables.length)return J;return c7(Z)}var l7=["GET","POST","PUT","PATCH","DELETE"];function d7(Z){let $=Z.match(/(?:^|\/)app\/(.+)\/route\.(?:ts|tsx|js|jsx|mjs)$/);if(!$)return null;let Q=$[1].split("/").filter((J)=>!(J.startsWith("(")&&J.endsWith(")"))).map((J)=>{let V=J.match(/^\[{1,2}(?:\.\.\.)?([^\]]+)\]{1,2}$/);return V?`{${V[1]}}`:J});if(Q[0]!=="api")return null;return`/${Q.join("/")}`}function Y5(Z){let $=[];for(let Q of Z){let J=d7(Q.path);if(!J)continue;for(let V of l7)if(new RegExp(`export\\s+(?:async\\s+)?(?:function|const)\\s+${V}\\b`).test(Q.content))$.push({method:V,path:J,uses:[],file:Q.path})}return $.sort((Q,J)=>`${Q.path} ${Q.method}`.localeCompare(`${J.path} ${J.method}`))}var n7=/(^|\/)app\/.*\/route\.(ts|tsx|js|jsx|mjs)$/,r7=/\.(ts|py)$/,o7=/(schema|model)/i,i7=/(\.(test|spec)\.[jt]sx?$)|(^|\/)(tests?|__tests__|__mocks__)\/|(^|\/)test_[^/]+\.py$|_test\.py$/;function Q4(Z){if(i7.test(Z))return!1;if(Z.endsWith(".prisma"))return!0;if(n7.test(Z))return!0;if(Z.endsWith(".java"))return!0;return r7.test(Z)&&o7.test(Z)}function X5(Z,$=300){return Z.filter(Q4).slice(0,$)}import{z as d}from"zod";import{and as I5,eq as NZ,inArray as P8,notInArray as I8}from"drizzle-orm";import{z as A}from"zod";import{and as z8,eq as yZ,inArray as K4,notInArray as D8,or as F8,sql as _8}from"drizzle-orm";var G5=300,M5=50;function U5(Z){for(let $=0;$<Z.length;$++)for(let Q=$+1;Q<Z.length;Q++){let J=Z[$],V=Z[Q];if(J.x<V.x+G5&&J.x+G5>V.x&&J.y<V.y+M5&&J.y+M5>V.y)return!0}return!1}import{eq as s7}from"drizzle-orm";var j5=(Z)=>Z.replace(/\{[^}]*\}/g,"{}");function a7(Z,$){if(Z.method.toUpperCase()!==$.method.toUpperCase())return!1;let Q=j5(Z.path),J=j5($.path);return J===Q||J.endsWith(Q)}async function H5(Z=b){let[$,Q]=await Promise.all([Z.query.endpoint.findMany({where:(V,{ne:Y})=>Y(V.source,"INTROSPECTION")}),Z.query.endpoint.findMany({where:(V,{eq:Y})=>Y(V.source,"INTROSPECTION")})]),J={collapsed:0,mappings:[]};for(let V of $){let Y=Q.find((X)=>a7(V,X));if(!Y)continue;await Z.delete(E).where(s7(E.id,V.id)),J.collapsed++,J.mappings.push({planned:`${V.method} ${V.path}`,code:`${Y.method} ${Y.path}`})}return J}import{and as W5,inArray as t7,isNull as N5,ne as C5,or as e7}from"drizzle-orm";var Z8=new Set(["DONE","CANCELLED","DEPRIORITIZED"]);async function $8(Z){let $=await Z.query.node.findMany({where:(J,{and:V,eq:Y,isNotNull:X})=>V(Y(J.view,"ROADMAP"),X(J.planId)),columns:{planId:!0,status:!0}}),Q=new Map;for(let J of $){let V=J.planId;Q.set(V,(Q.get(V)??!0)&&Z8.has(J.status))}return[...Q.entries()].filter(([,J])=>J).map(([J])=>J)}async function L5(Z=b){let $=await $8(Z),Q=(Y)=>$.length?e7(N5(Y.planId),t7(Y.planId,$)):N5(Y.planId),J=await Z.delete(P).where(W5(C5(P.source,"INTROSPECTION"),Q(P))).returning({id:P.id}),V=await Z.delete(E).where(W5(C5(E.source,"INTROSPECTION"),Q(E))).returning({id:E.id});return{tables:J.length,endpoints:V.length}}var Q8=(Z)=>Z&&Number.isFinite(Z)&&Z>0?Math.min(3.2,Math.max(0.7,Z)):1.8;function J8(Z,$){let Q=Q8($.viewportAspect)*($.aspectSlack??1),J=Z.reduce((V,Y)=>V+(Y.w+$.gapX)*(Y.h+$.gapY),0);return Math.max($.minBandW,Math.round(Math.sqrt(J*Q)))}function B5(Z,$){let Q=J8(Z,$),J=new Map,V=0,Y=0,X=0;for(let K of Z){if(V>0&&V+K.w>Q)Y+=X+$.gapY,V=0,X=0;J.set(K.id,{x:V,y:Y}),X=Math.max(X,K.h),V+=K.w+$.gapX}return J}var $Z=320,J4=30,V8=36,K8=30,Y8=16;function QZ(Z){return V8+Math.max(0,Z)*K8+Y8}var GZ=60,X8=300,kZ=10,G8=84,wZ=72,M8=3*$Z,U8=1.7;var TZ=(Z)=>(Z??"").trim()||"\u2014";function j8(Z,$,Q){let J=new Map;for(let Y of Z.uses){if(!$.has(Y.tableId))continue;J.set(Y.tableId,(J.get(Y.tableId)??0)+1)}let V=null;for(let[Y,X]of J){if(V===null){V=Y;continue}let K=J.get(V);if(X>K){V=Y;continue}if(X<K)continue;let j=Q?.get(Y)??0,W=Q?.get(V)??0;if(j<W)V=Y;else if(j===W&&$.get(Y).localeCompare($.get(V))<0)V=Y}return V}function V4(Z,$){let Q=new Map(Z.map((V)=>[V.id,V.name])),J=new Map;for(let V of $)for(let Y of V.uses){if(!Q.has(Y.tableId))continue;J.set(Y.tableId,(J.get(Y.tableId)??0)+1)}return new Map($.map((V)=>[V.id,j8(V,Q,J)]))}var H8=(Z,$)=>Z.path.localeCompare($.path)||Z.method.localeCompare($.method)||Z.id.localeCompare($.id);function q5(Z,$,Q={}){let J=V4(Z,$),V=new Map,Y=[];for(let G of[...$].sort(H8)){let B=J.get(G.id)??null;if(B){let z=V.get(B);if(z)z.push(G);else V.set(B,[G])}else Y.push(G)}let X=(G)=>{let B=V.get(G.id)?.length??0;return QZ(G.columnCount)+(B?kZ+B*GZ:0)+J4},K=Array.from(new Set(Z.map((G)=>TZ(G.domain)))),j=K.filter((G)=>G!=="\u2014").sort(),W=K.includes("\u2014")?[...j,"\u2014"]:j,U=[];for(let G of W){let B=Z.filter((D)=>TZ(D.domain)===G).sort((D,R)=>D.name.localeCompare(R.name)),z=B.reduce((D,R)=>D+X(R),0),O=Math.max(1,Math.min(12,B.length,Math.round(Math.sqrt(z/$Z)))),M=Array(O).fill(0),F=new Map;for(let D of B){let R=0;for(let w=1;w<O;w++)if(M[w]<M[R])R=w;F.set(D.id,{x:R*$Z,y:M[R]}),M[R]+=X(D)}U.push({d:G,w:O*$Z,h:Math.max(...M,0),tableLocal:F})}let N=B5(U.map((G)=>({id:G.d,w:G.w,h:G.h})),{gapX:G8,gapY:wZ,viewportAspect:Q.viewportAspect,minBandW:M8,aspectSlack:U8}),L=new Map,q=new Map,H=0;for(let G of U){let B=N.get(G.d),z=Z.filter((O)=>G.tableLocal.has(O.id));for(let O of z){let M=G.tableLocal.get(O.id),F=B.x+M.x,D=B.y+M.y;L.set(O.id,{x:F,y:D}),(V.get(O.id)??[]).forEach((w,T)=>{q.set(w.id,{x:F,y:D+QZ(O.columnCount)+kZ+T*GZ})})}H=Math.max(H,B.y+G.h)}if(Y.length){let G=H+wZ,B=Math.max(1,Math.min(4,Math.ceil(Math.sqrt(Y.length/2))));Y.forEach((z,O)=>{q.set(z.id,{x:O%B*X8,y:G+Math.floor(O/B)*GZ})})}return{tables:L,endpoints:q}}function O5(Z,$,Q){let J=V4($,Q),V=new Map;for(let q of Q){let H=J.get(q.id);if(H)V.set(H,(V.get(H)??0)+1)}let Y=(q)=>{let H=V.get(q.id)??0;return q.y+QZ(q.columnCount)+(H?kZ+H*GZ:0)},X=TZ(Z.domain),K=$.filter((q)=>TZ(q.domain)===X);if(!K.length){let q=$.length?Math.max(...$.map(Y),...Q.map((H)=>H.y+GZ)):0;return{x:0,y:$.length||Q.length?q+wZ:0}}let j=Math.min(...K.map((q)=>q.x)),W=K.map((q)=>Math.max(0,Math.round((q.x-j)/$Z))),U=Math.min(12,Math.max(...W)+1),N=Array(U).fill(Math.min(...K.map((q)=>q.y)));K.forEach((q,H)=>{let G=Math.min(W[H],U-1);N[G]=Math.max(N[G],Y(q)+J4)});let L=0;for(let q=1;q<U;q++)if(N[q]<N[L])L=q;return{x:j+L*$Z,y:N[L]}}function z5(Z,$,Q){let J=V4($,[...Q,Z]),V=J.get(Z.id),Y=V?$.find((K)=>K.id===V):void 0;if(Y){let K=Q.filter((U)=>J.get(U.id)===Y.id),j=Y.y+QZ(Y.columnCount)+kZ,W=K.length?Math.max(...K.map((U)=>U.y))+GZ:j;return{x:Y.x,y:W}}let X=[...$.map((K)=>K.y+QZ(K.columnCount)),...Q.map((K)=>K.y+GZ)];return{x:0,y:X.length?Math.max(...X)+wZ:0}}function D5(Z){let $=$Z-20;for(let Q=0;Q<Z.length;Q++)for(let J=Q+1;J<Z.length;J++){let V=Z[Q],Y=Z[J],X=QZ(V.columnCount),K=QZ(Y.columnCount);if(V.x<Y.x+$&&V.x+$>Y.x&&V.y<Y.y+K&&V.y+X>Y.y)return!0}return!1}import{eq as _5}from"drizzle-orm";F5();async function A5(Z=b,$){let[Q,J]=await Promise.all([Z.query.dbTable.findMany({with:{columns:{columns:{id:!0}}},orderBy:(X,{asc:K})=>K(X.name)}),Z.query.endpoint.findMany({with:{tables:{columns:{tableId:!0}}}})]),V=q5(Q.map((X)=>({id:X.id,name:X.name,domain:X.domain,columnCount:X.columns.length})),J.map((X)=>({id:X.id,method:X.method,path:X.path,uses:X.tables.map((K)=>({tableId:K.tableId}))})),{viewportAspect:$}),Y=0;for(let X of Q){let K=V.tables.get(X.id);if(!K||Math.round(K.x)===Math.round(X.x)&&Math.round(K.y)===Math.round(X.y))continue;await Z.update(P).set({x:K.x,y:K.y}).where(_5(P.id,X.id)),Y++}for(let X of J){let K=V.endpoints.get(X.id);if(!K||Math.round(K.x)===Math.round(X.x)&&Math.round(K.y)===Math.round(X.y))continue;await Z.update(E).set({x:K.x,y:K.y}).where(_5(E.id,X.id)),Y++}return Y}var A8=A.object({tables:A.array(A.object({name:A.string().trim().min(1),domain:A.string().nullish(),description:A.string().nullish(),columns:A.array(A.object({name:A.string().trim().min(1),type:A.string().trim().min(1),isPk:A.boolean().optional(),isFk:A.boolean().optional(),nullable:A.boolean().optional(),note:A.string().nullish()})).default([])})).default([]),relations:A.array(A.object({fromTable:A.string(),fromColumn:A.string(),toTable:A.string(),toColumn:A.string(),label:A.string().nullish()})).default([]),endpoints:A.array(A.object({method:A.string().trim().min(1),path:A.string().trim().min(1),domain:A.string().nullish(),description:A.string().nullish(),uses:A.array(A.object({table:A.string(),access:A.string().default("read")})).default([])})).default([])});async function uZ(Z=b){let[$]=await Z.insert(a).values({id:"singleton",version:1}).onConflictDoUpdate({target:a.id,set:{version:_8`${a.version} + 1`}}).returning();return $.version}async function P5(Z,$=b,Q={}){let J=A8.parse(Z),V=J.tables.length>0,Y=J.endpoints.length>0,X=J.tables.map((M)=>M.name);if(V)await $.delete(P).where(X.length?z8(yZ(P.source,"INTROSPECTION"),D8(P.name,X)):yZ(P.source,"INTROSPECTION"));let K=await $.query.dbTable.findMany({columns:{id:!0,name:!0,domain:!0,x:!0,y:!0},with:{columns:{columns:{id:!0}}}}),j=await $.query.endpoint.findMany({columns:{id:!0,method:!0,path:!0,x:!0,y:!0},with:{tables:{columns:{tableId:!0}}}}),W=new Map(K.map((M)=>[M.name,M])),U=K.map((M)=>({id:M.id,name:M.name,domain:M.domain,columnCount:M.columns.length,x:M.x,y:M.y})),N=j.map((M)=>({id:M.id,method:M.method,path:M.path,uses:M.tables.map((F)=>({tableId:F.tableId})),x:M.x,y:M.y})),L=new Map;for(let M of J.tables){if(W.has(M.name))continue;let F=O5({domain:M.domain??null,columnCount:M.columns.length},U,N);L.set(M.name,F),U.push({id:`new:${M.name}`,name:M.name,domain:M.domain??null,columnCount:M.columns.length,...F})}let q=new Map;for(let M of J.tables){let F=W.get(M.name),D=L.get(M.name),R=F?.x??D?.x??0,w=F?.y??D?.y??0,[T]=await $.insert(P).values({name:M.name,domain:M.domain??null,description:M.description??null,source:"INTROSPECTION",x:R,y:w}).onConflictDoUpdate({target:P.name,set:{...M.domain!=null?{domain:M.domain}:{},...M.description!=null?{description:M.description}:{},source:"INTROSPECTION"}}).returning();if(q.set(M.name,T.id),await $.delete(e).where(yZ(e.tableId,T.id)),M.columns.length)await $.insert(e).values(M.columns.map((f,I)=>({tableId:T.id,name:f.name,type:f.type,isPk:f.isPk??!1,isFk:f.isFk??!1,nullable:f.nullable??!0,note:f.note??null,ord:I})))}let H=[...q.values()];if(H.length)await $.delete(l).where(F8(K4(l.fromTableId,H),K4(l.toTableId,H)));for(let M of J.relations){let F=q.get(M.fromTable),D=q.get(M.toTable);if(!F||!D)continue;await $.insert(l).values({fromTableId:F,toTableId:D,fromColumn:M.fromColumn,toColumn:M.toColumn,label:M.label??`${M.fromColumn} \u2192 ${M.toTable}.${M.toColumn}`})}let G=new Set(J.endpoints.map((M)=>`${M.method} ${M.path}`));if(Y){let F=(await $.query.endpoint.findMany({where:(D,{eq:R})=>R(D.source,"INTROSPECTION")})).filter((D)=>!G.has(`${D.method} ${D.path}`)).map((D)=>D.id);if(F.length)await $.delete(E).where(K4(E.id,F))}for(let M of U)if(M.id.startsWith("new:"))M.id=q.get(M.name)??M.id;for(let M of J.endpoints){let F=await $.query.endpoint.findFirst({where:(T,{and:f,eq:I})=>f(I(T.method,M.method),I(T.path,M.path))}),D,R;if(F)D=F.x,R=F.y;else{let T={id:`new:${M.method} ${M.path}`,method:M.method,path:M.path,uses:M.uses.map((I)=>({tableId:q.get(I.table)??""})).filter((I)=>I.tableId)},f=z5(T,U,N);D=f.x,R=f.y,N.push({...T,x:D,y:R})}let[w]=await $.insert(E).values({method:M.method,path:M.path,domain:M.domain??null,description:M.description??null,source:"INTROSPECTION",x:D,y:R}).onConflictDoUpdate({target:[E.method,E.path],set:{...M.domain!=null?{domain:M.domain}:{},...M.description!=null?{description:M.description}:{},source:"INTROSPECTION"}}).returning();if(!Q.partial||M.uses.length>0)await $.delete(i).where(yZ(i.endpointId,w.id));for(let T of M.uses){let f=q.get(T.table)??(await $.query.dbTable.findFirst({where:(I,{eq:UZ})=>UZ(I.name,T.table)}))?.id;if(!f)continue;await $.insert(i).values({endpointId:w.id,tableId:f,access:T.access})}}await H5($),await L5($);let B=await $.query.dbTable.findMany({where:(M,{eq:F})=>F(M.source,"INTROSPECTION"),columns:{x:!0,y:!0},with:{columns:{columns:{id:!0}}}}),z=await $.select({x:E.x,y:E.y}).from(E);if(D5(B.map((M)=>({x:M.x,y:M.y,columnCount:M.columns.length})))||U5(z))await A5($);let O=await uZ($);return{tables:J.tables.length,relations:J.relations.length,endpoints:J.endpoints.length,version:O}}var R5=d.object({files:d.array(d.object({path:d.string().trim().min(1),root:d.string().nullish(),lang:d.string().nullish(),mtimeMs:d.number().nullish(),size:d.number().nullish()})).default([]),edges:d.array(d.object({from:d.string().trim().min(1),to:d.string().trim().min(1)})).default([])});function E5(Z,$){let Q=new Map;for(let L of Z)Q.set(L,[]);for(let L of $)Q.get(L.from)?.push(L.to);let J=new Map,V=new Map,Y=new Set,X=[],K=new Map,j=[],W=0,U=0;for(let L of Z){if(J.has(L))continue;let q=[{v:L,iter:0}];J.set(L,W),V.set(L,W),W++,X.push(L),Y.add(L);while(q.length){let H=q[q.length-1],G=Q.get(H.v)??[];if(H.iter<G.length){let B=G[H.iter++];if(!J.has(B))J.set(B,W),V.set(B,W),W++,X.push(B),Y.add(B),q.push({v:B,iter:0});else if(Y.has(B))V.set(H.v,Math.min(V.get(H.v),J.get(B)))}else{if(V.get(H.v)===J.get(H.v)){let z=0,O;do O=X.pop(),Y.delete(O),K.set(O,U),z++;while(O!==H.v);j.push(z),U++}q.pop();let B=q[q.length-1];if(B)V.set(B.v,Math.min(V.get(B.v),V.get(H.v)))}}}let N=new Set;for(let L of $){let q=K.get(L.from);if(q!==void 0&&q===K.get(L.to)&&j[q]>1)N.add(`${L.from}|${L.to}`)}return N}async function S5(Z,$=b){let Q=R5.parse(Z),J=Q.files.map((N)=>N.path),V=new Set(J),Y=Q.edges.filter((N)=>V.has(N.from)&&V.has(N.to)&&N.from!==N.to),X=E5(J,Y),K=new Map,j=new Map;for(let N of Y)j.set(N.from,(j.get(N.from)??0)+1),K.set(N.to,(K.get(N.to)??0)+1);await $.delete(y).where(I8(y.path,J));for(let N of Q.files){let L={root:N.root??null,lang:N.lang??null,mtimeMs:N.mtimeMs??null,size:N.size??null,inDegree:K.get(N.path)??0,outDegree:j.get(N.path)??0};await $.insert(y).values({path:N.path,...L}).onConflictDoUpdate({target:y.path,set:L})}await $.delete(x);let W=0;if(Y.length)await $.insert(x).values(Y.map((N)=>{let L=X.has(`${N.from}|${N.to}`);if(L)W++;return{fromPath:N.from,toPath:N.to,circular:L}}));let U=await uZ($);return await $.update(a).set({codeGraphSyncedAt:new Date}).where(NZ(a.id,"singleton")),{files:Q.files.length,edges:Y.length,circular:W,version:U}}var R8=(Z,$)=>`${Z}\x00${$}`;function Y4(Z){let $=R5.parse(Z),Q=$.files.map((U)=>U.path),J=new Set(Q),V=$.edges.filter((U)=>J.has(U.from)&&J.has(U.to)&&U.from!==U.to),Y=E5(Q,V),X=new Map,K=new Map;for(let U of V)K.set(U.from,(K.get(U.from)??0)+1),X.set(U.to,(X.get(U.to)??0)+1);let j=new Map;for(let U of $.files)j.set(U.path,{root:U.root??null,lang:U.lang??null,mtimeMs:U.mtimeMs??null,size:U.size??null,inDegree:X.get(U.path)??0,outDegree:K.get(U.path)??0});let W=new Map;for(let U of V)W.set(R8(U.from,U.to),{from:U.from,to:U.to,circular:Y.has(`${U.from}|${U.to}`)});return{files:j,edges:W}}var E8=(Z,$)=>Z.root===$.root&&Z.lang===$.lang&&Z.mtimeMs===$.mtimeMs&&Z.size===$.size&&Z.inDegree===$.inDegree&&Z.outDegree===$.outDegree;async function v5(Z,$,Q=b){for(let[K,j]of $.files){let W=Z.files.get(K);if(W&&E8(W,j))continue;let U={root:j.root,lang:j.lang,mtimeMs:j.mtimeMs,size:j.size,inDegree:j.inDegree,outDegree:j.outDegree};await Q.insert(y).values({path:K,...U}).onConflictDoUpdate({target:y.path,set:U})}let J=[...Z.files.keys()].filter((K)=>!$.files.has(K));if(J.length)await Q.delete(y).where(P8(y.path,J));for(let[K,j]of Z.edges)if(!$.edges.has(K))await Q.delete(x).where(I5(NZ(x.fromPath,j.from),NZ(x.toPath,j.to)));let V=[];for(let[K,j]of $.edges){let W=Z.edges.get(K);if(!W)V.push({fromPath:j.from,toPath:j.to,circular:j.circular});else if(W.circular!==j.circular)await Q.update(x).set({circular:j.circular}).where(I5(NZ(x.fromPath,j.from),NZ(x.toPath,j.to)))}if(V.length)await Q.insert(x).values(V);let Y=await uZ(Q);await Q.update(a).set({codeGraphSyncedAt:new Date}).where(NZ(a.id,"singleton"));let X=0;for(let K of $.edges.values())if(K.circular)X++;return{files:$.files.size,edges:$.edges.size,circular:X,version:Y}}var T8=/[/\\](node_modules|\.git|\.next|dist|build|__pycache__|target|\.venv|venv|\.beacon|\.playwright-mcp|generated|coverage)[/\\]/;function y8(Z){try{let $=zZ(Z,"beacon.config.json");if(w5($)){let Q=JSON.parse(S8($,"utf8"));if(Array.isArray(Q.roots)&&Q.roots.length)return Q.roots.map((J)=>w8(Z,J))}}catch{}return[Z]}function T5(Z){let $=y8(Z.path),Q=dZ(Z.id),J=sZ(VZ(Z.id)),V=Z5($,Z.path);async function Y(){let G=X5(V.snapshot().files.map((F)=>F.path));for(let F of $)for(let D of["prisma/schema.prisma","schema.prisma"]){let R=zZ(F,D);if(w5(R))G.push(X(R))}let B=[];for(let F of G)try{B.push({path:F,content:await k5(zZ(Z.path,F),"utf8")})}catch{}let z=K5(B),O=Y5(B);if(!z.tables.length&&!O.length)return;if(O.length&&z.tableVars&&Object.keys(z.tableVars).length){let D=V.snapshot().edges,R=new Set(O.map((I)=>I.file)),w=new Map;for(let I of D){let UZ=w.get(I.from)??[];UZ.push(I.to),w.set(I.from,UZ)}for(let I=0;I<2;I++)for(let UZ of[...R])for(let b5 of w.get(UZ)??[])R.add(b5);let T=new Map;for(let I of[...R].slice(0,600))try{T.set(I,await k5(zZ(Z.path,I),"utf8"))}catch{}let f=$5({routeFiles:[...new Set(O.map((I)=>I.file))],edges:D,content:(I)=>T.get(I)??null,tableVars:z.tableVars});for(let I of O)I.uses=f.get(I.file)??[]}let M=await P5({tables:z.tables,relations:z.relations,endpoints:O},J,{partial:!0});console.log(`[beacon-inline] schema synced (${Z.name}): ${M.tables} tables / ${M.endpoints} endpoints`)}function X(G){return k8(Z.path,G).split(/[\\/]/).join("/")}let K=null,j=!1,W=new Set,U=null,N=!1;async function L(){if(N){q();return}N=!0;try{if(await Q,j)K=null,j=!1;if(K===null){let O=await V.seed(),M=await S5(O,J);K=Y4(O),console.log(`[beacon-inline] code-graph synced (${Z.name}): ${M.files} files / ${M.edges} imports${M.circular>0?` (${M.circular} circular)`:""}`),await Y();return}let G=[...W];W.clear();let B=G.some((O)=>Q4(X(O))),z=!1;for(let O of G)if(await V.applyChange(O))z=!0;if(z){let O=Y4(V.snapshot()),M=await v5(K,O,J);K=O,console.log(`[beacon-inline] code-graph updated (${Z.name}): ${M.files} files / ${M.edges} imports${M.circular>0?` (${M.circular} circular)`:""}`)}if(B)await Y()}catch(G){console.error(`[beacon-inline] error (${Z.name}):`,G instanceof Error?G.message:G)}finally{N=!1}}function q(){if(U)clearTimeout(U);U=setTimeout(L,600)}let H=[];for(let G of $)try{let B=v8(G,{recursive:!0,persistent:!0},(z,O)=>{if(!O){j=!0,q();return}let M=String(O);if(T8.test(`/${M}`))return;W.add(zZ(G,M)),q()});B.on("error",(z)=>console.error(`[beacon-inline] watcher error (${Z.name}):`,z)),H.push(B)}catch(B){console.error(`[beacon-inline] live watch unavailable for ${G} (${Z.name}):`,B instanceof Error?B.message:B)}return console.log(`[beacon-inline] watching ${Z.name} (${$.join(", ")}) \u2014 initial extract\u2026`),L(),{async stop(){if(U)clearTimeout(U);for(let G of H)G.close()}}}function x8(Z){let $=Z.limit??6,Q=Z.hardCap??12,J=new Map,V=0,Y=new Set;function X(G){let B=J.get(G);if(B)B.seq=++V}function K(G){if(J.has(G.id))return X(G.id);if(!Z.exists(G.path))return;J.set(G.id,{handle:Z.start(G),seq:++V})}function j(){let G=null,B=1/0;for(let[z,O]of J){if(Y.has(z))continue;if(O.seq<B)B=O.seq,G=z}if(G)J.get(G).handle.stop(),J.delete(G)}function W(){let G=Z.list().filter((B)=>Z.exists(B.path)).slice(0,$);Y=new Set(G.map((B)=>B.id));for(let B of G)K(B);for(let[B,z]of[...J]){let O=Z.get(B);if(!O||!Z.exists(O.path))z.handle.stop(),J.delete(B)}}function U(G){if(J.has(G))return X(G);let B=Z.get(G);if(!B||!Z.exists(B.path))return;if(J.size>=Q)j();if(J.size>=Q)return;J.set(G,{handle:Z.start(B),seq:++V})}async function N(G){let B=J.get(G);if(!B)return;J.delete(G),await B.handle.stop()}function L(G){return J.has(G)}function q(){return[...J.keys()]}async function H(){await Promise.all([...J.values()].map((G)=>G.handle.stop())),J.clear()}return{reconcile:W,ensureWatcher:U,stopWatcher:N,isWatching:L,activeIds:q,stopAll:H}}var f8=x8({list:FZ,get:g,exists:u8,start:(Z)=>T5(Z)});async function y5(Z){await f8.stopWatcher(Z)}async function u5(Z){if(!g(Z))return{ok:!1,removed:!1,fallbackId:r(),error:"unknown workspace"};D4(Z),O4(Z),await y5(Z),E4(VZ(Z)),I4(Z);try{g8(n(Z),{recursive:!0,force:!0})}catch($){return{ok:!1,removed:!0,fallbackId:r(),error:$ instanceof Error?$.message:String($)}}return{ok:!0,removed:!0,fallbackId:r()}}var X4=process.argv.slice(3),g5=X4.includes("--yes")||X4.includes("-y"),MZ=X4.find((Z)=>!Z.startsWith("-")),x5=(Z)=>`\x1B[32m\u2713\x1B[0m ${Z}`,h5=(Z)=>`\x1B[2m${Z}\x1B[0m`,m5=(Z)=>`
6
+ \x1B[1m${Z}\x1B[0m`;function b8(){if(!MZ)return g(JZ(pZ(process.cwd())));if(/^[0-9a-f]{12}$/.test(MZ)){let Z=g(MZ);if(Z)return Z}return g(JZ(pZ(f5(MZ))))}var s=b8();if(!s)console.error(`[beacon] ${MZ??process.cwd()} is not a registered Beacon workspace \u2014 nothing to remove.`),process.exit(1);console.log(m5(g5?"Beacon \xB7 remove workspace":"Beacon \xB7 remove workspace (dry run)"));console.log(` name: ${s.name}${r()===s.id?" (currently active)":""}`);console.log(` repo: ${s.path} ${h5("(untouched \u2014 only Beacon's data is erased)")}`);console.log(` data: ${n(s.id)} ${h5("(deleted)")}`);if(!g5)console.log(m5("Nothing was changed.")),console.log(` Run \x1B[1mbeacon remove${MZ?` ${MZ}`:""} --yes\x1B[0m to apply.
7
+ `),process.exit(0);async function p8(Z){try{let{pid:$,port:Q}=JSON.parse(m8(f5(t(),"server.json"),"utf8"));if(!$||!Q)return!1;return process.kill($,0),(await fetch(`http://localhost:${Q}/api/workspace`,{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify({id:Z}),signal:AbortSignal.timeout(1e4)})).ok}catch{return!1}}if(await p8(s.id))console.log(` ${x5(`removed ${s.name} (via the running daemon)`)}
8
+ `);else{let Z=await u5(s.id);if(!Z.ok)console.error(`[beacon] remove failed: ${Z.error??"unknown error"}`),process.exit(1);console.log(` ${x5(`removed ${s.name}`)}
9
+ `)}if(h8(n(s.id)))console.error(`[beacon] warning: ${n(s.id)} still exists \u2014 remove it manually.`),process.exit(1);
@@ -1,21 +1,22 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- var fZ=Object.defineProperty;var TZ=(Q)=>Q;function wZ(Q,Z){this[Q]=TZ.bind(null,Z)}var WQ=(Q,Z)=>{for(var $ in Z)fZ(Q,$,{get:Z[$],enumerable:!0,configurable:!0,set:wZ.bind(Z,$)})};var g=(Q,Z)=>()=>(Q&&(Z=Q(Q=0)),Z);var vQ={};WQ(vQ,{removeRepoAssets:()=>xQ,installRefreshSkill:()=>FZ,installPlanSkill:()=>RZ,installInitSkill:()=>gZ,installCodexRepoSkills:()=>IZ,ensureWorkflowDoc:()=>bZ,ensureMcp:()=>OZ,auditRepo:()=>AZ,REFRESH_SKILL:()=>BQ,PLAN_SKILL:()=>mQ,INIT_SKILL:()=>HQ});import{existsSync as M,mkdirSync as L,readFileSync as x,rmSync as _,writeFileSync as H}from"fs";import{join as q}from"path";function gZ(Q){let Z=q(Q,".claude","skills","beacon-init");L(Z,{recursive:!0});let $=q(Z,"SKILL.md");return H($,HQ),$}function FZ(Q){let Z=q(Q,".claude","skills","beacon-refresh");L(Z,{recursive:!0});let $=q(Z,"SKILL.md");return H($,BQ),$}function RZ(Q){let Z=q(Q,".claude","skills","beacon-plan");L(Z,{recursive:!0});let $=q(Z,"SKILL.md");return H($,mQ),$}function IZ(Q){let Z=[];for(let $ of EZ){let J=q(Q,".agents","skills",$.name);L(J,{recursive:!0});let Y=q(J,"SKILL.md");H(Y,$.body()),Z.push(Y)}return Z}function bZ(Q){let Z=q(Q,"AGENTS.md"),$="";try{$=x(Z,"utf8")}catch{}let J=new RegExp(`${k}[\\s\\S]*?${jQ}`);$=J.test($)?$.replace(J,hQ):`${$.trim()}
3
+ var wZ=Object.defineProperty;var FZ=(Q)=>Q;function RZ(Q,Z){this[Q]=FZ.bind(null,Z)}var PQ=(Q,Z)=>{for(var $ in Z)wZ(Q,$,{get:Z[$],enumerable:!0,configurable:!0,set:RZ.bind(Z,$)})};var C=(Q,Z)=>()=>(Q&&(Z=Q(Q=0)),Z);var A0=1500,O0=480000,y0=1800000,L=3600000,L0=3000;var mQ=()=>{};var NQ={};PQ(NQ,{removeRepoAssets:()=>xQ,installRefreshSkill:()=>IZ,installPlanSkill:()=>EZ,installInitSkill:()=>gZ,installCodexRepoSkills:()=>DZ,ensureWorkflowDoc:()=>AZ,ensureMcp:()=>OZ,auditRepo:()=>yZ,REFRESH_SKILL:()=>BQ,PLAN_SKILL:()=>cQ,INIT_SKILL:()=>jQ});import{existsSync as M,mkdirSync as k,readFileSync as v,rmSync as _,writeFileSync as H}from"fs";import{join as q}from"path";function gZ(Q){let Z=q(Q,".claude","skills","beacon-init");k(Z,{recursive:!0});let $=q(Z,"SKILL.md");return H($,jQ),$}function IZ(Q){let Z=q(Q,".claude","skills","beacon-refresh");k(Z,{recursive:!0});let $=q(Z,"SKILL.md");return H($,BQ),$}function EZ(Q){let Z=q(Q,".claude","skills","beacon-plan");k(Z,{recursive:!0});let $=q(Z,"SKILL.md");return H($,cQ),$}function DZ(Q){let Z=[];for(let $ of bZ){let J=q(Q,".agents","skills",$.name);k(J,{recursive:!0});let Y=q(J,"SKILL.md");H(Y,$.body()),Z.push(Y)}return Z}function AZ(Q){let Z=q(Q,"AGENTS.md"),$="";try{$=v(Z,"utf8")}catch{}let J=new RegExp(`${S}[\\s\\S]*?${vQ}`);$=J.test($)?$.replace(J,pQ):`${$.trim()}
4
4
 
5
- ${hQ}
5
+ ${pQ}
6
6
  `.trimStart(),H(Z,$.endsWith(`
7
7
  `)?$:`${$}
8
- `);let Y=q(Q,"CLAUDE.md"),V="";try{V=x(Y,"utf8")}catch{}if(!/@AGENTS\.md/.test(V))H(Y,`${V?`${V.trim()}
8
+ `);let Y=q(Q,"CLAUDE.md"),V="";try{V=v(Y,"utf8")}catch{}if(!/@AGENTS\.md/.test(V))H(Y,`${V?`${V.trim()}
9
9
 
10
10
  `:""}@AGENTS.md
11
- `)}function OZ(Q){let Z=q(Q,".mcp.json"),$={};try{$=JSON.parse(x(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 AZ(Q){let Z=q(Q,".mcp.json"),$=!1;try{$=!!JSON.parse(x(Z,"utf8")).mcpServers?.beacon}catch{}let J=!1;try{J=x(q(Q,"AGENTS.md"),"utf8").includes(k)}catch{}let Y=!1;try{Y=/@AGENTS\.md/.test(x(q(Q,"CLAUDE.md"),"utf8"))}catch{}return{repo:Q,mcpRegistered:$,agentsMdBlock:J,claudeMdImport:Y,skills:{"beacon-init":M(q(Q,".claude","skills","beacon-init","SKILL.md")),"beacon-refresh":M(q(Q,".claude","skills","beacon-refresh","SKILL.md"))},codexSkills:{"beacon-init":M(q(Q,".agents","skills","beacon-init","SKILL.md")),"beacon-refresh":M(q(Q,".agents","skills","beacon-refresh","SKILL.md"))}}}function xQ(Q){let Z=[];for(let z of["beacon-init","beacon-refresh","beacon-db-design"]){let P=q(Q,".claude","skills",z);if(M(P))_(P,{recursive:!0,force:!0}),Z.push(z)}for(let z of["beacon-init","beacon-refresh"]){let P=q(Q,".agents","skills",z);if(M(P))_(P,{recursive:!0,force:!0}),Z.push(`codex:${z}`)}let $=!1,J=q(Q,".mcp.json");try{let z=JSON.parse(x(J,"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)_(J,{force:!0});else H(J,JSON.stringify(z,null,2)+`
13
- `)}}catch{}let Y=!1,V=q(Q,"AGENTS.md");try{let z=x(V,"utf8"),P=new RegExp(`\\n?${k}[\\s\\S]*?${jQ}\\n?`);if(P.test(z)){let PQ=z.replace(P,`
11
+ `)}function OZ(Q){let Z=q(Q,".mcp.json"),$={};try{$=JSON.parse(v(Z,"utf8"))}catch{}$.mcpServers=$.mcpServers??{};let J=$.mcpServers.beacon;if(J){if(!J.timeout||J.timeout<L)return J.timeout=L,H(Z,JSON.stringify($,null,2)+`
12
+ `),{path:Z,added:!1,updated:!0};return{path:Z,added:!1,updated:!1}}return $.mcpServers.beacon={command:"beacon",args:["mcp"],timeout:L},H(Z,JSON.stringify($,null,2)+`
13
+ `),{path:Z,added:!0,updated:!1}}function yZ(Q){let Z=q(Q,".mcp.json"),$=!1;try{$=!!JSON.parse(v(Z,"utf8")).mcpServers?.beacon}catch{}let J=!1;try{J=v(q(Q,"AGENTS.md"),"utf8").includes(S)}catch{}let Y=!1;try{Y=/@AGENTS\.md/.test(v(q(Q,"CLAUDE.md"),"utf8"))}catch{}return{repo:Q,mcpRegistered:$,agentsMdBlock:J,claudeMdImport:Y,skills:{"beacon-init":M(q(Q,".claude","skills","beacon-init","SKILL.md")),"beacon-refresh":M(q(Q,".claude","skills","beacon-refresh","SKILL.md"))},codexSkills:{"beacon-init":M(q(Q,".agents","skills","beacon-init","SKILL.md")),"beacon-refresh":M(q(Q,".agents","skills","beacon-refresh","SKILL.md"))}}}function xQ(Q){let Z=[];for(let z of["beacon-init","beacon-refresh","beacon-db-design"]){let W=q(Q,".claude","skills",z);if(M(W))_(W,{recursive:!0,force:!0}),Z.push(z)}for(let z of["beacon-init","beacon-refresh"]){let W=q(Q,".agents","skills",z);if(M(W))_(W,{recursive:!0,force:!0}),Z.push(`codex:${z}`)}let $=!1,J=q(Q,".mcp.json");try{let z=JSON.parse(v(J,"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)_(J,{force:!0});else H(J,JSON.stringify(z,null,2)+`
14
+ `)}}catch{}let Y=!1,V=q(Q,"AGENTS.md");try{let z=v(V,"utf8"),W=new RegExp(`\\n?${S}[\\s\\S]*?${vQ}\\n?`);if(W.test(z)){let HQ=z.replace(W,`
14
15
  `).replace(/\n{3,}/g,`
15
16
 
16
- `).trimStart();H(V,PQ.endsWith(`
17
- `)?PQ:`${PQ}
18
- `),Y=!0}}catch{}let X=!1,U=q(Q,"CLAUDE.md");try{let z=x(U,"utf8"),P=z.replace(/^[ \t]*@AGENTS\.md[ \t]*\n?/m,"");if(P!==z){if(!P.trim())_(U,{force:!0});else H(U,P);X=!0}}catch{}return{skillsRemoved:Z,mcpUnregistered:$,agentsBlockRemoved:Y,claudeImportRemoved:X}}var HQ=`---
17
+ `).trimStart();H(V,HQ.endsWith(`
18
+ `)?HQ:`${HQ}
19
+ `),Y=!0}}catch{}let X=!1,U=q(Q,"CLAUDE.md");try{let z=v(U,"utf8"),W=z.replace(/^[ \t]*@AGENTS\.md[ \t]*\n?/m,"");if(W!==z){if(!W.trim())_(U,{force:!0});else H(U,W);X=!0}}catch{}return{skillsRemoved:Z,mcpUnregistered:$,agentsBlockRemoved:Y,claudeImportRemoved:X}}var jQ=`---
19
20
  name: beacon-init
20
21
  description: Read this repository and map its architecture, schema, and roadmap into Beacon (the local visual planning panel). Use when the user runs /beacon-init, asks to "set up Beacon for this repo", or asks to initialize/bootstrap Beacon's map of this codebase.
21
22
  ---
@@ -101,7 +102,7 @@ The one caveat: if the user manually edited an INIT-source node on the canvas (e
101
102
  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
103
 
103
104
  After the tool returns, report the final counts plus a one-line summary of the diff you surfaced.
104
- `,mQ=`---
105
+ `,cQ=`---
105
106
  name: beacon-plan
106
107
  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
108
  ---
@@ -149,7 +150,7 @@ If it returns feedback, revise and call it again.
149
150
  If \`beacon_present_plan\` isn't available, the panel isn't wired here \u2014 fall back to ExitPlanMode
150
151
  with the same \`\`\`beacon block (Claude Code only; Codex has no ExitPlanMode), or tell the user to
151
152
  run \`beacon\` in this repo once.
152
- `,EZ,k="<!-- beacon:workflow:start -->",jQ="<!-- beacon:workflow:end -->",hQ;var S=g(()=>{EZ=[{name:"beacon-init",body:()=>HQ},{name:"beacon-refresh",body:()=>BQ}];hQ=`${k}
153
+ `,bZ,S="<!-- beacon:workflow:start -->",vQ="<!-- beacon:workflow:end -->",pQ;var h=C(()=>{mQ();bZ=[{name:"beacon-init",body:()=>jQ},{name:"beacon-refresh",body:()=>BQ}];pQ=`${S}
153
154
  ## Beacon \u2014 feature workflow
154
155
 
155
156
  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:
@@ -207,18 +208,18 @@ Register them all in that single batched call. If a plan added five features, th
207
208
  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.
208
209
 
209
210
  Pull raw planning data anytime with \`beacon_entities\` (features / architecture / tables / endpoints).
210
- ${jQ}`});import{existsSync as pQ,mkdirSync as NQ,readFileSync as m,rmSync as DZ,writeFileSync as p}from"fs";import{dirname as cQ,join as h}from"path";function uQ(Q){try{return JSON.parse(m(Q,"utf8"))}catch{return{}}}function lQ(Q,Z){NQ(cQ(Q),{recursive:!0}),p(Q,JSON.stringify(Z,null,2)+`
211
- `)}function l(Q,Z){let $=uQ(Q);$.hooks=$.hooks??{},$.hooks[Z.event]=$.hooks[Z.event]??[];let J=$.hooks[Z.event];if(J.some((V)=>V.matcher===Z.matcher&&V.hooks?.some((X)=>X.command===Z.command)))return!1;return J.push({matcher:Z.matcher,hooks:[{type:"command",command:Z.command}]}),lQ(Q,$),!0}function n(Q,Z){return(uQ(Q).hooks?.[Z.event]??[]).some((Y)=>Y.hooks?.some((V)=>V.command===Z.command))}function t(Q,Z){let $=uQ(Q),J=$.hooks?.[Z.event];if(!J)return!1;let Y=!1,V=J.map((X)=>{let U=X.hooks?.length??0,z=(X.hooks??[]).filter((P)=>P.command!==Z.command);if(z.length!==U)Y=!0;return{...X,hooks:z}}).filter((X)=>(X.hooks??[]).length>0);if(!Y)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 d(Q,Z,$,J){let Y=`${Z}
211
+ ${vQ}`});import{existsSync as lQ,mkdirSync as GQ,readFileSync as p,rmSync as LZ,writeFileSync as c}from"fs";import{dirname as nQ,join as m}from"path";function uQ(Q){try{return JSON.parse(p(Q,"utf8"))}catch{return{}}}function tQ(Q,Z){GQ(nQ(Q),{recursive:!0}),c(Q,JSON.stringify(Z,null,2)+`
212
+ `)}function n(Q,Z){let $=uQ(Q);$.hooks=$.hooks??{},$.hooks[Z.event]=$.hooks[Z.event]??[];let J=$.hooks[Z.event];if(J.some((V)=>V.matcher===Z.matcher&&V.hooks?.some((X)=>X.command===Z.command)))return!1;return J.push({matcher:Z.matcher,hooks:[{type:"command",command:Z.command}]}),tQ(Q,$),!0}function t(Q,Z){return(uQ(Q).hooks?.[Z.event]??[]).some((Y)=>Y.hooks?.some((V)=>V.command===Z.command))}function d(Q,Z){let $=uQ(Q),J=$.hooks?.[Z.event];if(!J)return!1;let Y=!1,V=J.map((X)=>{let U=X.hooks?.length??0,z=(X.hooks??[]).filter((W)=>W.command!==Z.command);if(z.length!==U)Y=!0;return{...X,hooks:z}}).filter((X)=>(X.hooks??[]).length>0);if(!Y)return!1;if(V.length)$.hooks[Z.event]=V;else delete $.hooks[Z.event];if($.hooks&&Object.keys($.hooks).length===0)delete $.hooks;return tQ(Q,$),!0}function a(Q,Z,$,J){let Y=`${Z}
212
213
  ${J.trim()}
213
- ${$}`,V="";try{V=m(Q,"utf8")}catch{}let X=new RegExp(`${Z}[\\s\\S]*?${$}`);V=X.test(V)?V.replace(X,Y):V.trim()?`${V.trim()}
214
+ ${$}`,V="";try{V=p(Q,"utf8")}catch{}let X=new RegExp(`${Z}[\\s\\S]*?${$}`);V=X.test(V)?V.replace(X,Y):V.trim()?`${V.trim()}
214
215
 
215
216
  ${Y}
216
217
  `:`${Y}
217
- `,NQ(cQ(Q),{recursive:!0}),p(Q,V.endsWith(`
218
+ `,GQ(nQ(Q),{recursive:!0}),c(Q,V.endsWith(`
218
219
  `)?V:`${V}
219
- `)}function F(Q,Z){try{return m(Q,"utf8").includes(Z)}catch{return!1}}function a(Q,Z,$){let J="";try{J=m(Q,"utf8")}catch{return!1}let Y=new RegExp(`${Z}[\\s\\S]*?${$}\\n?`);if(!Y.test(J))return!1;let V=J.replace(Y,"").replace(/\n{3,}/g,`
220
+ `)}function R(Q,Z){try{return p(Q,"utf8").includes(Z)}catch{return!1}}function s(Q,Z,$){let J="";try{J=p(Q,"utf8")}catch{return!1}let Y=new RegExp(`${Z}[\\s\\S]*?${$}\\n?`);if(!Y.test(J))return!1;let V=J.replace(Y,"").replace(/\n{3,}/g,`
220
221
 
221
- `).trimStart();return p(Q,V),!0}function s(Q,Z,$){let J=h(Q,Z);NQ(J,{recursive:!0});let Y=h(J,"SKILL.md");return p(Y,$),Y}function R(Q,Z){return pQ(h(Q,Z,"SKILL.md"))}function r(Q,Z){let $=h(Q,Z);if(!pQ($))return!1;return DZ($,{recursive:!0,force:!0}),!0}var W,c=`## Beacon (visual planning panel)
222
+ `).trimStart();return c(Q,V),!0}function r(Q,Z,$){let J=m(Q,Z);GQ(J,{recursive:!0});let Y=m(J,"SKILL.md");return c(Y,$),Y}function g(Q,Z){return lQ(m(Q,Z,"SKILL.md"))}function o(Q,Z){let $=m(Q,Z);if(!lQ($))return!1;return LZ($,{recursive:!0,force:!0}),!0}var P,l=`## Beacon (visual planning panel)
222
223
 
223
224
  This machine has Beacon installed \u2014 a local visual planning surface for the terminal-side
224
225
  agent. Beacon proposes feature plans (roadmap features + DB schema + endpoints) via MCP,
@@ -239,20 +240,20 @@ the user reviews on a canvas at /plan, and feedback flows back as the next round
239
240
  Feedback bundles inline annotations on the markdown PLUS any edits the user made directly
240
241
  on the /map and /db boards (added features, attached subtasks, edited columns, new
241
242
  endpoints). Treat board edits as the user's revision intent \u2014 re-propose matching them
242
- verbatim. Do NOT implement until the tool returns approval.`;var GQ=g(()=>{W=["beacon-init","beacon-refresh","beacon-plan"]});import{mkdirSync as yZ,renameSync as _Z,rmSync as LZ,writeFileSync as kZ}from"fs";import{dirname as SZ}from"path";function o(Q,Z){yZ(SZ(Q),{recursive:!0});let $=`${Q}.tmp`;try{kZ($,Z),_Z($,Q)}catch(J){throw LZ($,{force:!0}),J}}function k0(Q,Z,$=!1){o(Q,JSON.stringify(Z,null,$?2:void 0))}var nQ=()=>{};var eQ={};WQ(eQ,{setupCodexAssets:()=>cZ,removeCodexMcp:()=>iQ,removeCodexArtifacts:()=>wQ,hasCodexMcp:()=>fQ,ensureCodexMcp:()=>oQ,codexMcpProblem:()=>pZ,codexDetected:()=>aQ,auditCodex:()=>TQ,CODEX_HOOKS:()=>T});import{readFileSync as ZQ}from"fs";import{homedir as hZ}from"os";import{join as b}from"path";function tQ(){return process.env.HOME||process.env.USERPROFILE||hZ()}function aQ(){if(process.env.BEACON_CODEX==="1")return!0;if(process.env.BEACON_CODEX==="0")return!1;if(KQ===void 0)KQ=Bun.which("codex")!==null;return KQ}function I(Q){try{return Bun.TOML.parse(Q)}catch{return null}}function fQ(){try{return Boolean(I(ZQ(f(),"utf8"))?.mcp_servers?.beacon)}catch{return!1}}function pZ(){let Q="";try{Q=ZQ(f(),"utf8")}catch{return null}let Z=I(Q);if(!Z)return`~/.codex/config.toml does not parse \u2014 ${E}`;if(Z.mcp_servers?.beacon)return null;if(/^\s*mcp_servers\s*=/m.test(Q))return`mcp_servers is an inline table \u2014 ${E}`;return null}function oQ(){let Q="",Z=!1;try{Q=ZQ(f(),"utf8"),Z=!0}catch{}if(Z){let V=I(Q);if(!V)return{added:!1,error:`~/.codex/config.toml does not parse \u2014 ${E}`};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 ${E}`}}let $=!Q?"":Q.endsWith(`
243
+ verbatim. Do NOT implement until the tool returns approval.`;var KQ=C(()=>{P=["beacon-init","beacon-refresh","beacon-plan"]});import{mkdirSync as _Z,renameSync as kZ,rmSync as SZ,writeFileSync as hZ}from"fs";import{dirname as mZ}from"path";function i(Q,Z){_Z(mZ(Q),{recursive:!0});let $=`${Q}.tmp`;try{hZ($,Z),kZ($,Q)}catch(J){throw SZ($,{force:!0}),J}}function t0(Q,Z,$=!1){i(Q,JSON.stringify(Z,null,$?2:void 0))}var dQ=()=>{};var ZZ={};PQ(ZZ,{setupCodexAssets:()=>nZ,removeCodexMcp:()=>QZ,removeCodexArtifacts:()=>FQ,hasCodexMcp:()=>TQ,ensureCodexMcp:()=>eQ,codexMcpProblem:()=>lZ,codexDetected:()=>rQ,auditCodex:()=>wQ,CODEX_HOOKS:()=>w});import{readFileSync as $Q}from"fs";import{homedir as pZ}from"os";import{join as b}from"path";function aQ(){return process.env.HOME||process.env.USERPROFILE||pZ()}function rQ(){if(process.env.BEACON_CODEX==="1")return!0;if(process.env.BEACON_CODEX==="0")return!1;if(fQ===void 0)fQ=Bun.which("codex")!==null;return fQ}function E(Q){try{return Bun.TOML.parse(Q)}catch{return null}}function TQ(){try{return Boolean(E($Q(T(),"utf8"))?.mcp_servers?.beacon)}catch{return!1}}function lZ(){let Q="";try{Q=$Q(T(),"utf8")}catch{return null}let Z=E(Q);if(!Z)return`~/.codex/config.toml does not parse \u2014 ${I}`;if(Z.mcp_servers?.beacon)return null;if(/^\s*mcp_servers\s*=/m.test(Q))return`mcp_servers is an inline table \u2014 ${I}`;return null}function eQ(){let Q="",Z=!1;try{Q=$Q(T(),"utf8"),Z=!0}catch{}if(Z){let V=E(Q);if(!V)return{added:!1,error:`~/.codex/config.toml does not parse \u2014 ${I}`};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 ${I}`}}let $=!Q?"":Q.endsWith(`
243
244
  `)?`
244
245
  `:`
245
246
 
246
- `,J=Q+$+mZ;if(I(J)?.mcp_servers?.beacon?.command!=="beacon")return{added:!1,error:`could not safely append [mcp_servers.beacon] \u2014 ${E}`};return o(f(),J),{added:!0}}function iQ(){let Q="";try{Q=ZQ(f(),"utf8")}catch{return{removed:!1}}let Z=Q.split(`
247
- `),$=Z.indexOf(sQ);if($===-1)return{removed:!1,skipped:fQ()};let J=Z.indexOf(rQ,$);if(J===-1)return{removed:!1,skipped:!0};Z.splice($,J-$+1);let Y=Z.join(`
247
+ `,J=Q+$+cZ;if(E(J)?.mcp_servers?.beacon?.command!=="beacon")return{added:!1,error:`could not safely append [mcp_servers.beacon] \u2014 ${I}`};return i(T(),J),{added:!0}}function QZ(){let Q="";try{Q=$Q(T(),"utf8")}catch{return{removed:!1}}let Z=Q.split(`
248
+ `),$=Z.indexOf(oQ);if($===-1)return{removed:!1,skipped:TQ()};let J=Z.indexOf(iQ,$);if(J===-1)return{removed:!1,skipped:!0};Z.splice($,J-$+1);let Y=Z.join(`
248
249
  `).replace(/\n{3,}/g,`
249
250
 
250
- `).replace(/^\n+/,"");if(I(Y)===null)return{removed:!1,skipped:!0};return o(f(),Y),{removed:!0}}async function cZ(){let{INIT_SKILL:Q,REFRESH_SKILL:Z,PLAN_SKILL:$}=await Promise.resolve().then(() => (S(),vQ)),J={"beacon-init":Q,"beacon-refresh":Z,"beacon-plan":$},Y=[];for(let z of W){if(!R(e(),z))Y.push(z);s(e(),z,J[z])}let V=0;for(let z of T)if(l(MQ(),{event:z.event,matcher:z.matcher,command:z.command}))V++;let X=F(i(),QQ);d(i(),QQ,dQ,c);let U=oQ();return{skillsAdded:Y,hooksAdded:V,agentsMdBlockTouched:!X,mcp:U}}function TQ(){let Q={};for(let $ of W)Q[$]=R(e(),$);let Z={};for(let $ of T)Z[$.event]=n(MQ(),{event:$.event,command:$.command});return{detected:aQ(),skills:Q,hooks:Z,agentsMdBlock:F(i(),QQ),mcp:fQ()}}function wQ(){let Q=[];for(let Y of W)if(r(e(),Y))Q.push(Y);let Z=0;for(let Y of T)if(t(MQ(),{event:Y.event,command:Y.command}))Z++;let $=a(i(),QQ,dQ),J=iQ();return{skillsRemoved:Q,hooksRemoved:Z,agentsMdBlockRemoved:$,mcpRemoved:J.removed,mcpSkipped:J.skipped}}var CQ=()=>b(tQ(),".codex"),MQ=()=>b(CQ(),"hooks.json"),f=()=>b(CQ(),"config.toml"),i=()=>b(CQ(),"AGENTS.md"),e=()=>b(tQ(),".agents","skills"),QQ="<!-- beacon:global:start -->",dQ="<!-- beacon:global:end -->",T,KQ,sQ="# beacon:start (managed by Beacon \u2014 `beacon uninstall` removes this block)",rQ="# beacon:end",mZ,E="add it manually: codex mcp add beacon -- beacon mcp";var gQ=g(()=>{GQ();nQ();T=[{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."}];mZ=`${sQ}
251
+ `).replace(/^\n+/,"");if(E(Y)===null)return{removed:!1,skipped:!0};return i(T(),Y),{removed:!0}}async function nZ(){let{INIT_SKILL:Q,REFRESH_SKILL:Z,PLAN_SKILL:$}=await Promise.resolve().then(() => (h(),NQ)),J={"beacon-init":Q,"beacon-refresh":Z,"beacon-plan":$},Y=[];for(let z of P){if(!g(QQ(),z))Y.push(z);r(QQ(),z,J[z])}let V=0;for(let z of w)if(n(MQ(),{event:z.event,matcher:z.matcher,command:z.command}))V++;let X=R(e(),ZQ);a(e(),ZQ,sQ,l);let U=eQ();return{skillsAdded:Y,hooksAdded:V,agentsMdBlockTouched:!X,mcp:U}}function wQ(){let Q={};for(let $ of P)Q[$]=g(QQ(),$);let Z={};for(let $ of w)Z[$.event]=t(MQ(),{event:$.event,command:$.command});return{detected:rQ(),skills:Q,hooks:Z,agentsMdBlock:R(e(),ZQ),mcp:TQ()}}function FQ(){let Q=[];for(let Y of P)if(o(QQ(),Y))Q.push(Y);let Z=0;for(let Y of w)if(d(MQ(),{event:Y.event,command:Y.command}))Z++;let $=s(e(),ZQ,sQ),J=QZ();return{skillsRemoved:Q,hooksRemoved:Z,agentsMdBlockRemoved:$,mcpRemoved:J.removed,mcpSkipped:J.skipped}}var CQ=()=>b(aQ(),".codex"),MQ=()=>b(CQ(),"hooks.json"),T=()=>b(CQ(),"config.toml"),e=()=>b(CQ(),"AGENTS.md"),QQ=()=>b(aQ(),".agents","skills"),ZQ="<!-- beacon:global:start -->",sQ="<!-- beacon:global:end -->",w,fQ,oQ="# beacon:start (managed by Beacon \u2014 `beacon uninstall` removes this block)",iQ="# beacon:end",cZ,I="add it manually: codex mcp add beacon -- beacon mcp";var RQ=C(()=>{KQ();dQ();w=[{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=`${oQ}
251
252
  [mcp_servers.beacon]
252
253
  command = "beacon"
253
254
  args = ["mcp"]
254
- ${rQ}
255
- `});var zZ={};WQ(zZ,{provisionDb:()=>B0});import{createClient as $0}from"@libsql/client";import{drizzle as J0}from"drizzle-orm/libsql";import{migrate as Y0}from"drizzle-orm/libsql/migrator";import{readMigrationFiles as V0}from"drizzle-orm/migrator";import{dirname as bQ,join as z0}from"path";import{fileURLToPath as q0}from"url";async function YQ(Q,Z){return(await Q.execute({sql:"SELECT 1 FROM sqlite_master WHERE type='table' AND name = ?",args:[Z]})).rows.length>0}async function W0(Q,Z){let $=await Q.execute(`PRAGMA table_info("${Z}")`);return new Set($.rows.map((J)=>String(J.name)))}async function VZ(Q){if(!await YQ(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 H0(Q){for(let[Z,$]of Object.entries(P0)){if(!await YQ(Q,Z))continue;let J=await W0(Q,Z);for(let Y of $){if(!J.has(Y))continue;await Q.execute(`UPDATE "${Z}" SET "${Y}" = CAST((julianday("${Y}") - 2440587.5) * 86400000 AS INTEGER) WHERE typeof("${Y}") = 'text'`)}}}async function B0(Q,Z=U0){let $=$0({url:Q});try{await $.execute("PRAGMA journal_mode = WAL;"),await $.execute("PRAGMA foreign_keys = ON;"),await $.execute("PRAGMA busy_timeout = 5000;");let J=await YQ($,"__drizzle_migrations"),Y=await YQ($,"Node"),V=!1;if(Y&&!J){let U=V0({migrationsFolder:Z})[0];if(U)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:[U.hash,U.folderMillis]}),V=!0}let X=await VZ($);if(await Y0(J0($),{migrationsFolder:Z}),await VZ($)>X)V=!0;return await H0($),{migrated:V}}finally{$.close()}}var X0,U0,P0;var qZ=g(async()=>{X0=bQ(bQ(bQ(q0(import.meta.url)))),U0=process.env.BEACON_MIGRATIONS_DIR||z0(X0,"drizzle"),P0={Node:["createdAt","updatedAt"],Note:["createdAt","updatedAt"],DbTable:["createdAt","updatedAt"],Endpoint:["createdAt","updatedAt"],DraftTable:["createdAt"],SyncState:["codeGraphSyncedAt","updatedAt"],AppSetting:["updatedAt"],ProjectMeta:["updatedAt"],CodeFile:["updatedAt"]}});GQ();import{existsSync as lZ}from"fs";import{homedir as nZ}from"os";import{join as $Q}from"path";function tZ(){return process.env.HOME||process.env.USERPROFILE||nZ()}var JQ=()=>$Q(tZ(),".claude"),FQ=()=>$Q(JQ(),"skills"),RQ=()=>$Q(JQ(),"settings.json"),EQ=()=>$Q(JQ(),"CLAUDE.md"),IQ="<!-- beacon:global:start -->",QZ="<!-- beacon:global:end -->";var dZ=c,O=[{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 aZ(Q,Z){return s(FQ(),Q,Z)}function ZZ(Q){return R(FQ(),Q)}function sZ(Q){return r(FQ(),Q)}function rZ(Q){return l(RQ(),Q)}function oZ(Q){return n(RQ(),Q)}function iZ(Q){return t(RQ(),Q)}function eZ(Q){d(EQ(),IQ,QZ,Q)}function $Z(){return F(EQ(),IQ)}function Q0(){return a(EQ(),IQ,QZ)}function JZ(){let Q={};for(let $ of W)Q[$]=ZZ($);let Z={};for(let $ of O)Z[$.event]=oZ({event:$.event,command:$.command});return{homeExists:lZ(JQ()),skills:Q,hooks:Z,claudeMdBlock:$Z()}}async function Z0(){let{INIT_SKILL:Q,REFRESH_SKILL:Z,PLAN_SKILL:$}=await Promise.resolve().then(() => (S(),vQ)),J={"beacon-init":Q,"beacon-refresh":Z,"beacon-plan":$},Y=[];for(let U of W){if(!ZZ(U))Y.push(U);aZ(U,J[U])}let V=0;for(let U of O)if(rZ({event:U.event,matcher:U.matcher,command:U.command}))V++;let X=$Z();return eZ(dZ),{skillsAdded:Y,hooksAdded:V,claudeMdBlockTouched:!X}}async function s0(){let Q;try{Q={ok:!0,...await Z0()}}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(() => (gQ(),eQ));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 YZ(){let Q=[];for(let J of W)if(sZ(J))Q.push(J);let Z=0;for(let J of O)if(iZ(J))Z++;let $=Q0();return{skillsRemoved:Q,hooksRemoved:Z,claudeMdBlockRemoved:$}}import{AsyncLocalStorage as j0}from"async_hooks";import{spawnSync as x0}from"child_process";import{createHash as v0}from"crypto";import{existsSync as UZ,mkdirSync as A,readFileSync as AQ,writeFileSync as DQ}from"fs";import{homedir as PZ}from"os";import{basename as N0,join as N,parse as u0,resolve as XZ}from"path";function v(){return process.env.BEACON_HOME||N(PZ(),".beacon")}function yQ(){return N(v(),"workspaces.json")}function VQ(Q){return v0("sha256").update(Q).digest("hex").slice(0,12)}function U1(Q=process.cwd()){let Z=x0("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 WZ(Q){let Z=XZ(Q);return Z!==XZ(PZ())&&Z!==u0(Z).root}function HZ(){return N(v(),"deleted.json")}function _Q(){try{let Q=JSON.parse(AQ(HZ(),"utf8"));return Array.isArray(Q)?Q:[]}catch{return[]}}function BZ(Q){A(v(),{recursive:!0}),DQ(HZ(),JSON.stringify(Q,null,2))}function jZ(Q){return _Q().includes(Q)}function P1(Q){let Z=_Q();if(!Z.includes(Q))BZ([...Z,Q])}function G0(Q){let Z=_Q();if(Z.includes(Q))BZ(Z.filter(($)=>$!==Q))}function zQ(Q){return N(v(),Q)}function K0(Q){return`file:${N(zQ(Q),"db.sqlite")}`}function D(){try{let Q=JSON.parse(AQ(yQ(),"utf8"));return Array.isArray(Q)?Q:[]}catch{return[]}}function LQ(Q){A(v(),{recursive:!0}),DQ(yQ(),JSON.stringify(Q,null,2))}function qQ(){return D().sort((Q,Z)=>Z.lastOpenedAt.localeCompare(Q.lastOpenedAt))}function G(Q){return D().find((Z)=>Z.id===Q)??null}function xZ(Q,Z,$=new Date().toISOString()){if(!WZ(Q))throw Error(`beacon: refusing to register a non-repo path as a workspace: ${Q}`);let J=VQ(Q);if(jZ(J))throw Error(`beacon: workspace ${J} (${Q}) was deleted \u2014 run \`beacon\` or /beacon-init to re-add it`);let Y=D(),V=Y.find((z)=>z.id===J),X={id:J,path:Q,name:Z||V?.name||N0(Q),lastOpenedAt:$},U=[X,...Y.filter((z)=>z.id!==J)];return A(zQ(J),{recursive:!0}),LQ(U),X}function W1(Q,Z){return G0(VQ(Q)),xZ(Q,Z)}function H1(Q,Z=new Date().toISOString()){let $=D(),J=$.find((Y)=>Y.id===Q);if(!J)return;J.lastOpenedAt=Z,LQ($)}function B1(Q){if(LQ(D().filter((Z)=>Z.id!==Q)),kQ()===Q)C0(qQ()[0]?.id??null)}function vZ(){return N(v(),"active")}function kQ(){try{return AQ(vZ(),"utf8").trim()||null}catch{return null}}function C0(Q){A(v(),{recursive:!0}),DQ(vZ(),Q??"")}function j1(){let Q=kQ();return Q?G(Q):null}function x1(){let Q=T0()??kQ();return Q?G(Q):null}function v1(Q){return G(Q)?.path??null}function N1(){return UZ(yQ())}var NZ="beacon_ws";function uZ(Q,Z){let $=Q.headers.get("cookie");if(!$)return null;for(let J of $.split(";")){let Y=J.indexOf("=");if(Y===-1)continue;if(J.slice(0,Y).trim()===Z)return decodeURIComponent(J.slice(Y+1).trim())}return null}function u1(Q){let Z=Q.headers.get("x-beacon-workspace");if(Z&&G(Z))return Z;let $=uZ(Q,NZ);if($&&G($))return $;return M0()}function M0(){let Q=qQ();return Q.length===1?Q[0].id:null}var f0="x-beacon-workspace-path";async function G1(Q){let Z=Q.headers.get("x-beacon-workspace");if(Z&&G(Z))return Z;let $=Q.headers.get(f0);if($&&WZ($)&&!jZ(VQ($))&&(!Z||VQ($)===Z)){let Y=xZ($);return await w0(Y.id),Y.id}let J=uZ(Q,NZ);if(J&&G(J))return J;return null}var GZ=new j0;function K1(Q,Z){return Q?GZ.run(Q,Z):Z()}function T0(){return GZ.getStore()??null}var OQ=new Set;function C1(Q){OQ.delete(N(zQ(Q),"db.sqlite"))}async function w0(Q){let Z=zQ(Q),$=N(Z,"db.sqlite"),J=UZ($);if(J&&OQ.has($))return{ok:!0,created:!1,migrated:!1};try{A(Z,{recursive:!0});let{provisionDb:Y}=await qZ().then(() => zZ),V=await Y(K0(Q));return OQ.add($),{ok:!0,created:!J,migrated:J&&V.migrated}}catch(Y){return{ok:!1,created:!1,migrated:!1,error:Y instanceof Error?Y.message:String(Y)}}}S();gQ();import{existsSync as XQ,readFileSync as g0,rmSync as F0}from"fs";import{join as R0}from"path";var KZ=process.argv.slice(3),CZ=KZ.includes("--yes")||KZ.includes("-y"),j=(Q)=>`\x1B[32m\u2713\x1B[0m ${Q}`,B=(Q)=>`\x1B[2m${Q}\x1B[0m`,C=(Q)=>`
256
- \x1B[1m${Q}\x1B[0m`,MZ=(Q)=>`\x1B[33m!\x1B[0m ${Q}`,K=v(),y=qQ(),SQ=JZ();console.log(C(CZ?"Beacon \xB7 uninstall":"Beacon \xB7 uninstall (dry run)"));console.log(C("Global"));console.log(` ${XQ(K)?`wipe ${K} (${y.length} workspaces)`:`${B(`${K} \u2014 already gone`)}`}`);for(let Q of W)console.log(` ${SQ.skills[Q]?`remove ~/.claude/skills/${Q}/`:B(`skill ${Q} \u2014 already gone`)}`);for(let Q of O)console.log(` ${SQ.hooks[Q.event]?`remove hook ${Q.event} \u2192 ${Q.command}`:B(`hook ${Q.event} \u2192 ${Q.command} \u2014 already gone`)}`);console.log(` ${SQ.claudeMdBlock?"strip Beacon block from ~/.claude/CLAUDE.md":B("global CLAUDE.md block \u2014 already gone")}`);var UQ=TQ();console.log(C("Codex"));for(let Q of W)console.log(` ${UQ.skills[Q]?`remove ~/.agents/skills/${Q}/`:B(`skill ${Q} \u2014 already gone`)}`);for(let Q of T)console.log(` ${UQ.hooks[Q.event]?`remove hook ${Q.event} \u2192 ${Q.command} from ~/.codex/hooks.json`:B(`hook ${Q.event} \u2192 ${Q.command} \u2014 already gone`)}`);console.log(` ${UQ.agentsMdBlock?"strip Beacon block from ~/.codex/AGENTS.md":B("global ~/.codex/AGENTS.md block \u2014 already gone")}`);console.log(` ${UQ.mcp?"strip [mcp_servers.beacon] from ~/.codex/config.toml (if Beacon wrote it)":B("config.toml beacon entry \u2014 already gone")}`);if(y.length){console.log(C(`Per-repo (${y.length})`));for(let Q of y){if(!XQ(Q.path)){console.log(` ${B(`${Q.path} \u2014 repo no longer on disk, skipping`)}`);continue}console.log(` ${Q.path}`),console.log(` ${B("strip beacon entry from .mcp.json, workflow block from AGENTS.md, skills, CLAUDE.md @-import")}`)}}if(!CZ)console.log(C("Nothing was changed.")),console.log(" Run \x1B[1mbeacon uninstall --yes\x1B[0m to apply."),console.log(` The \x1B[1mbeacon\x1B[0m binary itself (the cloned source + your PATH symlink) is NOT removed by this \u2014 your install script handles that.
257
- `),process.exit(0);console.log(C("Applying\u2026"));var w=YZ();if(w.skillsRemoved.length)console.log(` ${j(`removed skills: ${w.skillsRemoved.join(", ")}`)}`);if(w.hooksRemoved)console.log(` ${j(`removed ${w.hooksRemoved} hook${w.hooksRemoved===1?"":"s"} from ~/.claude/settings.json`)}`);if(w.claudeMdBlockRemoved)console.log(` ${j("stripped Beacon block from ~/.claude/CLAUDE.md")}`);var u=wQ();if(u.skillsRemoved.length)console.log(` ${j(`removed ~/.agents/skills: ${u.skillsRemoved.join(", ")}`)}`);if(u.hooksRemoved)console.log(` ${j(`removed ${u.hooksRemoved} hook${u.hooksRemoved===1?"":"s"} from ~/.codex/hooks.json`)}`);if(u.agentsMdBlockRemoved)console.log(` ${j("stripped Beacon block from ~/.codex/AGENTS.md")}`);if(u.mcpRemoved)console.log(` ${j("stripped [mcp_servers.beacon] from ~/.codex/config.toml")}`);if(u.mcpSkipped)console.log(` ${MZ("left [mcp_servers.beacon] in ~/.codex/config.toml \u2014 it wasn't written by Beacon (remove with: codex mcp remove beacon)")}`);for(let Q of y){if(!XQ(Q.path))continue;let Z=xQ(Q.path),$=[];if(Z.skillsRemoved.length)$.push(`skills(${Z.skillsRemoved.length})`);if(Z.mcpUnregistered)$.push(".mcp.json");if(Z.agentsBlockRemoved)$.push("AGENTS.md");if(Z.claudeImportRemoved)$.push("CLAUDE.md");if($.length)console.log(` ${j(`${Q.path} \u2192 ${$.join(", ")}`)}`)}var E0=R0(K,"server.json");try{let{pid:Q}=JSON.parse(g0(E0,"utf8"));if(Q)try{process.kill(Q),console.log(` ${j(`stopped daemon (pid ${Q})`)}`)}catch{}}catch{}if(XQ(K))F0(K,{recursive:!0,force:!0}),console.log(` ${j(`removed ${K}`)}`);console.log(C("Done."));console.log(` ${MZ("The `beacon` binary on your PATH is still there \u2014 run the matching uninstall step from your installer to remove it.")}
255
+ ${iQ}
256
+ `});var XZ={};PQ(XZ,{provisionDb:()=>v0});import{createClient as Y0}from"@libsql/client";import{drizzle as V0}from"drizzle-orm/libsql";import{migrate as z0}from"drizzle-orm/libsql/migrator";import{readMigrationFiles as q0}from"drizzle-orm/migrator";import{dirname as DQ,join as X0}from"path";import{fileURLToPath as U0}from"url";async function VQ(Q,Z){return(await Q.execute({sql:"SELECT 1 FROM sqlite_master WHERE type='table' AND name = ?",args:[Z]})).rows.length>0}async function j0(Q,Z){let $=await Q.execute(`PRAGMA table_info("${Z}")`);return new Set($.rows.map((J)=>String(J.name)))}async function qZ(Q){if(!await VQ(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 B0(Q){for(let[Z,$]of Object.entries(P0)){if(!await VQ(Q,Z))continue;let J=await j0(Q,Z);for(let Y of $){if(!J.has(Y))continue;await Q.execute(`UPDATE "${Z}" SET "${Y}" = CAST((julianday("${Y}") - 2440587.5) * 86400000 AS INTEGER) WHERE typeof("${Y}") = 'text'`)}}}async function v0(Q,Z=H0){let $=Y0({url:Q});try{await $.execute("PRAGMA journal_mode = WAL;"),await $.execute("PRAGMA foreign_keys = ON;"),await $.execute("PRAGMA busy_timeout = 5000;");let J=await VQ($,"__drizzle_migrations"),Y=await VQ($,"Node"),V=!1;if(Y&&!J){let U=q0({migrationsFolder:Z})[0];if(U)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:[U.hash,U.folderMillis]}),V=!0}let X=await qZ($);if(await z0(V0($),{migrationsFolder:Z}),await qZ($)>X)V=!0;return await B0($),{migrated:V}}finally{$.close()}}var W0,H0,P0;var UZ=C(async()=>{W0=DQ(DQ(DQ(U0(import.meta.url)))),H0=process.env.BEACON_MIGRATIONS_DIR||X0(W0,"drizzle"),P0={Node:["createdAt","updatedAt"],Note:["createdAt","updatedAt"],DbTable:["createdAt","updatedAt"],Endpoint:["createdAt","updatedAt"],DraftTable:["createdAt"],SyncState:["codeGraphSyncedAt","updatedAt"],AppSetting:["updatedAt"],ProjectMeta:["updatedAt"],CodeFile:["updatedAt"]}});KQ();import{existsSync as tZ}from"fs";import{homedir as dZ}from"os";import{join as JQ}from"path";function aZ(){return process.env.HOME||process.env.USERPROFILE||dZ()}var YQ=()=>JQ(aZ(),".claude"),gQ=()=>JQ(YQ(),"skills"),IQ=()=>JQ(YQ(),"settings.json"),EQ=()=>JQ(YQ(),"CLAUDE.md"),bQ="<!-- beacon:global:start -->",$Z="<!-- beacon:global:end -->";var sZ=l,D=[{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 rZ(Q,Z){return r(gQ(),Q,Z)}function JZ(Q){return g(gQ(),Q)}function oZ(Q){return o(gQ(),Q)}function iZ(Q){return n(IQ(),Q)}function eZ(Q){return t(IQ(),Q)}function Q0(Q){return d(IQ(),Q)}function Z0(Q){a(EQ(),bQ,$Z,Q)}function YZ(){return R(EQ(),bQ)}function $0(){return s(EQ(),bQ,$Z)}function VZ(){let Q={};for(let $ of P)Q[$]=JZ($);let Z={};for(let $ of D)Z[$.event]=eZ({event:$.event,command:$.command});return{homeExists:tZ(YQ()),skills:Q,hooks:Z,claudeMdBlock:YZ()}}async function J0(){let{INIT_SKILL:Q,REFRESH_SKILL:Z,PLAN_SKILL:$}=await Promise.resolve().then(() => (h(),NQ)),J={"beacon-init":Q,"beacon-refresh":Z,"beacon-plan":$},Y=[];for(let U of P){if(!JZ(U))Y.push(U);rZ(U,J[U])}let V=0;for(let U of D)if(iZ({event:U.event,matcher:U.matcher,command:U.command}))V++;let X=YZ();return Z0(sZ),{skillsAdded:Y,hooksAdded:V,claudeMdBlockTouched:!X}}async function J1(){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(() => (RQ(),ZZ));if(Z.codexDetected())Q.codex={ok:!0,...await Z.setupCodexAssets()}}catch(Z){Q.codex={ok:!1,error:Z instanceof Error?Z.message:String(Z),skillsAdded:[],hooksAdded:0,agentsMdBlockTouched:!1,mcp:{added:!1}}}return Q}function zZ(){let Q=[];for(let J of P)if(oZ(J))Q.push(J);let Z=0;for(let J of D)if(Q0(J))Z++;let $=$0();return{skillsRemoved:Q,hooksRemoved:Z,claudeMdBlockRemoved:$}}import{AsyncLocalStorage as x0}from"async_hooks";import{spawnSync as N0}from"child_process";import{createHash as G0}from"crypto";import{existsSync as HZ,mkdirSync as A,readFileSync as OQ,writeFileSync as yQ}from"fs";import{homedir as PZ}from"os";import{basename as u0,join as N,parse as K0,resolve as WZ}from"path";function x(){return process.env.BEACON_HOME||N(PZ(),".beacon")}function LQ(){return N(x(),"workspaces.json")}function zQ(Q){return G0("sha256").update(Q).digest("hex").slice(0,12)}function N1(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 jZ(Q){let Z=WZ(Q);return Z!==WZ(PZ())&&Z!==K0(Z).root}function BZ(){return N(x(),"deleted.json")}function _Q(){try{let Q=JSON.parse(OQ(BZ(),"utf8"));return Array.isArray(Q)?Q:[]}catch{return[]}}function vZ(Q){A(x(),{recursive:!0}),yQ(BZ(),JSON.stringify(Q,null,2))}function xZ(Q){return _Q().includes(Q)}function G1(Q){let Z=_Q();if(!Z.includes(Q))vZ([...Z,Q])}function f0(Q){let Z=_Q();if(Z.includes(Q))vZ(Z.filter(($)=>$!==Q))}function qQ(Q){return N(x(),Q)}function C0(Q){return`file:${N(qQ(Q),"db.sqlite")}`}function O(){try{let Q=JSON.parse(OQ(LQ(),"utf8"));return Array.isArray(Q)?Q:[]}catch{return[]}}function kQ(Q){A(x(),{recursive:!0}),yQ(LQ(),JSON.stringify(Q,null,2))}function XQ(){return O().sort((Q,Z)=>Z.lastOpenedAt.localeCompare(Q.lastOpenedAt))}function u(Q){return O().find((Z)=>Z.id===Q)??null}function NZ(Q,Z,$=new Date().toISOString()){if(!jZ(Q))throw Error(`beacon: refusing to register a non-repo path as a workspace: ${Q}`);let J=zQ(Q);if(xZ(J))throw Error(`beacon: workspace ${J} (${Q}) was deleted \u2014 run \`beacon\` or /beacon-init to re-add it`);let Y=O(),V=Y.find((z)=>z.id===J),X={id:J,path:Q,name:Z||V?.name||u0(Q),lastOpenedAt:$},U=[X,...Y.filter((z)=>z.id!==J)];return A(qQ(J),{recursive:!0}),kQ(U),X}function u1(Q,Z){return f0(zQ(Q)),NZ(Q,Z)}function K1(Q,Z=new Date().toISOString()){let $=O(),J=$.find((Y)=>Y.id===Q);if(!J)return;J.lastOpenedAt=Z,kQ($)}function f1(Q){if(kQ(O().filter((Z)=>Z.id!==Q)),SQ()===Q)M0(XQ()[0]?.id??null)}function GZ(){return N(x(),"active")}function SQ(){try{return OQ(GZ(),"utf8").trim()||null}catch{return null}}function M0(Q){A(x(),{recursive:!0}),yQ(GZ(),Q??"")}function C1(){let Q=SQ();return Q?u(Q):null}function M1(){let Q=F0()??SQ();return Q?u(Q):null}function T1(Q){return u(Q)?.path??null}function w1(){return HZ(LQ())}var uZ="beacon_ws";function KZ(Q,Z){let $=Q.headers.get("cookie");if(!$)return null;for(let J of $.split(";")){let Y=J.indexOf("=");if(Y===-1)continue;if(J.slice(0,Y).trim()===Z)return decodeURIComponent(J.slice(Y+1).trim())}return null}function F1(Q){let Z=Q.headers.get("x-beacon-workspace");if(Z&&u(Z))return Z;let $=KZ(Q,uZ);if($&&u($))return $;return T0()}function T0(){let Q=XQ();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&&u(Z))return Z;let $=Q.headers.get(w0);if($&&jZ($)&&!xZ(zQ($))&&(!Z||zQ($)===Z)){let Y=NZ($);return await R0(Y.id),Y.id}let J=KZ(Q,uZ);if(J&&u(J))return J;return null}var fZ=new x0;function g1(Q,Z){return Q?fZ.run(Q,Z):Z()}function F0(){return fZ.getStore()??null}var AQ=new Set;function I1(Q){AQ.delete(N(qQ(Q),"db.sqlite"))}async function R0(Q){let Z=qQ(Q),$=N(Z,"db.sqlite"),J=HZ($);if(J&&AQ.has($))return{ok:!0,created:!1,migrated:!1};try{A(Z,{recursive:!0});let{provisionDb:Y}=await UZ().then(() => XZ),V=await Y(C0(Q));return AQ.add($),{ok:!0,created:!J,migrated:J&&V.migrated}}catch(Y){return{ok:!1,created:!1,migrated:!1,error:Y instanceof Error?Y.message:String(Y)}}}h();RQ();import{existsSync as UQ,readFileSync as g0,rmSync as I0}from"fs";import{join as E0}from"path";var CZ=process.argv.slice(3),MZ=CZ.includes("--yes")||CZ.includes("-y"),B=(Q)=>`\x1B[32m\u2713\x1B[0m ${Q}`,j=(Q)=>`\x1B[2m${Q}\x1B[0m`,f=(Q)=>`
257
+ \x1B[1m${Q}\x1B[0m`,TZ=(Q)=>`\x1B[33m!\x1B[0m ${Q}`,K=x(),y=XQ(),hQ=VZ();console.log(f(MZ?"Beacon \xB7 uninstall":"Beacon \xB7 uninstall (dry run)"));console.log(f("Global"));console.log(` ${UQ(K)?`wipe ${K} (${y.length} workspaces)`:`${j(`${K} \u2014 already gone`)}`}`);for(let Q of P)console.log(` ${hQ.skills[Q]?`remove ~/.claude/skills/${Q}/`:j(`skill ${Q} \u2014 already gone`)}`);for(let Q of D)console.log(` ${hQ.hooks[Q.event]?`remove hook ${Q.event} \u2192 ${Q.command}`:j(`hook ${Q.event} \u2192 ${Q.command} \u2014 already gone`)}`);console.log(` ${hQ.claudeMdBlock?"strip Beacon block from ~/.claude/CLAUDE.md":j("global CLAUDE.md block \u2014 already gone")}`);var WQ=wQ();console.log(f("Codex"));for(let Q of P)console.log(` ${WQ.skills[Q]?`remove ~/.agents/skills/${Q}/`:j(`skill ${Q} \u2014 already gone`)}`);for(let Q of w)console.log(` ${WQ.hooks[Q.event]?`remove hook ${Q.event} \u2192 ${Q.command} from ~/.codex/hooks.json`:j(`hook ${Q.event} \u2192 ${Q.command} \u2014 already gone`)}`);console.log(` ${WQ.agentsMdBlock?"strip Beacon block from ~/.codex/AGENTS.md":j("global ~/.codex/AGENTS.md block \u2014 already gone")}`);console.log(` ${WQ.mcp?"strip [mcp_servers.beacon] from ~/.codex/config.toml (if Beacon wrote it)":j("config.toml beacon entry \u2014 already gone")}`);if(y.length){console.log(f(`Per-repo (${y.length})`));for(let Q of y){if(!UQ(Q.path)){console.log(` ${j(`${Q.path} \u2014 repo no longer on disk, skipping`)}`);continue}console.log(` ${Q.path}`),console.log(` ${j("strip beacon entry from .mcp.json, workflow block from AGENTS.md, skills, CLAUDE.md @-import")}`)}}if(!MZ)console.log(f("Nothing was changed.")),console.log(" Run \x1B[1mbeacon uninstall --yes\x1B[0m to apply."),console.log(` The \x1B[1mbeacon\x1B[0m binary itself (the cloned source + your PATH symlink) is NOT removed by this \u2014 your install script handles that.
258
+ `),process.exit(0);console.log(f("Applying\u2026"));var F=zZ();if(F.skillsRemoved.length)console.log(` ${B(`removed skills: ${F.skillsRemoved.join(", ")}`)}`);if(F.hooksRemoved)console.log(` ${B(`removed ${F.hooksRemoved} hook${F.hooksRemoved===1?"":"s"} from ~/.claude/settings.json`)}`);if(F.claudeMdBlockRemoved)console.log(` ${B("stripped Beacon block from ~/.claude/CLAUDE.md")}`);var G=FQ();if(G.skillsRemoved.length)console.log(` ${B(`removed ~/.agents/skills: ${G.skillsRemoved.join(", ")}`)}`);if(G.hooksRemoved)console.log(` ${B(`removed ${G.hooksRemoved} hook${G.hooksRemoved===1?"":"s"} from ~/.codex/hooks.json`)}`);if(G.agentsMdBlockRemoved)console.log(` ${B("stripped Beacon block from ~/.codex/AGENTS.md")}`);if(G.mcpRemoved)console.log(` ${B("stripped [mcp_servers.beacon] from ~/.codex/config.toml")}`);if(G.mcpSkipped)console.log(` ${TZ("left [mcp_servers.beacon] in ~/.codex/config.toml \u2014 it wasn't written by Beacon (remove with: codex mcp remove beacon)")}`);for(let Q of y){if(!UQ(Q.path))continue;let Z=xQ(Q.path),$=[];if(Z.skillsRemoved.length)$.push(`skills(${Z.skillsRemoved.length})`);if(Z.mcpUnregistered)$.push(".mcp.json");if(Z.agentsBlockRemoved)$.push("AGENTS.md");if(Z.claudeImportRemoved)$.push("CLAUDE.md");if($.length)console.log(` ${B(`${Q.path} \u2192 ${$.join(", ")}`)}`)}var b0=E0(K,"server.json");try{let{pid:Q}=JSON.parse(g0(b0,"utf8"));if(Q)try{process.kill(Q),console.log(` ${B(`stopped daemon (pid ${Q})`)}`)}catch{}}catch{}if(UQ(K))I0(K,{recursive:!0,force:!0}),console.log(` ${B(`removed ${K}`)}`);console.log(f("Done."));console.log(` ${TZ("The `beacon` binary on your PATH is still there \u2014 run the matching uninstall step from your installer to remove it.")}
258
259
  `);