scip-query 0.16.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.md +40 -9
  3. package/dist/augment-vue-worker.js +1 -1
  4. package/dist/{chunk-WN6XEYVX.js → chunk-27YDE22N.js} +2 -2
  5. package/dist/{chunk-VLSI5MYU.js → chunk-2DBY4MO7.js} +2 -2
  6. package/dist/{chunk-YSUD2S7T.js → chunk-2HCWAL42.js} +2 -2
  7. package/dist/{chunk-YCVYOV4A.js → chunk-34RCSYMZ.js} +2 -2
  8. package/dist/{chunk-3LAKH6BV.js → chunk-3CJXFMR5.js} +2 -2
  9. package/dist/{chunk-2EU6WVR3.js → chunk-3EBDPBBU.js} +2 -2
  10. package/dist/{chunk-6EVORGCB.js → chunk-42YU6TEB.js} +2 -2
  11. package/dist/{chunk-3YAZH3JU.js → chunk-45QWQSWS.js} +2 -2
  12. package/dist/{chunk-5XDNFOAH.js → chunk-4FLF7BHJ.js} +2 -2
  13. package/dist/{chunk-JRFCWCOD.js → chunk-4L4X66GE.js} +2 -2
  14. package/dist/{chunk-NLRWGGPY.js → chunk-5CJ6AQN7.js} +2 -2
  15. package/dist/{chunk-CM4EZLW4.js → chunk-5GAUXLOE.js} +2 -2
  16. package/dist/{chunk-QB7NRST4.js → chunk-5N5ZC566.js} +2 -2
  17. package/dist/{chunk-P5QZILZ4.js → chunk-5ODF4JGH.js} +2 -2
  18. package/dist/{chunk-OYGKBDAD.js → chunk-6G3GQWTK.js} +2 -2
  19. package/dist/{chunk-IRIM3SUR.js → chunk-75H6GOND.js} +2 -2
  20. package/dist/{chunk-VSQRU3AP.js → chunk-7CHIAMKS.js} +2 -2
  21. package/dist/{chunk-L27UIF3E.js → chunk-7MT6UM4D.js} +2 -2
  22. package/dist/{chunk-OO6S4ECV.js → chunk-7XP7ZRSI.js} +2 -2
  23. package/dist/{chunk-5TVNLPUM.js → chunk-7Z5UT44B.js} +2 -2
  24. package/dist/{chunk-A46JTKTM.js → chunk-A4KRWTXD.js} +2 -2
  25. package/dist/{chunk-BFWVHD2P.js → chunk-ABRWGVC6.js} +2 -2
  26. package/dist/{chunk-7II7NFRV.js → chunk-AQ34B63A.js} +2 -2
  27. package/dist/{chunk-EVCSXWER.js → chunk-BBBZB5WY.js} +2 -2
  28. package/dist/{chunk-MZB3DTHW.js → chunk-BGUYAA3Q.js} +2 -2
  29. package/dist/{chunk-ZHGUZKJL.js → chunk-CMLHZWRS.js} +2 -2
  30. package/dist/{chunk-3I34FZ6R.js → chunk-CYDOV3AQ.js} +2 -2
  31. package/dist/{chunk-GWWYLYD3.js → chunk-DQYG5JHT.js} +2 -2
  32. package/dist/{chunk-W3ZVRLCH.js → chunk-EPDV3SQD.js} +2 -2
  33. package/dist/{chunk-U6BJVXWQ.js → chunk-GRHA5NGF.js} +2 -2
  34. package/dist/{chunk-YD37KSEK.js → chunk-H4SMB657.js} +2 -2
  35. package/dist/{chunk-XBPAJASV.js → chunk-H4T2AST4.js} +2 -2
  36. package/dist/{chunk-SOCS3467.js → chunk-HGO3D2JD.js} +2 -2
  37. package/dist/{chunk-RLB7FZKR.js → chunk-HV4N3UBV.js} +2 -2
  38. package/dist/{chunk-VZCR3VQY.js → chunk-IK2NG76R.js} +2 -2
  39. package/dist/{chunk-CS3FXTUC.js → chunk-J4HK7PQS.js} +2 -2
  40. package/dist/{chunk-QSNG3NHQ.js → chunk-J7WYG63U.js} +2 -2
  41. package/dist/{chunk-7RAS466A.js → chunk-JJAH2VLD.js} +2 -2
  42. package/dist/{chunk-NLVKD45E.js → chunk-JLZUM476.js} +2 -2
  43. package/dist/{chunk-JQ2PCFZW.js → chunk-JUADXGUH.js} +2 -2
  44. package/dist/{chunk-DKK2H4D7.js → chunk-JVTMRIKU.js} +2 -2
  45. package/dist/{chunk-YFEJIYWH.js → chunk-JYBF5CPE.js} +2 -2
  46. package/dist/{chunk-S5RZQA6V.js → chunk-K3UVTL3J.js} +2 -2
  47. package/dist/{chunk-363TZ64I.js → chunk-KAOWSWEX.js} +2 -2
  48. package/dist/{chunk-RPMT6MTX.js → chunk-KLFCCRI7.js} +2 -2
  49. package/dist/{chunk-6GZ7LM7S.js → chunk-KO2TFDIP.js} +2 -2
  50. package/dist/{chunk-S5MTSES5.js → chunk-KTZACYL6.js} +2 -2
  51. package/dist/{chunk-6DNE65QS.js → chunk-KYUYAWKA.js} +2 -2
  52. package/dist/{chunk-PCCMMI2M.js → chunk-KZ2LZBQT.js} +2 -2
  53. package/dist/chunk-L7UITWFE.js +120 -0
  54. package/dist/{chunk-CVBS2FD4.js → chunk-LC57FSPX.js} +2 -2
  55. package/dist/{chunk-S3IXCXW2.js → chunk-LG33DNTZ.js} +2 -2
  56. package/dist/chunk-M2TRDR25.js +84 -0
  57. package/dist/{chunk-2Y7YX54K.js → chunk-MVFNACWB.js} +2 -2
  58. package/dist/{chunk-Q65QYKU7.js → chunk-NJBARXRO.js} +2 -2
  59. package/dist/{chunk-5UKDCXVC.js → chunk-OP5JXGDV.js} +2 -2
  60. package/dist/{chunk-SEEJPIWG.js → chunk-OP5RO2CF.js} +2 -2
  61. package/dist/{chunk-EBSSCVR4.js → chunk-OQRMCT2N.js} +5 -5
  62. package/dist/{chunk-CKIAEVGM.js → chunk-PA2MQKXD.js} +2 -2
  63. package/dist/{chunk-XC6PUFNN.js → chunk-PVXSHZLW.js} +2 -2
  64. package/dist/{chunk-AAMZRDJT.js → chunk-PYOZHG6A.js} +2 -2
  65. package/dist/{chunk-G4KQ7S74.js → chunk-QEIGJJBC.js} +2 -2
  66. package/dist/{chunk-DA34GNNO.js → chunk-QNCVN5EH.js} +2 -2
  67. package/dist/chunk-RSZ4KX4B.js +7 -0
  68. package/dist/{chunk-HGUNWXJX.js → chunk-RUQE7DZT.js} +2 -2
  69. package/dist/{chunk-VYQY75NA.js → chunk-RZEVUYMG.js} +2 -2
  70. package/dist/chunk-SMBIGBGN.js +67 -0
  71. package/dist/{chunk-AMPN2VMF.js → chunk-SREWDA7Q.js} +2 -2
  72. package/dist/{chunk-S2FZILCF.js → chunk-TAB7AWKO.js} +2 -2
  73. package/dist/{chunk-UO4IADXJ.js → chunk-TCOWAGR2.js} +2 -2
  74. package/dist/{chunk-BVHP2B4D.js → chunk-TL2IXVGH.js} +2 -2
  75. package/dist/{chunk-MCNWCJYL.js → chunk-TLTLJ4SW.js} +2 -2
  76. package/dist/{chunk-JXAJDINF.js → chunk-TR7C5HOC.js} +2 -2
  77. package/dist/{chunk-3OPIMH42.js → chunk-U244OVE6.js} +2 -2
  78. package/dist/chunk-U3JW5AYG.js +2 -0
  79. package/dist/{chunk-2HFXPIBT.js → chunk-UWR52GNZ.js} +2 -2
  80. package/dist/{chunk-62Y3PC27.js → chunk-VCOAUTSI.js} +2 -2
  81. package/dist/{chunk-BVUA3GZC.js → chunk-VCRMI56V.js} +2 -2
  82. package/dist/{chunk-753JWTUH.js → chunk-VDHEX6YO.js} +2 -2
  83. package/dist/{chunk-RYFIRFYJ.js → chunk-VPVAQRHM.js} +2 -2
  84. package/dist/{chunk-RQWNF2RM.js → chunk-VT2KFEPG.js} +2 -2
  85. package/dist/{chunk-LT6AHYVY.js → chunk-WH65EY7U.js} +2 -2
  86. package/dist/{chunk-HLRWOFXC.js → chunk-X566NT42.js} +2 -2
  87. package/dist/{chunk-ZEKBAMCN.js → chunk-XKWEMFHP.js} +2 -2
  88. package/dist/{chunk-KI4WPR7Q.js → chunk-Y3DG4J6A.js} +2 -2
  89. package/dist/{chunk-KP2DJY7D.js → chunk-Y5BOEWAE.js} +2 -2
  90. package/dist/{chunk-2LGPMYS2.js → chunk-YD7GGLGE.js} +2 -2
  91. package/dist/{chunk-K32ZOW3P.js → chunk-ZMD4O5UP.js} +2 -2
  92. package/dist/cli.js +321 -303
  93. package/dist/{config-types-SVkUIufk.d.ts → config-types-70s7NxKB.d.ts} +2 -0
  94. package/dist/{db-CS0TuVH6.d.ts → db-BBmJ0v3b.d.ts} +1 -1
  95. package/dist/{health-Btal3mQi.d.ts → health-CWpFL_6z.d.ts} +1 -1
  96. package/dist/index.d.ts +3 -3
  97. package/dist/index.js +1 -1
  98. package/dist/queries/affected.d.ts +2 -2
  99. package/dist/queries/affected.js +1 -1
  100. package/dist/queries/bottlenecks.d.ts +2 -2
  101. package/dist/queries/bottlenecks.js +1 -1
  102. package/dist/queries/by-kind.d.ts +2 -2
  103. package/dist/queries/by-kind.js +1 -1
  104. package/dist/queries/call-graph.d.ts +2 -2
  105. package/dist/queries/call-graph.js +1 -1
  106. package/dist/queries/change-surface.d.ts +2 -2
  107. package/dist/queries/change-surface.js +1 -1
  108. package/dist/queries/cleanup-plan.d.ts +2 -2
  109. package/dist/queries/cleanup-plan.js +1 -1
  110. package/dist/queries/co-change.d.ts +2 -2
  111. package/dist/queries/co-change.js +1 -1
  112. package/dist/queries/code.d.ts +2 -2
  113. package/dist/queries/code.js +1 -1
  114. package/dist/queries/complexity-hotspots.d.ts +2 -2
  115. package/dist/queries/complexity-hotspots.js +1 -1
  116. package/dist/queries/complexity.d.ts +2 -2
  117. package/dist/queries/complexity.js +1 -1
  118. package/dist/queries/convergence.d.ts +2 -2
  119. package/dist/queries/convergence.js +1 -1
  120. package/dist/queries/coupling.d.ts +2 -2
  121. package/dist/queries/coupling.js +1 -1
  122. package/dist/queries/cycles.d.ts +2 -2
  123. package/dist/queries/cycles.js +1 -1
  124. package/dist/queries/dataflow.d.ts +2 -2
  125. package/dist/queries/dataflow.js +1 -1
  126. package/dist/queries/dead.d.ts +2 -2
  127. package/dist/queries/dead.js +1 -1
  128. package/dist/queries/decorative-checkers.d.ts +2 -2
  129. package/dist/queries/decorative-checkers.js +1 -1
  130. package/dist/queries/deep-chains.d.ts +2 -2
  131. package/dist/queries/deep-chains.js +1 -1
  132. package/dist/queries/deps.d.ts +2 -2
  133. package/dist/queries/deps.js +1 -1
  134. package/dist/queries/diff-gate.d.ts +2 -2
  135. package/dist/queries/diff-gate.js +1 -1
  136. package/dist/queries/diff-impact.d.ts +2 -2
  137. package/dist/queries/diff-impact.js +1 -1
  138. package/dist/queries/doc-drift.d.ts +2 -2
  139. package/dist/queries/doc-drift.js +1 -1
  140. package/dist/queries/drift.d.ts +2 -2
  141. package/dist/queries/drift.js +1 -1
  142. package/dist/queries/duplicate-bodies.d.ts +2 -2
  143. package/dist/queries/duplicate-bodies.js +1 -1
  144. package/dist/queries/extract-candidates.d.ts +2 -2
  145. package/dist/queries/extract-candidates.js +1 -1
  146. package/dist/queries/fan.d.ts +2 -2
  147. package/dist/queries/fan.js +1 -1
  148. package/dist/queries/files.d.ts +2 -2
  149. package/dist/queries/health.d.ts +3 -3
  150. package/dist/queries/health.js +1 -1
  151. package/dist/queries/hierarchy.d.ts +2 -2
  152. package/dist/queries/hierarchy.js +1 -1
  153. package/dist/queries/hotspots.d.ts +2 -2
  154. package/dist/queries/hotspots.js +1 -1
  155. package/dist/queries/imports.d.ts +2 -2
  156. package/dist/queries/imports.js +1 -1
  157. package/dist/queries/incomplete-migration.d.ts +2 -2
  158. package/dist/queries/incomplete-migration.js +1 -1
  159. package/dist/queries/index.d.ts +3 -3
  160. package/dist/queries/index.js +1 -1
  161. package/dist/queries/isolated.d.ts +2 -2
  162. package/dist/queries/isolated.js +1 -1
  163. package/dist/queries/locality-candidates.d.ts +2 -2
  164. package/dist/queries/locality-candidates.js +1 -1
  165. package/dist/queries/members.d.ts +2 -2
  166. package/dist/queries/members.js +1 -1
  167. package/dist/queries/methods.d.ts +2 -2
  168. package/dist/queries/methods.js +1 -1
  169. package/dist/queries/not-implemented.d.ts +2 -2
  170. package/dist/queries/not-implemented.js +1 -1
  171. package/dist/queries/outline.d.ts +2 -2
  172. package/dist/queries/outline.js +1 -1
  173. package/dist/queries/passthrough-candidates.d.ts +2 -2
  174. package/dist/queries/passthrough-candidates.js +1 -1
  175. package/dist/queries/plan-context.d.ts +2 -2
  176. package/dist/queries/plan-context.js +1 -1
  177. package/dist/queries/react-component-duplicates.d.ts +2 -2
  178. package/dist/queries/react-component-duplicates.js +1 -1
  179. package/dist/queries/react-hook-candidates.d.ts +2 -2
  180. package/dist/queries/react-hook-candidates.js +1 -1
  181. package/dist/queries/react-large-component-pressure.d.ts +2 -2
  182. package/dist/queries/react-large-component-pressure.js +1 -1
  183. package/dist/queries/recent-duplicates.d.ts +2 -2
  184. package/dist/queries/recent-duplicates.js +1 -1
  185. package/dist/queries/redundant-reexports.d.ts +2 -2
  186. package/dist/queries/redundant-reexports.js +1 -1
  187. package/dist/queries/refs.d.ts +2 -2
  188. package/dist/queries/refs.js +1 -1
  189. package/dist/queries/self-audit.d.ts +2 -2
  190. package/dist/queries/self-audit.js +1 -1
  191. package/dist/queries/similar-chains.d.ts +2 -2
  192. package/dist/queries/similar-chains.js +1 -1
  193. package/dist/queries/similar-files.d.ts +2 -2
  194. package/dist/queries/similar-files.js +1 -1
  195. package/dist/queries/similar-signatures.d.ts +2 -2
  196. package/dist/queries/similar-signatures.js +1 -1
  197. package/dist/queries/similar.d.ts +2 -2
  198. package/dist/queries/similar.js +1 -1
  199. package/dist/queries/slice.d.ts +2 -2
  200. package/dist/queries/slice.js +1 -1
  201. package/dist/queries/stale-abstractions.d.ts +2 -2
  202. package/dist/queries/stale-abstractions.js +1 -1
  203. package/dist/queries/stats.d.ts +2 -2
  204. package/dist/queries/surface.d.ts +2 -2
  205. package/dist/queries/surface.js +1 -1
  206. package/dist/queries/symbols.d.ts +2 -2
  207. package/dist/queries/symbols.js +1 -1
  208. package/dist/queries/system.d.ts +2 -2
  209. package/dist/queries/system.js +1 -1
  210. package/dist/queries/test-quality.d.ts +2 -2
  211. package/dist/queries/test-quality.js +1 -1
  212. package/dist/queries/trace.d.ts +2 -2
  213. package/dist/queries/trace.js +1 -1
  214. package/dist/queries/twin-ab.d.ts +2 -2
  215. package/dist/queries/twin-ab.js +1 -1
  216. package/dist/queries/twin-drift.d.ts +2 -2
  217. package/dist/queries/twin-drift.js +1 -1
  218. package/dist/queries/unused-imports.d.ts +2 -2
  219. package/dist/queries/unused-imports.js +1 -1
  220. package/dist/queries/unused-params.d.ts +2 -2
  221. package/dist/queries/unused-params.js +1 -1
  222. package/dist/queries/vue-component-duplicates.d.ts +2 -2
  223. package/dist/queries/vue-component-duplicates.js +1 -1
  224. package/dist/queries/vue-composable-candidates.d.ts +2 -2
  225. package/dist/queries/vue-composable-candidates.js +1 -1
  226. package/dist/queries/vue-large-view-pressure.d.ts +2 -2
  227. package/dist/queries/vue-large-view-pressure.js +1 -1
  228. package/dist/queries/wrapper-candidates.d.ts +2 -2
  229. package/dist/queries/wrapper-candidates.js +1 -1
  230. package/dist/reindex-worker.js +26 -26
  231. package/dist/reindex.d.ts +3 -3
  232. package/dist/reindex.js +38 -34
  233. package/dist/runtime.d.ts +3 -3
  234. package/dist/runtime.js +1 -2
  235. package/dist/{scip-cli-BKL-26TZ.d.ts → scip-cli-CoMzb7Zu.d.ts} +1 -1
  236. package/dist/watch-server.js +4 -4
  237. package/docs/COMMAND_REFERENCE.md +1 -1
  238. package/package.json +1 -1
  239. package/skills/_shared/SKILL.md +2 -2
  240. package/skills/scip-calibrate/SKILL.md +5 -4
  241. package/skills/scip-verify/SKILL.md +3 -2
  242. package/dist/chunk-5P26M63Y.js +0 -2
  243. package/dist/chunk-FFIYGYQR.js +0 -67
  244. package/dist/chunk-WFRZGMWJ.js +0 -71
  245. package/dist/chunk-XAEU4ROB.js +0 -101
  246. package/dist/chunk-Y42DMR6F.js +0 -6
package/dist/runtime.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { P as ProjectConfig, a as SupportedLanguage } from './config-types-SVkUIufk.js';
2
- import { W as WatcherStatus, R as RefreshTrigger } from './scip-cli-BKL-26TZ.js';
3
- export { g as getScipVersion, i as isScipInstalled, p as printScipInstallInstructions } from './scip-cli-BKL-26TZ.js';
1
+ import { P as ProjectConfig, a as SupportedLanguage } from './config-types-70s7NxKB.js';
2
+ import { W as WatcherStatus, R as RefreshTrigger } from './scip-cli-CoMzb7Zu.js';
3
+ export { g as getScipVersion, i as isScipInstalled, p as printScipInstallInstructions } from './scip-cli-CoMzb7Zu.js';
4
4
 
5
5
  /**
6
6
  * Load project config from .scipquery.json in the project root.
package/dist/runtime.js CHANGED
@@ -1,3 +1,2 @@
1
- import{b as D,c as N,d as G}from"./chunk-Y42DMR6F.js";import{a as R}from"./chunk-YZXV3CU3.js";import"./chunk-QVZSWLLZ.js";import{readFileSync as F,writeFileSync as W,existsSync as k,mkdirSync as U}from"fs";import{isAbsolute as fe,join as u,relative as me,resolve as P}from"path";import{createHash as L}from"crypto";import{homedir as q}from"os";var f=".scipquery.json",j=250,E=0,b=10*6e4,Y={enabled:!1,debounceMs:j,cooldownMs:E,gitPollMs:2e3,idleTimeoutMs:b,autoRefresh:!0,ignore:[]},K=["typescript","javascript","java","scala","kotlin","rust","python","ruby","go","cpp","c","csharp","vb","dart","php","clojure"];var Ce=new Set(K);function y(r){let e=u(r,f);if(!k(e))return{};try{let t=F(e,"utf-8");return JSON.parse(t)}catch(t){let i=t instanceof Error?t.message:String(t);throw t instanceof SyntaxError?new Error(`invalid ${f} at ${e}: ${i}`,{cause:t}):new Error(`unable to read ${f} at ${e}: ${i}`,{cause:t})}}function T(r){return{...Y,...r.watch}}function H(r,e){let t=process.env.SCIP_QUERY_CACHE_DIR;if(t)return m(t);if(e?.dbPath)return m(P(r,e.dbPath));let s=process.env.XDG_CACHE_HOME||u(q(),".cache"),o=L("sha256").update(P(r)).digest("hex").slice(0,12),n=u(s,"scip-query","projects",o);return m(n)}function S(r,e){let t=H(r,e);return{cacheDir:t,dbPath:u(t,"index.db"),indexPath:u(t,"index.scip"),metaPath:u(t,"meta.json")}}function X(r,e){let t=u(r,f);return k(t)||W(t,JSON.stringify({languages:e,watch:{enabled:!0,debounceMs:j,cooldownMs:E,gitPollMs:2e3,idleTimeoutMs:b,autoRefresh:!0}},null,2)+`
2
- `),t}function m(r){return U(r,{recursive:!0}),r}import{execFileSync as z,fork as J}from"child_process";import{statSync as B,watch as V}from"fs";import{join as Q,relative as Z}from"path";import ee from"ignore";var C=class{projectRoot;config;watchConfig;languages;pnpmWorkspaces;typescriptProjectMode;typescriptProjects;clojureConfigPath;indexerConcurrency;onStatus;onReindexComplete;onError;status={state:"idle"};debounceTimer=null;cooldownTimer=null;dirty=!1;changedFiles=0;pendingTrigger=null;reindexInFlight=!1;lastReindexEnd=0;fsWatchers=[];gitPollTimer=null;lastGitState=null;gitignoreFilter;extraIgnore;stopped=!1;constructor(e){this.projectRoot=e.projectRoot,this.config=e.config,this.watchConfig=T(e.config),this.languages=e.languages,this.pnpmWorkspaces=e.config.indexer?.typescript?.pnpmWorkspaces??!1,this.typescriptProjectMode=e.config.indexer?.typescript?.projectMode,this.typescriptProjects=e.config.indexer?.typescript?.projects,this.clojureConfigPath=e.config.indexer?.clojure?.configPath,this.indexerConcurrency=e.config.indexerConcurrency,this.onStatus=e.onStatus??(()=>{}),this.onReindexComplete=e.onReindexComplete??(()=>{}),this.onError=e.onError??(t=>console.error(t.message)),this.gitignoreFilter=R(e.projectRoot),this.extraIgnore=ee(),this.watchConfig.ignore.length>0&&this.extraIgnore.add(this.watchConfig.ignore)}start(){this.stopped=!1,this.setStatus({state:"idle"}),this.startGitStatePolling();try{let e=V(this.projectRoot,{recursive:!0},(t,i)=>{i&&!this.stopped&&this.handleFileChange(i)});this.fsWatchers.push(e)}catch{this.onError(new Error("Failed to start file watcher. On Linux, you may need to increase inotify limits: sysctl -w fs.inotify.max_user_watches=524288"))}}stop(){this.stopped=!0;for(let e of this.fsWatchers)e.close();this.fsWatchers=[],this.clearDebounceTimer(),this.clearCooldownTimer(),this.clearGitPollTimer(),this.setStatus({state:"idle"})}requestRefresh(e,t={}){if(!t.immediate||this.reindexInFlight||this.status.state==="cooldown"){this.scheduleReindex(e);return}this.pendingTrigger=I(this.pendingTrigger,e),this.changedFiles+=1,this.clearDebounceTimer(),this.triggerReindex()}handleFileChange(e){let t=Z(this.projectRoot,Q(this.projectRoot,e));t===".git"||t.startsWith(".git/")||this.gitignoreFilter.isIgnored(t)||this.extraIgnore.ignores(t)||e.endsWith("index.db")||e.endsWith("index.scip")||e.endsWith("index.db.tmp")||this.scheduleReindex({kind:"watch-source",detail:t})}scheduleReindex(e){if(this.pendingTrigger=I(this.pendingTrigger,e),this.changedFiles++,this.reindexInFlight){this.dirty=!0,this.setStatus({state:"indexing",startedAt:this.status.startedAt});return}if(this.status.state==="cooldown"){this.dirty=!0,this.setStatus({state:"cooldown",until:this.status.until,dirty:!0});return}this.clearDebounceTimer();let t=Date.now()+this.watchConfig.debounceMs;this.setStatus({state:"waiting",changedFiles:this.changedFiles,reindexAt:t}),this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.triggerReindex()},this.watchConfig.debounceMs)}triggerReindex(){if(this.reindexInFlight||this.stopped)return;let e=Date.now()-this.lastReindexEnd;if(this.lastReindexEnd>0&&e<this.watchConfig.cooldownMs){let s=this.watchConfig.cooldownMs-e;this.dirty=!0;let o=Date.now()+s;this.setStatus({state:"cooldown",until:o,dirty:!0}),this.cooldownTimer=setTimeout(()=>{this.cooldownTimer=null,this.dirty&&!this.stopped&&(this.dirty=!1,this.triggerReindex())},s);return}this.reindexInFlight=!0,this.dirty=!1,this.changedFiles=0;let t=this.pendingTrigger??{kind:"watch-source"};this.pendingTrigger=null;let i=Date.now();this.setStatus({state:"indexing",startedAt:i}),this.runReindex(t).then(s=>{if(this.reindexInFlight=!1,this.lastReindexEnd=Date.now(),this.onReindexComplete(s),this.dirty&&!this.stopped){let o=Date.now()+this.watchConfig.cooldownMs;this.setStatus({state:"cooldown",until:o,dirty:!0}),this.cooldownTimer=setTimeout(()=>{this.cooldownTimer=null,this.dirty&&!this.stopped?(this.dirty=!1,this.triggerReindex()):this.setStatus({state:"idle"})},this.watchConfig.cooldownMs)}else this.setStatus({state:"idle"})}).catch(s=>{this.reindexInFlight=!1,this.lastReindexEnd=Date.now(),this.onError(s instanceof Error?s:new Error(String(s))),this.setStatus({state:"idle"})})}runReindex(e){return new Promise((t,i)=>{let s=Date.now(),o=y(this.projectRoot),n=Object.keys(o).length>0?o:this.config,c=S(this.projectRoot,n),a=n.indexer?.typescript,l=n.indexer?.clojure,d=J(new URL("./reindex-worker.js",import.meta.url).pathname,[],{detached:!0,env:{...process.env,SCIP_REINDEX_PROJECT_ROOT:this.projectRoot,SCIP_REINDEX_OUTPUT_SCIP:c.indexPath,SCIP_REINDEX_OUTPUT_DB:c.dbPath,SCIP_REINDEX_LANGUAGES:(n.languages??this.languages)?.join(",")??"",SCIP_REINDEX_INDEXER_CONCURRENCY:String(n.indexerConcurrency??this.indexerConcurrency??""),SCIP_REINDEX_PNPM_WORKSPACES:a?.pnpmWorkspaces??this.pnpmWorkspaces?"1":"",SCIP_REINDEX_TYPESCRIPT_CONFIG:JSON.stringify({projectMode:a?.projectMode??this.typescriptProjectMode,projects:a?.projects??this.typescriptProjects??[]}),SCIP_REINDEX_CLOJURE_CONFIG_PATH:l?.configPath??this.clojureConfigPath??"",SCIP_REINDEX_TRIGGER_KIND:e.kind,SCIP_REINDEX_TRIGGER_DETAIL:e.detail??""},stdio:"pipe"});d.on("exit",p=>{p===0?t(Date.now()-s):i(new Error(`Reindex worker exited with code ${p}`))}),d.on("error",i)})}setStatus(e){this.status=e,this.onStatus(e)}clearDebounceTimer(){this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null)}clearCooldownTimer(){this.cooldownTimer&&(clearTimeout(this.cooldownTimer),this.cooldownTimer=null)}startGitStatePolling(){this.lastGitState=this.readGitState(),this.lastGitState&&(this.gitPollTimer=setInterval(()=>this.pollGitState(),this.watchConfig.gitPollMs),this.gitPollTimer.unref?.())}pollGitState(){let e=this.lastGitState,t=this.readGitState();if(!e||!t||this.stopped){this.lastGitState=t;return}this.lastGitState=t;let i=e.head!==t.head,s=e.indexPath!==t.indexPath||e.indexMtimeMs!==t.indexMtimeMs||e.indexSize!==t.indexSize;i&&s?this.scheduleReindex({kind:"watch-git-state",detail:"HEAD and index changed"}):i?this.scheduleReindex({kind:"watch-git-head",detail:"HEAD changed"}):s&&this.scheduleReindex({kind:"watch-git-index",detail:t.indexPath??"index changed"})}readGitState(){let e=_(this.projectRoot,["rev-parse","--git-path","index"]);if(!e)return null;let t={head:_(this.projectRoot,["rev-parse","--verify","HEAD"]),indexPath:e};try{let i=B(e);t.indexMtimeMs=i.mtimeMs,t.indexSize=i.size}catch{t.indexMtimeMs=void 0,t.indexSize=void 0}return t}clearGitPollTimer(){this.gitPollTimer&&(clearInterval(this.gitPollTimer),this.gitPollTimer=null)}};function _(r,e){try{return z("git",["-C",r,...e],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return}}function I(r,e){return r?r.kind===e.kind?r.detail===e.detail?r:{kind:r.kind,detail:"multiple changes"}:{kind:"watch-git-state",detail:`${r.kind}, ${e.kind}`}:e}import{existsSync as v,mkdirSync as te,symlinkSync as re,readlinkSync as M,unlinkSync as A,readdirSync as ie}from"fs";import{join as h,dirname as w,resolve as g,relative as se,isAbsolute as ne}from"path";import{homedir as x,platform as oe}from"os";import{fileURLToPath as ae}from"url";var le=oe()==="win32",$=["_shared","scip-query","scip-setup","scip-calibrate","scip-cleanup-audit","scip-cleanup-improve","scip-integrity-audit","scip-twin-drift","scip-claim-audit","scip-probe-reachability","scip-hyper-optimization","scip-api-impact","scip-concrete-plan","scip-conductor","scip-debug","scip-explore","scip-triage-issue","scip-diagram","scip-doc-reconcile","scip-directory-architecture","scip-maintainability","scip-react-maintainability","scip-vue-maintainability","scip-verify","scip-language-playbook","scip-tla-model-system"];function ce(r={}){let e=r.quiet?()=>{}:console.log,t=ae(import.meta.url),i=g(w(t),"..","skills"),s=[h(x(),".claude","skills"),h(x(),".codex","skills"),h(x(),".agents","skills")],o={installed:[],skipped:[],alreadyLinked:[],pruned:[]};for(let n of s){let c=w(n);if(!v(c))continue;te(n,{recursive:!0});let a=de(n);pe(n,i,a,o,e);for(let l of $){let d=h(i,l),p=h(n,l);if(!v(d)){o.skipped.push(`${a}/${l}`);continue}if(v(p)){try{let O=M(p);if(g(O)===g(d)){o.alreadyLinked.push(`${a}/${l}`),e(` ok: ${l} \u2192 ${a} (already linked)`);continue}}catch{o.skipped.push(`${a}/${l}`),e(` skip: ${l} \u2192 ${a} (exists, not a symlink)`);continue}A(p)}re(d,p,le?"junction":"dir"),o.installed.push(`${a}/${l}`),e(` done: ${l} \u2192 ${a}`)}}return o}function pe(r,e,t,i,s){let o=new Set($);for(let n of ie(r)){if(o.has(n))continue;let c=h(r,n),a;try{a=g(w(c),M(c))}catch{continue}ue(a,e)&&(A(c),i.pruned.push(`${t}/${n}`),s(` prune: ${n} \u2192 ${t} (removed stale scip-query skill link)`))}}function ue(r,e){let t=se(g(e),g(r));return t===""||!t.startsWith("..")&&!ne(t)}function de(r){return r.includes(".codex")?"Codex":r.includes(".agents")?"Agents":"Claude"}export{C as Watcher,N as getScipVersion,X as initProjectConfig,ce as installSkills,D as isScipInstalled,y as loadProjectConfig,G as printScipInstallInstructions,S as resolveIndexStoragePaths};
1
+ import{b as E,c as j,d as b,g,h as f,i as k,m,n as _}from"./chunk-RSZ4KX4B.js";import{a as v}from"./chunk-YZXV3CU3.js";import"./chunk-QVZSWLLZ.js";import{fork as D}from"child_process";import{statSync as $,watch as G}from"fs";import{join as M,relative as F}from"path";import W from"ignore";var S=class{projectRoot;config;watchConfig;languages;pnpmWorkspaces;typescriptProjectMode;typescriptProjects;clojureConfigPath;indexerConcurrency;onStatus;onReindexComplete;onError;status={state:"idle"};debounceTimer=null;cooldownTimer=null;dirty=!1;changedFiles=0;pendingTrigger=null;reindexInFlight=!1;lastReindexEnd=0;fsWatchers=[];gitPollTimer=null;lastGitState=null;gitignoreFilter;extraIgnore;stopped=!1;constructor(t){this.projectRoot=t.projectRoot,this.config=t.config,this.watchConfig=k(t.config),this.languages=t.languages,this.pnpmWorkspaces=t.config.indexer?.typescript?.pnpmWorkspaces??!1,this.typescriptProjectMode=t.config.indexer?.typescript?.projectMode,this.typescriptProjects=t.config.indexer?.typescript?.projects,this.clojureConfigPath=t.config.indexer?.clojure?.configPath,this.indexerConcurrency=t.config.indexerConcurrency,this.onStatus=t.onStatus??(()=>{}),this.onReindexComplete=t.onReindexComplete??(()=>{}),this.onError=t.onError??(e=>console.error(e.message)),this.gitignoreFilter=v(t.projectRoot),this.extraIgnore=W(),this.watchConfig.ignore.length>0&&this.extraIgnore.add(this.watchConfig.ignore)}start(){this.stopped=!1,this.setStatus({state:"idle"}),this.startGitStatePolling();try{let t=G(this.projectRoot,{recursive:!0},(e,i)=>{i&&!this.stopped&&this.handleFileChange(i)});this.fsWatchers.push(t)}catch{this.onError(new Error("Failed to start file watcher. On Linux, you may need to increase inotify limits: sysctl -w fs.inotify.max_user_watches=524288"))}}stop(){this.stopped=!0;for(let t of this.fsWatchers)t.close();this.fsWatchers=[],this.clearDebounceTimer(),this.clearCooldownTimer(),this.clearGitPollTimer(),this.setStatus({state:"idle"})}requestRefresh(t,e={}){if(!e.immediate||this.reindexInFlight||this.status.state==="cooldown"){this.scheduleReindex(t);return}this.pendingTrigger=T(this.pendingTrigger,t),this.changedFiles+=1,this.clearDebounceTimer(),this.triggerReindex()}handleFileChange(t){let e=F(this.projectRoot,M(this.projectRoot,t));e===".git"||e.startsWith(".git/")||this.gitignoreFilter.isIgnored(e)||this.extraIgnore.ignores(e)||t.endsWith("index.db")||t.endsWith("index.scip")||t.endsWith("index.db.tmp")||this.scheduleReindex({kind:"watch-source",detail:e})}scheduleReindex(t){if(this.pendingTrigger=T(this.pendingTrigger,t),this.changedFiles++,this.reindexInFlight){this.dirty=!0,this.setStatus({state:"indexing",startedAt:this.status.startedAt});return}if(this.status.state==="cooldown"){this.dirty=!0,this.setStatus({state:"cooldown",until:this.status.until,dirty:!0});return}this.clearDebounceTimer();let e=Date.now()+this.watchConfig.debounceMs;this.setStatus({state:"waiting",changedFiles:this.changedFiles,reindexAt:e}),this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.triggerReindex()},this.watchConfig.debounceMs)}triggerReindex(){if(this.reindexInFlight||this.stopped)return;let t=Date.now()-this.lastReindexEnd;if(this.lastReindexEnd>0&&t<this.watchConfig.cooldownMs){let r=this.watchConfig.cooldownMs-t;this.dirty=!0;let o=Date.now()+r;this.setStatus({state:"cooldown",until:o,dirty:!0}),this.cooldownTimer=setTimeout(()=>{this.cooldownTimer=null,this.dirty&&!this.stopped&&(this.dirty=!1,this.triggerReindex())},r);return}this.reindexInFlight=!0,this.dirty=!1,this.changedFiles=0;let e=this.pendingTrigger??{kind:"watch-source"};this.pendingTrigger=null;let i=Date.now();this.setStatus({state:"indexing",startedAt:i}),this.runReindex(e).then(r=>{if(this.reindexInFlight=!1,this.lastReindexEnd=Date.now(),this.onReindexComplete(r),this.dirty&&!this.stopped){let o=Date.now()+this.watchConfig.cooldownMs;this.setStatus({state:"cooldown",until:o,dirty:!0}),this.cooldownTimer=setTimeout(()=>{this.cooldownTimer=null,this.dirty&&!this.stopped?(this.dirty=!1,this.triggerReindex()):this.setStatus({state:"idle"})},this.watchConfig.cooldownMs)}else this.setStatus({state:"idle"})}).catch(r=>{this.reindexInFlight=!1,this.lastReindexEnd=Date.now(),this.onError(r instanceof Error?r:new Error(String(r))),this.setStatus({state:"idle"})})}runReindex(t){return new Promise((e,i)=>{let r=Date.now(),o=f(this.projectRoot),n=Object.keys(o).length>0?o:this.config,c=m(this.projectRoot,n),a=n.indexer?.typescript,l=n.indexer?.clojure,h=D(new URL("./reindex-worker.js",import.meta.url).pathname,[],{detached:!0,env:{...process.env,SCIP_REINDEX_PROJECT_ROOT:this.projectRoot,SCIP_REINDEX_OUTPUT_SCIP:c.indexPath,SCIP_REINDEX_OUTPUT_DB:c.dbPath,SCIP_REINDEX_LANGUAGES:(n.languages??this.languages)?.join(",")??"",SCIP_REINDEX_INDEXER_CONCURRENCY:String(n.indexerConcurrency??this.indexerConcurrency??""),SCIP_REINDEX_PNPM_WORKSPACES:a?.pnpmWorkspaces??this.pnpmWorkspaces?"1":"",SCIP_REINDEX_TYPESCRIPT_CONFIG:JSON.stringify({projectMode:a?.projectMode??this.typescriptProjectMode,projects:a?.projects??this.typescriptProjects??[]}),SCIP_REINDEX_CLOJURE_CONFIG_PATH:l?.configPath??this.clojureConfigPath??"",SCIP_REINDEX_TRIGGER_KIND:t.kind,SCIP_REINDEX_TRIGGER_DETAIL:t.detail??""},stdio:"pipe"});h.on("exit",d=>{d===0?e(Date.now()-r):i(new Error(`Reindex worker exited with code ${d}`))}),h.on("error",i)})}setStatus(t){this.status=t,this.onStatus(t)}clearDebounceTimer(){this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null)}clearCooldownTimer(){this.cooldownTimer&&(clearTimeout(this.cooldownTimer),this.cooldownTimer=null)}startGitStatePolling(){this.lastGitState=this.readGitState(),this.lastGitState&&(this.gitPollTimer=setInterval(()=>this.pollGitState(),this.watchConfig.gitPollMs),this.gitPollTimer.unref?.())}pollGitState(){let t=this.lastGitState,e=this.readGitState();if(!t||!e||this.stopped){this.lastGitState=e;return}this.lastGitState=e;let i=t.head!==e.head,r=t.indexPath!==e.indexPath||t.indexMtimeMs!==e.indexMtimeMs||t.indexSize!==e.indexSize;i&&r?this.scheduleReindex({kind:"watch-git-state",detail:"HEAD and index changed"}):i?this.scheduleReindex({kind:"watch-git-head",detail:"HEAD changed"}):r&&this.scheduleReindex({kind:"watch-git-index",detail:e.indexPath??"index changed"})}readGitState(){let t=g(this.projectRoot,["rev-parse","--git-path","index"]);if(!t)return null;let e={head:g(this.projectRoot,["rev-parse","--verify","HEAD"]),indexPath:t};try{let i=$(t);e.indexMtimeMs=i.mtimeMs,e.indexSize=i.size}catch{e.indexMtimeMs=void 0,e.indexSize=void 0}return e}clearGitPollTimer(){this.gitPollTimer&&(clearInterval(this.gitPollTimer),this.gitPollTimer=null)}};function T(s,t){return s?s.kind===t.kind?s.detail===t.detail?s:{kind:s.kind,detail:"multiple changes"}:{kind:"watch-git-state",detail:`${s.kind}, ${t.kind}`}:t}import{existsSync as x,mkdirSync as N,symlinkSync as O,readlinkSync as w,unlinkSync as P,readdirSync as A}from"fs";import{join as p,dirname as R,resolve as u,relative as L,isAbsolute as U}from"path";import{homedir as y,platform as X}from"os";import{fileURLToPath as q}from"url";var H=X()==="win32",C=["_shared","scip-query","scip-setup","scip-calibrate","scip-cleanup-audit","scip-cleanup-improve","scip-integrity-audit","scip-twin-drift","scip-claim-audit","scip-probe-reachability","scip-hyper-optimization","scip-api-impact","scip-concrete-plan","scip-conductor","scip-debug","scip-explore","scip-triage-issue","scip-diagram","scip-doc-reconcile","scip-directory-architecture","scip-maintainability","scip-react-maintainability","scip-vue-maintainability","scip-verify","scip-language-playbook","scip-tla-model-system"];function z(s={}){let t=s.quiet?()=>{}:console.log,e=q(import.meta.url),i=u(R(e),"..","skills"),r=[p(y(),".claude","skills"),p(y(),".codex","skills"),p(y(),".agents","skills")],o={installed:[],skipped:[],alreadyLinked:[],pruned:[]};for(let n of r){let c=R(n);if(!x(c))continue;N(n,{recursive:!0});let a=B(n);J(n,i,a,o,t);for(let l of C){let h=p(i,l),d=p(n,l);if(!x(h)){o.skipped.push(`${a}/${l}`);continue}if(x(d)){try{let I=w(d);if(u(I)===u(h)){o.alreadyLinked.push(`${a}/${l}`),t(` ok: ${l} \u2192 ${a} (already linked)`);continue}}catch{o.skipped.push(`${a}/${l}`),t(` skip: ${l} \u2192 ${a} (exists, not a symlink)`);continue}P(d)}O(h,d,H?"junction":"dir"),o.installed.push(`${a}/${l}`),t(` done: ${l} \u2192 ${a}`)}}return o}function J(s,t,e,i,r){let o=new Set(C);for(let n of A(s)){if(o.has(n))continue;let c=p(s,n),a;try{a=u(R(c),w(c))}catch{continue}K(a,t)&&(P(c),i.pruned.push(`${e}/${n}`),r(` prune: ${n} \u2192 ${e} (removed stale scip-query skill link)`))}}function K(s,t){let e=L(u(t),u(s));return e===""||!e.startsWith("..")&&!U(e)}function B(s){return s.includes(".codex")?"Codex":s.includes(".agents")?"Agents":"Claude"}export{S as Watcher,j as getScipVersion,_ as initProjectConfig,z as installSkills,E as isScipInstalled,f as loadProjectConfig,b as printScipInstallInstructions,m as resolveIndexStoragePaths};
3
2
  //# sourceMappingURL=runtime.js.map
@@ -1,4 +1,4 @@
1
- import { a as SupportedLanguage } from './config-types-SVkUIufk.js';
1
+ import { a as SupportedLanguage } from './config-types-70s7NxKB.js';
2
2
 
3
3
  type WatcherStatus = {
4
4
  state: 'idle';
@@ -1,4 +1,4 @@
1
- import{A as st,B as at,C as ct,D as ee,E as te,F as lt,H as dt,I as ve,J as pt,K as ut,L as ft,O as mt,R as ht,T as gt,U as re,V as yt,W as St,X as bt,a as He,c as ye,d as Se,e as Ue,g as Ge,h as Be,i as ze,j as Ke,k as Ye,l as Ve,n as Je,o as Qe,p as be,q as xe,r as Xe,s as K,t as Ze,u as et,v as rt,x as it,z as ot}from"./chunk-XAEU4ROB.js";import{b as z,f as $,h as tt,i as nt,j as ne}from"./chunk-FFIYGYQR.js";import{b as O}from"./chunk-3M2UCPFS.js";import{a as Z,c as We,d as ge,e as E}from"./chunk-JHK2DMUQ.js";import P from"process";import{rmSync as ln}from"fs";import{resolve as dn}from"path";import{pathToFileURL as Zr}from"url";import{readFileSync as fn,writeFileSync as li,existsSync as mn,mkdirSync as hn}from"fs";import{isAbsolute as pi,join as q,relative as ui,resolve as xt}from"path";import{createHash as gn}from"crypto";import{homedir as yn}from"os";var Ie=".scipquery.json",Sn=250,bn=0,xn=10*6e4,vn={enabled:!1,debounceMs:Sn,cooldownMs:bn,gitPollMs:2e3,idleTimeoutMs:xn,autoRefresh:!0,ignore:[]},In=["typescript","javascript","java","scala","kotlin","rust","python","ruby","go","cpp","c","csharp","vb","dart","php","clojure"];var hi=new Set(In);function W(n){let e=q(n,Ie);if(!mn(e))return{};try{let t=fn(e,"utf-8");return JSON.parse(t)}catch(t){let r=t instanceof Error?t.message:String(t);throw t instanceof SyntaxError?new Error(`invalid ${Ie} at ${e}: ${r}`,{cause:t}):new Error(`unable to read ${Ie} at ${e}: ${r}`,{cause:t})}}function ie(n){return{...vn,...n.watch}}function Mn(n,e){let t=process.env.SCIP_QUERY_CACHE_DIR;if(t)return Me(t);if(e?.dbPath)return Me(xt(n,e.dbPath));let i=process.env.XDG_CACHE_HOME||q(yn(),".cache"),o=gn("sha256").update(xt(n)).digest("hex").slice(0,12),s=q(i,"scip-query","projects",o);return Me(s)}function H(n,e){let t=Mn(n,e);return{cacheDir:t,dbPath:q(t,"index.db"),indexPath:q(t,"index.scip"),metaPath:q(t,"meta.json")}}function Me(n){return hn(n,{recursive:!0}),n}import{existsSync as vt,readFileSync as Rn}from"fs";function Re(n,e,t){let r=new Date().toISOString();if(!vt(t.dbPath))return{state:"missing",checkedAt:r,metaPath:t.metaPath,reason:"No SQLite index database exists.",remedy:"Run: scip-query reindex"};if(!vt(t.metaPath))return{state:"unknown",checkedAt:r,metaPath:t.metaPath,reason:"No reindex metadata file exists next to the SQLite index.",remedy:"Run: scip-query reindex"};try{let i=JSON.parse(Rn(t.metaPath,"utf-8")),o=e.languages??mt(n),s=Tn(n,o,e),a=Array.isArray(i.indexedLanguages)?[...i.indexedLanguages].sort():[],c=(i.version===2||i.version===3)&&i.status==="complete"&&JSON.stringify(i.fingerprint)===JSON.stringify(s)&&JSON.stringify(a)===JSON.stringify(s.languages),l=ht(t.dbPath,t.metaPath),d=l.state==="invalid"||l.state==="drifted",p=c&&!d;return{state:p?"fresh":"stale",checkedAt:r,metaPath:t.metaPath,updatedAt:i.updatedAt,lastRefresh:i.lastRefresh,reason:d?`SQLite generation requires repair: ${l.reason}`:c?"Index metadata fingerprint matches current source files.":"Index metadata fingerprint differs from current source files.",remedy:p?void 0:"Run: scip-query reindex"}}catch(i){return{state:"unknown",checkedAt:r,metaPath:t.metaPath,reason:`Could not read reindex metadata: ${i instanceof Error?i.message:String(i)}`,remedy:"Run: scip-query reindex"}}}function Tn(n,e,t){return{version:2,languages:[...e].sort(),pnpmWorkspaces:t.indexer?.typescript?.projectMode!=="workspace"&&t.indexer?.typescript?.pnpmWorkspaces===!0,typescriptProjectMode:t.indexer?.typescript?.projectMode??"single",typescriptProjects:tt(t.indexer?.typescript?.projects),clojureConfigPath:Pn(t.indexer?.clojure?.configPath),files:nt(n)}}function Pn(n){return n?.trim()||void 0}import{execFileSync as Dn,fork as Cn}from"child_process";import{statSync as Fn,watch as wn}from"fs";import{join as kn,relative as En}from"path";import Nn from"ignore";var oe=class{projectRoot;config;watchConfig;languages;pnpmWorkspaces;typescriptProjectMode;typescriptProjects;clojureConfigPath;indexerConcurrency;onStatus;onReindexComplete;onError;status={state:"idle"};debounceTimer=null;cooldownTimer=null;dirty=!1;changedFiles=0;pendingTrigger=null;reindexInFlight=!1;lastReindexEnd=0;fsWatchers=[];gitPollTimer=null;lastGitState=null;gitignoreFilter;extraIgnore;stopped=!1;constructor(e){this.projectRoot=e.projectRoot,this.config=e.config,this.watchConfig=ie(e.config),this.languages=e.languages,this.pnpmWorkspaces=e.config.indexer?.typescript?.pnpmWorkspaces??!1,this.typescriptProjectMode=e.config.indexer?.typescript?.projectMode,this.typescriptProjects=e.config.indexer?.typescript?.projects,this.clojureConfigPath=e.config.indexer?.clojure?.configPath,this.indexerConcurrency=e.config.indexerConcurrency,this.onStatus=e.onStatus??(()=>{}),this.onReindexComplete=e.onReindexComplete??(()=>{}),this.onError=e.onError??(t=>console.error(t.message)),this.gitignoreFilter=ne(e.projectRoot),this.extraIgnore=Nn(),this.watchConfig.ignore.length>0&&this.extraIgnore.add(this.watchConfig.ignore)}start(){this.stopped=!1,this.setStatus({state:"idle"}),this.startGitStatePolling();try{let e=wn(this.projectRoot,{recursive:!0},(t,r)=>{r&&!this.stopped&&this.handleFileChange(r)});this.fsWatchers.push(e)}catch{this.onError(new Error("Failed to start file watcher. On Linux, you may need to increase inotify limits: sysctl -w fs.inotify.max_user_watches=524288"))}}stop(){this.stopped=!0;for(let e of this.fsWatchers)e.close();this.fsWatchers=[],this.clearDebounceTimer(),this.clearCooldownTimer(),this.clearGitPollTimer(),this.setStatus({state:"idle"})}requestRefresh(e,t={}){if(!t.immediate||this.reindexInFlight||this.status.state==="cooldown"){this.scheduleReindex(e);return}this.pendingTrigger=Mt(this.pendingTrigger,e),this.changedFiles+=1,this.clearDebounceTimer(),this.triggerReindex()}handleFileChange(e){let t=En(this.projectRoot,kn(this.projectRoot,e));t===".git"||t.startsWith(".git/")||this.gitignoreFilter.isIgnored(t)||this.extraIgnore.ignores(t)||e.endsWith("index.db")||e.endsWith("index.scip")||e.endsWith("index.db.tmp")||this.scheduleReindex({kind:"watch-source",detail:t})}scheduleReindex(e){if(this.pendingTrigger=Mt(this.pendingTrigger,e),this.changedFiles++,this.reindexInFlight){this.dirty=!0,this.setStatus({state:"indexing",startedAt:this.status.startedAt});return}if(this.status.state==="cooldown"){this.dirty=!0,this.setStatus({state:"cooldown",until:this.status.until,dirty:!0});return}this.clearDebounceTimer();let t=Date.now()+this.watchConfig.debounceMs;this.setStatus({state:"waiting",changedFiles:this.changedFiles,reindexAt:t}),this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.triggerReindex()},this.watchConfig.debounceMs)}triggerReindex(){if(this.reindexInFlight||this.stopped)return;let e=Date.now()-this.lastReindexEnd;if(this.lastReindexEnd>0&&e<this.watchConfig.cooldownMs){let i=this.watchConfig.cooldownMs-e;this.dirty=!0;let o=Date.now()+i;this.setStatus({state:"cooldown",until:o,dirty:!0}),this.cooldownTimer=setTimeout(()=>{this.cooldownTimer=null,this.dirty&&!this.stopped&&(this.dirty=!1,this.triggerReindex())},i);return}this.reindexInFlight=!0,this.dirty=!1,this.changedFiles=0;let t=this.pendingTrigger??{kind:"watch-source"};this.pendingTrigger=null;let r=Date.now();this.setStatus({state:"indexing",startedAt:r}),this.runReindex(t).then(i=>{if(this.reindexInFlight=!1,this.lastReindexEnd=Date.now(),this.onReindexComplete(i),this.dirty&&!this.stopped){let o=Date.now()+this.watchConfig.cooldownMs;this.setStatus({state:"cooldown",until:o,dirty:!0}),this.cooldownTimer=setTimeout(()=>{this.cooldownTimer=null,this.dirty&&!this.stopped?(this.dirty=!1,this.triggerReindex()):this.setStatus({state:"idle"})},this.watchConfig.cooldownMs)}else this.setStatus({state:"idle"})}).catch(i=>{this.reindexInFlight=!1,this.lastReindexEnd=Date.now(),this.onError(i instanceof Error?i:new Error(String(i))),this.setStatus({state:"idle"})})}runReindex(e){return new Promise((t,r)=>{let i=Date.now(),o=W(this.projectRoot),s=Object.keys(o).length>0?o:this.config,a=H(this.projectRoot,s),c=s.indexer?.typescript,l=s.indexer?.clojure,d=Cn(new URL("./reindex-worker.js",import.meta.url).pathname,[],{detached:!0,env:{...process.env,SCIP_REINDEX_PROJECT_ROOT:this.projectRoot,SCIP_REINDEX_OUTPUT_SCIP:a.indexPath,SCIP_REINDEX_OUTPUT_DB:a.dbPath,SCIP_REINDEX_LANGUAGES:(s.languages??this.languages)?.join(",")??"",SCIP_REINDEX_INDEXER_CONCURRENCY:String(s.indexerConcurrency??this.indexerConcurrency??""),SCIP_REINDEX_PNPM_WORKSPACES:c?.pnpmWorkspaces??this.pnpmWorkspaces?"1":"",SCIP_REINDEX_TYPESCRIPT_CONFIG:JSON.stringify({projectMode:c?.projectMode??this.typescriptProjectMode,projects:c?.projects??this.typescriptProjects??[]}),SCIP_REINDEX_CLOJURE_CONFIG_PATH:l?.configPath??this.clojureConfigPath??"",SCIP_REINDEX_TRIGGER_KIND:e.kind,SCIP_REINDEX_TRIGGER_DETAIL:e.detail??""},stdio:"pipe"});d.on("exit",p=>{p===0?t(Date.now()-i):r(new Error(`Reindex worker exited with code ${p}`))}),d.on("error",r)})}setStatus(e){this.status=e,this.onStatus(e)}clearDebounceTimer(){this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null)}clearCooldownTimer(){this.cooldownTimer&&(clearTimeout(this.cooldownTimer),this.cooldownTimer=null)}startGitStatePolling(){this.lastGitState=this.readGitState(),this.lastGitState&&(this.gitPollTimer=setInterval(()=>this.pollGitState(),this.watchConfig.gitPollMs),this.gitPollTimer.unref?.())}pollGitState(){let e=this.lastGitState,t=this.readGitState();if(!e||!t||this.stopped){this.lastGitState=t;return}this.lastGitState=t;let r=e.head!==t.head,i=e.indexPath!==t.indexPath||e.indexMtimeMs!==t.indexMtimeMs||e.indexSize!==t.indexSize;r&&i?this.scheduleReindex({kind:"watch-git-state",detail:"HEAD and index changed"}):r?this.scheduleReindex({kind:"watch-git-head",detail:"HEAD changed"}):i&&this.scheduleReindex({kind:"watch-git-index",detail:t.indexPath??"index changed"})}readGitState(){let e=It(this.projectRoot,["rev-parse","--git-path","index"]);if(!e)return null;let t={head:It(this.projectRoot,["rev-parse","--verify","HEAD"]),indexPath:e};try{let r=Fn(e);t.indexMtimeMs=r.mtimeMs,t.indexSize=r.size}catch{t.indexMtimeMs=void 0,t.indexSize=void 0}return t}clearGitPollTimer(){this.gitPollTimer&&(clearInterval(this.gitPollTimer),this.gitPollTimer=null)}};function It(n,e){try{return Dn("git",["-C",n,...e],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return}}function Mt(n,e){return n?n.kind===e.kind?n.detail===e.detail?n:{kind:n.kind,detail:"multiple changes"}:{kind:"watch-git-state",detail:`${n.kind}, ${e.kind}`}:e}import{existsSync as Rt,statSync as jn}from"fs";import{join as Ln}from"path";function _n(){return process.env.SCIP_QUERY_PROJECT_ROOT??process.cwd()}function An(n=_n()){let e=W(n),t=H(n,e),r=process.env.SCIP_QUERY_INDEX_DB;if(r)return{projectRoot:n,config:e,paths:t,dbPath:r,dbPathSource:"env"};if(Rt(t.dbPath))return{projectRoot:n,config:e,paths:t,dbPath:t.dbPath,dbPathSource:"configured"};let i=Ln(n,"index.db");return{projectRoot:n,config:e,paths:t,dbPath:i,dbPathSource:"root-fallback",rootFallbackWarning:On(i,t.dbPath)}}function Tt(n,e={}){let{config:t,paths:r,dbPath:i,dbPathSource:o,rootFallbackWarning:s}=An(n);if(!Rt(i))throw new Error("No index.db found. Run: scip-query reindex");e.warnOnRootFallback&&o==="root-fallback"&&s&&console.error(s);let a={dbPath:i,indexPath:process.env.SCIP_QUERY_INDEX_SCIP??r.indexPath,projectRoot:n,entryRoots:t.entryRoots,semantic:t.semantic,suppressions:t.suppressions,declaredCouplings:t.declaredCouplings,locality:t.locality,coverageContracts:t.coverageContracts,docs:t.docs},c=ne(n);return new He(a,c)}function On(n,e){let t="unknown time";try{t=jn(n).mtime.toISOString()}catch{}return`warning: using legacy project-root index.db (${n}, modified ${t}) because the configured index was not found at ${e}. This fallback may be stale; run 'scip-query reindex' to refresh the configured index.`}import{mkdirSync as rn,readFileSync as on,readdirSync as Ur,rmSync as Gr}from"fs";import{resolve as ue}from"path";import{resolve as Qt}from"path";import{performance as h}from"perf_hooks";function se(n){return{forFile(e,t){return Pt(n,e,t)},forFiles(e,t){let r=new Map;for(let i of e)r.set(i,Pt(n,i,t));return r}}}function Pt(n,e,t){let r={file:e},i=t.facts||t.identifiers;if(t.text&&(r.text=Be(n,e)),t.lines&&(r.lines=ze(n,e)),t.ast&&(r.ast=Ke(n,e)),t.imports&&(r.imports=et(n,e)),t.reexports&&(r.reexports=Ze(n,e)),i){let o=Ye(n,e),s=o.facts;t.facts&&(r.facts=s),o.unavailable&&(r.sourceFactsUnavailable=o.unavailable),t.identifiers&&s&&(r.identifiers=s.fileIdentifiers,r.identifierLineMap=s.identifierLineMap)}return r}var $n={"/":"namespace","#":"type",".":"term","[":"type-param",":":"meta","!":"macro"};function ae(n){if(n.startsWith("local "))return{kind:"local",id:n.slice(6),raw:n};let e=n.split(" ");if(e.length<4)return{scheme:e[0]??"",manager:e[1]??"",packageName:e[2]??"",version:"",descriptors:[],raw:n};let t=e[0],r=e[1],i=n.slice(t.length+1+r.length+1),o;if(i.startsWith("`")){let l=i.indexOf("`",1);l===-1?(o=i.slice(1),i=""):(o=i.slice(1,l),i=i.slice(l+2))}else{let l=i.indexOf(" ");l===-1?(o=i,i=""):(o=i.slice(0,l),i=i.slice(l+1))}let s,a=i.indexOf(" ");a===-1?(s=i,i=""):(s=i.slice(0,a),i=i.slice(a+1));let c=qn(i);return{scheme:t,manager:r,packageName:o,version:s,descriptors:c,raw:n}}function U(n){let e=ae(n);if("kind"in e)return null;for(let t=e.descriptors.length-2;t>=0;t--){let r=e.descriptors[t];if(r?.suffix==="type")return r.name}return null}function qn(n){let e=[],t=0;for(;t<n.length;){if(n[t]==="["){let o=n.indexOf("]",t+1);if(o===-1){e.push({name:n.slice(t+1),suffix:"type-param"});break}e.push({name:n.slice(t+1,o),suffix:"type-param"}),t=o+1;continue}if(n[t]==="("&&(e.length===0||t===0||Dt(n[t-1]))){let o=n.indexOf(")",t+1);if(o!==-1&&n[o+1]!=="."){e.push({name:n.slice(t+1,o),suffix:"parameter"}),t=o+1;continue}}let r;if(n[t]==="`"){let o=n.indexOf("`",t+1);if(o===-1){r=n.slice(t+1),e.push({name:r,suffix:"term"});break}r=n.slice(t+1,o),t=o+1}else{let o=t;for(;t<n.length&&!Dt(n[t]);)t++;r=n.slice(o,t)}if(t>=n.length){r&&e.push({name:r,suffix:"term"});break}let i=n[t];if(i==="("){let o=n.indexOf(")",t+1);o!==-1&&n[o+1]==="."?(e.push({name:r,suffix:"method"}),t=o+2):o!==-1?(e.push({name:r,suffix:"method"}),t=o+1):(e.push({name:r,suffix:"term"}),t++)}else{let o=$n[i];o&&e.push({name:r,suffix:o}),t+=1}}return e}function Dt(n){return n==="/"||n==="#"||n==="."||n==="("||n==="["||n===":"||n==="!"}function N(n){let e=ae(n);if("kind"in e&&e.kind==="local")return e.id;let t=e;return t.descriptors.length===0?"":t.descriptors[t.descriptors.length-1].name}function j(n){let e=ae(n);if("kind"in e&&e.kind==="local")return null;let t=e;return t.descriptors[t.descriptors.length-1]?.suffix??null}function Ct(n){let e=j(n);return e==="method"?!0:e!=="term"?!1:n.endsWith("().")?!0:n.startsWith("rust-analyzer ")&&n.includes("#")?!1:n.startsWith("scip-typescript ")?!/#[A-Za-z0-9_$]+\.$/.test(n):!0}function Wn(n,e={}){if(U(n.symbol)!==null)return e.includeClassMemberFallbacks===!0;let i=(n.documentation??"").replace(/^```\w*\s*/,"").replace(/\s*```$/,"").trim();return/^(?:var|let|const|function|class|interface|type|enum)\b/.test(i)}function Ft(n,e,t={}){let r=new Map;for(let o of e)n.length>0&&!Wn(o,{includeClassMemberFallbacks:t.includeClassMemberFallbacks})||r.set(o.id,o);for(let o of n)r.set(o.id,o);let i=[...r.values()];return t.sort?i.sort((o,s)=>o.start_line-s.start_line||o.end_line-s.end_line||o.symbol.localeCompare(s.symbol)):i}var Hn=z("file-definitions",{clearGroups:["definition-catalog"]}),eo=z("file-function-like-definitions",{clearGroups:["definition-catalog"]});function L(n,e,t={}){return t.includeClassMemberFallbacks?wt(n,e,void 0,{includeClassMemberFallbacks:!0}):Hn.get(n,e,()=>{let r=Un(n,e);if(r)return r;let i=wt(n,e),o=Se(n),s=se(n).forFile(e,{text:!0}).text;return o&&s&&Et.write(n,e,ye(n,e,s),{projectFingerprint:o,definitions:i.map(a=>({...a}))}),i})}var Et=Ue({kind:"file-definitions",invalidation:Ge("file-definitions"),serialize:Gn,deserialize:Bn});function Un(n,e){let t=Se(n);if(!t)return null;let r=se(n).forFile(e,{text:!0}).text;if(!r)return null;let i=Et.read(n,e,ye(n,e,r));return i?zn(i,t,e):null}function Gn(n){return JSON.stringify(n)}function Bn(n){try{let e=JSON.parse(n);return!xe(e)||typeof e.projectFingerprint!="string"||!Array.isArray(e.definitions)?null:{projectFingerprint:e.projectFingerprint,definitions:e.definitions}}catch{return null}}function zn(n,e,t){if(n.projectFingerprint!==e)return null;let r=[];for(let i of n.definitions){let o=Kn(i,t);if(!o)return null;r.push(o)}return r}function Kn(n,e){return!xe(n)||typeof n.symbolId!="number"||typeof n.symbol!="string"||typeof n.documentId!="number"||typeof n.startLine!="number"||typeof n.startChar!="number"&&n.startChar!==void 0||typeof n.endLine!="number"||typeof n.endChar!="number"&&n.endChar!==void 0||n.relativePath!==e||typeof n.leaf!="string"||typeof n.parentTypeName!="string"&&n.parentTypeName!==null||typeof n.isFunctionLike!="boolean"||typeof n.isTypeLike!="boolean"||typeof n.kind!="number"&&n.kind!==null||typeof n.documentation!="string"&&n.documentation!==null||typeof n.enclosingSymbol!="string"&&n.enclosingSymbol!==null?null:{symbolId:n.symbolId,symbol:n.symbol,documentId:n.documentId,startLine:n.startLine,startChar:n.startChar,endLine:n.endLine,endChar:n.endChar,relativePath:n.relativePath,leaf:n.leaf,parentTypeName:n.parentTypeName,isFunctionLike:n.isFunctionLike,isTypeLike:n.isTypeLike,kind:n.kind,documentation:n.documentation,enclosingSymbol:n.enclosingSymbol}}function wt(n,e,t,r={}){let i=Ft(Yn(n,e),Vn(n,e),{sort:!0,includeClassMemberFallbacks:r.includeClassMemberFallbacks}).map(Jn);return t&&(i=i.filter(t)),Xn(n,e,i)}function Yn(n,e){return n.all(`SELECT
1
+ import{$ as Fe,A as gt,Aa as jt,B as St,Ba as At,Ca as _t,D as oe,E as bt,G as xt,H as It,I as vt,J as Rt,K as se,L as ae,M as Mt,O as Dt,P as ke,Q as Tt,R as Pt,S as Ct,V as kt,Z as H,_ as le,a as Ze,aa as Ft,b as et,ba as wt,c as Me,ca as B,d as tt,e as nt,f as rt,h as De,i as Te,j as it,k as ot,m as st,n as at,na as Et,o as ct,p as lt,q as dt,qa as we,r as pt,t as ut,u as ft,v as Pe,w as Ce,wa as Lt,x as mt,y as Q,ya as Nt,z as ht,za as de}from"./chunk-L7UITWFE.js";import{b as K,f as q,j as yt,k as ce}from"./chunk-SMBIGBGN.js";import{a as V,b as j}from"./chunk-3M2UCPFS.js";import{a as ie,c as Xe,d as Re,e as N}from"./chunk-JHK2DMUQ.js";import T from"process";import{rmSync as En}from"fs";import{resolve as Ln}from"path";import{pathToFileURL as Si}from"url";import{existsSync as Ot,readFileSync as An}from"fs";function Ee(n,e,t){let r=new Date().toISOString();if(!Ot(t.dbPath))return{state:"missing",checkedAt:r,metaPath:t.metaPath,reason:"No SQLite index database exists.",remedy:"Run: scip-query reindex"};if(!Ot(t.metaPath))return{state:"unknown",checkedAt:r,metaPath:t.metaPath,reason:"No reindex metadata file exists next to the SQLite index.",remedy:"Run: scip-query reindex"};try{let i=JSON.parse(An(t.metaPath,"utf-8")),o=e.languages??kt(n),a=_n(n,o,e),s=Array.isArray(i.indexedLanguages)?[...i.indexedLanguages].sort():[],c=(i.version===2||i.version===3)&&i.status==="complete"&&JSON.stringify(i.fingerprint)===JSON.stringify(a)&&JSON.stringify(s)===JSON.stringify(a.languages),l=Et(t.dbPath,t.metaPath),d=l.state==="invalid"||l.state==="drifted",p=c&&!d;return{state:p?"fresh":"stale",checkedAt:r,metaPath:t.metaPath,updatedAt:i.updatedAt,lastRefresh:i.lastRefresh,reason:d?`SQLite generation requires repair: ${l.reason}`:c?"Index metadata fingerprint matches current source files.":"Index metadata fingerprint differs from current source files.",remedy:p?void 0:"Run: scip-query reindex"}}catch(i){return{state:"unknown",checkedAt:r,metaPath:t.metaPath,reason:`Could not read reindex metadata: ${i instanceof Error?i.message:String(i)}`,remedy:"Run: scip-query reindex"}}}function _n(n,e,t){return yt(n,e,{pnpmWorkspaces:t.indexer?.typescript?.pnpmWorkspaces,typescriptProjectMode:t.indexer?.typescript?.projectMode,typescriptProjects:t.indexer?.typescript?.projects,clojureConfigPath:t.indexer?.clojure?.configPath})}import{fork as On}from"child_process";import{statSync as Gn,watch as Wn}from"fs";import{join as $n,relative as qn}from"path";import Hn from"ignore";var pe=class{projectRoot;config;watchConfig;languages;pnpmWorkspaces;typescriptProjectMode;typescriptProjects;clojureConfigPath;indexerConcurrency;onStatus;onReindexComplete;onError;status={state:"idle"};debounceTimer=null;cooldownTimer=null;dirty=!1;changedFiles=0;pendingTrigger=null;reindexInFlight=!1;lastReindexEnd=0;fsWatchers=[];gitPollTimer=null;lastGitState=null;gitignoreFilter;extraIgnore;stopped=!1;constructor(e){this.projectRoot=e.projectRoot,this.config=e.config,this.watchConfig=le(e.config),this.languages=e.languages,this.pnpmWorkspaces=e.config.indexer?.typescript?.pnpmWorkspaces??!1,this.typescriptProjectMode=e.config.indexer?.typescript?.projectMode,this.typescriptProjects=e.config.indexer?.typescript?.projects,this.clojureConfigPath=e.config.indexer?.clojure?.configPath,this.indexerConcurrency=e.config.indexerConcurrency,this.onStatus=e.onStatus??(()=>{}),this.onReindexComplete=e.onReindexComplete??(()=>{}),this.onError=e.onError??(t=>console.error(t.message)),this.gitignoreFilter=ce(e.projectRoot),this.extraIgnore=Hn(),this.watchConfig.ignore.length>0&&this.extraIgnore.add(this.watchConfig.ignore)}start(){this.stopped=!1,this.setStatus({state:"idle"}),this.startGitStatePolling();try{let e=Wn(this.projectRoot,{recursive:!0},(t,r)=>{r&&!this.stopped&&this.handleFileChange(r)});this.fsWatchers.push(e)}catch{this.onError(new Error("Failed to start file watcher. On Linux, you may need to increase inotify limits: sysctl -w fs.inotify.max_user_watches=524288"))}}stop(){this.stopped=!0;for(let e of this.fsWatchers)e.close();this.fsWatchers=[],this.clearDebounceTimer(),this.clearCooldownTimer(),this.clearGitPollTimer(),this.setStatus({state:"idle"})}requestRefresh(e,t={}){if(!t.immediate||this.reindexInFlight||this.status.state==="cooldown"){this.scheduleReindex(e);return}this.pendingTrigger=Gt(this.pendingTrigger,e),this.changedFiles+=1,this.clearDebounceTimer(),this.triggerReindex()}handleFileChange(e){let t=qn(this.projectRoot,$n(this.projectRoot,e));t===".git"||t.startsWith(".git/")||this.gitignoreFilter.isIgnored(t)||this.extraIgnore.ignores(t)||e.endsWith("index.db")||e.endsWith("index.scip")||e.endsWith("index.db.tmp")||this.scheduleReindex({kind:"watch-source",detail:t})}scheduleReindex(e){if(this.pendingTrigger=Gt(this.pendingTrigger,e),this.changedFiles++,this.reindexInFlight){this.dirty=!0,this.setStatus({state:"indexing",startedAt:this.status.startedAt});return}if(this.status.state==="cooldown"){this.dirty=!0,this.setStatus({state:"cooldown",until:this.status.until,dirty:!0});return}this.clearDebounceTimer();let t=Date.now()+this.watchConfig.debounceMs;this.setStatus({state:"waiting",changedFiles:this.changedFiles,reindexAt:t}),this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.triggerReindex()},this.watchConfig.debounceMs)}triggerReindex(){if(this.reindexInFlight||this.stopped)return;let e=Date.now()-this.lastReindexEnd;if(this.lastReindexEnd>0&&e<this.watchConfig.cooldownMs){let i=this.watchConfig.cooldownMs-e;this.dirty=!0;let o=Date.now()+i;this.setStatus({state:"cooldown",until:o,dirty:!0}),this.cooldownTimer=setTimeout(()=>{this.cooldownTimer=null,this.dirty&&!this.stopped&&(this.dirty=!1,this.triggerReindex())},i);return}this.reindexInFlight=!0,this.dirty=!1,this.changedFiles=0;let t=this.pendingTrigger??{kind:"watch-source"};this.pendingTrigger=null;let r=Date.now();this.setStatus({state:"indexing",startedAt:r}),this.runReindex(t).then(i=>{if(this.reindexInFlight=!1,this.lastReindexEnd=Date.now(),this.onReindexComplete(i),this.dirty&&!this.stopped){let o=Date.now()+this.watchConfig.cooldownMs;this.setStatus({state:"cooldown",until:o,dirty:!0}),this.cooldownTimer=setTimeout(()=>{this.cooldownTimer=null,this.dirty&&!this.stopped?(this.dirty=!1,this.triggerReindex()):this.setStatus({state:"idle"})},this.watchConfig.cooldownMs)}else this.setStatus({state:"idle"})}).catch(i=>{this.reindexInFlight=!1,this.lastReindexEnd=Date.now(),this.onError(i instanceof Error?i:new Error(String(i))),this.setStatus({state:"idle"})})}runReindex(e){return new Promise((t,r)=>{let i=Date.now(),o=H(this.projectRoot),a=Object.keys(o).length>0?o:this.config,s=B(this.projectRoot,a),c=a.indexer?.typescript,l=a.indexer?.clojure,d=On(new URL("./reindex-worker.js",import.meta.url).pathname,[],{detached:!0,env:{...process.env,SCIP_REINDEX_PROJECT_ROOT:this.projectRoot,SCIP_REINDEX_OUTPUT_SCIP:s.indexPath,SCIP_REINDEX_OUTPUT_DB:s.dbPath,SCIP_REINDEX_LANGUAGES:(a.languages??this.languages)?.join(",")??"",SCIP_REINDEX_INDEXER_CONCURRENCY:String(a.indexerConcurrency??this.indexerConcurrency??""),SCIP_REINDEX_PNPM_WORKSPACES:c?.pnpmWorkspaces??this.pnpmWorkspaces?"1":"",SCIP_REINDEX_TYPESCRIPT_CONFIG:JSON.stringify({projectMode:c?.projectMode??this.typescriptProjectMode,projects:c?.projects??this.typescriptProjects??[]}),SCIP_REINDEX_CLOJURE_CONFIG_PATH:l?.configPath??this.clojureConfigPath??"",SCIP_REINDEX_TRIGGER_KIND:e.kind,SCIP_REINDEX_TRIGGER_DETAIL:e.detail??""},stdio:"pipe"});d.on("exit",p=>{p===0?t(Date.now()-i):r(new Error(`Reindex worker exited with code ${p}`))}),d.on("error",r)})}setStatus(e){this.status=e,this.onStatus(e)}clearDebounceTimer(){this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null)}clearCooldownTimer(){this.cooldownTimer&&(clearTimeout(this.cooldownTimer),this.cooldownTimer=null)}startGitStatePolling(){this.lastGitState=this.readGitState(),this.lastGitState&&(this.gitPollTimer=setInterval(()=>this.pollGitState(),this.watchConfig.gitPollMs),this.gitPollTimer.unref?.())}pollGitState(){let e=this.lastGitState,t=this.readGitState();if(!e||!t||this.stopped){this.lastGitState=t;return}this.lastGitState=t;let r=e.head!==t.head,i=e.indexPath!==t.indexPath||e.indexMtimeMs!==t.indexMtimeMs||e.indexSize!==t.indexSize;r&&i?this.scheduleReindex({kind:"watch-git-state",detail:"HEAD and index changed"}):r?this.scheduleReindex({kind:"watch-git-head",detail:"HEAD changed"}):i&&this.scheduleReindex({kind:"watch-git-index",detail:t.indexPath??"index changed"})}readGitState(){let e=Me(this.projectRoot,["rev-parse","--git-path","index"]);if(!e)return null;let t={head:Me(this.projectRoot,["rev-parse","--verify","HEAD"]),indexPath:e};try{let r=Gn(e);t.indexMtimeMs=r.mtimeMs,t.indexSize=r.size}catch{t.indexMtimeMs=void 0,t.indexSize=void 0}return t}clearGitPollTimer(){this.gitPollTimer&&(clearInterval(this.gitPollTimer),this.gitPollTimer=null)}};function Gt(n,e){return n?n.kind===e.kind?n.detail===e.detail?n:{kind:n.kind,detail:"multiple changes"}:{kind:"watch-git-state",detail:`${n.kind}, ${e.kind}`}:e}import{existsSync as Wt,statSync as Bn}from"fs";import{join as Un}from"path";function zn(){return process.env.SCIP_QUERY_PROJECT_ROOT??process.cwd()}function Jn(n=zn()){let e=H(n),t=B(n,e),r=process.env.SCIP_QUERY_INDEX_DB;if(r)return{projectRoot:n,config:e,paths:t,dbPath:r,dbPathSource:"env"};if(Wt(t.dbPath))return{projectRoot:n,config:e,paths:t,dbPath:t.dbPath,dbPathSource:"configured"};let i=Un(n,"index.db");return{projectRoot:n,config:e,paths:t,dbPath:i,dbPathSource:"root-fallback",rootFallbackWarning:Vn(i,t.dbPath)}}function $t(n,e={}){let{config:t,paths:r,dbPath:i,dbPathSource:o,rootFallbackWarning:a}=Jn(n);if(!Wt(i))throw new Error("No index.db found. Run: scip-query reindex");e.warnOnRootFallback&&o==="root-fallback"&&a&&console.error(a);let s={dbPath:i,indexPath:process.env.SCIP_QUERY_INDEX_SCIP??r.indexPath,projectRoot:n,sharedEvidenceDbPath:we(n,t),entryRoots:t.entryRoots,semantic:t.semantic,suppressions:t.suppressions,declaredCouplings:t.declaredCouplings,locality:t.locality,coverageContracts:t.coverageContracts,docs:t.docs},c=ce(n);return new rt(s,c)}function Vn(n,e){let t="unknown time";try{t=Bn(n).mtime.toISOString()}catch{}return`warning: using legacy project-root index.db (${n}, modified ${t}) because the configured index was not found at ${e}. This fallback may be stale; run 'scip-query reindex' to refresh the configured index.`}import{mkdirSync as xn,readFileSync as In,readdirSync as Zr,rmSync as ei}from"fs";import{resolve as Se}from"path";import{resolve as mn}from"path";import{performance as y}from"perf_hooks";function ue(n){return{forFile(e,t){return qt(n,e,t)},forFiles(e,t){let r=new Map;for(let i of e)r.set(i,qt(n,i,t));return r}}}function qt(n,e,t){let r={file:e},i=t.facts||t.identifiers;if(t.text&&(r.text=at(n,e)),t.lines&&(r.lines=ct(n,e)),t.ast&&(r.ast=lt(n,e)),t.imports&&(r.imports=gt(n,e)),t.reexports&&(r.reexports=ht(n,e)),i){let o=dt(n,e),a=o.facts;t.facts&&(r.facts=a),o.unavailable&&(r.sourceFactsUnavailable=o.unavailable),t.identifiers&&a&&(r.identifiers=a.fileIdentifiers,r.identifierLineMap=a.identifierLineMap)}return r}var Kn={"/":"namespace","#":"type",".":"term","[":"type-param",":":"meta","!":"macro"};function fe(n){if(n.startsWith("local "))return{kind:"local",id:n.slice(6),raw:n};let e=n.split(" ");if(e.length<4)return{scheme:e[0]??"",manager:e[1]??"",packageName:e[2]??"",version:"",descriptors:[],raw:n};let t=e[0],r=e[1],i=n.slice(t.length+1+r.length+1),o;if(i.startsWith("`")){let l=i.indexOf("`",1);l===-1?(o=i.slice(1),i=""):(o=i.slice(1,l),i=i.slice(l+2))}else{let l=i.indexOf(" ");l===-1?(o=i,i=""):(o=i.slice(0,l),i=i.slice(l+1))}let a,s=i.indexOf(" ");s===-1?(a=i,i=""):(a=i.slice(0,s),i=i.slice(s+1));let c=Qn(i);return{scheme:t,manager:r,packageName:o,version:a,descriptors:c,raw:n}}function U(n){let e=fe(n);if("kind"in e)return null;for(let t=e.descriptors.length-2;t>=0;t--){let r=e.descriptors[t];if(r?.suffix==="type")return r.name}return null}function Qn(n){let e=[],t=0;for(;t<n.length;){if(n[t]==="["){let o=n.indexOf("]",t+1);if(o===-1){e.push({name:n.slice(t+1),suffix:"type-param"});break}e.push({name:n.slice(t+1,o),suffix:"type-param"}),t=o+1;continue}if(n[t]==="("&&(e.length===0||t===0||Ht(n[t-1]))){let o=n.indexOf(")",t+1);if(o!==-1&&n[o+1]!=="."){e.push({name:n.slice(t+1,o),suffix:"parameter"}),t=o+1;continue}}let r;if(n[t]==="`"){let o=n.indexOf("`",t+1);if(o===-1){r=n.slice(t+1),e.push({name:r,suffix:"term"});break}r=n.slice(t+1,o),t=o+1}else{let o=t;for(;t<n.length&&!Ht(n[t]);)t++;r=n.slice(o,t)}if(t>=n.length){r&&e.push({name:r,suffix:"term"});break}let i=n[t];if(i==="("){let o=n.indexOf(")",t+1);o!==-1&&n[o+1]==="."?(e.push({name:r,suffix:"method"}),t=o+2):o!==-1?(e.push({name:r,suffix:"method"}),t=o+1):(e.push({name:r,suffix:"term"}),t++)}else{let o=Kn[i];o&&e.push({name:r,suffix:o}),t+=1}}return e}function Ht(n){return n==="/"||n==="#"||n==="."||n==="("||n==="["||n===":"||n==="!"}function A(n){let e=fe(n);if("kind"in e&&e.kind==="local")return e.id;let t=e;return t.descriptors.length===0?"":t.descriptors[t.descriptors.length-1].name}function _(n){let e=fe(n);if("kind"in e&&e.kind==="local")return null;let t=e;return t.descriptors[t.descriptors.length-1]?.suffix??null}function Bt(n){let e=_(n);return e==="method"?!0:e!=="term"?!1:n.endsWith("().")?!0:n.startsWith("rust-analyzer ")&&n.includes("#")?!1:n.startsWith("scip-typescript ")?!/#[A-Za-z0-9_$]+\.$/.test(n):!0}function Yn(n,e={}){if(U(n.symbol)!==null)return e.includeClassMemberFallbacks===!0;let i=(n.documentation??"").replace(/^```\w*\s*/,"").replace(/\s*```$/,"").trim();return/^(?:var|let|const|function|class|interface|type|enum)\b/.test(i)}function Ut(n,e,t={}){let r=new Map;for(let o of e)n.length>0&&!Yn(o,{includeClassMemberFallbacks:t.includeClassMemberFallbacks})||r.set(o.id,o);for(let o of n)r.set(o.id,o);let i=[...r.values()];return t.sort?i.sort((o,a)=>o.start_line-a.start_line||o.end_line-a.end_line||o.symbol.localeCompare(a.symbol)):i}var Xn=K("file-definitions",{clearGroups:["definition-catalog"]}),go=K("file-function-like-definitions",{clearGroups:["definition-catalog"]});function O(n,e,t={}){return t.includeClassMemberFallbacks?zt(n,e,void 0,{includeClassMemberFallbacks:!0}):Xn.get(n,e,()=>{let r=Zn(n,e);if(r)return r;let i=zt(n,e),o=Te(n),a=ue(n).forFile(e,{text:!0}).text;return o&&a&&Vt.write(n,e,De(n,e,a),{projectFingerprint:o,definitions:i.map(s=>({...s}))}),i})}var Vt=ot({kind:"file-definitions",invalidation:st("file-definitions"),serialize:er,deserialize:tr});function Zn(n,e){let t=Te(n);if(!t)return null;let r=ue(n).forFile(e,{text:!0}).text;if(!r)return null;let i=Vt.read(n,e,De(n,e,r));return i?nr(i,t,e):null}function er(n){return JSON.stringify(n)}function tr(n){try{let e=JSON.parse(n);return!Ce(e)||typeof e.projectFingerprint!="string"||!Array.isArray(e.definitions)?null:{projectFingerprint:e.projectFingerprint,definitions:e.definitions}}catch{return null}}function nr(n,e,t){if(n.projectFingerprint!==e)return null;let r=[];for(let i of n.definitions){let o=rr(i,t);if(!o)return null;r.push(o)}return r}function rr(n,e){return!Ce(n)||typeof n.symbolId!="number"||typeof n.symbol!="string"||typeof n.documentId!="number"||typeof n.startLine!="number"||typeof n.startChar!="number"&&n.startChar!==void 0||typeof n.endLine!="number"||typeof n.endChar!="number"&&n.endChar!==void 0||n.relativePath!==e||typeof n.leaf!="string"||typeof n.parentTypeName!="string"&&n.parentTypeName!==null||typeof n.isFunctionLike!="boolean"||typeof n.isTypeLike!="boolean"||typeof n.kind!="number"&&n.kind!==null||typeof n.documentation!="string"&&n.documentation!==null||typeof n.enclosingSymbol!="string"&&n.enclosingSymbol!==null?null:{symbolId:n.symbolId,symbol:n.symbol,documentId:n.documentId,startLine:n.startLine,startChar:n.startChar,endLine:n.endLine,endChar:n.endChar,relativePath:n.relativePath,leaf:n.leaf,parentTypeName:n.parentTypeName,isFunctionLike:n.isFunctionLike,isTypeLike:n.isTypeLike,kind:n.kind,documentation:n.documentation,enclosingSymbol:n.enclosingSymbol}}function zt(n,e,t,r={}){let i=Ut(ir(n,e),or(n,e),{sort:!0,includeClassMemberFallbacks:r.includeClassMemberFallbacks}).map(sr);return t&&(i=i.filter(t)),cr(n,e,i)}function ir(n,e){return n.all(`SELECT
2
2
  gs.id,
3
3
  gs.symbol,
4
4
  der.document_id,
@@ -16,7 +16,7 @@ import{A as st,B as at,C as ct,D as ee,E as te,F as lt,H as dt,I as ve,J as pt,K
16
16
  JOIN documents d ON der.document_id = d.id
17
17
  WHERE d.relative_path = ?
18
18
  ${n.symbolNoiseFor("gs")}
19
- ORDER BY der.start_line, der.end_line`,e)}function Vn(n,e){return n.all(`SELECT
19
+ ORDER BY der.start_line, der.end_line`,e)}function or(n,e){return n.all(`SELECT
20
20
  gs.id,
21
21
  gs.symbol,
22
22
  c.document_id,
@@ -37,6 +37,6 @@ import{A as st,B as at,C as ct,D as ee,E as te,F as lt,H as dt,I as ve,J as pt,K
37
37
  AND m.role = 1
38
38
  ${n.symbolNoiseFor("gs")}
39
39
  GROUP BY gs.id, gs.symbol, c.document_id, d.relative_path
40
- ORDER BY start_line, end_line`,e)}function Jn(n){return{symbolId:n.id,symbol:n.symbol,documentId:n.document_id,startLine:n.start_line,startChar:n.start_char??0,endLine:n.end_line,endChar:n.end_char??0,relativePath:n.relative_path,leaf:N(n.symbol),parentTypeName:U(n.symbol),isFunctionLike:Ct(n.symbol),isTypeLike:j(n.symbol)==="type",kind:n.kind??null,documentation:n.documentation??null,enclosingSymbol:n.enclosing_symbol??null}}function Nt(n,e={}){return Qn(n,e.scope)}function Qn(n,e){return $(n,{scope:e,includeIgnored:!1}).flatMap(t=>L(n,t)).filter(t=>!n.isIgnored(t.relativePath))}function Xn(n,e,t){let r=se(n).forFile(e,{text:!0}).text,i=Ve(n,e);return i?ir(t,i,r):r?Zn(t,r):t}function Zn(n,e){let t=e.split(/\r?\n/),r=er(n,t),i=tr(n,r),o=nr(i,t);return rr(n,o)}function er(n,e){let t=n.some(i=>ce(i.symbol))?pr(e):null,r=new Map;for(let i of n)r.set(i.symbolId,dr(e,t,i));return r}function tr(n,e){return n.filter(t=>ce(t.symbol)).map(t=>({definition:t,startLine:e.get(t.symbolId)??t.startLine})).sort((t,r)=>t.startLine-r.startLine||t.definition.startLine-r.definition.startLine||t.definition.symbol.localeCompare(r.definition.symbol))}function nr(n,e){let t=new Map;for(let r=0;r<n.length;r+=1){let i=n[r],o=n[r+1],s=o?Math.max(i.startLine,o.startLine-1):e.length-1;t.set(i.definition.symbolId,{startLine:i.startLine,endLine:ur(e,i.definition,i.startLine,s)})}return t}function rr(n,e){return n.map(t=>{let r=e.get(t.symbolId);return r?{...t,startLine:r.startLine,endLine:r.endLine}:t})}function ir(n,e,t=null){let r=new Map;for(let i of e){let o=r.get(i.name);o?o.push(i):r.set(i.name,[i])}return n.map(i=>{if(!lr(i)||!i.leaf)return kt(i,t);let o=r.get(i.leaf);if(!o||o.length===0)return kt(i,t);let s=t?or(i,o,t):null;if(s)return{...i,startLine:s.startLine,endLine:s.endLine};let a=o[0],c=Math.abs(a.startLine-i.startLine);for(let l=1;l<o.length;l+=1){let d=o[l],p=Math.abs(d.startLine-i.startLine);p<c&&(a=d,c=p)}return{...i,startLine:a.startLine,endLine:a.endLine}})}function or(n,e,t){let r=sr(n.symbol);if(!r)return null;let i=t.split(/\r?\n/),o=new RegExp(`\\b${K(r)}\\b`);for(let s of e){let a=ar(i,s.startLine);if(a&&o.test(a))return s}return null}function sr(n){return n.match(/\/impl#\[([^\]]+)\]/)?.[1]??null}function ar(n,e){for(let t=e;t>=0;t-=1){let r=n[t]?.trim()??"";if(r){if(/^impl\b/.test(r))return cr(n,t,e);if(/^(?:struct|enum|trait|mod)\b/.test(r))return null}}return null}function cr(n,e,t){let r=[];for(let i=e;i<=t;i+=1){let o=n[i]??"";if(r.push(o),o.includes("{"))break}return r.join(" ")}function lr(n){return ce(n.symbol)?!0:j(n.symbol)==="term"&&U(n.symbol)===null}function kt(n,e){if(!e||!n.leaf||j(n.symbol)!=="term"||U(n.symbol)!==null)return n;let t=K(n.leaf),r=new RegExp(`\\b(?:export\\s+)?(?:const|let|var)\\s+${t}\\b`),o=e.split(/\r?\n/).findIndex(s=>r.test(s));return o>=0?{...n,startLine:o,endLine:o}:n}function dr(n,e,t){if(!ce(t.symbol))return t.startLine;let r=Math.max(0,Math.min(t.startLine,n.length-1));if(!e)return r;let i=e.get(t.leaf);if(!i||i.length===0)return r;let o=null;for(let s of i){let a=Math.abs(s-t.startLine);(!o||a<o.distance)&&(o={line:s,distance:a})}return o?.line??r}function pr(n){let e=/\b(?:function|def|fn)\s+([A-Za-z_$][\w$]*)/g,t=/\b([A-Za-z_$][\w$]*)\s*[:=]\s*(?:async\s*)?(?:function\b|\()/g,r=/^\s*(?:(?:export|public|private|protected|static|readonly|async|abstract|get|set)\s+)*([A-Za-z_$][\w$]*)\s*(?:<[^(]*>)?\s*\(/,i=/\b([A-Za-z_$][\w$]*)\s*\(/g,o=new Map,s=(a,c)=>{let l=o.get(a);if(!l){o.set(a,[c]);return}l[l.length-1]!==c&&l.push(c)};for(let a=0;a<n.length;a+=1){let c=n[a]??"";for(let d of c.matchAll(e))d[1]&&s(d[1],a);for(let d of c.matchAll(t))d[1]&&s(d[1],a);let l=c.match(r);l?.[1]&&s(l[1],a);for(let d of c.matchAll(i))d[1]&&s(d[1],a)}return o}function ur(n,e,t,r){let i=Math.max(t,Math.min(n.length-1,r)),o=Math.max(t,Math.min(i,e.endLine)),s=0,a=0,c=!1;for(let l=t;l<=i;l+=1){let d=fr(n[l]??"");for(let p of d)p==="{"?(s+=1,c=!0):p==="}"?s=Math.max(0,s-1):p==="("?a+=1:p===")"&&(a=Math.max(0,a-1));if(c&&s===0||!c&&a===0&&l>=o)return l}return o}function fr(n){let e="",t=null,r=!1;for(let i=0;i<n.length;i+=1){let o=n[i],s=n[i+1];if(!t&&o==="/"&&s==="/"){e+=" ".repeat(n.length-i);break}if(t){if(r){r=!1,e+=" ";continue}if(o==="\\"){r=!0,e+=" ";continue}o===t&&(t=null),e+=" ";continue}if(o==='"'||o==="'"||o==="`"){t=o,e+=" ";continue}e+=o}return e}function ce(n){return n.includes("().")}function T(n,e,t){if(n.has(e))return n.get(e);let r=t();return n.set(e,r),r}import jt from"path";function mr(n,e){return n.getReferences().map(t=>{let r=t.getNode();return le(r,e)})}function hr(n){let e=n;return typeof e.findReferences=="function"?e.findReferences():[]}function Lt(n,e,t,r){let i=[];for(let o of hr(n))for(let s of mr(o,r))s.file===e.relativePath&&s.line>=e.startLine&&s.line<=e.endLine||i.push(s);for(let o of t)i.push(o);return G(i)}function _t(n,e,t,r){let i=[],o=t?.getStart();for(let s of n.getReferences()){let a=s.getNode();B(r,a.getSourceFile().getFilePath())===e&&(o!==void 0&&a.getStart()===o||i.push({location:le(a,r),node:a}))}return i}function le(n,e){let t=n.getSourceFile(),r=t.getLineAndColumnAtPos(n.getStart());return{file:B(e,t.getFilePath())??t.getBaseName(),line:r.line-1,column:r.column-1}}function At(n,e,t){let r=n.getSourceFile(),i=Pe(r,n),o=n.getText(),s=new RegExp(`\\b${K(o)}\\b`,"g"),a=r.getFullText().split(`
41
- `),c=[];for(let l=0;l<a.length;l++){if(l===i)continue;let d=a[l]??"";s.lastIndex=0;let p;for(;(p=s.exec(d))!==null;)c.push({file:e,line:l,column:p.index})}return G(c.filter(l=>B(t,jt.join(t,l.file))===e))}function Te(n){for(let e=n;e;e=e.getParent()){let t=e.getKindName();if(t.includes("Type")||t==="InterfaceDeclaration"||t==="TypeAliasDeclaration")return!0;if(t==="CallExpression"||t==="NewExpression"||t==="ExpressionStatement")return!1}return!1}function Pe(n,e){return n.getLineAndColumnAtPos(e.getStart()).line-1}function G(n){let e=new Set,t=[];for(let r of n){let i=`${r.file}:${r.line}:${r.column}`;e.has(i)||(e.add(i),t.push(r))}return t}function B(n,e){let t=jt.relative(n||process.cwd(),e).replace(/\\/g,"/");return!t||t.startsWith("..")?null:t}function Ot(n,e,t,r){let i=gr(e,r);return i.size===0?new Map:yr(n,t,i)}function gr(n,e){let t=new Map;for(let r of L(n,e)){let i=N(r.symbol)??r.leaf;if(!i)continue;let o=t.get(i);o||(o=[],t.set(i,o)),o.push(r)}return t}function yr(n,e,t){let r=new Map,i=new Map;return e.forEachDescendant(o=>{for(let s of Sr(n,o)){let a=t.get(s);if(!a)continue;let c=Pe(e,o);for(let l of a){if(c<l.startLine-1||c>l.endLine+1)continue;let d=Math.abs(c-l.startLine),p=i.get(l.symbolId);p!==void 0&&p<=d||(i.set(l.symbolId,d),r.set(l.symbolId,o))}}}),r}function Sr(n,e){let t=[],r=i=>{i&&!t.includes(i)&&t.push(i)};if("getNameNode"in e&&typeof e.getNameNode=="function"){let i=e.getNameNode();r(i?.getText())}if("getName"in e&&typeof e.getName=="function"){let i=e.getName();r(i)}return n.Node.isIdentifier(e)&&r(e.getText()),t}var br=z("ts-definition-leaf-candidates",{clearGroups:["definition-catalog"]});function $t(n,e,t,r){let i=Fe(n,e),o=De(i.get(r)??[],t);if(o)return o;let s=[];for(let a of i.values())for(let c of a)((c.leaf||N(c.symbol)||"").includes(r)||c.symbol.includes(r))&&s.push(c);return De(s,t)}function Ce(n,e,t,r){return De(Fe(n,e).get(r)??[],t)}function qt(n,e){let t=new Map;for(let[r,i]of Fe(n,e)){let o=i[0];o&&t.set(r,o)}return t}function Fe(n,e){return br.get(n,e,()=>{let t=new Map;for(let r of L(n,e)){let i=r.leaf||N(r.symbol);if(!i)continue;let o=t.get(i);o||(o=[],t.set(i,o)),o.push({...r,leaf:i})}for(let r of t.values())r.sort((i,o)=>i.startLine-o.startLine||i.endLine-o.endLine||i.symbolId-o.symbolId);return t})}function De(n,e){let t=null,r=Number.POSITIVE_INFINITY;for(let i of n){let o=Math.abs(i.startLine-e);(o<r||o===r&&t&&i.startLine<t.startLine)&&(t=i,r=o)}return t}import we from"path";function Wt(n,e){let t=new Map,r=null,i=null,o=()=>(i??=$(n,{extensions:ee}),i),s=()=>(r??=E("typescript.source-file-index",()=>xr(n.config.projectRoot,e,o()),()=>({projects:e.length,indexedDocuments:o().length})),r),a=c=>te(c)?T(t,c,()=>{let l=Y(we.resolve(n.config.projectRoot,c));for(let{project:d,sourceFiles:p}of s()){let u=p.get(l)??null;if(u||(u=d.addSourceFileAtPathIfExists(l)??null,u&&p.set(Y(u.getFilePath()),u)),u)return{project:d,sourceFile:u}}return null}):null;return{sourceFile:c=>a(c)?.sourceFile??null,sourceFileMatch:a,indexedTypeScriptLikeDocuments:o}}function xr(n,e,t){let r=e.map(({project:i})=>({project:i,sourceFiles:new Map(i.getSourceFiles().map(o=>[Y(o.getFilePath()),o]))}));for(let i of t){let o=Y(we.resolve(n,i));for(let s of r){if(s.sourceFiles.has(o))break;let a=s.project.addSourceFileAtPathIfExists(o)??null;if(a){s.sourceFiles.set(Y(a.getFilePath()),a);break}}}return r}function Y(n){return we.resolve(n)}function ke(n,e){for(let t of n)if(e===t.name||e.startsWith(`${t.name}/`))return t.name;return null}function Ht(n){let e=`${n.relativeDir}/src`;return[`${e}/index.ts`,`${e}/index.tsx`,`${e}/index.mts`,`${e}/index.cts`]}import{existsSync as V,readFileSync as vr}from"fs";import v from"path";var Ee=["tsconfig.json","tsconfig.app.json","tsconfig.node.json","tsconfig.base.json"];function Ne(n,e){let r=e?v.dirname(v.join(n,e)):n,i=v.resolve(n);for(;r.startsWith(i);){for(let s of Ee){let a=v.join(r,s);if(V(a))return a}let o=v.dirname(r);if(o===r)break;r=o}for(let o of Ee){let s=v.join(n,o);if(V(s))return s}return null}function Ut(n){let e=n.config.projectRoot,t=new Set(Ir(e,n.config.semantic?.typescript?.tsconfigs)),r=$(n,{includeIgnored:!1,extensions:ee});for(let i of r){let o=Ne(e,i);o&&t.add(v.resolve(o))}if(t.size===0){let i=Ne(e);i&&t.add(v.resolve(i))}return[...t].filter(i=>!Gt(e,i)).sort((i,o)=>i.localeCompare(o))}function Ir(n,e=[]){let t=new Set;for(let r of e){let i=v.isAbsolute(r)?r:v.join(n,r);V(i)&&t.add(v.resolve(i))}for(let r of Mr(n))for(let i of Ee){let o=v.join(r,i);V(o)&&t.add(v.resolve(o))}if(t.size===0){let r=Ne(n);r&&t.add(v.resolve(r))}return[...t].filter(r=>!Gt(n,r)).sort((r,i)=>r.localeCompare(i))}function Mr(n){let e=v.join(n,"package.json");if(!V(e))return[];let t;try{t=JSON.parse(vr(e,"utf8"))}catch{return[]}return(Array.isArray(t.workspaces)?t.workspaces:t.workspaces?.packages??[]).flatMap(i=>Qe(n,i))}function Gt(n,e){let t=v.relative(n,e).replace(/\\/g,"/");return t.startsWith("..")||t.includes("/node_modules/")||t.startsWith("node_modules/")||t.includes("/dist/")||t.startsWith("dist/")}var Rr=32;function Jt(n,e,t,r={}){return E("typescript.provider.construct",()=>new Le(n,e,t),()=>({tsconfigs:t.length,reusedProjects:r.reusedProjects===!0}))}var Le=class{constructor(e,t,r){this.db=e;this.tsMorph=t;this.projects=r;this.workspacePackages=Je(e.config.projectRoot),this.sourceFiles=Wt(e,r)}db;tsMorph;projects;language="typescript";importUsageCache=new Map;referencesCache=new Map;calleesCache=new Map;fileCalleesCache=new Map;signatureCache=new Map;definitionNodeCache=new Map;fileDefinitionNodeCache=new Map;indexedDefinitionLeafCache=new Map;compilerCheckerCache=new WeakMap;packageImportReferenceIndex=null;packageExportIndex=null;workspacePackages;sourceFiles;availability(){return{available:!0,tsconfigPath:this.projects[0]?.tsconfigPath,tsconfigPaths:this.projects.map(e=>e.tsconfigPath)}}importUsage(e){return T(this.importUsageCache,e,()=>{let t=this.sourceFiles.sourceFile(e);if(!t)return[];let r=Pr();return E("typescript.import-usage.file",()=>this.importUsageForSourceFile(e,t,r),()=>({file:e,...r}))})}referencesFor(e){return T(this.referencesCache,e.symbolId,()=>{let t=this.nodeForDefinition(e);return this.referencesForDefinitionNode(e,t)})}referencesForDefinitions(e,t={}){let r=new Map,i=Z(),o=[];for(let d of e){let p=this.referencesCache.get(d.symbolId);p?r.set(d.symbolId,p):o.push(d)}if(o.length===0)return r;let s=o,a=t.exact?[]:o.filter(d=>!zt(d));if(a.length>=Rr){let d=this.referencesForDefinitionsBySymbolScan(a);for(let p of a){let u=d.get(p.symbolId)??[];this.referencesCache.set(p.symbolId,u),r.set(p.symbolId,u)}if(s=o.filter(p=>zt(p)),s.length===0)return r}let c=new Map;for(let d of s){let p=c.get(d.relativePath);p?p.push(d):c.set(d.relativePath,[d])}let l=[];for(let[d,p]of c){let u=Kt();E("typescript.references-map.file",()=>{let y=this.definitionNodesForFile(d);for(let m of p){i&&(u.cacheMisses+=1);let S=y.get(m.symbolId)??null;i&&(S?u.nodeHits+=1:u.nodeMisses+=1);try{let f=this.referencesForDefinitionNode(m,S,i?u:void 0);this.referencesCache.set(m.symbolId,f),r.set(m.symbolId,f)}catch{u.preciseSearchFailures+=1,l.push(m)}}},()=>({relativePath:d,definitions:p.length,...Yt(u)}))}if(l.length>0){let d=this.referencesForDefinitionsBySymbolScan(l);for(let p of l){let u=d.get(p.symbolId)??[];this.referencesCache.set(p.symbolId,u),r.set(p.symbolId,u)}}return r}referenceFragmentsForFiles(e){let t=Nt(this.db).filter(o=>te(o.relativePath)),r=e.filter(o=>this.sourceFiles.sourceFile(o)!==null),i=this.referencesForDefinitionsBySymbolScan(t,r);return pt(t,i,r)}referencesForDefinitionsBySymbolScan(e,t){let r=Z(),i=Kt(),o=new Map,s=new Set(e.map(c=>c.symbolId)),a=new Map(e.map(c=>[c.symbolId,c]));for(let c of e)o.set(c.symbolId,[]);return E("typescript.references-map.inverted-scan",()=>{let c=r?h.now():0,l=t?this.packageImportReferencesForFiles(t):this.packageImportReferences();for(let f of e){let g=l.get(f.symbolId)??[];if(g.length>0){let M=o.get(f.symbolId)??[];M.push(...g),o.set(f.symbolId,M)}r&&(i.packageReferenceCount+=g.length)}r&&(i.packageRefsMs+=h.now()-c);let d=new Map,p=new Map,u=this.hierarchyTargetsForDefinitions(e),y=new Set(e.map(f=>f.leaf).filter(Boolean)),m=r?h.now():0;for(let f of t??this.sourceFiles.indexedTypeScriptLikeDocuments()){if(this.db.isIgnored(f))continue;let g=this.sourceFiles.sourceFile(f);g&&(r&&(i.scanFiles+=1),this.addReferencesFromSourceFileScan(g,f,s,a,u,y,d,p,o,r?i:void 0))}r&&(i.scanMs+=h.now()-m);let S=r?h.now():0;this.addHierarchyMemberReferences(e,o,r?i:void 0),r&&(i.hierarchyMs+=h.now()-S);for(let[f,g]of o){let M=G(g);o.set(f,M),r&&(i.referenceCount+=M.length)}},()=>({definitions:e.length,...Yt(i)})),o}addReferencesFromSourceFileScan(e,t,r,i,o,s,a,c,l,d){let p=this.compilerCheckerForSourceFile(e),u=e.compilerNode,y=Fr(e),m=S=>{if(this.tsMorph.ts.isIdentifier(S)){if(d&&(d.identifiers+=1),!s.has(S.text)&&!y.has(S.text)){this.tsMorph.ts.forEachChild(S,m);return}let f=this.compilerReferenceSymbol(p,S,d);if(f){let g;a.has(f)?g=a.get(f)??null:(g=this.referenceDefinitionFromCompilerSymbol(f),a.set(f,g)),d&&(g?d.targetHits+=1:d.targetMisses+=1);let M=T(c,f,()=>this.compilerSymbolKeys(f)),D=null,I=null,w=g&&r.has(g.symbolId)?i.get(g.symbolId):void 0;if(w&&(D=je(u,S),!Bt(w,t,D))){let F=u.getLineAndCharacterOfPosition(S.getStart(u));I={file:t,line:F.line,column:F.character};let R=l.get(w.symbolId)??[];R.push(I),l.set(w.symbolId,R),d&&(d.requestedHits+=1)}for(let F of M)for(let R of o.get(F)?.values()??[]){if(D??=je(u,S),Bt(R,t,D))continue;if(!I){let b=u.getLineAndCharacterOfPosition(S.getStart(u));I={file:t,line:b.line,column:b.character}}let x=l.get(R.symbolId)??[];x.push(I),l.set(R.symbolId,x),d&&(d.requestedHits+=1)}}}this.tsMorph.ts.forEachChild(S,m)};m(u)}hierarchyTargetsForDefinitions(e){let t=new Map;for(let r of e){let i=this.nodeForDefinition(r),o=i?.compilerNode;if(!o||!this.isHierarchyMethod(o))continue;let s=o.parent;if(!this.isHierarchyContainer(s))continue;let a=this.compilerCheckerForSourceFile(i.getSourceFile()),c=a.getSymbolAtLocation(o.name);if(c)for(let l of this.hierarchyMemberSymbols(a,s,c))for(let d of this.compilerSymbolKeys(l)){let p=t.get(d)??new Map;p.set(r.symbolId,r),t.set(d,p)}}return t}hierarchyMemberSymbols(e,t,r){let i=new Set,o=new Set,s=(a,c,l)=>{if(!o.has(a)){o.add(a),i.add(c);for(let d of l){let p=d.getProperty(r.name);p&&s(d,p,this.hierarchyAncestorTypesForType(e,d))}}};return s(e.getTypeAtLocation(t),r,this.hierarchyAncestorTypes(e,t)),i}addHierarchyMemberReferences(e,t,r){let i=new Map;for(let o of e){let s=this.nodeForDefinition(o),a=s?.compilerNode;if(!a||!this.isHierarchyMethod(a))continue;let c=a.parent;if(!this.isHierarchyContainer(c))continue;let l=this.compilerCheckerForSourceFile(s.getSourceFile()),d=l.getSymbolAtLocation(a.name);if(!d)continue;let p=a.getSourceFile(),u=p.getLineAndCharacterOfPosition(a.name.getStart(p)),y={definition:o,location:{file:o.relativePath,line:u.line,column:u.character}},m=t.get(o.symbolId)??[];for(let f of this.hierarchyMemberSymbols(l,c,d))if(f!==d)for(let g of this.compilerSymbolLocations(f))m.push(g),r&&(r.hierarchyReferences+=1);t.set(o.symbolId,m);let S=this.hierarchyRootMemberSymbols(l,c,d);for(let f of S){let g=i.get(f)??new Map;g.set(o.symbolId,y),i.set(f,g)}r&&(r.hierarchyDefinitions+=1)}for(let o of i.values())if(!(o.size<2)){r&&(r.hierarchyFamilies+=1);for(let{definition:s}of o.values()){let a=t.get(s.symbolId)??[];for(let c of o.values())c.definition.symbolId!==s.symbolId&&(a.push(c.location),r&&(r.hierarchyReferences+=1));t.set(s.symbolId,a)}}}hierarchyRootMemberSymbols(e,t,r){let i=new Set,o=new Set,s=(a,c,l)=>{if(o.has(a))return;o.add(a);let d=!1;for(let p of l){let u=p.getProperty(r.name);u&&(d=!0,s(p,u,this.hierarchyAncestorTypesForType(e,p)))}if(!d)for(let p of this.compilerSymbolKeys(c))i.add(p)};return s(e.getTypeAtLocation(t),r,this.hierarchyAncestorTypes(e,t)),i}compilerSymbolKeys(e){return(e.declarations??[]).map(t=>{let r=t.getSourceFile();return`${r.fileName}\0${t.getStart(r)}\0${e.name}`})}compilerSymbolLocations(e){let t=[];for(let r of e.declarations??[]){let i=r.getSourceFile(),o=B(this.db.config.projectRoot,i.fileName);if(!o)continue;let s=r.name,a=i.getLineAndCharacterOfPosition((s??r).getStart(i));t.push({file:o,line:a.line,column:a.character})}return t}baseTypes(e,t){try{return e.getBaseTypes(t)??[]}catch{return[]}}hierarchyAncestorTypes(e,t){let r=new Set(this.hierarchyAncestorTypesForType(e,e.getTypeAtLocation(t)));for(let i of t.heritageClauses??[])for(let o of i.types)r.add(e.getTypeAtLocation(o));return[...r]}hierarchyAncestorTypesForType(e,t){let r=new Set(this.baseTypes(e,t));for(let i of t.getSymbol()?.declarations??[])if(this.isHierarchyContainer(i))for(let o of i.heritageClauses??[])for(let s of o.types)r.add(e.getTypeAtLocation(s));return[...r]}isHierarchyMethod(e){return this.tsMorph.ts.isMethodDeclaration(e)||this.tsMorph.ts.isMethodSignature(e)}isHierarchyContainer(e){return this.tsMorph.ts.isClassDeclaration(e)||this.tsMorph.ts.isClassExpression(e)||this.tsMorph.ts.isInterfaceDeclaration(e)}compilerReferenceSymbol(e,t,r){r&&(r.symbolLookups+=1);let i=e.getSymbolAtLocation(t);if(i){if((i.flags&this.tsMorph.ts.SymbolFlags.Alias)===0)return i;try{return r&&(r.aliasResolutions+=1),e.getAliasedSymbol(i)}catch{return i}}}calleesFor(e){return T(this.calleesCache,e.symbolId,()=>T(this.fileCalleesCache,e.relativePath,()=>this.calleeMapForFile(e.relativePath)).get(e.symbolId)??[])}calleesForDefinitions(e){let t=new Map,r=new Map;for(let i of e){let o=r.get(i.relativePath);o?o.push(i):r.set(i.relativePath,[i])}for(let[i,o]of r){let s=this.fileCalleesCache.get(i),a=new Set(o.map(l=>l.symbolId)),c=s??this.calleeMapForFile(i,a);for(let l of o){let d=c.get(l.symbolId)??[];this.calleesCache.set(l.symbolId,d),t.set(l.symbolId,d)}}return t}referencesForDefinitionNode(e,t,r){let i=r?h.now():0,o=this.packageImportReferencesForDefinition(e);if(r&&(r.packageRefsMs+=h.now()-i,r.packageReferenceCount+=o.length),!t)return o;let s=r?h.now():0,a=Lt(t,e,o,this.db.config.projectRoot);return r&&(r.semanticRefsMs+=h.now()-s,r.referenceCount+=a.length),a}signatureFor(e){return T(this.signatureCache,e.symbolId,()=>{let t=this.nodeForDefinition(e);if(!t||!this.tsMorph.Node.isFunctionDeclaration(t)&&!this.tsMorph.Node.isMethodDeclaration(t)&&!this.tsMorph.Node.isArrowFunction(t)&&!this.tsMorph.Node.isFunctionExpression(t)&&!this.tsMorph.Node.isConstructorDeclaration(t))return null;let r=t.getType().getCallSignatures()[0];if(!r)return null;let i=r.getParameters().map(s=>{let a=s.getDeclarations()[0],c=a?s.getTypeAtLocation(a).getText(a):s.getValueDeclaration()?.getType().getText()??"unknown";return Vt(c)}),o=r.getReturnType().getText(t);return`(${i.join(",")})=>${Vt(o)}`})}importUsageForSourceFile(e,t,r){let i=[],o=new Map;for(let s of t.getImportDeclarations()){r.declarations+=1;let a=be(this.db,e,s.getModuleSpecifierValue()),c=s.getImportClause()?.isTypeOnly()??!1;for(let l of _e(s)){r.entries+=1;let d=c?null:l.identifier?.getSymbol()?.compilerSymbol??null;!c&&l.identifier&&(d?r.bindingSymbols+=1:r.missingBindingSymbols+=1);let p={sourcePath:a,entry:l,typeOnlyDeclaration:c,bindingSymbol:d,references:[]};if(i.push(p),c||!l.localName||!d)continue;let u=o.get(l.localName);u?u.push(p):o.set(l.localName,[p])}}return o.size>0&&t.forEachDescendant(s=>{if(s.getKindName()!=="Identifier")return;let a=o.get(s.getText());if(!a||Dr(s))return;r.scannedIdentifiers+=1;let c=s.getSymbol()?.compilerSymbol;if(r.symbolLookups+=1,!!c){for(let l of a)if(l.bindingSymbol===c){l.references.push({location:le(s,this.db.config.projectRoot),node:s}),r.matchedReferences+=1;break}}}),i.map(s=>s.typeOnlyDeclaration?Tr(e,s.sourcePath,s.entry):s.entry.identifier&&!s.bindingSymbol?(r.fallbackEntries+=1,this.valueImportUsageForEntry(e,s.sourcePath,s.entry)):this.valueImportUsageFromLocations(e,s.sourcePath,s.entry,s.references))}valueImportUsageForEntry(e,t,r){let i=r.identifier?r.identifier.findReferences():[],o=[];for(let s of i)for(let a of _t(s,e,r.identifier,this.db.config.projectRoot))o.push(a);return this.valueImportUsageFromLocations(e,t,r,o)}valueImportUsageFromLocations(e,t,r,i){let o=i.some(c=>!Te(c.node)),s=i.some(c=>Te(c.node)),a=r.isTypeOnly;return{importer:e,sourcePath:t,importedName:r.importedName,localName:r.localName,kind:r.kind,isTypeOnly:a,isUsed:a||i.length>0,isTypeUsed:a||s,isValueUsed:o,references:i.map(c=>c.location)}}packageImportReferencesForDefinition(e){return this.packageImportReferences().get(e.symbolId)??[]}packageImportReferencesForFiles(e){let t=new Map,r=new Set;for(let o of e){let s=this.sourceFiles.sourceFile(o);if(s)for(let a of s.getImportDeclarations()){let c=ke(this.workspacePackages,a.getModuleSpecifierValue());c&&r.add(c)}}if(r.size===0)return t;let i=this.packageExportsForNames(r);for(let o of e)this.addPackageImportReferencesForDocument(t,i,o);for(let[o,s]of t)t.set(o,G(s));return t}packageImportReferences(){if(this.packageImportReferenceIndex)return this.packageImportReferenceIndex;let e=new Map,t=this.packageExports();for(let r of this.sourceFiles.indexedTypeScriptLikeDocuments())this.addPackageImportReferencesForDocument(e,t,r);for(let[r,i]of e)e.set(r,G(i));return this.packageImportReferenceIndex=e,e}addPackageImportReferencesForDocument(e,t,r){if(this.db.isIgnored(r))return;let i=this.sourceFiles.sourceFileMatch(r);if(i)for(let o of i.sourceFile.getImportDeclarations())this.addPackageImportReferencesForDeclaration(e,t,r,o)}addPackageImportReferencesForDeclaration(e,t,r,i){let o=ke(this.workspacePackages,i.getModuleSpecifierValue());if(!o)return;let s=t.get(o);if(s)for(let a of _e(i)){if(a.kind!=="named"||!a.identifier)continue;let c=s.get(a.importedName);if(!c||c.size===0)continue;let l=At(a.identifier,r,this.db.config.projectRoot);l.length>0&&Nr(e,c,l)}}packageExports(){return this.packageExportIndex?this.packageExportIndex:(this.packageExportIndex=this.packageExportsForNames(new Set(this.workspacePackages.map(e=>e.name))),this.packageExportIndex)}packageExportsForNames(e){let t=new Map;for(let r of this.workspacePackages){if(!e.has(r.name))continue;let i=new Map;for(let o of Ht(r))this.collectPackageExports(r,o,i,new Set);i.size>0&&t.set(r.name,i)}return t}collectPackageExports(e,t,r,i){if(i.has(t))return;i.add(t);let o=this.sourceFiles.sourceFile(t);if(o)for(let s of o.getExportDeclarations()){let a=s.getModuleSpecifierValue(),c=a?be(this.db,t,a):t;if(!c||!c.startsWith(`${e.relativeDir}/src/`))continue;let l=s.getNamedExports();if(l.length===0){if(s.isNamespaceExport())continue;this.collectPackageExports(e,c,r,i);continue}for(let d of l){let p=d.getNameNode().getText(),u=d.getAliasNode()?.getText()??p,y=this.indexedDefinitionByLeaf(c,p);if(!y)continue;let m=r.get(u);m||(m=new Set,r.set(u,m)),m.add(y.symbolId)}}}indexedDefinitionByLeaf(e,t){return T(this.indexedDefinitionLeafCache,e,()=>qt(this.db,e)).get(t)??null}nodeForDefinition(e){return T(this.definitionNodeCache,e.symbolId,()=>this.definitionNodesForFile(e.relativePath).get(e.symbolId)??null)}definitionNodesForFile(e){return T(this.fileDefinitionNodeCache,e,()=>{let t=this.sourceFiles.sourceFile(e);return t?Ot(this.tsMorph,this.db,t,e):new Map})}referenceDefinitionFromCompilerSymbol(e){return this.definitionFromCompilerSymbol(e,void 0,!0)}definitionFromCompilerSymbol(e,t,r=!1){let i=e.name,o=t?h.now():0,s=e.declarations??[];t&&(t.declarationsMs+=h.now()-o,t.declarationChecks+=s.length);for(let a of s){let c=t?h.now():0,l=a.getSourceFile(),d=B(this.db.config.projectRoot,l.fileName),p=l.getLineAndCharacterOfPosition(a.getStart(l)).line;if(t&&(t.declarationLocationMs+=h.now()-c),!d||this.db.isIgnored(d))continue;let u=t?h.now():0,y=this.compilerDeclarationName(a),m=r?Ce(this.db,d,p,i)??(y&&y!==i?Ce(this.db,d,p,y):null):$t(this.db,d,p,i);if(t&&(t.indexedLookupMs+=h.now()-u),m)return{symbolId:m.symbolId,symbol:m.symbol,file:m.relativePath,line:m.startLine}}return null}compilerDeclarationName(e){let t=e.name;return t&&this.tsMorph.ts.isIdentifier(t)?t.text:null}calleeMapForFile(e,t){let r=Z(),i=0,o=0,s=0,a=0,c=0,l=0,d=0,p=0,u=r?kr():void 0;return E("typescript.callee-map.file",()=>{let y=r?h.now():0,m=this.sourceFiles.sourceFile(e);if(r&&(c=Math.round(h.now()-y)),!m)return new Map;let S=r?h.now():0,f=L(this.db,e).sort((x,b)=>x.startLine-b.startLine||b.endLine-x.endLine);if(r&&(l=Math.round(h.now()-S)),i=f.length,f.length===0)return new Map;let g=new Map,M=r?h.now():0,D=this.compilerCheckerForSourceFile(m),I=m.compilerNode;r&&(d=Math.round(h.now()-M));let w=new Map,F=x=>{if(this.tsMorph.ts.isCallExpression(x)||this.tsMorph.ts.isNewExpression(x)){r&&(o+=1);let b=this.semanticCalleeForCallNode(D,I,f,x,w,t,u);b&&(r&&(s+=1),Cr(g,b.callerId,b.target))}this.tsMorph.ts.forEachChild(x,F)},R=r?h.now():0;F(I),r&&(p=Math.round(h.now()-R));for(let[x,b]of g)g.set(x,jr(b));return a=g.size,g},()=>({relativePath:e,definitions:i,callNodes:o,resolvedCallees:s,outputRows:a,requestedDefinitions:t?.size??i,sourceFileLookupMs:c,definitionsLoadMs:l,checkerLookupMs:d,traversalMs:p,...u?Er(u):{}}))}semanticCalleeForCallNode(e,t,r,i,o,s,a){let c=a?h.now():0,l=wr(r,je(t,i));if(a&&(a.callerLookupMs+=h.now()-c),!l)return null;if(s&&!s.has(l.symbolId))return a&&(a.skippedUnrequestedCallers+=1),null;let d=i.expression,p=this.compilerSymbolForExpression(e,d,a),u=null;if(p)if(a&&(a.targetSymbolHits+=1),o.has(p))a&&(a.compilerSymbolCacheHits+=1),u=o.get(p)??null;else{a&&(a.compilerSymbolCacheMisses+=1);let y=a?h.now():0;u=this.definitionFromCompilerSymbol(p,a),a&&(a.targetLookupMs+=h.now()-y),o.set(p,u)}else a&&(a.targetMisses+=1);return u?{callerId:l.symbolId,target:{symbol:u.symbol,file:u.file,line:u.line}}:null}compilerSymbolForExpression(e,t,r){let i=r?h.now():0,o=e.getSymbolAtLocation(t);if(r&&(r.expressionSymbolMs+=h.now()-i),o)return o;r&&(r.typeFallbacks+=1);let s=r?h.now():0,a=e.getTypeAtLocation(t).getSymbol();return r&&(r.typeSymbolMs+=h.now()-s),a}compilerCheckerForSourceFile(e){let t=e.getProject(),r=this.compilerCheckerCache.get(t);return r||(r=t.getTypeChecker().compilerObject,this.compilerCheckerCache.set(t,r)),r}};function _e(n){let e=[],t=n.getDefaultImport();t&&e.push({identifier:t,importedName:"default",localName:t.getText(),kind:"default",isTypeOnly:n.getImportClause()?.isTypeOnly()??!1});let r=n.getNamespaceImport();r&&e.push({identifier:r,importedName:"*",localName:r.getText(),kind:"namespace",isTypeOnly:n.getImportClause()?.isTypeOnly()??!1});for(let i of n.getNamedImports()){let o=i.getNameNode(),a=i.getAliasNode()??(o.getKindName()==="Identifier"?o:null);e.push({identifier:a,importedName:o.getText(),localName:a?.getText()??o.getText(),kind:"named",isTypeOnly:i.isTypeOnly()||(n.getImportClause()?.isTypeOnly()??!1)})}return e.length===0&&e.push({identifier:null,importedName:"*",localName:null,kind:"side-effect",isTypeOnly:!1}),e}function Tr(n,e,t){return{importer:n,sourcePath:e,importedName:t.importedName,localName:t.localName,kind:t.kind,isTypeOnly:!0,isUsed:!0,isTypeUsed:!0,isValueUsed:!1,references:[]}}function Pr(){return{declarations:0,entries:0,bindingSymbols:0,missingBindingSymbols:0,scannedIdentifiers:0,symbolLookups:0,matchedReferences:0,fallbackEntries:0}}function Dr(n){for(let e=n;e;e=e.getParent())if(e.getKindName()==="ImportDeclaration")return!0;return!1}function Cr(n,e,t){let r=n.get(e);r||(r=[],n.set(e,r)),r.push(t)}function Fr(n){let e=new Set;for(let t of n.getImportDeclarations())for(let r of _e(t))r.localName&&e.add(r.localName);return e}function wr(n,e){let t=null;for(let r of n)e<r.startLine||e>r.endLine||(!t||r.startLine>=t.startLine)&&(t=r);return t}function je(n,e){return n.getLineAndCharacterOfPosition(e.getStart(n)).line}function Bt(n,e,t){return e===n.relativePath&&t>=n.startLine&&t<=n.endLine}function zt(n){return n.symbol.includes("#")?j(n.symbol)==="type"&&n.relativePath.endsWith(".d.ts"):!1}function kr(){return{callerLookupMs:0,expressionSymbolMs:0,typeSymbolMs:0,targetLookupMs:0,declarationsMs:0,declarationLocationMs:0,indexedLookupMs:0,compilerSymbolCacheHits:0,compilerSymbolCacheMisses:0,targetSymbolHits:0,targetMisses:0,typeFallbacks:0,declarationChecks:0,skippedUnrequestedCallers:0}}function Er(n){return{...n,callerLookupMs:Math.round(n.callerLookupMs),expressionSymbolMs:Math.round(n.expressionSymbolMs),typeSymbolMs:Math.round(n.typeSymbolMs),targetLookupMs:Math.round(n.targetLookupMs),declarationsMs:Math.round(n.declarationsMs),declarationLocationMs:Math.round(n.declarationLocationMs),indexedLookupMs:Math.round(n.indexedLookupMs)}}function Kt(){return{cacheHits:0,cacheMisses:0,nodeHits:0,nodeMisses:0,scanFiles:0,identifiers:0,symbolLookups:0,aliasResolutions:0,targetHits:0,targetMisses:0,requestedHits:0,scanMs:0,packageRefsMs:0,semanticRefsMs:0,packageReferenceCount:0,referenceCount:0,preciseSearchFailures:0,hierarchyDefinitions:0,hierarchyFamilies:0,hierarchyReferences:0,hierarchyMs:0}}function Yt(n){return{...n,scanMs:Math.round(n.scanMs),packageRefsMs:Math.round(n.packageRefsMs),semanticRefsMs:Math.round(n.semanticRefsMs),hierarchyMs:Math.round(n.hierarchyMs)}}function Nr(n,e,t){for(let r of e){let i=n.get(r)??[];i.push(...t),n.set(r,i)}}function jr(n){let e=new Set,t=[];for(let r of n){let i=`${r.symbol}|${r.file}|${r.line}`;e.has(i)||(e.add(i),t.push(r))}return t}function Vt(n){return n.replace(/\s+/g," ").replace(/\bimport\("[^"]+"\)\./g,"").trim()}var de=class{loadModule;discoverTsconfigs;createProjects;createProvider;db;module=null;projects=null;provider=null;stats={providerRequests:0,sessionsCreated:0,sessionsReused:0,sessionsRefreshed:0,sessionsReplaced:0,projectsCreated:0};constructor(e,t={}){this.db=e,this.loadModule=t.loadModule??lt,this.discoverTsconfigs=t.discoverTsconfigs??Ut,this.createProjects=t.createProjects??dt,this.createProvider=t.createProvider??((r,i,o)=>Jt(r,i,o,{reusedProjects:!0}))}semanticProvider(){return this.stats.providerRequests+=1,this.provider?(this.stats.sessionsReused+=1,this.provider):this.createSession()}advanceGeneration(e,t){let r=Lr(t);return this.provider?.dispose?.(),this.provider=null,this.db=e,this.projects?r.mode==="replace"?(this.projects=null,this.module=null,this.stats.sessionsReplaced+=1,r):(r.mode==="refresh"&&(_r(this.projects,e.config.projectRoot,r),this.stats.sessionsRefreshed+=1),r):r}snapshotStats(){return{...this.stats}}dispose(){this.provider?.dispose?.(),this.provider=null,this.projects=null,this.module=null}createSession(){let e=this.module??this.loadModule();if(!e)return this.provider=ve("ts-morph is not installed"),this.provider;if(this.module=e,!this.projects){let t=this.discoverTsconfigs(this.db);if(t.length===0)return this.provider=ve("no tsconfig found"),this.provider;this.projects=this.createProjects(e,t),this.stats.projectsCreated+=this.projects.length}return this.provider=this.createProvider(this.db,e,this.projects),this.stats.sessionsCreated+=1,this.provider}};function Lr(n){let e=new Set;n.projectIdentityChanged&&e.add("project-identity-changed");for(let o of n.uncertainty)e.add(o);for(let o of n.changes)o.inputKind!=="source"&&e.add(`${o.inputKind}-input-changed`);if(e.size>0)return{mode:"replace",addedFiles:[],modifiedFiles:[],deletedFiles:[],reasons:[...e].sort()};let t=Ae(n.changes,"added"),r=Ae(n.changes,"modified"),i=Ae(n.changes,"deleted");return{mode:t.length+r.length+i.length===0?"reuse":"refresh",addedFiles:t,modifiedFiles:r,deletedFiles:i,reasons:[]}}function Ae(n,e){return n.filter(t=>t.kind===e).map(t=>t.path).sort()}function _r(n,e,t){for(let r of n){for(let i of t.deletedFiles)r.project.getSourceFile(Qt(e,i))?.forget();for(let i of t.modifiedFiles){let o=r.project.getSourceFile(Qt(e,i));o&&o.refreshFromFileSystemSync()}t.addedFiles.length>0&&r.project.addSourceFilesFromTsConfig(r.tsconfigPath)}}import{createHash as Ar}from"crypto";import{readFileSync as Or}from"fs";import{dirname as $r,join as pe}from"path";var J=2,qr="typescript-semantic";function Zt(n){let e=pe(n,qr);return{rootDir:e,requestDir:pe(e,"requests"),responseDir:pe(e,"responses")}}function en(n){try{let e=JSON.parse(Or(pe($r(n),"meta.json"),"utf8"));return e.version!==2&&e.version!==3||typeof e.status!="string"||typeof e.updatedAt!="string"||e.fingerprint===void 0?null:Ar("sha256").update(JSON.stringify({version:e.version,status:e.status,updatedAt:e.updatedAt,fingerprint:e.fingerprint,indexedLanguages:e.indexedLanguages})).digest("hex")}catch{return null}}function tn(n){let e=JSON.parse(n);if(e.protocolVersion!==J||typeof e.id!="string"||typeof e.generation!="string"||typeof e.deadlineAtMs!="number"||e.profileEnvironment!==void 0&&!Wr(e.profileEnvironment)||!e.request||!Hr(e.request))throw new Error("TypeScript semantic service received an invalid mailbox request.");return e}function Wr(n){return!!n&&typeof n=="object"&&!Array.isArray(n)&&Object.values(n).every(e=>typeof e=="string"||e===null)}function Hr(n){if(!n||typeof n!="object"||!("kind"in n))return!1;let e=n;switch(e.kind){case"availability":return!0;case"import-usage":return typeof e.file=="string";case"reference-fragments":return Xe(e.files)!==null;case"references":return Xt(e.definitions)&&(e.exact===void 0||typeof e.exact=="boolean");case"callees":return Xt(e.definitions);case"signature":return nn(e.definition);default:return!1}}function Xt(n){return Array.isArray(n)&&n.every(nn)}function nn(n){if(!n||typeof n!="object")return!1;let e=n;return typeof e.symbolId=="number"&&typeof e.documentId=="number"&&typeof e.symbol=="string"&&typeof e.relativePath=="string"&&typeof e.leaf=="string"&&typeof e.startLine=="number"&&typeof e.endLine=="number"}var fe=class{openDb;createHost;generationIdentity;readSnapshot;now;db=null;host=null;generation=null;snapshot=null;requests=0;lastRequestAtMs=null;lastError=null;available=null;constructor(e){this.openDb=e.openDb,this.createHost=e.createHost??(t=>new de(t)),this.generationIdentity=e.generationIdentity??en,this.readSnapshot=e.readSnapshot??Kr,this.now=e.now??Date.now}handle(e,t){try{this.syncGeneration(e);let r=this.host.semanticProvider();switch(this.available=r.availability().available,this.requests+=1,this.lastRequestAtMs=this.now(),this.lastError=null,t.kind){case"availability":return r.availability();case"import-usage":return r.importUsage(t.file);case"references":return[...Br(r,t.definitions,{exact:t.exact===!0})];case"reference-fragments":if(!r.referenceFragmentsForFiles)throw new Error("TypeScript provider does not support reference fragments.");return[...r.referenceFragmentsForFiles(t.files)];case"callees":return[...zr(r,t.definitions)];case"signature":return r.signatureFor(t.definition);default:return Vr(t)}}catch(r){throw this.lastError=r instanceof Error?r.message:String(r),r}}status(){let e=this.host?.snapshotStats();return{protocolVersion:J,state:this.lastError?"error":this.host?this.available?"ready":"unavailable":"idle",requests:this.requests,...this.lastRequestAtMs===null?{}:{lastRequestAt:new Date(this.lastRequestAtMs).toISOString()},...this.lastError?{lastError:this.lastError}:{},sessionsCreated:e?.sessionsCreated??0,sessionsReused:e?.sessionsReused??0,sessionsRefreshed:e?.sessionsRefreshed??0,sessionsReplaced:e?.sessionsReplaced??0,projectsCreated:e?.projectsCreated??0}}closeTypeScriptService(){this.host?.dispose(),this.db?.close(),this.host=null,this.db=null,this.generation=null,this.snapshot=null,this.available=null}syncGeneration(e){if(this.generation===e&&this.host&&this.db)return;let t=this.openDb(),r=this.generationIdentity(t.config.dbPath);if(!r||r!==e)throw t.close(),new Error("TypeScript semantic request does not match the currently published index generation.");let i=this.readSnapshot(t.config.dbPath);if(!this.host||!this.db)this.db=t,this.host=this.createHost(t);else{let o=this.db;this.host.advanceGeneration(t,Yr(this.snapshot,i)),this.db=t,o.close()}this.generation=r,this.snapshot=i,this.available=null}};function Oe(n){rn(n.requestDir,{recursive:!0}),rn(n.responseDir,{recursive:!0})}function sn(n,e,t={}){Oe(n);let r=0;for(let i of Ur(n.requestDir).filter(o=>o.endsWith(".json")).sort()){let o=ue(n.requestDir,i),s=i.slice(0,-5),a=null;try{let c=tn(on(o,"utf8"));if(s=c.id,c.deadlineAtMs<(t.nowMs??Date.now()))throw new Error("TypeScript semantic request expired before processing.");a=We(),ge(c.profileEnvironment??{}),t.beforeRequest?.(c.deadlineAtMs);let l=e.handle(c.generation,c.request);O(ue(n.responseDir,`${s}.json`),{ok:!0,protocolVersion:J,id:s,generation:c.generation,response:l})}catch(c){O(ue(n.responseDir,`${s}.json`),{ok:!1,protocolVersion:J,id:s,error:c instanceof Error?c.message:String(c)})}finally{a&&ge(a),t.afterRequest?.(),Gr(o,{force:!0}),r+=1}}return r}function Br(n,e,t){return n.referencesForDefinitions?.(e,t)??new Map(e.map(r=>[r.symbolId,n.referencesFor(r)]))}function zr(n,e){return n.calleesForDefinitions?.(e)??new Map(e.map(t=>[t.symbolId,n.calleesFor(t)]))}function Kr(n){try{let e=JSON.parse(on(ue(n,"..","meta.json"),"utf8"));return ut(e.fingerprint)}catch{return null}}function Yr(n,e){return e?ft(n,e):{version:1,changes:[],projectIdentityChanged:!0,uncertainty:["prior-snapshot-unavailable"]}}function Vr(n){throw new Error(`Unhandled TypeScript semantic request: ${JSON.stringify(n)}`)}import{mkdirSync as an,readFileSync as Jr,readdirSync as Qr,rmSync as Xr}from"fs";import{resolve as me}from"path";var he=class{projectRoot;currentGeneration;createEmitter;now;active=null;requests=0;sessionsCreated=0;sessionsReplaced=0;lastRequestAtMs=null;lastDurationMs=null;lastError=null;unavailable=!1;constructor(e){this.projectRoot=me(e.projectRoot),this.currentGeneration=e.currentGeneration,this.createEmitter=e.createEmitter??gt,this.now=e.now??Date.now}handle(e,t){let r=this.now();try{if(this.currentGeneration()!==e)throw new Error("TypeScript index request does not match the currently published generation.");let i=this.emitterFor(t);if(i.emitter.producerIdentity!==t.producerIdentity)throw new Error("TypeScript index producer identity changed.");let o=i.emitter.snapshotStats(),s=i.emitter.advance({modifiedFiles:t.modifiedFiles,affectedFiles:t.affectedFiles}),a=this.now()-r;return this.requests+=1,this.lastRequestAtMs=this.now(),this.lastDurationMs=a,this.lastError=null,this.unavailable=!1,{producerIdentity:s.producerIdentity,cold:s.stats.initializations>o.initializations,durationMs:a,fragments:s.fragments.map(c=>({relativePath:c.relativePath,bytesBase64:c.bytes===null?null:Buffer.from(c.bytes).toString("base64"),occurrences:c.occurrences,symbols:c.symbols,referenceFragments:c.referenceFragments}))}}catch(i){throw this.lastError=i instanceof Error?i.message:String(i),i}}status(){let e=this.active?.emitter.snapshotStats();return{protocolVersion:re,state:this.unavailable?"unavailable":this.lastError?"error":this.active?"ready":"idle",requests:this.requests,sessionsCreated:this.sessionsCreated,sessionsReplaced:this.sessionsReplaced,initializations:e?.initializations??0,programUpdates:e?.programUpdates??0,documentsEmitted:e?.documentsEmitted??0,documentsRemoved:e?.documentsRemoved??0,...this.lastRequestAtMs===null?{}:{lastRequestAt:new Date(this.lastRequestAtMs).toISOString()},...this.lastDurationMs===null?{}:{lastDurationMs:this.lastDurationMs},...this.lastError?{lastError:this.lastError}:{}}}close(){this.active=null}emitterFor(e){let t=`${e.tsconfigPath}\0${e.projectArgument}`;if(this.active&&this.active.sessionKey===t&&this.active.projectIdentity===e.projectIdentity)return this.active;let r=this.createEmitter({workspaceRoot:this.projectRoot,tsconfigPath:e.tsconfigPath,projectRoot:e.projectArgument});if(!r.available)throw this.unavailable=!0,new Error(r.reason);return this.active&&(this.sessionsReplaced+=1),this.active={sessionKey:t,projectIdentity:e.projectIdentity,emitter:r.emitter},this.sessionsCreated+=1,this.active}};function $e(n){an(n.requestDir,{recursive:!0}),an(n.responseDir,{recursive:!0})}function cn(n,e,t={}){$e(n);let r=0;for(let i of Qr(n.requestDir).filter(o=>o.endsWith(".json")).sort()){let o=me(n.requestDir,i),s=i.slice(0,-5);try{let a=St(Jr(o,"utf8"));if(s=a.id,a.deadlineAtMs<(t.nowMs??Date.now()))throw new Error("TypeScript index request expired before processing.");t.beforeRequest?.(a.deadlineAtMs);let c=e.handle(a.baseGeneration,a.request);O(me(n.responseDir,`${s}.json`),{ok:!0,protocolVersion:re,id:s,baseGeneration:a.baseGeneration,response:c})}catch(a){O(me(n.responseDir,`${s}.json`),{ok:!1,protocolVersion:re,id:s,error:a instanceof Error?a.message:String(a)})}finally{t.afterRequest?.(),Xr(o,{force:!0}),r+=1}}return r}var ei=1e3,ti=250,ni=10;function ri(n){return n==="fresh"?null:{kind:"watch-startup",detail:`index ${n} when watch service started`}}async function ii(n,e,t={}){let r=dn(n),i=W(r);i.watch={...i.watch,...t};let o=ie(i);if(!o.enabled)throw new Error('watch mode is disabled; set "watch.enabled": true before starting the service');let s=H(r,i),a=it(s.cacheDir),c=at(a.lockPath,r);if(!c.acquired)return;let l=Date.now(),d=l,p={state:"idle"},u,y,m=!1,S=!1,f=0,g=0,M=0,D,I,w=Zt(s.cacheDir),F=yt(s.cacheDir);Oe(w),$e(F);let R=new fe({openDb:()=>Tt(r)}),x=new he({projectRoot:r,currentGeneration:()=>bt(s.dbPath)}),b=(k=!1)=>{if(!S)return;let A=Date.now();!k&&A-g<ei||(g=A,ot(a.statePath,{version:1,protocolVersion:rt,pid:P.pid,projectRoot:r,cliVersion:e,startedAt:new Date(l).toISOString(),heartbeatAt:new Date(A).toISOString(),lastActivityAt:new Date(d).toISOString(),...o.idleTimeoutMs===0?{}:{idleDeadlineAt:new Date(d+o.idleTimeoutMs).toISOString()},watcher:p,...u?{lastRefresh:u}:{},...y?{lastError:y}:{},typescriptSemantic:{...R.status(),...D===void 0?{}:{busyUntil:new Date(D).toISOString()}},typescriptIndex:{...x.status(),...I===void 0?{}:{busyUntil:new Date(I).toISOString()}}}))},_=()=>{d=Date.now()},Q=new oe({projectRoot:r,config:{...i,watch:o},languages:i.languages,onStatus(k){p=k,k.state!=="idle"&&_(),b(!0)},onReindexComplete(){_(),u=Re(r,i,s).lastRefresh,y=void 0,b(!0)},onError(k){_(),y={at:new Date().toISOString(),message:k.message},b(!0)}}),X=()=>{m=!0};P.once("SIGINT",X),P.once("SIGTERM",X);try{Q.start();let k=Re(r,i,s);u=k.lastRefresh;let A=ri(k.state);for(A&&Q.requestRefresh(A,{immediate:!0}),_(),S=!0,b(!0);!m;){let pn=cn(F,x,{beforeRequest(C){I=C+5e3,b(!0)},afterRequest(){I=void 0,b(!0)}}),un=sn(w,R,{beforeRequest(C){D=C+5e3,b(!0)},afterRequest(){D=void 0,b(!0)}}),qe=Date.now();if(qe-M>=ti){M=qe;let C=st(a.activityPath);C&&C.atMs>d&&(d=C.atMs),C?.refreshRequestedAtMs!==void 0&&C.refreshRequestedAtMs>f&&(f=C.refreshRequestedAtMs,_(),Q.requestRefresh({kind:"watch-demand",detail:C.refreshDetail??"stale index observed by a command"},{immediate:!0}))}if((un>0||pn>0)&&(_(),b(!0)),b(),ct({watcher:p,lastActivityAtMs:d,nowMs:Date.now(),idleTimeoutMs:o.idleTimeoutMs}))break;await oi(ni)}}finally{P.off("SIGINT",X),P.off("SIGTERM",X),R.closeTypeScriptService(),x.close(),Q.stop(),ln(a.statePath,{force:!0}),ln(a.activityPath,{force:!0}),c.release()}}function oi(n){return new Promise(e=>setTimeout(e,n))}var si=P.argv[1]?Zr(dn(P.argv[1])).href:null;if(si===import.meta.url){let n=P.argv[2],e=P.argv[3],t=ai(P.argv[4]);if(!n||!e)console.error("watch-service: expected <project-root> <cli-version>"),P.exitCode=1;else try{await ii(n,e,t)}catch(r){console.error(`watch-service: ${r instanceof Error?r.message:String(r)}`),P.exitCode=1}}function ai(n){if(!n)return{};try{let e=JSON.parse(n);return e&&typeof e=="object"?e:{}}catch{return{}}}export{ii as runWatchServiceServer,ri as startupRefreshTrigger};
40
+ ORDER BY start_line, end_line`,e)}function sr(n){return{symbolId:n.id,symbol:n.symbol,documentId:n.document_id,startLine:n.start_line,startChar:n.start_char??0,endLine:n.end_line,endChar:n.end_char??0,relativePath:n.relative_path,leaf:A(n.symbol),parentTypeName:U(n.symbol),isFunctionLike:Bt(n.symbol),isTypeLike:_(n.symbol)==="type",kind:n.kind??null,documentation:n.documentation??null,enclosingSymbol:n.enclosing_symbol??null}}function Kt(n,e={}){return ar(n,e.scope)}function ar(n,e){return q(n,{scope:e,includeIgnored:!1}).flatMap(t=>O(n,t)).filter(t=>!n.isIgnored(t.relativePath))}function cr(n,e,t){let r=ue(n).forFile(e,{text:!0}).text,i=pt(n,e);return i?mr(t,i,r):r?lr(t,r):t}function lr(n,e){let t=e.split(/\r?\n/),r=dr(n,t),i=pr(n,r),o=ur(i,t);return fr(n,o)}function dr(n,e){let t=n.some(i=>me(i.symbol))?Ir(e):null,r=new Map;for(let i of n)r.set(i.symbolId,xr(e,t,i));return r}function pr(n,e){return n.filter(t=>me(t.symbol)).map(t=>({definition:t,startLine:e.get(t.symbolId)??t.startLine})).sort((t,r)=>t.startLine-r.startLine||t.definition.startLine-r.definition.startLine||t.definition.symbol.localeCompare(r.definition.symbol))}function ur(n,e){let t=new Map;for(let r=0;r<n.length;r+=1){let i=n[r],o=n[r+1],a=o?Math.max(i.startLine,o.startLine-1):e.length-1;t.set(i.definition.symbolId,{startLine:i.startLine,endLine:vr(e,i.definition,i.startLine,a)})}return t}function fr(n,e){return n.map(t=>{let r=e.get(t.symbolId);return r?{...t,startLine:r.startLine,endLine:r.endLine}:t})}function mr(n,e,t=null){let r=new Map;for(let i of e){let o=r.get(i.name);o?o.push(i):r.set(i.name,[i])}return n.map(i=>{if(!br(i)||!i.leaf)return Jt(i,t);let o=r.get(i.leaf);if(!o||o.length===0)return Jt(i,t);let a=t?hr(i,o,t):null;if(a)return{...i,startLine:a.startLine,endLine:a.endLine};let s=o[0],c=Math.abs(s.startLine-i.startLine);for(let l=1;l<o.length;l+=1){let d=o[l],p=Math.abs(d.startLine-i.startLine);p<c&&(s=d,c=p)}return{...i,startLine:s.startLine,endLine:s.endLine}})}function hr(n,e,t){let r=gr(n.symbol);if(!r)return null;let i=t.split(/\r?\n/),o=new RegExp(`\\b${Q(r)}\\b`);for(let a of e){let s=yr(i,a.startLine);if(s&&o.test(s))return a}return null}function gr(n){return n.match(/\/impl#\[([^\]]+)\]/)?.[1]??null}function yr(n,e){for(let t=e;t>=0;t-=1){let r=n[t]?.trim()??"";if(r){if(/^impl\b/.test(r))return Sr(n,t,e);if(/^(?:struct|enum|trait|mod)\b/.test(r))return null}}return null}function Sr(n,e,t){let r=[];for(let i=e;i<=t;i+=1){let o=n[i]??"";if(r.push(o),o.includes("{"))break}return r.join(" ")}function br(n){return me(n.symbol)?!0:_(n.symbol)==="term"&&U(n.symbol)===null}function Jt(n,e){if(!e||!n.leaf||_(n.symbol)!=="term"||U(n.symbol)!==null)return n;let t=Q(n.leaf),r=new RegExp(`\\b(?:export\\s+)?(?:const|let|var)\\s+${t}\\b`),o=e.split(/\r?\n/).findIndex(a=>r.test(a));return o>=0?{...n,startLine:o,endLine:o}:n}function xr(n,e,t){if(!me(t.symbol))return t.startLine;let r=Math.max(0,Math.min(t.startLine,n.length-1));if(!e)return r;let i=e.get(t.leaf);if(!i||i.length===0)return r;let o=null;for(let a of i){let s=Math.abs(a-t.startLine);(!o||s<o.distance)&&(o={line:a,distance:s})}return o?.line??r}function Ir(n){let e=/\b(?:function|def|fn)\s+([A-Za-z_$][\w$]*)/g,t=/\b([A-Za-z_$][\w$]*)\s*[:=]\s*(?:async\s*)?(?:function\b|\()/g,r=/^\s*(?:(?:export|public|private|protected|static|readonly|async|abstract|get|set)\s+)*([A-Za-z_$][\w$]*)\s*(?:<[^(]*>)?\s*\(/,i=/\b([A-Za-z_$][\w$]*)\s*\(/g,o=new Map,a=(s,c)=>{let l=o.get(s);if(!l){o.set(s,[c]);return}l[l.length-1]!==c&&l.push(c)};for(let s=0;s<n.length;s+=1){let c=n[s]??"";for(let d of c.matchAll(e))d[1]&&a(d[1],s);for(let d of c.matchAll(t))d[1]&&a(d[1],s);let l=c.match(r);l?.[1]&&a(l[1],s);for(let d of c.matchAll(i))d[1]&&a(d[1],s)}return o}function vr(n,e,t,r){let i=Math.max(t,Math.min(n.length-1,r)),o=Math.max(t,Math.min(i,e.endLine)),a=0,s=0,c=!1;for(let l=t;l<=i;l+=1){let d=Rr(n[l]??"");for(let p of d)p==="{"?(a+=1,c=!0):p==="}"?a=Math.max(0,a-1):p==="("?s+=1:p===")"&&(s=Math.max(0,s-1));if(c&&a===0||!c&&s===0&&l>=o)return l}return o}function Rr(n){let e="",t=null,r=!1;for(let i=0;i<n.length;i+=1){let o=n[i],a=n[i+1];if(!t&&o==="/"&&a==="/"){e+=" ".repeat(n.length-i);break}if(t){if(r){r=!1,e+=" ";continue}if(o==="\\"){r=!0,e+=" ";continue}o===t&&(t=null),e+=" ";continue}if(o==='"'||o==="'"||o==="`"){t=o,e+=" ";continue}e+=o}return e}function me(n){return n.includes("().")}function D(n,e,t){if(n.has(e))return n.get(e);let r=t();return n.set(e,r),r}import Qt from"path";function Mr(n,e){return n.getReferences().map(t=>{let r=t.getNode();return he(r,e)})}function Dr(n){let e=n;return typeof e.findReferences=="function"?e.findReferences():[]}function Yt(n,e,t,r){let i=[];for(let o of Dr(n))for(let a of Mr(o,r))a.file===e.relativePath&&a.line>=e.startLine&&a.line<=e.endLine||i.push(a);for(let o of t)i.push(o);return z(i)}function Xt(n,e,t,r){let i=[],o=t?.getStart();for(let a of n.getReferences()){let s=a.getNode();J(r,s.getSourceFile().getFilePath())===e&&(o!==void 0&&s.getStart()===o||i.push({location:he(s,r),node:s}))}return i}function he(n,e){let t=n.getSourceFile(),r=t.getLineAndColumnAtPos(n.getStart());return{file:J(e,t.getFilePath())??t.getBaseName(),line:r.line-1,column:r.column-1}}function Zt(n,e,t){let r=n.getSourceFile(),i=Ne(r,n),o=n.getText(),a=new RegExp(`\\b${Q(o)}\\b`,"g"),s=r.getFullText().split(`
41
+ `),c=[];for(let l=0;l<s.length;l++){if(l===i)continue;let d=s[l]??"";a.lastIndex=0;let p;for(;(p=a.exec(d))!==null;)c.push({file:e,line:l,column:p.index})}return z(c.filter(l=>J(t,Qt.join(t,l.file))===e))}function Le(n){for(let e=n;e;e=e.getParent()){let t=e.getKindName();if(t.includes("Type")||t==="InterfaceDeclaration"||t==="TypeAliasDeclaration")return!0;if(t==="CallExpression"||t==="NewExpression"||t==="ExpressionStatement")return!1}return!1}function Ne(n,e){return n.getLineAndColumnAtPos(e.getStart()).line-1}function z(n){let e=new Set,t=[];for(let r of n){let i=`${r.file}:${r.line}:${r.column}`;e.has(i)||(e.add(i),t.push(r))}return t}function J(n,e){let t=Qt.relative(n||process.cwd(),e).replace(/\\/g,"/");return!t||t.startsWith("..")?null:t}function en(n,e,t,r){let i=Tr(e,r);return i.size===0?new Map:Pr(n,t,i)}function Tr(n,e){let t=new Map;for(let r of O(n,e)){let i=A(r.symbol)??r.leaf;if(!i)continue;let o=t.get(i);o||(o=[],t.set(i,o)),o.push(r)}return t}function Pr(n,e,t){let r=new Map,i=new Map;return e.forEachDescendant(o=>{for(let a of Cr(n,o)){let s=t.get(a);if(!s)continue;let c=Ne(e,o);for(let l of s){if(c<l.startLine-1||c>l.endLine+1)continue;let d=Math.abs(c-l.startLine),p=i.get(l.symbolId);p!==void 0&&p<=d||(i.set(l.symbolId,d),r.set(l.symbolId,o))}}}),r}function Cr(n,e){let t=[],r=i=>{i&&!t.includes(i)&&t.push(i)};if("getNameNode"in e&&typeof e.getNameNode=="function"){let i=e.getNameNode();r(i?.getText())}if("getName"in e&&typeof e.getName=="function"){let i=e.getName();r(i)}return n.Node.isIdentifier(e)&&r(e.getText()),t}var kr=K("ts-definition-leaf-candidates",{clearGroups:["definition-catalog"]});function tn(n,e,t,r){let i=_e(n,e),o=je(i.get(r)??[],t);if(o)return o;let a=[];for(let s of i.values())for(let c of s)((c.leaf||A(c.symbol)||"").includes(r)||c.symbol.includes(r))&&a.push(c);return je(a,t)}function Ae(n,e,t,r){return je(_e(n,e).get(r)??[],t)}function nn(n,e){let t=new Map;for(let[r,i]of _e(n,e)){let o=i[0];o&&t.set(r,o)}return t}function _e(n,e){return kr.get(n,e,()=>{let t=new Map;for(let r of O(n,e)){let i=r.leaf||A(r.symbol);if(!i)continue;let o=t.get(i);o||(o=[],t.set(i,o)),o.push({...r,leaf:i})}for(let r of t.values())r.sort((i,o)=>i.startLine-o.startLine||i.endLine-o.endLine||i.symbolId-o.symbolId);return t})}function je(n,e){let t=null,r=Number.POSITIVE_INFINITY;for(let i of n){let o=Math.abs(i.startLine-e);(o<r||o===r&&t&&i.startLine<t.startLine)&&(t=i,r=o)}return t}import Oe from"path";function rn(n,e){let t=new Map,r=null,i=null,o=()=>(i??=q(n,{extensions:se}),i),a=()=>(r??=N("typescript.source-file-index",()=>Fr(n.config.projectRoot,e,o()),()=>({projects:e.length,indexedDocuments:o().length})),r),s=c=>ae(c)?D(t,c,()=>{let l=Y(Oe.resolve(n.config.projectRoot,c));for(let{project:d,sourceFiles:p}of a()){let u=p.get(l)??null;if(u||(u=d.addSourceFileAtPathIfExists(l)??null,u&&p.set(Y(u.getFilePath()),u)),u)return{project:d,sourceFile:u}}return null}):null;return{sourceFile:c=>s(c)?.sourceFile??null,sourceFileMatch:s,indexedTypeScriptLikeDocuments:o}}function Fr(n,e,t){let r=e.map(({project:i})=>({project:i,sourceFiles:new Map(i.getSourceFiles().map(o=>[Y(o.getFilePath()),o]))}));for(let i of t){let o=Y(Oe.resolve(n,i));for(let a of r){if(a.sourceFiles.has(o))break;let s=a.project.addSourceFileAtPathIfExists(o)??null;if(s){a.sourceFiles.set(Y(s.getFilePath()),s);break}}}return r}function Y(n){return Oe.resolve(n)}function Ge(n,e){for(let t of n)if(e===t.name||e.startsWith(`${t.name}/`))return t.name;return null}function on(n){let e=`${n.relativeDir}/src`;return[`${e}/index.ts`,`${e}/index.tsx`,`${e}/index.mts`,`${e}/index.cts`]}import{existsSync as X,readFileSync as wr}from"fs";import x from"path";var We=["tsconfig.json","tsconfig.app.json","tsconfig.node.json","tsconfig.base.json"];function $e(n,e){let r=e?x.dirname(x.join(n,e)):n,i=x.resolve(n);for(;r.startsWith(i);){for(let a of We){let s=x.join(r,a);if(X(s))return s}let o=x.dirname(r);if(o===r)break;r=o}for(let o of We){let a=x.join(n,o);if(X(a))return a}return null}function sn(n){let e=n.config.projectRoot,t=new Set(Er(e,n.config.semantic?.typescript?.tsconfigs)),r=q(n,{includeIgnored:!1,extensions:se});for(let i of r){let o=$e(e,i);o&&t.add(x.resolve(o))}if(t.size===0){let i=$e(e);i&&t.add(x.resolve(i))}return[...t].filter(i=>!an(e,i)).sort((i,o)=>i.localeCompare(o))}function Er(n,e=[]){let t=new Set;for(let r of e){let i=x.isAbsolute(r)?r:x.join(n,r);X(i)&&t.add(x.resolve(i))}for(let r of Lr(n))for(let i of We){let o=x.join(r,i);X(o)&&t.add(x.resolve(o))}if(t.size===0){let r=$e(n);r&&t.add(x.resolve(r))}return[...t].filter(r=>!an(n,r)).sort((r,i)=>r.localeCompare(i))}function Lr(n){let e=x.join(n,"package.json");if(!X(e))return[];let t;try{t=JSON.parse(wr(e,"utf8"))}catch{return[]}return(Array.isArray(t.workspaces)?t.workspaces:t.workspaces?.packages??[]).flatMap(i=>ft(n,i))}function an(n,e){let t=x.relative(n,e).replace(/\\/g,"/");return t.startsWith("..")||t.includes("/node_modules/")||t.startsWith("node_modules/")||t.includes("/dist/")||t.startsWith("dist/")}var Nr=32;function fn(n,e,t,r={}){return N("typescript.provider.construct",()=>new He(n,e,t),()=>({tsconfigs:t.length,reusedProjects:r.reusedProjects===!0}))}var He=class{constructor(e,t,r){this.db=e;this.tsMorph=t;this.projects=r;this.workspacePackages=ut(e.config.projectRoot),this.sourceFiles=rn(e,r)}db;tsMorph;projects;language="typescript";importUsageCache=new Map;referencesCache=new Map;calleesCache=new Map;fileCalleesCache=new Map;signatureCache=new Map;definitionNodeCache=new Map;fileDefinitionNodeCache=new Map;indexedDefinitionLeafCache=new Map;compilerCheckerCache=new WeakMap;packageImportReferenceIndex=null;packageExportIndex=null;workspacePackages;sourceFiles;availability(){return{available:!0,tsconfigPath:this.projects[0]?.tsconfigPath,tsconfigPaths:this.projects.map(e=>e.tsconfigPath)}}importUsage(e){return D(this.importUsageCache,e,()=>{let t=this.sourceFiles.sourceFile(e);if(!t)return[];let r=Ar();return N("typescript.import-usage.file",()=>this.importUsageForSourceFile(e,t,r),()=>({file:e,...r}))})}referencesFor(e){return D(this.referencesCache,e.symbolId,()=>{let t=this.nodeForDefinition(e);return this.referencesForDefinitionNode(e,t)})}referencesForDefinitions(e,t={}){let r=new Map,i=ie(),o=[];for(let d of e){let p=this.referencesCache.get(d.symbolId);p?r.set(d.symbolId,p):o.push(d)}if(o.length===0)return r;let a=o,s=t.exact?[]:o.filter(d=>!ln(d));if(s.length>=Nr){let d=this.referencesForDefinitionsBySymbolScan(s);for(let p of s){let u=d.get(p.symbolId)??[];this.referencesCache.set(p.symbolId,u),r.set(p.symbolId,u)}if(a=o.filter(p=>ln(p)),a.length===0)return r}let c=new Map;for(let d of a){let p=c.get(d.relativePath);p?p.push(d):c.set(d.relativePath,[d])}let l=[];for(let[d,p]of c){let u=dn();N("typescript.references-map.file",()=>{let g=this.definitionNodesForFile(d);for(let f of p){i&&(u.cacheMisses+=1);let m=g.get(f.symbolId)??null;i&&(m?u.nodeHits+=1:u.nodeMisses+=1);try{let h=this.referencesForDefinitionNode(f,m,i?u:void 0);this.referencesCache.set(f.symbolId,h),r.set(f.symbolId,h)}catch{u.preciseSearchFailures+=1,l.push(f)}}},()=>({relativePath:d,definitions:p.length,...pn(u)}))}if(l.length>0){let d=this.referencesForDefinitionsBySymbolScan(l);for(let p of l){let u=d.get(p.symbolId)??[];this.referencesCache.set(p.symbolId,u),r.set(p.symbolId,u)}}return r}referenceFragmentsForFiles(e){let t=Kt(this.db).filter(o=>ae(o.relativePath)),r=e.filter(o=>this.sourceFiles.sourceFile(o)!==null),i=this.referencesForDefinitionsBySymbolScan(t,r);return Tt(t,i,r)}referencesForDefinitionsBySymbolScan(e,t){let r=ie(),i=dn(),o=new Map,a=new Set(e.map(c=>c.symbolId)),s=new Map(e.map(c=>[c.symbolId,c]));for(let c of e)o.set(c.symbolId,[]);return N("typescript.references-map.inverted-scan",()=>{let c=r?y.now():0,l=t?this.packageImportReferencesForFiles(t):this.packageImportReferences();for(let h of e){let S=l.get(h.symbolId)??[];if(S.length>0){let M=o.get(h.symbolId)??[];M.push(...S),o.set(h.symbolId,M)}r&&(i.packageReferenceCount+=S.length)}r&&(i.packageRefsMs+=y.now()-c);let d=new Map,p=new Map,u=this.hierarchyTargetsForDefinitions(e),g=new Set(e.map(h=>h.leaf).filter(Boolean)),f=r?y.now():0;for(let h of t??this.sourceFiles.indexedTypeScriptLikeDocuments()){if(this.db.isIgnored(h))continue;let S=this.sourceFiles.sourceFile(h);S&&(r&&(i.scanFiles+=1),this.addReferencesFromSourceFileScan(S,h,a,s,u,g,d,p,o,r?i:void 0))}r&&(i.scanMs+=y.now()-f);let m=r?y.now():0;this.addHierarchyMemberReferences(e,o,r?i:void 0),r&&(i.hierarchyMs+=y.now()-m);for(let[h,S]of o){let M=z(S);o.set(h,M),r&&(i.referenceCount+=M.length)}},()=>({definitions:e.length,...pn(i)})),o}addReferencesFromSourceFileScan(e,t,r,i,o,a,s,c,l,d){let p=this.compilerCheckerForSourceFile(e),u=e.compilerNode,g=Gr(e),f=m=>{if(this.tsMorph.ts.isIdentifier(m)){if(d&&(d.identifiers+=1),!a.has(m.text)&&!g.has(m.text)){this.tsMorph.ts.forEachChild(m,f);return}let h=this.compilerReferenceSymbol(p,m,d);if(h){let S;s.has(h)?S=s.get(h)??null:(S=this.referenceDefinitionFromCompilerSymbol(h),s.set(h,S)),d&&(S?d.targetHits+=1:d.targetMisses+=1);let M=D(c,h,()=>this.compilerSymbolKeys(h)),E=null,R=null,P=S&&r.has(S.symbolId)?i.get(S.symbolId):void 0;if(P&&(E=qe(u,m),!cn(P,t,E))){let F=u.getLineAndCharacterOfPosition(m.getStart(u));R={file:t,line:F.line,column:F.character};let C=l.get(P.symbolId)??[];C.push(R),l.set(P.symbolId,C),d&&(d.requestedHits+=1)}for(let F of M)for(let C of o.get(F)?.values()??[]){if(E??=qe(u,m),cn(C,t,E))continue;if(!R){let I=u.getLineAndCharacterOfPosition(m.getStart(u));R={file:t,line:I.line,column:I.character}}let b=l.get(C.symbolId)??[];b.push(R),l.set(C.symbolId,b),d&&(d.requestedHits+=1)}}}this.tsMorph.ts.forEachChild(m,f)};f(u)}hierarchyTargetsForDefinitions(e){let t=new Map;for(let r of e){let i=this.nodeForDefinition(r),o=i?.compilerNode;if(!o||!this.isHierarchyMethod(o))continue;let a=o.parent;if(!this.isHierarchyContainer(a))continue;let s=this.compilerCheckerForSourceFile(i.getSourceFile()),c=s.getSymbolAtLocation(o.name);if(c)for(let l of this.hierarchyMemberSymbols(s,a,c))for(let d of this.compilerSymbolKeys(l)){let p=t.get(d)??new Map;p.set(r.symbolId,r),t.set(d,p)}}return t}hierarchyMemberSymbols(e,t,r){let i=new Set,o=new Set,a=(s,c,l)=>{if(!o.has(s)){o.add(s),i.add(c);for(let d of l){let p=d.getProperty(r.name);p&&a(d,p,this.hierarchyAncestorTypesForType(e,d))}}};return a(e.getTypeAtLocation(t),r,this.hierarchyAncestorTypes(e,t)),i}addHierarchyMemberReferences(e,t,r){let i=new Map;for(let o of e){let a=this.nodeForDefinition(o),s=a?.compilerNode;if(!s||!this.isHierarchyMethod(s))continue;let c=s.parent;if(!this.isHierarchyContainer(c))continue;let l=this.compilerCheckerForSourceFile(a.getSourceFile()),d=l.getSymbolAtLocation(s.name);if(!d)continue;let p=s.getSourceFile(),u=p.getLineAndCharacterOfPosition(s.name.getStart(p)),g={definition:o,location:{file:o.relativePath,line:u.line,column:u.character}},f=t.get(o.symbolId)??[];for(let h of this.hierarchyMemberSymbols(l,c,d))if(h!==d)for(let S of this.compilerSymbolLocations(h))f.push(S),r&&(r.hierarchyReferences+=1);t.set(o.symbolId,f);let m=this.hierarchyRootMemberSymbols(l,c,d);for(let h of m){let S=i.get(h)??new Map;S.set(o.symbolId,g),i.set(h,S)}r&&(r.hierarchyDefinitions+=1)}for(let o of i.values())if(!(o.size<2)){r&&(r.hierarchyFamilies+=1);for(let{definition:a}of o.values()){let s=t.get(a.symbolId)??[];for(let c of o.values())c.definition.symbolId!==a.symbolId&&(s.push(c.location),r&&(r.hierarchyReferences+=1));t.set(a.symbolId,s)}}}hierarchyRootMemberSymbols(e,t,r){let i=new Set,o=new Set,a=(s,c,l)=>{if(o.has(s))return;o.add(s);let d=!1;for(let p of l){let u=p.getProperty(r.name);u&&(d=!0,a(p,u,this.hierarchyAncestorTypesForType(e,p)))}if(!d)for(let p of this.compilerSymbolKeys(c))i.add(p)};return a(e.getTypeAtLocation(t),r,this.hierarchyAncestorTypes(e,t)),i}compilerSymbolKeys(e){return(e.declarations??[]).map(t=>{let r=t.getSourceFile();return`${r.fileName}\0${t.getStart(r)}\0${e.name}`})}compilerSymbolLocations(e){let t=[];for(let r of e.declarations??[]){let i=r.getSourceFile(),o=J(this.db.config.projectRoot,i.fileName);if(!o)continue;let a=r.name,s=i.getLineAndCharacterOfPosition((a??r).getStart(i));t.push({file:o,line:s.line,column:s.character})}return t}baseTypes(e,t){try{return e.getBaseTypes(t)??[]}catch{return[]}}hierarchyAncestorTypes(e,t){let r=new Set(this.hierarchyAncestorTypesForType(e,e.getTypeAtLocation(t)));for(let i of t.heritageClauses??[])for(let o of i.types)r.add(e.getTypeAtLocation(o));return[...r]}hierarchyAncestorTypesForType(e,t){let r=new Set(this.baseTypes(e,t));for(let i of t.getSymbol()?.declarations??[])if(this.isHierarchyContainer(i))for(let o of i.heritageClauses??[])for(let a of o.types)r.add(e.getTypeAtLocation(a));return[...r]}isHierarchyMethod(e){return this.tsMorph.ts.isMethodDeclaration(e)||this.tsMorph.ts.isMethodSignature(e)}isHierarchyContainer(e){return this.tsMorph.ts.isClassDeclaration(e)||this.tsMorph.ts.isClassExpression(e)||this.tsMorph.ts.isInterfaceDeclaration(e)}compilerReferenceSymbol(e,t,r){r&&(r.symbolLookups+=1);let i=e.getSymbolAtLocation(t);if(i){if((i.flags&this.tsMorph.ts.SymbolFlags.Alias)===0)return i;try{return r&&(r.aliasResolutions+=1),e.getAliasedSymbol(i)}catch{return i}}}calleesFor(e){return D(this.calleesCache,e.symbolId,()=>D(this.fileCalleesCache,e.relativePath,()=>this.calleeMapForFile(e.relativePath)).get(e.symbolId)??[])}calleesForDefinitions(e){let t=new Map,r=new Map;for(let i of e){let o=r.get(i.relativePath);o?o.push(i):r.set(i.relativePath,[i])}for(let[i,o]of r){let a=this.fileCalleesCache.get(i),s=new Set(o.map(l=>l.symbolId)),c=a??this.calleeMapForFile(i,s);for(let l of o){let d=c.get(l.symbolId)??[];this.calleesCache.set(l.symbolId,d),t.set(l.symbolId,d)}}return t}referencesForDefinitionNode(e,t,r){let i=r?y.now():0,o=this.packageImportReferencesForDefinition(e);if(r&&(r.packageRefsMs+=y.now()-i,r.packageReferenceCount+=o.length),!t)return o;let a=r?y.now():0,s=Yt(t,e,o,this.db.config.projectRoot);return r&&(r.semanticRefsMs+=y.now()-a,r.referenceCount+=s.length),s}signatureFor(e){return D(this.signatureCache,e.symbolId,()=>{let t=this.nodeForDefinition(e);if(!t||!this.tsMorph.Node.isFunctionDeclaration(t)&&!this.tsMorph.Node.isMethodDeclaration(t)&&!this.tsMorph.Node.isArrowFunction(t)&&!this.tsMorph.Node.isFunctionExpression(t)&&!this.tsMorph.Node.isConstructorDeclaration(t))return null;let r=t.getType().getCallSignatures()[0];if(!r)return null;let i=r.getParameters().map(a=>{let s=a.getDeclarations()[0],c=s?a.getTypeAtLocation(s).getText(s):a.getValueDeclaration()?.getType().getText()??"unknown";return un(c)}),o=r.getReturnType().getText(t);return`(${i.join(",")})=>${un(o)}`})}importUsageForSourceFile(e,t,r){let i=[],o=new Map;for(let a of t.getImportDeclarations()){r.declarations+=1;let s=Pe(this.db,e,a.getModuleSpecifierValue()),c=a.getImportClause()?.isTypeOnly()??!1;for(let l of Be(a)){r.entries+=1;let d=c?null:l.identifier?.getSymbol()?.compilerSymbol??null;!c&&l.identifier&&(d?r.bindingSymbols+=1:r.missingBindingSymbols+=1);let p={sourcePath:s,entry:l,typeOnlyDeclaration:c,bindingSymbol:d,references:[]};if(i.push(p),c||!l.localName||!d)continue;let u=o.get(l.localName);u?u.push(p):o.set(l.localName,[p])}}return o.size>0&&t.forEachDescendant(a=>{if(a.getKindName()!=="Identifier")return;let s=o.get(a.getText());if(!s||_r(a))return;r.scannedIdentifiers+=1;let c=a.getSymbol()?.compilerSymbol;if(r.symbolLookups+=1,!!c){for(let l of s)if(l.bindingSymbol===c){l.references.push({location:he(a,this.db.config.projectRoot),node:a}),r.matchedReferences+=1;break}}}),i.map(a=>a.typeOnlyDeclaration?jr(e,a.sourcePath,a.entry):a.entry.identifier&&!a.bindingSymbol?(r.fallbackEntries+=1,this.valueImportUsageForEntry(e,a.sourcePath,a.entry)):this.valueImportUsageFromLocations(e,a.sourcePath,a.entry,a.references))}valueImportUsageForEntry(e,t,r){let i=r.identifier?r.identifier.findReferences():[],o=[];for(let a of i)for(let s of Xt(a,e,r.identifier,this.db.config.projectRoot))o.push(s);return this.valueImportUsageFromLocations(e,t,r,o)}valueImportUsageFromLocations(e,t,r,i){let o=i.some(c=>!Le(c.node)),a=i.some(c=>Le(c.node)),s=r.isTypeOnly;return{importer:e,sourcePath:t,importedName:r.importedName,localName:r.localName,kind:r.kind,isTypeOnly:s,isUsed:s||i.length>0,isTypeUsed:s||a,isValueUsed:o,references:i.map(c=>c.location)}}packageImportReferencesForDefinition(e){return this.packageImportReferences().get(e.symbolId)??[]}packageImportReferencesForFiles(e){let t=new Map,r=new Set;for(let o of e){let a=this.sourceFiles.sourceFile(o);if(a)for(let s of a.getImportDeclarations()){let c=Ge(this.workspacePackages,s.getModuleSpecifierValue());c&&r.add(c)}}if(r.size===0)return t;let i=this.packageExportsForNames(r);for(let o of e)this.addPackageImportReferencesForDocument(t,i,o);for(let[o,a]of t)t.set(o,z(a));return t}packageImportReferences(){if(this.packageImportReferenceIndex)return this.packageImportReferenceIndex;let e=new Map,t=this.packageExports();for(let r of this.sourceFiles.indexedTypeScriptLikeDocuments())this.addPackageImportReferencesForDocument(e,t,r);for(let[r,i]of e)e.set(r,z(i));return this.packageImportReferenceIndex=e,e}addPackageImportReferencesForDocument(e,t,r){if(this.db.isIgnored(r))return;let i=this.sourceFiles.sourceFileMatch(r);if(i)for(let o of i.sourceFile.getImportDeclarations())this.addPackageImportReferencesForDeclaration(e,t,r,o)}addPackageImportReferencesForDeclaration(e,t,r,i){let o=Ge(this.workspacePackages,i.getModuleSpecifierValue());if(!o)return;let a=t.get(o);if(a)for(let s of Be(i)){if(s.kind!=="named"||!s.identifier)continue;let c=a.get(s.importedName);if(!c||c.size===0)continue;let l=Zt(s.identifier,r,this.db.config.projectRoot);l.length>0&&Hr(e,c,l)}}packageExports(){return this.packageExportIndex?this.packageExportIndex:(this.packageExportIndex=this.packageExportsForNames(new Set(this.workspacePackages.map(e=>e.name))),this.packageExportIndex)}packageExportsForNames(e){let t=new Map;for(let r of this.workspacePackages){if(!e.has(r.name))continue;let i=new Map;for(let o of on(r))this.collectPackageExports(r,o,i,new Set);i.size>0&&t.set(r.name,i)}return t}collectPackageExports(e,t,r,i){if(i.has(t))return;i.add(t);let o=this.sourceFiles.sourceFile(t);if(o)for(let a of o.getExportDeclarations()){let s=a.getModuleSpecifierValue(),c=s?Pe(this.db,t,s):t;if(!c||!c.startsWith(`${e.relativeDir}/src/`))continue;let l=a.getNamedExports();if(l.length===0){if(a.isNamespaceExport())continue;this.collectPackageExports(e,c,r,i);continue}for(let d of l){let p=d.getNameNode().getText(),u=d.getAliasNode()?.getText()??p,g=this.indexedDefinitionByLeaf(c,p);if(!g)continue;let f=r.get(u);f||(f=new Set,r.set(u,f)),f.add(g.symbolId)}}}indexedDefinitionByLeaf(e,t){return D(this.indexedDefinitionLeafCache,e,()=>nn(this.db,e)).get(t)??null}nodeForDefinition(e){return D(this.definitionNodeCache,e.symbolId,()=>this.definitionNodesForFile(e.relativePath).get(e.symbolId)??null)}definitionNodesForFile(e){return D(this.fileDefinitionNodeCache,e,()=>{let t=this.sourceFiles.sourceFile(e);return t?en(this.tsMorph,this.db,t,e):new Map})}referenceDefinitionFromCompilerSymbol(e){return this.definitionFromCompilerSymbol(e,void 0,!0)}definitionFromCompilerSymbol(e,t,r=!1){let i=e.name,o=t?y.now():0,a=e.declarations??[];t&&(t.declarationsMs+=y.now()-o,t.declarationChecks+=a.length);for(let s of a){let c=t?y.now():0,l=s.getSourceFile(),d=J(this.db.config.projectRoot,l.fileName),p=l.getLineAndCharacterOfPosition(s.getStart(l)).line;if(t&&(t.declarationLocationMs+=y.now()-c),!d||this.db.isIgnored(d))continue;let u=t?y.now():0,g=this.compilerDeclarationName(s),f=r?Ae(this.db,d,p,i)??(g&&g!==i?Ae(this.db,d,p,g):null):tn(this.db,d,p,i);if(t&&(t.indexedLookupMs+=y.now()-u),f)return{symbolId:f.symbolId,symbol:f.symbol,file:f.relativePath,line:f.startLine}}return null}compilerDeclarationName(e){let t=e.name;return t&&this.tsMorph.ts.isIdentifier(t)?t.text:null}calleeMapForFile(e,t){let r=ie(),i=0,o=0,a=0,s=0,c=0,l=0,d=0,p=0,u=r?$r():void 0;return N("typescript.callee-map.file",()=>{let g=r?y.now():0,f=this.sourceFiles.sourceFile(e);if(r&&(c=Math.round(y.now()-g)),!f)return new Map;let m=r?y.now():0,h=O(this.db,e).sort((b,I)=>b.startLine-I.startLine||I.endLine-b.endLine);if(r&&(l=Math.round(y.now()-m)),i=h.length,h.length===0)return new Map;let S=new Map,M=r?y.now():0,E=this.compilerCheckerForSourceFile(f),R=f.compilerNode;r&&(d=Math.round(y.now()-M));let P=new Map,F=b=>{if(this.tsMorph.ts.isCallExpression(b)||this.tsMorph.ts.isNewExpression(b)){r&&(o+=1);let I=this.semanticCalleeForCallNode(E,R,h,b,P,t,u);I&&(r&&(a+=1),Or(S,I.callerId,I.target))}this.tsMorph.ts.forEachChild(b,F)},C=r?y.now():0;F(R),r&&(p=Math.round(y.now()-C));for(let[b,I]of S)S.set(b,Br(I));return s=S.size,S},()=>({relativePath:e,definitions:i,callNodes:o,resolvedCallees:a,outputRows:s,requestedDefinitions:t?.size??i,sourceFileLookupMs:c,definitionsLoadMs:l,checkerLookupMs:d,traversalMs:p,...u?qr(u):{}}))}semanticCalleeForCallNode(e,t,r,i,o,a,s){let c=s?y.now():0,l=Wr(r,qe(t,i));if(s&&(s.callerLookupMs+=y.now()-c),!l)return null;if(a&&!a.has(l.symbolId))return s&&(s.skippedUnrequestedCallers+=1),null;let d=i.expression,p=this.compilerSymbolForExpression(e,d,s),u=null;if(p)if(s&&(s.targetSymbolHits+=1),o.has(p))s&&(s.compilerSymbolCacheHits+=1),u=o.get(p)??null;else{s&&(s.compilerSymbolCacheMisses+=1);let g=s?y.now():0;u=this.definitionFromCompilerSymbol(p,s),s&&(s.targetLookupMs+=y.now()-g),o.set(p,u)}else s&&(s.targetMisses+=1);return u?{callerId:l.symbolId,target:{symbol:u.symbol,file:u.file,line:u.line}}:null}compilerSymbolForExpression(e,t,r){let i=r?y.now():0,o=e.getSymbolAtLocation(t);if(r&&(r.expressionSymbolMs+=y.now()-i),o)return o;r&&(r.typeFallbacks+=1);let a=r?y.now():0,s=e.getTypeAtLocation(t).getSymbol();return r&&(r.typeSymbolMs+=y.now()-a),s}compilerCheckerForSourceFile(e){let t=e.getProject(),r=this.compilerCheckerCache.get(t);return r||(r=t.getTypeChecker().compilerObject,this.compilerCheckerCache.set(t,r)),r}};function Be(n){let e=[],t=n.getDefaultImport();t&&e.push({identifier:t,importedName:"default",localName:t.getText(),kind:"default",isTypeOnly:n.getImportClause()?.isTypeOnly()??!1});let r=n.getNamespaceImport();r&&e.push({identifier:r,importedName:"*",localName:r.getText(),kind:"namespace",isTypeOnly:n.getImportClause()?.isTypeOnly()??!1});for(let i of n.getNamedImports()){let o=i.getNameNode(),s=i.getAliasNode()??(o.getKindName()==="Identifier"?o:null);e.push({identifier:s,importedName:o.getText(),localName:s?.getText()??o.getText(),kind:"named",isTypeOnly:i.isTypeOnly()||(n.getImportClause()?.isTypeOnly()??!1)})}return e.length===0&&e.push({identifier:null,importedName:"*",localName:null,kind:"side-effect",isTypeOnly:!1}),e}function jr(n,e,t){return{importer:n,sourcePath:e,importedName:t.importedName,localName:t.localName,kind:t.kind,isTypeOnly:!0,isUsed:!0,isTypeUsed:!0,isValueUsed:!1,references:[]}}function Ar(){return{declarations:0,entries:0,bindingSymbols:0,missingBindingSymbols:0,scannedIdentifiers:0,symbolLookups:0,matchedReferences:0,fallbackEntries:0}}function _r(n){for(let e=n;e;e=e.getParent())if(e.getKindName()==="ImportDeclaration")return!0;return!1}function Or(n,e,t){let r=n.get(e);r||(r=[],n.set(e,r)),r.push(t)}function Gr(n){let e=new Set;for(let t of n.getImportDeclarations())for(let r of Be(t))r.localName&&e.add(r.localName);return e}function Wr(n,e){let t=null;for(let r of n)e<r.startLine||e>r.endLine||(!t||r.startLine>=t.startLine)&&(t=r);return t}function qe(n,e){return n.getLineAndCharacterOfPosition(e.getStart(n)).line}function cn(n,e,t){return e===n.relativePath&&t>=n.startLine&&t<=n.endLine}function ln(n){return n.symbol.includes("#")?_(n.symbol)==="type"&&n.relativePath.endsWith(".d.ts"):!1}function $r(){return{callerLookupMs:0,expressionSymbolMs:0,typeSymbolMs:0,targetLookupMs:0,declarationsMs:0,declarationLocationMs:0,indexedLookupMs:0,compilerSymbolCacheHits:0,compilerSymbolCacheMisses:0,targetSymbolHits:0,targetMisses:0,typeFallbacks:0,declarationChecks:0,skippedUnrequestedCallers:0}}function qr(n){return{...n,callerLookupMs:Math.round(n.callerLookupMs),expressionSymbolMs:Math.round(n.expressionSymbolMs),typeSymbolMs:Math.round(n.typeSymbolMs),targetLookupMs:Math.round(n.targetLookupMs),declarationsMs:Math.round(n.declarationsMs),declarationLocationMs:Math.round(n.declarationLocationMs),indexedLookupMs:Math.round(n.indexedLookupMs)}}function dn(){return{cacheHits:0,cacheMisses:0,nodeHits:0,nodeMisses:0,scanFiles:0,identifiers:0,symbolLookups:0,aliasResolutions:0,targetHits:0,targetMisses:0,requestedHits:0,scanMs:0,packageRefsMs:0,semanticRefsMs:0,packageReferenceCount:0,referenceCount:0,preciseSearchFailures:0,hierarchyDefinitions:0,hierarchyFamilies:0,hierarchyReferences:0,hierarchyMs:0}}function pn(n){return{...n,scanMs:Math.round(n.scanMs),packageRefsMs:Math.round(n.packageRefsMs),semanticRefsMs:Math.round(n.semanticRefsMs),hierarchyMs:Math.round(n.hierarchyMs)}}function Hr(n,e,t){for(let r of e){let i=n.get(r)??[];i.push(...t),n.set(r,i)}}function Br(n){let e=new Set,t=[];for(let r of n){let i=`${r.symbol}|${r.file}|${r.line}`;e.has(i)||(e.add(i),t.push(r))}return t}function un(n){return n.replace(/\s+/g," ").replace(/\bimport\("[^"]+"\)\./g,"").trim()}var ge=class{loadModule;discoverTsconfigs;createProjects;createProvider;db;module=null;projects=null;provider=null;stats={providerRequests:0,sessionsCreated:0,sessionsReused:0,sessionsRefreshed:0,sessionsReplaced:0,projectsCreated:0};constructor(e,t={}){this.db=e,this.loadModule=t.loadModule??Mt,this.discoverTsconfigs=t.discoverTsconfigs??sn,this.createProjects=t.createProjects??Dt,this.createProvider=t.createProvider??((r,i,o)=>fn(r,i,o,{reusedProjects:!0}))}semanticProvider(){return this.stats.providerRequests+=1,this.provider?(this.stats.sessionsReused+=1,this.provider):this.createSession()}advanceGeneration(e,t){let r=Ur(t);return this.provider?.dispose?.(),this.provider=null,this.db=e,this.projects?r.mode==="replace"?(this.projects=null,this.module=null,this.stats.sessionsReplaced+=1,r):(r.mode==="refresh"&&(zr(this.projects,e.config.projectRoot,r),this.stats.sessionsRefreshed+=1),r):r}snapshotStats(){return{...this.stats}}dispose(){this.provider?.dispose?.(),this.provider=null,this.projects=null,this.module=null}createSession(){let e=this.module??this.loadModule();if(!e)return this.provider=ke("ts-morph is not installed"),this.provider;if(this.module=e,!this.projects){let t=this.discoverTsconfigs(this.db);if(t.length===0)return this.provider=ke("no tsconfig found"),this.provider;this.projects=this.createProjects(e,t),this.stats.projectsCreated+=this.projects.length}return this.provider=this.createProvider(this.db,e,this.projects),this.stats.sessionsCreated+=1,this.provider}};function Ur(n){let e=new Set;n.projectIdentityChanged&&e.add("project-identity-changed");for(let o of n.uncertainty)e.add(o);for(let o of n.changes)o.inputKind!=="source"&&e.add(`${o.inputKind}-input-changed`);if(e.size>0)return{mode:"replace",addedFiles:[],modifiedFiles:[],deletedFiles:[],reasons:[...e].sort()};let t=Ue(n.changes,"added"),r=Ue(n.changes,"modified"),i=Ue(n.changes,"deleted");return{mode:t.length+r.length+i.length===0?"reuse":"refresh",addedFiles:t,modifiedFiles:r,deletedFiles:i,reasons:[]}}function Ue(n,e){return n.filter(t=>t.kind===e).map(t=>t.path).sort()}function zr(n,e,t){for(let r of n){for(let i of t.deletedFiles)r.project.getSourceFile(mn(e,i))?.forget();for(let i of t.modifiedFiles){let o=r.project.getSourceFile(mn(e,i));o&&o.refreshFromFileSystemSync()}t.addedFiles.length>0&&r.project.addSourceFilesFromTsConfig(r.tsconfigPath)}}import{createHash as Jr}from"crypto";import{readFileSync as Vr}from"fs";import{dirname as Kr,join as ye}from"path";var Z=2,Qr="typescript-semantic";function gn(n){let e=ye(n,Qr);return{rootDir:e,requestDir:ye(e,"requests"),responseDir:ye(e,"responses")}}function yn(n){try{let e=JSON.parse(Vr(ye(Kr(n),"meta.json"),"utf8"));return e.version!==2&&e.version!==3||typeof e.status!="string"||typeof e.updatedAt!="string"||e.fingerprint===void 0?null:Jr("sha256").update(JSON.stringify({version:e.version,status:e.status,updatedAt:e.updatedAt,fingerprint:e.fingerprint,indexedLanguages:e.indexedLanguages})).digest("hex")}catch{return null}}function Sn(n){let e=JSON.parse(n);if(e.protocolVersion!==Z||typeof e.id!="string"||typeof e.generation!="string"||typeof e.deadlineAtMs!="number"||e.profileEnvironment!==void 0&&!Yr(e.profileEnvironment)||!e.request||!Xr(e.request))throw new Error("TypeScript semantic service received an invalid mailbox request.");return e}function Yr(n){return!!n&&typeof n=="object"&&!Array.isArray(n)&&Object.values(n).every(e=>typeof e=="string"||e===null)}function Xr(n){if(!n||typeof n!="object"||!("kind"in n))return!1;let e=n;switch(e.kind){case"availability":return!0;case"import-usage":return typeof e.file=="string";case"reference-fragments":return mt(e.files)!==null;case"references":return hn(e.definitions)&&(e.exact===void 0||typeof e.exact=="boolean");case"callees":return hn(e.definitions);case"signature":return bn(e.definition);default:return!1}}function hn(n){return Array.isArray(n)&&n.every(bn)}function bn(n){if(!n||typeof n!="object")return!1;let e=n;return typeof e.symbolId=="number"&&typeof e.documentId=="number"&&typeof e.symbol=="string"&&typeof e.relativePath=="string"&&typeof e.leaf=="string"&&typeof e.startLine=="number"&&typeof e.endLine=="number"}var be=class{openDb;createHost;generationIdentity;readSnapshot;now;db=null;host=null;generation=null;snapshot=null;requests=0;lastRequestAtMs=null;lastError=null;available=null;constructor(e){this.openDb=e.openDb,this.createHost=e.createHost??(t=>new ge(t)),this.generationIdentity=e.generationIdentity??yn,this.readSnapshot=e.readSnapshot??ri,this.now=e.now??Date.now}handle(e,t){try{this.syncGeneration(e);let r=this.host.semanticProvider();switch(this.available=r.availability().available,this.requests+=1,this.lastRequestAtMs=this.now(),this.lastError=null,t.kind){case"availability":return r.availability();case"import-usage":return r.importUsage(t.file);case"references":return[...ti(r,t.definitions,{exact:t.exact===!0})];case"reference-fragments":if(!r.referenceFragmentsForFiles)throw new Error("TypeScript provider does not support reference fragments.");return[...r.referenceFragmentsForFiles(t.files)];case"callees":return[...ni(r,t.definitions)];case"signature":return r.signatureFor(t.definition);default:return oi(t)}}catch(r){throw this.lastError=r instanceof Error?r.message:String(r),r}}status(){let e=this.host?.snapshotStats();return{protocolVersion:Z,state:this.lastError?"error":this.host?this.available?"ready":"unavailable":"idle",requests:this.requests,...this.lastRequestAtMs===null?{}:{lastRequestAt:new Date(this.lastRequestAtMs).toISOString()},...this.lastError?{lastError:this.lastError}:{},sessionsCreated:e?.sessionsCreated??0,sessionsReused:e?.sessionsReused??0,sessionsRefreshed:e?.sessionsRefreshed??0,sessionsReplaced:e?.sessionsReplaced??0,projectsCreated:e?.projectsCreated??0}}closeTypeScriptService(){this.host?.dispose(),this.db?.close(),this.host=null,this.db=null,this.generation=null,this.snapshot=null,this.available=null}syncGeneration(e){if(this.generation===e&&this.host&&this.db)return;let t=this.openDb(),r=this.generationIdentity(t.config.dbPath);if(!r||r!==e)throw t.close(),new Error("TypeScript semantic request does not match the currently published index generation.");let i=this.readSnapshot(t.config.dbPath);if(!this.host||!this.db)this.db=t,this.host=this.createHost(t);else{let o=this.db;this.host.advanceGeneration(t,ii(this.snapshot,i)),this.db=t,o.close()}this.generation=r,this.snapshot=i,this.available=null}};function ze(n){xn(n.requestDir,{recursive:!0}),xn(n.responseDir,{recursive:!0})}function vn(n,e,t={}){ze(n);let r=0;for(let i of Zr(n.requestDir).filter(o=>o.endsWith(".json")).sort()){let o=Se(n.requestDir,i),a=i.slice(0,-5),s=null;try{let c=Sn(In(o,"utf8"));if(a=c.id,c.deadlineAtMs<(t.nowMs??Date.now()))throw new Error("TypeScript semantic request expired before processing.");s=Xe(),Re(c.profileEnvironment??{}),t.beforeRequest?.(c.deadlineAtMs);let l=e.handle(c.generation,c.request);j(Se(n.responseDir,`${a}.json`),{ok:!0,protocolVersion:Z,id:a,generation:c.generation,response:l})}catch(c){j(Se(n.responseDir,`${a}.json`),{ok:!1,protocolVersion:Z,id:a,error:c instanceof Error?c.message:String(c)})}finally{s&&Re(s),t.afterRequest?.(),ei(o,{force:!0}),r+=1}}return r}function ti(n,e,t){return n.referencesForDefinitions?.(e,t)??new Map(e.map(r=>[r.symbolId,n.referencesFor(r)]))}function ni(n,e){return n.calleesForDefinitions?.(e)??new Map(e.map(t=>[t.symbolId,n.calleesFor(t)]))}function ri(n){try{let e=JSON.parse(In(Se(n,"..","meta.json"),"utf8"));return Pt(e.fingerprint)}catch{return null}}function ii(n,e){return e?Ct(n,e):{version:1,changes:[],projectIdentityChanged:!0,uncertainty:["prior-snapshot-unavailable"]}}function oi(n){throw new Error(`Unhandled TypeScript semantic request: ${JSON.stringify(n)}`)}import{mkdirSync as Rn,readFileSync as si,readdirSync as ai,rmSync as ci}from"fs";import{resolve as xe}from"path";var Ie=class{projectRoot;currentGeneration;createEmitter;now;active=null;requests=0;sessionsCreated=0;sessionsReplaced=0;lastRequestAtMs=null;lastDurationMs=null;lastError=null;unavailable=!1;constructor(e){this.projectRoot=xe(e.projectRoot),this.currentGeneration=e.currentGeneration,this.createEmitter=e.createEmitter??Nt,this.now=e.now??Date.now}handle(e,t){let r=this.now();try{if(this.currentGeneration()!==e)throw new Error("TypeScript index request does not match the currently published generation.");let i=this.emitterFor(t);if(i.emitter.producerIdentity!==t.producerIdentity)throw new Error("TypeScript index producer identity changed.");let o=i.emitter.snapshotStats(),a=i.emitter.advance({modifiedFiles:t.modifiedFiles,affectedFiles:t.affectedFiles}),s=this.now()-r;return this.requests+=1,this.lastRequestAtMs=this.now(),this.lastDurationMs=s,this.lastError=null,this.unavailable=!1,{producerIdentity:a.producerIdentity,cold:a.stats.initializations>o.initializations,durationMs:s,fragments:a.fragments.map(c=>({relativePath:c.relativePath,bytesBase64:c.bytes===null?null:Buffer.from(c.bytes).toString("base64"),occurrences:c.occurrences,symbols:c.symbols,referenceFragments:c.referenceFragments}))}}catch(i){throw this.lastError=i instanceof Error?i.message:String(i),i}}status(){let e=this.active?.emitter.snapshotStats();return{protocolVersion:de,state:this.unavailable?"unavailable":this.lastError?"error":this.active?"ready":"idle",requests:this.requests,sessionsCreated:this.sessionsCreated,sessionsReplaced:this.sessionsReplaced,initializations:e?.initializations??0,programUpdates:e?.programUpdates??0,documentsEmitted:e?.documentsEmitted??0,documentsRemoved:e?.documentsRemoved??0,...this.lastRequestAtMs===null?{}:{lastRequestAt:new Date(this.lastRequestAtMs).toISOString()},...this.lastDurationMs===null?{}:{lastDurationMs:this.lastDurationMs},...this.lastError?{lastError:this.lastError}:{}}}close(){this.active=null}emitterFor(e){let t=`${e.tsconfigPath}\0${e.projectArgument}`;if(this.active&&this.active.sessionKey===t&&this.active.projectIdentity===e.projectIdentity)return this.active;let r=this.createEmitter({workspaceRoot:this.projectRoot,tsconfigPath:e.tsconfigPath,projectRoot:e.projectArgument});if(!r.available)throw this.unavailable=!0,new Error(r.reason);return this.active&&(this.sessionsReplaced+=1),this.active={sessionKey:t,projectIdentity:e.projectIdentity,emitter:r.emitter},this.sessionsCreated+=1,this.active}};function Je(n){Rn(n.requestDir,{recursive:!0}),Rn(n.responseDir,{recursive:!0})}function Mn(n,e,t={}){Je(n);let r=0;for(let i of ai(n.requestDir).filter(o=>o.endsWith(".json")).sort()){let o=xe(n.requestDir,i),a=i.slice(0,-5);try{let s=At(si(o,"utf8"));if(a=s.id,s.deadlineAtMs<(t.nowMs??Date.now()))throw new Error("TypeScript index request expired before processing.");t.beforeRequest?.(s.deadlineAtMs);let c=e.handle(s.baseGeneration,s.request);j(xe(n.responseDir,`${a}.json`),{ok:!0,protocolVersion:de,id:a,baseGeneration:s.baseGeneration,response:c})}catch(s){j(xe(n.responseDir,`${a}.json`),{ok:!1,protocolVersion:de,id:a,error:s instanceof Error?s.message:String(s)})}finally{t.afterRequest?.(),ci(o,{force:!0}),r+=1}}return r}import{existsSync as Cn,lstatSync as ve,readFileSync as Ye,readdirSync as kn,realpathSync as Dn,rmSync as ee,statSync as li}from"fs";import{join as v,resolve as G,sep as Tn}from"path";var di=3600*1e3,pi=2*1024*1024*1024,ui=300*1e3;function fi(n){let e=n.leases.filter(s=>s.managed&&!s.live&&!s.busy),t=mi(n.leases,n.locks),r={};for(let s of n.generations)t.has(s.generationId)||(r[s.generationId]=s.unreferencedAt??n.nowMs);let i=n.generations.filter(s=>!t.has(s.generationId)).sort((s,c)=>r[s.generationId]-r[c.generationId]||s.generationId.localeCompare(c.generationId)),o=new Set;for(let s of i)n.nowMs-r[s.generationId]>=n.policy.generationTtlMs&&o.add(s.generationId);let a=n.generations.filter(s=>!o.has(s.generationId)).reduce((s,c)=>s+c.size,0);for(let s of i){if(a<=n.policy.budgetBytes)break;o.has(s.generationId)||(o.add(s.generationId),a-=s.size)}for(let s of o)delete r[s];return{deleteWorktrees:e,deleteGenerations:n.generations.filter(s=>o.has(s.generationId)),deleteLocks:n.locks.filter(s=>!s.live),deleteTemporaries:n.temporaries.filter(s=>!s.live),protectedGenerationIds:[...t].sort(),unreferencedSince:r}}function mi(n,e){let t=new Set(n.filter(r=>r.managed&&(r.live||r.busy)).flatMap(r=>[r.lease.baseGenerationId,r.lease.activeGenerationId]).filter(r=>r!==void 0));for(let r of e)r.live&&t.add(r.generationId);return t}function Fn(n,e,t={}){if(!wt())return{kind:"disabled"};let r=Ze(n);if(!r)return{kind:"unavailable"};let i=v(Fe(),"repositories",r.repositoryId);if(!Cn(i))return{kind:"unavailable"};let o=(t.now??Date.now)(),a=v(i,"gc-state.json"),s=yi(a);if(!t.force&&s&&o-Date.parse(s.lastSweepAt)<ui)return{kind:"throttled",sweptAt:s.lastSweepAt};let c=tt(i,{now:()=>o});if(!c)return{kind:"busy"};try{let l=hi(n,i,r.repositoryId,s?.unreferencedSince??{}),d=fi({nowMs:o,...l,policy:{generationTtlMs:t.policy?.generationTtlMs??di,budgetBytes:t.policy?.budgetBytes??pi}}),p=0,u=0;for(let m of d.deleteWorktrees){if(!wn(m.lease))continue;let h=nt(v(m.lease.localCacheDir,"cache-lifecycle.lock"));if(h)try{if(Ke(m.lease,!0))continue;try{bt({projectRoot:m.lease.projectRoot,cacheDir:m.lease.localCacheDir,cliVersion:e})}catch{continue}if(Ke(m.lease,!0))continue;ee(m.lease.localCacheDir,{recursive:!0,force:!0}),ee(m.leasePath,{force:!0}),u+=1}finally{h.release()}}for(let m of d.deleteLocks)ee(m.path,{force:!0});for(let m of d.deleteTemporaries)ee(m.path,{recursive:!0,force:!0});for(let m of d.deleteGenerations)ee(m.path,{recursive:!0,force:!0}),p+=m.size;it(v(i,"evidence.db"));let g={kind:"swept",sweptAt:new Date(o).toISOString(),deletedWorktrees:u,deletedGenerations:d.deleteGenerations.length,deletedBytes:p,protectedGenerations:d.protectedGenerationIds.length},f={version:1,lastSweepAt:g.sweptAt,unreferencedSince:d.unreferencedSince,lastResult:g};return j(a,f,{spacing:2,trailingNewline:!0}),g}catch(l){return{kind:"failed",error:l instanceof Error?l.message:String(l)}}finally{c.release()}}function hi(n,e,t,r){let i=new Set(et(n).map(l=>G(l.path))),o=[];for(let l of Ve(v(e,"worktrees"))){if(!l.endsWith(".json"))continue;let d=v(e,"worktrees",l),p=gi(d);if(!p)continue;let u=G(p.projectRoot);o.push({leasePath:d,lease:p,managed:p.repositoryId===t&&wn(p),live:i.has(u)||Cn(u),busy:Ke(p)})}let a=[];for(let l of Ve(v(e,"locks"))){let d=/^([a-f0-9]{64})\.lock$/.exec(l);if(!d)continue;let p=v(e,"locks",l),u=Qe(p),g=u!==void 0&&V(u),f=d[1];a.push({generationId:f,path:p,live:g})}let s=[],c=[];for(let l of Ve(v(e,"generations"))){let d=/^\.tmp-(\d+)-/.exec(l);if(d){let g=v(e,"generations",l),f=Number(d[1]);try{c.push({path:g,size:Pn(g),live:Number.isSafeInteger(f)&&V(f)})}catch{}continue}if(!/^[a-f0-9]{64}$/.test(l))continue;let p=v(e,"generations",l),u;try{u=ve(p)}catch{continue}!u.isDirectory()||u.isSymbolicLink()||s.push({generationId:l,path:p,size:Pn(p),...r[l]===void 0?{}:{unreferencedAt:r[l]}})}return{leases:o,generations:s,locks:a,temporaries:c}}function wn(n){if(n.ownershipChecksum!==Lt(n)||G(n.localCacheDir)!==G(Ft(n.projectRoot)))return!1;let e=G(Fe()),t=G(v(e,"projects")),r=G(n.localCacheDir);if(!r.startsWith(`${t}${Tn}`))return!1;try{let i=ve(e),o=ve(t),a=ve(r);if(!i.isDirectory()||i.isSymbolicLink()||!o.isDirectory()||o.isSymbolicLink()||!a.isDirectory()||a.isSymbolicLink())return!1;let s=Dn(t);return Dn(r).startsWith(`${s}${Tn}`)}catch{return!1}}function Ke(n,e=!1){for(let r of e?["index.lock"]:["index.lock","cache-lifecycle.lock"]){let i=Qe(v(n.localCacheDir,r));if(i!==void 0&&V(i))return!0}let t=Qe(oe(n.localCacheDir).lockPath);return t!==void 0&&V(t)}function gi(n){try{let e=JSON.parse(Ye(n,"utf8"));return e.version!==1||typeof e.repositoryId!="string"||typeof e.worktreeId!="string"||typeof e.projectRoot!="string"||e.treeOid!==void 0&&typeof e.treeOid!="string"||typeof e.localCacheDir!="string"||e.baseGenerationId!==void 0&&typeof e.baseGenerationId!="string"||e.activeGenerationId!==void 0&&typeof e.activeGenerationId!="string"||typeof e.ownershipChecksum!="string"||!/^[a-f0-9]{64}$/.test(e.ownershipChecksum)||typeof e.lastAction!="string"||e.lastReason!==void 0&&typeof e.lastReason!="string"||typeof e.lastSeenAt!="string"?null:e}catch{return null}}function Qe(n){try{let e=JSON.parse(Ye(n,"utf8"));return typeof e.pid=="number"&&Number.isSafeInteger(e.pid)&&e.pid>0?e.pid:void 0}catch{return}}function yi(n){try{let e=JSON.parse(Ye(n,"utf8"));return e.version!==1||typeof e.lastSweepAt!="string"||!Number.isFinite(Date.parse(e.lastSweepAt))||!e.unreferencedSince||typeof e.unreferencedSince!="object"||!e.lastResult?null:e}catch{return null}}function Ve(n){try{return kn(n)}catch{return[]}}function Pn(n){let e=0,t=[n];for(;t.length>0;){let r=t.pop();for(let i of kn(r,{withFileTypes:!0})){let o=v(r,i.name);i.isDirectory()?t.push(o):i.isFile()&&(e+=li(o).size)}}return e}var bi=1e3,xi=250,Ii=10;function vi(n){return n==="fresh"?null:{kind:"watch-startup",detail:`index ${n} when watch service started`}}async function Ri(n,e,t={}){let r=Ln(n),i=H(r);i.watch={...i.watch,...t};let o=le(i);if(!o.enabled)throw new Error('watch mode is disabled; set "watch.enabled": true before starting the service');let a=B(r,i),s=oe(a.cacheDir),c=vt(s.lockPath,r);if(!c.acquired)return;let l=Date.now(),d=l,p={state:"idle"},u,g,f=!1,m=!1,h=0,S=0,M=0,E=0,R,P,F=gn(a.cacheDir),C=jt(a.cacheDir);ze(F),Je(C);let b=new be({openDb:()=>$t(r)}),I=new Ie({projectRoot:r,currentGeneration:()=>_t(a.dbPath)}),w=(L=!1)=>{if(!m)return;let $=Date.now();!L&&$-S<bi||(S=$,xt(s.statePath,{version:1,protocolVersion:St,pid:T.pid,projectRoot:r,cliVersion:e,startedAt:new Date(l).toISOString(),heartbeatAt:new Date($).toISOString(),lastActivityAt:new Date(d).toISOString(),...o.idleTimeoutMs===0?{}:{idleDeadlineAt:new Date(d+o.idleTimeoutMs).toISOString()},watcher:p,...u?{lastRefresh:u}:{},...g?{lastError:g}:{},typescriptSemantic:{...b.status(),...R===void 0?{}:{busyUntil:new Date(R).toISOString()}},typescriptIndex:{...I.status(),...P===void 0?{}:{busyUntil:new Date(P).toISOString()}}}))},W=()=>{d=Date.now()},te=new pe({projectRoot:r,config:{...i,watch:o},languages:i.languages,onStatus(L){p=L,L.state!=="idle"&&W(),w(!0)},onReindexComplete(){W(),u=Ee(r,i,a).lastRefresh,g=void 0,w(!0)},onError(L){W(),g={at:new Date().toISOString(),message:L.message},w(!0)}}),ne=()=>{f=!0};T.once("SIGINT",ne),T.once("SIGTERM",ne);try{te.start();let L=Ee(r,i,a);u=L.lastRefresh;let $=vi(L.state);for($&&te.requestRefresh($,{immediate:!0}),W(),m=!0,w(!0);!f;){let Nn=Mn(C,I,{beforeRequest(k){P=k+5e3,w(!0)},afterRequest(){P=void 0,w(!0)}}),jn=vn(F,b,{beforeRequest(k){R=k+5e3,w(!0)},afterRequest(){R=void 0,w(!0)}}),re=Date.now();if(re-E>=6e4&&(E=re,Fn(r,e)),re-M>=xi){M=re;let k=It(s.activityPath);k&&k.atMs>d&&(d=k.atMs),k?.refreshRequestedAtMs!==void 0&&k.refreshRequestedAtMs>h&&(h=k.refreshRequestedAtMs,W(),te.requestRefresh({kind:"watch-demand",detail:k.refreshDetail??"stale index observed by a command"},{immediate:!0}))}if((jn>0||Nn>0)&&(W(),w(!0)),w(),Rt({watcher:p,lastActivityAtMs:d,nowMs:Date.now(),idleTimeoutMs:o.idleTimeoutMs}))break;await Mi(Ii)}}finally{T.off("SIGINT",ne),T.off("SIGTERM",ne),b.closeTypeScriptService(),I.close(),te.stop(),En(s.statePath,{force:!0}),En(s.activityPath,{force:!0}),c.release()}}function Mi(n){return new Promise(e=>setTimeout(e,n))}var Di=T.argv[1]?Si(Ln(T.argv[1])).href:null;if(Di===import.meta.url){let n=T.argv[2],e=T.argv[3],t=Ti(T.argv[4]);if(!n||!e)console.error("watch-service: expected <project-root> <cli-version>"),T.exitCode=1;else try{await Ri(n,e,t)}catch(r){console.error(`watch-service: ${r instanceof Error?r.message:String(r)}`),T.exitCode=1}}function Ti(n){if(!n)return{};try{let e=JSON.parse(n);return e&&typeof e=="object"?e:{}}catch{return{}}}export{Ri as runWatchServiceServer,vi as startupRefreshTrigger};
42
42
  //# sourceMappingURL=watch-server.js.map
@@ -137,7 +137,7 @@ This syntax summary is generated from the CLI command descriptors. Keep workflow
137
137
  | `init` | Create a .scipquery.json config file for this project | - |
138
138
  | `config-validate` | Validate .scipquery.json, including structured suppressions and declared coupling groups | `--json` |
139
139
  | `suppress <id>` | Record an accepted finding as a file under .scipquery/suppressions/ with a required reason | `--reason <text>`<br>`--check <check>`<br>`--file <path>`<br>`--expires-at <iso>`<br>`--json` |
140
- | `effectiveness` | Per-check effectiveness from the committed outcome ledger: caught, same-HEAD verified fixes, suppressed, unverified disappearances, and precision | `--since <window>`<br>`--check <check>`<br>`--json` |
140
+ | `effectiveness` | Per-check effectiveness from the committed outcome ledger: caught, comparison-verified fixes, suppressed, unverified disappearances, and precision | `--since <window>`<br>`--check <check>`<br>`--json` |
141
141
  | `doctor` | Diagnose config, index freshness, dependency readiness, and project capabilities | `--json` |
142
142
  | `setup` | Bootstrap this project: enable automatic indexing, install agent skills, refresh the index, verify capabilities, and report health | `--guided`<br>`--yes`<br>`--git-hook`<br>`--no-hooks`<br>`--no-skills`<br>`--no-parsers`<br>`--no-health`<br>`--dossier-dir <path>`<br>`--json` |
143
143
  | `setup-agent` | Seed agent guidance for this project: AGENTS.md/CLAUDE.md block pointing agents at the scip-query skills and diff gate, plus an optional git pre-commit backstop | `--git-hook` |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scip-query",
3
- "version": "0.16.0",
3
+ "version": "0.17.0",
4
4
  "description": "Evidence and verification for AI coding agents: map code, reuse concepts, finish migrations, and gate diffs.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -183,7 +183,7 @@ scip-query capability-matrix # Deprecated alias for capabilities --matrix
183
183
  scip-query init # Create a .scipquery.json config file for this project
184
184
  scip-query config-validate # Validate .scipquery.json, including structured suppressions and declared coupling groups
185
185
  scip-query suppress <id> # Record an accepted finding as a file under .scipquery/suppressions/ with a required reason
186
- scip-query effectiveness # Per-check effectiveness from the committed outcome ledger: caught, same-HEAD verified fixes, suppressed, unverified disappearances, and precision
186
+ scip-query effectiveness # Per-check effectiveness from the committed outcome ledger: caught, comparison-verified fixes, suppressed, unverified disappearances, and precision
187
187
  scip-query doctor # Diagnose config, index freshness, dependency readiness, and project capabilities
188
188
  scip-query setup # Bootstrap this project: enable automatic indexing, install agent skills, refresh the index, verify capabilities, and report health
189
189
  scip-query setup-agent # Seed agent guidance for this project: AGENTS.md/CLAUDE.md block pointing agents at the scip-query skills and diff gate, plus an optional git pre-commit backstop
@@ -207,7 +207,7 @@ measured precision, not by volume:
207
207
  - **Advisory gate findings** (marked `(advisory)`) never block; they are context, not obligations.
208
208
  - **False-dead archetypes (2026-07-02 remediation, docs/plans/2026-07-02-followups.md items 1-3)**: `import type`-only consumers (incl. tsconfig `paths`-aliased specifiers) and pnpm/npm/yarn workspace cross-package consumers (incl. unbuilt `dist/` exports maps) are now resolved by the shared reference-counting layer that `dead`/`isolated`/`new-dead`/`stale-abstractions`/`production-callables` all consume; Vue `<script setup>` composable consumers were already correctly resolved (verified live, no code change needed). One narrow residual gap remains: a symbol with an **ambiguous leaf name** (a same-named definition exists elsewhere in the project) reached only through a **re-exporting barrel file** in a workspace package can still misattribute — `new-dead` labels that specific shape `unconfirmed (cross-package ambiguous-name resolution gap)` with `evidence: "heuristic"` and lowered confidence instead of asserting `dead`; treat those as "verify manually," not as a fact. Everything else in this class is a normal graph-fact `dead` claim again — confirm with `refs` when in doubt, same as any other finding.
209
209
  - **Ledger nudges**: when `diff-gate --hook` reports "this check is rarely acted on in this repo", either tune that check's config, suppress the standing findings with reasons, or consciously accept the noise — do not let unresolved findings accumulate as wallpaper.
210
- - **Effectiveness ledger**: every completed diff-gate run, including JSON and hook mode, appends caught/resolved/suppressed transitions to `.scipquery/ledger/events.jsonl` (committed, conflict-free via a scoped `merge=union` gitattribute commit it with your changes). Query it with `scip-query effectiveness [--since 30d] [--check <check>] [--json]`: per check it reports findings caught, same-HEAD verified fixed, suppressed, still open, `moved` (rename noise), `unverified` (the finding disappeared after HEAD changed or without Git identity), precision (verified fixed ÷ verified fixed plus suppressed), and median days-to-fix. Run diff-gate before and after a repair, before committing, to earn verified credit. Standalone detector commands are not outcome-tracked until they expose complete-scan evidence.
210
+ - **Effectiveness ledger**: every completed diff-gate run, including JSON and hook mode, writes each caught/resolved/suppressed transition to its own committed `.scipquery/events/*.json` file. Independent branches add independent paths instead of editing a shared log; commit the event files with your changes. Legacy `.scipquery/ledger/events.jsonl` records remain readable and migrate on the next gate write. Query the history with `scip-query effectiveness [--since 30d] [--check <check>] [--json]`: per check it reports findings caught, comparison-verified fixed, suppressed, still open, `moved` (rename noise), legacy/non-comparable `unverified` resolutions, precision (verified fixed ÷ verified fixed plus suppressed), and median days-to-fix. A pre-commit rerun reuses the same base directly; after `HEAD` advances, a clean run automatically replays the stored comparison commit. A dirty or unavailable replay leaves the finding pending instead of manufacturing a fix. Standalone detector commands are not outcome-tracked until they expose complete-scan evidence.
211
211
 
212
212
  ## Diff Gate Checks
213
213
 
@@ -119,10 +119,11 @@ The finding-outcome ledger keeps calibrating for you: once the repo uses
119
119
  diff-gate, per-detector precision is recomputed from real outcomes
120
120
  (`detectorPrecision` in `health --json`), and the committed event ledger
121
121
  makes those outcomes durable and queryable — `scip-query effectiveness
122
- --since 30d --json` reports per-check caught/same-HEAD-fixed/suppressed/open/
123
- unverified counts, precision, and median days-to-fix from
124
- `.scipquery/ledger/events.jsonl`. Run diff-gate before and after the repair,
125
- before committing, so a changed HEAD cannot be mistaken for a verified fix.
122
+ --since 30d --json` reports per-check caught/comparison-verified-fixed/
123
+ suppressed/open/unverified counts, precision, and median days-to-fix from the
124
+ individual records under `.scipquery/events/*.json`. Run diff-gate before and
125
+ after the repair. If `HEAD` advances, use a clean worktree so scip-query can
126
+ replay the stored comparison base instead of mistaking an empty diff for a fix.
126
127
  Re-run this protocol only after major detector upgrades or when the
127
128
  ledger's precision numbers drift from what you measured. Write the calibration report to
128
129
  `docs/validation/YYYY-MM-DD-external-calibration-<repo>.md` in the shape of
@@ -87,8 +87,9 @@ scip-query suppress <id> --reason "<specific reason>"
87
87
  `suppress` writes one file per suppression under `.scipquery/suppressions/` —
88
88
  commit that file with your change. Suppressing is a real decision, not a
89
89
  bypass: every suppression counts against that detector's precision in
90
- `scip-query effectiveness`, while a same-HEAD clean rerun after fixing the
91
- finding earns verified credit. Prefer the fix whenever the finding is real.
90
+ `scip-query effectiveness`, while a rerun against the same resolved comparison
91
+ base earns verified credit. After `HEAD` advances, a clean run replays that
92
+ stored base automatically. Prefer the fix whenever the finding is real.
92
93
 
93
94
  This step is complete only when `diff-gate` passes or every finding has a durable explanation.
94
95
 
@@ -1,2 +0,0 @@
1
- import{b as r}from"./chunk-QB7NRST4.js";import{x as e}from"./chunk-OO6S4ECV.js";function l(t,s){let o=r(t,s);return e(t,o).map(({relativePath:n,...a})=>a)}export{l as a};
2
- //# sourceMappingURL=chunk-5P26M63Y.js.map
@@ -1,67 +0,0 @@
1
- import{execFileSync as k}from"child_process";import{createHash as b}from"crypto";import{lstatSync as F,readdirSync as V,readFileSync as w,readlinkSync as A,realpathSync as m}from"fs";import{isAbsolute as _,join as y,relative as I,sep as E}from"path";function ne(e,t){let n=e.split("/").at(-1)??e;if(C.has(n)||n===".scipquery.json"||/^tsconfig(?:\..+)?\.json$/.test(n))return"config";if(/\.d\.(?:ts|mts|cts)$/.test(e.toLowerCase()))return"ambient";let s=e.includes(".")?`.${e.split(".").at(-1).toLowerCase()}`:"";return t.some(r=>(D[r]??[]).includes(s))?"source":"other"}function re(e){return[...new Set((e??[]).map(t=>t.trim()).filter(Boolean))].sort((t,n)=>t.localeCompare(n))}function G(e){return($(e)??O(e)).filter(t=>t&&!S(t)).sort()}function ie(e,t={}){let n=G(e).filter(r=>!t.language||L(r,t.language,t.markerFiles)).filter(r=>!t.includePath||t.includePath(r)),s=m(e);return n.map(r=>{let i=y(e,r);try{if(F(i).isSymbolicLink()){let o=m(i),c=I(s,o);if(c===".."||c.startsWith(`..${E}`)||_(c))throw new Error("external symlink");let l=A(i);return{path:r,size:Buffer.byteLength(l),hash:b("sha256").update("symlink\0").update(l).digest("hex")}}let a=w(i);return{path:r,size:a.byteLength,hash:b("sha256").update(a).digest("hex")}}catch{return{path:r,size:-1,hash:"unreadable"}}})}function L(e,t,n){let s=e.split("/").at(-1)??e;if(n?.includes(e)||n?.includes(s)||C.has(s))return!0;let r=e.includes(".")?`.${e.split(".").at(-1).toLowerCase()}`:"";return(D[t]??[]).includes(r)}function $(e){try{return k("git",["-C",e,"ls-files","-co","--exclude-standard","--","."],{encoding:"utf-8",maxBuffer:50*1024*1024,stdio:["ignore","pipe","ignore"]}).split(`
2
- `).filter(Boolean)}catch{return null}}function O(e){let t=[],n=[""];for(;n.length>0;){let s=n.pop(),r=s?y(e,s):e,i;try{i=V(r,{withFileTypes:!0})}catch{continue}for(let a of i){let o=s?`${s}/${a.name}`:a.name;if(a.isDirectory()){S(o)||n.push(o);continue}t.push(o)}}return t}function S(e){let t=e.split("/");return e==="meta.json"||t.some(n=>K.has(n))||e.endsWith(".db")||e.endsWith(".db-wal")||e.endsWith(".db-shm")||e.endsWith(".scip")}var K=new Set([".git","node_modules",".scipquery-cache",".scipquery-generations",".stryker-tmp","dist","build","coverage",".next",".nuxt","target"]),C=new Set(["package.json","package-lock.json","pnpm-lock.yaml","yarn.lock","bun.lockb","tsconfig.json","tsconfig.base.json","pyproject.toml","setup.py","setup.cfg","Cargo.toml","Cargo.lock","go.mod","go.sum","pom.xml","build.gradle","build.gradle.kts","build.sbt","compile_commands.json","CMakeLists.txt","Makefile","Gemfile","Gemfile.lock","composer.json","composer.lock","pubspec.yaml","pubspec.lock","deps.edn","project.clj","bb.edn","shadow-cljs.edn"]),D={typescript:[".ts",".tsx",".mts",".cts"],javascript:[".js",".jsx",".mjs",".cjs"],java:[".java"],scala:[".scala"],kotlin:[".kt",".kts"],rust:[".rs"],python:[".py",".pyi"],ruby:[".rb"],go:[".go"],cpp:[".cc",".cpp",".cxx",".hpp",".hh",".hxx"],c:[".c",".h"],csharp:[".cs"],vb:[".vb"],dart:[".dart"],php:[".php"],clojure:[".clj",".cljs",".cljc"]};import T from"ignore";import{readFileSync as W,existsSync as x,readdirSync as M}from"fs";import{dirname as g,isAbsolute as v,join as p,relative as N,resolve as R}from"path";function le(e){let t=T();return z(e,t)||t.add(U),{isIgnored:s=>f(t,e,s),filter:s=>s.filter(r=>!f(t,e,r))}}function z(e,t){let n=new Set,s=(a,o)=>{if(!(n.has(a)||!x(a)))try{let c=W(a,"utf-8");t.add(o?B(c,o):c),n.add(a)}catch{}},r=g(e),i=0;for(;r!==g(r)&&i<5&&(s(p(r,".gitignore"),""),!x(p(r,".git")));)r=g(r),i++;return j(e,"",t,s),n.size>0}function j(e,t,n,s){let r=t?p(e,t):e;s(p(r,".gitignore"),t);let i;try{i=M(r,{withFileTypes:!0})}catch{return}for(let a of i){if(!a.isDirectory()||a.name===".git")continue;let o=t?`${t}/${a.name}`:a.name;f(n,e,`${o}/`)||j(e,o,n,s)}}function B(e,t){let n=t.replaceAll("\\","/").replace(/\/+$/,"");return e.split(/\r?\n/).map(s=>q(s,n)).join(`
3
- `)}function q(e,t){let n=e.trimStart();if(!n||n.startsWith("#"))return e;let s=e.slice(0,e.length-n.length),r=n.startsWith("!"),i=r?n.slice(1):n;if(!i||i.startsWith("#"))return e;let a=i.startsWith("/"),o=a?i.slice(1):i,u=(o.endsWith("/")?o.slice(0,-1):o).includes("/")||a?`${t}/${o}`:`${t}/**/${o}`;return`${s}${r?"!":""}${u}`}var U=`
4
- # Dependencies
5
- node_modules/
6
- vendor/
7
- .bundle/
8
-
9
- # Build output
10
- dist/
11
- build/
12
- out/
13
- target/
14
- bin/
15
- obj/
16
-
17
- # Python
18
- __pycache__/
19
- *.pyc
20
- *.pyo
21
- .venv/
22
- venv/
23
- .env/
24
- env/
25
- *.egg-info/
26
-
27
- # Rust
28
- target/
29
-
30
- # Java / Kotlin / Scala
31
- *.class
32
- .gradle/
33
- .mvn/
34
-
35
- # C# / .NET
36
- bin/
37
- obj/
38
- packages/
39
-
40
- # Go
41
- vendor/
42
-
43
- # Dart
44
- .dart_tool/
45
- build/
46
-
47
- # PHP
48
- vendor/
49
-
50
- # IDE / OS
51
- .idea/
52
- .vscode/
53
- *.swp
54
- *.swo
55
- .DS_Store
56
- Thumbs.db
57
-
58
- # Type definitions (often noise in queries)
59
- *.d.ts
60
- `;function f(e,t,n){let s=H(t,n);if(!s)return!1;try{return e.ignores(s)}catch{return!1}}function H(e,t){if(!t||t===".")return null;if(!v(t)&&!t.startsWith(".."))return t.replaceAll("\\","/");let n=v(t)?t:R(e,t),s=N(e,n).replaceAll("\\","/");return!s||s==="."||s.startsWith("..")?null:s}function pe(e,t={}){let n=t.scope?"AND relative_path LIKE ?":"",s=t.like?"AND relative_path LIKE ?":"",r=[...t.scope?[`%${t.scope}%`]:[],...t.like?[t.like]:[]],i=e.all(`SELECT relative_path
61
- FROM documents
62
- WHERE 1 = 1
63
- ${e.pathExclusionsFor("documents")}
64
- ${n}
65
- ${s}
66
- ORDER BY relative_path`,...r).map(o=>o.relative_path),a=t.extensions?i.filter(o=>t.extensions.some(c=>o.toLowerCase().endsWith(c.toLowerCase()))):i;return t.includeIgnored===!1?a.filter(o=>!e.isIgnored(o)):a}var J=[];function d(e){e.groups.length>0&&J.push(e)}function P(){let e=new WeakMap;return{cache:e,ensure(t){let n=e.get(t);return n||(n=new Map,e.set(t,n)),n}}}function he(e,t){let{cache:n,ensure:s}=P(),r={get(i,a,o){let c=s(i);if(c.has(a))return c.get(a);let l=o();return c.set(a,l),l},invalidate(i,a){n.get(i)?.delete(a)},invalidateAll(i){n.delete(i)},size(i){return n.get(i)?.size??0}};return d({name:e,groups:t.clearGroups,clearAll:i=>r.invalidateAll(i),clearFile:(i,a)=>r.invalidate(i,a)}),r}function be(e,t){let n=new WeakMap,s={get(r,i){let a=n.get(r);if(a)return a.value;let o=i();return n.set(r,{value:o}),o},invalidate(r){n.delete(r)},has(r){return n.has(r)}};return d({name:e,groups:t.clearGroups,clearAll:r=>s.invalidate(r)}),s}var X={clearGroups:["whole-project","source-file"]};function me(e){return Y(e,X)}function Y(e,t){let{cache:n,ensure:s}=P(),r={get(i,a,o,c){let l=s(i),u=l.get(a);if(u&&u.source===o)return u.value;let h=c();return l.set(a,{source:o,value:h}),h},invalidate(i,a){n.get(i)?.delete(a)},invalidateAll(i){n.delete(i)}};return d({name:e,groups:t.clearGroups,clearAll:i=>r.invalidateAll(i),clearFile:(i,a)=>r.invalidate(i,a)}),r}export{d as a,he as b,be as c,me as d,Y as e,pe as f,ne as g,re as h,ie as i,le as j};
67
- //# sourceMappingURL=chunk-FFIYGYQR.js.map