scip-query 0.16.1 → 0.17.1

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 (249) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +59 -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-A46JTKTM.js → chunk-2DUWNJKE.js} +2 -2
  7. package/dist/{chunk-YSUD2S7T.js → chunk-2HCWAL42.js} +2 -2
  8. package/dist/{chunk-S5MTSES5.js → chunk-2TM23JYJ.js} +2 -2
  9. package/dist/{chunk-6EVORGCB.js → chunk-35DURZXI.js} +2 -2
  10. package/dist/{chunk-3LAKH6BV.js → chunk-3CJXFMR5.js} +2 -2
  11. package/dist/{chunk-UO4IADXJ.js → chunk-3YEBIYXL.js} +2 -2
  12. package/dist/{chunk-3YAZH3JU.js → chunk-45QWQSWS.js} +2 -2
  13. package/dist/{chunk-5XDNFOAH.js → chunk-4FLF7BHJ.js} +2 -2
  14. package/dist/{chunk-JRFCWCOD.js → chunk-4L4X66GE.js} +2 -2
  15. package/dist/{chunk-NLRWGGPY.js → chunk-5CJ6AQN7.js} +2 -2
  16. package/dist/{chunk-CM4EZLW4.js → chunk-5GAUXLOE.js} +2 -2
  17. package/dist/{chunk-QB7NRST4.js → chunk-5N5ZC566.js} +2 -2
  18. package/dist/{chunk-YD37KSEK.js → chunk-5QSMW5IO.js} +2 -2
  19. package/dist/{chunk-7II7NFRV.js → chunk-623AZLTE.js} +2 -2
  20. package/dist/{chunk-VYQY75NA.js → chunk-6TJERPN3.js} +2 -2
  21. package/dist/{chunk-IRIM3SUR.js → chunk-75H6GOND.js} +2 -2
  22. package/dist/{chunk-Q65QYKU7.js → chunk-7H37Z4UO.js} +2 -2
  23. package/dist/{chunk-OO6S4ECV.js → chunk-7XP7ZRSI.js} +2 -2
  24. package/dist/{chunk-5TVNLPUM.js → chunk-7Z5UT44B.js} +2 -2
  25. package/dist/{chunk-RQWNF2RM.js → chunk-BBTVIIOI.js} +2 -2
  26. package/dist/{chunk-MZB3DTHW.js → chunk-BGUYAA3Q.js} +2 -2
  27. package/dist/{chunk-3I34FZ6R.js → chunk-BTYDBDX5.js} +2 -2
  28. package/dist/{chunk-2EU6WVR3.js → chunk-BW4VDICR.js} +2 -2
  29. package/dist/{chunk-DKK2H4D7.js → chunk-CKRVVBM6.js} +2 -2
  30. package/dist/{chunk-ZHGUZKJL.js → chunk-CMLHZWRS.js} +2 -2
  31. package/dist/{chunk-OYGKBDAD.js → chunk-CSMPXDYE.js} +2 -2
  32. package/dist/{chunk-GWWYLYD3.js → chunk-DQYG5JHT.js} +2 -2
  33. package/dist/{chunk-6DNE65QS.js → chunk-E5HPTSRD.js} +2 -2
  34. package/dist/chunk-E7BTIEAY.js +2 -0
  35. package/dist/{chunk-RPMT6MTX.js → chunk-EUMETOTD.js} +2 -2
  36. package/dist/{chunk-2Y7YX54K.js → chunk-FY6RCFDH.js} +2 -2
  37. package/dist/{chunk-YFEJIYWH.js → chunk-FZXN37RN.js} +2 -2
  38. package/dist/{chunk-KI4WPR7Q.js → chunk-G4IUQW27.js} +2 -2
  39. package/dist/{chunk-U6BJVXWQ.js → chunk-GRHA5NGF.js} +2 -2
  40. package/dist/{chunk-XBPAJASV.js → chunk-H4T2AST4.js} +2 -2
  41. package/dist/{chunk-SOCS3467.js → chunk-HGO3D2JD.js} +2 -2
  42. package/dist/{chunk-LT6AHYVY.js → chunk-HJYHSTCP.js} +2 -2
  43. package/dist/{chunk-XC6PUFNN.js → chunk-HYRSGWFX.js} +2 -2
  44. package/dist/{chunk-K32ZOW3P.js → chunk-HZVG4KID.js} +2 -2
  45. package/dist/{chunk-RLB7FZKR.js → chunk-IHD2CHMX.js} +2 -2
  46. package/dist/{chunk-VSQRU3AP.js → chunk-IKAJI4SI.js} +2 -2
  47. package/dist/{chunk-BVHP2B4D.js → chunk-IZLWLO4X.js} +2 -2
  48. package/dist/{chunk-QSNG3NHQ.js → chunk-J7WYG63U.js} +2 -2
  49. package/dist/{chunk-NLVKD45E.js → chunk-JLZUM476.js} +2 -2
  50. package/dist/{chunk-7RAS466A.js → chunk-JYBP5ZIR.js} +2 -2
  51. package/dist/{chunk-S5RZQA6V.js → chunk-K3UVTL3J.js} +2 -2
  52. package/dist/{chunk-DA34GNNO.js → chunk-KWMRY4RN.js} +2 -2
  53. package/dist/{chunk-363TZ64I.js → chunk-KWQKWY6M.js} +2 -2
  54. package/dist/{chunk-PCCMMI2M.js → chunk-KZ2LZBQT.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-VZCR3VQY.js → chunk-MBDBNQBW.js} +2 -2
  58. package/dist/chunk-MON5XXTG.js +7 -0
  59. package/dist/{chunk-EVCSXWER.js → chunk-O27267B6.js} +2 -2
  60. package/dist/{chunk-YCVYOV4A.js → chunk-O56VBJKB.js} +2 -2
  61. package/dist/{chunk-CS3FXTUC.js → chunk-OBPR6E5Z.js} +2 -2
  62. package/dist/{chunk-2LGPMYS2.js → chunk-OC7XDK62.js} +2 -2
  63. package/dist/{chunk-5UKDCXVC.js → chunk-OP5JXGDV.js} +2 -2
  64. package/dist/{chunk-CKIAEVGM.js → chunk-PA2MQKXD.js} +2 -2
  65. package/dist/{chunk-BFWVHD2P.js → chunk-PPAT3XUL.js} +2 -2
  66. package/dist/{chunk-G4KQ7S74.js → chunk-QEIGJJBC.js} +2 -2
  67. package/dist/{chunk-AAMZRDJT.js → chunk-QYBCGCY5.js} +2 -2
  68. package/dist/{chunk-W3ZVRLCH.js → chunk-RPPV6Y4K.js} +2 -2
  69. package/dist/{chunk-HGUNWXJX.js → chunk-RUQE7DZT.js} +2 -2
  70. package/dist/chunk-SMBIGBGN.js +67 -0
  71. package/dist/{chunk-EBSSCVR4.js → chunk-SQJ72PQW.js} +5 -5
  72. package/dist/{chunk-6GZ7LM7S.js → chunk-SSH2NPYS.js} +2 -2
  73. package/dist/{chunk-S2FZILCF.js → chunk-TAB7AWKO.js} +2 -2
  74. package/dist/{chunk-MCNWCJYL.js → chunk-TLTLJ4SW.js} +2 -2
  75. package/dist/{chunk-JXAJDINF.js → chunk-TR7C5HOC.js} +2 -2
  76. package/dist/{chunk-3OPIMH42.js → chunk-U244OVE6.js} +2 -2
  77. package/dist/chunk-U267E6YN.js +120 -0
  78. package/dist/chunk-U3JW5AYG.js +2 -0
  79. package/dist/{chunk-JQ2PCFZW.js → chunk-UKUISUS6.js} +2 -2
  80. package/dist/{chunk-2HFXPIBT.js → chunk-UWR52GNZ.js} +2 -2
  81. package/dist/{chunk-CVBS2FD4.js → chunk-V7MX6YUF.js} +2 -2
  82. package/dist/{chunk-BVUA3GZC.js → chunk-VCRMI56V.js} +2 -2
  83. package/dist/{chunk-753JWTUH.js → chunk-VDHEX6YO.js} +2 -2
  84. package/dist/{chunk-AMPN2VMF.js → chunk-W2I4QAW7.js} +2 -2
  85. package/dist/{chunk-P5QZILZ4.js → chunk-W3HSUCRG.js} +2 -2
  86. package/dist/{chunk-62Y3PC27.js → chunk-WENI5ZDR.js} +2 -2
  87. package/dist/{chunk-RYFIRFYJ.js → chunk-WGDIA2TU.js} +2 -2
  88. package/dist/{chunk-L27UIF3E.js → chunk-WT34AUWL.js} +2 -2
  89. package/dist/{chunk-HLRWOFXC.js → chunk-X566NT42.js} +2 -2
  90. package/dist/{chunk-ZEKBAMCN.js → chunk-XKWEMFHP.js} +2 -2
  91. package/dist/{chunk-SEEJPIWG.js → chunk-Y4BBVPRK.js} +2 -2
  92. package/dist/{chunk-KP2DJY7D.js → chunk-Y5BOEWAE.js} +2 -2
  93. package/dist/cli.js +321 -302
  94. package/dist/{config-types-SVkUIufk.d.ts → config-types-70s7NxKB.d.ts} +2 -0
  95. package/dist/{db-CS0TuVH6.d.ts → db-BBmJ0v3b.d.ts} +1 -1
  96. package/dist/{health-Btal3mQi.d.ts → health-CWpFL_6z.d.ts} +1 -1
  97. package/dist/index.d.ts +3 -3
  98. package/dist/index.js +1 -1
  99. package/dist/queries/affected.d.ts +2 -2
  100. package/dist/queries/affected.js +1 -1
  101. package/dist/queries/bottlenecks.d.ts +2 -2
  102. package/dist/queries/bottlenecks.js +1 -1
  103. package/dist/queries/by-kind.d.ts +2 -2
  104. package/dist/queries/by-kind.js +1 -1
  105. package/dist/queries/call-graph.d.ts +2 -2
  106. package/dist/queries/call-graph.js +1 -1
  107. package/dist/queries/change-surface.d.ts +2 -2
  108. package/dist/queries/change-surface.js +1 -1
  109. package/dist/queries/cleanup-plan.d.ts +2 -2
  110. package/dist/queries/cleanup-plan.js +1 -1
  111. package/dist/queries/co-change.d.ts +2 -2
  112. package/dist/queries/co-change.js +1 -1
  113. package/dist/queries/code.d.ts +2 -2
  114. package/dist/queries/code.js +1 -1
  115. package/dist/queries/complexity-hotspots.d.ts +2 -2
  116. package/dist/queries/complexity-hotspots.js +1 -1
  117. package/dist/queries/complexity.d.ts +2 -2
  118. package/dist/queries/complexity.js +1 -1
  119. package/dist/queries/convergence.d.ts +2 -2
  120. package/dist/queries/convergence.js +1 -1
  121. package/dist/queries/coupling.d.ts +2 -2
  122. package/dist/queries/coupling.js +1 -1
  123. package/dist/queries/cycles.d.ts +2 -2
  124. package/dist/queries/cycles.js +1 -1
  125. package/dist/queries/dataflow.d.ts +2 -2
  126. package/dist/queries/dataflow.js +1 -1
  127. package/dist/queries/dead.d.ts +2 -2
  128. package/dist/queries/dead.js +1 -1
  129. package/dist/queries/decorative-checkers.d.ts +2 -2
  130. package/dist/queries/decorative-checkers.js +1 -1
  131. package/dist/queries/deep-chains.d.ts +2 -2
  132. package/dist/queries/deep-chains.js +1 -1
  133. package/dist/queries/deps.d.ts +2 -2
  134. package/dist/queries/deps.js +1 -1
  135. package/dist/queries/diff-gate.d.ts +2 -2
  136. package/dist/queries/diff-gate.js +1 -1
  137. package/dist/queries/diff-impact.d.ts +2 -2
  138. package/dist/queries/diff-impact.js +1 -1
  139. package/dist/queries/doc-drift.d.ts +2 -2
  140. package/dist/queries/doc-drift.js +1 -1
  141. package/dist/queries/drift.d.ts +2 -2
  142. package/dist/queries/drift.js +1 -1
  143. package/dist/queries/duplicate-bodies.d.ts +2 -2
  144. package/dist/queries/duplicate-bodies.js +1 -1
  145. package/dist/queries/extract-candidates.d.ts +2 -2
  146. package/dist/queries/extract-candidates.js +1 -1
  147. package/dist/queries/fan.d.ts +2 -2
  148. package/dist/queries/fan.js +1 -1
  149. package/dist/queries/files.d.ts +2 -2
  150. package/dist/queries/health.d.ts +3 -3
  151. package/dist/queries/health.js +1 -1
  152. package/dist/queries/hierarchy.d.ts +2 -2
  153. package/dist/queries/hierarchy.js +1 -1
  154. package/dist/queries/hotspots.d.ts +2 -2
  155. package/dist/queries/hotspots.js +1 -1
  156. package/dist/queries/imports.d.ts +2 -2
  157. package/dist/queries/imports.js +1 -1
  158. package/dist/queries/incomplete-migration.d.ts +2 -2
  159. package/dist/queries/incomplete-migration.js +1 -1
  160. package/dist/queries/index.d.ts +3 -3
  161. package/dist/queries/index.js +1 -1
  162. package/dist/queries/isolated.d.ts +2 -2
  163. package/dist/queries/isolated.js +1 -1
  164. package/dist/queries/locality-candidates.d.ts +2 -2
  165. package/dist/queries/locality-candidates.js +1 -1
  166. package/dist/queries/members.d.ts +2 -2
  167. package/dist/queries/members.js +1 -1
  168. package/dist/queries/methods.d.ts +2 -2
  169. package/dist/queries/methods.js +1 -1
  170. package/dist/queries/not-implemented.d.ts +2 -2
  171. package/dist/queries/not-implemented.js +1 -1
  172. package/dist/queries/outline.d.ts +2 -2
  173. package/dist/queries/outline.js +1 -1
  174. package/dist/queries/passthrough-candidates.d.ts +2 -2
  175. package/dist/queries/passthrough-candidates.js +1 -1
  176. package/dist/queries/plan-context.d.ts +2 -2
  177. package/dist/queries/plan-context.js +1 -1
  178. package/dist/queries/react-component-duplicates.d.ts +2 -2
  179. package/dist/queries/react-component-duplicates.js +1 -1
  180. package/dist/queries/react-hook-candidates.d.ts +2 -2
  181. package/dist/queries/react-hook-candidates.js +1 -1
  182. package/dist/queries/react-large-component-pressure.d.ts +2 -2
  183. package/dist/queries/react-large-component-pressure.js +1 -1
  184. package/dist/queries/recent-duplicates.d.ts +2 -2
  185. package/dist/queries/recent-duplicates.js +1 -1
  186. package/dist/queries/redundant-reexports.d.ts +2 -2
  187. package/dist/queries/redundant-reexports.js +1 -1
  188. package/dist/queries/refs.d.ts +2 -2
  189. package/dist/queries/refs.js +1 -1
  190. package/dist/queries/self-audit.d.ts +2 -2
  191. package/dist/queries/self-audit.js +1 -1
  192. package/dist/queries/similar-chains.d.ts +2 -2
  193. package/dist/queries/similar-chains.js +1 -1
  194. package/dist/queries/similar-files.d.ts +2 -2
  195. package/dist/queries/similar-files.js +1 -1
  196. package/dist/queries/similar-signatures.d.ts +2 -2
  197. package/dist/queries/similar-signatures.js +1 -1
  198. package/dist/queries/similar.d.ts +2 -2
  199. package/dist/queries/similar.js +1 -1
  200. package/dist/queries/slice.d.ts +2 -2
  201. package/dist/queries/slice.js +1 -1
  202. package/dist/queries/stale-abstractions.d.ts +2 -2
  203. package/dist/queries/stale-abstractions.js +1 -1
  204. package/dist/queries/stats.d.ts +2 -2
  205. package/dist/queries/surface.d.ts +2 -2
  206. package/dist/queries/surface.js +1 -1
  207. package/dist/queries/symbols.d.ts +2 -2
  208. package/dist/queries/symbols.js +1 -1
  209. package/dist/queries/system.d.ts +2 -2
  210. package/dist/queries/system.js +1 -1
  211. package/dist/queries/test-quality.d.ts +2 -2
  212. package/dist/queries/test-quality.js +1 -1
  213. package/dist/queries/trace.d.ts +2 -2
  214. package/dist/queries/trace.js +1 -1
  215. package/dist/queries/twin-ab.d.ts +2 -2
  216. package/dist/queries/twin-ab.js +1 -1
  217. package/dist/queries/twin-drift.d.ts +2 -2
  218. package/dist/queries/twin-drift.js +1 -1
  219. package/dist/queries/unused-imports.d.ts +2 -2
  220. package/dist/queries/unused-imports.js +1 -1
  221. package/dist/queries/unused-params.d.ts +2 -2
  222. package/dist/queries/unused-params.js +1 -1
  223. package/dist/queries/vue-component-duplicates.d.ts +2 -2
  224. package/dist/queries/vue-component-duplicates.js +1 -1
  225. package/dist/queries/vue-composable-candidates.d.ts +2 -2
  226. package/dist/queries/vue-composable-candidates.js +1 -1
  227. package/dist/queries/vue-large-view-pressure.d.ts +2 -2
  228. package/dist/queries/vue-large-view-pressure.js +1 -1
  229. package/dist/queries/wrapper-candidates.d.ts +2 -2
  230. package/dist/queries/wrapper-candidates.js +1 -1
  231. package/dist/reindex-worker.js +26 -26
  232. package/dist/reindex.d.ts +3 -3
  233. package/dist/reindex.js +38 -34
  234. package/dist/runtime.d.ts +5 -3
  235. package/dist/runtime.js +1 -2
  236. package/dist/{scip-cli-BKL-26TZ.d.ts → scip-cli-CoMzb7Zu.d.ts} +1 -1
  237. package/dist/watch-server.js +4 -4
  238. package/docs/COMMAND_REFERENCE.md +1 -1
  239. package/package.json +2 -1
  240. package/skills/_shared/SKILL.md +2 -2
  241. package/skills/scip-calibrate/SKILL.md +5 -4
  242. package/skills/scip-tla-model-system/SKILL.md +10 -8
  243. package/skills/scip-verify/SKILL.md +3 -2
  244. package/dist/chunk-5P26M63Y.js +0 -2
  245. package/dist/chunk-FFIYGYQR.js +0 -67
  246. package/dist/chunk-QVZSWLLZ.js +0 -2
  247. package/dist/chunk-WFRZGMWJ.js +0 -71
  248. package/dist/chunk-XAEU4ROB.js +0 -101
  249. 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.
@@ -80,7 +80,9 @@ declare class Watcher {
80
80
  requestRefresh(trigger: RefreshTrigger, opts?: {
81
81
  immediate?: boolean;
82
82
  }): void;
83
+ private isIgnoredWatchPath;
83
84
  private handleFileChange;
85
+ private relativeWatchPath;
84
86
  private scheduleReindex;
85
87
  private triggerReindex;
86
88
  /**
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 j,c as b,d as D,f,g as T,k as m,l as W}from"./chunk-MON5XXTG.js";import{a as k}from"./chunk-YZXV3CU3.js";import{c as g,d as y}from"./chunk-E7BTIEAY.js";import{fork as $}from"child_process";import{statSync as _}from"fs";import{isAbsolute as F,join as G,relative as M}from"path";import{watch as N}from"chokidar";import A 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=T(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=k(t.projectRoot),this.extraIgnore=A(),this.watchConfig.ignore.length>0&&this.extraIgnore.add(this.watchConfig.ignore)}start(){this.stopped=!1,this.setStatus({state:"idle"}),this.startGitStatePolling();try{let t=N(this.projectRoot,{ignoreInitial:!0,ignored:(e,i)=>this.isIgnoredWatchPath(e,i?.isDirectory()??!1)});t.on("all",(e,i)=>{this.stopped||this.handleFileChange(i)}),t.on("error",e=>{this.onError(new Error(`Failed to watch ${this.projectRoot}: ${String(e)}`))}),this.fsWatchers.push(t)}catch(t){this.onError(new Error(`Failed to watch ${this.projectRoot}: ${String(t)}`))}}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=P(this.pendingTrigger,t),this.changedFiles+=1,this.clearDebounceTimer(),this.triggerReindex()}isIgnoredWatchPath(t,e){let i=this.relativeWatchPath(t);if(!i)return!1;let r=e?`${i}/`:i;return r===".git/"||r.startsWith(".git/")?!0:this.gitignoreFilter.isIgnored(r)||this.extraIgnore.ignores(r)}handleFileChange(t){let e=this.relativeWatchPath(t);!e||e===".."||e.startsWith("../")||e===".git"||e.startsWith(".git/")||this.gitignoreFilter.isIgnored(e)||this.extraIgnore.ignores(e)||e.endsWith("index.db")||e.endsWith("index.scip")||e.endsWith("index.db.tmp")||this.scheduleReindex({kind:"watch-source",detail:e})}relativeWatchPath(t){let e=F(t)?t:G(this.projectRoot,t);return M(this.projectRoot,e).replaceAll("\\","/")}scheduleReindex(t){if(this.pendingTrigger=P(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=$(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=y(this.projectRoot,t),i={head:g(this.projectRoot,["rev-parse","--verify","HEAD"]),indexPath:e};try{let r=_(e);i.indexMtimeMs=r.mtimeMs,i.indexSize=r.size}catch{i.indexMtimeMs=void 0,i.indexSize=void 0}return i}clearGitPollTimer(){this.gitPollTimer&&(clearInterval(this.gitPollTimer),this.gitPollTimer=null)}};function P(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 O,symlinkSync as L,readlinkSync as I,unlinkSync as w,readdirSync as U}from"fs";import{join as p,dirname as R,resolve as u,relative as X,isAbsolute as q}from"path";import{homedir as v,platform as H}from"os";import{fileURLToPath as z}from"url";var J=H()==="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 K(s={}){let t=s.quiet?()=>{}:console.log,e=z(import.meta.url),i=u(R(e),"..","skills"),r=[p(v(),".claude","skills"),p(v(),".codex","skills"),p(v(),".agents","skills")],o={installed:[],skipped:[],alreadyLinked:[],pruned:[]};for(let n of r){let c=R(n);if(!x(c))continue;O(n,{recursive:!0});let a=Y(n);B(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 E=I(d);if(u(E)===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}w(d)}L(h,d,J?"junction":"dir"),o.installed.push(`${a}/${l}`),t(` done: ${l} \u2192 ${a}`)}}return o}function B(s,t,e,i,r){let o=new Set(C);for(let n of U(s)){if(o.has(n))continue;let c=p(s,n),a;try{a=u(R(c),I(c))}catch{continue}V(a,t)&&(w(c),i.pruned.push(`${e}/${n}`),r(` prune: ${n} \u2192 ${e} (removed stale scip-query skill link)`))}}function V(s,t){let e=X(u(t),u(s));return e===""||!e.startsWith("..")&&!q(e)}function Y(s){return s.includes(".codex")?"Codex":s.includes(".agents")?"Agents":"Claude"}export{S as Watcher,b as getScipVersion,W as initProjectConfig,K as installSkills,j as isScipInstalled,f as loadProjectConfig,D 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{A as Q,B as yt,Ba as _t,C as St,Ca as de,D as xt,Da as Ot,Ea as Wt,F as oe,Fa as Gt,G as It,H as vt,J as Rt,K as Mt,L as Dt,M as Tt,N as se,O as ae,P as Pt,R as Ct,S as Fe,T as kt,U as Ft,V as wt,Y as Et,a as et,aa as H,b as tt,ba as le,c as De,ca as we,d as nt,da as Lt,ea as Nt,f as rt,fa as B,g as it,h as ot,j as Te,k as Pe,l as st,m as at,o as ct,p as lt,q as dt,qa as jt,r as pt,s as ut,t as ft,ta as Ee,v as mt,w as ht,x as Ce,y as ke,z as gt,za as At}from"./chunk-U267E6YN.js";import{b as K,f as q,j as bt,k as ce}from"./chunk-SMBIGBGN.js";import{a as V,b as j}from"./chunk-3M2UCPFS.js";import{a as ie,c as Ze,d as Me,e as N}from"./chunk-JHK2DMUQ.js";import T from"process";import{rmSync as jn}from"fs";import{resolve as Ii}from"path";import{pathToFileURL as vi}from"url";import{existsSync as $t,readFileSync as On}from"fs";function Le(n,e,t){let r=new Date().toISOString();if(!$t(t.dbPath))return{state:"missing",checkedAt:r,metaPath:t.metaPath,reason:"No SQLite index database exists.",remedy:"Run: scip-query reindex"};if(!$t(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(On(t.metaPath,"utf-8")),o=e.languages??Et(n),a=Wn(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=jt(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 Wn(n,e,t){return bt(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 Gn}from"child_process";import{statSync as $n}from"fs";import{isAbsolute as qn,join as Hn,relative as Bn}from"path";import{watch as Un}from"chokidar";import zn 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=zn(),this.watchConfig.ignore.length>0&&this.extraIgnore.add(this.watchConfig.ignore)}start(){this.stopped=!1,this.setStatus({state:"idle"}),this.startGitStatePolling();try{let e=Un(this.projectRoot,{ignoreInitial:!0,ignored:(t,r)=>this.isIgnoredWatchPath(t,r?.isDirectory()??!1)});e.on("all",(t,r)=>{this.stopped||this.handleFileChange(r)}),e.on("error",t=>{this.onError(new Error(`Failed to watch ${this.projectRoot}: ${String(t)}`))}),this.fsWatchers.push(e)}catch(e){this.onError(new Error(`Failed to watch ${this.projectRoot}: ${String(e)}`))}}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=qt(this.pendingTrigger,e),this.changedFiles+=1,this.clearDebounceTimer(),this.triggerReindex()}isIgnoredWatchPath(e,t){let r=this.relativeWatchPath(e);if(!r)return!1;let i=t?`${r}/`:r;return i===".git/"||i.startsWith(".git/")?!0:this.gitignoreFilter.isIgnored(i)||this.extraIgnore.ignores(i)}handleFileChange(e){let t=this.relativeWatchPath(e);!t||t===".."||t.startsWith("../")||t===".git"||t.startsWith(".git/")||this.gitignoreFilter.isIgnored(t)||this.extraIgnore.ignores(t)||t.endsWith("index.db")||t.endsWith("index.scip")||t.endsWith("index.db.tmp")||this.scheduleReindex({kind:"watch-source",detail:t})}relativeWatchPath(e){let t=qn(e)?e:Hn(this.projectRoot,e);return Bn(this.projectRoot,t).replaceAll("\\","/")}scheduleReindex(e){if(this.pendingTrigger=qt(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=Gn(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=De(this.projectRoot,["rev-parse","--git-path","index"]);if(!e)return null;let t=nt(this.projectRoot,e),r={head:De(this.projectRoot,["rev-parse","--verify","HEAD"]),indexPath:t};try{let i=$n(t);r.indexMtimeMs=i.mtimeMs,r.indexSize=i.size}catch{r.indexMtimeMs=void 0,r.indexSize=void 0}return r}clearGitPollTimer(){this.gitPollTimer&&(clearInterval(this.gitPollTimer),this.gitPollTimer=null)}};function qt(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 Ht,statSync as Jn}from"fs";import{join as Vn}from"path";function Kn(){return process.env.SCIP_QUERY_PROJECT_ROOT??process.cwd()}function Qn(n=Kn()){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(Ht(t.dbPath))return{projectRoot:n,config:e,paths:t,dbPath:t.dbPath,dbPathSource:"configured"};let i=Vn(n,"index.db");return{projectRoot:n,config:e,paths:t,dbPath:i,dbPathSource:"root-fallback",rootFallbackWarning:Yn(i,t.dbPath)}}function Bt(n,e={}){let{config:t,paths:r,dbPath:i,dbPathSource:o,rootFallbackWarning:a}=Qn(n);if(!Ht(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:Ee(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 ot(s,c)}function Yn(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 Mn,readdirSync as ni,rmSync as ri}from"fs";import{resolve as Se}from"path";import{resolve as yn}from"path";import{performance as y}from"perf_hooks";function ue(n){return{forFile(e,t){return Ut(n,e,t)},forFiles(e,t){let r=new Map;for(let i of e)r.set(i,Ut(n,i,t));return r}}}function Ut(n,e,t){let r={file:e},i=t.facts||t.identifiers;if(t.text&&(r.text=lt(n,e)),t.lines&&(r.lines=dt(n,e)),t.ast&&(r.ast=pt(n,e)),t.imports&&(r.imports=St(n,e)),t.reexports&&(r.reexports=yt(n,e)),i){let o=ut(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 Xn={"/":"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=Zn(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 Zn(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||zt(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&&!zt(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=Xn[i];o&&e.push({name:r,suffix:o}),t+=1}}return e}function zt(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 Jt(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 er(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 Vt(n,e,t={}){let r=new Map;for(let o of e)n.length>0&&!er(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 tr=K("file-definitions",{clearGroups:["definition-catalog"]}),Io=K("file-function-like-definitions",{clearGroups:["definition-catalog"]});function O(n,e,t={}){return t.includeClassMemberFallbacks?Kt(n,e,void 0,{includeClassMemberFallbacks:!0}):tr.get(n,e,()=>{let r=nr(n,e);if(r)return r;let i=Kt(n,e),o=Pe(n),a=ue(n).forFile(e,{text:!0}).text;return o&&a&&Yt.write(n,e,Te(n,e,a),{projectFingerprint:o,definitions:i.map(s=>({...s}))}),i})}var Yt=at({kind:"file-definitions",invalidation:ct("file-definitions"),serialize:rr,deserialize:ir});function nr(n,e){let t=Pe(n);if(!t)return null;let r=ue(n).forFile(e,{text:!0}).text;if(!r)return null;let i=Yt.read(n,e,Te(n,e,r));return i?or(i,t,e):null}function rr(n){return JSON.stringify(n)}function ir(n){try{let e=JSON.parse(n);return!ke(e)||typeof e.projectFingerprint!="string"||!Array.isArray(e.definitions)?null:{projectFingerprint:e.projectFingerprint,definitions:e.definitions}}catch{return null}}function or(n,e,t){if(n.projectFingerprint!==e)return null;let r=[];for(let i of n.definitions){let o=sr(i,t);if(!o)return null;r.push(o)}return r}function sr(n,e){return!ke(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 Kt(n,e,t,r={}){let i=Vt(ar(n,e),cr(n,e),{sort:!0,includeClassMemberFallbacks:r.includeClassMemberFallbacks}).map(lr);return t&&(i=i.filter(t)),pr(n,e,i)}function ar(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 cr(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 lr(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:Jt(n.symbol),isTypeLike:_(n.symbol)==="type",kind:n.kind??null,documentation:n.documentation??null,enclosingSymbol:n.enclosing_symbol??null}}function Xt(n,e={}){return dr(n,e.scope)}function dr(n,e){return q(n,{scope:e,includeIgnored:!1}).flatMap(t=>O(n,t)).filter(t=>!n.isIgnored(t.relativePath))}function pr(n,e,t){let r=ue(n).forFile(e,{text:!0}).text,i=ft(n,e);return i?yr(t,i,r):r?ur(t,r):t}function ur(n,e){let t=e.split(/\r?\n/),r=fr(n,t),i=mr(n,r),o=hr(i,t);return gr(n,o)}function fr(n,e){let t=n.some(i=>me(i.symbol))?Mr(e):null,r=new Map;for(let i of n)r.set(i.symbolId,Rr(e,t,i));return r}function mr(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 hr(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:Dr(e,i.definition,i.startLine,a)})}return t}function gr(n,e){return n.map(t=>{let r=e.get(t.symbolId);return r?{...t,startLine:r.startLine,endLine:r.endLine}:t})}function yr(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(!vr(i)||!i.leaf)return Qt(i,t);let o=r.get(i.leaf);if(!o||o.length===0)return Qt(i,t);let a=t?Sr(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 Sr(n,e,t){let r=br(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=xr(i,a.startLine);if(s&&o.test(s))return a}return null}function br(n){return n.match(/\/impl#\[([^\]]+)\]/)?.[1]??null}function xr(n,e){for(let t=e;t>=0;t-=1){let r=n[t]?.trim()??"";if(r){if(/^impl\b/.test(r))return Ir(n,t,e);if(/^(?:struct|enum|trait|mod)\b/.test(r))return null}}return null}function Ir(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 vr(n){return me(n.symbol)?!0:_(n.symbol)==="term"&&U(n.symbol)===null}function Qt(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 Rr(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 Mr(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 Dr(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=Tr(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 Tr(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 Zt from"path";function Pr(n,e){return n.getReferences().map(t=>{let r=t.getNode();return he(r,e)})}function Cr(n){let e=n;return typeof e.findReferences=="function"?e.findReferences():[]}function en(n,e,t,r){let i=[];for(let o of Cr(n))for(let a of Pr(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 tn(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 nn(n,e,t){let r=n.getSourceFile(),i=je(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,Zt.join(t,l.file))===e))}function Ne(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 je(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=Zt.relative(n||process.cwd(),e).replace(/\\/g,"/");return!t||t.startsWith("..")?null:t}function rn(n,e,t,r){let i=kr(e,r);return i.size===0?new Map:Fr(n,t,i)}function kr(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 Fr(n,e,t){let r=new Map,i=new Map;return e.forEachDescendant(o=>{for(let a of wr(n,o)){let s=t.get(a);if(!s)continue;let c=je(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 wr(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 Er=K("ts-definition-leaf-candidates",{clearGroups:["definition-catalog"]});function on(n,e,t,r){let i=Oe(n,e),o=Ae(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 Ae(a,t)}function _e(n,e,t,r){return Ae(Oe(n,e).get(r)??[],t)}function sn(n,e){let t=new Map;for(let[r,i]of Oe(n,e)){let o=i[0];o&&t.set(r,o)}return t}function Oe(n,e){return Er.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 Ae(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 an(n,e){let t=new Map,r=null,i=null,o=()=>(i??=q(n,{extensions:se}),i),a=()=>(r??=N("typescript.source-file-index",()=>Lr(n.config.projectRoot,e,o()),()=>({projects:e.length,indexedDocuments:o().length})),r),s=c=>ae(c)?D(t,c,()=>{let l=Y(We.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 Lr(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 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 We.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 cn(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 Nr}from"fs";import b from"path";var $e=["tsconfig.json","tsconfig.app.json","tsconfig.node.json","tsconfig.base.json"];function qe(n,e){let r=e?b.dirname(b.join(n,e)):n,i=b.resolve(n);for(;r.startsWith(i);){for(let a of $e){let s=b.join(r,a);if(X(s))return s}let o=b.dirname(r);if(o===r)break;r=o}for(let o of $e){let a=b.join(n,o);if(X(a))return a}return null}function ln(n){let e=n.config.projectRoot,t=new Set(jr(e,n.config.semantic?.typescript?.tsconfigs)),r=q(n,{includeIgnored:!1,extensions:se});for(let i of r){let o=qe(e,i);o&&t.add(b.resolve(o))}if(t.size===0){let i=qe(e);i&&t.add(b.resolve(i))}return[...t].filter(i=>!dn(e,i)).sort((i,o)=>i.localeCompare(o))}function jr(n,e=[]){let t=new Set;for(let r of e){let i=b.isAbsolute(r)?r:b.join(n,r);X(i)&&t.add(b.resolve(i))}for(let r of Ar(n))for(let i of $e){let o=b.join(r,i);X(o)&&t.add(b.resolve(o))}if(t.size===0){let r=qe(n);r&&t.add(b.resolve(r))}return[...t].filter(r=>!dn(n,r)).sort((r,i)=>r.localeCompare(i))}function Ar(n){let e=b.join(n,"package.json");if(!X(e))return[];let t;try{t=JSON.parse(Nr(e,"utf8"))}catch{return[]}return(Array.isArray(t.workspaces)?t.workspaces:t.workspaces?.packages??[]).flatMap(i=>ht(n,i))}function dn(n,e){let t=b.relative(n,e).replace(/\\/g,"/");return t.startsWith("..")||t.includes("/node_modules/")||t.startsWith("node_modules/")||t.includes("/dist/")||t.startsWith("dist/")}var _r=32;function gn(n,e,t,r={}){return N("typescript.provider.construct",()=>new Be(n,e,t),()=>({tsconfigs:t.length,reusedProjects:r.reusedProjects===!0}))}var Be=class{constructor(e,t,r){this.db=e;this.tsMorph=t;this.projects=r;this.workspacePackages=mt(e.config.projectRoot),this.sourceFiles=an(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=Wr();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=>!un(d));if(s.length>=_r){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=>un(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=fn();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,...mn(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=Xt(this.db).filter(o=>ae(o.relativePath)),r=e.filter(o=>this.sourceFiles.sourceFile(o)!==null),i=this.referencesForDefinitionsBySymbolScan(t,r);return kt(t,i,r)}referencesForDefinitionsBySymbolScan(e,t){let r=ie(),i=fn(),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 R=o.get(h.symbolId)??[];R.push(...S),o.set(h.symbolId,R)}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 R=z(S);o.set(h,R),r&&(i.referenceCount+=R.length)}},()=>({definitions:e.length,...mn(i)})),o}addReferencesFromSourceFileScan(e,t,r,i,o,a,s,c,l,d){let p=this.compilerCheckerForSourceFile(e),u=e.compilerNode,g=qr(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 R=D(c,h,()=>this.compilerSymbolKeys(h)),E=null,P=null,C=S&&r.has(S.symbolId)?i.get(S.symbolId):void 0;if(C&&(E=He(u,m),!pn(C,t,E))){let M=u.getLineAndCharacterOfPosition(m.getStart(u));P={file:t,line:M.line,column:M.character};let k=l.get(C.symbolId)??[];k.push(P),l.set(C.symbolId,k),d&&(d.requestedHits+=1)}for(let M of R)for(let k of o.get(M)?.values()??[]){if(E??=He(u,m),pn(k,t,E))continue;if(!P){let I=u.getLineAndCharacterOfPosition(m.getStart(u));P={file:t,line:I.line,column:I.character}}let x=l.get(k.symbolId)??[];x.push(P),l.set(k.symbolId,x),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=en(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 hn(c)}),o=r.getReturnType().getText(t);return`(${i.join(",")})=>${hn(o)}`})}importUsageForSourceFile(e,t,r){let i=[],o=new Map;for(let a of t.getImportDeclarations()){r.declarations+=1;let s=Ce(this.db,e,a.getModuleSpecifierValue()),c=a.getImportClause()?.isTypeOnly()??!1;for(let l of Ue(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||Gr(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?Or(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 tn(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=>!Ne(c.node)),a=i.some(c=>Ne(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 Ue(i)){if(s.kind!=="named"||!s.identifier)continue;let c=a.get(s.importedName);if(!c||c.size===0)continue;let l=nn(s.identifier,r,this.db.config.projectRoot);l.length>0&&zr(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 cn(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?Ce(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,()=>sn(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?rn(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?_e(this.db,d,p,i)??(g&&g!==i?_e(this.db,d,p,g):null):on(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?Br():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((x,I)=>x.startLine-I.startLine||I.endLine-x.endLine);if(r&&(l=Math.round(y.now()-m)),i=h.length,h.length===0)return new Map;let S=new Map,R=r?y.now():0,E=this.compilerCheckerForSourceFile(f),P=f.compilerNode;r&&(d=Math.round(y.now()-R));let C=new Map,M=x=>{if(this.tsMorph.ts.isCallExpression(x)||this.tsMorph.ts.isNewExpression(x)){r&&(o+=1);let I=this.semanticCalleeForCallNode(E,P,h,x,C,t,u);I&&(r&&(a+=1),$r(S,I.callerId,I.target))}this.tsMorph.ts.forEachChild(x,M)},k=r?y.now():0;M(P),r&&(p=Math.round(y.now()-k));for(let[x,I]of S)S.set(x,Jr(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?Ur(u):{}}))}semanticCalleeForCallNode(e,t,r,i,o,a,s){let c=s?y.now():0,l=Hr(r,He(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 Ue(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 Or(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 Wr(){return{declarations:0,entries:0,bindingSymbols:0,missingBindingSymbols:0,scannedIdentifiers:0,symbolLookups:0,matchedReferences:0,fallbackEntries:0}}function Gr(n){for(let e=n;e;e=e.getParent())if(e.getKindName()==="ImportDeclaration")return!0;return!1}function $r(n,e,t){let r=n.get(e);r||(r=[],n.set(e,r)),r.push(t)}function qr(n){let e=new Set;for(let t of n.getImportDeclarations())for(let r of Ue(t))r.localName&&e.add(r.localName);return e}function Hr(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 He(n,e){return n.getLineAndCharacterOfPosition(e.getStart(n)).line}function pn(n,e,t){return e===n.relativePath&&t>=n.startLine&&t<=n.endLine}function un(n){return n.symbol.includes("#")?_(n.symbol)==="type"&&n.relativePath.endsWith(".d.ts"):!1}function Br(){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 Ur(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 fn(){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 mn(n){return{...n,scanMs:Math.round(n.scanMs),packageRefsMs:Math.round(n.packageRefsMs),semanticRefsMs:Math.round(n.semanticRefsMs),hierarchyMs:Math.round(n.hierarchyMs)}}function zr(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 hn(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??Pt,this.discoverTsconfigs=t.discoverTsconfigs??ln,this.createProjects=t.createProjects??Ct,this.createProvider=t.createProvider??((r,i,o)=>gn(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=Vr(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"&&(Kr(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=Fe("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=Fe("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 Vr(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=ze(n.changes,"added"),r=ze(n.changes,"modified"),i=ze(n.changes,"deleted");return{mode:t.length+r.length+i.length===0?"reuse":"refresh",addedFiles:t,modifiedFiles:r,deletedFiles:i,reasons:[]}}function ze(n,e){return n.filter(t=>t.kind===e).map(t=>t.path).sort()}function Kr(n,e,t){for(let r of n){for(let i of t.deletedFiles)r.project.getSourceFile(yn(e,i))?.forget();for(let i of t.modifiedFiles){let o=r.project.getSourceFile(yn(e,i));o&&o.refreshFromFileSystemSync()}t.addedFiles.length>0&&r.project.addSourceFilesFromTsConfig(r.tsconfigPath)}}import{createHash as Qr}from"crypto";import{readFileSync as Yr}from"fs";import{dirname as Xr,join as ye}from"path";var Z=2,Zr="typescript-semantic";function bn(n){let e=ye(n,Zr);return{rootDir:e,requestDir:ye(e,"requests"),responseDir:ye(e,"responses")}}function xn(n){try{let e=JSON.parse(Yr(ye(Xr(n),"meta.json"),"utf8"));return e.version!==2&&e.version!==3||typeof e.status!="string"||typeof e.updatedAt!="string"||e.fingerprint===void 0?null:Qr("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 In(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&&!ei(e.profileEnvironment)||!e.request||!ti(e.request))throw new Error("TypeScript semantic service received an invalid mailbox request.");return e}function ei(n){return!!n&&typeof n=="object"&&!Array.isArray(n)&&Object.values(n).every(e=>typeof e=="string"||e===null)}function ti(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 gt(e.files)!==null;case"references":return Sn(e.definitions)&&(e.exact===void 0||typeof e.exact=="boolean");case"callees":return Sn(e.definitions);case"signature":return vn(e.definition);default:return!1}}function Sn(n){return Array.isArray(n)&&n.every(vn)}function vn(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??xn,this.readSnapshot=e.readSnapshot??si,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[...ii(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[...oi(r,t.definitions)];case"signature":return r.signatureFor(t.definition);default:return ci(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,ai(this.snapshot,i)),this.db=t,o.close()}this.generation=r,this.snapshot=i,this.available=null}};function Je(n){Rn(n.requestDir,{recursive:!0}),Rn(n.responseDir,{recursive:!0})}function Dn(n,e,t={}){Je(n);let r=0;for(let i of ni(n.requestDir).filter(o=>o.endsWith(".json")).sort()){let o=Se(n.requestDir,i),a=i.slice(0,-5),s=null;try{let c=In(Mn(o,"utf8"));if(a=c.id,c.deadlineAtMs<(t.nowMs??Date.now()))throw new Error("TypeScript semantic request expired before processing.");s=Ze(),Me(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&&Me(s),t.afterRequest?.(),ri(o,{force:!0}),r+=1}}return r}function ii(n,e,t){return n.referencesForDefinitions?.(e,t)??new Map(e.map(r=>[r.symbolId,n.referencesFor(r)]))}function oi(n,e){return n.calleesForDefinitions?.(e)??new Map(e.map(t=>[t.symbolId,n.calleesFor(t)]))}function si(n){try{let e=JSON.parse(Mn(Se(n,"..","meta.json"),"utf8"));return Ft(e.fingerprint)}catch{return null}}function ai(n,e){return e?wt(n,e):{version:1,changes:[],projectIdentityChanged:!0,uncertainty:["prior-snapshot-unavailable"]}}function ci(n){throw new Error(`Unhandled TypeScript semantic request: ${JSON.stringify(n)}`)}import{mkdirSync as Tn,readFileSync as li,readdirSync as di,rmSync as pi}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??_t,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 Ve(n){Tn(n.requestDir,{recursive:!0}),Tn(n.responseDir,{recursive:!0})}function Pn(n,e,t={}){Ve(n);let r=0;for(let i of di(n.requestDir).filter(o=>o.endsWith(".json")).sort()){let o=xe(n.requestDir,i),a=i.slice(0,-5);try{let s=Wt(li(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?.(),pi(o,{force:!0}),r+=1}}return r}import{existsSync as wn,lstatSync as ve,readFileSync as Xe,readdirSync as En,realpathSync as Cn,rmSync as ee,statSync as ui}from"fs";import{join as v,resolve as W,sep as kn}from"path";var fi=3600*1e3,mi=2*1024*1024*1024,hi=300*1e3;function gi(n){let e=n.leases.filter(s=>s.managed&&!s.live&&!s.busy),t=yi(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 yi(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 Ln(n,e,t={}){if(!Nt())return{kind:"disabled"};let r=et(n);if(!r)return{kind:"unavailable"};let i=v(we(),"repositories",r.repositoryId);if(!wn(i))return{kind:"unavailable"};let o=(t.now??Date.now)(),a=v(i,"gc-state.json"),s=xi(a);if(!t.force&&s&&o-Date.parse(s.lastSweepAt)<hi)return{kind:"throttled",sweptAt:s.lastSweepAt};let c=rt(i,{now:()=>o});if(!c)return{kind:"busy"};try{let l=Si(n,i,r.repositoryId,s?.unreferencedSince??{}),d=gi({nowMs:o,...l,policy:{generationTtlMs:t.policy?.generationTtlMs??fi,budgetBytes:t.policy?.budgetBytes??mi}}),p=0,u=0;for(let m of d.deleteWorktrees){if(!Nn(m.lease))continue;let h=it(v(m.lease.localCacheDir,"cache-lifecycle.lock"));if(h)try{if(Qe(m.lease,!0))continue;try{vt({projectRoot:m.lease.projectRoot,cacheDir:m.lease.localCacheDir,cliVersion:e})}catch{continue}if(Qe(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;st(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 Si(n,e,t,r){let i=new Set(tt(n).map(l=>W(l.path))),o=[];for(let l of Ke(v(e,"worktrees"))){if(!l.endsWith(".json"))continue;let d=v(e,"worktrees",l),p=bi(d);if(!p)continue;let u=W(p.projectRoot);o.push({leasePath:d,lease:p,managed:p.repositoryId===t&&Nn(p),live:i.has(u)||wn(u),busy:Qe(p)})}let a=[];for(let l of Ke(v(e,"locks"))){let d=/^([a-f0-9]{64})\.lock$/.exec(l);if(!d)continue;let p=v(e,"locks",l),u=Ye(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 Ke(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:Fn(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:Fn(p),...r[l]===void 0?{}:{unreferencedAt:r[l]}})}return{leases:o,generations:s,locks:a,temporaries:c}}function Nn(n){if(n.ownershipChecksum!==At(n)||W(n.localCacheDir)!==W(Lt(n.projectRoot)))return!1;let e=W(we()),t=W(v(e,"projects")),r=W(n.localCacheDir);if(!r.startsWith(`${t}${kn}`))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=Cn(t);return Cn(r).startsWith(`${s}${kn}`)}catch{return!1}}function Qe(n,e=!1){for(let r of e?["index.lock"]:["index.lock","cache-lifecycle.lock"]){let i=Ye(v(n.localCacheDir,r));if(i!==void 0&&V(i))return!0}let t=Ye(oe(n.localCacheDir).lockPath);return t!==void 0&&V(t)}function bi(n){try{let e=JSON.parse(Xe(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 Ye(n){try{let e=JSON.parse(Xe(n,"utf8"));return typeof e.pid=="number"&&Number.isSafeInteger(e.pid)&&e.pid>0?e.pid:void 0}catch{return}}function xi(n){try{let e=JSON.parse(Xe(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 Ke(n){try{return En(n)}catch{return[]}}function Fn(n){let e=0,t=[n];for(;t.length>0;){let r=t.pop();for(let i of En(r,{withFileTypes:!0})){let o=v(r,i.name);i.isDirectory()?t.push(o):i.isFile()&&(e+=ui(o).size)}}return e}var Ri=1e3,Mi=250,Di=10;function Ti(n){return n==="fresh"?null:{kind:"watch-startup",detail:`index ${n} when watch service started`}}async function Pi(n,e,t={}){let r=It(n,e),i=r.projectRoot,o=H(i);o.watch={...o.watch,...t};let a=le(o);if(!a.enabled)throw new Error('watch mode is disabled; set "watch.enabled": true before starting the service');let s=B(i,o),c=oe(s.cacheDir),l=Dt(c.lockPath,i);if(!l.acquired)return;let d=Date.now(),p=d,u={state:"idle"},g,f,m=!1,h=!1,S=0,R=0,E=0,P=0,C,M,k=bn(s.cacheDir),x=Ot(s.cacheDir);Je(k),Ve(x);let I=new be({openDb:()=>Bt(i)}),Re=new Ie({projectRoot:i,currentGeneration:()=>Gt(s.dbPath)}),w=(L=!1)=>{if(!h)return;let $=Date.now();!L&&$-R<Ri||(R=$,Rt(c.statePath,{version:1,protocolVersion:xt,pid:T.pid,projectRoot:i,...r.worktreeId?{worktreeId:r.worktreeId}:{},cliVersion:e,startedAt:new Date(d).toISOString(),heartbeatAt:new Date($).toISOString(),lastActivityAt:new Date(p).toISOString(),...a.idleTimeoutMs===0?{}:{idleDeadlineAt:new Date(p+a.idleTimeoutMs).toISOString()},watcher:u,...g?{lastRefresh:g}:{},...f?{lastError:f}:{},typescriptSemantic:{...I.status(),...C===void 0?{}:{busyUntil:new Date(C).toISOString()}},typescriptIndex:{...Re.status(),...M===void 0?{}:{busyUntil:new Date(M).toISOString()}}}))},G=()=>{p=Date.now()},te=new pe({projectRoot:i,config:{...o,watch:a},languages:o.languages,onStatus(L){u=L,L.state!=="idle"&&G(),w(!0)},onReindexComplete(){G(),g=Le(i,o,s).lastRefresh,f=void 0,w(!0)},onError(L){G(),f={at:new Date().toISOString(),message:L.message},w(!0)}}),ne=()=>{m=!0};T.once("SIGINT",ne),T.once("SIGTERM",ne);try{te.start();let L=Le(i,o,s);g=L.lastRefresh;let $=Ti(L.state);for($&&te.requestRefresh($,{immediate:!0}),G(),h=!0,w(!0);!m;){let An=Pn(x,Re,{beforeRequest(F){M=F+5e3,w(!0)},afterRequest(){M=void 0,w(!0)}}),_n=Dn(k,I,{beforeRequest(F){C=F+5e3,w(!0)},afterRequest(){C=void 0,w(!0)}}),re=Date.now();if(re-P>=6e4&&(P=re,Ln(i,e)),re-E>=Mi){E=re;let F=Mt(c.activityPath);F&&F.atMs>p&&(p=F.atMs),F?.refreshRequestedAtMs!==void 0&&F.refreshRequestedAtMs>S&&(S=F.refreshRequestedAtMs,G(),te.requestRefresh({kind:"watch-demand",detail:F.refreshDetail??"stale index observed by a command"},{immediate:!0}))}if((_n>0||An>0)&&(G(),w(!0)),w(),Tt({watcher:u,lastActivityAtMs:p,nowMs:Date.now(),idleTimeoutMs:a.idleTimeoutMs}))break;await Ci(Di)}}finally{T.off("SIGINT",ne),T.off("SIGTERM",ne),I.closeTypeScriptService(),Re.close(),te.stop(),jn(c.statePath,{force:!0}),jn(c.activityPath,{force:!0}),l.release()}}function Ci(n){return new Promise(e=>setTimeout(e,n))}var ki=T.argv[1]?vi(Ii(T.argv[1])).href:null;if(ki===import.meta.url){let n=T.argv[2],e=T.argv[3],t=Fi(T.argv[4]);if(!n||!e)console.error("watch-service: expected <project-root> <cli-version>"),T.exitCode=1;else try{await Pi(n,e,t)}catch(r){console.error(`watch-service: ${r instanceof Error?r.message:String(r)}`),T.exitCode=1}}function Fi(n){if(!n)return{};try{let e=JSON.parse(n);return e&&typeof e=="object"?e:{}}catch{return{}}}export{Pi as runWatchServiceServer,Ti 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.1",
3
+ "version": "0.17.1",
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",
@@ -351,6 +351,7 @@
351
351
  "@vue/compiler-dom": "^3.5.38",
352
352
  "@vue/compiler-sfc": "^3.5.38",
353
353
  "better-sqlite3": "^12.9.0",
354
+ "chokidar": "^4.0.3",
354
355
  "commander": "^13.1.0",
355
356
  "ignore": "^7.0.3",
356
357
  "ts-morph": "^28.0.0"
@@ -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, 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, 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 the individual
124
- records under `.scipquery/events/*.json`. 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
@@ -21,24 +21,26 @@ Use this skill when a TypeScript system needs a TLA+ model tied to code evidence
21
21
  Load shared mechanics from [`../_shared/SKILL.md`](../_shared/SKILL.md).
22
22
 
23
23
  <!-- BEGIN GENERATED SKILL COMMANDS -->
24
+
24
25
  ## Commands for this skill
25
26
 
26
- | Command | Purpose | When |
27
- | --- | --- | --- |
28
- | `scip-query tla scaffold <file>` | TLA+ model workflow: verify a model and mapping contract, scaffold a draft model from indexed code, generate a trace recorder, or check a recorded trace against the next-state relation | Start here for a new model: derive a draft spec, config, and mapping from indexed code. |
29
- | `scip-query tla verify <spec>` | TLA+ model workflow: verify a model and mapping contract, scaffold a draft model from indexed code, generate a trace recorder, or check a recorded trace against the next-state relation | Mechanical conformance: referents, reads/writes, calls, and the model checker. |
30
- | `scip-query tla instrument <spec>` | TLA+ model workflow: verify a model and mapping contract, scaffold a draft model from indexed code, generate a trace recorder, or check a recorded trace against the next-state relation | Generate a trace recorder plus wiring sites for each mapped action. |
31
- | `scip-query tla trace-check <spec> --trace <file>` | TLA+ model workflow: verify a model and mapping contract, scaffold a draft model from indexed code, generate a trace recorder, or check a recorded trace against the next-state relation | Semantic conformance: check a recorded execution against the model's Next relation. |
32
- | `scip-query tla fetch-tools` | TLA+ model workflow: verify a model and mapping contract, scaffold a draft model from indexed code, generate a trace recorder, or check a recorded trace against the next-state relation | Download the pinned tla2tools.jar into the cache when the checker is unavailable. |
27
+ | Command | Purpose | When |
28
+ | -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
29
+ | `scip-query tla scaffold <file>` | TLA+ model workflow: verify a model and mapping contract, scaffold a draft model from indexed code, generate a trace recorder, or check a recorded trace against the next-state relation | Start here for a new model: derive a draft spec, config, and mapping from indexed code. |
30
+ | `scip-query tla verify <spec>` | TLA+ model workflow: verify a model and mapping contract, scaffold a draft model from indexed code, generate a trace recorder, or check a recorded trace against the next-state relation | Mechanical conformance: referents, reads/writes, calls, and the model checker. |
31
+ | `scip-query tla instrument <spec>` | TLA+ model workflow: verify a model and mapping contract, scaffold a draft model from indexed code, generate a trace recorder, or check a recorded trace against the next-state relation | Generate a trace recorder plus wiring sites for each mapped action. |
32
+ | `scip-query tla trace-check <spec> --trace <file>` | TLA+ model workflow: verify a model and mapping contract, scaffold a draft model from indexed code, generate a trace recorder, or check a recorded trace against the next-state relation | Semantic conformance: check a recorded execution against the model's Next relation. |
33
+ | `scip-query tla fetch-tools` | TLA+ model workflow: verify a model and mapping contract, scaffold a draft model from indexed code, generate a trace recorder, or check a recorded trace against the next-state relation | Download the pinned tla2tools.jar into the cache when the checker is unavailable. |
33
34
 
34
35
  Use this shortlist first. Open [`../_shared/SKILL.md`](../_shared/SKILL.md) only when it is insufficient.
36
+
35
37
  <!-- END GENERATED SKILL COMMANDS -->
36
38
 
37
39
  ## Choose the Slice
38
40
 
39
41
  Model the part with the most dangerous interleavings — retries, concurrency, partial failure, money, state machines with guards. Never model a linear happy path: a model that cannot meaningfully fail verifies nothing. If the state space would exceed roughly a million states, the model is too concrete; collapse data you never branch on and replace unbounded values with small symbolic sets. `scaffold` requires the target file to own mutable module-level state (a `let`/const plus a writer function) or, failing that, a class whose instance fields a method of that same class writes; a file of pure functions or constants is rejected — pick the file that holds the state, not the file that only computes over it.
40
42
 
41
- **Known boundary: files where the indexer emitted no member rows at all are invisible to `scaffold`.** `scaffold` calls `getDefinitionsForFile(db, file, { includeClassMemberFallbacks: true })`, which surfaces class-member fallback rows (`ClassName#field.` symbols with a real definition mention) alongside primary rows even when the file has other primary-indexed definitions — a concurrency class like a lock, connection pool, or watcher (verified live: `Watcher` in `src/runtime/watch.ts` — 26 instance fields and 10 state-writing actions discovered, previously 0) now scaffolds correctly. What remains genuinely invisible is narrower: a file where the indexer emitted **no** member row for a class at all — neither a primary `defn_enclosing_ranges` row nor a role=1 definition mention — has nothing for either query to return, and `scaffold` reports "no mutable state discovered" because there is nothing in the index to find. When you hit that: model by hand from `plan-context`/`trace` evidence instead of via `scaffold`. See `docs/plans/2026-07-02-catalog-class-members.md` for the K3 survey of whether other commands (`members`, `refs`, `trace`, `health`, `dead`) should opt in too — no decision has been made there yet, so this remains scaffold-only.
43
+ **Known boundary: files where the indexer emitted no member rows at all are invisible to `scaffold`.** `scaffold` calls `getDefinitionsForFile(db, file, { includeClassMemberFallbacks: true })`, which surfaces class-member fallback rows (`ClassName#field.` symbols with a real definition mention) alongside primary rows even when the file has other primary-indexed definitions — a concurrency class like a lock, connection pool, or watcher (verified live: `Watcher` in `src/runtime/watch.ts` — 26 instance fields and 12 state-writing actions discovered, previously 0) now scaffolds correctly. What remains genuinely invisible is narrower: a file where the indexer emitted **no** member row for a class at all — neither a primary `defn_enclosing_ranges` row nor a role=1 definition mention — has nothing for either query to return, and `scaffold` reports "no mutable state discovered" because there is nothing in the index to find. When you hit that: model by hand from `plan-context`/`trace` evidence instead of via `scaffold`. See `docs/plans/2026-07-02-catalog-class-members.md` for the K3 survey of whether other commands (`members`, `refs`, `trace`, `health`, `dead`) should opt in too — no decision has been made there yet, so this remains scaffold-only.
42
44
 
43
45
  ## Loop
44
46
 
@@ -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